ur-agent 1.36.1 → 1.37.1

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.
package/README.md CHANGED
@@ -178,12 +178,14 @@ placeholder and is hidden from the list.
178
178
  ur provider list
179
179
  ur provider status
180
180
  ur provider doctor
181
+ ur provider models [provider] --json
181
182
  ur config set provider ollama
182
183
  ur config set provider openai-api
183
184
  ur config set provider anthropic-api
184
185
  ur config set provider gemini-api
185
186
  ur config set provider openrouter
186
187
  ur config set model qwen3-coder:480b-cloud
188
+ ur provider select-model ollama qwen3-coder:480b-cloud --json
187
189
  ur config set base_url http://localhost:11434
188
190
  ur config set provider.fallback ollama
189
191
  ```
@@ -363,11 +365,17 @@ UR-AGENT uses that hook output instead of the built-in bar.
363
365
 
364
366
  ### IDE Integration
365
367
 
368
+ The professional UR IDE integration is the **UR Inline Diffs** VS Code
369
+ extension: a chat panel, inline diff review, an actions panel, an agent
370
+ status card, a searchable command palette, and an agent options panel for VS
371
+ Code, Cursor, and Windsurf. It is bundled inside this repository and
372
+ packaged as a local VSIX when installed from UR-AGENT; the public install
373
+ path does not depend on an unpublished marketplace extension ID. The
374
+ extension never talks to a model provider or network service directly —
375
+ every AI request goes through your local `ur` CLI, same as in a terminal.
376
+
366
377
  `ur ide diff` captures review bundles under `.ur/ide/diffs/` so editors can
367
- show agent diffs without scraping terminal output. The shipped VS Code inline
368
- diff extension is bundled inside this repository and packaged as a local VSIX
369
- when installed from UR-AGENT; the public install path does not depend on an
370
- unpublished marketplace extension ID.
378
+ show agent diffs without scraping terminal output:
371
379
 
372
380
  ```sh
373
381
  ur ide diff capture --title "Parser fix"
@@ -375,27 +383,31 @@ ur ide diff list
375
383
  ur ide diff show <id>
376
384
  ```
377
385
 
378
- The extension is local-only. It reads and writes diff metadata inside the
379
- current workspace and does not call model providers or network services. In the
380
- UR Inline Diffs view you can preview a bundle, **Apply** it (a confirmed
381
- `git apply`, never a silent write), **Reject** it, or run **UR: Show Status**.
386
+ In the **Inline Diffs** / **Actions** views you can preview a bundle,
387
+ **Apply** it (a confirmed `git apply`, recorded through `ur ide diff
388
+ approve` never a silent write or an out-of-vocabulary status), **Reject**
389
+ it, or run **UR: Agent Status**. Chat, editor actions (Explain/Fix/Generate
390
+ Tests), diff review, and the verifier all route through the same CLI
391
+ contract — see the [IDE Guide](docs/IDE.md) for the full feature list.
382
392
 
383
393
  Inspect and configure integration per editor:
384
394
 
385
395
  ```sh
386
- ur ide status # workspace, ACP server, provider/model, plugin count
396
+ ur ide status # workspace, ACP server, provider/model, sandbox/verifier mode, plugin count
387
397
  ur ide doctor # pass/warn/fail checks; reports missing config clearly
388
398
  ur ide config zed # print the .zed/settings.json ACP block
389
399
  ur ide config vscode # VS Code / Cursor / Windsurf setup
390
400
  ```
391
401
 
392
- Editors connect either through the native UR extension/plugin (VS Code family,
393
- JetBrains) or the stdio Agent Client Protocol (Zed, ACP Neovim, generic ACP
394
- clients). Start an ACP surface with:
402
+ VS Code, Cursor, and Windsurf connect through the UR Inline Diffs extension;
403
+ Zed and ACP-capable Neovim clients connect through the stdio Agent Client
404
+ Protocol. **JetBrains is not implemented in this repository** — no plugin
405
+ ships from here; only detection code for a future one exists. Start an ACP
406
+ surface with:
395
407
 
396
408
  ```sh
397
409
  ur acp stdio # stdio ACP agent for editors (Zed, Neovim)
398
- ur acp serve --port 8123 [--debug] # HTTP JSON-RPC server for scripts/clients
410
+ ur acp serve --port 8123 [--debug] # HTTP JSON-RPC server for scripts/clients (not the VS Code chat transport)
399
411
  ur acp status
400
412
  ```
401
413
 
@@ -526,8 +538,9 @@ settings, generated indexes, memory, logs, and secrets out of Git.
526
538
  - `src/services/` contains runtime services for MCP, verification, memory,
527
539
  code indexing, safety policy, context manifests, model routing, background
528
540
  agents, A2A, analytics, sync, and API integration.
529
- - `extensions/vscode-ur-inline-diffs/` contains the VS Code inline diff review
530
- extension.
541
+ - `extensions/vscode-ur-inline-diffs/` contains the professional VS Code IDE
542
+ extension (chat, streaming, inline diff review, actions panel, status
543
+ card, search, and agent options) for VS Code, Cursor, and Windsurf.
531
544
  - `plugins/core/` contains first-party marketplace plugins.
532
545
  - `plugins/community/` stages contributed plugins.
533
546
  - `plugins/examples/` contains plugin templates users can copy.
package/bin/ur.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { spawn, spawnSync } from 'node:child_process'
3
- import { existsSync, readFileSync } from 'node:fs'
3
+ import { existsSync, readFileSync, writeSync } from 'node:fs'
4
4
  import { dirname, resolve } from 'node:path'
5
5
  import { fileURLToPath } from 'node:url'
6
6
 
@@ -101,15 +101,25 @@ const args =
101
101
 
102
102
  assertBunAvailable()
103
103
 
104
+ const shouldPipeChildOutput = !process.stdout.isTTY || !process.stderr.isTTY
104
105
  const child = spawn(bun, args, {
105
106
  cwd: process.cwd(),
106
107
  env: {
107
108
  ...process.env,
108
109
  ...(ollamaModel ? { OLLAMA_MODEL: ollamaModel } : {}),
109
110
  },
110
- stdio: 'inherit',
111
+ stdio: shouldPipeChildOutput ? ['inherit', 'pipe', 'pipe'] : 'inherit',
111
112
  })
112
113
 
114
+ if (shouldPipeChildOutput) {
115
+ child.stdout?.on('data', chunk => {
116
+ writeSync(1, chunk)
117
+ })
118
+ child.stderr?.on('data', chunk => {
119
+ writeSync(2, chunk)
120
+ })
121
+ }
122
+
113
123
  child.on('error', error => {
114
124
  if (error.code === 'ENOENT') {
115
125
  printBunRuntimeError(error.message)
@@ -120,7 +130,7 @@ child.on('error', error => {
120
130
  process.exit(1)
121
131
  })
122
132
 
123
- child.on('exit', (code, signal) => {
133
+ child.on('close', (code, signal) => {
124
134
  if (signal) {
125
135
  process.kill(process.pid, signal)
126
136
  return