ur-agent 1.36.1 → 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 +26 -15
- package/bin/ur.js +13 -3
- package/dist/cli.js +89 -70
- package/docs/IDE.md +183 -37
- package/documentation/index.html +2 -2
- package/extensions/vscode-ur-inline-diffs/README.md +72 -10
- package/extensions/vscode-ur-inline-diffs/out/extension.js +2333 -0
- package/extensions/vscode-ur-inline-diffs/package.json +174 -7
- package/package.json +2 -2
- package/extensions/vscode-ur-inline-diffs/extension.js +0 -383
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
|
|
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
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
|
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('
|
|
133
|
+
child.on('close', (code, signal) => {
|
|
124
134
|
if (signal) {
|
|
125
135
|
process.kill(process.pid, signal)
|
|
126
136
|
return
|