blq-cli 0.10.0__tar.gz → 0.10.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.
- {blq_cli-0.10.0 → blq_cli-0.10.2}/CLAUDE.md +2 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/PKG-INFO +1 -1
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/index.md +1 -0
- blq_cli-0.10.2/docs/plans/roadmap-to-1.0.md +135 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/sandbox.md +35 -1
- blq_cli-0.10.2/docs/superpowers/plans/2026-03-29-annotators-and-tighten.md +1133 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/pyproject.toml +4 -1
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/cli.py +11 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/execution.py +31 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/sandbox_cmd.py +112 -0
- blq_cli-0.10.2/src/blq/ext/annotator.py +226 -0
- blq_cli-0.10.2/src/blq_sandbox/source_annotator.py +219 -0
- blq_cli-0.10.2/src/blq_sandbox/tighten.py +90 -0
- blq_cli-0.10.2/src/blq_sandbox/violations.py +82 -0
- blq_cli-0.10.2/tests/test_annotator.py +263 -0
- blq_cli-0.10.2/tests/test_sandbox_tighten.py +73 -0
- blq_cli-0.10.2/tests/test_sandbox_violations.py +110 -0
- blq_cli-0.10.2/tests/test_source_annotator.py +184 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/.claude/hooks/blq-suggest.sh +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/.github/workflows/ci.yml +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/.github/workflows/docs.yml +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/.github/workflows/publish.yml +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/.gitignore +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/.mcp.json +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/.readthedocs.yml +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/AGENT.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/AGENTS.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/CONTRIBUTING.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/README.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/SKILL.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/capture.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/ci.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/completions.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/errors.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/exec.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/filter.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/init.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/maintenance.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/query.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/registry.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/report.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/run.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/sql.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/status.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/sync.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/commands/watch.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-bird-migration.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-commands.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-config-command.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-extensions.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-git-integration.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-hooks-v2.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-live-inspection.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-parameterized-commands.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-run-args.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-sandbox-specs.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-sync.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/design-track-save.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/duck-hunt-v2-migration.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/duck-hunt-v3-migration.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/proposal-bird-v5.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/design/skill-inspect-enrichment.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/getting-started.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/index.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/integration.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/mcp.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/plans/explore-nsjail-python-wrapper.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/plans/explore-nsjail-spack-package.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/plans/patterns-integration-prompt.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/python-api.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/query-guide.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/requirements.txt +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/schema.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-22-extension-system.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-28-bwrap-engine.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-28-command-locks.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/plans/2026-03-29-strace-profiling.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/docs/superpowers/specs/2026-03-22-extension-system-design.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/experiments/agent-build-test.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/mkdocs.yml +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/__init__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/__main__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/bird.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/bird_schema.sql +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/README.md +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/__init__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/ci_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/clean_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/config_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/core.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/events.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/hooks_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/hooks_gen.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/init_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/management.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/management_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/mcp_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/migrate.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/query_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/record_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/registry.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/report_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/serve_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/sync_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/commands/watch_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/config_format.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/__init__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/discovery.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/local_executor.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/ext/pipeline.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/git.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/github.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/locks.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/output.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/query.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/schema.sql +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/serve.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/storage.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/drone.yml.j2 +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/git_hook.sh.j2 +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/github_workflow.yml.j2 +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/gitlab_ci.yml.j2 +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/templates/hook_script.sh.j2 +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq/user_config.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/__init__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/engines.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/profile.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/spec.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox/strace_parser.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox_bwrap/__init__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox_bwrap/args.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/src/blq_sandbox_systemd/__init__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/__init__.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/conftest.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/sql/test_duck_hunt_v2_migration.sql +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_attempts_outcomes.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_auto_init.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_autoprune.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_bird.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_bwrap_args.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_bwrap_engine.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ci.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ci_generators.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_command_args.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_command_lock_field.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_core.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_execution_locks.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_exit_code_reason.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_discovery.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_integration.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_local_executor.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_pipeline.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_ext_types.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_git.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_hooks.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_hooks_gen.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_inspect.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_json_null_filter.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_locks.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_mcp_ci_tools.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_mcp_merge.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_mcp_server.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_phase1_structured_output.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_phase2_command_registry.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_query_api.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_query_filter.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_record_invocation.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_report.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_cmd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_events.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_ext.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_profile.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_register.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_sandbox_systemd.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_storage.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_storage_prune.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_strace_parser.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_user_config.py +0 -0
- {blq_cli-0.10.0 → blq_cli-0.10.2}/tests/test_watch.py +0 -0
|
@@ -81,6 +81,8 @@ This is the initial scaffolding for `blq` (Build Log Query) - a CLI tool for cap
|
|
|
81
81
|
- **Strace profiling** (`blq sandbox profile`) for sandbox spec discovery (Phase 0 Tier 2)
|
|
82
82
|
- **Sandbox observability** (violation events, `blq sandbox` CLI, `sandbox_info` MCP tool)
|
|
83
83
|
- **Sandbox registration** (`--sandbox` flag on register, auto-detect presets on init)
|
|
84
|
+
- **Annotator plugin system** for enriching run events (RunContext proxy, eager/deferred dispatch)
|
|
85
|
+
- **Sandbox spec tightening** (`blq sandbox tighten`) — auto-narrow from observed data
|
|
84
86
|
- Full mypy type checking compliance
|
|
85
87
|
- 730+ unit tests
|
|
86
88
|
- Comprehensive documentation (README, docs/)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: blq-cli
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.2
|
|
4
4
|
Summary: Buidl Log Query - capture and query build/test logs with DuckDB
|
|
5
5
|
Project-URL: Homepage, https://blq-cli.readthedocs.com/
|
|
6
6
|
Project-URL: Repository, https://github.com/teaguesterling/blq-cli
|
|
@@ -79,6 +79,7 @@
|
|
|
79
79
|
| `sandbox inspect <cmd>` | Show spec + grade for a command |
|
|
80
80
|
| `sandbox suggest <cmd>` | Suggest spec from observed metrics |
|
|
81
81
|
| `sandbox profile <cmd>` | Profile with strace to discover access patterns |
|
|
82
|
+
| `sandbox tighten <cmd>` | Auto-narrow spec from observed data |
|
|
82
83
|
|
|
83
84
|
## Utilities
|
|
84
85
|
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Roadmap to v1.0.0
|
|
2
|
+
|
|
3
|
+
*What needs to happen before blq can claim API stability.*
|
|
4
|
+
|
|
5
|
+
## Criteria for 1.0
|
|
6
|
+
|
|
7
|
+
1. **Core features complete** — no major capability gaps that would require breaking changes
|
|
8
|
+
2. **API stable** — CLI commands, MCP tools, Python API, and TOML config format won't change incompatibly
|
|
9
|
+
3. **Storage format finalized** — BIRD spec settled, directory name migration done
|
|
10
|
+
4. **Architecture clean** — no major structural debt that forces workarounds
|
|
11
|
+
|
|
12
|
+
## Milestones
|
|
13
|
+
|
|
14
|
+
### 0.10.x — Sandbox Hardening (current)
|
|
15
|
+
|
|
16
|
+
**Done:**
|
|
17
|
+
- [x] Bwrap enforcement engine (network, filesystem, PID, tmpfs)
|
|
18
|
+
- [x] Strace profiling (`blq sandbox profile`)
|
|
19
|
+
- [x] Sandbox CLI (list, inspect, suggest, profile)
|
|
20
|
+
- [x] Auto-detect presets on init
|
|
21
|
+
- [x] `--sandbox` flag on register
|
|
22
|
+
- [x] Sandbox violation events
|
|
23
|
+
- [x] MCP sandbox_info tool
|
|
24
|
+
- [x] Annotator plugin system (RunContext, eager/deferred dispatch)
|
|
25
|
+
- [x] Spec tightening (`blq sandbox tighten`)
|
|
26
|
+
|
|
27
|
+
**Remaining:**
|
|
28
|
+
- [ ] Specific violation events — detect permission-denied patterns (#29)
|
|
29
|
+
- [ ] First annotator plugin — source context lookup (#30)
|
|
30
|
+
|
|
31
|
+
**Deferred to post-1.0:**
|
|
32
|
+
- nsjail engine (#42) — requires building from source
|
|
33
|
+
- seccomp learning mode (#43) — requires nsjail
|
|
34
|
+
|
|
35
|
+
### 0.11.x — Unified Service Layer
|
|
36
|
+
|
|
37
|
+
The biggest architectural debt. Currently MCP shells out to `blq run --json` and reimplements query logic independently from the CLI.
|
|
38
|
+
|
|
39
|
+
**Goal:** Single implementation for each operation, called by both CLI and MCP.
|
|
40
|
+
|
|
41
|
+
- [ ] Extract execution service (#31)
|
|
42
|
+
- [ ] Extract query services (#32)
|
|
43
|
+
|
|
44
|
+
**Why before 1.0:** Every new feature currently needs parallel implementation in CLI and MCP. The duplication makes the API surface unreliable — MCP and CLI can diverge silently. A service layer means one source of truth.
|
|
45
|
+
|
|
46
|
+
### 0.12.x — Sync (#21)
|
|
47
|
+
|
|
48
|
+
Fetch and query logs from CI systems. This is the last major feature gap.
|
|
49
|
+
|
|
50
|
+
- [ ] CI log fetching — GitHub Actions, GitLab CI (#33)
|
|
51
|
+
- [ ] Central store for cross-project aggregation (#34)
|
|
52
|
+
|
|
53
|
+
**Why before 1.0:** Users expect to query CI logs the same way they query local logs. Without sync, blq is local-only, which limits its value for teams.
|
|
54
|
+
|
|
55
|
+
### 0.13.x — BIRD Spec Finalization
|
|
56
|
+
|
|
57
|
+
Settle the storage format before committing to API stability.
|
|
58
|
+
|
|
59
|
+
- [ ] `.lq/` vs `.bird/` directory decision and migration (#35)
|
|
60
|
+
- [ ] Finalize schema version, document storage guarantees (#36)
|
|
61
|
+
|
|
62
|
+
**Why before 1.0:** Changing the storage directory or schema after 1.0 would be a breaking change. Lock it down now.
|
|
63
|
+
|
|
64
|
+
### 0.14.x — Polish & Stability
|
|
65
|
+
|
|
66
|
+
- [ ] Plugin system documentation and API stability (#37)
|
|
67
|
+
- [ ] Performance audit (#38)
|
|
68
|
+
- [ ] Comprehensive error messages (#39)
|
|
69
|
+
- [ ] Integration test suite — CLI → MCP → DuckDB round-trips (#40)
|
|
70
|
+
- [ ] API documentation — Python reference, MCP schemas (#41)
|
|
71
|
+
|
|
72
|
+
### 1.0.0 — Stable Release
|
|
73
|
+
|
|
74
|
+
**Guarantees:**
|
|
75
|
+
- CLI command names and flags won't change incompatibly
|
|
76
|
+
- MCP tool names and parameters are stable
|
|
77
|
+
- TOML config format is stable (new fields may be added, existing won't change)
|
|
78
|
+
- Python API (`LogStore`, `LogQuery`) is stable
|
|
79
|
+
- Storage format won't require migration within 1.x
|
|
80
|
+
- Sandbox spec dimensions and presets won't change incompatibly
|
|
81
|
+
|
|
82
|
+
**What's explicitly NOT guaranteed at 1.0:**
|
|
83
|
+
- SQL macro signatures (DuckDB internals may evolve)
|
|
84
|
+
- Extension engine protocol (may add methods)
|
|
85
|
+
- Internal module structure (imports may change)
|
|
86
|
+
|
|
87
|
+
## Post-1.0
|
|
88
|
+
|
|
89
|
+
- [ ] nsjail sandbox engine (#42)
|
|
90
|
+
- [ ] seccomp learning mode (#43)
|
|
91
|
+
- [ ] duckdb_mcp integration (ATTACH/DETACH workflow)
|
|
92
|
+
- [ ] Windows support exploration
|
|
93
|
+
|
|
94
|
+
## Sequencing
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
0.10.x Sandbox hardening — finish remaining items
|
|
98
|
+
↓
|
|
99
|
+
0.11.x Unified service layer (architecture cleanup)
|
|
100
|
+
↓
|
|
101
|
+
0.12.x Sync (CI log fetching, cross-project)
|
|
102
|
+
↓
|
|
103
|
+
0.13.x BIRD spec finalization (storage format)
|
|
104
|
+
↓
|
|
105
|
+
0.14.x Polish (plugins, perf, docs, tests)
|
|
106
|
+
↓
|
|
107
|
+
1.0.0 Stable release
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The order matters:
|
|
111
|
+
- Sandbox hardening first because it's close to done and doesn't require architecture changes
|
|
112
|
+
- Service layer before sync because sync would otherwise need dual CLI/MCP implementation
|
|
113
|
+
- BIRD finalization after sync because sync may influence the storage format
|
|
114
|
+
- Polish last because it benefits from all prior work being stable
|
|
115
|
+
|
|
116
|
+
## Non-goals for 1.0
|
|
117
|
+
|
|
118
|
+
- Windows support (bwrap/nsjail are Linux-only)
|
|
119
|
+
- GUI or web interface
|
|
120
|
+
- Real-time streaming (blq is batch-oriented)
|
|
121
|
+
- Multi-tenant / hosted service
|
|
122
|
+
- Backward compatibility with pre-0.10 storage formats (migration tools provided, but no runtime support)
|
|
123
|
+
|
|
124
|
+
## Issue Tracker
|
|
125
|
+
|
|
126
|
+
All roadmap items are tracked as GitHub issues with milestone labels:
|
|
127
|
+
|
|
128
|
+
| Label | Issues |
|
|
129
|
+
|-------|--------|
|
|
130
|
+
| `milestone:0.10.x` | #29, #30 |
|
|
131
|
+
| `milestone:0.11.x` | #31, #32 |
|
|
132
|
+
| `milestone:0.12.x` | #21, #33, #34 |
|
|
133
|
+
| `milestone:0.13.x` | #35, #36 |
|
|
134
|
+
| `milestone:0.14.x` | #37, #38, #39, #40, #41 |
|
|
135
|
+
| `post-1.0` | #42, #43 |
|
|
@@ -146,7 +146,28 @@ blq run test
|
|
|
146
146
|
|
|
147
147
|
If the command fails due to sandbox restrictions, blq generates a structured info event with the sandbox context, queryable via `blq events`.
|
|
148
148
|
|
|
149
|
-
### 5.
|
|
149
|
+
### 5. Tighten
|
|
150
|
+
|
|
151
|
+
After accumulating runs, auto-narrow the spec based on observed resource usage:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
blq sandbox tighten test
|
|
155
|
+
# Tightening sandbox spec for 'test' (from 15 runs):
|
|
156
|
+
# memory: 512m -> 256m
|
|
157
|
+
# timeout: 1m -> 30s
|
|
158
|
+
# cpu: 30s -> 15s
|
|
159
|
+
# Updated commands.toml
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Use `--dry-run` to preview changes without writing:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
blq sandbox tighten test --dry-run
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Tightening only reduces bounds — it never loosens them. It applies headroom (2x memory, 2x CPU, 3x timeout) to observed maximums. Requires at least 3 runs for reliable data.
|
|
169
|
+
|
|
170
|
+
### 6. Query
|
|
150
171
|
|
|
151
172
|
Check sandbox status across all commands:
|
|
152
173
|
|
|
@@ -186,6 +207,19 @@ AI agents can query and manage sandbox specs:
|
|
|
186
207
|
|
|
187
208
|
The `sandbox_info` tool returns the spec, grades, and observed resource metrics (memory peak, CPU usage, average duration) when monitoring data is available.
|
|
188
209
|
|
|
210
|
+
## Annotators
|
|
211
|
+
|
|
212
|
+
Annotators are plugins that enrich stored events with additional context. They run after events are written to the database and add structured annotations to the `metadata` JSON column.
|
|
213
|
+
|
|
214
|
+
Each annotation has:
|
|
215
|
+
- **type** — what kind of enrichment (source, provenance, diagnostic)
|
|
216
|
+
- **display** — when to show it: `inline` (always), `detail` (inspect only), `hidden` (queryable only)
|
|
217
|
+
- **data** — annotator-specific payload
|
|
218
|
+
|
|
219
|
+
Annotators declare whether they're **eager** (run during `blq run`) or **deferred** (run on demand). Eager annotators execute in Window 2 alongside event storage. Deferred annotators run when explicitly requested.
|
|
220
|
+
|
|
221
|
+
Annotators are discovered via Python entry points (`blq.annotators` group).
|
|
222
|
+
|
|
189
223
|
## Requirements
|
|
190
224
|
|
|
191
225
|
- **bwrap** (bubblewrap) for namespace isolation: `sudo apt install bubblewrap`
|