@uluops/setup 0.9.0 → 0.9.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.
@@ -11,6 +11,7 @@ import { homedir } from "node:os";
11
11
  import { join } from "node:path";
12
12
  import { ULUOPS_SERVERS, } from "./types.js";
13
13
  import { atomicWrite } from "../lib/atomic-write.js";
14
+ import { OPS_MCP_SPEC, REGISTRY_MCP_SPEC } from "../lib/mcp-packages.js";
14
15
  const RAW_TOML = "__rawToml";
15
16
  /**
16
17
  * Tools to seed with `approval_mode = "approve"` (Codex's auto-allow opt-in).
@@ -196,8 +197,8 @@ class CodexMcpConfig {
196
197
  const registryHasUserTools = hasUserToolEntries(raw, "uluops-registry");
197
198
  raw = removeServerConfigBlocks(removeServerConfigBlocks(raw, "uluops-tracker"), "uluops-registry");
198
199
  const blocks = [
199
- serverBlock("uluops-tracker", "@uluops/ops-mcp", apiKey, trackerHasUserTools ? [] : TRACKER_READ_TOOLS),
200
- serverBlock("uluops-registry", "@uluops/registry-mcp", apiKey, registryHasUserTools ? [] : REGISTRY_READ_TOOLS),
200
+ serverBlock("uluops-tracker", OPS_MCP_SPEC, apiKey, trackerHasUserTools ? [] : TRACKER_READ_TOOLS),
201
+ serverBlock("uluops-registry", REGISTRY_MCP_SPEC, apiKey, registryHasUserTools ? [] : REGISTRY_READ_TOOLS),
201
202
  ].join("\n\n");
202
203
  return { [RAW_TOML]: [raw.trimEnd(), blocks].filter(Boolean).join("\n\n") + "\n" };
203
204
  }
@@ -16,6 +16,7 @@ import { join, isAbsolute } from "node:path";
16
16
  import { parse as parseJsonc } from "jsonc-parser";
17
17
  import { ULUOPS_SERVERS, ConfigParseError } from "./types.js";
18
18
  import { atomicWrite } from "../lib/atomic-write.js";
19
+ import { OPS_MCP_SPEC, REGISTRY_MCP_SPEC } from "../lib/mcp-packages.js";
19
20
  class OpenCodeMcpConfig {
20
21
  /** Maps requested path → actual resolved path (for .jsonc fallback). */
21
22
  resolvedPaths = new Map();
@@ -51,7 +52,7 @@ class OpenCodeMcpConfig {
51
52
  // their bundled SDKs. See lib/config-merger.ts for rationale.
52
53
  const tracker = {
53
54
  type: "local",
54
- command: ["npx", "-y", "@uluops/ops-mcp"],
55
+ command: ["npx", "-y", OPS_MCP_SPEC],
55
56
  enabled: true,
56
57
  timeout: 30000,
57
58
  environment: {
@@ -60,7 +61,7 @@ class OpenCodeMcpConfig {
60
61
  };
61
62
  const registry = {
62
63
  type: "local",
63
- command: ["npx", "-y", "@uluops/registry-mcp"],
64
+ command: ["npx", "-y", REGISTRY_MCP_SPEC],
64
65
  enabled: true,
65
66
  timeout: 30000,
66
67
  environment: {
@@ -1,6 +1,6 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { atomicWrite } from "./atomic-write.js";
3
- const MCP_PACKAGES = ["@uluops/ops-mcp", "@uluops/registry-mcp"];
3
+ import { MCP_PACKAGES, OPS_MCP_SPEC, REGISTRY_MCP_SPEC, } from "./mcp-packages.js";
4
4
  /**
5
5
  * In-process memoization for the npm availability probe.
6
6
  *
@@ -102,7 +102,7 @@ export function mergeUluopsMcp(config, apiKey, trust = false) {
102
102
  ...existing,
103
103
  "uluops-tracker": {
104
104
  command: "npx",
105
- args: ["-y", "@uluops/ops-mcp"],
105
+ args: ["-y", OPS_MCP_SPEC],
106
106
  env: {
107
107
  ULUOPS_API_KEY: apiKey,
108
108
  },
@@ -110,7 +110,7 @@ export function mergeUluopsMcp(config, apiKey, trust = false) {
110
110
  },
111
111
  "uluops-registry": {
112
112
  command: "npx",
113
- args: ["-y", "@uluops/registry-mcp"],
113
+ args: ["-y", REGISTRY_MCP_SPEC],
114
114
  env: {
115
115
  ULUOPS_API_KEY: apiKey,
116
116
  },
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Pinned MCP server package versions.
3
+ *
4
+ * Every harness's MCP config writer (claude-code/gemini-cli/opencode JSON
5
+ * mergers, codex TOML writer) stamps these spec strings into the harness
6
+ * config so `npx -y <spec>` resolves a known-good version instead of
7
+ * latest. Pinning makes a `@uluops/setup` release self-contained — what
8
+ * users get on first launch is what the package was tested against,
9
+ * regardless of when later MCP server versions ship.
10
+ *
11
+ * **Bump rule:** when an MCP server publishes a new version, bump the
12
+ * version here in the same setup release. A pinned setup install never
13
+ * silently picks up a downstream regression; a missed bump shows up as
14
+ * the next setup release stamping the previous combination.
15
+ *
16
+ * The bare package NAMES (without versions) remain available as
17
+ * `MCP_PACKAGES` for the npm availability probe — that probe asks
18
+ * "does this name exist on the registry" not "does this version exist".
19
+ * Pinning the probe to a specific version would turn a temporary
20
+ * registry blip on an older version into a setup failure even when
21
+ * the latest version was reachable.
22
+ */
23
+ export declare const OPS_MCP_PACKAGE = "@uluops/ops-mcp";
24
+ export declare const OPS_MCP_VERSION = "0.3.1";
25
+ export declare const OPS_MCP_SPEC: "@uluops/ops-mcp@0.3.1";
26
+ export declare const REGISTRY_MCP_PACKAGE = "@uluops/registry-mcp";
27
+ export declare const REGISTRY_MCP_VERSION = "0.2.5";
28
+ export declare const REGISTRY_MCP_SPEC: "@uluops/registry-mcp@0.2.5";
29
+ /**
30
+ * Bare package names for the npm availability probe. The probe checks
31
+ * existence on the registry, not version-specific resolvability, so it
32
+ * uses these unversioned names.
33
+ */
34
+ export declare const MCP_PACKAGES: readonly string[];
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Pinned MCP server package versions.
3
+ *
4
+ * Every harness's MCP config writer (claude-code/gemini-cli/opencode JSON
5
+ * mergers, codex TOML writer) stamps these spec strings into the harness
6
+ * config so `npx -y <spec>` resolves a known-good version instead of
7
+ * latest. Pinning makes a `@uluops/setup` release self-contained — what
8
+ * users get on first launch is what the package was tested against,
9
+ * regardless of when later MCP server versions ship.
10
+ *
11
+ * **Bump rule:** when an MCP server publishes a new version, bump the
12
+ * version here in the same setup release. A pinned setup install never
13
+ * silently picks up a downstream regression; a missed bump shows up as
14
+ * the next setup release stamping the previous combination.
15
+ *
16
+ * The bare package NAMES (without versions) remain available as
17
+ * `MCP_PACKAGES` for the npm availability probe — that probe asks
18
+ * "does this name exist on the registry" not "does this version exist".
19
+ * Pinning the probe to a specific version would turn a temporary
20
+ * registry blip on an older version into a setup failure even when
21
+ * the latest version was reachable.
22
+ */
23
+ export const OPS_MCP_PACKAGE = "@uluops/ops-mcp";
24
+ export const OPS_MCP_VERSION = "0.3.1";
25
+ export const OPS_MCP_SPEC = `${OPS_MCP_PACKAGE}@${OPS_MCP_VERSION}`;
26
+ export const REGISTRY_MCP_PACKAGE = "@uluops/registry-mcp";
27
+ export const REGISTRY_MCP_VERSION = "0.2.5";
28
+ export const REGISTRY_MCP_SPEC = `${REGISTRY_MCP_PACKAGE}@${REGISTRY_MCP_VERSION}`;
29
+ /**
30
+ * Bare package names for the npm availability probe. The probe checks
31
+ * existence on the registry, not version-specific resolvability, so it
32
+ * uses these unversioned names.
33
+ */
34
+ export const MCP_PACKAGES = [
35
+ OPS_MCP_PACKAGE,
36
+ REGISTRY_MCP_PACKAGE,
37
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uluops/setup",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "Zero-friction installer for UluOps agentic harnesses",
5
5
  "license": "MIT",
6
6
  "repository": {