@smartergpt/lexrunner 1.4.0 → 1.4.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
@@ -6,6 +6,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.4.1] - 2026-08-04
10
+
11
+ ### Added
12
+
13
+ - **Canonical CLI executable** - Publish `lexrunner` as the primary npm binary alongside
14
+ `lexrunner-mcp` and the retained `lex-pr` compatibility alias.
15
+
16
+ ### Changed
17
+
18
+ - **Consistent CLI identity** - Use `lexrunner` in root and subcommand help, completions, diagnostic
19
+ prefixes, installation guidance, current release documentation, and generated CLI/MCP surface
20
+ guidance.
21
+
22
+ ### Fixed
23
+
24
+ - **Package/executable mismatch** - Ensure installing `@smartergpt/lexrunner` exposes an executable
25
+ matching the package and product name without breaking existing `lex-pr` automation.
26
+
9
27
  ## [1.4.0] - 2026-08-04
10
28
 
11
29
  ### Added
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # LexRunner (`lex-pr`)
1
+ # LexRunner (`lexrunner`)
2
2
 
3
3
  LexRunner turns a changing set of pull requests into a reviewable integration program: discover
4
4
  the work, freeze a dependency plan, run bounded gates, preserve evidence, and merge only with
@@ -19,13 +19,13 @@ branch, pushing, opening a PR, or merging requires separate approval.
19
19
 
20
20
  LexRunner’s supported workflow has grown in layers. A normal user can stop at any layer.
21
21
 
22
- | Layer | Current capability | First surface |
23
- | ------------------- | ------------------------------------------------------------------------------------------------------------ | ----------------------------------- |
24
- | Deterministic plan | Freeze PRs and declared dependencies into schema-versioned `plan.json` | `lex-pr weave plan` |
25
- | Merge-weave | Compute merge order, preview integration, run gates, and apply authorized merges | `lex-pr weave *`, `lex-pr gate run` |
26
- | Run and evidence | Persist bounded receipts, independent verification, acceptance, and artifacts | `lex-pr attempt *` |
27
- | Fanout | Harvest and analyze issue/PR evidence for parallel work planning | `lex-pr fanout *` |
28
- | Assisted agent work | Prepare an immutable packet and workspace envelope, attach a foreground-owned worker, then verify its claims | CLI/MCP Attempt lifecycle |
22
+ | Layer | Current capability | First surface |
23
+ | ------------------- | ------------------------------------------------------------------------------------------------------------ | ----------------------------------------- |
24
+ | Deterministic plan | Freeze PRs and declared dependencies into schema-versioned `plan.json` | `lexrunner weave plan` |
25
+ | Merge-weave | Compute merge order, preview integration, run gates, and apply authorized merges | `lexrunner weave *`, `lexrunner gate run` |
26
+ | Run and evidence | Persist bounded receipts, independent verification, acceptance, and artifacts | `lexrunner attempt *` |
27
+ | Fanout | Harvest and analyze issue/PR evidence for parallel work planning | `lexrunner fanout *` |
28
+ | Assisted agent work | Prepare an immutable packet and workspace envelope, attach a foreground-owned worker, then verify its claims | CLI/MCP Attempt lifecycle |
29
29
 
30
30
  The ADR-010 coordination model is accepted and its assisted Attempt lifecycle is implemented.
31
31
  LexRunner also has a tested headless reconciliation **application boundary**, but it is not a
@@ -39,21 +39,21 @@ remain unproven. See [ADR-010](docs/adr/ADR-010-agent-work-orchestration-protoco
39
39
  First inspect without mutation:
40
40
 
41
41
  ```bash
42
- lex-pr --version
43
- lex-pr workspace doctor --json
44
- lex-pr weave discover --json
42
+ lexrunner --version
43
+ lexrunner workspace doctor --json
44
+ lexrunner weave discover --json
45
45
  ```
46
46
 
47
47
  After approving a local, reversible artifact, freeze and inspect a plan:
48
48
 
49
49
  ```bash
50
- lex-pr weave plan --from-github --output plan.json --json
51
- lex-pr schema validate plan.json --json
52
- lex-pr weave merge-order plan.json --json
53
- lex-pr gate run plan.json --dry-run --json
50
+ lexrunner weave plan --from-github --output plan.json --json
51
+ lexrunner schema validate plan.json --json
52
+ lexrunner weave merge-order plan.json --json
53
+ lexrunner gate run plan.json --dry-run --json
54
54
  ```
55
55
 
56
- These commands do not merge. `lex-pr weave apply --execute` is a separate mutation and should be
56
+ These commands do not merge. `lexrunner weave apply --execute` is a separate mutation and should be
57
57
  run only after reviewing the frozen plan, authority, gates, and target branch.
58
58
 
59
59
  For a guided merge-weave walkthrough, use
@@ -94,28 +94,33 @@ organization, so a human with organization access must authenticate the npm CLI
94
94
  ```bash
95
95
  npm login --scope=@smartergpt --registry=https://registry.npmjs.org/
96
96
  npm install --save-dev @smartergpt/lexrunner
97
- npx lex-pr --version
97
+ npx lexrunner --version
98
98
  ```
99
99
 
100
100
  Global installation is also supported:
101
101
 
102
102
  ```bash
103
103
  npm install --global @smartergpt/lexrunner
104
- lex-pr --version
104
+ lexrunner --version
105
105
  ```
106
106
 
107
107
  Do not place npm tokens in the repository or a chat transcript. Windows/private-package validation
108
108
  is documented in the [Node 24 migration guide](docs/node-24-migration.md).
109
109
 
110
- The checked-in package version is the single source for `lex-pr --version`.
110
+ `lexrunner` is the canonical CLI name. The existing `lex-pr` executable remains an additive
111
+ compatibility alias and invokes the same program, so existing automation does not need to change.
112
+
113
+ The checked-in package version is the single source for `lexrunner --version` and
114
+ `lex-pr --version`.
111
115
 
112
116
  <!-- BEGIN GENERATED PACKAGE VERSION -->
113
117
 
114
- Current repository package version: **1.4.0**. npm availability and dist-tags are separate
118
+ Current repository package version: **1.4.1**. npm availability and dist-tags are separate
115
119
  release evidence; inspect the registry rather than inferring publication from source metadata.
116
120
  <!-- END GENERATED PACKAGE VERSION -->
117
121
 
118
- See the [1.4.0 release notes](docs/releases/1.4.0.md), the
122
+ See the [1.4.1 release notes](docs/releases/1.4.1.md), the
123
+ [1.4.0 native-host boundary release](docs/releases/1.4.0.md), the
119
124
  [1.3.0 dogfood release](docs/releases/1.3.0.md), the
120
125
  [1.2.1 publication repair](docs/releases/1.2.1.md), and the underlying
121
126
  [1.2.0 compatibility decision](docs/releases/1.2.0.md) for package disposition, semver rationale,
@@ -172,7 +177,7 @@ For implementation work, use the touched/adjacent gate selector and let CI prove
172
177
  high-risk changes:
173
178
 
174
179
  ```bash
175
- lex-pr gate select --base <base-sha> --head <head-sha> --json
180
+ lexrunner gate select --base <base-sha> --head <head-sha> --json
176
181
  ```
177
182
 
178
183
  Release validation remains exhaustive. See [`AGENTS.md`](AGENTS.md),
@@ -182,7 +187,7 @@ Release validation remains exhaustive. See [`AGENTS.md`](AGENTS.md),
182
187
  ## Package and licensing
183
188
 
184
189
  - Package: `@smartergpt/lexrunner`
185
- - CLI: `lex-pr`
190
+ - CLI: `lexrunner` (`lex-pr` compatibility alias)
186
191
  - MCP bin: `lexrunner-mcp`
187
192
  - Runtime dependency: `@smartergpt/lex` (MIT)
188
193
  - LexRunner license: SmarterGPT Source-Available Personal Use License
@@ -23,7 +23,7 @@ import {
23
23
  sanitizeEnv,
24
24
  sanitizeFileContent,
25
25
  writeManifest
26
- } from "./chunk-R4DWK6FE.js";
26
+ } from "./chunk-6PZDSWCG.js";
27
27
  import {
28
28
  generateSARIF,
29
29
  writeSARIF
@@ -16,7 +16,7 @@ import {
16
16
  hasCapability,
17
17
  parseAutopilotConfig,
18
18
  validateAutopilotConfig
19
- } from "./chunk-WSJEPY7T.js";
19
+ } from "./chunk-4R52WTFO.js";
20
20
  import "./chunk-4FFGNTAV.js";
21
21
  import "./chunk-6A4IE3TI.js";
22
22
  import "./chunk-VAGHAQT2.js";
@@ -2100,7 +2100,7 @@ function validateGateInput(gateName, input) {
2100
2100
  const schema = loadGateSchema(gateName);
2101
2101
  if (!schema) {
2102
2102
  console.warn(
2103
- "[lex-pr] validator: missing schema for gate; validation skipped (will be required in v1.0.0)"
2103
+ "[lexrunner] validator: missing schema for gate; validation skipped (will be required in v1.0.0)"
2104
2104
  );
2105
2105
  return;
2106
2106
  }
@@ -514,7 +514,7 @@ var AuditEmitter = class {
514
514
  const auditContext = await collectContext(contextTypes);
515
515
  this.context = auditContext;
516
516
  } catch (err) {
517
- console.warn("[lex-pr] audit: context collection failed", err);
517
+ console.warn("[lexrunner] audit: context collection failed", err);
518
518
  this.context = {};
519
519
  }
520
520
  } else {
@@ -534,7 +534,7 @@ var AuditEmitter = class {
534
534
  }
535
535
  this.ndjsonStream = fs3.createWriteStream(this.ndjsonPath, { flags: "a", autoClose: true });
536
536
  this.ndjsonStream.on("error", (err) => {
537
- console.warn("[lex-pr] audit: ndjson stream error (ignored)", String(err));
537
+ console.warn("[lexrunner] audit: ndjson stream error (ignored)", String(err));
538
538
  });
539
539
  const schemaPath = path3.join(this.auditDir, "audit.schema.json");
540
540
  const schema = {
@@ -627,7 +627,7 @@ var AuditEmitter = class {
627
627
  this.ndjsonStream.write(line);
628
628
  }
629
629
  } catch (e) {
630
- console.warn("[lex-pr] audit: ndjson write failed (ignored)", String(e));
630
+ console.warn("[lexrunner] audit: ndjson write failed (ignored)", String(e));
631
631
  }
632
632
  this.eventCount++;
633
633
  this.eventsByType[event] = (this.eventsByType[event] || 0) + 1;
@@ -652,7 +652,7 @@ var AuditEmitter = class {
652
652
  try {
653
653
  await this.ingestSidecar();
654
654
  } catch (e) {
655
- console.warn("[lex-pr] audit: sidecar ingestion error (ignored)", String(e));
655
+ console.warn("[lexrunner] audit: sidecar ingestion error (ignored)", String(e));
656
656
  }
657
657
  }, 5e3);
658
658
  try {
@@ -689,11 +689,14 @@ var AuditEmitter = class {
689
689
  this.eventsByType[event.event] = (this.eventsByType[event.event] || 0) + 1;
690
690
  }
691
691
  } catch (innerErr) {
692
- console.warn("[lex-pr] audit: error ingesting sidecar event (ignored)", String(innerErr));
692
+ console.warn(
693
+ "[lexrunner] audit: error ingesting sidecar event (ignored)",
694
+ String(innerErr)
695
+ );
693
696
  }
694
697
  });
695
698
  } catch (err) {
696
- console.warn("[lex-pr] audit: ingestSidecarFiles failed (ignored)", String(err));
699
+ console.warn("[lexrunner] audit: ingestSidecarFiles failed (ignored)", String(err));
697
700
  }
698
701
  }
699
702
  /**
@@ -862,11 +865,11 @@ var AuditEmitter = class {
862
865
  else if (status === "blocked") totalBlocked++;
863
866
  }
864
867
  } catch (parseError) {
865
- console.warn("[lex-pr] audit: skipping malformed line in audit.ndjson");
868
+ console.warn("[lexrunner] audit: skipping malformed line in audit.ndjson");
866
869
  }
867
870
  }
868
871
  } catch (e) {
869
- console.warn("[lex-pr] audit: failed to read audit.ndjson (ignored)", String(e));
872
+ console.warn("[lexrunner] audit: failed to read audit.ndjson (ignored)", String(e));
870
873
  return;
871
874
  }
872
875
  const gateMatrix = {
@@ -909,11 +912,11 @@ var AuditEmitter = class {
909
912
  vulnEvents.push(event);
910
913
  }
911
914
  } catch (parseError) {
912
- console.warn("[lex-pr] audit: skipping malformed line in audit.ndjson");
915
+ console.warn("[lexrunner] audit: skipping malformed line in audit.ndjson");
913
916
  }
914
917
  }
915
918
  } catch (e) {
916
- console.warn("[lex-pr] audit: failed to read audit.ndjson for SARIF (ignored)", String(e));
919
+ console.warn("[lexrunner] audit: failed to read audit.ndjson for SARIF (ignored)", String(e));
917
920
  return;
918
921
  }
919
922
  if (vulnEvents.length === 0) {
@@ -213,18 +213,18 @@ function readGovernanceLogs() {
213
213
  const [major] = rawLog.schemaVersion.split(".").map(Number);
214
214
  if (major > CURRENT_MAJOR_VERSION) {
215
215
  console.warn(
216
- `[lex-pr] Skipping log ${file}: schema v${rawLog.schemaVersion} not supported (current: v${CURRENT_MAJOR_VERSION}.x.x)`
216
+ `[lexrunner] Skipping log ${file}: schema v${rawLog.schemaVersion} not supported (current: v${CURRENT_MAJOR_VERSION}.x.x)`
217
217
  );
218
218
  continue;
219
219
  }
220
220
  } else {
221
- console.warn(`[lex-pr] Skipping log ${file}: missing schemaVersion (legacy format)`);
221
+ console.warn(`[lexrunner] Skipping log ${file}: missing schemaVersion (legacy format)`);
222
222
  continue;
223
223
  }
224
224
  const parsed = GovernanceComparisonLogSchema.parse(rawLog);
225
225
  logs.push(parsed);
226
226
  } catch (error) {
227
- console.warn(`[lex-pr] Skipping invalid log ${file}:`, error);
227
+ console.warn(`[lexrunner] Skipping invalid log ${file}:`, error);
228
228
  }
229
229
  }
230
230
  logs.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
@@ -248,7 +248,7 @@ function readGovernanceLogsWithLegacy() {
248
248
  const [major] = rawLog.schemaVersion.split(".").map(Number);
249
249
  if (major > CURRENT_MAJOR_VERSION) {
250
250
  console.warn(
251
- `[lex-pr] Skipping log ${file}: schema v${rawLog.schemaVersion} not supported (current: v${CURRENT_MAJOR_VERSION}.x.x)`
251
+ `[lexrunner] Skipping log ${file}: schema v${rawLog.schemaVersion} not supported (current: v${CURRENT_MAJOR_VERSION}.x.x)`
252
252
  );
253
253
  continue;
254
254
  }
@@ -291,7 +291,7 @@ function readGovernanceLogsWithLegacy() {
291
291
  normalizationWarnings: warnings
292
292
  });
293
293
  } catch (error) {
294
- console.warn(`[lex-pr] Skipping invalid log ${file} (even with normalization):`, error);
294
+ console.warn(`[lexrunner] Skipping invalid log ${file} (even with normalization):`, error);
295
295
  }
296
296
  }
297
297
  results.sort((a, b) => new Date(b.log.timestamp).getTime() - new Date(a.log.timestamp).getTime());