ur-agent 1.81.0 → 1.81.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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.81.1
4
+
5
+ - Preflighted UR task tracking in `/reverse-skills:start` and every bundled
6
+ reverse-security skill before mutating, multi-outcome workflows. The plugin
7
+ now creates and advances an actionable task board instead of first tripping
8
+ `TaskListRequired`, while keeping `tasks.requireBeforeChanges` enabled.
9
+ - Made verifier and command-registry tests independent of globally installed
10
+ plugins, so release checks remain reproducible when marketplace validators
11
+ and namespaced commands are enabled on the developer machine.
12
+
3
13
  ## 1.81.0
4
14
 
5
15
  - Added `/mode redteam`, a warning-gated, session-only UR policy mode for
package/dist/cli.js CHANGED
@@ -107788,7 +107788,7 @@ var init_auth = __esm(() => {
107788
107788
 
107789
107789
  // src/utils/userAgent.ts
107790
107790
  function getURCodeUserAgent() {
107791
- return `ur/${"1.81.0"}`;
107791
+ return `ur/${"1.81.1"}`;
107792
107792
  }
107793
107793
 
107794
107794
  // src/utils/workloadContext.ts
@@ -107810,7 +107810,7 @@ function getUserAgent() {
107810
107810
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
107811
107811
  const workload = getWorkload();
107812
107812
  const workloadSuffix = workload ? `, workload/${workload}` : "";
107813
- return `ur-cli/${"1.81.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107813
+ return `ur-cli/${"1.81.1"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107814
107814
  }
107815
107815
  function getMCPUserAgent() {
107816
107816
  const parts = [];
@@ -107824,7 +107824,7 @@ function getMCPUserAgent() {
107824
107824
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
107825
107825
  }
107826
107826
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
107827
- return `ur/${"1.81.0"}${suffix}`;
107827
+ return `ur/${"1.81.1"}${suffix}`;
107828
107828
  }
107829
107829
  function getWebFetchUserAgent() {
107830
107830
  return `UR-User (${getURCodeUserAgent()})`;
@@ -107962,7 +107962,7 @@ var init_user = __esm(() => {
107962
107962
  deviceId,
107963
107963
  sessionId: getSessionId(),
107964
107964
  email: getEmail(),
107965
- appVersion: "1.81.0",
107965
+ appVersion: "1.81.1",
107966
107966
  platform: getHostPlatformForAnalytics(),
107967
107967
  organizationUuid,
107968
107968
  accountUuid,
@@ -115849,7 +115849,7 @@ var init_metadata = __esm(() => {
115849
115849
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
115850
115850
  WHITESPACE_REGEX = /\s+/;
115851
115851
  getVersionBase = memoize_default(() => {
115852
- const match = "1.81.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115852
+ const match = "1.81.1".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115853
115853
  return match ? match[0] : undefined;
115854
115854
  });
115855
115855
  buildEnvContext = memoize_default(async () => {
@@ -115889,7 +115889,7 @@ var init_metadata = __esm(() => {
115889
115889
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
115890
115890
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
115891
115891
  isURAiAuth: isURAISubscriber(),
115892
- version: "1.81.0",
115892
+ version: "1.81.1",
115893
115893
  versionBase: getVersionBase(),
115894
115894
  buildTime: "",
115895
115895
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -116559,7 +116559,7 @@ function initialize1PEventLogging() {
116559
116559
  const platform2 = getPlatform();
116560
116560
  const attributes = {
116561
116561
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
116562
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.81.0"
116562
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.81.1"
116563
116563
  };
116564
116564
  if (platform2 === "wsl") {
116565
116565
  const wslVersion = getWslVersion();
@@ -116587,7 +116587,7 @@ function initialize1PEventLogging() {
116587
116587
  })
116588
116588
  ]
116589
116589
  });
116590
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.81.0");
116590
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.81.1");
116591
116591
  }
116592
116592
  async function reinitialize1PEventLoggingIfConfigChanged() {
116593
116593
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -126553,7 +126553,7 @@ function formatA2AAgentCard(options = {}, pretty = true) {
126553
126553
  function formatA2AV1AgentCard(options = {}, pretty = true) {
126554
126554
  return JSON.stringify(buildA2AV1AgentCard(options), null, pretty ? 2 : 0);
126555
126555
  }
126556
- var urVersion = "1.81.0", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126556
+ var urVersion = "1.81.1", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126557
126557
  var init_trends = __esm(() => {
126558
126558
  init_a2aCardSignature();
126559
126559
  coverage = [
@@ -129443,7 +129443,7 @@ function getAttributionHeader(fingerprint) {
129443
129443
  if (!isAttributionHeaderEnabled()) {
129444
129444
  return "";
129445
129445
  }
129446
- const version2 = `${"1.81.0"}.${fingerprint}`;
129446
+ const version2 = `${"1.81.1"}.${fingerprint}`;
129447
129447
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
129448
129448
  const cch = "";
129449
129449
  const workload = getWorkload();
@@ -184643,7 +184643,7 @@ var init_projectSafety = __esm(() => {
184643
184643
  function getInstruments() {
184644
184644
  if (instruments)
184645
184645
  return instruments;
184646
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.81.0");
184646
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.81.1");
184647
184647
  instruments = {
184648
184648
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
184649
184649
  description: "GenAI operation duration.",
@@ -184741,7 +184741,7 @@ function genAiAgentAttributes() {
184741
184741
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
184742
184742
  "gen_ai.provider.name": "ur",
184743
184743
  "gen_ai.agent.name": "UR-Nexus",
184744
- "gen_ai.agent.version": "1.81.0"
184744
+ "gen_ai.agent.version": "1.81.1"
184745
184745
  };
184746
184746
  }
184747
184747
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -184762,7 +184762,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
184762
184762
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
184763
184763
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
184764
184764
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
184765
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184765
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.1").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184766
184766
  }
184767
184767
  function endGenAiWorkflowSpan(span, options2 = {}) {
184768
184768
  try {
@@ -184800,7 +184800,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
184800
184800
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
184801
184801
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
184802
184802
  }
184803
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184803
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.1").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184804
184804
  }
184805
184805
  function endGenAiMemorySpan(span, options2 = {}) {
184806
184806
  try {
@@ -187876,7 +187876,7 @@ class Verifier {
187876
187876
  this.maxRejections = options2.maxRejectionsPerTurn ?? DEFAULT_MAX_REJECTIONS_PER_TURN;
187877
187877
  this.loops = new LoopDetector(options2.repeatThreshold);
187878
187878
  this.configPromise = loadVerifyConfig(options2.cwd);
187879
- this.pluginValidatorsPromise = loadPluginValidators();
187879
+ this.pluginValidatorsPromise = options2.pluginValidators === undefined ? loadPluginValidators() : Promise.resolve(options2.pluginValidators);
187880
187880
  this.mode = resolveMode(options2.mode);
187881
187881
  this.askBeforeGatesOverride = options2.askBeforeGates;
187882
187882
  this.getActionableTasks = options2.getActionableTasks ?? (async () => {
@@ -278515,7 +278515,7 @@ function getTelemetryAttributes() {
278515
278515
  attributes["session.id"] = sessionId;
278516
278516
  }
278517
278517
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
278518
- attributes["app.version"] = "1.81.0";
278518
+ attributes["app.version"] = "1.81.1";
278519
278519
  }
278520
278520
  const oauthAccount = getOauthAccountInfo();
278521
278521
  if (oauthAccount) {
@@ -319919,7 +319919,7 @@ function getInstallationEnv() {
319919
319919
  return;
319920
319920
  }
319921
319921
  function getURCodeVersion() {
319922
- return "1.81.0";
319922
+ return "1.81.1";
319923
319923
  }
319924
319924
  async function getInstalledVSCodeExtensionVersion(command) {
319925
319925
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -327289,7 +327289,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
327289
327289
  const client2 = new Client({
327290
327290
  name: "ur",
327291
327291
  title: "UR",
327292
- version: "1.81.0",
327292
+ version: "1.81.1",
327293
327293
  description: "UR-Nexus autonomous engineering workflow engine",
327294
327294
  websiteUrl: PRODUCT_URL
327295
327295
  }, {
@@ -327650,7 +327650,7 @@ var init_client5 = __esm(() => {
327650
327650
  const client2 = new Client({
327651
327651
  name: "ur",
327652
327652
  title: "UR",
327653
- version: "1.81.0",
327653
+ version: "1.81.1",
327654
327654
  description: "UR-Nexus autonomous engineering workflow engine",
327655
327655
  websiteUrl: PRODUCT_URL
327656
327656
  }, {
@@ -340423,7 +340423,7 @@ async function createRuntime() {
340423
340423
  bootstrapTelemetry();
340424
340424
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
340425
340425
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
340426
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.81.0"
340426
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.81.1"
340427
340427
  }));
340428
340428
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
340429
340429
  resource,
@@ -340456,11 +340456,11 @@ async function createRuntime() {
340456
340456
  setMeterProvider(meterProvider);
340457
340457
  setLoggerProvider(loggerProvider);
340458
340458
  if (meterProvider) {
340459
- const meter = meterProvider.getMeter("ur-agent", "1.81.0");
340459
+ const meter = meterProvider.getMeter("ur-agent", "1.81.1");
340460
340460
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
340461
340461
  }
340462
340462
  if (loggerProvider) {
340463
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.81.0"));
340463
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.81.1"));
340464
340464
  }
340465
340465
  if (!cleanupRegistered3) {
340466
340466
  cleanupRegistered3 = true;
@@ -341122,9 +341122,9 @@ async function assertMinVersion() {
341122
341122
  if (false) {}
341123
341123
  try {
341124
341124
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
341125
- if (versionConfig.minVersion && lt("1.81.0", versionConfig.minVersion)) {
341125
+ if (versionConfig.minVersion && lt("1.81.1", versionConfig.minVersion)) {
341126
341126
  console.error(`
341127
- It looks like your version of UR (${"1.81.0"}) needs an update.
341127
+ It looks like your version of UR (${"1.81.1"}) needs an update.
341128
341128
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
341129
341129
 
341130
341130
  To update, please run:
@@ -341340,7 +341340,7 @@ async function installGlobalPackage(specificVersion) {
341340
341340
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
341341
341341
  logEvent("tengu_auto_updater_lock_contention", {
341342
341342
  pid: process.pid,
341343
- currentVersion: "1.81.0"
341343
+ currentVersion: "1.81.1"
341344
341344
  });
341345
341345
  return "in_progress";
341346
341346
  }
@@ -341349,7 +341349,7 @@ async function installGlobalPackage(specificVersion) {
341349
341349
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
341350
341350
  logError2(new Error("Windows NPM detected in WSL environment"));
341351
341351
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
341352
- currentVersion: "1.81.0"
341352
+ currentVersion: "1.81.1"
341353
341353
  });
341354
341354
  console.error(`
341355
341355
  Error: Windows NPM detected in WSL
@@ -341884,7 +341884,7 @@ function detectLinuxGlobPatternWarnings() {
341884
341884
  }
341885
341885
  async function getDoctorDiagnostic() {
341886
341886
  const installationType = await getCurrentInstallationType();
341887
- const version2 = typeof MACRO !== "undefined" ? "1.81.0" : "unknown";
341887
+ const version2 = typeof MACRO !== "undefined" ? "1.81.1" : "unknown";
341888
341888
  const installationPath = await getInstallationPath();
341889
341889
  const invokedBinary = getInvokedBinary();
341890
341890
  const multipleInstallations = await detectMultipleInstallations();
@@ -342819,8 +342819,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342819
342819
  const maxVersion = await getMaxVersion();
342820
342820
  if (maxVersion && gt(version2, maxVersion)) {
342821
342821
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
342822
- if (gte("1.81.0", maxVersion)) {
342823
- logForDebugging(`Native installer: current version ${"1.81.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
342822
+ if (gte("1.81.1", maxVersion)) {
342823
+ logForDebugging(`Native installer: current version ${"1.81.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
342824
342824
  logEvent("tengu_native_update_skipped_max_version", {
342825
342825
  latency_ms: Date.now() - startTime,
342826
342826
  max_version: maxVersion,
@@ -342831,7 +342831,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342831
342831
  version2 = maxVersion;
342832
342832
  }
342833
342833
  }
342834
- if (!forceReinstall && version2 === "1.81.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342834
+ if (!forceReinstall && version2 === "1.81.1" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342835
342835
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
342836
342836
  logEvent("tengu_native_update_complete", {
342837
342837
  latency_ms: Date.now() - startTime,
@@ -413507,7 +413507,7 @@ function isAnyTracingEnabled() {
413507
413507
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
413508
413508
  }
413509
413509
  function getTracer() {
413510
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.81.0");
413510
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.81.1");
413511
413511
  }
413512
413512
  function createSpanAttributes(spanType, customAttributes = {}) {
413513
413513
  const baseAttributes = getTelemetryAttributes();
@@ -443655,7 +443655,7 @@ function Feedback({
443655
443655
  platform: env2.platform,
443656
443656
  gitRepo: envInfo.isGit,
443657
443657
  terminal: env2.terminal,
443658
- version: "1.81.0",
443658
+ version: "1.81.1",
443659
443659
  transcript: normalizeMessagesForAPI(messages),
443660
443660
  errors: sanitizedErrors,
443661
443661
  lastApiRequest: getLastAPIRequest(),
@@ -443847,7 +443847,7 @@ function Feedback({
443847
443847
  ", ",
443848
443848
  env2.terminal,
443849
443849
  ", v",
443850
- "1.81.0"
443850
+ "1.81.1"
443851
443851
  ]
443852
443852
  }, undefined, true, undefined, this)
443853
443853
  ]
@@ -443953,7 +443953,7 @@ ${sanitizedDescription}
443953
443953
  ` + `**Environment Info**
443954
443954
  ` + `- Platform: ${env2.platform}
443955
443955
  ` + `- Terminal: ${env2.terminal}
443956
- ` + `- Version: ${"1.81.0"}
443956
+ ` + `- Version: ${"1.81.1"}
443957
443957
  ` + `- Feedback ID: ${feedbackId}
443958
443958
  ` + `
443959
443959
  **Errors**
@@ -447063,7 +447063,7 @@ function buildPrimarySection() {
447063
447063
  }, undefined, false, undefined, this);
447064
447064
  return [{
447065
447065
  label: "Version",
447066
- value: "1.81.0"
447066
+ value: "1.81.1"
447067
447067
  }, {
447068
447068
  label: "Session name",
447069
447069
  value: nameValue
@@ -450445,7 +450445,7 @@ function Config({
450445
450445
  }
450446
450446
  }, undefined, false, undefined, this)
450447
450447
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
450448
- currentVersion: "1.81.0",
450448
+ currentVersion: "1.81.1",
450449
450449
  onChoice: (choice) => {
450450
450450
  setShowSubmenu(null);
450451
450451
  setTabsHidden(false);
@@ -450457,7 +450457,7 @@ function Config({
450457
450457
  autoUpdatesChannel: "stable"
450458
450458
  };
450459
450459
  if (choice === "stay") {
450460
- newSettings.minimumVersion = "1.81.0";
450460
+ newSettings.minimumVersion = "1.81.1";
450461
450461
  }
450462
450462
  updateSettingsForSource("userSettings", newSettings);
450463
450463
  setSettingsData((prev_27) => ({
@@ -458766,7 +458766,7 @@ function HelpV2(t0) {
458766
458766
  let t6;
458767
458767
  if ($2[31] !== tabs) {
458768
458768
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
458769
- title: `UR v${"1.81.0"}`,
458769
+ title: `UR v${"1.81.1"}`,
458770
458770
  color: "professionalBlue",
458771
458771
  defaultTab: "general",
458772
458772
  children: tabs
@@ -459699,7 +459699,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
459699
459699
  async function handleInitialize(options2) {
459700
459700
  return {
459701
459701
  name: "UR",
459702
- version: "1.81.0",
459702
+ version: "1.81.1",
459703
459703
  protocolVersion: "0.1.0",
459704
459704
  workspaceRoot: options2.cwd,
459705
459705
  capabilities: {
@@ -476807,7 +476807,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
476807
476807
  return [];
476808
476808
  }
476809
476809
  }
476810
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.81.0") {
476810
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.81.1") {
476811
476811
  if (process.env.USER_TYPE === "ant") {
476812
476812
  const changelog = "";
476813
476813
  if (changelog) {
@@ -476834,7 +476834,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.81.0")
476834
476834
  releaseNotes
476835
476835
  };
476836
476836
  }
476837
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.81.0") {
476837
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.81.1") {
476838
476838
  if (process.env.USER_TYPE === "ant") {
476839
476839
  const changelog = "";
476840
476840
  if (changelog) {
@@ -479739,7 +479739,7 @@ function getRecentActivitySync() {
479739
479739
  return cachedActivity;
479740
479740
  }
479741
479741
  function getLogoDisplayData() {
479742
- const version2 = process.env.DEMO_VERSION ?? "1.81.0";
479742
+ const version2 = process.env.DEMO_VERSION ?? "1.81.1";
479743
479743
  const serverUrl = getDirectConnectServerUrl();
479744
479744
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
479745
479745
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -480607,7 +480607,7 @@ function LogoV2() {
480607
480607
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
480608
480608
  t2 = () => {
480609
480609
  const currentConfig = getGlobalConfig();
480610
- if (currentConfig.lastReleaseNotesSeen === "1.81.0") {
480610
+ if (currentConfig.lastReleaseNotesSeen === "1.81.1") {
480611
480611
  return;
480612
480612
  }
480613
480613
  saveGlobalConfig(_temp325);
@@ -481292,12 +481292,12 @@ function LogoV2() {
481292
481292
  return t41;
481293
481293
  }
481294
481294
  function _temp325(current) {
481295
- if (current.lastReleaseNotesSeen === "1.81.0") {
481295
+ if (current.lastReleaseNotesSeen === "1.81.1") {
481296
481296
  return current;
481297
481297
  }
481298
481298
  return {
481299
481299
  ...current,
481300
- lastReleaseNotesSeen: "1.81.0"
481300
+ lastReleaseNotesSeen: "1.81.1"
481301
481301
  };
481302
481302
  }
481303
481303
  function _temp241(s_0) {
@@ -497247,7 +497247,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
497247
497247
  if (spec.name !== specName) {
497248
497248
  throw new Error("Agentic CI workflow spec name does not match");
497249
497249
  }
497250
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.81.0" : "1.81.0");
497250
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.81.1" : "1.81.1");
497251
497251
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
497252
497252
  throw new Error("invalid ur-agent package version");
497253
497253
  }
@@ -498240,7 +498240,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
498240
498240
  path: ".github/workflows/ur.yml",
498241
498241
  root: "project",
498242
498242
  content: compileAgenticCiWorkflow("default", {
498243
- packageVersion: typeof MACRO !== "undefined" ? "1.81.0" : "1.81.0"
498243
+ packageVersion: typeof MACRO !== "undefined" ? "1.81.1" : "1.81.1"
498244
498244
  })
498245
498245
  },
498246
498246
  {
@@ -498303,7 +498303,7 @@ function value(tokens, flag) {
498303
498303
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
498304
498304
  }
498305
498305
  function cliVersion() {
498306
- return typeof MACRO !== "undefined" ? "1.81.0" : "1.81.0";
498306
+ return typeof MACRO !== "undefined" ? "1.81.1" : "1.81.1";
498307
498307
  }
498308
498308
  function workflowPath(cwd2) {
498309
498309
  return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -504159,7 +504159,7 @@ function createAcpStdioApp(deps) {
504159
504159
  }
504160
504160
  },
504161
504161
  authMethods: [],
504162
- agentInfo: { name: "UR-Nexus", version: "1.81.0" }
504162
+ agentInfo: { name: "UR-Nexus", version: "1.81.1" }
504163
504163
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
504164
504164
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
504165
504165
  await runtime2.announce({
@@ -504256,7 +504256,7 @@ function createAcpStdioAgent(deps) {
504256
504256
  }
504257
504257
  },
504258
504258
  authMethods: [],
504259
- agentInfo: { name: "UR-Nexus", version: "1.81.0" }
504259
+ agentInfo: { name: "UR-Nexus", version: "1.81.1" }
504260
504260
  });
504261
504261
  return;
504262
504262
  case "authenticate":
@@ -715508,7 +715508,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
715508
715508
  smapsRollup,
715509
715509
  platform: process.platform,
715510
715510
  nodeVersion: process.version,
715511
- ccVersion: "1.81.0"
715511
+ ccVersion: "1.81.1"
715512
715512
  };
715513
715513
  }
715514
715514
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -716097,7 +716097,7 @@ var init_bridge_kick = __esm(() => {
716097
716097
  var call154 = async () => {
716098
716098
  return {
716099
716099
  type: "text",
716100
- value: "1.81.0"
716100
+ value: "1.81.1"
716101
716101
  };
716102
716102
  }, version2, version_default;
716103
716103
  var init_version = __esm(() => {
@@ -727340,7 +727340,7 @@ function generateHtmlReport(data, insights) {
727340
727340
  </html>`;
727341
727341
  }
727342
727342
  function buildExportData(data, insights, facets, remoteStats) {
727343
- const version3 = typeof MACRO !== "undefined" ? "1.81.0" : "unknown";
727343
+ const version3 = typeof MACRO !== "undefined" ? "1.81.1" : "unknown";
727344
727344
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
727345
727345
  const facets_summary = {
727346
727346
  total: facets.size,
@@ -731653,7 +731653,7 @@ var init_sessionStorage = __esm(() => {
731653
731653
  init_settings2();
731654
731654
  init_slowOperations();
731655
731655
  init_uuid();
731656
- VERSION7 = typeof MACRO !== "undefined" ? "1.81.0" : "unknown";
731656
+ VERSION7 = typeof MACRO !== "undefined" ? "1.81.1" : "unknown";
731657
731657
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
731658
731658
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
731659
731659
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -732868,7 +732868,7 @@ var init_filesystem = __esm(() => {
732868
732868
  });
732869
732869
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
732870
732870
  const nonce = randomBytes24(16).toString("hex");
732871
- return join243(getURTempDir(), "bundled-skills", "1.81.0", nonce);
732871
+ return join243(getURTempDir(), "bundled-skills", "1.81.1", nonce);
732872
732872
  });
732873
732873
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
732874
732874
  });
@@ -739268,7 +739268,7 @@ function computeFingerprint(messageText2, version3) {
739268
739268
  }
739269
739269
  function computeFingerprintFromMessages(messages) {
739270
739270
  const firstMessageText = extractFirstMessageText(messages);
739271
- return computeFingerprint(firstMessageText, "1.81.0");
739271
+ return computeFingerprint(firstMessageText, "1.81.1");
739272
739272
  }
739273
739273
  var FINGERPRINT_SALT = "59cf53e54c78";
739274
739274
  var init_fingerprint = () => {};
@@ -741193,7 +741193,7 @@ async function sideQuery(opts) {
741193
741193
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
741194
741194
  }
741195
741195
  const messageText2 = extractFirstUserMessageText(messages);
741196
- const fingerprint2 = computeFingerprint(messageText2, "1.81.0");
741196
+ const fingerprint2 = computeFingerprint(messageText2, "1.81.1");
741197
741197
  const attributionHeader = getAttributionHeader(fingerprint2);
741198
741198
  const systemBlocks = [
741199
741199
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -746027,7 +746027,7 @@ function buildSystemInitMessage(inputs) {
746027
746027
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
746028
746028
  apiKeySource: getURHQApiKeyWithSource().source,
746029
746029
  betas: getSdkBetas(),
746030
- ur_version: "1.81.0",
746030
+ ur_version: "1.81.1",
746031
746031
  output_style: outputStyle,
746032
746032
  agents: inputs.agents.map((agent2) => agent2.agentType),
746033
746033
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -759863,7 +759863,7 @@ var init_useVoiceEnabled = __esm(() => {
759863
759863
  function getSemverPart(version3) {
759864
759864
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
759865
759865
  }
759866
- function useUpdateNotification(updatedVersion, initialVersion = "1.81.0") {
759866
+ function useUpdateNotification(updatedVersion, initialVersion = "1.81.1") {
759867
759867
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
759868
759868
  if (!updatedVersion) {
759869
759869
  return null;
@@ -759912,7 +759912,7 @@ function AutoUpdater({
759912
759912
  return;
759913
759913
  }
759914
759914
  if (false) {}
759915
- const currentVersion = "1.81.0";
759915
+ const currentVersion = "1.81.1";
759916
759916
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
759917
759917
  let latestVersion = await getLatestVersion(channel);
759918
759918
  const isDisabled = isAutoUpdaterDisabled();
@@ -760141,12 +760141,12 @@ function NativeAutoUpdater({
760141
760141
  logEvent("tengu_native_auto_updater_start", {});
760142
760142
  try {
760143
760143
  const maxVersion = await getMaxVersion();
760144
- if (maxVersion && gt("1.81.0", maxVersion)) {
760144
+ if (maxVersion && gt("1.81.1", maxVersion)) {
760145
760145
  const msg = await getMaxVersionMessage();
760146
760146
  setMaxVersionIssue(msg ?? "affects your version");
760147
760147
  }
760148
760148
  const result = await installLatest(channel);
760149
- const currentVersion = "1.81.0";
760149
+ const currentVersion = "1.81.1";
760150
760150
  const latencyMs = Date.now() - startTime;
760151
760151
  if (result.lockFailed) {
760152
760152
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -760283,17 +760283,17 @@ function PackageManagerAutoUpdater(t0) {
760283
760283
  const maxVersion = await getMaxVersion();
760284
760284
  if (maxVersion && latest && gt(latest, maxVersion)) {
760285
760285
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
760286
- if (gte("1.81.0", maxVersion)) {
760287
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.81.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
760286
+ if (gte("1.81.1", maxVersion)) {
760287
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.81.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
760288
760288
  setUpdateAvailable(false);
760289
760289
  return;
760290
760290
  }
760291
760291
  latest = maxVersion;
760292
760292
  }
760293
- const hasUpdate = latest && !gte("1.81.0", latest) && !shouldSkipVersion(latest);
760293
+ const hasUpdate = latest && !gte("1.81.1", latest) && !shouldSkipVersion(latest);
760294
760294
  setUpdateAvailable(!!hasUpdate);
760295
760295
  if (hasUpdate) {
760296
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.81.0"} -> ${latest}`);
760296
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.81.1"} -> ${latest}`);
760297
760297
  }
760298
760298
  };
760299
760299
  $2[0] = t1;
@@ -760327,7 +760327,7 @@ function PackageManagerAutoUpdater(t0) {
760327
760327
  wrap: "truncate",
760328
760328
  children: [
760329
760329
  "currentVersion: ",
760330
- "1.81.0"
760330
+ "1.81.1"
760331
760331
  ]
760332
760332
  }, undefined, true, undefined, this);
760333
760333
  $2[3] = verbose;
@@ -771180,7 +771180,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
771180
771180
  project_dir: getOriginalCwd(),
771181
771181
  added_dirs: addedDirs
771182
771182
  },
771183
- version: "1.81.0",
771183
+ version: "1.81.1",
771184
771184
  output_style: {
771185
771185
  name: outputStyleName
771186
771186
  },
@@ -771315,7 +771315,7 @@ function StatusLineInner({
771315
771315
  const attention = customStatusError ?? taskAttention;
771316
771316
  const terminalSize = React133.useContext(TerminalSizeContext);
771317
771317
  const defaultStatusLineText = buildDefaultStatusBar({
771318
- version: "1.81.0",
771318
+ version: "1.81.1",
771319
771319
  providerLabel: providerRuntime.providerLabel,
771320
771320
  authMode: providerRuntime.authLabel,
771321
771321
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -783570,7 +783570,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
783570
783570
  } catch {}
783571
783571
  const data = {
783572
783572
  trigger: trigger2,
783573
- version: "1.81.0",
783573
+ version: "1.81.1",
783574
783574
  platform: process.platform,
783575
783575
  transcript,
783576
783576
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -795939,7 +795939,7 @@ function WelcomeV2() {
795939
795939
  dimColor: true,
795940
795940
  children: [
795941
795941
  "v",
795942
- "1.81.0"
795942
+ "1.81.1"
795943
795943
  ]
795944
795944
  }, undefined, true, undefined, this)
795945
795945
  ]
@@ -797199,7 +797199,7 @@ function completeOnboarding() {
797199
797199
  saveGlobalConfig((current) => ({
797200
797200
  ...current,
797201
797201
  hasCompletedOnboarding: true,
797202
- lastOnboardingVersion: "1.81.0"
797202
+ lastOnboardingVersion: "1.81.1"
797203
797203
  }));
797204
797204
  }
797205
797205
  function showDialog(root2, renderer) {
@@ -802345,7 +802345,7 @@ function appendToLog(path28, message) {
802345
802345
  cwd: getFsImplementation().cwd(),
802346
802346
  userType: process.env.USER_TYPE,
802347
802347
  sessionId: getSessionId(),
802348
- version: "1.81.0"
802348
+ version: "1.81.1"
802349
802349
  };
802350
802350
  getLogWriter(path28).write(messageWithTimestamp);
802351
802351
  }
@@ -806509,8 +806509,8 @@ async function getEnvLessBridgeConfig() {
806509
806509
  }
806510
806510
  async function checkEnvLessBridgeMinVersion() {
806511
806511
  const cfg = await getEnvLessBridgeConfig();
806512
- if (cfg.min_version && lt("1.81.0", cfg.min_version)) {
806513
- return `Your version of UR (${"1.81.0"}) is too old for Remote Control.
806512
+ if (cfg.min_version && lt("1.81.1", cfg.min_version)) {
806513
+ return `Your version of UR (${"1.81.1"}) is too old for Remote Control.
806514
806514
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
806515
806515
  }
806516
806516
  return null;
@@ -806984,7 +806984,7 @@ async function initBridgeCore(params) {
806984
806984
  const rawApi = createBridgeApiClient({
806985
806985
  baseUrl,
806986
806986
  getAccessToken,
806987
- runnerVersion: "1.81.0",
806987
+ runnerVersion: "1.81.1",
806988
806988
  onDebug: logForDebugging,
806989
806989
  onAuth401,
806990
806990
  getTrustedDeviceToken
@@ -816457,7 +816457,7 @@ function getAgUiCapabilities() {
816457
816457
  name: "UR-Nexus",
816458
816458
  type: "ur-nexus",
816459
816459
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
816460
- version: "1.81.0",
816460
+ version: "1.81.1",
816461
816461
  provider: "UR",
816462
816462
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
816463
816463
  },
@@ -817684,7 +817684,7 @@ function createMCPServer(cwd4, debug2, verbose) {
817684
817684
  };
817685
817685
  const server2 = new Server({
817686
817686
  name: "ur-nexus",
817687
- version: "1.81.0"
817687
+ version: "1.81.1"
817688
817688
  }, {
817689
817689
  capabilities: {
817690
817690
  tools: {}
@@ -818888,7 +818888,7 @@ function thrownResponse(error40) {
818888
818888
  }
818889
818889
  async function createUrMcp2026Runtime(options5) {
818890
818890
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
818891
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.81.0" }, { capabilities: {} });
818891
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.81.1" }, { capabilities: {} });
818892
818892
  const [clientTransport, serverTransport] = createLinkedTransportPair();
818893
818893
  try {
818894
818894
  await server2.connect(serverTransport);
@@ -818899,7 +818899,7 @@ async function createUrMcp2026Runtime(options5) {
818899
818899
  }
818900
818900
  const runtime2 = new Mcp2026Runtime({
818901
818901
  cwd: options5.cwd,
818902
- version: "1.81.0",
818902
+ version: "1.81.1",
818903
818903
  backend: {
818904
818904
  listTools: async () => {
818905
818905
  const listed = await client2.listTools();
@@ -821634,7 +821634,7 @@ async function update() {
821634
821634
  logEvent("tengu_update_check", {});
821635
821635
  const diagnostic2 = await getDoctorDiagnostic();
821636
821636
  const result = await checkUpgradeStatus({
821637
- currentVersion: "1.81.0",
821637
+ currentVersion: "1.81.1",
821638
821638
  packageName: UR_AGENT_PACKAGE_NAME,
821639
821639
  installationType: diagnostic2.installationType,
821640
821640
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -822962,7 +822962,7 @@ ${customInstructions}` : customInstructions;
822962
822962
  }
822963
822963
  }
822964
822964
  logForDiagnosticsNoPII("info", "started", {
822965
- version: "1.81.0",
822965
+ version: "1.81.1",
822966
822966
  is_native_binary: isInBundledMode()
822967
822967
  });
822968
822968
  registerCleanup(async () => {
@@ -823749,7 +823749,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
823749
823749
  pendingHookMessages
823750
823750
  }, renderAndRun);
823751
823751
  }
823752
- }).version("1.81.0 (UR-Nexus)", "-v, --version", "Output the version number");
823752
+ }).version("1.81.1 (UR-Nexus)", "-v, --version", "Output the version number");
823753
823753
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
823754
823754
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
823755
823755
  if (canUserConfigureAdvisor()) {
@@ -824876,7 +824876,7 @@ if (false) {}
824876
824876
  async function main2() {
824877
824877
  const args = process.argv.slice(2);
824878
824878
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
824879
- console.log(`${"1.81.0"} (UR-Nexus)`);
824879
+ console.log(`${"1.81.1"} (UR-Nexus)`);
824880
824880
  return;
824881
824881
  }
824882
824882
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
package/docs/REDTEAM.md CHANGED
@@ -61,4 +61,10 @@ Install/enable it from the official marketplace if it is not already enabled, ac
61
61
  /reverse-skills:start <research task>
62
62
  ```
63
63
 
64
+ The command preflights UR's visible task lifecycle for multi-outcome or
65
+ workspace-changing work. It creates an actionable board before Bash, edits,
66
+ writes, or delegation, so `tasks.requireBeforeChanges` remains enabled without
67
+ surfacing a failed-first `TaskListRequired` tool call. Direct specialist-skill
68
+ invocations follow the same contract.
69
+
64
70
  Review [the plugin README](../plugins/core/reverse-skills/README.md) for its capability map and provenance.
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.81.0 (UR-Nexus)"
22
+ # expected for this release: "1.81.1 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ### 0.0 Redteam mode and Reverse Skills (1.81.0)
@@ -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.81.0</p>
48
+ <p class="eyebrow">Version 1.81.1</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>
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.81.0"
10
+ version = "1.81.1"
11
11
 
12
12
  repositories {
13
13
  mavenCentral()
@@ -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.81.0",
5
+ "version": "1.81.1",
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.81.0",
3
+ "version": "1.81.1",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reverse-skills",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "UR-native reverse engineering and red-team research workflows, available exclusively in UR redteam mode.",
5
5
  "author": {
6
6
  "name": "UR maintainers",
@@ -12,6 +12,12 @@ The integration is UR-only:
12
12
 
13
13
  Start with `/reverse-skills:start <task>` (or invoke the `reverse-skills:reverse-skill-router` skill directly). The router selects one or more specialist skills covering binary reverse engineering, exploitation, application testing, malware/EDR research, platform and radio security, forensics, LLM security, and evidence/reporting.
14
14
 
15
+ For multi-outcome or workspace-changing research, the command and every
16
+ specialist skill expose UR's task tools and require an actionable task board
17
+ before Bash, edits, writes, or delegation. This keeps the normal
18
+ `tasks.requireBeforeChanges` protection enabled without a failed-first
19
+ `TaskListRequired` retry.
20
+
15
21
  ## Provenance
16
22
 
17
23
  The adaptation is based on upstream commit `289c24b1617411a16b1e8d3032cce0f2fe52911d` (MIT). UR excludes the upstream GPL CTF orchestrator, external AGPL services, client-specific bootstrap scripts, field journals, and machine-specific configuration. See `NOTICE` and `UPSTREAM-LICENSE`.
@@ -3,13 +3,14 @@
3
3
  These rules apply to every skill in this plugin.
4
4
 
5
5
  1. Confirm UR redteam mode is active. Plugin gating normally guarantees this; never suggest bypassing the gate.
6
- 2. Separate offline research from target operations. Reading, decompiling, documenting, and authoring local research artifacts may proceed under normal file/tool permissions.
7
- 3. Before network access, sample execution, exploitation, credential testing, radio transmission, device mutation, or any other target operation, inspect `/scope show`. Require a scope approved in the current UR session. Mode activation and warning acceptance are not target authorization.
8
- 4. Use only the hosts, ports, tools, and intensity recorded in scope. Stop when a discovered pivot or target is outside it; ask the user to update and reapprove scope.
9
- 5. Continue to honor UR permission prompts, sandboxing, secrets handling, and action-specific confirmations. Never weaken these controls or silently elevate privileges.
10
- 6. Prefer reproducible case directories, hashes, timestamps, commands, raw evidence, and findings that distinguish observation from inference.
11
- 7. Do not auto-install tools or alter another AI client's configuration. If a dependency is absent, report it and propose an UR-native installation or MCP setup for explicit approval.
12
- 8. The selected model/provider is independent. If it declines a request, state that accurately; do not imply UR redteam mode can override provider policy.
6
+ 2. Keep UR's task lifecycle ahead of mutations. Read-only inspection may happen first. If the request has multiple outcomes, sequencing, verification/reporting deliverables, or any workspace-changing action, call `TaskList` and create 2–8 concrete outcome tasks with `TaskCreate` when no actionable board exists. Mark the active task `in_progress` before Bash/Edit/Write or delegation, and update every task through completion, failure, or an explicit skip. Never wait for a `TaskListRequired` rejection and never disable the task gate as a workflow shortcut.
7
+ 3. Separate offline research from target operations. Reading, decompiling, documenting, and authoring local research artifacts may proceed under normal file/tool permissions.
8
+ 4. Before network access, sample execution, exploitation, credential testing, radio transmission, device mutation, or any other target operation, inspect `/scope show`. Require a scope approved in the current UR session. Mode activation and warning acceptance are not target authorization.
9
+ 5. Use only the hosts, ports, tools, and intensity recorded in scope. Stop when a discovered pivot or target is outside it; ask the user to update and reapprove scope.
10
+ 6. Continue to honor UR permission prompts, sandboxing, secrets handling, action-specific confirmations, and task tracking. Never weaken these controls or silently elevate privileges.
11
+ 7. Prefer reproducible case directories, hashes, timestamps, commands, raw evidence, and findings that distinguish observation from inference.
12
+ 8. Do not auto-install tools or alter another AI client's configuration. If a dependency is absent, report it and propose an UR-native installation or MCP setup for explicit approval.
13
+ 9. The selected model/provider is independent. If it declines a request, state that accurately; do not imply UR redteam mode can override provider policy.
13
14
 
14
15
  Recommended case layout:
15
16
 
@@ -3,8 +3,18 @@ description: "Route an authorized security-research task into the UR-exclusive R
3
3
  argument-hint: "<research task>"
4
4
  allowed-tools:
5
5
  - "Skill"
6
+ - "TaskCreate"
7
+ - "TaskList"
8
+ - "TaskUpdate"
6
9
  ---
7
10
 
11
+ Before invoking another skill or using Bash, Edit, or Write, inspect the request
12
+ for multiple outcomes, sequencing, verification/reporting deliverables, or any
13
+ workspace-changing action. When any of those apply, call `TaskList`, create
14
+ 2–8 concrete outcome tasks with `TaskCreate` if no actionable board exists,
15
+ and mark the first unblocked task in progress with `TaskUpdate`. Do not wait for
16
+ `TaskListRequired`, and do not disable UR's task gate to bypass this preflight.
17
+
8
18
  Invoke the `reverse-skills:reverse-skill-router` skill with the user's arguments.
9
19
  Follow its UR redteam execution contract, select the smallest applicable set of
10
20
  specialist skills, and begin with local/passive triage. Do not interpret redteam
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: application-redteam
3
3
  description: Conduct authorized application and infrastructure research across APIs, source code, web, cloud/Kubernetes, databases, identity federation, email, supply chain, browser automation, and thick clients.
4
- allowed-tools: Read Grep Glob Bash Edit Write WebFetch WebSearch
4
+ allowed-tools: Read Grep Glob Bash Edit Write WebFetch WebSearch TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Application red-team research
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: binary-reverse
3
3
  description: Reverse compiled, managed, packed, obfuscated, browser, bytecode, VM, or protocol artifacts using static and dynamic analysis. Covers IDA, Ghidra, radare2, .NET, Go/Rust, macOS, JavaScript, browser extensions, binary diffing, and protocol reconstruction.
4
- allowed-tools: Read Grep Glob Bash Edit Write
4
+ allowed-tools: Read Grep Glob Bash Edit Write TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Binary reverse engineering
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: exploit-development
3
3
  description: Turn a known vulnerability into a reproducible PoC or reliable authorized exploit, including stack/heap/kernel pwn, patch-diff analysis, exploit chains, fuzzing, and remote-environment stabilization.
4
- allowed-tools: Read Grep Glob Bash Edit Write
4
+ allowed-tools: Read Grep Glob Bash Edit Write TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Exploit development
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: forensics-threat-hunting
3
3
  description: Perform disk, memory, packet, and log forensics; build timelines and IOCs; create YARA/Sigma detections; and conduct evidence-driven threat hunts.
4
- allowed-tools: Read Grep Glob Bash Edit Write
4
+ allowed-tools: Read Grep Glob Bash Edit Write TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Forensics and threat hunting
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: llm-agent-security
3
3
  description: Test LLM and agent systems for prompt injection, tool abuse, memory poisoning, data leakage, unsafe autonomy, identity failures, and model or skill supply-chain risks.
4
- allowed-tools: Read Grep Glob Bash Edit Write WebFetch WebSearch
4
+ allowed-tools: Read Grep Glob Bash Edit Write WebFetch WebSearch TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # LLM and agent security
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: malware-edr-research
3
3
  description: Analyze, modify, build, and test malware-like samples, implants, anti-analysis behavior, and EDR/AV telemetry or evasion in authorized research environments.
4
- allowed-tools: Read Grep Glob Bash Edit Write
4
+ allowed-tools: Read Grep Glob Bash Edit Write TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Malware and EDR research
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: platform-radio-security
3
3
  description: Research mobile apps, firmware, embedded hardware, OT/ICS systems, Wi-Fi, wireless, and SDR/radio targets in owned or explicitly authorized labs.
4
- allowed-tools: Read Grep Glob Bash Edit Write
4
+ allowed-tools: Read Grep Glob Bash Edit Write TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Platform, device, and radio security
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: research-evidence
3
3
  description: Establish scope, review case integrity, preserve evidence-to-finding traceability, generate security diagrams, and produce reproducible technical reports.
4
- allowed-tools: Read Grep Glob Bash Edit Write
4
+ allowed-tools: Read Grep Glob Bash Edit Write TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Research evidence and reporting
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: reverse-skill-router
3
3
  description: Route an authorized reverse engineering or red-team research task to the correct UR specialist skill. Use when a task spans domains or its best entrypoint is unclear.
4
- allowed-tools: Read Grep Glob Bash
4
+ allowed-tools: Read Grep Glob Bash Skill TaskCreate TaskList TaskUpdate
5
5
  ---
6
6
 
7
7
  # Reverse Skills router