ur-agent 1.36.0 → 1.37.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.
package/README.md CHANGED
@@ -363,11 +363,17 @@ UR-AGENT uses that hook output instead of the built-in bar.
363
363
 
364
364
  ### IDE Integration
365
365
 
366
+ The professional UR IDE integration is the **UR Inline Diffs** VS Code
367
+ extension: a chat panel, inline diff review, an actions panel, an agent
368
+ status card, a searchable command palette, and an agent options panel for VS
369
+ Code, Cursor, and Windsurf. It is bundled inside this repository and
370
+ packaged as a local VSIX when installed from UR-AGENT; the public install
371
+ path does not depend on an unpublished marketplace extension ID. The
372
+ extension never talks to a model provider or network service directly —
373
+ every AI request goes through your local `ur` CLI, same as in a terminal.
374
+
366
375
  `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.
376
+ show agent diffs without scraping terminal output:
371
377
 
372
378
  ```sh
373
379
  ur ide diff capture --title "Parser fix"
@@ -375,27 +381,31 @@ ur ide diff list
375
381
  ur ide diff show <id>
376
382
  ```
377
383
 
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**.
384
+ In the **Inline Diffs** / **Actions** views you can preview a bundle,
385
+ **Apply** it (a confirmed `git apply`, recorded through `ur ide diff
386
+ approve` never a silent write or an out-of-vocabulary status), **Reject**
387
+ it, or run **UR: Agent Status**. Chat, editor actions (Explain/Fix/Generate
388
+ Tests), diff review, and the verifier all route through the same CLI
389
+ contract — see the [IDE Guide](docs/IDE.md) for the full feature list.
382
390
 
383
391
  Inspect and configure integration per editor:
384
392
 
385
393
  ```sh
386
- ur ide status # workspace, ACP server, provider/model, plugin count
394
+ ur ide status # workspace, ACP server, provider/model, sandbox/verifier mode, plugin count
387
395
  ur ide doctor # pass/warn/fail checks; reports missing config clearly
388
396
  ur ide config zed # print the .zed/settings.json ACP block
389
397
  ur ide config vscode # VS Code / Cursor / Windsurf setup
390
398
  ```
391
399
 
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:
400
+ VS Code, Cursor, and Windsurf connect through the UR Inline Diffs extension;
401
+ Zed and ACP-capable Neovim clients connect through the stdio Agent Client
402
+ Protocol. **JetBrains is not implemented in this repository** — no plugin
403
+ ships from here; only detection code for a future one exists. Start an ACP
404
+ surface with:
395
405
 
396
406
  ```sh
397
407
  ur acp stdio # stdio ACP agent for editors (Zed, Neovim)
398
- ur acp serve --port 8123 [--debug] # HTTP JSON-RPC server for scripts/clients
408
+ ur acp serve --port 8123 [--debug] # HTTP JSON-RPC server for scripts/clients (not the VS Code chat transport)
399
409
  ur acp status
400
410
  ```
401
411
 
@@ -526,8 +536,9 @@ settings, generated indexes, memory, logs, and secrets out of Git.
526
536
  - `src/services/` contains runtime services for MCP, verification, memory,
527
537
  code indexing, safety policy, context manifests, model routing, background
528
538
  agents, A2A, analytics, sync, and API integration.
529
- - `extensions/vscode-ur-inline-diffs/` contains the VS Code inline diff review
530
- extension.
539
+ - `extensions/vscode-ur-inline-diffs/` contains the professional VS Code IDE
540
+ extension (chat, streaming, inline diff review, actions panel, status
541
+ card, search, and agent options) for VS Code, Cursor, and Windsurf.
531
542
  - `plugins/core/` contains first-party marketplace plugins.
532
543
  - `plugins/community/` stages contributed plugins.
533
544
  - `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