blitz-cli 0.14.0__tar.gz → 0.15.0__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.
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/PKG-INFO +5 -5
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/README.md +4 -4
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/__init__.py +1 -1
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_collect.py +3 -3
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_collect_http.py +2 -2
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_collect_server.py +3 -3
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_train.py +15 -15
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/cli.py +14 -14
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/implement.md +1 -1
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/locker_room_Makefile.tmpl +1 -1
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/locker_room_README.md.tmpl +5 -5
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/locker_room_compose.yml.tmpl +18 -18
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/pyproject.toml +1 -1
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_cli.py +1 -1
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_collect.py +2 -2
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_collect_http.py +9 -9
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_scaffold.py +3 -3
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/memory/playbook.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/check-prerequisites.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/common.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/create-new-feature.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/setup-plan.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/setup-tasks.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/templates/plan-template.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/templates/spec-template.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/templates/tasks-template.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.github/workflows/homebrew.yml +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.github/workflows/publish.yml +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.gitignore +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.mcp.json +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/LICENSE +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_activity.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_code_graph.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_corpus.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_dataset.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_execute.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_git.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_gitignore.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_make.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_ontology.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_playbooks.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_redact.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_scaffold.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_tool_schemas.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/__init__.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/__init__.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/analyze.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/clarify.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/plan.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/playbook.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/specify.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/tasks.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/memory/playbook.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/check-prerequisites.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/common.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/create-new-feature.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/setup-plan.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/setup-tasks.sh +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/plan-template.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/spec-template.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/tasks-template.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/workspace/__init__.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/workspace/huddle.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/__init__.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/workspace_playbook.md.tmpl +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/checklists/requirements.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/contracts/cli-commands.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/plan.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/quickstart.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/research.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/spec.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/tasks.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/checklists/requirements.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/contracts/experimental-labels.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/data-model.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/plan.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/quickstart.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/research.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/spec.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/tasks.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/checklists/requirements.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/cli-output.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/ensure-rules.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/gitignore-block.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/data-model.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/plan.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/quickstart.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/research.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/spec.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/tasks.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/checklists/requirements.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/contracts/cli.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/contracts/export-format.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/data-model.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/plan.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/quickstart.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/research.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/spec.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/tasks.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/checklists/requirements.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/contracts/client-sink.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/contracts/ingest-api.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/data-model.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/plan.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/quickstart.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/research.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/spec.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/tasks.md +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_activity.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_collect_server.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_corpus.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_execute.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_gitignore.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_make.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_ontology.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_playbooks.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_redact.py +0 -0
- {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_tool_schemas.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: blitz-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.0
|
|
4
4
|
Summary: Developer CLI for Blitz locker-room: spec-driven playbooks, a codebase/huddle ontology graph with an MCP tool, and the composable watcher/trainer/graph containers.
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -79,16 +79,16 @@ Ollama endpoint comes from `--ollama-url` or `OLLAMA_HOST`; the model from
|
|
|
79
79
|
|
|
80
80
|
`blitz model execute --collect` records every generation attempt as DPO
|
|
81
81
|
training data. By default it writes straight to the activity SQLite database
|
|
82
|
-
(`
|
|
82
|
+
(`BLITZ_ACTIVITY_DB_PATH`, else `data/activity.db`). With `BLITZ_COLLECT_ENDPOINT` set,
|
|
83
83
|
the same writes go over HTTP JSON to a collect ingest server instead, so the
|
|
84
84
|
collector needs no filesystem access to the database:
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
87
|
# on the locker-room node (default port 1739, binds all interfaces, no auth):
|
|
88
|
-
|
|
88
|
+
BLITZ_ACTIVITY_DB_PATH=data/activity.db blitz locker-room collect-serve
|
|
89
89
|
|
|
90
90
|
# on the collecting machine:
|
|
91
|
-
|
|
91
|
+
BLITZ_COLLECT_ENDPOINT=http://locker-room-host:1739 blitz model execute --collect
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Each attempt is acknowledged by the endpoint before the next model call
|
|
@@ -151,7 +151,7 @@ The `mcp` role serves this: point an agent's MCP config at
|
|
|
151
151
|
|
|
152
152
|
`blitz locker-room train` runs an on-demand QLoRA fine-tune of the watcher corpus
|
|
153
153
|
in the trainer container (needs a GPU); adapters land in `./train-out`. Override
|
|
154
|
-
the base model with `
|
|
154
|
+
the base model with `BLITZ_BASE_MODEL_HF` or `blitz locker-room init --base-model`.
|
|
155
155
|
|
|
156
156
|
## Activity: replay a coding-agent session
|
|
157
157
|
|
|
@@ -60,16 +60,16 @@ Ollama endpoint comes from `--ollama-url` or `OLLAMA_HOST`; the model from
|
|
|
60
60
|
|
|
61
61
|
`blitz model execute --collect` records every generation attempt as DPO
|
|
62
62
|
training data. By default it writes straight to the activity SQLite database
|
|
63
|
-
(`
|
|
63
|
+
(`BLITZ_ACTIVITY_DB_PATH`, else `data/activity.db`). With `BLITZ_COLLECT_ENDPOINT` set,
|
|
64
64
|
the same writes go over HTTP JSON to a collect ingest server instead, so the
|
|
65
65
|
collector needs no filesystem access to the database:
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
68
|
# on the locker-room node (default port 1739, binds all interfaces, no auth):
|
|
69
|
-
|
|
69
|
+
BLITZ_ACTIVITY_DB_PATH=data/activity.db blitz locker-room collect-serve
|
|
70
70
|
|
|
71
71
|
# on the collecting machine:
|
|
72
|
-
|
|
72
|
+
BLITZ_COLLECT_ENDPOINT=http://locker-room-host:1739 blitz model execute --collect
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
Each attempt is acknowledged by the endpoint before the next model call
|
|
@@ -132,7 +132,7 @@ The `mcp` role serves this: point an agent's MCP config at
|
|
|
132
132
|
|
|
133
133
|
`blitz locker-room train` runs an on-demand QLoRA fine-tune of the watcher corpus
|
|
134
134
|
in the trainer container (needs a GPU); adapters land in `./train-out`. Override
|
|
135
|
-
the base model with `
|
|
135
|
+
the base model with `BLITZ_BASE_MODEL_HF` or `blitz locker-room init --base-model`.
|
|
136
136
|
|
|
137
137
|
## Activity: replay a coding-agent session
|
|
138
138
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
`CollectStore` owns four tables (`collect_runs`, `collect_attempts`,
|
|
5
5
|
`dpo_pairs`, `sft_queue`) in the same locker-room activity database that
|
|
6
6
|
`_corpus.py`'s `TurnStore` writes its transcript corpus to (default
|
|
7
|
-
`data/activity.db`, env override `
|
|
7
|
+
`data/activity.db`, env override `BLITZ_ACTIVITY_DB_PATH`, WAL journal). Like
|
|
8
8
|
`TurnStore`, it is the one writer of its tables and creates its schema on
|
|
9
9
|
first connect.
|
|
10
10
|
|
|
@@ -124,9 +124,9 @@ SFT_FIELDS = ("run_id", "task_id", "prompt_messages_json")
|
|
|
124
124
|
|
|
125
125
|
|
|
126
126
|
def default_db_path() -> Path:
|
|
127
|
-
"""The activity database path:
|
|
127
|
+
"""The activity database path: BLITZ_ACTIVITY_DB_PATH env override, else the
|
|
128
128
|
conventional data/activity.db relative to the CWD (same idiom as _train.py)."""
|
|
129
|
-
return Path(os.environ.get("
|
|
129
|
+
return Path(os.environ.get("BLITZ_ACTIVITY_DB_PATH", "data/activity.db"))
|
|
130
130
|
|
|
131
131
|
|
|
132
132
|
def _now_iso() -> str:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""HTTP collection sink and buffer/flush tooling for the collect ingest
|
|
2
2
|
endpoint (see _collect_server.py for the server side).
|
|
3
3
|
|
|
4
|
-
`HttpCollectSink` is the
|
|
4
|
+
`HttpCollectSink` is the BLITZ_COLLECT_ENDPOINT-selected counterpart of
|
|
5
5
|
`_collect.CollectStore`: it exposes the same methods the execute loop calls
|
|
6
6
|
(check_writable, insert_run, insert_attempt, finish_run,
|
|
7
7
|
insert_sft_placeholder) but delivers each payload synchronously over HTTP, so
|
|
@@ -60,7 +60,7 @@ def _path_for(kind: str, payload: dict) -> str:
|
|
|
60
60
|
class HttpCollectSink:
|
|
61
61
|
"""Collection sink that writes through the ingest endpoint instead of
|
|
62
62
|
opening the activity database. Duck-types CollectStore's writer surface;
|
|
63
|
-
selected by cli._cmd_execute when
|
|
63
|
+
selected by cli._cmd_execute when BLITZ_COLLECT_ENDPOINT is set."""
|
|
64
64
|
|
|
65
65
|
def __init__(self, endpoint: str, timeout: int = _TIMEOUT):
|
|
66
66
|
self.endpoint = endpoint.rstrip("/")
|
|
@@ -6,7 +6,7 @@ storage behind the endpoint can change without touching any collector. Shipped
|
|
|
6
6
|
here as an importable module so the locker-room node image can run it with a
|
|
7
7
|
thin entrypoint; `blitz locker-room collect-serve` starts it host-side.
|
|
8
8
|
|
|
9
|
-
API (contracts/ingest-api.md): default port 1739 (
|
|
9
|
+
API (contracts/ingest-api.md): default port 1739 (BLITZ_COLLECT_PORT), bind 0.0.0.0,
|
|
10
10
|
no auth, same localhost/LAN trust posture as the mcp role on 1738.
|
|
11
11
|
|
|
12
12
|
GET /v1/health -> {"status": "ok"}
|
|
@@ -203,10 +203,10 @@ def serve(
|
|
|
203
203
|
print_fn=print,
|
|
204
204
|
) -> None:
|
|
205
205
|
"""Blocking entrypoint: resolve defaults from the environment
|
|
206
|
-
(
|
|
206
|
+
(BLITZ_ACTIVITY_DB_PATH, BLITZ_COLLECT_PORT) and serve until interrupted."""
|
|
207
207
|
db = Path(db_path) if db_path is not None else _collect.default_db_path()
|
|
208
208
|
if port is None:
|
|
209
|
-
port = int(os.environ.get("
|
|
209
|
+
port = int(os.environ.get("BLITZ_COLLECT_PORT", DEFAULT_PORT))
|
|
210
210
|
server = make_server(db, host=host, port=port, verbose=True)
|
|
211
211
|
print_fn(f"collect ingest endpoint listening on {host}:{port}, database {db}")
|
|
212
212
|
try:
|
|
@@ -17,17 +17,17 @@ chat-formatted, tool-calling trajectories (native Claude Code tool names --
|
|
|
17
17
|
Read/Edit/Write/Bash/...), and an instruction-tuned checkpoint already
|
|
18
18
|
understands a chat template and basic tool-calling, the right starting point for
|
|
19
19
|
further SFT rather than a raw base model. 14B needs real headroom (an 80GB-class
|
|
20
|
-
GPU); on a 16GB-class card use 7B. Override the base model via
|
|
21
|
-
scaffold-time default lives in docker-compose.yml) -- and
|
|
20
|
+
GPU); on a 16GB-class card use 7B. Override the base model via BLITZ_BASE_MODEL_HF (its
|
|
21
|
+
scaffold-time default lives in docker-compose.yml) -- and BLITZ_PARAMS_B to match,
|
|
22
22
|
since it drives the LoRA rank/batch-size defaults in _scaffold.build_config.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
BLITZ_SEQ_LEN defaults to 16384. Measured against the real corpus + Qwen tokenizer with
|
|
25
25
|
the full tool-schema block on every example: at 2048 the schema tax pushes 77.6%
|
|
26
26
|
of turns over budget (vs. 42.5% with no schema); at 16384 that gap is +0.8pp
|
|
27
|
-
(7.3% vs. 6.5%). Packing splits a turn longer than
|
|
27
|
+
(7.3% vs. 6.5%). Packing splits a turn longer than BLITZ_SEQ_LEN across separate steps
|
|
28
28
|
with no attention between the pieces -- set it from actual VRAM.
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
BLITZ_PER_DEVICE_BATCH_SIZE overrides build_config's params_b-driven batch size
|
|
31
31
|
directly, independent of LoRA rank; grad_accum rescales to hold the effective
|
|
32
32
|
batch size steady, so it has no training-dynamics tradeoff, just more (smaller)
|
|
33
33
|
steps for the same per-step memory.
|
|
@@ -70,12 +70,12 @@ def run() -> int:
|
|
|
70
70
|
|
|
71
71
|
mlflow.set_tracking_uri("sqlite:///training.db")
|
|
72
72
|
|
|
73
|
-
base_model_hf = os.environ.get("
|
|
74
|
-
params_b = float(os.environ.get("
|
|
75
|
-
seq_len = _scaffold.clamp_seq_len(int(os.environ.get("
|
|
76
|
-
eval_fraction = float(os.environ.get("
|
|
77
|
-
db_path = os.environ.get("
|
|
78
|
-
save_steps = int(os.environ.get("
|
|
73
|
+
base_model_hf = os.environ.get("BLITZ_BASE_MODEL_HF", "Qwen/Qwen2.5-Coder-14B-Instruct")
|
|
74
|
+
params_b = float(os.environ.get("BLITZ_PARAMS_B", "14"))
|
|
75
|
+
seq_len = _scaffold.clamp_seq_len(int(os.environ.get("BLITZ_SEQ_LEN", "16384")))
|
|
76
|
+
eval_fraction = float(os.environ.get("BLITZ_EVAL_FRACTION", "0.1"))
|
|
77
|
+
db_path = os.environ.get("BLITZ_ACTIVITY_DB_PATH", "data/activity.db")
|
|
78
|
+
save_steps = int(os.environ.get("BLITZ_SAVE_STEPS", "50"))
|
|
79
79
|
all_tool_names = frozenset(_tool_schemas.TOOL_SCHEMAS)
|
|
80
80
|
|
|
81
81
|
cfg = _scaffold.build_config(
|
|
@@ -85,7 +85,7 @@ def run() -> int:
|
|
|
85
85
|
seq_len=seq_len,
|
|
86
86
|
eval_fraction=eval_fraction,
|
|
87
87
|
)
|
|
88
|
-
batch_override = os.environ.get("
|
|
88
|
+
batch_override = os.environ.get("BLITZ_PER_DEVICE_BATCH_SIZE")
|
|
89
89
|
if batch_override:
|
|
90
90
|
cfg = _scaffold.apply_batch_override(cfg, int(batch_override))
|
|
91
91
|
|
|
@@ -118,7 +118,7 @@ def run() -> int:
|
|
|
118
118
|
if not examples:
|
|
119
119
|
print(
|
|
120
120
|
f"No training-bucket turns in {db_path} -- let the watcher run longer, "
|
|
121
|
-
"or lower
|
|
121
|
+
"or lower BLITZ_EVAL_FRACTION.",
|
|
122
122
|
file=sys.stderr,
|
|
123
123
|
)
|
|
124
124
|
return 1
|
|
@@ -142,7 +142,7 @@ def run() -> int:
|
|
|
142
142
|
# loss tensors. Liger's FLCE chunks the lm_head projection + loss so the full
|
|
143
143
|
# logits tensor never exists. The patch is Qwen2-family-specific: for a
|
|
144
144
|
# different base family, swap the matching apply_liger_kernel_to_* (or drop it
|
|
145
|
-
# and shrink
|
|
145
|
+
# and shrink BLITZ_SEQ_LEN/batch).
|
|
146
146
|
apply_liger_kernel_to_qwen2()
|
|
147
147
|
|
|
148
148
|
model = AutoModelForCausalLM.from_pretrained(
|
|
@@ -196,7 +196,7 @@ def run() -> int:
|
|
|
196
196
|
bf16=True,
|
|
197
197
|
logging_steps=10,
|
|
198
198
|
# steps, not epoch: LoRA checkpoints are small/cheap, so frequent saves
|
|
199
|
-
# only add resilience if a long run is interrupted. Tune
|
|
199
|
+
# only add resilience if a long run is interrupted. Tune BLITZ_SAVE_STEPS once
|
|
200
200
|
# real steps/sec is known for a ~5-10 minute cadence.
|
|
201
201
|
save_strategy="steps",
|
|
202
202
|
save_steps=save_steps,
|
|
@@ -58,7 +58,7 @@ def _cmd_locker_room_init(args: argparse.Namespace) -> int:
|
|
|
58
58
|
"\nOn-demand QLoRA training (needs a GPU; "
|
|
59
59
|
f"default base model {args.base_model}):\n"
|
|
60
60
|
" blitz locker-room train # outputs -> ./train-out\n"
|
|
61
|
-
"\nSet
|
|
61
|
+
"\nSet BLITZ_WORKSPACE_DIR to the code root the graph should ontologize "
|
|
62
62
|
"(default: your home dir)."
|
|
63
63
|
)
|
|
64
64
|
return 0
|
|
@@ -146,10 +146,10 @@ def _cmd_execute(args: argparse.Namespace) -> int:
|
|
|
146
146
|
if args.collect:
|
|
147
147
|
import sqlite3
|
|
148
148
|
|
|
149
|
-
# Sink selection (contract C5):
|
|
149
|
+
# Sink selection (contract C5): BLITZ_COLLECT_ENDPOINT set means collection
|
|
150
150
|
# writes go over HTTP to the ingest endpoint; unset means the direct
|
|
151
151
|
# SQLite path, unchanged.
|
|
152
|
-
collect_endpoint = os.environ.get("
|
|
152
|
+
collect_endpoint = os.environ.get("BLITZ_COLLECT_ENDPOINT")
|
|
153
153
|
if collect_endpoint:
|
|
154
154
|
from blitz_cli import _collect_http
|
|
155
155
|
|
|
@@ -199,10 +199,10 @@ def _cmd_collect_flush(args: argparse.Namespace) -> int:
|
|
|
199
199
|
|
|
200
200
|
from blitz_cli import _collect_http
|
|
201
201
|
|
|
202
|
-
endpoint = args.endpoint or os.environ.get("
|
|
202
|
+
endpoint = args.endpoint or os.environ.get("BLITZ_COLLECT_ENDPOINT")
|
|
203
203
|
if not endpoint:
|
|
204
204
|
_eprint(
|
|
205
|
-
"error: no endpoint configured. Set
|
|
205
|
+
"error: no endpoint configured. Set BLITZ_COLLECT_ENDPOINT or pass "
|
|
206
206
|
"--endpoint http://host:1739."
|
|
207
207
|
)
|
|
208
208
|
return 2
|
|
@@ -219,7 +219,7 @@ def _cmd_collect_serve(args: argparse.Namespace) -> int:
|
|
|
219
219
|
db = Path(args.db) if args.db else _collect.default_db_path()
|
|
220
220
|
port = args.port
|
|
221
221
|
if port is None:
|
|
222
|
-
port = int(os.environ.get("
|
|
222
|
+
port = int(os.environ.get("BLITZ_COLLECT_PORT", _collect_server.DEFAULT_PORT))
|
|
223
223
|
try:
|
|
224
224
|
_collect_server.serve(db, host=args.host, port=port)
|
|
225
225
|
except OSError as exc:
|
|
@@ -570,7 +570,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
570
570
|
execute.add_argument(
|
|
571
571
|
"--collect", action="store_true",
|
|
572
572
|
help="Record every generation attempt into the activity database "
|
|
573
|
-
"(env
|
|
573
|
+
"(env BLITZ_ACTIVITY_DB_PATH, default data/activity.db). Off by default, "
|
|
574
574
|
"off means no database access.",
|
|
575
575
|
)
|
|
576
576
|
execute.add_argument(
|
|
@@ -589,7 +589,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
589
589
|
collect = model_sub.add_parser(
|
|
590
590
|
"collect",
|
|
591
591
|
help="Collection sink utilities for runs recorded over the collect "
|
|
592
|
-
"ingest endpoint (
|
|
592
|
+
"ingest endpoint (BLITZ_COLLECT_ENDPOINT).",
|
|
593
593
|
)
|
|
594
594
|
collect_sub = collect.add_subparsers(dest="collect_cmd", required=True)
|
|
595
595
|
|
|
@@ -605,7 +605,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
605
605
|
)
|
|
606
606
|
collect_flush.add_argument(
|
|
607
607
|
"--endpoint", default=None, metavar="URL",
|
|
608
|
-
help="Ingest endpoint base URL (default: the
|
|
608
|
+
help="Ingest endpoint base URL (default: the BLITZ_COLLECT_ENDPOINT env var).",
|
|
609
609
|
)
|
|
610
610
|
collect_flush.set_defaults(func=_cmd_collect_flush)
|
|
611
611
|
|
|
@@ -619,7 +619,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
619
619
|
def _add_db_flag(p):
|
|
620
620
|
p.add_argument(
|
|
621
621
|
"--db", default=None, metavar="PATH",
|
|
622
|
-
help="Activity database path (default:
|
|
622
|
+
help="Activity database path (default: BLITZ_ACTIVITY_DB_PATH env, "
|
|
623
623
|
"else data/activity.db).",
|
|
624
624
|
)
|
|
625
625
|
|
|
@@ -733,7 +733,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
733
733
|
"--base-model",
|
|
734
734
|
default=_scaffold._DEFAULT_LOCKER_ROOM_BASE_MODEL,
|
|
735
735
|
help=f"Default base model for `blitz locker-room train` (default "
|
|
736
|
-
f"{_scaffold._DEFAULT_LOCKER_ROOM_BASE_MODEL}); override per-run with
|
|
736
|
+
f"{_scaffold._DEFAULT_LOCKER_ROOM_BASE_MODEL}); override per-run with BLITZ_BASE_MODEL_HF.",
|
|
737
737
|
)
|
|
738
738
|
lr_init.set_defaults(func=_cmd_locker_room_init)
|
|
739
739
|
|
|
@@ -758,16 +758,16 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
758
758
|
"collect-serve",
|
|
759
759
|
help="Serve the collect ingest endpoint: an HTTP JSON write surface that "
|
|
760
760
|
"persists DPO collection data (runs, attempts, finish markers) into "
|
|
761
|
-
"the activity database for collectors pointing
|
|
761
|
+
"the activity database for collectors pointing BLITZ_COLLECT_ENDPOINT here.",
|
|
762
762
|
)
|
|
763
763
|
collect_serve.add_argument(
|
|
764
764
|
"--db", default=None, metavar="PATH",
|
|
765
|
-
help="Activity database path (default:
|
|
765
|
+
help="Activity database path (default: BLITZ_ACTIVITY_DB_PATH env, "
|
|
766
766
|
"else data/activity.db).",
|
|
767
767
|
)
|
|
768
768
|
collect_serve.add_argument(
|
|
769
769
|
"--port", type=int, default=None, metavar="PORT",
|
|
770
|
-
help="Listen port (default:
|
|
770
|
+
help="Listen port (default: BLITZ_COLLECT_PORT env, else 1739).",
|
|
771
771
|
)
|
|
772
772
|
collect_serve.add_argument(
|
|
773
773
|
"--host", default="0.0.0.0", metavar="HOST",
|
|
@@ -158,7 +158,7 @@ You **MUST** consider the user input before proceeding (if not empty).
|
|
|
158
158
|
(its per-attempt replies are in `.blitz/execute/runs/<stamp>/`), mark it off,
|
|
159
159
|
then resume the loop.
|
|
160
160
|
`--collect` records every local attempt as DPO training data in the activity
|
|
161
|
-
database (`
|
|
161
|
+
database (`BLITZ_ACTIVITY_DB_PATH` env, else `data/activity.db` under the CWD). If the
|
|
162
162
|
invocation fails because that database is missing or unwritable, retry once
|
|
163
163
|
WITHOUT `--collect` — delegation must not be blocked by collection — and tell
|
|
164
164
|
the user collection was skipped and why. When you take over a task the local
|
|
@@ -10,7 +10,7 @@ from `sparepartslabs/blitz-locker-room`). Nothing is built locally. Refresh with
|
|
|
10
10
|
|
|
11
11
|
- **watch** — ingests coding-agent session transcripts into `data/activity.db`.
|
|
12
12
|
- **graph** — rebuilds the ontology of your playbook-enabled repos/huddles/features
|
|
13
|
-
and their code lineage into `data/ontology.db` on a loop. Scans `
|
|
13
|
+
and their code lineage into `data/ontology.db` on a loop. Scans `BLITZ_WORKSPACE_DIR`.
|
|
14
14
|
- **mcp** — serves the ontology to agents over MCP (SSE) and a browser graph view.
|
|
15
15
|
- **train** — on-demand QLoRA trainer (profile `train`, needs a GPU).
|
|
16
16
|
|
|
@@ -24,15 +24,15 @@ blitz locker-room train # on-demand QLoRA (GPU); outputs -> ./train-out
|
|
|
24
24
|
blitz locker-room down
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
Override host paths via env, e.g. `
|
|
28
|
-
Defaults: `
|
|
27
|
+
Override host paths via env, e.g. `BLITZ_WORKSPACE_DIR=/path/to/code blitz locker-room up`.
|
|
28
|
+
Defaults: `BLITZ_CLAUDE_PROJECTS_DIR=$projects_dir`, `BLITZ_WORKSPACE_DIR=$workspace_dir`.
|
|
29
29
|
|
|
30
30
|
## Use the node
|
|
31
31
|
|
|
32
32
|
- **MCP for agents:** the `mcp` service serves SSE at
|
|
33
|
-
`http://localhost:$${
|
|
33
|
+
`http://localhost:$${BLITZ_MCP_PORT:-1738}/sse` — add that URL to your agent's MCP config
|
|
34
34
|
(on a VPN / team host, point agents at the node's address instead of localhost).
|
|
35
|
-
- **Browser graph view:** open `http://localhost:$${
|
|
35
|
+
- **Browser graph view:** open `http://localhost:$${BLITZ_MCP_PORT:-1738}/graph`.
|
|
36
36
|
|
|
37
37
|
The ontology is built and served entirely by the node; there are no host-side
|
|
38
38
|
`ontologize`/`list`/`mcp` commands — query it through the MCP tools or `/graph`.
|
|
@@ -16,58 +16,58 @@ services:
|
|
|
16
16
|
<<: *core
|
|
17
17
|
command: ["python", "/app/watch.py"]
|
|
18
18
|
volumes:
|
|
19
|
-
- "$${
|
|
19
|
+
- "$${BLITZ_CLAUDE_PROJECTS_DIR:-$projects_dir}:/claude-projects:ro"
|
|
20
20
|
- ./data:/workspace/data
|
|
21
21
|
environment:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
BLITZ_PROJECTS_DIR: /claude-projects
|
|
23
|
+
BLITZ_ACTIVITY_DB_PATH: /workspace/data/activity.db
|
|
24
|
+
BLITZ_WATCH_INTERVAL_SECONDS: "$${BLITZ_WATCH_INTERVAL_SECONDS:-$interval}"
|
|
25
25
|
|
|
26
26
|
# Rebuild the ontology (repos/huddles/features + code lineage) on a loop.
|
|
27
27
|
graph:
|
|
28
28
|
<<: *core
|
|
29
29
|
command: ["python", "/app/ontologize.py"]
|
|
30
30
|
volumes:
|
|
31
|
-
- "$${
|
|
31
|
+
- "$${BLITZ_WORKSPACE_DIR:-$workspace_dir}:/repos:ro"
|
|
32
32
|
- ./data:/workspace/data
|
|
33
33
|
environment:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
BLITZ_SCAN_DIR: /repos
|
|
35
|
+
BLITZ_ONTOLOGY_DB_PATH: /workspace/data/ontology.db
|
|
36
|
+
BLITZ_ONTOLOGIZE_INTERVAL_SECONDS: "$${BLITZ_ONTOLOGIZE_INTERVAL_SECONDS:-300}"
|
|
37
37
|
|
|
38
38
|
# Serve the ontology to agents over MCP (SSE) + a /graph web view.
|
|
39
39
|
mcp:
|
|
40
40
|
<<: *core
|
|
41
41
|
command: ["python", "/app/server.py"]
|
|
42
42
|
ports:
|
|
43
|
-
- "$${
|
|
43
|
+
- "$${BLITZ_MCP_PORT:-1738}:1738"
|
|
44
44
|
volumes:
|
|
45
45
|
- ./data:/workspace/data:ro
|
|
46
46
|
environment:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
BLITZ_ONTOLOGY_DB_PATH: /workspace/data/ontology.db
|
|
48
|
+
BLITZ_MCP_HOST: 0.0.0.0
|
|
49
|
+
BLITZ_MCP_PORT: 1738
|
|
50
50
|
|
|
51
51
|
# Receive DPO collection writes from hosts running `blitz model execute
|
|
52
|
-
# --collect` (
|
|
52
|
+
# --collect` (BLITZ_COLLECT_ENDPOINT=http://<node>:1739) -> data/activity.db.
|
|
53
53
|
collect:
|
|
54
54
|
<<: *core
|
|
55
55
|
command: ["python", "/app/collect_serve.py"]
|
|
56
56
|
ports:
|
|
57
|
-
- "$${
|
|
57
|
+
- "$${BLITZ_COLLECT_PORT:-1739}:1739"
|
|
58
58
|
volumes:
|
|
59
59
|
- ./data:/workspace/data
|
|
60
60
|
environment:
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
BLITZ_ACTIVITY_DB_PATH: /workspace/data/activity.db
|
|
62
|
+
BLITZ_COLLECT_PORT: 1739
|
|
63
63
|
|
|
64
64
|
# On-demand (profile "train"): `docker compose run --rm train` / `make train`.
|
|
65
65
|
train:
|
|
66
66
|
image: ghcr.io/sparepartslabs/blitz-locker-room/train:latest
|
|
67
67
|
profiles: ["train"]
|
|
68
68
|
environment:
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
BLITZ_ACTIVITY_DB_PATH: /data/activity.db
|
|
70
|
+
BLITZ_BASE_MODEL_HF: "$${BLITZ_BASE_MODEL_HF:-$base_model}"
|
|
71
71
|
PYTORCH_CUDA_ALLOC_CONF: expandable_segments:True
|
|
72
72
|
volumes:
|
|
73
73
|
- ./data:/data:ro
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "blitz-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.15.0"
|
|
4
4
|
description = "Developer CLI for Blitz locker-room: spec-driven playbooks, a codebase/huddle ontology graph with an MCP tool, and the composable watcher/trainer/graph containers."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "MIT" }
|
|
@@ -242,7 +242,7 @@ def test_collect_unwritable_db_fails_loudly_before_any_task(tmp_path, capsys, mo
|
|
|
242
242
|
ro.mkdir()
|
|
243
243
|
os.chmod(ro, stat.S_IRUSR | stat.S_IXUSR)
|
|
244
244
|
db = ro / "activity.db"
|
|
245
|
-
monkeypatch.setenv("
|
|
245
|
+
monkeypatch.setenv("BLITZ_ACTIVITY_DB_PATH", str(db))
|
|
246
246
|
try:
|
|
247
247
|
args = cli.build_parser().parse_args(
|
|
248
248
|
["model", "execute", "--repo", str(tmp_path), "--collect"]
|
|
@@ -145,9 +145,9 @@ def test_check_writable_raises_on_unwritable_path(tmp_path):
|
|
|
145
145
|
|
|
146
146
|
|
|
147
147
|
def test_default_db_path_env_override(monkeypatch):
|
|
148
|
-
monkeypatch.delenv("
|
|
148
|
+
monkeypatch.delenv("BLITZ_ACTIVITY_DB_PATH", raising=False)
|
|
149
149
|
assert _collect.default_db_path() == __import__("pathlib").Path("data/activity.db")
|
|
150
|
-
monkeypatch.setenv("
|
|
150
|
+
monkeypatch.setenv("BLITZ_ACTIVITY_DB_PATH", "/tmp/other.db")
|
|
151
151
|
assert str(_collect.default_db_path()) == "/tmp/other.db"
|
|
152
152
|
|
|
153
153
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""Tests for the client side of the collect ingest endpoint: sink selection
|
|
2
|
-
via
|
|
2
|
+
via BLITZ_COLLECT_ENDPOINT, the HttpCollectSink (fail fast at run start, row parity
|
|
3
3
|
with the direct path, mid-run buffering), and the buffer flush command.
|
|
4
4
|
Specs: specs/005-collect-ingest-endpoint/."""
|
|
5
5
|
|
|
@@ -65,7 +65,7 @@ def test_check_writable_ok_against_live_server(tmp_path):
|
|
|
65
65
|
|
|
66
66
|
def test_cmd_execute_fails_fast_with_unreachable_endpoint(tmp_path, monkeypatch, capsys):
|
|
67
67
|
repo, tasks_file = _repo_with_tasks(tmp_path)
|
|
68
|
-
monkeypatch.setenv("
|
|
68
|
+
monkeypatch.setenv("BLITZ_COLLECT_ENDPOINT", "http://127.0.0.1:9")
|
|
69
69
|
rc = cli.main(["model", "execute", str(tasks_file), "--repo", str(repo),
|
|
70
70
|
"--collect"])
|
|
71
71
|
assert rc == 1
|
|
@@ -92,7 +92,7 @@ def test_endpoint_env_selects_http_sink(tmp_path, monkeypatch):
|
|
|
92
92
|
repo, tasks_file = _repo_with_tasks(tmp_path)
|
|
93
93
|
srv, thread, base = _start_server(tmp_path / "a.db")
|
|
94
94
|
try:
|
|
95
|
-
monkeypatch.setenv("
|
|
95
|
+
monkeypatch.setenv("BLITZ_COLLECT_ENDPOINT", base)
|
|
96
96
|
seen = _capture_collector(monkeypatch)
|
|
97
97
|
rc = cli.main(["model", "execute", str(tasks_file), "--repo", str(repo),
|
|
98
98
|
"--collect"])
|
|
@@ -105,8 +105,8 @@ def test_endpoint_env_selects_http_sink(tmp_path, monkeypatch):
|
|
|
105
105
|
|
|
106
106
|
def test_env_unset_selects_direct_store(tmp_path, monkeypatch):
|
|
107
107
|
repo, tasks_file = _repo_with_tasks(tmp_path)
|
|
108
|
-
monkeypatch.delenv("
|
|
109
|
-
monkeypatch.setenv("
|
|
108
|
+
monkeypatch.delenv("BLITZ_COLLECT_ENDPOINT", raising=False)
|
|
109
|
+
monkeypatch.setenv("BLITZ_ACTIVITY_DB_PATH", str(tmp_path / "direct.db"))
|
|
110
110
|
seen = _capture_collector(monkeypatch)
|
|
111
111
|
rc = cli.main(["model", "execute", str(tasks_file), "--repo", str(repo),
|
|
112
112
|
"--collect"])
|
|
@@ -288,16 +288,16 @@ def test_flush_stops_on_unreachable_endpoint_and_keeps_file(tmp_path):
|
|
|
288
288
|
|
|
289
289
|
|
|
290
290
|
def test_flush_cli_requires_an_endpoint(tmp_path, monkeypatch, capsys):
|
|
291
|
-
monkeypatch.delenv("
|
|
291
|
+
monkeypatch.delenv("BLITZ_COLLECT_ENDPOINT", raising=False)
|
|
292
292
|
buf = tmp_path / "collect-buffer.jsonl"
|
|
293
293
|
buf.write_text("")
|
|
294
294
|
rc = cli.main(["model", "collect", "flush", str(buf)])
|
|
295
295
|
assert rc == 2
|
|
296
|
-
assert "
|
|
296
|
+
assert "BLITZ_COLLECT_ENDPOINT" in capsys.readouterr().err
|
|
297
297
|
|
|
298
298
|
|
|
299
299
|
def test_flush_cli_errors_on_missing_file(monkeypatch, capsys, tmp_path):
|
|
300
|
-
monkeypatch.setenv("
|
|
300
|
+
monkeypatch.setenv("BLITZ_COLLECT_ENDPOINT", "http://127.0.0.1:9")
|
|
301
301
|
rc = cli.main(["model", "collect", "flush", str(tmp_path / "nope.jsonl")])
|
|
302
302
|
assert rc == 2
|
|
303
303
|
assert "no buffer file" in capsys.readouterr().err
|
|
@@ -307,7 +307,7 @@ def test_flush_cli_delivers_via_env_endpoint(tmp_path, monkeypatch, capsys):
|
|
|
307
307
|
_, _, buffer_path, db = _run_with_midrun_server_death(tmp_path)
|
|
308
308
|
srv, thread, base = _start_server(db)
|
|
309
309
|
try:
|
|
310
|
-
monkeypatch.setenv("
|
|
310
|
+
monkeypatch.setenv("BLITZ_COLLECT_ENDPOINT", base)
|
|
311
311
|
rc = cli.main(["model", "collect", "flush", str(buffer_path)])
|
|
312
312
|
assert rc == 0
|
|
313
313
|
assert "flushed 2 record(s)" in capsys.readouterr().out
|
|
@@ -133,11 +133,11 @@ def test_render_locker_room_compose_substitutes_default_paths(tmp_path):
|
|
|
133
133
|
_scaffold.render_locker_room(out, interval=45)
|
|
134
134
|
compose = (out / "docker-compose.yml").read_text()
|
|
135
135
|
# overridable host paths keep a concrete default baked at scaffold time
|
|
136
|
-
assert "${
|
|
136
|
+
assert "${BLITZ_CLAUDE_PROJECTS_DIR:-" in compose
|
|
137
137
|
assert "/.claude/projects}:/claude-projects:ro" in compose
|
|
138
|
-
assert "${
|
|
138
|
+
assert "${BLITZ_WORKSPACE_DIR:-" in compose
|
|
139
139
|
assert ":/repos:ro" in compose
|
|
140
|
-
assert "${
|
|
140
|
+
assert "${BLITZ_WATCH_INTERVAL_SECONDS:-45}" in compose
|
|
141
141
|
|
|
142
142
|
|
|
143
143
|
def test_render_locker_room_readme_and_gitignore(tmp_path):
|
|
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
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/memory/playbook.md
RENAMED
|
File without changes
|
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/common.sh
RENAMED
|
File without changes
|
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/setup-plan.sh
RENAMED
|
File without changes
|
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/plan-template.md
RENAMED
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/spec-template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/checklists/requirements.md
RENAMED
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/contracts/cli-commands.md
RENAMED
|
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
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/checklists/requirements.md
RENAMED
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/cli-output.md
RENAMED
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/ensure-rules.md
RENAMED
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/gitignore-block.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/checklists/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/contracts/export-format.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/checklists/requirements.md
RENAMED
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/contracts/client-sink.md
RENAMED
|
File without changes
|
{blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/contracts/ingest-api.md
RENAMED
|
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
|