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.
Files changed (118) hide show
  1. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/PKG-INFO +5 -5
  2. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/README.md +4 -4
  3. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/__init__.py +1 -1
  4. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_collect.py +3 -3
  5. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_collect_http.py +2 -2
  6. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_collect_server.py +3 -3
  7. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_train.py +15 -15
  8. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/cli.py +14 -14
  9. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/implement.md +1 -1
  10. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/locker_room_Makefile.tmpl +1 -1
  11. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/locker_room_README.md.tmpl +5 -5
  12. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/locker_room_compose.yml.tmpl +18 -18
  13. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/pyproject.toml +1 -1
  14. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_cli.py +1 -1
  15. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_collect.py +2 -2
  16. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_collect_http.py +9 -9
  17. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_scaffold.py +3 -3
  18. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/memory/playbook.md +0 -0
  19. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/check-prerequisites.sh +0 -0
  20. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/common.sh +0 -0
  21. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/create-new-feature.sh +0 -0
  22. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/setup-plan.sh +0 -0
  23. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/scripts/bash/setup-tasks.sh +0 -0
  24. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/templates/plan-template.md +0 -0
  25. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/templates/spec-template.md +0 -0
  26. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.blitz/templates/tasks-template.md +0 -0
  27. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.github/workflows/homebrew.yml +0 -0
  28. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.github/workflows/publish.yml +0 -0
  29. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.gitignore +0 -0
  30. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/.mcp.json +0 -0
  31. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/LICENSE +0 -0
  32. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_activity.py +0 -0
  33. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_code_graph.py +0 -0
  34. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_corpus.py +0 -0
  35. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_dataset.py +0 -0
  36. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_execute.py +0 -0
  37. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_git.py +0 -0
  38. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_gitignore.py +0 -0
  39. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_make.py +0 -0
  40. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_ontology.py +0 -0
  41. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_playbooks.py +0 -0
  42. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_redact.py +0 -0
  43. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_scaffold.py +0 -0
  44. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/_tool_schemas.py +0 -0
  45. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/__init__.py +0 -0
  46. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/__init__.py +0 -0
  47. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/analyze.md +0 -0
  48. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/clarify.md +0 -0
  49. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/plan.md +0 -0
  50. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/playbook.md +0 -0
  51. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/specify.md +0 -0
  52. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/commands/tasks.md +0 -0
  53. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/memory/playbook.md +0 -0
  54. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/check-prerequisites.sh +0 -0
  55. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/common.sh +0 -0
  56. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/create-new-feature.sh +0 -0
  57. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/setup-plan.sh +0 -0
  58. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/scripts/bash/setup-tasks.sh +0 -0
  59. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/plan-template.md +0 -0
  60. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/spec-template.md +0 -0
  61. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/scaffold/.blitz/templates/tasks-template.md +0 -0
  62. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/workspace/__init__.py +0 -0
  63. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/playbooks/workspace/huddle.md +0 -0
  64. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/__init__.py +0 -0
  65. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/blitz_cli/templates/workspace_playbook.md.tmpl +0 -0
  66. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/checklists/requirements.md +0 -0
  67. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/contracts/cli-commands.md +0 -0
  68. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/plan.md +0 -0
  69. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/quickstart.md +0 -0
  70. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/research.md +0 -0
  71. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/spec.md +0 -0
  72. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/001-cli-model-namespace/tasks.md +0 -0
  73. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/checklists/requirements.md +0 -0
  74. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/contracts/experimental-labels.md +0 -0
  75. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/data-model.md +0 -0
  76. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/plan.md +0 -0
  77. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/quickstart.md +0 -0
  78. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/research.md +0 -0
  79. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/spec.md +0 -0
  80. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/002-label-experimental-surfaces/tasks.md +0 -0
  81. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/checklists/requirements.md +0 -0
  82. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/cli-output.md +0 -0
  83. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/ensure-rules.md +0 -0
  84. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/contracts/gitignore-block.md +0 -0
  85. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/data-model.md +0 -0
  86. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/plan.md +0 -0
  87. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/quickstart.md +0 -0
  88. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/research.md +0 -0
  89. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/spec.md +0 -0
  90. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/003-init-gitignore-rules/tasks.md +0 -0
  91. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/checklists/requirements.md +0 -0
  92. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/contracts/cli.md +0 -0
  93. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/contracts/export-format.md +0 -0
  94. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/data-model.md +0 -0
  95. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/plan.md +0 -0
  96. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/quickstart.md +0 -0
  97. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/research.md +0 -0
  98. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/spec.md +0 -0
  99. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/004-dpo-collect-pairs/tasks.md +0 -0
  100. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/checklists/requirements.md +0 -0
  101. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/contracts/client-sink.md +0 -0
  102. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/contracts/ingest-api.md +0 -0
  103. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/data-model.md +0 -0
  104. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/plan.md +0 -0
  105. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/quickstart.md +0 -0
  106. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/research.md +0 -0
  107. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/spec.md +0 -0
  108. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/specs/005-collect-ingest-endpoint/tasks.md +0 -0
  109. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_activity.py +0 -0
  110. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_collect_server.py +0 -0
  111. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_corpus.py +0 -0
  112. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_execute.py +0 -0
  113. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_gitignore.py +0 -0
  114. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_make.py +0 -0
  115. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_ontology.py +0 -0
  116. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_playbooks.py +0 -0
  117. {blitz_cli-0.14.0 → blitz_cli-0.15.0}/tests/test_redact.py +0 -0
  118. {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.14.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
- (`ACTIVITY_DB_PATH`, else `data/activity.db`). With `COLLECT_ENDPOINT` set,
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
- ACTIVITY_DB_PATH=data/activity.db blitz locker-room collect-serve
88
+ BLITZ_ACTIVITY_DB_PATH=data/activity.db blitz locker-room collect-serve
89
89
 
90
90
  # on the collecting machine:
91
- COLLECT_ENDPOINT=http://locker-room-host:1739 blitz model execute --collect
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 `BASE_MODEL_HF` or `blitz locker-room init --base-model`.
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
- (`ACTIVITY_DB_PATH`, else `data/activity.db`). With `COLLECT_ENDPOINT` set,
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
- ACTIVITY_DB_PATH=data/activity.db blitz locker-room collect-serve
69
+ BLITZ_ACTIVITY_DB_PATH=data/activity.db blitz locker-room collect-serve
70
70
 
71
71
  # on the collecting machine:
72
- COLLECT_ENDPOINT=http://locker-room-host:1739 blitz model execute --collect
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 `BASE_MODEL_HF` or `blitz locker-room init --base-model`.
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
 
@@ -30,4 +30,4 @@ Commands:
30
30
 
31
31
  __all__ = ["__version__"]
32
32
 
33
- __version__ = "0.12.0"
33
+ __version__ = "0.15.0"
@@ -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 `ACTIVITY_DB_PATH`, WAL journal). Like
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: ACTIVITY_DB_PATH env override, else the
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("ACTIVITY_DB_PATH", "data/activity.db"))
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 COLLECT_ENDPOINT-selected counterpart of
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 COLLECT_ENDPOINT is set."""
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 (COLLECT_PORT), bind 0.0.0.0,
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
- (ACTIVITY_DB_PATH, COLLECT_PORT) and serve until interrupted."""
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("COLLECT_PORT", DEFAULT_PORT))
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 BASE_MODEL_HF (its
21
- scaffold-time default lives in docker-compose.yml) -- and PARAMS_B to match,
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
- SEQ_LEN defaults to 16384. Measured against the real corpus + Qwen tokenizer with
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 SEQ_LEN across separate steps
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
- PER_DEVICE_BATCH_SIZE overrides build_config's params_b-driven batch size
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("BASE_MODEL_HF", "Qwen/Qwen2.5-Coder-14B-Instruct")
74
- params_b = float(os.environ.get("PARAMS_B", "14"))
75
- seq_len = _scaffold.clamp_seq_len(int(os.environ.get("SEQ_LEN", "16384")))
76
- eval_fraction = float(os.environ.get("EVAL_FRACTION", "0.1"))
77
- db_path = os.environ.get("ACTIVITY_DB_PATH", "data/activity.db")
78
- save_steps = int(os.environ.get("SAVE_STEPS", "50"))
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("PER_DEVICE_BATCH_SIZE")
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 EVAL_FRACTION.",
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 SEQ_LEN/batch).
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 SAVE_STEPS once
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 WORKSPACE_DIR to the code root the graph should ontologize "
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): COLLECT_ENDPOINT set means collection
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("COLLECT_ENDPOINT")
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("COLLECT_ENDPOINT")
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 COLLECT_ENDPOINT or pass "
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("COLLECT_PORT", _collect_server.DEFAULT_PORT))
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 ACTIVITY_DB_PATH, default data/activity.db). Off by default, "
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 (COLLECT_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 COLLECT_ENDPOINT env var).",
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: ACTIVITY_DB_PATH env, "
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 BASE_MODEL_HF.",
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 COLLECT_ENDPOINT here.",
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: ACTIVITY_DB_PATH env, "
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: COLLECT_PORT env, else 1739).",
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 (`ACTIVITY_DB_PATH` env, else `data/activity.db` under the CWD). If the
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
@@ -21,7 +21,7 @@ pull:
21
21
  up:
22
22
  mkdir -p data
23
23
  $(COMPOSE) up -d watch graph mcp
24
- @echo "MCP server on http://localhost:$${MCP_PORT:-1738}/sse"
24
+ @echo "MCP server on http://localhost:$${BLITZ_MCP_PORT:-1738}/sse"
25
25
 
26
26
  down:
27
27
  $(COMPOSE) down
@@ -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 `WORKSPACE_DIR`.
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. `WORKSPACE_DIR=/path/to/code blitz locker-room up`.
28
- Defaults: `CLAUDE_PROJECTS_DIR=$projects_dir`, `WORKSPACE_DIR=$workspace_dir`.
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:$${MCP_PORT:-1738}/sse` — add that URL to your agent's MCP config
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:$${MCP_PORT:-1738}/graph`.
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
- - "$${CLAUDE_PROJECTS_DIR:-$projects_dir}:/claude-projects:ro"
19
+ - "$${BLITZ_CLAUDE_PROJECTS_DIR:-$projects_dir}:/claude-projects:ro"
20
20
  - ./data:/workspace/data
21
21
  environment:
22
- PROJECTS_DIR: /claude-projects
23
- ACTIVITY_DB_PATH: /workspace/data/activity.db
24
- WATCH_INTERVAL_SECONDS: "$${WATCH_INTERVAL_SECONDS:-$interval}"
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
- - "$${WORKSPACE_DIR:-$workspace_dir}:/repos:ro"
31
+ - "$${BLITZ_WORKSPACE_DIR:-$workspace_dir}:/repos:ro"
32
32
  - ./data:/workspace/data
33
33
  environment:
34
- SCAN_DIR: /repos
35
- ONTOLOGY_DB_PATH: /workspace/data/ontology.db
36
- ONTOLOGIZE_INTERVAL_SECONDS: "$${ONTOLOGIZE_INTERVAL_SECONDS:-300}"
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
- - "$${MCP_PORT:-1738}:1738"
43
+ - "$${BLITZ_MCP_PORT:-1738}:1738"
44
44
  volumes:
45
45
  - ./data:/workspace/data:ro
46
46
  environment:
47
- ONTOLOGY_DB_PATH: /workspace/data/ontology.db
48
- MCP_HOST: 0.0.0.0
49
- MCP_PORT: 1738
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` (COLLECT_ENDPOINT=http://<node>:1739) -> data/activity.db.
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
- - "$${COLLECT_PORT:-1739}:1739"
57
+ - "$${BLITZ_COLLECT_PORT:-1739}:1739"
58
58
  volumes:
59
59
  - ./data:/workspace/data
60
60
  environment:
61
- ACTIVITY_DB_PATH: /workspace/data/activity.db
62
- COLLECT_PORT: 1739
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
- ACTIVITY_DB_PATH: /data/activity.db
70
- BASE_MODEL_HF: "$${BASE_MODEL_HF:-$base_model}"
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.14.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("ACTIVITY_DB_PATH", str(db))
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("ACTIVITY_DB_PATH", raising=False)
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("ACTIVITY_DB_PATH", "/tmp/other.db")
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 COLLECT_ENDPOINT, the HttpCollectSink (fail fast at run start, row parity
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("COLLECT_ENDPOINT", "http://127.0.0.1:9")
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("COLLECT_ENDPOINT", base)
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("COLLECT_ENDPOINT", raising=False)
109
- monkeypatch.setenv("ACTIVITY_DB_PATH", str(tmp_path / "direct.db"))
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("COLLECT_ENDPOINT", raising=False)
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 "COLLECT_ENDPOINT" in capsys.readouterr().err
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("COLLECT_ENDPOINT", "http://127.0.0.1:9")
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("COLLECT_ENDPOINT", base)
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 "${CLAUDE_PROJECTS_DIR:-" in compose
136
+ assert "${BLITZ_CLAUDE_PROJECTS_DIR:-" in compose
137
137
  assert "/.claude/projects}:/claude-projects:ro" in compose
138
- assert "${WORKSPACE_DIR:-" in compose
138
+ assert "${BLITZ_WORKSPACE_DIR:-" in compose
139
139
  assert ":/repos:ro" in compose
140
- assert "${WATCH_INTERVAL_SECONDS:-45}" in compose
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