@planu/cli 5.3.21 → 5.3.23

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.
Files changed (25) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/config/runtime-policy.json +3 -3
  3. package/dist/engine/framework-detector.js +4 -2
  4. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
  5. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
  6. package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
  7. package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
  8. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
  9. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
  10. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
  11. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
  12. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
  13. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
  14. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
  15. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
  16. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
  17. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
  18. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
  19. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
  20. package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -1
  21. package/dist/tools/create-spec.d.ts +21 -0
  22. package/dist/tools/create-spec.js +92 -2
  23. package/package.json +14 -13
  24. package/planu-native.json +1 -1
  25. package/planu-plugin.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ ## [5.3.23] - 2026-08-13
2
+
3
+ ### Bug Fixes
4
+ - fix(spec-1520): exclude paths whose only mention negates the work from grounded modify targets
5
+
6
+
7
+ ## [5.3.22] - 2026-08-13
8
+
9
+ ### Bug Fixes
10
+ - fix(spec-1523): bind isolated rebuild sidecar provenance to the build-source commit
11
+ - fix(spec-1521): pin native provenance across the lockfile-integrity amend
12
+ - fix(spec-1519): bound acknowledgement latency at a tail ceiling, not a bare SLO constant
13
+ - fix(spec-1518): scope PLANU_RELEASE_MODE out of the source-quality phase
14
+ - fix(spec-1518): scope release-build env out of the source-quality phase
15
+ - fix(deps): drop vulnerable extract-zip by forcing puppeteer-core 25
16
+ - fix(spec-1506,spec-1507): align release invariant and lint budget with shipped behaviour
17
+ - fix(spec-1506,spec-1507): correct native lockfile integrity and uncache every gate
18
+
19
+
1
20
  ## [5.3.21] - 2026-08-12
2
21
 
3
22
  ### Bug Fixes
@@ -14,7 +14,7 @@
14
14
  "maximumOutputBufferBytes": 67108864
15
15
  },
16
16
  "lintValidation": {
17
- "defaultTimeoutMs": 180000,
17
+ "defaultTimeoutMs": 420000,
18
18
  "minimumTimeoutMs": 1000,
19
19
  "maximumTimeoutMs": 1800000
20
20
  },
@@ -28,8 +28,8 @@
28
28
  },
29
29
  "validation": {
30
30
  "defaultDeadlineMs": 1800000,
31
- "durableLintTimeoutMs": 170000,
32
- "perGateTimeoutMs": 180000,
31
+ "durableLintTimeoutMs": 420000,
32
+ "perGateTimeoutMs": 450000,
33
33
  "complianceCommandTimeoutMs": 900000,
34
34
  "noProgressTimeoutMs": 960000,
35
35
  "submissionLockWaitMs": 180,
@@ -221,6 +221,7 @@ export async function detectTestCommand(projectPath, packageManager) {
221
221
  }
222
222
  return null;
223
223
  }
224
+ const LINT_SCRIPT_PREFERENCE = ['lint:gate', 'lint:ci', 'lint'];
224
225
  /**
225
226
  * Detect lint command from project config files.
226
227
  */
@@ -228,8 +229,9 @@ export async function detectLintCommand(projectPath, packageManager) {
228
229
  const pkgJson = await readJsonFile(join(projectPath, 'package.json'));
229
230
  if (pkgJson) {
230
231
  const scripts = pkgJson.scripts;
231
- if (scripts?.lint) {
232
- return `${pmRunner(packageManager)} run lint`;
232
+ const scriptName = LINT_SCRIPT_PREFERENCE.find((name) => typeof scripts?.[name] === 'string' && scripts[name] !== '');
233
+ if (scriptName) {
234
+ return `${pmRunner(packageManager)} run ${scriptName}`;
233
235
  }
234
236
  }
235
237
  if (await hasAnyFile(projectPath, ['.eslintrc*', 'eslint.config.*'])) {
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-aarch64-apple-darwin",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "5d0ff6b13b11d1d071a61c8211bc7b65453a8f8b42a1e7fe53d3d1c073980e02",
20
+ "artifactSha256": "df04e55326ab8279dfddd1e0607a66b7b4fa6e0893f32c9c5adff2326a60a2a0",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-arm64.node.sbom.json",
24
- "sha256": "b81e5b05dc2ff4921b39f56e4bae1e469d71216fbb9e4a20275d756197d75641"
24
+ "sha256": "be63f58e999d18e1ba92aea4ddbd6eeab4dcf8de3a574d30d78b0eb18f6dd654"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
28
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "HRtAs/3Ma0OGaM9v+KVToQwspvBMKMKJWkE5Go3rkhNXRBwb7IbEsBKlD4gqWLGmVd49uOxpLnRy1PxNo+GqBQ=="
37
+ "value": "jEbAh2q227j0tKF5GzCx49OKaaBSZwkjGFSgODdawYyMMzQJR/8bwBQl4eZaRMRalLv4O5VCrT87z6oIwf53AQ=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "5d0ff6b13b11d1d071a61c8211bc7b65453a8f8b42a1e7fe53d3d1c073980e02"
14
+ "content": "df04e55326ab8279dfddd1e0607a66b7b4fa6e0893f32c9c5adff2326a60a2a0"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
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.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-x86_64-apple-darwin",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "e3af2d3036901b1778b46508e77170ddfef0cbc09cc2fb09d29c223d06779154",
20
+ "artifactSha256": "3c8382e950e1dd36777d61fa7b60bc01d1af28fb33834bd94e48b499510a3d4e",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-x64.node.sbom.json",
24
- "sha256": "bd6287e7353ae8709d9876a1cfcea2a4718354b23d32ae86716dd9da0a38f9e8"
24
+ "sha256": "1b319f2b236037e49c739cf5e240629987526680ce6f1784aca3067ab6144ac4"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
28
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "MZGaYaJeFNHlC7jAh7+bMWMJNofvy7/ekl5xdw0az+E0uoZ8ykviCSqdyeEnhRxkR6/wDTcLdltd7UzwNlSAAw=="
37
+ "value": "JpzKHUqqDdXB83C4dEwzlMntsYfBkkpt/oGrayfIT7v9UpUZ9T2+gIckQ0t9eLzhkfvjrScu/SxaN/+YuBSeAw=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "e3af2d3036901b1778b46508e77170ddfef0cbc09cc2fb09d29c223d06779154"
14
+ "content": "3c8382e950e1dd36777d61fa7b60bc01d1af28fb33834bd94e48b499510a3d4e"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
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.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-aarch64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "7fb817e968e4e81ba34be0892ac79ede2e0aa242e925cca3fe8679250605aa54",
19
+ "artifactSha256": "581c4631563fd02aad49300b604d8becb71b6eec6d515e8525724f5e8a76d3e7",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-gnu.node.sbom.json",
23
- "sha256": "8a42027ee50329c7eb8f998216c46fab5af8585a87d16aad4c5bdda12b33b9eb"
23
+ "sha256": "d24b2ccaf35573cd5cb80fc16bd902aee49c23510d6517831164a38763a90608"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
27
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "ilcDZiYvq7FNQJ+mGY1o9F6/uXQvC/nt8UMCfidVYkHRHf8QubwKk5UQlBH72YMWNaupYt9eRTJR1sWebfPKDw=="
36
+ "value": "raQa9KCXmVn19QcQHXWWqd4TUl2+Ma2FIqr0FK7SSQV6FCSfiDB+kTUsO0eaXrRRgg15hyQWik5LWS/MWku0Dg=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "7fb817e968e4e81ba34be0892ac79ede2e0aa242e925cca3fe8679250605aa54"
14
+ "content": "581c4631563fd02aad49300b604d8becb71b6eec6d515e8525724f5e8a76d3e7"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
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.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-aarch64-unknown-linux-musl",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "7339b70e762159aa7fc532b986ac8cb08c633fd4ca8c7ae121d13347a84f1a6c",
19
+ "artifactSha256": "f7161362df7874b4560ff697df62d350bb24e7d53540cd5a6ee92e2fe7478f36",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-musl.node.sbom.json",
23
- "sha256": "6dac227097031af87e8e3c135ce415da2001de1bb9157b1f7dbb66204ea5019f"
23
+ "sha256": "81da3a46f573b41a15d0407cd887c12c5cd6cbc8a8afe6a4c43159815c2361a0"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
27
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "XcWqYU0xSmU4nObgPLy7epaTov4h8+1X/8M45JLz0dsjOZaxm0eMBmp3GWOODR9LUfvRlzCVBL5RCEhp/ndRAg=="
36
+ "value": "2trXRLuXKSXjQH7wa6wJ/w2TLkj1AaabBArFyWzO0Kg578fHTXbPtTirjOCKKX2kOu3YikOqYcGtRko0fqzWBA=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "7339b70e762159aa7fc532b986ac8cb08c633fd4ca8c7ae121d13347a84f1a6c"
14
+ "content": "f7161362df7874b4560ff697df62d350bb24e7d53540cd5a6ee92e2fe7478f36"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
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.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-x86_64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "bec4c162f4a52ed21acae13828cd8c781ec473462f68ab5e0d5eda9bb12802d9",
19
+ "artifactSha256": "7dc81ad00268ae85e7f5421d33d0c83b3b1f51bc43290f3cb0d2b89bafd9c4e7",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-gnu.node.sbom.json",
23
- "sha256": "0d8dc076ab389395ead5ddca3a53d961f97d67945050bc235655e0a9e54261a4"
23
+ "sha256": "80ffb59c763c08d107de1e6ddb1bd2ceb6d77d705d060af6ad154a7a5dd8a4cd"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
27
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "GuawhQm5O0s3MXcu4HvaERIaKsh38aEgSY1mPESMfQght82rNpVRH1h3ZKfd30i1gq9OX37u1SBbbQMX1kGsDg=="
36
+ "value": "jvFw6dFcAM34ZZVPqtPZ5DjV/ZovZGrmKkTP4lIgJomxnlp4T7XTxacU57Q7rXPypfxyt94m/WkZvdCkonm+AA=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "bec4c162f4a52ed21acae13828cd8c781ec473462f68ab5e0d5eda9bb12802d9"
14
+ "content": "7dc81ad00268ae85e7f5421d33d0c83b3b1f51bc43290f3cb0d2b89bafd9c4e7"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
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.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-x86_64-unknown-linux-musl",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "85e7874f28199b762acb1333c6cda22d35c9edb6a6d7b36ec41f0818e41e4a08",
19
+ "artifactSha256": "4d54714a12ef1863a00369ac90da8d7ae3548818dc838d66dd856e00c073a298",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-musl.node.sbom.json",
23
- "sha256": "4eb2a14c4032e907fdfb03591f7adb44c9388b818d901b924a5a8634105744e7"
23
+ "sha256": "16140edf7ef98106200cd68aed27910378b7896412f10e110bb3128861e73f9b"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
27
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "AT5DF8UCW6bCBxgX7qjZS0sjS0z311BKwt5AjhBncOJcuHgU84VGvK3nLfgCqbLGwO2ZlaRVKOjBWi5oHAiyBA=="
36
+ "value": "Uzzec4U5e20u2dFSwP11L+cTyMyUWQ/4QqA+VtTD8ZOqIC7nfuFHajyE15/jWiODhNv6N4DEqAafrJ7En8gdDg=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "85e7874f28199b762acb1333c6cda22d35c9edb6a6d7b36ec41f0818e41e4a08"
14
+ "content": "4d54714a12ef1863a00369ac90da8d7ae3548818dc838d66dd856e00c073a298"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
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.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-aarch64-pc-windows-msvc",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "6a1e5acdb098a3ac13938e1cf86248650f2b8346cb0d95ad8dc1dca43aa83b16",
19
+ "artifactSha256": "f5e3c5aa3482f0f68f6c0306b83e46a957fa5a3d72adf0a42667e1a7c64557b4",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-arm64-msvc.node.sbom.json",
23
- "sha256": "91e7bc68013c5e27e526f0af43d2c187807f291c36190c7e5263f85a0bcce1b2"
23
+ "sha256": "4e64e359b4286ff8a5f46fe93dffa96d61c867ae041ad3f9a63257f97d73df32"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
27
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "iVieTwyF0EA4y4QaoJNSr47cvD1md8w1/VrJoPCEGVoTOPWIPcyEhZRPKMDxnuQRM2Eh0hsQONB4uLSrDcz+Dg=="
36
+ "value": "qo/Huts1HZBt65FaVIFISGQEWQl4ltLwbUQwatHHIEFkdCV9IS7dZV/FeSGFFkGaELdEgjT0RBW6DnifQMvgBg=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "6a1e5acdb098a3ac13938e1cf86248650f2b8346cb0d95ad8dc1dca43aa83b16"
14
+ "content": "f5e3c5aa3482f0f68f6c0306b83e46a957fa5a3d72adf0a42667e1a7c64557b4"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
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.21",
4
- "engineVersion": "5.3.21",
5
- "buildId": "1-5.3.21-x86_64-pc-windows-msvc",
3
+ "cliVersion": "5.3.23",
4
+ "engineVersion": "5.3.23",
5
+ "buildId": "1-5.3.23-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": "4ce52263d47492b6968e36e7d0722c80e785493028d9d524ca6ec24f960b221b",
19
+ "artifactSha256": "ff194a262e31bd30f9225c3980a9d2b52048c683ba55e9fca7263f41cb7ccdf5",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-x64-msvc.node.sbom.json",
23
- "sha256": "1daa636cf1b98c866795051183f5aea2e3f9110039e2167ade205fbf2b2c6b24"
23
+ "sha256": "5453a2e1fe0092ec6a24a64b8950bdf1764a3e4a0c9241992d003c0b681401ea"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "bedb8918a453fd7e20e704054f42f91211240a89",
27
+ "sourceCommit": "269abdfd76527c0cc945512d5d69ce483e38a97d",
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": "SMqrkN5zMjAiEWYX9KW4TKa94sW/O2fKw5G8b7/4yzDny0SMsQM/VJxgrw4W8aKht1SqKeHYySApm5llGkzGDQ=="
36
+ "value": "PUxswH5ZDjX5DdMMdF1I8emOHdaeug54P2D87YYqnWrOMbVPJ+PzXHTDrJA+J1CjbI1tpGNajl5raINMwHbaBA=="
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.21",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.23",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.21",
10
+ "version": "5.3.23",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "4ce52263d47492b6968e36e7d0722c80e785493028d9d524ca6ec24f960b221b"
14
+ "content": "ff194a262e31bd30f9225c3980a9d2b52048c683ba55e9fca7263f41cb7ccdf5"
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.21",
1109
+ "ref": "pkg:cargo/planu-core@5.3.23",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -8,7 +8,7 @@ Auto-generated by \`init_project\`. Do not edit manually.
8
8
  When implementation changes are complete and validated, always address release explicitly with a local-first flow:
9
9
 
10
10
  - canonical local gate: \`pnpm check:preflight\`
11
- - source-quality evidence binds the exact release commit, so a pre-bump run can never produce a receipt the release will accept; the full source-quality plan runs once, inside the release, after the bump commit exists
11
+ - source-quality evidence binds the exact release commit, so a pre-bump run can never produce a receipt the release will accept; the full source-quality plan runs inside the release, against the bump commit, and reruns whenever a later step rewrites that commit (for example the native-lockfile-integrity amend), since the prior receipt no longer binds the new sha
12
12
  - canonical local release command: \`pnpm release:local\`
13
13
  - publish externally only when the user has explicitly requested shipping/publishing
14
14
  - use \`main\` as the default release branch; treat \`develop\` as optional gitflow compatibility only when the repository actively uses it
@@ -1,5 +1,26 @@
1
1
  import type { CreateSpecInput, ToolResult } from '../types/index.js';
2
2
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { type LeanFileEntry } from '../engine/spec-format/lean-technical-generator.js';
4
+ import { type AutopilotAnalysis } from './create-spec/autopilot-analyzer.js';
5
+ import type { TechnicalReferenceGroundingRecord } from '../types/spec-grounding.js';
6
+ export declare function groundTechnicalFiles(input: {
7
+ files: {
8
+ create: LeanFileEntry[];
9
+ modify: LeanFileEntry[];
10
+ test: LeanFileEntry[];
11
+ };
12
+ projectPath: string;
13
+ userInput: string;
14
+ autopilot: AutopilotAnalysis;
15
+ }): Promise<{
16
+ files: {
17
+ create: LeanFileEntry[];
18
+ modify: LeanFileEntry[];
19
+ test: LeanFileEntry[];
20
+ };
21
+ records: TechnicalReferenceGroundingRecord[];
22
+ advisoryFiles: LeanFileEntry[];
23
+ }>;
3
24
  export declare function resolveGroundedVerificationCommands(projectPath: string, testPaths: string[]): Promise<string[]>;
4
25
  export declare function handleCreateSpec(inputParams: CreateSpecInput, server?: McpServer): Promise<ToolResult>;
5
26
  //# sourceMappingURL=create-spec.d.ts.map
@@ -102,7 +102,7 @@ async function resolveTechnicalFiles(input) {
102
102
  }
103
103
  return { create: [], modify: [], test: [] };
104
104
  }
105
- async function groundTechnicalFiles(input) {
105
+ export async function groundTechnicalFiles(input) {
106
106
  const userInput = input.userInput.toLowerCase();
107
107
  const autopilotPaths = new Set([
108
108
  ...input.autopilot.suggestedFiles.modify.map((file) => file.path),
@@ -118,7 +118,7 @@ async function groundTechnicalFiles(input) {
118
118
  const advisoryFiles = [];
119
119
  for (const section of ['create', 'modify', 'test']) {
120
120
  for (const file of input.files[section]) {
121
- const pathInUserInput = userInput.includes(file.path.toLowerCase());
121
+ const pathInUserInput = pathSurvivesNegativeClauseCheck(userInput, file.path.toLowerCase());
122
122
  const exists = await pathExists(pathJoin(input.projectPath, file.path));
123
123
  const fromAutopilot = autopilotPaths.has(file.path);
124
124
  const derivedTest = section === 'test' && isDerivedFromGroundedSource(file.path, grounded.modify);
@@ -146,6 +146,96 @@ async function groundTechnicalFiles(input) {
146
146
  }
147
147
  return { files: grounded, records, advisoryFiles };
148
148
  }
149
+ const NEGATIVE_WORK_CLAUSE_RE = /\b(?:remains? unchanged|is not touched|not touched|must not (?:change|be changed|be modified|touch|be touched)|unchanged|out of scope)\b/;
150
+ const CLAUSE_DELIMITERS = ['\n', '. ', '; ', ', and ', ', but '];
151
+ const SENTENCE_DELIMITERS = ['\n', '. '];
152
+ const BACK_REFERENCE_SUBJECT_RE = /^(?:and\s+|but\s+)?(?:it|they|this|that|these|those)\s+(?:must|remains?|stays?|is|are|was|were|should|shall|will|cannot|can|does|do)\b/;
153
+ const PATH_LIKE_TOKEN_RE = /\S+\/\S*\.\w+/;
154
+ const CLAUSE_SPLIT_RE = new RegExp(CLAUSE_DELIMITERS.map((delimiter) => delimiter.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
155
+ function computeDelimitedBounds(text, matchIndex, matchLength, delimiters) {
156
+ const startCandidates = delimiters.map((delimiter) => {
157
+ const index = text.lastIndexOf(delimiter, matchIndex);
158
+ return index === -1 ? -1 : index + delimiter.length;
159
+ });
160
+ const start = Math.max(0, ...startCandidates);
161
+ const searchAfter = matchIndex + matchLength;
162
+ const endCandidates = delimiters
163
+ .map((delimiter) => text.indexOf(delimiter, searchAfter))
164
+ .filter((value) => value !== -1);
165
+ const end = endCandidates.length > 0 ? Math.min(...endCandidates) : text.length;
166
+ return [start, end];
167
+ }
168
+ function findClauseBounds(text, matchIndex, matchLength) {
169
+ return computeDelimitedBounds(text, matchIndex, matchLength, CLAUSE_DELIMITERS);
170
+ }
171
+ function findSentenceBounds(text, matchIndex, matchLength) {
172
+ return computeDelimitedBounds(text, matchIndex, matchLength, SENTENCE_DELIMITERS);
173
+ }
174
+ function splitClausesWithOffsets(sentence, sentenceStart) {
175
+ const clauses = [];
176
+ let cursor = 0;
177
+ CLAUSE_SPLIT_RE.lastIndex = 0;
178
+ let delimiterMatch = CLAUSE_SPLIT_RE.exec(sentence);
179
+ while (delimiterMatch !== null) {
180
+ clauses.push([sentence.slice(cursor, delimiterMatch.index), sentenceStart + cursor]);
181
+ cursor = delimiterMatch.index + delimiterMatch[0].length;
182
+ delimiterMatch = CLAUSE_SPLIT_RE.exec(sentence);
183
+ }
184
+ clauses.push([sentence.slice(cursor), sentenceStart + cursor]);
185
+ return clauses;
186
+ }
187
+ function sentenceHasBackReferencedNegation(userInput, matchIndex, matchLength) {
188
+ const [sentenceStart, sentenceEnd] = findSentenceBounds(userInput, matchIndex, matchLength);
189
+ const sentence = userInput.slice(sentenceStart, sentenceEnd);
190
+ const clauses = splitClausesWithOffsets(sentence, sentenceStart);
191
+ const matchEnd = matchIndex + matchLength;
192
+ const currentClauseIndex = clauses.findIndex(([clauseText, clauseStart]) => matchIndex >= clauseStart && matchEnd <= clauseStart + clauseText.length);
193
+ if (currentClauseIndex === -1) {
194
+ return false;
195
+ }
196
+ const currentClauseEntry = clauses[currentClauseIndex];
197
+ if (currentClauseEntry === undefined) {
198
+ return false;
199
+ }
200
+ const [currentClauseText, currentClauseStart] = currentClauseEntry;
201
+ const currentClauseTail = currentClauseText.slice(matchEnd - currentClauseStart);
202
+ if (PATH_LIKE_TOKEN_RE.test(currentClauseTail)) {
203
+ return false;
204
+ }
205
+ for (let index = currentClauseIndex + 1; index < clauses.length; index += 1) {
206
+ const clauseEntry = clauses[index];
207
+ if (clauseEntry === undefined) {
208
+ continue;
209
+ }
210
+ const [clauseText] = clauseEntry;
211
+ if (PATH_LIKE_TOKEN_RE.test(clauseText)) {
212
+ return false;
213
+ }
214
+ const trimmedClause = clauseText.replace(/^\s+/, '');
215
+ if (BACK_REFERENCE_SUBJECT_RE.test(trimmedClause) &&
216
+ NEGATIVE_WORK_CLAUSE_RE.test(trimmedClause)) {
217
+ return true;
218
+ }
219
+ }
220
+ return false;
221
+ }
222
+ function pathSurvivesNegativeClauseCheck(userInput, lowerPath) {
223
+ let searchFrom = 0;
224
+ for (;;) {
225
+ const matchIndex = userInput.indexOf(lowerPath, searchFrom);
226
+ if (matchIndex === -1) {
227
+ return false;
228
+ }
229
+ const [clauseStart, clauseEnd] = findClauseBounds(userInput, matchIndex, lowerPath.length);
230
+ const clause = userInput.slice(clauseStart, clauseEnd);
231
+ const ownClauseNegated = NEGATIVE_WORK_CLAUSE_RE.test(clause);
232
+ const backReferencedNegation = sentenceHasBackReferencedNegation(userInput, matchIndex, lowerPath.length);
233
+ if (!ownClauseNegated && !backReferencedNegation) {
234
+ return true;
235
+ }
236
+ searchFrom = matchIndex + lowerPath.length;
237
+ }
238
+ }
149
239
  function isDerivedFromGroundedSource(testPath, modifyFiles) {
150
240
  return modifyFiles.some((file) => {
151
241
  const withoutSrc = file.path.startsWith('src/') ? file.path.slice(4) : file.path;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planu/cli",
3
- "version": "5.3.21",
3
+ "version": "5.3.23",
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",
@@ -36,14 +36,14 @@
36
36
  "packageName": "@planu/core"
37
37
  },
38
38
  "optionalDependencies": {
39
- "@planu/core-darwin-arm64": "5.3.21",
40
- "@planu/core-darwin-x64": "5.3.21",
41
- "@planu/core-linux-arm64-gnu": "5.3.21",
42
- "@planu/core-linux-arm64-musl": "5.3.21",
43
- "@planu/core-linux-x64-gnu": "5.3.21",
44
- "@planu/core-linux-x64-musl": "5.3.21",
45
- "@planu/core-win32-arm64-msvc": "5.3.21",
46
- "@planu/core-win32-x64-msvc": "5.3.21"
39
+ "@planu/core-darwin-arm64": "5.3.23",
40
+ "@planu/core-darwin-x64": "5.3.23",
41
+ "@planu/core-linux-arm64-gnu": "5.3.23",
42
+ "@planu/core-linux-arm64-musl": "5.3.23",
43
+ "@planu/core-linux-x64-gnu": "5.3.23",
44
+ "@planu/core-linux-x64-musl": "5.3.23",
45
+ "@planu/core-win32-arm64-msvc": "5.3.23",
46
+ "@planu/core-win32-x64-msvc": "5.3.23"
47
47
  },
48
48
  "engines": {
49
49
  "node": ">=24.0.0"
@@ -68,7 +68,8 @@
68
68
  "start": "node dist/index.js",
69
69
  "postpublish": "pnpm build",
70
70
  "clean": "rm -rf dist",
71
- "lint": "eslint src/ tests/ --max-warnings 0",
71
+ "lint": "eslint src/ tests/ --max-warnings 0 --cache --cache-strategy content --cache-location node_modules/.cache/eslint/",
72
+ "lint:gate": "eslint src/ tests/ --max-warnings 0",
72
73
  "lint:fix": "eslint src/ tests/ --fix --max-warnings 0",
73
74
  "format": "prettier --write 'src/**/*.ts' 'tests/**/*.test.ts'",
74
75
  "format:check": "prettier --check 'src/**/*.ts' 'tests/**/*.test.ts'",
@@ -87,10 +88,10 @@
87
88
  "native:project-graph:e2e": "PLANU_NATIVE_E2E=1 vitest run tests/integration/native-project-graph-e2e.test.ts",
88
89
  "native:project-graph:benchmark": "node scripts/benchmark-native-performance.mjs --operation project_graph_query --samples 30 --warmups 5 --project-path . --spec-id SPEC-1119 --json",
89
90
  "benchmark:execution-kernel": "pnpm build && node scripts/benchmark-execution-kernel.mjs",
90
- "check": "pnpm typecheck && pnpm lint && pnpm format:check && pnpm check:destructive-ops && pnpm check:release-authorities && pnpm check:commercial-surfaces && pnpm check:tool-registration && pnpm check:public-privacy && pnpm check:website-proof && pnpm check:donation-assets && pnpm check:website-public-assets",
91
+ "check": "pnpm typecheck && pnpm lint:gate && pnpm format:check && pnpm check:destructive-ops && pnpm check:release-authorities && pnpm check:commercial-surfaces && pnpm check:tool-registration && pnpm check:public-privacy && pnpm check:website-proof && pnpm check:donation-assets && pnpm check:website-public-assets",
91
92
  "check:destructive-ops": "bash scripts/check-no-automatic-destructive-ops.sh",
92
93
  "check:strict": "pnpm check && pnpm generate:host-tool-registry -- --check && pnpm check:native-version-parity && pnpm check:environment-schema && pnpm audit:hardcodes && pnpm audit:deadcode && pnpm audit:circular && pnpm audit:types && pnpm audit:security && pnpm audit:i18n",
93
- "check:preflight": "pnpm typecheck && pnpm lint && pnpm format:check && node scripts/check-public-privacy.mjs && node scripts/check-preflight.mjs",
94
+ "check:preflight": "pnpm typecheck && pnpm lint:gate && pnpm format:check && node scripts/check-public-privacy.mjs && node scripts/check-preflight.mjs",
94
95
  "check:reliability": "node scripts/check-reliability-policies.mjs",
95
96
  "check:environment-schema": "node scripts/check-environment-schema.mjs",
96
97
  "test:contracts": "vitest run tests/contracts tests/integration/package-consumer-hono.test.ts",
@@ -120,7 +121,7 @@
120
121
  "prepublishOnly": "bash scripts/prepublish-guard.sh",
121
122
  "prepack": "pnpm build:ts && pnpm package:size",
122
123
  "test:debug": "vitest run --inspect-brk --single-thread",
123
- "validate": "pnpm build && pnpm typecheck && pnpm verify:typescript-migration && pnpm lint && pnpm format:check && pnpm test:release-gate",
124
+ "validate": "pnpm build && pnpm typecheck && pnpm verify:typescript-migration && pnpm lint:gate && pnpm format:check && pnpm test:release-gate",
124
125
  "docker:build": "docker build -t planu .",
125
126
  "docker:run": "docker compose up",
126
127
  "publish:blog": "node scripts/publish-blog.mjs",
package/planu-native.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dev.planu.native",
3
3
  "displayName": "Planu Native Lightweight Surface",
4
- "version": "5.3.21",
4
+ "version": "5.3.23",
5
5
  "packageName": "@planu/cli",
6
6
  "modes": {
7
7
  "lightweight": {
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.21",
5
+ "version": "5.3.23",
6
6
  "icon": "assets/plugin/icon.svg",
7
7
  "command": ["npx", "@planu/cli@latest"],
8
8
  "packageName": "@planu/cli",