@planu/cli 5.3.18 → 5.3.20
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 +26 -0
- package/dist/config/runtime-policy.json +2 -2
- package/dist/engine/core-bridge.js +2 -2
- package/dist/engine/macos-keychain-native-port.d.ts +4 -4
- package/dist/engine/macos-keychain-native-port.js +29 -3
- package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
- package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
- package/dist/tools/check-readiness.js +8 -2
- package/dist/tools/validate-lint.js +16 -4
- package/package.json +9 -9
- package/planu-native.json +1 -1
- package/planu-plugin.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
## [5.3.20] - 2026-08-12
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
- fix(release): unblock validate and privacy gates for v5.3.20
|
|
5
|
+
- fix(spec-1495): ground the outOfScope recommendation in the spec document
|
|
6
|
+
- fix(spec-1483): fail the native build on a version-mismatched artifact
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## [5.3.19] - 2026-08-11
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
- fix(spec-1492): size release budgets to the longest child chain per test
|
|
13
|
+
- fix(spec-1492): coordinate release-harness spawn and test budgets
|
|
14
|
+
- fix(spec-1486): raise load-tolerant timeout budgets in script-gate and heartbeat tests
|
|
15
|
+
- fix(spec-1482): update validate.test.ts lint timeout and message assertions per review
|
|
16
|
+
- fix(spec-1482): honor mid-run lint evidence on timeout and right-size lint caps
|
|
17
|
+
|
|
18
|
+
### Chores
|
|
19
|
+
- chore(spec-1492): record done transition with review and traceability evidence
|
|
20
|
+
- chore(spec-1486): record done transition with traceability and validation evidence
|
|
21
|
+
- chore(spec-1486): approve arbitrated script-gate timeout spec with dual-review evidence
|
|
22
|
+
- chore(spec-1486): add durable-job-heartbeat beforeAll hookTimeout reproducer
|
|
23
|
+
- chore(spec-1482): record done transition with traceability and validation evidence
|
|
24
|
+
- chore(spec-1482): approve arbitrated lint-gate timeout spec with dual-review evidence
|
|
25
|
+
|
|
26
|
+
|
|
1
27
|
## [5.3.18] - 2026-08-11
|
|
2
28
|
|
|
3
29
|
### Bug Fixes
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"maximumOutputBufferBytes": 67108864
|
|
15
15
|
},
|
|
16
16
|
"lintValidation": {
|
|
17
|
-
"defaultTimeoutMs":
|
|
17
|
+
"defaultTimeoutMs": 180000,
|
|
18
18
|
"minimumTimeoutMs": 1000,
|
|
19
19
|
"maximumTimeoutMs": 1800000
|
|
20
20
|
},
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"validation": {
|
|
30
30
|
"defaultDeadlineMs": 1800000,
|
|
31
|
-
"durableLintTimeoutMs":
|
|
31
|
+
"durableLintTimeoutMs": 170000,
|
|
32
32
|
"perGateTimeoutMs": 180000,
|
|
33
33
|
"complianceCommandTimeoutMs": 900000,
|
|
34
34
|
"noProgressTimeoutMs": 960000,
|
|
@@ -187,7 +187,7 @@ function loadNative() {
|
|
|
187
187
|
return mod;
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
-
loadDiagnostic = { attempted: attempts, errors };
|
|
190
|
+
loadDiagnostic = { ...loadDiagnostic, attempted: attempts, errors };
|
|
191
191
|
return null;
|
|
192
192
|
}
|
|
193
193
|
function refreshNativeCapabilityDiagnostic() {
|
|
@@ -223,7 +223,7 @@ export function requireMacOSKeychainNativePort() {
|
|
|
223
223
|
const keychainNative = loadNative();
|
|
224
224
|
refreshNativeCapabilityDiagnostic();
|
|
225
225
|
return createMacOSKeychainNativePort(process.platform, process.env.PLANU_NATIVE_PATH !== undefined ||
|
|
226
|
-
process.env.NAPI_RS_NATIVE_LIBRARY_PATH !== undefined, process.env.DISABLE_NATIVE_CORE === '1', keychainNative, loadDiagnostic.origin, loadDiagnostic.compatibility?.handshake?.capabilities);
|
|
226
|
+
process.env.NAPI_RS_NATIVE_LIBRARY_PATH !== undefined, process.env.DISABLE_NATIVE_CORE === '1', keychainNative, loadDiagnostic.origin, loadDiagnostic.compatibility?.handshake?.capabilities, loadDiagnostic.compatibility);
|
|
227
227
|
}
|
|
228
228
|
// TypeScript fallbacks -------------------------------------------------------
|
|
229
229
|
// These keep the surface area working when the native binary is unavailable
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { PlanuCore } from '../types/core-bridge.js';
|
|
1
|
+
import type { NativeRuntimeCompatibility, PlanuCore } from '../types/core-bridge.js';
|
|
2
2
|
import type { MacOSKeychainNativePort } from '../types/security.js';
|
|
3
3
|
export declare class ValidationReceiptSignerUnavailableError extends Error {
|
|
4
|
-
readonly reason: 'PLATFORM_UNSUPPORTED' | 'NATIVE_DISABLED' | 'ARTIFACT_MISSING' | 'NONCANONICAL_ORIGIN' | 'CAPABILITY_MISSING' | 'PORT_INCOMPLETE' | 'OVERRIDE_REJECTED' | 'PROVIDER_NONCANONICAL' | 'PROVIDER_UNAVAILABLE';
|
|
4
|
+
readonly reason: 'PLATFORM_UNSUPPORTED' | 'NATIVE_DISABLED' | 'ARTIFACT_MISSING' | 'STALE_ARTIFACT' | 'NONCANONICAL_ORIGIN' | 'CAPABILITY_MISSING' | 'PORT_INCOMPLETE' | 'OVERRIDE_REJECTED' | 'PROVIDER_NONCANONICAL' | 'PROVIDER_UNAVAILABLE';
|
|
5
5
|
readonly code: 'VALIDATION_RECEIPT_SIGNER_UNAVAILABLE';
|
|
6
|
-
constructor(reason: 'PLATFORM_UNSUPPORTED' | 'NATIVE_DISABLED' | 'ARTIFACT_MISSING' | 'NONCANONICAL_ORIGIN' | 'CAPABILITY_MISSING' | 'PORT_INCOMPLETE' | 'OVERRIDE_REJECTED' | 'PROVIDER_NONCANONICAL' | 'PROVIDER_UNAVAILABLE');
|
|
6
|
+
constructor(reason: 'PLATFORM_UNSUPPORTED' | 'NATIVE_DISABLED' | 'ARTIFACT_MISSING' | 'STALE_ARTIFACT' | 'NONCANONICAL_ORIGIN' | 'CAPABILITY_MISSING' | 'PORT_INCOMPLETE' | 'OVERRIDE_REJECTED' | 'PROVIDER_NONCANONICAL' | 'PROVIDER_UNAVAILABLE', remediation?: string);
|
|
7
7
|
}
|
|
8
8
|
/** Build the privileged main-thread port only from a canonical, verified native module. */
|
|
9
|
-
export declare function createMacOSKeychainNativePort(platform: NodeJS.Platform, overrideDefined: boolean, disabled: boolean, nativeModule: PlanuCore | null, origin: 'override' | 'local' | 'package' | undefined, capabilities: readonly string[] | undefined): MacOSKeychainNativePort;
|
|
9
|
+
export declare function createMacOSKeychainNativePort(platform: NodeJS.Platform, overrideDefined: boolean, disabled: boolean, nativeModule: PlanuCore | null, origin: 'override' | 'local' | 'package' | undefined, capabilities: readonly string[] | undefined, compatibility?: NativeRuntimeCompatibility): MacOSKeychainNativePort;
|
|
10
10
|
//# sourceMappingURL=macos-keychain-native-port.d.ts.map
|
|
@@ -1,14 +1,36 @@
|
|
|
1
|
+
import { PLANU_VERSION } from '../config/version.js';
|
|
2
|
+
const DEFAULT_REMEDIATION = 'Restart the MCP host and retry.';
|
|
3
|
+
/** Recover the native target triple from a buildId shaped `<epoch>-<engineVersion>-<triple>`. */
|
|
4
|
+
function deriveNativeTargetTriple(buildId, engineVersion) {
|
|
5
|
+
const separator = `-${engineVersion}-`;
|
|
6
|
+
const index = buildId.indexOf(separator);
|
|
7
|
+
if (index === -1) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const triple = buildId.slice(index + separator.length);
|
|
11
|
+
return triple.length > 0 ? triple : null;
|
|
12
|
+
}
|
|
13
|
+
function staleArtifactRemediation(artifactVersion, buildId) {
|
|
14
|
+
const triple = buildId ? deriveNativeTargetTriple(buildId, artifactVersion) : null;
|
|
15
|
+
if (!triple) {
|
|
16
|
+
return (`Native artifact reports engineVersion ${artifactVersion}, expected ${PLANU_VERSION}. ` +
|
|
17
|
+
'Could not determine the native target triple from the artifact build id; run: ' +
|
|
18
|
+
'bash scripts/build-rust-local.sh --host after manually removing the stale native artifact for your platform.');
|
|
19
|
+
}
|
|
20
|
+
return (`Native artifact reports engineVersion ${artifactVersion}, expected ${PLANU_VERSION}. Run: ` +
|
|
21
|
+
`cargo clean -p planu-core --release --target ${triple} --manifest-path rust/planu-core/Cargo.toml && bash scripts/build-rust-local.sh --host`);
|
|
22
|
+
}
|
|
1
23
|
export class ValidationReceiptSignerUnavailableError extends Error {
|
|
2
24
|
reason;
|
|
3
25
|
code = 'VALIDATION_RECEIPT_SIGNER_UNAVAILABLE';
|
|
4
|
-
constructor(reason) {
|
|
5
|
-
super(`[Planu] VALIDATION_RECEIPT_SIGNER_UNAVAILABLE:${reason}
|
|
26
|
+
constructor(reason, remediation = DEFAULT_REMEDIATION) {
|
|
27
|
+
super(`[Planu] VALIDATION_RECEIPT_SIGNER_UNAVAILABLE:${reason} ${remediation}`);
|
|
6
28
|
this.reason = reason;
|
|
7
29
|
this.name = 'ValidationReceiptSignerUnavailableError';
|
|
8
30
|
}
|
|
9
31
|
}
|
|
10
32
|
/** Build the privileged main-thread port only from a canonical, verified native module. */
|
|
11
|
-
export function createMacOSKeychainNativePort(platform, overrideDefined, disabled, nativeModule, origin, capabilities) {
|
|
33
|
+
export function createMacOSKeychainNativePort(platform, overrideDefined, disabled, nativeModule, origin, capabilities, compatibility) {
|
|
12
34
|
if (platform !== 'darwin') {
|
|
13
35
|
throw new ValidationReceiptSignerUnavailableError('PLATFORM_UNSUPPORTED');
|
|
14
36
|
}
|
|
@@ -19,6 +41,10 @@ export function createMacOSKeychainNativePort(platform, overrideDefined, disable
|
|
|
19
41
|
throw new ValidationReceiptSignerUnavailableError('NATIVE_DISABLED');
|
|
20
42
|
}
|
|
21
43
|
if (!nativeModule) {
|
|
44
|
+
if (compatibility && !compatibility.compatible) {
|
|
45
|
+
const artifactVersion = compatibility.handshake?.engineVersion ?? 'unknown';
|
|
46
|
+
throw new ValidationReceiptSignerUnavailableError('STALE_ARTIFACT', staleArtifactRemediation(artifactVersion, compatibility.handshake?.buildId));
|
|
47
|
+
}
|
|
22
48
|
throw new ValidationReceiptSignerUnavailableError('ARTIFACT_MISSING');
|
|
23
49
|
}
|
|
24
50
|
if (origin !== 'local' && origin !== 'package') {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-aarch64-apple-darwin",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
"platform": "darwin",
|
|
18
18
|
"arch": "arm64",
|
|
19
19
|
"libc": null,
|
|
20
|
-
"artifactSha256": "
|
|
20
|
+
"artifactSha256": "e55efda88d366c03c6dedb2c606e5e085f9cb7b4b41950d0a59de891ca8e6e3e",
|
|
21
21
|
"sbom": {
|
|
22
22
|
"format": "CycloneDX-1.5",
|
|
23
23
|
"path": "planu-core.darwin-arm64.node.sbom.json",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "c6865313d06acb32d6999c0b56796fbb7f36a6160c9a7f42ad2c9c25e354cfda"
|
|
25
25
|
},
|
|
26
26
|
"provenance": {
|
|
27
27
|
"builder": "scripts/build-rust-local.sh",
|
|
28
|
-
"sourceCommit": "
|
|
28
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
29
29
|
"sourceTreeDirty": false,
|
|
30
30
|
"sourceDateEpoch": 1,
|
|
31
31
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
"signature": {
|
|
35
35
|
"algorithm": "Ed25519",
|
|
36
36
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
37
|
-
"value": "
|
|
37
|
+
"value": "RUWNdjH6OhhIcCfdfPKR4jrxVbIgSynmnWCV8TAUP8OjP61pcXYBJ3Atoi3dFUbFKe5K5/PdXp0YR+2ypHmoDw=="
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "e55efda88d366c03c6dedb2c606e5e085f9cb7b4b41950d0a59de891ca8e6e3e"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-x86_64-apple-darwin",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
"platform": "darwin",
|
|
18
18
|
"arch": "x64",
|
|
19
19
|
"libc": null,
|
|
20
|
-
"artifactSha256": "
|
|
20
|
+
"artifactSha256": "f5b0bc55a024310b90e4273fee8302401e2ec83006a4410c95dadf087262ef87",
|
|
21
21
|
"sbom": {
|
|
22
22
|
"format": "CycloneDX-1.5",
|
|
23
23
|
"path": "planu-core.darwin-x64.node.sbom.json",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "eed96de149c1340631b052fe4561bd8a768e39ae29ffca54d715183c2e4756da"
|
|
25
25
|
},
|
|
26
26
|
"provenance": {
|
|
27
27
|
"builder": "scripts/build-rust-local.sh",
|
|
28
|
-
"sourceCommit": "
|
|
28
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
29
29
|
"sourceTreeDirty": false,
|
|
30
30
|
"sourceDateEpoch": 1,
|
|
31
31
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
"signature": {
|
|
35
35
|
"algorithm": "Ed25519",
|
|
36
36
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
37
|
-
"value": "
|
|
37
|
+
"value": "47S1SX1cvHc/E2jHlD7Mhagd3CiGdWbCdLiJmCFsCqP9yEWYBCkgw/jZoT3qUgTmExse+Hvzx8LDBc9fZl3RAA=="
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "f5b0bc55a024310b90e4273fee8302401e2ec83006a4410c95dadf087262ef87"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-aarch64-unknown-linux-gnu",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "arm64",
|
|
18
18
|
"libc": "glibc",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "2ea9228381585e0867fa1744ce15a50a1406217925c18d61ca86ef46045ab341",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-arm64-gnu.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "8dfab3a92f1a20f69d26ab5bcd73cd218b622a82ed02c7bc6cc9c800937b9696"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "yOcMzbe+aaTbIFqSbUKv5azScjk4Fs/e2th78DhaQdP287O5UOsGxxhv5w54gmwB//Lm6tXdzgbWK77g37SbAg=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "2ea9228381585e0867fa1744ce15a50a1406217925c18d61ca86ef46045ab341"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-aarch64-unknown-linux-musl",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "arm64",
|
|
18
18
|
"libc": "musl",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "820652ed60481ecf6291c64f2a2720d52410bd06b27268b24881e95f45ac4fb5",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-arm64-musl.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "709feb9088507693ac37ea745921e1f93ff3e1d342fb376ba3f7bb7e900d7799"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "Clj0B7s1KmADZoERbK4C9DcJX3Y7B4572h/Key3t6oDNEdqIbaff4XJ47TIBTuDW1RICr5myVcQJQlOL1m+oDA=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "820652ed60481ecf6291c64f2a2720d52410bd06b27268b24881e95f45ac4fb5"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-x86_64-unknown-linux-gnu",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "x64",
|
|
18
18
|
"libc": "glibc",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "480558ee13c36ac1382a265cb156eb9f966ded72e144a209052e7098ee61af47",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-x64-gnu.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "4ad75195c8a05b860c309208c7ad45361c0eea7cc107d85500805e93ce04e687"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "j6srf3XwnCHHrmF00S8IerExJd/Pov1K9oInF/jL/PkhGnknti6GYgm73GxfryUBK5FrsT7nTWXqXrmY2GHQDw=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "480558ee13c36ac1382a265cb156eb9f966ded72e144a209052e7098ee61af47"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-x86_64-unknown-linux-musl",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "x64",
|
|
18
18
|
"libc": "musl",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "4d49cab5c5a4acd877e594cab33c0aa0c2a1e3cc153598d500491c7980415d8e",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-x64-musl.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "0df31770a702f024c54991719dc402e0c581652cac146a389fb03d1322d40456"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "KYrdMvuUvSOezgBWK84rqhv4NstKjCq4f0iEoe2E6h3iV2e2uDhXT5WQyXeeV+9/fNKLKfTcSkepeSW1347YDg=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "4d49cab5c5a4acd877e594cab33c0aa0c2a1e3cc153598d500491c7980415d8e"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-aarch64-pc-windows-msvc",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "win32",
|
|
17
17
|
"arch": "arm64",
|
|
18
18
|
"libc": null,
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "af8d4bc6ff629838c2dc4ec1585fddb34ff746c7a655d17f330d1f948a9f88fa",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.win32-arm64-msvc.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "cb68d92f6c73d1a1761d6bf3dca51cd2d7ed4c777eaf21bbabaa10bd860c5bb1"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "Es/39B5KADPs6wEf4GX2YjN5WA+nqJzGHtltz8VoVS6dsSJKFVKX3RfHiVSldTAv7Lw1k+A+MfmVbarQX3yYBA=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "af8d4bc6ff629838c2dc4ec1585fddb34ff746c7a655d17f330d1f948a9f88fa"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.20",
|
|
4
|
+
"engineVersion": "5.3.20",
|
|
5
|
+
"buildId": "1-5.3.20-x86_64-pc-windows-msvc",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "win32",
|
|
17
17
|
"arch": "x64",
|
|
18
18
|
"libc": null,
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "662110578e520cfda4c20f3e99b3ae02f12b62fe4af3df0ddca993137144ec4c",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.win32-x64-msvc.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "2a840b84b97ba7dcce0240fb82033dd2a88d4d9db4698ac7a0e75802f0093154"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "b17b7f7133a1b83eacb1140de5138aa89c00f267",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "RzsxC6qOLporNXgL8gFU0tSNJPRYuKZE4N5Afi7vixhyzHtW5e96Afpv608/uvuEaPXiFBwbQPSVa7Ev9jlDAg=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.20",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.20",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "662110578e520cfda4c20f3e99b3ae02f12b62fe4af3df0ddca993137144ec4c"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.20",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -8,6 +8,13 @@ const MAX_VISIBLE_BLOCKERS = 8;
|
|
|
8
8
|
const MAX_VISIBLE_WARNINGS = 8;
|
|
9
9
|
const MAX_VISIBLE_RECOMMENDATIONS = 5;
|
|
10
10
|
const CANONICAL_CRITERIA_MISSING = 'CANONICAL_CRITERIA_MISSING';
|
|
11
|
+
const OUT_OF_SCOPE_SECTION_PATH = 'body.out_of_scope';
|
|
12
|
+
const SPEC_PATH_FIELD = 'specPath';
|
|
13
|
+
function scopeBoundariesUnverified(validationResult) {
|
|
14
|
+
const specUnreadable = validationResult.errors.some((error) => error.code === 'MISSING_FRONTMATTER' && error.path === SPEC_PATH_FIELD);
|
|
15
|
+
const outOfScopeSectionAbsent = validationResult.warnings.some((warning) => warning.code === 'OPTIONAL_SECTION_MISSING' && warning.path === OUT_OF_SCOPE_SECTION_PATH);
|
|
16
|
+
return specUnreadable || outOfScopeSectionAbsent;
|
|
17
|
+
}
|
|
11
18
|
function formatScore(score) {
|
|
12
19
|
if (score >= 90) {
|
|
13
20
|
return `${score}/100 (Excellent)`;
|
|
@@ -166,8 +173,7 @@ export async function handleCheckReadiness(args) {
|
|
|
166
173
|
// canonical validation result as an implementation-ready pass.
|
|
167
174
|
report.ready = false;
|
|
168
175
|
}
|
|
169
|
-
|
|
170
|
-
if (spec.outOfScope === undefined || spec.outOfScope.length === 0) {
|
|
176
|
+
if (scopeBoundariesUnverified(vr)) {
|
|
171
177
|
report.recommendations.push('Add outOfScope items to the spec frontmatter to declare explicit scope boundaries (SPEC-612). This reduces scope creep during implementation.');
|
|
172
178
|
}
|
|
173
179
|
const qualityScore = vr.qualityReport?.score;
|
|
@@ -110,9 +110,21 @@ export async function runLintCheck(projectPath, lintCommand, context = {}) {
|
|
|
110
110
|
catch (err) {
|
|
111
111
|
if (isCommandTimeout(err)) {
|
|
112
112
|
const seconds = Math.round(timeoutMs / 1000);
|
|
113
|
-
const output = `Lint command timed out after ${String(seconds)}s and was skipped so validate can complete within MCP request limits. ` +
|
|
114
|
-
`Run \`${plan.executedCommand}\` manually before marking the spec done, or set PLANU_VALIDATE_LINT_TIMEOUT_MS for an explicit full lint pass.`;
|
|
115
113
|
console.warn(`[Planu] lintCheck timed out: command="${plan.executedCommand}" cwd="${projectPath}" timeoutMs=${String(timeoutMs)}`);
|
|
114
|
+
if (context.projectId) {
|
|
115
|
+
const receipt = readMatchingValidationEvidence(context.projectId, evidenceInput);
|
|
116
|
+
if (receipt) {
|
|
117
|
+
return {
|
|
118
|
+
passed: true,
|
|
119
|
+
command,
|
|
120
|
+
issueCount: 0,
|
|
121
|
+
output: `(reused lint evidence ${receipt.key} recorded ${receipt.completedAt} after in-run timeout)`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const output = `Lint gate failed: lint timed out after ${String(seconds)}s and could not be verified. ` +
|
|
126
|
+
'Validate reuses recorded lint evidence for an unchanged tree on the next run, so re-running validate after a successful in-process lint pass clears the gate. ' +
|
|
127
|
+
'PLANU_VALIDATE_LINT_TIMEOUT_MS only applies when the MCP server process is started with it set.';
|
|
116
128
|
if (context.projectId) {
|
|
117
129
|
recordValidationOutcome({
|
|
118
130
|
projectId: context.projectId,
|
|
@@ -123,8 +135,8 @@ export async function runLintCheck(projectPath, lintCommand, context = {}) {
|
|
|
123
135
|
durationMs: timeoutMs,
|
|
124
136
|
output,
|
|
125
137
|
reason: context.specId
|
|
126
|
-
? `Lint exceeded its deadline while validating ${context.specId}; the
|
|
127
|
-
: 'Lint exceeded its canonical deadline; the
|
|
138
|
+
? `Lint exceeded its deadline while validating ${context.specId}; the gate remains failing until lint evidence exists.`
|
|
139
|
+
: 'Lint exceeded its canonical deadline; the gate remains failing until lint evidence exists.',
|
|
128
140
|
source: 'local:planu-validate',
|
|
129
141
|
});
|
|
130
142
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planu/cli",
|
|
3
|
-
"version": "5.3.
|
|
3
|
+
"version": "5.3.20",
|
|
4
4
|
"description": "Planu — MCP Server for Spec Driven Development with native Rust acceleration for hot paths. Cross-platform (Linux/macOS/Windows, x64/arm64, glibc/musl).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -35,14 +35,14 @@
|
|
|
35
35
|
"packageName": "@planu/core"
|
|
36
36
|
},
|
|
37
37
|
"optionalDependencies": {
|
|
38
|
-
"@planu/core-darwin-arm64": "5.3.
|
|
39
|
-
"@planu/core-darwin-x64": "5.3.
|
|
40
|
-
"@planu/core-linux-arm64-gnu": "5.3.
|
|
41
|
-
"@planu/core-linux-arm64-musl": "5.3.
|
|
42
|
-
"@planu/core-linux-x64-gnu": "5.3.
|
|
43
|
-
"@planu/core-linux-x64-musl": "5.3.
|
|
44
|
-
"@planu/core-win32-arm64-msvc": "5.3.
|
|
45
|
-
"@planu/core-win32-x64-msvc": "5.3.
|
|
38
|
+
"@planu/core-darwin-arm64": "5.3.20",
|
|
39
|
+
"@planu/core-darwin-x64": "5.3.20",
|
|
40
|
+
"@planu/core-linux-arm64-gnu": "5.3.20",
|
|
41
|
+
"@planu/core-linux-arm64-musl": "5.3.20",
|
|
42
|
+
"@planu/core-linux-x64-gnu": "5.3.20",
|
|
43
|
+
"@planu/core-linux-x64-musl": "5.3.20",
|
|
44
|
+
"@planu/core-win32-arm64-msvc": "5.3.20",
|
|
45
|
+
"@planu/core-win32-x64-msvc": "5.3.20"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
48
|
"node": ">=24.0.0"
|
package/planu-native.json
CHANGED
package/planu-plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dev.planu.cli",
|
|
3
3
|
"displayName": "Planu — Spec Driven Development",
|
|
4
4
|
"description": "Manage software specs, estimations, and autonomous SDD workflows. Language-agnostic MCP server for Claude Code.",
|
|
5
|
-
"version": "5.3.
|
|
5
|
+
"version": "5.3.20",
|
|
6
6
|
"icon": "assets/plugin/icon.svg",
|
|
7
7
|
"command": ["npx", "@planu/cli@latest"],
|
|
8
8
|
"packageName": "@planu/cli",
|