@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 +18 -0
- package/README.md +28 -23
- package/dist/{audit-5ZUBPZZX.js → audit-SKMMC2U4.js} +1 -1
- package/dist/{autopilot-JXO4MZ6H.js → autopilot-EBZ44LYS.js} +1 -1
- package/dist/{chunk-WSJEPY7T.js → chunk-4R52WTFO.js} +1 -1
- package/dist/{chunk-R4DWK6FE.js → chunk-6PZDSWCG.js} +13 -10
- package/dist/{chunk-WFN4JTZI.js → chunk-LQSRQ6Z3.js} +5 -5
- package/dist/cli.cjs +131 -127
- package/dist/cli.d.ts +4 -4
- package/dist/cli.js +121 -120
- package/dist/{constraints-V4VWCWR5.js → constraints-2ZK5FJFA.js} +1 -1
- package/dist/sdk/index.d.ts +6 -6
- package/package.json +3 -2
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 (`
|
|
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` | `
|
|
25
|
-
| Merge-weave | Compute merge order, preview integration, run gates, and apply authorized merges | `
|
|
26
|
-
| Run and evidence | Persist bounded receipts, independent verification, acceptance, and artifacts | `
|
|
27
|
-
| Fanout | Harvest and analyze issue/PR evidence for parallel work planning | `
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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. `
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
@@ -2100,7 +2100,7 @@ function validateGateInput(gateName, input) {
|
|
|
2100
2100
|
const schema = loadGateSchema(gateName);
|
|
2101
2101
|
if (!schema) {
|
|
2102
2102
|
console.warn(
|
|
2103
|
-
"[
|
|
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("[
|
|
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("[
|
|
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("[
|
|
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("[
|
|
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(
|
|
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("[
|
|
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("[
|
|
868
|
+
console.warn("[lexrunner] audit: skipping malformed line in audit.ndjson");
|
|
866
869
|
}
|
|
867
870
|
}
|
|
868
871
|
} catch (e) {
|
|
869
|
-
console.warn("[
|
|
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("[
|
|
915
|
+
console.warn("[lexrunner] audit: skipping malformed line in audit.ndjson");
|
|
913
916
|
}
|
|
914
917
|
}
|
|
915
918
|
} catch (e) {
|
|
916
|
-
console.warn("[
|
|
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
|
-
`[
|
|
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(`[
|
|
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(`[
|
|
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
|
-
`[
|
|
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(`[
|
|
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());
|