ur-agent 1.65.6 → 1.65.7
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/CHANGELOG.md +52 -0
- package/README.md +5 -4
- package/dist/cli.js +5432 -3076
- package/dist/sdk/index.cjs +189 -0
- package/dist/sdk/index.d.ts +68 -0
- package/dist/sdk/index.js +149 -0
- package/docs/VALIDATION.md +1 -1
- package/documentation/app.js +91 -0
- package/documentation/index.html +1 -1
- package/extensions/jetbrains-ur/build.gradle.kts +1 -1
- package/extensions/vscode-ur-inline-diffs/package.json +1 -1
- package/package.json +13 -2
- package/technical/01-architecture.md +146 -0
- package/technical/02-cli-reference.md +227 -0
- package/technical/03-slash-commands.md +318 -0
- package/technical/04-tools.md +119 -0
- package/technical/05-providers-and-models.md +192 -0
- package/technical/06-configuration.md +407 -0
- package/technical/07-memory-and-context.md +147 -0
- package/technical/08-skills-plugins-workflows.md +211 -0
- package/technical/09-multi-agent.md +249 -0
- package/technical/10-headless-automation-eval.md +441 -0
- package/technical/11-integrations.md +156 -0
- package/technical/12-security-sandbox-stability.md +271 -0
- package/technical/13-research.md +129 -0
- package/technical/14-sessions.md +177 -0
- package/technical/README.md +43 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
8
|
+
var __toCommonJS = (from) => {
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
10
|
+
if (entry)
|
|
11
|
+
return entry;
|
|
12
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
__moduleCache.set(from, entry);
|
|
22
|
+
return entry;
|
|
23
|
+
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
29
|
+
var __export = (target, all) => {
|
|
30
|
+
for (var name in all)
|
|
31
|
+
__defProp(target, name, {
|
|
32
|
+
get: all[name],
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/sdk/index.ts
|
|
40
|
+
var exports_sdk = {};
|
|
41
|
+
__export(exports_sdk, {
|
|
42
|
+
queryJSON: () => queryJSON,
|
|
43
|
+
query: () => query,
|
|
44
|
+
parseResultText: () => parseResultText,
|
|
45
|
+
UrClient: () => UrClient
|
|
46
|
+
});
|
|
47
|
+
module.exports = __toCommonJS(exports_sdk);
|
|
48
|
+
var import_node_child_process = require("node:child_process");
|
|
49
|
+
function pickResultText(parsed) {
|
|
50
|
+
if (parsed == null)
|
|
51
|
+
return null;
|
|
52
|
+
if (typeof parsed === "string")
|
|
53
|
+
return parsed;
|
|
54
|
+
if (Array.isArray(parsed)) {
|
|
55
|
+
for (let i = parsed.length - 1;i >= 0; i--) {
|
|
56
|
+
const found = pickResultText(parsed[i]);
|
|
57
|
+
if (found !== null)
|
|
58
|
+
return found;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (typeof parsed === "object") {
|
|
63
|
+
const obj = parsed;
|
|
64
|
+
if (typeof obj.result === "string")
|
|
65
|
+
return obj.result;
|
|
66
|
+
if (typeof obj.text === "string")
|
|
67
|
+
return obj.text;
|
|
68
|
+
if (typeof obj.content === "string")
|
|
69
|
+
return obj.content;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function pickTerminalResultText(parsed) {
|
|
74
|
+
for (let i = parsed.length - 1;i >= 0; i--) {
|
|
75
|
+
const item = parsed[i];
|
|
76
|
+
if (typeof item === "object" && item !== null && !Array.isArray(item) && item.type === "result") {
|
|
77
|
+
const found = pickResultText(item);
|
|
78
|
+
if (found !== null)
|
|
79
|
+
return found;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
function parseResultText(stdout) {
|
|
85
|
+
const trimmed = stdout.trim();
|
|
86
|
+
if (!trimmed)
|
|
87
|
+
return "";
|
|
88
|
+
try {
|
|
89
|
+
return pickResultText(JSON.parse(trimmed)) ?? trimmed;
|
|
90
|
+
} catch {
|
|
91
|
+
const parsedLines = [];
|
|
92
|
+
for (const line of trimmed.split(/\r?\n/u)) {
|
|
93
|
+
const candidate = line.trim();
|
|
94
|
+
if (!candidate)
|
|
95
|
+
continue;
|
|
96
|
+
try {
|
|
97
|
+
parsedLines.push(JSON.parse(candidate));
|
|
98
|
+
} catch {}
|
|
99
|
+
}
|
|
100
|
+
if (parsedLines.length === 0)
|
|
101
|
+
return trimmed;
|
|
102
|
+
return pickTerminalResultText(parsedLines) ?? trimmed;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function validateQueryInput(prompt, options) {
|
|
106
|
+
if (typeof prompt !== "string" || prompt.trim().length === 0) {
|
|
107
|
+
throw new TypeError("prompt must be a non-empty string");
|
|
108
|
+
}
|
|
109
|
+
if (options.maxTurns !== undefined && (!Number.isSafeInteger(options.maxTurns) || options.maxTurns <= 0)) {
|
|
110
|
+
throw new RangeError("maxTurns must be a positive safe integer");
|
|
111
|
+
}
|
|
112
|
+
if (options.timeoutMs !== undefined && (!Number.isSafeInteger(options.timeoutMs) || options.timeoutMs <= 0)) {
|
|
113
|
+
throw new RangeError("timeoutMs must be a positive safe integer");
|
|
114
|
+
}
|
|
115
|
+
if (options.outputFormat !== undefined && !["json", "text", "stream-json"].includes(options.outputFormat)) {
|
|
116
|
+
throw new TypeError('outputFormat must be "json", "text", or "stream-json"');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function buildArgs(prompt, options) {
|
|
120
|
+
const outputFormat = options.outputFormat ?? "json";
|
|
121
|
+
const args = [
|
|
122
|
+
...options.bin?.args ?? [],
|
|
123
|
+
"-p",
|
|
124
|
+
"--output-format",
|
|
125
|
+
outputFormat
|
|
126
|
+
];
|
|
127
|
+
if (outputFormat === "stream-json")
|
|
128
|
+
args.push("--verbose");
|
|
129
|
+
if (options.maxTurns !== undefined) {
|
|
130
|
+
args.push("--max-turns", String(options.maxTurns));
|
|
131
|
+
}
|
|
132
|
+
if (options.skipPermissions)
|
|
133
|
+
args.push("--dangerously-skip-permissions");
|
|
134
|
+
args.push(prompt);
|
|
135
|
+
return args;
|
|
136
|
+
}
|
|
137
|
+
async function query(prompt, options = {}) {
|
|
138
|
+
validateQueryInput(prompt, options);
|
|
139
|
+
const file = options.bin?.file ?? "ur";
|
|
140
|
+
const args = buildArgs(prompt, options);
|
|
141
|
+
const env = {
|
|
142
|
+
...process.env,
|
|
143
|
+
...options.env ?? {},
|
|
144
|
+
...options.model ? { UR_MODEL: options.model } : {}
|
|
145
|
+
};
|
|
146
|
+
return await new Promise((resolve) => {
|
|
147
|
+
import_node_child_process.execFile(file, args, { cwd: options.cwd, env, timeout: options.timeoutMs ?? 30 * 60 * 1000, maxBuffer: 64 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
148
|
+
const raw = stdout ?? "";
|
|
149
|
+
const exitCode = error && typeof error.code === "number" ? error.code : error ? 1 : 0;
|
|
150
|
+
resolve({
|
|
151
|
+
ok: exitCode === 0,
|
|
152
|
+
text: parseResultText(raw),
|
|
153
|
+
raw,
|
|
154
|
+
exitCode,
|
|
155
|
+
stderr: stderr ?? ""
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async function queryJSON(prompt, options = {}) {
|
|
161
|
+
const { ok, text } = await query(prompt, options);
|
|
162
|
+
if (!ok)
|
|
163
|
+
return null;
|
|
164
|
+
try {
|
|
165
|
+
return JSON.parse(text);
|
|
166
|
+
} catch {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
class UrClient {
|
|
172
|
+
defaults;
|
|
173
|
+
constructor(defaults = {}) {
|
|
174
|
+
this.defaults = defaults;
|
|
175
|
+
}
|
|
176
|
+
query(prompt, options = {}) {
|
|
177
|
+
return query(prompt, this.mergeOptions(options));
|
|
178
|
+
}
|
|
179
|
+
queryJSON(prompt, options = {}) {
|
|
180
|
+
return queryJSON(prompt, this.mergeOptions(options));
|
|
181
|
+
}
|
|
182
|
+
mergeOptions(options) {
|
|
183
|
+
return {
|
|
184
|
+
...this.defaults,
|
|
185
|
+
...options,
|
|
186
|
+
env: this.defaults.env || options.env ? { ...this.defaults.env ?? {}, ...options.env ?? {} } : undefined
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UR programmatic SDK.
|
|
3
|
+
*
|
|
4
|
+
* A tiny, dependency-free wrapper around UR's headless mode (`ur -p
|
|
5
|
+
* --output-format json`) so other programs can drive the agent without parsing
|
|
6
|
+
* the TUI. It shells out to the installed `ur` binary, so it inherits the same
|
|
7
|
+
* permission model, MCP config, and local Ollama routing as the interactive CLI.
|
|
8
|
+
*
|
|
9
|
+
* This is the subprocess counterpart to the loopback A2A server: A2A is for
|
|
10
|
+
* agent-to-agent task hand-off over HTTP; this SDK is for local programmatic
|
|
11
|
+
* calls that launch an installed `ur` process.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { query } from 'ur-agent/sdk'
|
|
15
|
+
* const { text } = await query('Summarize the README in one line')
|
|
16
|
+
* console.log(text)
|
|
17
|
+
*/
|
|
18
|
+
export type OutputFormat = 'json' | 'text' | 'stream-json';
|
|
19
|
+
export type QueryOptions = {
|
|
20
|
+
/** Working directory for the run. Defaults to process.cwd(). */
|
|
21
|
+
cwd?: string;
|
|
22
|
+
/** Force a specific Ollama model (sets UR_MODEL for the child). */
|
|
23
|
+
model?: string;
|
|
24
|
+
/** Cap agentic turns. */
|
|
25
|
+
maxTurns?: number;
|
|
26
|
+
/** Output format passed to `ur -p`. Defaults to 'json'. */
|
|
27
|
+
outputFormat?: OutputFormat;
|
|
28
|
+
/** Pass --dangerously-skip-permissions (sandboxes/CI only). */
|
|
29
|
+
skipPermissions?: boolean;
|
|
30
|
+
/** Kill the run after this many ms. Defaults to 30 minutes. */
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
/** Override the binary. Defaults to 'ur' on PATH. */
|
|
33
|
+
bin?: {
|
|
34
|
+
file: string;
|
|
35
|
+
args?: string[];
|
|
36
|
+
};
|
|
37
|
+
/** Extra environment variables for the child process. */
|
|
38
|
+
env?: Record<string, string>;
|
|
39
|
+
};
|
|
40
|
+
export type QueryResult = {
|
|
41
|
+
ok: boolean;
|
|
42
|
+
/** Best-effort final assistant text. */
|
|
43
|
+
text: string;
|
|
44
|
+
/** Raw stdout from the child. */
|
|
45
|
+
raw: string;
|
|
46
|
+
exitCode: number;
|
|
47
|
+
stderr: string;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Extract the final text from JSON, text, or stream-json (NDJSON) output.
|
|
51
|
+
*
|
|
52
|
+
* For stream-json, the terminal `result` envelope wins even when lifecycle
|
|
53
|
+
* events follow it. If the input is not structured output, the original
|
|
54
|
+
* trimmed text is returned.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseResultText(stdout: string): string;
|
|
57
|
+
/** Run a single headless UR query and resolve with its result. */
|
|
58
|
+
export declare function query(prompt: string, options?: QueryOptions): Promise<QueryResult>;
|
|
59
|
+
/** Run a query expecting JSON content and parse it (returns null on failure). */
|
|
60
|
+
export declare function queryJSON<T = unknown>(prompt: string, options?: QueryOptions): Promise<T | null>;
|
|
61
|
+
/** A reusable client that applies shared defaults to every query. */
|
|
62
|
+
export declare class UrClient {
|
|
63
|
+
private readonly defaults;
|
|
64
|
+
constructor(defaults?: QueryOptions);
|
|
65
|
+
query(prompt: string, options?: QueryOptions): Promise<QueryResult>;
|
|
66
|
+
queryJSON<T = unknown>(prompt: string, options?: QueryOptions): Promise<T | null>;
|
|
67
|
+
private mergeOptions;
|
|
68
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// src/sdk/index.ts
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
function pickResultText(parsed) {
|
|
4
|
+
if (parsed == null)
|
|
5
|
+
return null;
|
|
6
|
+
if (typeof parsed === "string")
|
|
7
|
+
return parsed;
|
|
8
|
+
if (Array.isArray(parsed)) {
|
|
9
|
+
for (let i = parsed.length - 1;i >= 0; i--) {
|
|
10
|
+
const found = pickResultText(parsed[i]);
|
|
11
|
+
if (found !== null)
|
|
12
|
+
return found;
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (typeof parsed === "object") {
|
|
17
|
+
const obj = parsed;
|
|
18
|
+
if (typeof obj.result === "string")
|
|
19
|
+
return obj.result;
|
|
20
|
+
if (typeof obj.text === "string")
|
|
21
|
+
return obj.text;
|
|
22
|
+
if (typeof obj.content === "string")
|
|
23
|
+
return obj.content;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
function pickTerminalResultText(parsed) {
|
|
28
|
+
for (let i = parsed.length - 1;i >= 0; i--) {
|
|
29
|
+
const item = parsed[i];
|
|
30
|
+
if (typeof item === "object" && item !== null && !Array.isArray(item) && item.type === "result") {
|
|
31
|
+
const found = pickResultText(item);
|
|
32
|
+
if (found !== null)
|
|
33
|
+
return found;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
function parseResultText(stdout) {
|
|
39
|
+
const trimmed = stdout.trim();
|
|
40
|
+
if (!trimmed)
|
|
41
|
+
return "";
|
|
42
|
+
try {
|
|
43
|
+
return pickResultText(JSON.parse(trimmed)) ?? trimmed;
|
|
44
|
+
} catch {
|
|
45
|
+
const parsedLines = [];
|
|
46
|
+
for (const line of trimmed.split(/\r?\n/u)) {
|
|
47
|
+
const candidate = line.trim();
|
|
48
|
+
if (!candidate)
|
|
49
|
+
continue;
|
|
50
|
+
try {
|
|
51
|
+
parsedLines.push(JSON.parse(candidate));
|
|
52
|
+
} catch {}
|
|
53
|
+
}
|
|
54
|
+
if (parsedLines.length === 0)
|
|
55
|
+
return trimmed;
|
|
56
|
+
return pickTerminalResultText(parsedLines) ?? trimmed;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function validateQueryInput(prompt, options) {
|
|
60
|
+
if (typeof prompt !== "string" || prompt.trim().length === 0) {
|
|
61
|
+
throw new TypeError("prompt must be a non-empty string");
|
|
62
|
+
}
|
|
63
|
+
if (options.maxTurns !== undefined && (!Number.isSafeInteger(options.maxTurns) || options.maxTurns <= 0)) {
|
|
64
|
+
throw new RangeError("maxTurns must be a positive safe integer");
|
|
65
|
+
}
|
|
66
|
+
if (options.timeoutMs !== undefined && (!Number.isSafeInteger(options.timeoutMs) || options.timeoutMs <= 0)) {
|
|
67
|
+
throw new RangeError("timeoutMs must be a positive safe integer");
|
|
68
|
+
}
|
|
69
|
+
if (options.outputFormat !== undefined && !["json", "text", "stream-json"].includes(options.outputFormat)) {
|
|
70
|
+
throw new TypeError('outputFormat must be "json", "text", or "stream-json"');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function buildArgs(prompt, options) {
|
|
74
|
+
const outputFormat = options.outputFormat ?? "json";
|
|
75
|
+
const args = [
|
|
76
|
+
...options.bin?.args ?? [],
|
|
77
|
+
"-p",
|
|
78
|
+
"--output-format",
|
|
79
|
+
outputFormat
|
|
80
|
+
];
|
|
81
|
+
if (outputFormat === "stream-json")
|
|
82
|
+
args.push("--verbose");
|
|
83
|
+
if (options.maxTurns !== undefined) {
|
|
84
|
+
args.push("--max-turns", String(options.maxTurns));
|
|
85
|
+
}
|
|
86
|
+
if (options.skipPermissions)
|
|
87
|
+
args.push("--dangerously-skip-permissions");
|
|
88
|
+
args.push(prompt);
|
|
89
|
+
return args;
|
|
90
|
+
}
|
|
91
|
+
async function query(prompt, options = {}) {
|
|
92
|
+
validateQueryInput(prompt, options);
|
|
93
|
+
const file = options.bin?.file ?? "ur";
|
|
94
|
+
const args = buildArgs(prompt, options);
|
|
95
|
+
const env = {
|
|
96
|
+
...process.env,
|
|
97
|
+
...options.env ?? {},
|
|
98
|
+
...options.model ? { UR_MODEL: options.model } : {}
|
|
99
|
+
};
|
|
100
|
+
return await new Promise((resolve) => {
|
|
101
|
+
execFile(file, args, { cwd: options.cwd, env, timeout: options.timeoutMs ?? 30 * 60 * 1000, maxBuffer: 64 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
102
|
+
const raw = stdout ?? "";
|
|
103
|
+
const exitCode = error && typeof error.code === "number" ? error.code : error ? 1 : 0;
|
|
104
|
+
resolve({
|
|
105
|
+
ok: exitCode === 0,
|
|
106
|
+
text: parseResultText(raw),
|
|
107
|
+
raw,
|
|
108
|
+
exitCode,
|
|
109
|
+
stderr: stderr ?? ""
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async function queryJSON(prompt, options = {}) {
|
|
115
|
+
const { ok, text } = await query(prompt, options);
|
|
116
|
+
if (!ok)
|
|
117
|
+
return null;
|
|
118
|
+
try {
|
|
119
|
+
return JSON.parse(text);
|
|
120
|
+
} catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
class UrClient {
|
|
126
|
+
defaults;
|
|
127
|
+
constructor(defaults = {}) {
|
|
128
|
+
this.defaults = defaults;
|
|
129
|
+
}
|
|
130
|
+
query(prompt, options = {}) {
|
|
131
|
+
return query(prompt, this.mergeOptions(options));
|
|
132
|
+
}
|
|
133
|
+
queryJSON(prompt, options = {}) {
|
|
134
|
+
return queryJSON(prompt, this.mergeOptions(options));
|
|
135
|
+
}
|
|
136
|
+
mergeOptions(options) {
|
|
137
|
+
return {
|
|
138
|
+
...this.defaults,
|
|
139
|
+
...options,
|
|
140
|
+
env: this.defaults.env || options.env ? { ...this.defaults.env ?? {}, ...options.env ?? {} } : undefined
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export {
|
|
145
|
+
queryJSON,
|
|
146
|
+
query,
|
|
147
|
+
parseResultText,
|
|
148
|
+
UrClient
|
|
149
|
+
};
|
package/docs/VALIDATION.md
CHANGED
package/documentation/app.js
CHANGED
|
@@ -480,6 +480,97 @@ const commands = [
|
|
|
480
480
|
summary: 'Check npm for UR-Nexus updates. Interactive sessions also show an update-available notice when a newer package is published.',
|
|
481
481
|
examples: ['ur update', 'ur upgrade'],
|
|
482
482
|
},
|
|
483
|
+
{
|
|
484
|
+
name: 'agent-ci',
|
|
485
|
+
category: 'Verification',
|
|
486
|
+
aliases: [],
|
|
487
|
+
summary: 'Validate and run policy-gated agents in isolated CI worktrees, producing reviewable artifacts instead of directly mutating the checkout.',
|
|
488
|
+
examples: ['ur agent-ci init default', 'ur agent-ci validate default', 'ur agent-ci run default --dry-run --json'],
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
name: 'computer',
|
|
492
|
+
category: 'Desktop',
|
|
493
|
+
aliases: ['desktop-control'],
|
|
494
|
+
summary: 'Capture a desktop screenshot or perform a bounded click/type action after explicit --yes confirmation.',
|
|
495
|
+
examples: ['ur computer screenshot', 'ur computer screenshot ./desktop.png', 'ur computer click 640 480 --yes'],
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
name: 'desktop-qa',
|
|
499
|
+
category: 'Verification',
|
|
500
|
+
aliases: ['qa-desktop'],
|
|
501
|
+
summary: 'Validate and run bounded Electron desktop fixtures with teardown, masked screenshots, and reviewable evidence.',
|
|
502
|
+
examples: ['ur desktop-qa list', 'ur desktop-qa validate', 'ur desktop-qa run .ur/desktop-qa/fixtures/smoke.json --json'],
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
name: 'grade-trajectory',
|
|
506
|
+
category: 'Verification',
|
|
507
|
+
aliases: ['grade'],
|
|
508
|
+
summary: 'Grade a transcript for tool choice, verification, safety, and execution efficiency, with an optional fail threshold.',
|
|
509
|
+
examples: ['ur grade-trajectory --file run.jsonl', 'ur grade-trajectory --file run.jsonl --min-score 70 --json'],
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
name: 'import-session',
|
|
513
|
+
category: 'Sessions',
|
|
514
|
+
aliases: [],
|
|
515
|
+
summary: 'Validate and import a session transcript exported from another machine.',
|
|
516
|
+
examples: ['ur import-session ./session.jsonl'],
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
name: 'learn',
|
|
520
|
+
category: 'Automation',
|
|
521
|
+
aliases: [],
|
|
522
|
+
summary: 'Mine execution outcomes and promote only reviewed, evidence-backed workflow playbooks.',
|
|
523
|
+
examples: ['ur learn stats', 'ur learn playbooks mine --min-runs 3 --dry-run', 'ur learn playbooks list --status approved'],
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
name: 'memory-integrity',
|
|
527
|
+
category: 'Knowledge',
|
|
528
|
+
aliases: ['mem-verify'],
|
|
529
|
+
summary: 'Baseline, verify, or quarantine file-backed memory stores when integrity checks fail.',
|
|
530
|
+
examples: ['ur memory-integrity verify', 'ur memory-integrity baseline --store all', 'ur memory-integrity verify --json'],
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
name: 'memory-suggest',
|
|
534
|
+
category: 'Knowledge',
|
|
535
|
+
aliases: ['suggest-memory'],
|
|
536
|
+
summary: 'Propose non-secret durable facts from recent user turns without silently writing them to memory.',
|
|
537
|
+
examples: ['ur memory-suggest --turns 12 --min-confidence 0.8'],
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
name: 'permission-profile',
|
|
541
|
+
category: 'Ops',
|
|
542
|
+
aliases: ['profile'],
|
|
543
|
+
summary: 'List named permission profiles or switch and clear the active profile.',
|
|
544
|
+
examples: ['ur permission-profile list', 'ur permission-profile use reviewing', 'ur permission-profile clear'],
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
name: 'selftest',
|
|
548
|
+
category: 'Verification',
|
|
549
|
+
aliases: ['drills'],
|
|
550
|
+
summary: 'Run observable end-to-end drills against the shipped binary and list manual prompts for checks that need a live model.',
|
|
551
|
+
examples: ['ur selftest list', 'ur selftest run --json'],
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
name: 'sources',
|
|
555
|
+
category: 'Security',
|
|
556
|
+
aliases: [],
|
|
557
|
+
summary: 'List untrusted fetched sources and check whether a text span came from an injection-flagged source.',
|
|
558
|
+
examples: ['ur sources', 'ur sources --flagged --json', 'ur sources --check "ignore previous instructions"'],
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
name: 'speak',
|
|
562
|
+
category: 'Desktop',
|
|
563
|
+
aliases: ['say'],
|
|
564
|
+
summary: 'Read supplied text aloud through the supported local system speech synthesiser.',
|
|
565
|
+
examples: ['ur speak "Build complete"', 'ur speak --voice Alex --rate 190 "Tests passed"'],
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
name: 'workspace',
|
|
569
|
+
category: 'Agent Platform',
|
|
570
|
+
aliases: [],
|
|
571
|
+
summary: 'Coordinate a dependency-aware task graph across repository worktrees with validation, verification, PR, and rollback plans.',
|
|
572
|
+
examples: ['ur workspace init', 'ur workspace validate', 'ur workspace run --max-concurrency 3 --dry-run', 'ur workspace pr-plan'],
|
|
573
|
+
},
|
|
483
574
|
{
|
|
484
575
|
name: 'workflow',
|
|
485
576
|
category: 'Agent Platform',
|
package/documentation/index.html
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
<main id="content" class="content">
|
|
46
46
|
<header class="topbar">
|
|
47
47
|
<div>
|
|
48
|
-
<p class="eyebrow">Version 1.65.
|
|
48
|
+
<p class="eyebrow">Version 1.65.7</p>
|
|
49
49
|
<h1>UR-Nexus Documentation</h1>
|
|
50
50
|
<p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
|
|
51
51
|
</div>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "ur-inline-diffs",
|
|
3
3
|
"displayName": "UR Inline Diffs",
|
|
4
4
|
"description": "Review, apply, and reject UR inline diff bundles from .ur/ide/diffs inside VS Code.",
|
|
5
|
-
"version": "1.65.
|
|
5
|
+
"version": "1.65.7",
|
|
6
6
|
"publisher": "ur-nexus",
|
|
7
7
|
"engines": {
|
|
8
8
|
"vscode": "^1.92.0"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ur-agent",
|
|
3
|
-
"version": "1.65.
|
|
3
|
+
"version": "1.65.7",
|
|
4
4
|
"description": "UR-Nexus — autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "bun@1.3.14",
|
|
@@ -27,10 +27,21 @@
|
|
|
27
27
|
"bin": {
|
|
28
28
|
"ur": "bin/ur.js"
|
|
29
29
|
},
|
|
30
|
+
"exports": {
|
|
31
|
+
"./sdk": {
|
|
32
|
+
"types": "./dist/sdk/index.d.ts",
|
|
33
|
+
"import": "./dist/sdk/index.js",
|
|
34
|
+
"require": "./dist/sdk/index.cjs",
|
|
35
|
+
"default": "./dist/sdk/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json",
|
|
38
|
+
"./dist/*": "./dist/*"
|
|
39
|
+
},
|
|
30
40
|
"files": [
|
|
31
41
|
"bin",
|
|
32
42
|
"dist",
|
|
33
43
|
"docs",
|
|
44
|
+
"technical",
|
|
34
45
|
"documentation",
|
|
35
46
|
"extensions",
|
|
36
47
|
"examples",
|
|
@@ -68,7 +79,7 @@
|
|
|
68
79
|
"safety:matrix": "bun scripts/generate-safety-matrix.mjs",
|
|
69
80
|
"provider:smoke": "bun scripts/provider-smoke.mjs",
|
|
70
81
|
"package:check": "node scripts/package-check.mjs",
|
|
71
|
-
"prepack": "bun run release:check"
|
|
82
|
+
"prepack": "bun run build && bun run release:check"
|
|
72
83
|
},
|
|
73
84
|
"overrides": {
|
|
74
85
|
"@hono/node-server": "2.0.11",
|