blq-cli 1.2.0__tar.gz → 1.2.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 (207) hide show
  1. {blq_cli-1.2.0 → blq_cli-1.2.2}/CHANGELOG.md +32 -0
  2. {blq_cli-1.2.0 → blq_cli-1.2.2}/PKG-INFO +2 -1
  3. {blq_cli-1.2.0 → blq_cli-1.2.2}/pyproject.toml +4 -1
  4. blq_cli-1.2.2/src/blq/__init__.py +32 -0
  5. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/serve.py +13 -3
  6. blq_cli-1.2.2/tests/test_version.py +37 -0
  7. blq_cli-1.2.0/src/blq/__init__.py +0 -21
  8. {blq_cli-1.2.0 → blq_cli-1.2.2}/.claude/hooks/blq-suggest.sh +0 -0
  9. {blq_cli-1.2.0 → blq_cli-1.2.2}/.github/workflows/ci.yml +0 -0
  10. {blq_cli-1.2.0 → blq_cli-1.2.2}/.github/workflows/docs.yml +0 -0
  11. {blq_cli-1.2.0 → blq_cli-1.2.2}/.github/workflows/publish.yml +0 -0
  12. {blq_cli-1.2.0 → blq_cli-1.2.2}/.gitignore +0 -0
  13. {blq_cli-1.2.0 → blq_cli-1.2.2}/.mcp.json +0 -0
  14. {blq_cli-1.2.0 → blq_cli-1.2.2}/.readthedocs.yml +0 -0
  15. {blq_cli-1.2.0 → blq_cli-1.2.2}/AGENT.md +0 -0
  16. {blq_cli-1.2.0 → blq_cli-1.2.2}/AGENTS.md +0 -0
  17. {blq_cli-1.2.0 → blq_cli-1.2.2}/CLAUDE.md +0 -0
  18. {blq_cli-1.2.0 → blq_cli-1.2.2}/CONTRIBUTING.md +0 -0
  19. {blq_cli-1.2.0 → blq_cli-1.2.2}/README.md +0 -0
  20. {blq_cli-1.2.0 → blq_cli-1.2.2}/SKILL.md +0 -0
  21. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/api-reference.md +0 -0
  22. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/capture.md +0 -0
  23. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/ci.md +0 -0
  24. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/completions.md +0 -0
  25. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/errors.md +0 -0
  26. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/exec.md +0 -0
  27. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/filter.md +0 -0
  28. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/index.md +0 -0
  29. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/init.md +0 -0
  30. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/maintenance.md +0 -0
  31. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/query.md +0 -0
  32. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/registry.md +0 -0
  33. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/report.md +0 -0
  34. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/run.md +0 -0
  35. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/sql.md +0 -0
  36. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/status.md +0 -0
  37. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/sync.md +0 -0
  38. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/commands/watch.md +0 -0
  39. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-bird-migration.md +0 -0
  40. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-commands.md +0 -0
  41. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-config-command.md +0 -0
  42. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-extensions.md +0 -0
  43. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-git-integration.md +0 -0
  44. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-hooks-v2.md +0 -0
  45. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-live-inspection.md +0 -0
  46. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-parameterized-commands.md +0 -0
  47. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-run-args.md +0 -0
  48. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-sandbox-specs.md +0 -0
  49. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-sync.md +0 -0
  50. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/design-track-save.md +0 -0
  51. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/duck-hunt-v2-migration.md +0 -0
  52. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/duck-hunt-v3-migration.md +0 -0
  53. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/proposal-bird-v5.md +0 -0
  54. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/design/skill-inspect-enrichment.md +0 -0
  55. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/getting-started.md +0 -0
  56. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/index.md +0 -0
  57. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/integration.md +0 -0
  58. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/mcp.md +0 -0
  59. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/plans/explore-bird-sqlite-backend.md +0 -0
  60. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/plans/explore-nsjail-python-wrapper.md +0 -0
  61. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/plans/explore-nsjail-spack-package.md +0 -0
  62. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/plans/patterns-integration-prompt.md +0 -0
  63. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/plans/roadmap-to-1.0.md +0 -0
  64. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/plugin-guide.md +0 -0
  65. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/python-api.md +0 -0
  66. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/query-guide.md +0 -0
  67. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/requirements.txt +0 -0
  68. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/sandbox.md +0 -0
  69. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/schema-stability.md +0 -0
  70. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/schema.md +0 -0
  71. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/plans/2026-03-22-extension-system.md +0 -0
  72. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/plans/2026-03-28-bwrap-engine.md +0 -0
  73. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/plans/2026-03-28-command-locks.md +0 -0
  74. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/plans/2026-03-29-annotators-and-tighten.md +0 -0
  75. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/plans/2026-03-29-service-layer-phase1.md +0 -0
  76. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/plans/2026-03-29-strace-profiling.md +0 -0
  77. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/specs/2026-03-22-extension-system-design.md +0 -0
  78. {blq_cli-1.2.0 → blq_cli-1.2.2}/docs/superpowers/specs/2026-03-29-unified-service-layer-design.md +0 -0
  79. {blq_cli-1.2.0 → blq_cli-1.2.2}/experiments/agent-build-test.md +0 -0
  80. {blq_cli-1.2.0 → blq_cli-1.2.2}/mkdocs.yml +0 -0
  81. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/__main__.py +0 -0
  82. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/bird.py +0 -0
  83. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/bird_schema.sql +0 -0
  84. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/cli.py +0 -0
  85. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/README.md +0 -0
  86. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/__init__.py +0 -0
  87. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/ci_cmd.py +0 -0
  88. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/clean_cmd.py +0 -0
  89. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/config_cmd.py +0 -0
  90. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/core.py +0 -0
  91. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/events.py +0 -0
  92. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/execution.py +0 -0
  93. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/hooks_cmd.py +0 -0
  94. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/hooks_gen.py +0 -0
  95. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/init_cmd.py +0 -0
  96. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/management.py +0 -0
  97. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/management_cmd.py +0 -0
  98. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/mcp_cmd.py +0 -0
  99. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/migrate.py +0 -0
  100. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/query_cmd.py +0 -0
  101. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/record_cmd.py +0 -0
  102. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/registry.py +0 -0
  103. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/report_cmd.py +0 -0
  104. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/sandbox_cmd.py +0 -0
  105. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/serve_cmd.py +0 -0
  106. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/sync_cmd.py +0 -0
  107. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/commands/watch_cmd.py +0 -0
  108. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/config_format.py +0 -0
  109. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/ext/__init__.py +0 -0
  110. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/ext/annotator.py +0 -0
  111. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/ext/discovery.py +0 -0
  112. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/ext/local_executor.py +0 -0
  113. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/ext/pipeline.py +0 -0
  114. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/git.py +0 -0
  115. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/github.py +0 -0
  116. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/locks.py +0 -0
  117. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/output.py +0 -0
  118. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/query.py +0 -0
  119. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/runtime.py +0 -0
  120. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/schema.sql +0 -0
  121. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/services/__init__.py +0 -0
  122. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/services/execution.py +0 -0
  123. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/services/inspect.py +0 -0
  124. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/services/query.py +0 -0
  125. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/services/refs.py +0 -0
  126. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/storage.py +0 -0
  127. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/templates/drone.yml.j2 +0 -0
  128. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/templates/git_hook.sh.j2 +0 -0
  129. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/templates/github_workflow.yml.j2 +0 -0
  130. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/templates/gitlab_ci.yml.j2 +0 -0
  131. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/templates/hook_script.sh.j2 +0 -0
  132. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq/user_config.py +0 -0
  133. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/__init__.py +0 -0
  134. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/engines.py +0 -0
  135. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/profile.py +0 -0
  136. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/source_annotator.py +0 -0
  137. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/spec.py +0 -0
  138. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/strace_parser.py +0 -0
  139. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/tighten.py +0 -0
  140. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox/violations.py +0 -0
  141. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox_bwrap/__init__.py +0 -0
  142. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox_bwrap/args.py +0 -0
  143. {blq_cli-1.2.0 → blq_cli-1.2.2}/src/blq_sandbox_systemd/__init__.py +0 -0
  144. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/__init__.py +0 -0
  145. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/conftest.py +0 -0
  146. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/sql/test_duck_hunt_v2_migration.sql +0 -0
  147. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_annotator.py +0 -0
  148. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_attempts_outcomes.py +0 -0
  149. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_auto_init.py +0 -0
  150. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_autoprune.py +0 -0
  151. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_bird.py +0 -0
  152. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_bwrap_args.py +0 -0
  153. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_bwrap_engine.py +0 -0
  154. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_ci.py +0 -0
  155. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_ci_generators.py +0 -0
  156. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_command_args.py +0 -0
  157. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_command_lock_field.py +0 -0
  158. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_config_consumption.py +0 -0
  159. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_core.py +0 -0
  160. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_execution_locks.py +0 -0
  161. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_exit_code_reason.py +0 -0
  162. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_ext_discovery.py +0 -0
  163. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_ext_integration.py +0 -0
  164. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_ext_local_executor.py +0 -0
  165. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_ext_pipeline.py +0 -0
  166. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_ext_types.py +0 -0
  167. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_git.py +0 -0
  168. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_hooks.py +0 -0
  169. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_hooks_gen.py +0 -0
  170. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_import_capture_storage.py +0 -0
  171. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_inspect.py +0 -0
  172. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_json_null_filter.py +0 -0
  173. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_locks.py +0 -0
  174. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_log_content_persistence.py +0 -0
  175. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_mcp_ci_tools.py +0 -0
  176. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_mcp_merge.py +0 -0
  177. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_mcp_server.py +0 -0
  178. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_output_schemas.py +0 -0
  179. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_phase1_structured_output.py +0 -0
  180. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_phase2_command_registry.py +0 -0
  181. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_query_api.py +0 -0
  182. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_query_filter.py +0 -0
  183. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_record_invocation.py +0 -0
  184. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_report.py +0 -0
  185. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_runtime_config.py +0 -0
  186. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox.py +0 -0
  187. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_cmd.py +0 -0
  188. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_events.py +0 -0
  189. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_ext.py +0 -0
  190. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_profile.py +0 -0
  191. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_register.py +0 -0
  192. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_systemd.py +0 -0
  193. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_tighten.py +0 -0
  194. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_sandbox_violations.py +0 -0
  195. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_schema_repair.py +0 -0
  196. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_security_containment.py +0 -0
  197. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_services_execution.py +0 -0
  198. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_services_inspect.py +0 -0
  199. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_services_query.py +0 -0
  200. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_services_refs.py +0 -0
  201. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_source_annotator.py +0 -0
  202. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_storage.py +0 -0
  203. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_storage_prune.py +0 -0
  204. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_strace_parser.py +0 -0
  205. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_user_config.py +0 -0
  206. {blq_cli-1.2.0 → blq_cli-1.2.2}/tests/test_watch.py +0 -0
  207. {blq_cli-1.2.0 → blq_cli-1.2.2}/uv.lock +0 -0
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.2.2
4
+
5
+ ### Fixed — Suppress FastMCP banners on stdio transport
6
+
7
+ When starting the MCP server over stdio, FastMCP banner rendering is suppressed
8
+ (`show_banner=False`) so that stdout contains strictly valid JSON-RPC messages
9
+ without terminal box decorations. Also derives `__version__` from installed package
10
+ metadata.
11
+
12
+ ## v1.2.1
13
+
14
+ ### Fixed — 1.2.0 was broken on Python 3.10 and 3.11
15
+
16
+ The TypedDicts added in 1.2.0 were imported from `typing`. pydantic refuses to
17
+ build a schema from `typing.TypedDict` below 3.12 ("Please use
18
+ `typing_extensions.TypedDict` instead"), so importing `blq.serve` raised on
19
+ every supported Python under 3.12 — which is to say the MCP server did not
20
+ start at all there.
21
+
22
+ `requires-python` is `>=3.10`, so 1.2.0 should not have shipped. It passed
23
+ local checks because the development interpreter was 3.14; CI caught it on the
24
+ 3.10 matrix entry, but the publish workflow triggers on release rather than on
25
+ a green CI run, so the package reached PyPI anyway.
26
+
27
+ Now imported from `typing_extensions` below 3.12, with the backport declared as
28
+ a conditional dependency. Verified against a real 3.11 interpreter: 1382 tests
29
+ pass, where 1.2.0 could not import.
30
+
31
+ **If you installed 1.2.0 on Python 3.10 or 3.11, upgrade.** On 3.12+ it was
32
+ unaffected.
33
+
34
+
3
35
  ## v1.2.0
4
36
 
5
37
  ### Added — MCP tools publish the names of the keys they return (#47)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: blq-cli
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Build Log Query - capture and query build/test logs with DuckDB
5
5
  Project-URL: Homepage, https://blq-cli.readthedocs.io/
6
6
  Project-URL: Repository, https://github.com/teaguesterling/blq-cli
@@ -27,6 +27,7 @@ Requires-Dist: pyyaml>=6.0
27
27
  Requires-Dist: tabulate>=0.9.0
28
28
  Requires-Dist: tomli-w>=1.0.0
29
29
  Requires-Dist: tomli>=2.0.0; python_version < '3.11'
30
+ Requires-Dist: typing-extensions>=4.0; python_version < '3.12'
30
31
  Requires-Dist: watchdog>=3.0.0
31
32
  Provides-Extra: dev
32
33
  Requires-Dist: fastmcp>=2.0.0; extra == 'dev'
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "blq-cli"
7
- version = "1.2.0"
7
+ version = "1.2.2"
8
8
  description = "Build Log Query - capture and query build/test logs with DuckDB"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -33,6 +33,9 @@ dependencies = [
33
33
  "pyyaml>=6.0",
34
34
  "tabulate>=0.9.0",
35
35
  "tomli>=2.0.0;python_version<'3.11'",
36
+ # pydantic will not build a schema from `typing.TypedDict` below 3.12, so
37
+ # the MCP tools' output schemas need the backport there.
38
+ "typing_extensions>=4.0;python_version<'3.12'",
36
39
  "tomli-w>=1.0.0",
37
40
  "watchdog>=3.0.0",
38
41
  ]
@@ -0,0 +1,32 @@
1
+ """
2
+ blq - Log Query
3
+
4
+ Capture and query build/test logs with DuckDB.
5
+
6
+ Example usage:
7
+ from blq import LogStore, LogQuery
8
+
9
+ # Query stored events
10
+ store = LogStore.open()
11
+ errors = store.errors().filter(ref_file="%main%").df()
12
+
13
+ # Query a log file directly
14
+ events = LogQuery.from_file("build.log").filter(severity="error").df()
15
+ """
16
+
17
+ from importlib.metadata import PackageNotFoundError, version as _dist_version
18
+
19
+ # Derived, never written by hand. The literal here read "1.0.1" against a
20
+ # distribution version of 1.2.1 — two releases stale, and immune to
21
+ # --force-reinstall because it was not derived from anything. Nothing consumes
22
+ # it today (the CLI reads importlib.metadata directly), which is exactly why it
23
+ # drifted unnoticed; a version string that lies makes a healthy install look
24
+ # broken, which is the most expensive direction to send a reader.
25
+ try:
26
+ __version__ = _dist_version("blq-cli")
27
+ except PackageNotFoundError: # running from a source tree with no install
28
+ __version__ = "0.0.0.dev0"
29
+
30
+ from blq.query import LogQuery, LogQueryGrouped, LogStore
31
+
32
+ __all__ = ["LogQuery", "LogStore", "LogQueryGrouped", "__version__"]
@@ -34,7 +34,17 @@ import re as _re
34
34
  import shlex
35
35
  import subprocess
36
36
  import sys
37
- from typing import Any, TypedDict
37
+ from typing import Any
38
+
39
+ # pydantic rejects `typing.TypedDict` below 3.12 and refuses to build a schema
40
+ # from it ("Please use typing_extensions.TypedDict instead"). This package
41
+ # supports 3.10+, so the stdlib import breaks every MCP tool on 3.10/3.11 —
42
+ # which is exactly how it shipped in 1.2.0, because the dev interpreter was
43
+ # 3.14 and only CI runs the older matrix.
44
+ if sys.version_info >= (3, 12):
45
+ from typing import TypedDict
46
+ else:
47
+ from typing_extensions import TypedDict
38
48
 
39
49
  import pandas as pd # type: ignore[import-untyped]
40
50
  from fastmcp import FastMCP
@@ -4164,9 +4174,9 @@ def serve(
4164
4174
  _init_disabled_tools(cli_disabled=disabled_tools, safe_mode=safe_mode)
4165
4175
 
4166
4176
  if transport == "stdio":
4167
- mcp.run()
4177
+ mcp.run(show_banner=False)
4168
4178
  elif transport == "sse":
4169
- mcp.run(transport="sse", port=port)
4179
+ mcp.run(transport="sse", port=port, show_banner=False)
4170
4180
  else:
4171
4181
  raise ValueError(f"Unknown transport: {transport}")
4172
4182
 
@@ -0,0 +1,37 @@
1
+ """The exported version must match the installed distribution.
2
+
3
+ `__version__` was a hand-written literal and drifted two releases behind
4
+ pyproject.toml before anyone noticed — nothing consumes it (the CLI reads
5
+ importlib.metadata directly), so nothing failed. The same defect in squackit
6
+ reached four releases of drift.
7
+
8
+ Asserting a hardcoded string here would recreate the problem: the module and
9
+ its test would agree with each other and with nothing else. Assert the
10
+ correspondence instead.
11
+ """
12
+
13
+ from importlib.metadata import PackageNotFoundError, version
14
+
15
+
16
+ def test_version_matches_the_installed_distribution():
17
+ import blq
18
+
19
+ try:
20
+ expected = version("blq-cli")
21
+ except PackageNotFoundError:
22
+ expected = "0.0.0.dev0"
23
+ assert blq.__version__ == expected
24
+
25
+
26
+ def test_version_is_not_a_hardcoded_literal():
27
+ """Guard the mechanism, not just today's value."""
28
+ import pathlib
29
+
30
+ src = pathlib.Path(blq_init()).read_text()
31
+ assert "_dist_version" in src, "version is no longer derived from metadata"
32
+
33
+
34
+ def blq_init():
35
+ import blq
36
+
37
+ return blq.__file__
@@ -1,21 +0,0 @@
1
- """
2
- blq - Log Query
3
-
4
- Capture and query build/test logs with DuckDB.
5
-
6
- Example usage:
7
- from blq import LogStore, LogQuery
8
-
9
- # Query stored events
10
- store = LogStore.open()
11
- errors = store.errors().filter(ref_file="%main%").df()
12
-
13
- # Query a log file directly
14
- events = LogQuery.from_file("build.log").filter(severity="error").df()
15
- """
16
-
17
- __version__ = "1.0.1"
18
-
19
- from blq.query import LogQuery, LogQueryGrouped, LogStore
20
-
21
- __all__ = ["LogQuery", "LogStore", "LogQueryGrouped", "__version__"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes