@planu/cli 5.1.1 → 5.3.0

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 (74) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/cli/commands/doctor.d.ts +22 -0
  3. package/dist/cli/commands/doctor.js +176 -2
  4. package/dist/config/environment-schema.json +161 -21
  5. package/dist/config/release-policy.json +0 -8
  6. package/dist/engine/autopilot/bootstrap.js +27 -0
  7. package/dist/engine/core-bridge.d.ts +28 -0
  8. package/dist/engine/core-bridge.js +67 -0
  9. package/dist/engine/drift-monitor.js +16 -18
  10. package/dist/engine/living-spec/hash-tracker.js +26 -28
  11. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
  12. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
  13. package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
  14. package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
  15. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
  16. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
  17. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
  18. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
  19. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
  20. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
  21. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
  22. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
  23. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
  24. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
  25. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
  26. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
  27. package/dist/engine/spec-language/english-only.d.ts +14 -0
  28. package/dist/engine/spec-language/english-only.js +58 -0
  29. package/dist/engine/spec-migrator/criteria-scanner.js +11 -13
  30. package/dist/engine/spec-migrator/drift-detector.js +10 -12
  31. package/dist/engine/validation/validation-freshness.d.ts +20 -1
  32. package/dist/engine/validation/validation-freshness.js +181 -21
  33. package/dist/engine/validator/analyzer.d.ts +5 -2
  34. package/dist/engine/validator/analyzer.js +81 -23
  35. package/dist/engine/validator/deep-code-checker.d.ts +10 -0
  36. package/dist/engine/validator/deep-code-checker.js +33 -0
  37. package/dist/engine/validator/test-evidence-grounding.d.ts +56 -0
  38. package/dist/engine/validator/test-evidence-grounding.js +187 -0
  39. package/dist/engine/validator.js +15 -4
  40. package/dist/engine/vector-store/tfidf.d.ts +13 -9
  41. package/dist/engine/vector-store/tfidf.js +26 -0
  42. package/dist/engine/worker-config-loader.d.ts +1 -1
  43. package/dist/engine/worker-config-loader.js +1 -11
  44. package/dist/engine/workers/schema.d.ts +0 -8
  45. package/dist/engine/workers/schema.js +0 -1
  46. package/dist/i18n/index.d.ts +18 -0
  47. package/dist/i18n/index.js +40 -1
  48. package/dist/storage/global-store.d.ts +9 -0
  49. package/dist/storage/global-store.js +23 -0
  50. package/dist/storage/semantic-index-store.d.ts +23 -0
  51. package/dist/storage/semantic-index-store.js +105 -0
  52. package/dist/storage/status-store/self-healing.js +15 -17
  53. package/dist/tools/challenge-spec/scenarios-utils.js +5 -1
  54. package/dist/tools/create-spec.js +60 -15
  55. package/dist/tools/init-project/handler.js +78 -25
  56. package/dist/tools/learn.js +10 -8
  57. package/dist/tools/registry/auth.js +1 -11
  58. package/dist/tools/semantic-search-handler.js +5 -6
  59. package/dist/tools/status-handler.js +19 -6
  60. package/dist/tools/validate.js +6 -2
  61. package/dist/tools/validation-loop-handler.js +16 -15
  62. package/dist/types/analysis.d.ts +2 -0
  63. package/dist/types/spec-language-translation.d.ts +18 -0
  64. package/dist/types/spec-language-translation.js +5 -0
  65. package/dist/types/spec-registry.d.ts +0 -2
  66. package/dist/types/status.d.ts +2 -0
  67. package/dist/types/validation-receipt.d.ts +7 -0
  68. package/dist/types/vector-store.d.ts +18 -0
  69. package/dist/types/workers.d.ts +0 -3
  70. package/package.json +20 -20
  71. package/planu-native.json +8 -29
  72. package/planu-plugin.json +1 -1
  73. package/dist/engine/security/cve-refresher.d.ts +0 -12
  74. package/dist/engine/security/cve-refresher.js +0 -128
@@ -12,6 +12,7 @@ import { detectMusl } from './native-platform.js';
12
12
  import { findDuplicateBlocks } from './core-bridge-duplicate-blocks.js';
13
13
  import { appendGapEntry, verifyGapsChain } from './core-bridge-gaps.js';
14
14
  import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
15
+ import { runNativeWorkerOperation } from './execution/native-worker-runtime.js';
15
16
  export { negotiateNativeRuntime, NATIVE_CAPABILITY_ABI, NATIVE_NODE_API_ABI, NATIVE_PROTOCOL_ABI, RUNTIME_STORAGE_SCHEMA, };
16
17
  const require = createRequire(import.meta.url);
17
18
  const reportedDegradations = new Set();
@@ -678,9 +679,75 @@ export function fastSelectCompactGraphSlice(seeds, nodes, edges, policy, overrid
678
679
  }
679
680
  return tsSelectCompactGraphSlice(seeds, nodes, edges, limits);
680
681
  }
682
+ // Main-thread dispatch strategy (SPEC-1344) -----------------------------------
683
+ // getNative() deliberately returns null on the main thread so long native FFI
684
+ // calls never block the event loop (see comment above getNative()). For hot
685
+ // paths that need acceleration anyway, dispatchViaWorker() moves the call onto
686
+ // the existing native-worker-dispatch.ts runtime (a worker thread, where
687
+ // isMainThread is false and native loads normally). If the worker fails to
688
+ // spawn, times out, or the operation isn't allowlisted, it falls back to the
689
+ // caller-supplied synchronous implementation so behavior never regresses.
690
+ const WORKER_DISPATCH_TIMEOUT_MS = 30_000;
691
+ const DEGRADATION_NOTICE_THRESHOLD_MS = 2_000;
692
+ async function dispatchViaWorker(operation, payload, projectId, syncFallback) {
693
+ const start = Date.now();
694
+ if (isMainThread && process.env.DISABLE_NATIVE_CORE !== '1') {
695
+ try {
696
+ const value = (await runNativeWorkerOperation({
697
+ operation,
698
+ payload,
699
+ projectId,
700
+ deadlineAt: start + WORKER_DISPATCH_TIMEOUT_MS,
701
+ }));
702
+ return { value };
703
+ }
704
+ catch (error) {
705
+ /* reliability-optional: NATIVE_WORKER_DISPATCH_FAILED — falls through to sync fallback */
706
+ reportOnce(`NATIVE_WORKER_DISPATCH_FAILED:${operation}`, () => {
707
+ reportClassifiedDegradation('NATIVE_WORKER_DISPATCH_FAILED', error instanceof Error ? error : FALLBACK_ERROR);
708
+ });
709
+ }
710
+ }
711
+ const value = syncFallback();
712
+ const elapsedMs = Date.now() - start;
713
+ if (elapsedMs > DEGRADATION_NOTICE_THRESHOLD_MS) {
714
+ return {
715
+ value,
716
+ degradationNotice: `native engine unavailable — run planu doctor (fallback took ${String(elapsedMs)}ms)`,
717
+ };
718
+ }
719
+ return { value };
720
+ }
721
+ /** Worker-dispatched variant of {@link fastDetectDriftParallel} for main-thread callers. */
722
+ export async function fastDetectDriftParallelAsync(rootPath, keywords) {
723
+ return dispatchViaWorker('detect-drift', { rootPath, keywords }, fastHashProjectPath(rootPath), () => fastDetectDriftParallel(rootPath, keywords));
724
+ }
725
+ /** Worker-dispatched variant of {@link fastScanAndHashFiles} for main-thread callers. */
726
+ export async function fastScanAndHashFilesAsync(rootPath) {
727
+ return dispatchViaWorker('scan-and-hash-files', { rootPath }, fastHashProjectPath(rootPath), () => fastScanAndHashFiles(rootPath));
728
+ }
729
+ /** Worker-dispatched variant of {@link fastScanProjectMetadata} for main-thread callers. */
730
+ export async function fastScanProjectMetadataAsync(rootPath) {
731
+ return dispatchViaWorker('scan-project-metadata', { rootPath }, fastHashProjectPath(rootPath), () => fastScanProjectMetadata(rootPath));
732
+ }
733
+ /** Worker-dispatched variant of {@link fastScanSpecs} for main-thread callers. */
734
+ export async function fastScanSpecsAsync(rootPath) {
735
+ return dispatchViaWorker('scan-specs', { rootPath }, fastHashProjectPath(rootPath), () => fastScanSpecs(rootPath));
736
+ }
681
737
  export const isNativeActive = () => getNative() !== null;
682
738
  export const nativeLoadDiagnostic = () => {
683
739
  refreshNativeCapabilityDiagnostic();
684
740
  return loadDiagnostic;
685
741
  };
742
+ /**
743
+ * Force a native load attempt regardless of the calling thread and return the
744
+ * resulting diagnostic. `nativeLoadDiagnostic()` alone only reports load state
745
+ * that some other main-thread-bypassing caller already triggered (e.g. the
746
+ * macOS Keychain port); this is the main-thread-safe way to actually probe
747
+ * native availability, used by `planu doctor`.
748
+ */
749
+ export const probeNativeLoad = () => {
750
+ loadNative();
751
+ return nativeLoadDiagnostic();
752
+ };
686
753
  //# sourceMappingURL=core-bridge.js.map
@@ -2,7 +2,7 @@
2
2
  import fs from 'node:fs';
3
3
  import { readFile, stat } from 'node:fs/promises';
4
4
  import path from 'node:path';
5
- import { fastScanProjectMetadata, isNativeActive, fastDetectDriftParallel, } from './core-bridge.js';
5
+ import { fastScanProjectMetadataAsync, fastDetectDriftParallelAsync, } from './core-bridge.js';
6
6
  import { readSpecTechnicalSection } from './spec-format/read-technical-section.js';
7
7
  // ---------------------------------------------------------------------------
8
8
  // Config builder
@@ -41,13 +41,11 @@ export async function computeSummaryReport(projectPath, specList, config, rules,
41
41
  const alerts = [];
42
42
  let drifted = 0;
43
43
  let clean = 0;
44
- // Layer 3 (AC coverage) Optimization:
45
- // If native is active, we can do a single parallel scan for keywords across ALL specs.
46
- // This is much faster than doing it one-by-one.
47
- const nativeActive = isNativeActive();
48
- const metadataMap = nativeActive
49
- ? new Map(fastScanProjectMetadata(projectPath).map((m) => [m.path, m]))
50
- : undefined;
44
+ // Layer 3 (AC coverage) Optimization: a single project-wide metadata scan
45
+ // (worker-dispatched when native is available) is much faster than doing it
46
+ // spec-by-spec.
47
+ const { value: projectMetadata } = await fastScanProjectMetadataAsync(projectPath);
48
+ const metadataMap = new Map(projectMetadata.map((m) => [m.path, m]));
51
49
  for (const specId of specList) {
52
50
  const technicalPath = specTechnicalPaths?.get(specId);
53
51
  const { score: healthScore } = await computeDriftScore(projectPath, specId, undefined, technicalPath, metadataMap);
@@ -272,19 +270,19 @@ async function computeAcCoverageScore(criteria, filePaths) {
272
270
  return 100;
273
271
  }
274
272
  let foundTerms;
275
- if (isNativeActive()) {
276
- // Use Rust to find which terms appear in implementation files across the WHOLE project.
277
- // Note: Rust already does parallel walking and multi-threaded search.
278
- // We pass any directory/file from the spec, but Rust will scan efficiently.
279
- const firstFile = existingFiles[0];
280
- if (!firstFile) {
281
- return 100;
282
- }
273
+ const firstFile = existingFiles[0];
274
+ if (!firstFile) {
275
+ return 100;
276
+ }
277
+ try {
278
+ // Worker-dispatched (native when available) parallel search across the WHOLE
279
+ // project rooted at the first file's dir — much faster than reading files
280
+ // one by one, and never blocks the main thread's event loop.
283
281
  const rootPath = path.dirname(firstFile); // Use first file's dir as heuristic
284
- const result = fastDetectDriftParallel(rootPath, [...allTerms]);
282
+ const { value: result } = await fastDetectDriftParallelAsync(rootPath, [...allTerms]);
285
283
  foundTerms = new Set(result.foundKeywords);
286
284
  }
287
- else {
285
+ catch {
288
286
  // Fallback: Read all implementation files once
289
287
  const fileContents = [];
290
288
  for (const filePath of existingFiles) {
@@ -3,7 +3,7 @@
3
3
  import { createHash } from 'node:crypto';
4
4
  import { readFile, stat } from 'node:fs/promises';
5
5
  import { join } from 'node:path';
6
- import { fastScanAndHashFiles, isNativeActive } from '../core-bridge.js';
6
+ import { fastScanAndHashFilesAsync } from '../core-bridge.js';
7
7
  /**
8
8
  * Compute SHA-256 hash of a file's content.
9
9
  */
@@ -34,38 +34,36 @@ export async function createFileHashEntry(projectPath, relativePath) {
34
34
  * Create hash entries for multiple files.
35
35
  */
36
36
  export async function createFileHashEntries(projectPath, relativePaths) {
37
- // Try native Rust implementation for bulk hashing
38
- if (isNativeActive()) {
39
- try {
40
- const results = fastScanAndHashFiles(projectPath);
41
- const resultMap = new Map(results.map((r) => [r.path, r.hash]));
42
- const entries = [];
43
- for (const rel of relativePaths) {
44
- const fullPath = join(projectPath, rel);
45
- const hash = resultMap.get(fullPath);
46
- if (hash) {
47
- try {
48
- const s = await stat(fullPath);
49
- entries.push({
50
- file: rel,
51
- hash,
52
- size: s.size,
53
- snapshotAt: new Date().toISOString(),
54
- });
55
- }
56
- catch {
57
- // File might have disappeared between scan and stat
58
- }
37
+ // Try the accelerated bulk-hash path (worker-dispatched native, or the TS fallback).
38
+ try {
39
+ const { value: results } = await fastScanAndHashFilesAsync(projectPath);
40
+ const resultMap = new Map(results.map((r) => [r.path, r.hash]));
41
+ const entries = [];
42
+ for (const rel of relativePaths) {
43
+ const fullPath = join(projectPath, rel);
44
+ const hash = resultMap.get(fullPath);
45
+ if (hash) {
46
+ try {
47
+ const s = await stat(fullPath);
48
+ entries.push({
49
+ file: rel,
50
+ hash,
51
+ size: s.size,
52
+ snapshotAt: new Date().toISOString(),
53
+ });
54
+ }
55
+ catch {
56
+ // File might have disappeared between scan and stat
59
57
  }
60
- }
61
- if (entries.length > 0) {
62
- return entries;
63
58
  }
64
59
  }
65
- catch (err) {
66
- console.warn('[Planu-RS] Native bulk hash failed, falling back to Node.', err);
60
+ if (entries.length > 0) {
61
+ return entries;
67
62
  }
68
63
  }
64
+ catch (err) {
65
+ console.warn('[Planu-RS] Bulk hash failed, falling back to Node.', err);
66
+ }
69
67
  const entries = [];
70
68
  for (const relativePath of relativePaths) {
71
69
  const entry = await createFileHashEntry(projectPath, relativePath);
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.1.1",
4
- "engineVersion": "5.1.1",
5
- "buildId": "1-5.1.1-aarch64-apple-darwin",
3
+ "cliVersion": "5.3.0",
4
+ "engineVersion": "5.3.0",
5
+ "buildId": "1-5.3.0-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": "3791a7635fda74d3c0c5a226115ac4ab78c98afc366d0451a107ed1419139873",
20
+ "artifactSha256": "07ca15496c8d00f9b1d56fc7147677079936735e0424cf94e55f3b76fd1a4557",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-arm64.node.sbom.json",
24
- "sha256": "434d0491e2130ac49b7eb34989f5ae2135f3ad9f54f0042f5bb3ba660bd2c568"
24
+ "sha256": "e53a5bcc426cd99534ce6f7e7934c810c8947959bc954791530bbf204206f595"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "5046eff43d23641fe60bd1c01e8c34277172db16",
28
+ "sourceCommit": "0bfc16bd342cfaa8ee48da5d9a1484df65bca782",
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": "7kFQj3Sq5rFuMciulVbszYysMir4sSVuTrgLv0exAYSmkfwj16xag4ldwYRCJky/EXeCn1ZYZYJvfuCNEqZ5DQ=="
37
+ "value": "xvRryyeJ5xYiQfQvv4CpxlvDfuUBXdeeTJGxnjoXsl9xzG2lpqT8ChZAcJrde0DEfyzfUkMYS24z2tk/3rapCQ=="
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.1.1",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.0",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.1.1",
10
+ "version": "5.3.0",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "3791a7635fda74d3c0c5a226115ac4ab78c98afc366d0451a107ed1419139873"
14
+ "content": "07ca15496c8d00f9b1d56fc7147677079936735e0424cf94e55f3b76fd1a4557"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.1.1",
1109
+ "ref": "pkg:cargo/planu-core@5.3.0",
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.1.1",
4
- "engineVersion": "5.1.1",
5
- "buildId": "1-5.1.1-x86_64-apple-darwin",
3
+ "cliVersion": "5.3.0",
4
+ "engineVersion": "5.3.0",
5
+ "buildId": "1-5.3.0-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": "339ab4dad5834869aebc0130b8c63e0863d665daf0a98d8e795f08ea51bab51c",
20
+ "artifactSha256": "ac6926aab84f664e90e0fe75598b5a175a9952f57143c0a7cc560b00c8fc144c",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-x64.node.sbom.json",
24
- "sha256": "d52bf3925938ed40201a07f6a0190694d9cfd924393ebba6d47f818c8ee79c17"
24
+ "sha256": "39d80491638f2d1049abd0d2eecd79b231bce01d54752fe5dfad915112a56180"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "5046eff43d23641fe60bd1c01e8c34277172db16",
28
+ "sourceCommit": "0bfc16bd342cfaa8ee48da5d9a1484df65bca782",
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": "MBGihzcPhQf/7suo2XjxUz8kuC6zpZeVnNXlIjI/a14CCARPeI1gE67dWBIvVJuJ0dMmXeLfsw39quYQQNqdCg=="
37
+ "value": "NjrWMYeOEazMOJpQQFUI+bOzrlvWKvBNehPqMqSHcQwW+TXNU/jn6EBbJKrkbywWNwdyE/UwCTZon7bi0ZaTAQ=="
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.1.1",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.0",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.1.1",
10
+ "version": "5.3.0",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "339ab4dad5834869aebc0130b8c63e0863d665daf0a98d8e795f08ea51bab51c"
14
+ "content": "ac6926aab84f664e90e0fe75598b5a175a9952f57143c0a7cc560b00c8fc144c"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.1.1",
1109
+ "ref": "pkg:cargo/planu-core@5.3.0",
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.1.1",
4
- "engineVersion": "5.1.1",
5
- "buildId": "1-5.1.1-aarch64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.0",
4
+ "engineVersion": "5.3.0",
5
+ "buildId": "1-5.3.0-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": "2542d4e3bae8c5a133b12ba13d8a0c993a538f348ecf706233485f3a306bca90",
19
+ "artifactSha256": "e81c28d359720a6e89c79c5425b0a60ffefd133f89774729a39252332a7d8098",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-gnu.node.sbom.json",
23
- "sha256": "25f989810c53995c30a21a50c704a34474c27256db590ae51cac100ce35fcd26"
23
+ "sha256": "6a9041cc34a0207f9cc42268313ab93bdce4df29f6152c2ec35d7eedc3fdc20f"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "5046eff43d23641fe60bd1c01e8c34277172db16",
27
+ "sourceCommit": "0bfc16bd342cfaa8ee48da5d9a1484df65bca782",
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": "93RLQe2yAbcJh8j2gfJbQBv/BTTWX0DeGUJHLP6HbfOd6s0xtpWrjO0E7egpfso6uO34ZLD6aQ/M0kTtbBfMCg=="
36
+ "value": "nvRlOzgPcI6wLyjx8m+Pz/kbAeA1AF5DyiJ1OE55S7tOhpeiAoH+0YdYKIawJe5AdhVWHP6IYc81N1c7tnrGBg=="
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.1.1",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.0",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.1.1",
10
+ "version": "5.3.0",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "2542d4e3bae8c5a133b12ba13d8a0c993a538f348ecf706233485f3a306bca90"
14
+ "content": "e81c28d359720a6e89c79c5425b0a60ffefd133f89774729a39252332a7d8098"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.1.1",
1109
+ "ref": "pkg:cargo/planu-core@5.3.0",
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.1.1",
4
- "engineVersion": "5.1.1",
5
- "buildId": "1-5.1.1-aarch64-unknown-linux-musl",
3
+ "cliVersion": "5.3.0",
4
+ "engineVersion": "5.3.0",
5
+ "buildId": "1-5.3.0-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": "27daadea51d3517b399d38b202581d8305a9d8c5e70ce9610cabd7c17c0829e0",
19
+ "artifactSha256": "b0d4c6c83b85af40d685e0e005624c34b2a20d295f74c58615293322b42ba965",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-musl.node.sbom.json",
23
- "sha256": "8e530dc7631981619d307b862f92c5080d30c660a2f33161a58046c5231ea283"
23
+ "sha256": "16178e0bb9e2714e0e06b3a58c29fad539bf3c4c72eedd5f42fd4878fbf0079e"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "5046eff43d23641fe60bd1c01e8c34277172db16",
27
+ "sourceCommit": "0bfc16bd342cfaa8ee48da5d9a1484df65bca782",
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": "n5TSEXesZev/RV5YkPBgs7tAan7bHgicPP6qBiQBcdb2bxsv29MnR379peX7Y3yzzC7SXPeReY/qTqmqAvhYBg=="
36
+ "value": "mwwwq8vQTDPmmIZ4ssE1UjYXd6UnhDmchDD+x/vqjr6HAIW2I4+q1mrf6vQ7X1ln/J+9lxJymJlyu4dA0QBTDQ=="
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.1.1",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.0",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.1.1",
10
+ "version": "5.3.0",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "27daadea51d3517b399d38b202581d8305a9d8c5e70ce9610cabd7c17c0829e0"
14
+ "content": "b0d4c6c83b85af40d685e0e005624c34b2a20d295f74c58615293322b42ba965"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.1.1",
1109
+ "ref": "pkg:cargo/planu-core@5.3.0",
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.1.1",
4
- "engineVersion": "5.1.1",
5
- "buildId": "1-5.1.1-x86_64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.0",
4
+ "engineVersion": "5.3.0",
5
+ "buildId": "1-5.3.0-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": "ea63379c34998117ea301e635aa3654859b6ad91a0b905833b3bc11374cf84c9",
19
+ "artifactSha256": "9981b33dbbe44fcab6da8e909a24d6b21317cfdd771946e65dba41879bb2972c",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-gnu.node.sbom.json",
23
- "sha256": "656e983e468fdc2428180bd064ba8cb93db5cf895cf87a44a056552e280f3641"
23
+ "sha256": "a1a11390578e9504f2552572f013ef11c11b5c09d65ad3fd6c01f4cba17d3304"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "5046eff43d23641fe60bd1c01e8c34277172db16",
27
+ "sourceCommit": "0bfc16bd342cfaa8ee48da5d9a1484df65bca782",
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": "OWDWv7CxpzTCEf/CRLzLJeQKwtRiL/0SU3UfIs7gJ+oi+c6r9LllBSgrIi58woPLny0lZAa1jYHDNT6NqUJMAg=="
36
+ "value": "GcnOf/uVsph+kbzNir1EE5CBIzYB1bxBPIKm5BwVbmVSi7niwWlAuTgD8rHChM6yS47Y3Ms8nIxfy8oGXD3bBw=="
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.1.1",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.0",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.1.1",
10
+ "version": "5.3.0",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "ea63379c34998117ea301e635aa3654859b6ad91a0b905833b3bc11374cf84c9"
14
+ "content": "9981b33dbbe44fcab6da8e909a24d6b21317cfdd771946e65dba41879bb2972c"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.1.1",
1109
+ "ref": "pkg:cargo/planu-core@5.3.0",
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.1.1",
4
- "engineVersion": "5.1.1",
5
- "buildId": "1-5.1.1-x86_64-unknown-linux-musl",
3
+ "cliVersion": "5.3.0",
4
+ "engineVersion": "5.3.0",
5
+ "buildId": "1-5.3.0-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": "f987d5d169ccd0326adcfbb03f78f87896f1e15dfd6db5484d0c7129d5ef0ce9",
19
+ "artifactSha256": "a3c5cd549a2eb667ff1c150faf23f1cfe22e87f7e556b0aa7209aa13a18f45e9",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-musl.node.sbom.json",
23
- "sha256": "0ac824e4122bfd76300ca92e059687bbab4c2bd9c1fc95feaf69de7f90b3e129"
23
+ "sha256": "9890f076625256c5408d5ffec463f0935b8d7005e61d0b29761144f5cb40e17a"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "5046eff43d23641fe60bd1c01e8c34277172db16",
27
+ "sourceCommit": "0bfc16bd342cfaa8ee48da5d9a1484df65bca782",
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": "rqKJhE/atBoQnOkGJFjjk5mkYyw00+XTkNJH2vpnTA09fTPQ3K19wrRxVULioQYYkRNB/6W3JSCGZcRv4EeJCQ=="
36
+ "value": "ZZXH8px6SzGDX2vLSXgEitX+Mu7eyXQ3kJeb9jFqMFLHInwMGMHtNY/LQgDvbOyzJAfskZUFf3JkqaTK6/9VDw=="
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.1.1",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.0",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.1.1",
10
+ "version": "5.3.0",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "f987d5d169ccd0326adcfbb03f78f87896f1e15dfd6db5484d0c7129d5ef0ce9"
14
+ "content": "a3c5cd549a2eb667ff1c150faf23f1cfe22e87f7e556b0aa7209aa13a18f45e9"
15
15
  }
16
16
  ]
17
17
  }
@@ -1106,7 +1106,7 @@
1106
1106
  "dependsOn": []
1107
1107
  },
1108
1108
  {
1109
- "ref": "pkg:cargo/planu-core@5.1.1",
1109
+ "ref": "pkg:cargo/planu-core@5.3.0",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",