brass-runtime 1.16.0 → 1.17.0

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 (219) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +287 -23
  3. package/dist/agent/cli/main.cjs +38 -38
  4. package/dist/agent/cli/main.js +6 -6
  5. package/dist/agent/cli/main.mjs +6 -6
  6. package/dist/agent/index.cjs +7 -7
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +6 -6
  9. package/dist/agent/index.mjs +6 -6
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3Y2RIUMM.js +300 -0
  15. package/dist/{chunk-7XOPAB5Q.js → chunk-4P2HHGAX.mjs} +83 -5
  16. package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
  17. package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
  18. package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
  19. package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
  20. package/dist/chunk-5QC7LRZ3.js +229 -0
  21. package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
  22. package/dist/chunk-62AZW6UT.cjs +313 -0
  23. package/dist/chunk-6IXXWIUM.js +683 -0
  24. package/dist/chunk-6RY2FFN4.mjs +2024 -0
  25. package/dist/chunk-74ZTY6CP.js +2871 -0
  26. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  27. package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
  28. package/dist/chunk-7X3K5RMS.js +2024 -0
  29. package/dist/chunk-7ZPEZ57L.cjs +2024 -0
  30. package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
  31. package/dist/chunk-AGR5B2BC.cjs +683 -0
  32. package/dist/chunk-B33ICAKP.js +313 -0
  33. package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
  34. package/dist/{chunk-F5EUMJL7.mjs → chunk-BKK77SBA.js} +83 -5
  35. package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
  36. package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
  37. package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
  38. package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
  39. package/dist/chunk-EOC4UHBS.mjs +229 -0
  40. package/dist/chunk-F6XWZQY4.cjs +777 -0
  41. package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
  42. package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
  43. package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
  44. package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
  45. package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
  46. package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
  47. package/dist/chunk-KN32XNTH.mjs +313 -0
  48. package/dist/chunk-KQLYONSE.cjs +2871 -0
  49. package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
  50. package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
  51. package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
  52. package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
  53. package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
  54. package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
  55. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  56. package/dist/chunk-PD4EJTQC.cjs +229 -0
  57. package/dist/chunk-PWC3RBQE.mjs +300 -0
  58. package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
  59. package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
  60. package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
  61. package/dist/chunk-SK7UZRNI.mjs +777 -0
  62. package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
  63. package/dist/chunk-UB4B6OFY.js +370 -0
  64. package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
  65. package/dist/chunk-VWIPB6I5.js +777 -0
  66. package/dist/{chunk-JNFRRJYH.cjs → chunk-WBGRHGBP.cjs} +270 -192
  67. package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
  68. package/dist/core/index.cjs +135 -9
  69. package/dist/core/index.d.ts +238 -33
  70. package/dist/core/index.js +155 -29
  71. package/dist/core/index.mjs +155 -29
  72. package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
  73. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  74. package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
  75. package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
  76. package/dist/http/index.cjs +324 -2986
  77. package/dist/http/index.d.ts +54 -68
  78. package/dist/http/index.js +238 -2900
  79. package/dist/http/index.mjs +238 -2900
  80. package/dist/http/testing.cjs +14 -12
  81. package/dist/http/testing.d.ts +5 -4
  82. package/dist/http/testing.js +10 -8
  83. package/dist/http/testing.mjs +10 -8
  84. package/dist/index.cjs +423 -255
  85. package/dist/index.d.ts +87 -69
  86. package/dist/index.js +301 -133
  87. package/dist/index.mjs +301 -133
  88. package/dist/observability/index.cjs +18 -531
  89. package/dist/observability/index.d.ts +81 -8
  90. package/dist/observability/index.js +25 -538
  91. package/dist/observability/index.mjs +25 -538
  92. package/dist/perf/cli.cjs +401 -0
  93. package/dist/perf/cli.d.ts +1 -0
  94. package/dist/perf/cli.js +401 -0
  95. package/dist/perf/cli.mjs +401 -0
  96. package/dist/perf/index.cjs +141 -0
  97. package/dist/perf/index.d.ts +483 -0
  98. package/dist/perf/index.js +141 -0
  99. package/dist/perf/index.mjs +141 -0
  100. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  101. package/dist/schema/index.cjs +6 -2
  102. package/dist/schema/index.d.ts +3 -1
  103. package/dist/schema/index.js +5 -1
  104. package/dist/schema/index.mjs +5 -1
  105. package/dist/{server-C8hDXA74.d.ts → server-D6JZ15_e.d.ts} +16 -4
  106. package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  107. package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
  108. package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
  109. package/docs/ARCHITECTURE.md +292 -0
  110. package/docs/README.md +65 -0
  111. package/docs/adr/0001-ai-context-pack.md +32 -0
  112. package/docs/agent-apply-mode.md +104 -0
  113. package/docs/agent-approvals.md +110 -0
  114. package/docs/agent-batch.md +185 -0
  115. package/docs/agent-boundaries.md +112 -0
  116. package/docs/agent-chat-sessions.md +160 -0
  117. package/docs/agent-ci.md +17 -0
  118. package/docs/agent-cli.md +405 -0
  119. package/docs/agent-config.md +480 -0
  120. package/docs/agent-context-discovery.md +159 -0
  121. package/docs/agent-copilot-like-dx.md +126 -0
  122. package/docs/agent-declarative-optimized-planning.md +138 -0
  123. package/docs/agent-dx.md +224 -0
  124. package/docs/agent-env-files.md +126 -0
  125. package/docs/agent-follow-up-context.md +43 -0
  126. package/docs/agent-global-usage.md +180 -0
  127. package/docs/agent-init.md +109 -0
  128. package/docs/agent-install-and-configure.md +516 -0
  129. package/docs/agent-language-workspace-ux.md +99 -0
  130. package/docs/agent-llm-adapters.md +123 -0
  131. package/docs/agent-local-install.md +190 -0
  132. package/docs/agent-local-tests.md +51 -0
  133. package/docs/agent-observability.md +155 -0
  134. package/docs/agent-patch-quality-loop.md +162 -0
  135. package/docs/agent-presets.md +22 -0
  136. package/docs/agent-project-commands.md +237 -0
  137. package/docs/agent-project-intelligence.md +156 -0
  138. package/docs/agent-redaction.md +18 -0
  139. package/docs/agent-release-readiness.md +76 -0
  140. package/docs/agent-rollback-safety.md +162 -0
  141. package/docs/agent-rollback.md +23 -0
  142. package/docs/agent-run-artifacts.md +16 -0
  143. package/docs/agent-vscode-auto-discovery.md +137 -0
  144. package/docs/agent-vscode-batch-runner.md +100 -0
  145. package/docs/agent-vscode-chat-layout.md +90 -0
  146. package/docs/agent-vscode-clean-install.md +147 -0
  147. package/docs/agent-vscode-code-actions.md +70 -0
  148. package/docs/agent-vscode-diff-preview.md +45 -0
  149. package/docs/agent-vscode-inline-assist.md +56 -0
  150. package/docs/agent-vscode-install.md +186 -0
  151. package/docs/agent-vscode-model-setup.md +97 -0
  152. package/docs/agent-vscode-patch-preview.md +92 -0
  153. package/docs/agent-vscode-problems.md +79 -0
  154. package/docs/agent-vscode-project-dashboard.md +106 -0
  155. package/docs/agent-vscode-run-history.md +92 -0
  156. package/docs/agent-vscode-ux.md +73 -0
  157. package/docs/ai/INVARIANTS.md +84 -0
  158. package/docs/ai/PROJECT_MAP.md +338 -0
  159. package/docs/ai/PUBLIC_API.md +339 -0
  160. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  161. package/docs/api-polish.md +37 -0
  162. package/docs/cancellation.md +162 -0
  163. package/docs/coverage.md +46 -0
  164. package/docs/framework-integrations.md +38 -0
  165. package/docs/frameworks/angular.md +153 -0
  166. package/docs/frameworks/express.md +125 -0
  167. package/docs/frameworks/fastify.md +124 -0
  168. package/docs/frameworks/nestjs.md +282 -0
  169. package/docs/frameworks/nextjs.md +147 -0
  170. package/docs/frameworks/react.md +139 -0
  171. package/docs/frameworks/vanilla.md +224 -0
  172. package/docs/getting-started.md +159 -0
  173. package/docs/guides/README.md +40 -0
  174. package/docs/guides/circuit-breaker.md +89 -0
  175. package/docs/guides/error-handling.md +91 -0
  176. package/docs/guides/getting-started.md +107 -0
  177. package/docs/guides/layers.md +189 -0
  178. package/docs/guides/metrics.md +101 -0
  179. package/docs/guides/resource-management.md +141 -0
  180. package/docs/guides/retry.md +215 -0
  181. package/docs/guides/semaphore.md +66 -0
  182. package/docs/guides/streams.md +117 -0
  183. package/docs/guides/supervisors.md +98 -0
  184. package/docs/guides/testing.md +162 -0
  185. package/docs/guides/tracing.md +71 -0
  186. package/docs/http-recipes.md +399 -0
  187. package/docs/http.md +749 -0
  188. package/docs/modules.md +285 -0
  189. package/docs/nestjs.md +6 -0
  190. package/docs/observability-collector-smoke.md +31 -0
  191. package/docs/observability-framework-examples.md +110 -0
  192. package/docs/observability.md +649 -0
  193. package/docs/otel-collector-smoke.yaml +27 -0
  194. package/docs/performance-profiler.md +199 -0
  195. package/docs/production-readiness.md +73 -0
  196. package/docs/recipes/README.md +12 -0
  197. package/docs/recipes/http-server.md +45 -0
  198. package/docs/recipes/layers.md +44 -0
  199. package/docs/recipes/performance.md +47 -0
  200. package/docs/recipes/runtime.md +41 -0
  201. package/docs/recipes/testing.md +41 -0
  202. package/docs/release.md +53 -0
  203. package/docs/wasm-bounded-queues.md +44 -0
  204. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  205. package/docs/wasm-fiber-engine.md +117 -0
  206. package/docs/wasm-scheduler-state-machine.md +122 -0
  207. package/docs/wasm-stream-chunks.md +54 -0
  208. package/package.json +22 -2
  209. package/dist/chunk-45F7OKGT.cjs +0 -104
  210. package/dist/chunk-7V4KY4RL.mjs +0 -104
  211. package/dist/chunk-DJQ7OMMB.cjs +0 -144
  212. package/dist/chunk-GOV47PPB.mjs +0 -552
  213. package/dist/chunk-JF4XXPZ5.cjs +0 -552
  214. package/dist/chunk-KCPT2D6G.js +0 -552
  215. package/dist/chunk-NOYZIMUJ.mjs +0 -144
  216. package/dist/chunk-PNVFW245.js +0 -144
  217. package/dist/chunk-ROJC3NBJ.js +0 -104
  218. package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
  219. package/dist/schedule-Fque9Abz.d.ts +0 -70
@@ -0,0 +1,405 @@
1
+ # Brass Agent CLI
2
+
3
+ ## Initialize a workspace
4
+
5
+ ```bash
6
+ brass-agent --init
7
+ ```
8
+
9
+ This creates `.brass-agent.json`, `brass-agent.batch.json`, `.env.example`, and `BRASS_AGENT.md` in the workspace. Existing files are skipped unless `--force` is passed.
10
+
11
+ Useful variants:
12
+
13
+ ```bash
14
+ brass-agent --init --init-dry-run
15
+ brass-agent --init --init-profile google
16
+ brass-agent --init --init-profile fake --force
17
+ ```
18
+
19
+ See [Agent init](./agent-init.md) for the generated config and recommended first-run flow.
20
+
21
+
22
+ `brass-agent` is the development CLI for the experimental `src/agent` module.
23
+ It wires the agent environment together, runs `runAgent(...)`, and prints either a
24
+ human-readable run summary, streamed event JSON, protocol JSON Lines, or the raw `AgentState` JSON.
25
+
26
+ The CLI is intentionally thin:
27
+
28
+ ```txt
29
+ CLI
30
+ -> parse flags
31
+ -> load .brass-agent.json if present
32
+ -> choose LLM provider
33
+ -> choose context discovery budget
34
+ -> choose approval strategy
35
+ -> create AgentEnv
36
+ -> create Runtime
37
+ -> runAgent(...)
38
+ -> print result
39
+ ```
40
+
41
+ The runtime and agent invariants still live below the CLI. The CLI must not run
42
+ side effects directly except for reading process arguments/environment, prompting
43
+ for approvals, and printing output.
44
+
45
+ ## Install/build entry
46
+
47
+ The package exposes a binary after build:
48
+
49
+ ```bash
50
+ npm run build
51
+ npm run agent:link
52
+ brass-agent "fix the failing tests"
53
+ ```
54
+
55
+ For local development without building:
56
+
57
+ ```bash
58
+ npm run agent:dev -- "fix the failing tests"
59
+ # or
60
+ npx tsx src/agent/cli/main.ts "fix the failing tests"
61
+ ```
62
+
63
+ ## Usage
64
+
65
+ ```bash
66
+ brass-agent [options] "goal"
67
+ ```
68
+
69
+ Options:
70
+
71
+ ```txt
72
+ --mode read-only|propose|write|autonomous
73
+ Agent permission mode. Default: propose.
74
+
75
+ --apply
76
+ Alias for --mode write.
77
+
78
+ --cwd PATH
79
+ Starting directory for workspace discovery. Default: current directory.
80
+
81
+ --where, --print-workspace
82
+ Print the resolved workspace root and exit.
83
+
84
+ --no-discover-workspace
85
+ Use --cwd exactly instead of searching upward for package.json, .brass-agent.json, workspace markers, or .git.
86
+
87
+ --config PATH
88
+ Load a specific .brass-agent.json policy/config file.
89
+
90
+ --batch-file PATH
91
+ Run multiple goals sequentially from a JSON or line-based file.
92
+
93
+ --batch-stop-on-failure
94
+ Stop a batch after the first failed run.
95
+
96
+ --batch-continue-on-failure
97
+ Continue a batch even when one run fails.
98
+
99
+ --no-config
100
+ Do not discover or load an agent config file.
101
+
102
+ --json
103
+ Print the full AgentState JSON instead of human-readable output.
104
+
105
+ --events-json
106
+ Stream compact AgentEvent objects as JSON Lines and do not print final AgentState.
107
+
108
+ --protocol-json
109
+ Stream Brass Agent protocol JSON Lines. This includes event messages and a final-state message for editor integrations.
110
+
111
+ --yes, -y
112
+ Auto-approve approval prompts. Useful for CI and smoke tests.
113
+
114
+ --no-input
115
+ Do not prompt; reject any action that requires approval.
116
+
117
+ --approval auto|interactive|approve|deny
118
+ Approval strategy. Default: auto.
119
+
120
+ --help, -h
121
+ Show help.
122
+ ```
123
+
124
+
125
+ ## Batch runs
126
+
127
+ P21 adds sequential batch execution:
128
+
129
+ ```bash
130
+ brass-agent --batch-file ./brass-agent.batch.json --ci
131
+ ```
132
+
133
+ Batch files can be JSON arrays, JSON objects with a `goals` array, or line-based
134
+ text files. Each item becomes a normal `runAgent(...)` invocation, so policy,
135
+ approvals, redaction, rollback safety, and CI exit code handling still apply.
136
+
137
+ See [Agent batch runs](./agent-batch.md).
138
+
139
+ ## Config files
140
+
141
+ By default, the CLI first resolves a workspace root by searching upward from `--cwd` for:
142
+
143
+ ```txt
144
+ .brass-agent.json
145
+ brass-agent.config.json
146
+ package.json
147
+ pnpm-workspace.yaml
148
+ turbo.json
149
+ nx.json
150
+ .git
151
+ ```
152
+
153
+ Then it searches upward from that resolved workspace root for config files:
154
+
155
+ ```txt
156
+ .brass-agent.json
157
+ brass-agent.config.json
158
+ ```
159
+
160
+ Use `brass-agent --where` to see the resolved root.
161
+
162
+ Use `--config PATH` to force a specific file, or `--no-config` to run with
163
+ only built-in defaults and environment variables. Config can set default mode,
164
+ approval strategy, LLM provider/model, project command discovery, context discovery,
165
+ shell command policy, patch apply policy, and tool timeouts/retries.
166
+
167
+ Precedence is:
168
+
169
+ ```txt
170
+ CLI flags > environment variables > .brass-agent.json > built-in defaults
171
+ ```
172
+
173
+ See [Agent config and policy files](./agent-config.md).
174
+
175
+ ## Context discovery
176
+
177
+ Before calling the LLM, the CLI-driven agent now runs a bounded context pass by
178
+ default. It extracts paths and identifiers from the goal and validation output,
179
+ then uses `fs.searchText` / `fs.readFile` to gather likely relevant files.
180
+
181
+ Tune it in config:
182
+
183
+ ```json
184
+ {
185
+ "context": {
186
+ "maxSearchQueries": 3,
187
+ "maxFiles": 4
188
+ }
189
+ }
190
+ ```
191
+
192
+ Or disable it:
193
+
194
+ ```json
195
+ {
196
+ "context": {
197
+ "enabled": false
198
+ }
199
+ }
200
+ ```
201
+
202
+ See [Agent context discovery](./agent-context-discovery.md).
203
+
204
+ ## Modes
205
+
206
+ ### `propose`
207
+
208
+ Default mode. The agent can inspect the workspace, discover project-aware
209
+ validation commands from `package.json`/lockfiles/config, run whitelisted
210
+ validation commands, discover a bounded set of relevant context files, ask the
211
+ LLM, and record `patch.proposed`. It does not
212
+ apply changes.
213
+
214
+ ```bash
215
+ brass-agent "fix the failing tests"
216
+ ```
217
+
218
+ ### `write`
219
+
220
+ Writable mode. The agent can apply an extracted unified diff through the
221
+ `PatchService`, then rerun validation. If a generated patch fails to apply or
222
+ validation still fails, P13 can ask `llm.patch` for a bounded repair diff and
223
+ validate again. Applying a patch still requires approval.
224
+ In an interactive terminal the CLI prompts by default; in CI/non-interactive
225
+ contexts use `--yes` to approve or `--no-input` to reject.
226
+
227
+ ```bash
228
+ brass-agent --apply "fix the failing tests"
229
+ # equivalent:
230
+ brass-agent --mode write "fix the failing tests"
231
+ # non-interactive approval:
232
+ brass-agent --apply --yes "fix the failing tests"
233
+ ```
234
+
235
+ ### `read-only`
236
+
237
+ Inspection mode. The agent reads workspace context, checks project metadata such
238
+ as lockfiles, and asks the LLM without running shell validation or applying
239
+ patches.
240
+
241
+ ```bash
242
+ brass-agent --mode read-only "inspect this repo"
243
+ ```
244
+
245
+ ### `autonomous`
246
+
247
+ Reserved for future work. It currently has the broadest policy surface, but P6
248
+ still routes sensitive actions such as `patch.apply` through approvals.
249
+
250
+ ## Output
251
+
252
+ Human-readable output is the default:
253
+
254
+ ```txt
255
+ brass-agent propose
256
+ workspace: /repo
257
+ goal: fix the failing tests
258
+
259
+ ✓ read package.json
260
+ ! pnpm test exited 1
261
+ ✓ llm.plan responded
262
+ ✓ patch proposed
263
+ ✓ done
264
+
265
+ phase: done
266
+ steps: 5
267
+ patch: proposed only; rerun with --apply to apply it
268
+
269
+ summary:
270
+ ...
271
+ ```
272
+
273
+ Use `--json` when debugging the state machine or tests:
274
+
275
+ ```bash
276
+ brass-agent --json "fix the failing tests"
277
+ ```
278
+
279
+ Use `--events-json` for quick event-only streams:
280
+
281
+ ```bash
282
+ brass-agent --events-json "fix the failing tests"
283
+ ```
284
+
285
+ Use `--protocol-json` for editor integrations and other clients that need both live events and the final compact state:
286
+
287
+ ```bash
288
+ brass-agent --protocol-json "fix the failing tests"
289
+ ```
290
+
291
+ The protocol is newline-delimited JSON:
292
+
293
+ ```jsonl
294
+ {"protocol":"brass-agent","version":1,"type":"event","event":{"type":"agent.run.started"}}
295
+ {"protocol":"brass-agent","version":1,"type":"final-state","state":{"phase":"done"}}
296
+ ```
297
+
298
+ See [Agent DX surfaces](./agent-dx.md).
299
+
300
+ ## Project command discovery
301
+
302
+ The CLI passes `config.project` into `runAgent(...)`. The agent uses it to
303
+ select validation commands instead of hardcoding `npm test`.
304
+
305
+ Default discovery reads `package.json`, checks common lockfiles, infers
306
+ `npm`/`pnpm`/`yarn`/`bun`, and selects scripts like `test`,
307
+ `test:ci`, `typecheck`, or `lint` when relevant.
308
+
309
+ Examples:
310
+
311
+ ```json
312
+ {
313
+ "project": {
314
+ "packageManager": "pnpm",
315
+ "validationCommands": ["pnpm run test:unit", "pnpm run typecheck"]
316
+ }
317
+ }
318
+ ```
319
+
320
+ See [Agent project command discovery](./agent-project-commands.md).
321
+
322
+ ## Approvals
323
+
324
+ Actions can be allowed, denied, or marked as requiring approval by
325
+ `PermissionService`. In P6, `patch.apply` requires approval in `write` and
326
+ `autonomous` modes.
327
+
328
+ Approval strategy is chosen by CLI flags/environment:
329
+
330
+ ```txt
331
+ --approval auto Interactive only when stdin/stderr/stdout are TTYs; otherwise deny.
332
+ --approval interactive Always prompt on stderr.
333
+ --approval approve Auto-approve all approval requests.
334
+ --approval deny Auto-reject all approval requests.
335
+ --yes, -y Alias for --approval approve.
336
+ --no-input Alias for --approval deny.
337
+ ```
338
+
339
+ Environment knobs:
340
+
341
+ ```bash
342
+ BRASS_AGENT_APPROVAL=approve|deny|interactive|auto
343
+ BRASS_AGENT_AUTO_APPROVE=true
344
+ ```
345
+
346
+ Prompts are written to stderr, so `--json --approval interactive` can still keep
347
+ final JSON on stdout. The default remains conservative: non-interactive runs deny
348
+ approval-required actions unless `--yes` or `BRASS_AGENT_AUTO_APPROVE=true` is
349
+ set.
350
+
351
+ ## LLM providers
352
+
353
+ The CLI chooses a provider from environment variables.
354
+
355
+ Fake/offline:
356
+
357
+ ```bash
358
+ BRASS_LLM_PROVIDER=fake brass-agent "inspect"
359
+ ```
360
+
361
+ Google Gemini:
362
+
363
+ ```bash
364
+ BRASS_LLM_PROVIDER=google \
365
+ GEMINI_API_KEY="..." \
366
+ BRASS_GOOGLE_MODEL="gemini-2.5-flash" \
367
+ brass-agent "fix the failing tests"
368
+ ```
369
+
370
+ OpenAI-compatible:
371
+
372
+ ```bash
373
+ BRASS_LLM_PROVIDER=openai-compatible \
374
+ BRASS_LLM_ENDPOINT="https://api.openai.com/v1/chat/completions" \
375
+ BRASS_LLM_API_KEY="..." \
376
+ BRASS_LLM_MODEL="gpt-4.1" \
377
+ brass-agent "fix the failing tests"
378
+ ```
379
+
380
+ If `BRASS_LLM_PROVIDER` is not set, the CLI tries Google, then
381
+ OpenAI-compatible, then falls back to the fake LLM.
382
+
383
+ The CLI also auto-loads supported agent environment keys from `.brass-agent.env`,
384
+ `.env.local`, and `.env` in `--cwd`. Use `--env-file PATH` to choose a specific
385
+ file, or `--no-env-file` to disable this behavior. The loader never prints secret
386
+ values and ignores non-agent keys. See [Agent env files](./agent-env-files.md).
387
+
388
+ ## Applying a reviewed patch file
389
+
390
+ Editor integrations can apply an already-reviewed unified diff without asking
391
+ the model to regenerate it. This exact patch-file path does not run the patch
392
+ quality repair loop, so the diff being applied is the diff the user reviewed:
393
+
394
+ ```bash
395
+ brass-agent --apply-patch-file ./approved.diff --yes "apply approved patch"
396
+ ```
397
+
398
+ For preview integrations, use:
399
+
400
+ ```bash
401
+ brass-agent --protocol-json --protocol-full-patches "fix the failing tests"
402
+ ```
403
+
404
+ `--protocol-full-patches` is intended for trusted local clients that need the
405
+ full `patch.proposed` payload. Other large payloads remain compacted.