@planu/cli 5.3.16 → 5.3.17

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 (27) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/engine/evidence-gates/evidence-autofill.d.ts +5 -0
  3. package/dist/engine/evidence-gates/evidence-autofill.js +51 -8
  4. package/dist/engine/evidence-index/done-drift.d.ts +1 -0
  5. package/dist/engine/evidence-index/done-drift.js +32 -16
  6. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
  7. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
  8. package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
  9. package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
  10. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
  11. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
  12. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
  13. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
  14. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
  15. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
  16. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
  17. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
  18. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
  19. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
  20. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
  21. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
  22. package/dist/tools/update-status/evidence-gate.js +6 -1
  23. package/dist/tools/update-status/index.js +2 -1
  24. package/dist/types/evidence-autofill.d.ts +2 -0
  25. package/package.json +9 -9
  26. package/planu-native.json +1 -1
  27. package/planu-plugin.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [5.3.17] - 2026-08-11
2
+
3
+ ### Bug Fixes
4
+ - fix(spec-1487): normalize spec paths in toRepoRelativePath per implementation-review arbitration
5
+ - fix(spec-1487): exclude Planu bookkeeping paths from traceability autofill and done drift gate
6
+
7
+ ### Chores
8
+ - chore(specs): record SPEC-1487 done transition
9
+ - chore(spec-1487): record implementation-review round and approved scope amendment
10
+
11
+
1
12
  ## [5.3.16] - 2026-08-11
2
13
 
3
14
  ### Bug Fixes
@@ -1,4 +1,9 @@
1
1
  import type { AutofillTraceabilityMatrixArgs, AutofillTraceabilityMatrixResult } from '../../types/evidence-autofill.js';
2
+ /** Exact Planu lifecycle files every spec branch mutates; never counted as implementation drift. */
3
+ export declare const PLANU_BOOKKEEPING_FILES: readonly ['planu/context.md', 'planu/session-context.md', 'planu/session.json', 'planu/status.json', 'planu/releases/pending.json', 'planu/conventions.json'];
4
+ /** Normalizes a spec.md path (absolute or already repo-relative) to a repo-relative,
5
+ * forward-slash path so it can be compared against `git diff` output. */
6
+ export declare function toRepoRelativePath(specPath: string, projectPath?: string): string;
2
7
  /**
3
8
  * Generate `traceability-matrix.json` in the handoff evidence store when it does
4
9
  * not already exist. Never overwrites an existing file — if one is present this
@@ -19,7 +19,7 @@
19
19
  // legacy harnesses, etc.).
20
20
  import { execFile } from 'node:child_process';
21
21
  import { existsSync } from 'node:fs';
22
- import { isAbsolute, join, resolve } from 'node:path';
22
+ import { isAbsolute, join, relative, resolve } from 'node:path';
23
23
  import { promisify } from 'node:util';
24
24
  import { extractAcceptanceCriteriaTexts } from '../spec-format/acceptance-criteria.js';
25
25
  import { parseFrontmatterScenarios } from '../validator/spec-compliance-runner.js';
@@ -35,7 +35,28 @@ const defaultExec = async (command, args, options) => {
35
35
  const { stdout } = await execFileAsync(command, args, { cwd: options.cwd, encoding: 'utf-8' });
36
36
  return stdout;
37
37
  };
38
- /** Best-effort `git diff --name-only <mergeBase>...HEAD`; never throws. */
38
+ /** Exact Planu lifecycle files every spec branch mutates; never counted as implementation drift. */
39
+ export const PLANU_BOOKKEEPING_FILES = [
40
+ 'planu/context.md',
41
+ 'planu/session-context.md',
42
+ 'planu/session.json',
43
+ 'planu/status.json',
44
+ 'planu/releases/pending.json',
45
+ 'planu/conventions.json',
46
+ ];
47
+ const OTHER_SPEC_MD_PATTERN = /^planu\/specs\/[^/]+\/spec\.md$/;
48
+ /** Normalizes a spec.md path (absolute or already repo-relative) to a repo-relative,
49
+ * forward-slash path so it can be compared against `git diff` output. */
50
+ export function toRepoRelativePath(specPath, projectPath) {
51
+ if (isAbsolute(specPath) && !projectPath) {
52
+ const normalized = specPath.replace(/\\/g, '/');
53
+ const specsIndex = normalized.lastIndexOf('planu/specs/');
54
+ return specsIndex === -1 ? normalized : normalized.slice(specsIndex);
55
+ }
56
+ const relativePath = isAbsolute(specPath) && projectPath ? relative(projectPath, specPath) : specPath;
57
+ return relativePath.replace(/\\/g, '/').replace(/^(\.\/)+/, '');
58
+ }
59
+ /** Best-effort `git diff --name-status <mergeBase>...HEAD`; never throws. */
39
60
  async function computeChangedFilesFromGit(projectPath, exec, baseBranch) {
40
61
  try {
41
62
  const mergeBaseOut = await exec('git', ['merge-base', 'HEAD', baseBranch], {
@@ -45,13 +66,20 @@ async function computeChangedFilesFromGit(projectPath, exec, baseBranch) {
45
66
  if (!mergeBase) {
46
67
  return [];
47
68
  }
48
- const diffOut = await exec('git', ['diff', '--name-only', `${mergeBase}...HEAD`], {
69
+ const diffOut = await exec('git', ['diff', '--name-status', `${mergeBase}...HEAD`], {
49
70
  cwd: projectPath,
50
71
  });
51
72
  return diffOut
52
73
  .split('\n')
53
74
  .map((line) => line.trim())
54
- .filter((line) => line.length > 0);
75
+ .filter((line) => line.length > 0)
76
+ .map((line) => {
77
+ const fields = line.split('\t');
78
+ const path = fields[fields.length - 1] ?? '';
79
+ const status = (fields[0] ?? '').startsWith('A') ? 'Added' : 'Other';
80
+ return { status, path };
81
+ })
82
+ .filter((entry) => entry.path.length > 0);
55
83
  }
56
84
  catch (error) {
57
85
  /* reliability-optional: EVIDENCE_AUTOFILL_GIT_DIFF — falls back to ## Files ownership */
@@ -59,6 +87,18 @@ async function computeChangedFilesFromGit(projectPath, exec, baseBranch) {
59
87
  return [];
60
88
  }
61
89
  }
90
+ /** Drops Planu bookkeeping paths, this spec's own spec.md, and newly Added other-spec
91
+ * spec.md files — the diff still surfaces unowned src/ paths and Modified other-spec
92
+ * contracts so the done drift gate can flag genuine scope drift. */
93
+ function excludeBookkeepingChanges(entries, ownSpecMdPath) {
94
+ const bookkeeping = new Set(PLANU_BOOKKEEPING_FILES);
95
+ const kept = entries
96
+ .filter((entry) => !bookkeeping.has(entry.path))
97
+ .filter((entry) => entry.path !== ownSpecMdPath)
98
+ .filter((entry) => !(entry.status === 'Added' && OTHER_SPEC_MD_PATTERN.test(entry.path)))
99
+ .map((entry) => entry.path);
100
+ return [...new Set(kept)];
101
+ }
62
102
  function filterExistingRepoFiles(projectPath, paths) {
63
103
  return paths.filter((path) => {
64
104
  if (isAbsolute(path)) {
@@ -111,15 +151,18 @@ export async function autofillTraceabilityMatrix(args) {
111
151
  const scenarios = parseFrontmatterScenarios(args.specBody);
112
152
  const exec = args.exec ?? defaultExec;
113
153
  const baseBranch = args.baseBranch ?? 'main';
114
- const gitChangedFiles = args.projectPath
154
+ const gitEntries = args.projectPath
115
155
  ? await computeChangedFilesFromGit(args.projectPath, exec, baseBranch)
116
156
  : [];
157
+ const gitChangedFiles = excludeBookkeepingChanges(gitEntries, args.ownSpecMdPath);
117
158
  const ownership = extractCanonicalFileOwnership(args.specBody);
118
159
  const ownershipFiles = [...ownership.toCreate, ...ownership.toModify, ...ownership.toTest];
119
160
  const rawChangedFiles = gitChangedFiles.length > 0 ? gitChangedFiles : ownershipFiles;
120
- const changedFiles = args.projectPath
121
- ? filterExistingRepoFiles(args.projectPath, rawChangedFiles)
122
- : rawChangedFiles;
161
+ const changedFiles = [
162
+ ...new Set(args.projectPath
163
+ ? filterExistingRepoFiles(args.projectPath, rawChangedFiles)
164
+ : rawChangedFiles),
165
+ ];
123
166
  const { validationEvidence, reviewerEvidence } = await readValidationReportSummary(args.projectId, args.specId);
124
167
  const rows = criteria.map((acceptanceCriterion, index) => {
125
168
  const testPaths = scenarios[index]?.tests?.map((test) => test.path) ?? [];
@@ -2,5 +2,6 @@ import type { EvidenceGateIssue, SpecEvidenceIndex } from '../../types/index.js'
2
2
  export declare function checkDoneDriftContract(args: {
3
3
  index: SpecEvidenceIndex;
4
4
  approvedScopePaths: readonly string[];
5
+ ownSpecMdPath?: string;
5
6
  }): EvidenceGateIssue[];
6
7
  //# sourceMappingURL=done-drift.d.ts.map
@@ -1,8 +1,38 @@
1
1
  import { normalizeChangedFilePath } from '../handoff-packager.js';
2
+ import { PLANU_BOOKKEEPING_FILES } from '../evidence-gates/evidence-autofill.js';
2
3
  function normalizedChangedFile(value) {
3
4
  const normalized = normalizeChangedFilePath(value);
4
5
  return normalized.status === 'valid' ? normalized.path : null;
5
6
  }
7
+ function buildNeverDriftPaths(ownSpecMdPath) {
8
+ const neverDriftPaths = new Set(PLANU_BOOKKEEPING_FILES);
9
+ const normalizedOwnSpecMdPath = ownSpecMdPath ? normalizedChangedFile(ownSpecMdPath) : null;
10
+ if (normalizedOwnSpecMdPath) {
11
+ neverDriftPaths.add(normalizedOwnSpecMdPath);
12
+ }
13
+ return neverDriftPaths;
14
+ }
15
+ function findUnapprovedChangedFiles(index, approved, neverDriftPaths) {
16
+ return index.criteria.flatMap((entry) => {
17
+ const hasScopeAmendment = entry.evidence.some((record) => record.kind === 'reviewer' && /scope amendment|approved scope/i.test(record.value));
18
+ if (hasScopeAmendment) {
19
+ return [];
20
+ }
21
+ return entry.evidence.flatMap((record) => {
22
+ if (record.kind !== 'changed-file' ||
23
+ (record.status !== 'valid' && record.status !== 'missing')) {
24
+ return [];
25
+ }
26
+ const normalized = normalizedChangedFile(record.value);
27
+ if (normalized && neverDriftPaths.has(normalized)) {
28
+ return [];
29
+ }
30
+ return normalized && approved.has(normalized)
31
+ ? []
32
+ : [`${entry.criterion}: ${normalized ?? 'invalid changed-file path'}`];
33
+ });
34
+ });
35
+ }
6
36
  export function checkDoneDriftContract(args) {
7
37
  const issues = [];
8
38
  const uncovered = args.index.criteria.filter((entry) => {
@@ -39,22 +69,8 @@ export function checkDoneDriftContract(args) {
39
69
  return normalized ? [normalized] : [];
40
70
  });
41
71
  const approved = new Set(approvedScopePaths);
42
- const unapproved = args.index.criteria.flatMap((entry) => {
43
- const hasScopeAmendment = entry.evidence.some((record) => record.kind === 'reviewer' && /scope amendment|approved scope/i.test(record.value));
44
- if (hasScopeAmendment) {
45
- return [];
46
- }
47
- return entry.evidence.flatMap((record) => {
48
- if (record.kind !== 'changed-file' ||
49
- (record.status !== 'valid' && record.status !== 'missing')) {
50
- return [];
51
- }
52
- const normalized = normalizedChangedFile(record.value);
53
- return normalized && approved.has(normalized)
54
- ? []
55
- : [`${entry.criterion}: ${normalized ?? 'invalid changed-file path'}`];
56
- });
57
- });
72
+ const neverDriftPaths = buildNeverDriftPaths(args.ownSpecMdPath);
73
+ const unapproved = findUnapprovedChangedFiles(args.index, approved, neverDriftPaths);
58
74
  if (unapproved.length > 0) {
59
75
  const approvedHint = approvedScopePaths.length > 0
60
76
  ? ` Approved canonical paths: ${approvedScopePaths.join(', ')}.`
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "cliVersion": "5.3.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-aarch64-apple-darwin",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "2a6db4c53e8d2e492a44dc8c276b3f1ec9e00f20056225221aa142752a9dfb4b",
20
+ "artifactSha256": "bdc99fce3b870c27eafdd54b37d2822c37255eb3694c425ad6b651c6f5b97ac8",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-arm64.node.sbom.json",
24
- "sha256": "6bfb518a006ae80f0a94328c6fc0be1fa7d86b9a5bab2d7476a80fc8171dfd71"
24
+ "sha256": "11343948562c3b7f3bd3c819a0656a2fa9321431e1022850cda9e9ba5320f90c"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
28
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "6QDQPYqy6xJ4RHk+SGv1DdPTxgQDQCG63NMTaK2Kk72npIDR7g6h/mCKNLhFDXPALcS7kjqKRijf/PzRqnmCBQ=="
37
+ "value": "VfCh5vWrZxDxMM6pCO1dpKf/FxS8hZDqFZlvpwtTd6GweAYf2mzdaWMZkNA/a6r0y7gzGfUVuzplXQ64t2w3Cg=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "2a6db4c53e8d2e492a44dc8c276b3f1ec9e00f20056225221aa142752a9dfb4b"
14
+ "content": "bdc99fce3b870c27eafdd54b37d2822c37255eb3694c425ad6b651c6f5b97ac8"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
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.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-x86_64-apple-darwin",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "be5de1bbcd0f9b4989aa82c5b51f0a7425c3eb1fa9dfd772cc362f476db433f5",
20
+ "artifactSha256": "bae60566a531f74f27a61531acb737a62c0b4d2c5d748cd8619421452c355d5e",
21
21
  "sbom": {
22
22
  "format": "CycloneDX-1.5",
23
23
  "path": "planu-core.darwin-x64.node.sbom.json",
24
- "sha256": "38a7cc4b3d77c4414c58fd23af446914e84db52dd937e13b763da35b1962ab1e"
24
+ "sha256": "817d459d6609a5434eb192614d137f2fa63e3fd9908587d05207b584eba246eb"
25
25
  },
26
26
  "provenance": {
27
27
  "builder": "scripts/build-rust-local.sh",
28
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
28
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "7X8ph1LL1pB4hXlWcXD109sTeHzyRTa94ozW52TdCg6y1LIH1kNwuz4rU0g0KK4CLpnanRpeLpu7NODRGiP2AQ=="
37
+ "value": "HYqjCJjOvAVvkaW7hxI5rJ57eE+48Dd58M+y2/+RU+Qt+ddPDofOh1syhVCQmAHb/1IqORN+/sHSFy/bLK/bAg=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "be5de1bbcd0f9b4989aa82c5b51f0a7425c3eb1fa9dfd772cc362f476db433f5"
14
+ "content": "bae60566a531f74f27a61531acb737a62c0b4d2c5d748cd8619421452c355d5e"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
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.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-aarch64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "01d8ce2cb696744dc58095e8ff7fb2be6afcbccf467b0cd0eb538b6be530e210",
19
+ "artifactSha256": "6079ee86b8ee1e650cfd2602f039eb28d3d91e15d8377e712eb851b3ec4746c4",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-gnu.node.sbom.json",
23
- "sha256": "5eb69bed870789d764c02f63f0371c51872314e22a888c60af9842c35f536a4b"
23
+ "sha256": "c0fd691552bdaa6095d5c8220a3d7e5679d6f38ddc22919a552c0e98ad53d734"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
27
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "EJcdFkXbSIapzhu002fZ/X4QRUCpbJjwj4AYsg0G2BiERBQjMavAeiXqVNLr75Jt84NRmcOqXhidCvaEV0snCQ=="
36
+ "value": "85bAzK82CMXtjrkBbdc3D8X+9wN4/tsyeTzr/MZ5BmyWAe1D4jikLwJ4SW+ioyS+dDshLRCUgrUXSIUsjj0PAg=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "01d8ce2cb696744dc58095e8ff7fb2be6afcbccf467b0cd0eb538b6be530e210"
14
+ "content": "6079ee86b8ee1e650cfd2602f039eb28d3d91e15d8377e712eb851b3ec4746c4"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
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.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-aarch64-unknown-linux-musl",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "9b0683851a369169cda5c0e4141df24a59f94da03fdf7b8fc1230da65e38eb36",
19
+ "artifactSha256": "e6ee0ad20445313dbed5b14cbd5333a49ae08197ba4fa642e7292ff23bcbb2cf",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-arm64-musl.node.sbom.json",
23
- "sha256": "463cb73768477635328836a2a13d34038a2c7aeb83de4d17212274135af77e9e"
23
+ "sha256": "e2a76a395f0d058a97fd17388b74530059c4c80800515463480c73849b01659a"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
27
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "LGOiA63xus7b3/9w0/8qTyrKDhkRV0y3EMRV7F5NHxj8oDGqLz81viGJvBU+iri4Xhh0Ku03hxoD377vhE4TBQ=="
36
+ "value": "LUWtVfzWce5DbAtjGkmxVudiKCoD8sqcxuzz7wG1uUCyrZ8rMN7foWoytKdNdID7if12WlSVvFDME63D9Ls/BA=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "9b0683851a369169cda5c0e4141df24a59f94da03fdf7b8fc1230da65e38eb36"
14
+ "content": "e6ee0ad20445313dbed5b14cbd5333a49ae08197ba4fa642e7292ff23bcbb2cf"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
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.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-x86_64-unknown-linux-gnu",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "2d8c9186e43c03eb451a9772c3dac7931039e5326997364bc2bcc5aa38726b48",
19
+ "artifactSha256": "b10b9708c07c07e43b9acc098dc7887b4940bedad5e4e85ac4062b554100cd59",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-gnu.node.sbom.json",
23
- "sha256": "a27023f31bf2290b52d4e344d1859f3bbb49f5a19ce9998800987440ce834964"
23
+ "sha256": "b05d18430dca3a6fb1ba1c2e493326d2cd2f6072d469721c31088811efb6274d"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
27
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "FEn6GiPlQVBmOEc8zw6SxFzCxNF9OfYAakAa36oR0r5fbCQBFBgfbuuKGdLar7rdnaU3vcgiexCzHJIuYdwFCg=="
36
+ "value": "1R1IPcr3P53ndUQe0CtgdHIKbrMFWNMDTNiPjcabQavBBnisW6crL1EcueYHY+1hiMMcRRX8j3OXCrzteE/wAw=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "2d8c9186e43c03eb451a9772c3dac7931039e5326997364bc2bcc5aa38726b48"
14
+ "content": "b10b9708c07c07e43b9acc098dc7887b4940bedad5e4e85ac4062b554100cd59"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
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.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-x86_64-unknown-linux-musl",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "50547de5b23c0671447358eebc95d3841a2ce278236f5000655182ffb998d547",
19
+ "artifactSha256": "e32cde49858959e41c0df273dcb2e7c49412c4432ae983f358c19c6f8f705796",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.linux-x64-musl.node.sbom.json",
23
- "sha256": "a074e28e92546729d7347be57236bd8a0678ea1396fd756770915db6efecfa18"
23
+ "sha256": "2d4f452d04f8d5e536ae26d5e0321d0bc3d61a87b62b4833edd80ed2a6a5e98f"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
27
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "qvTXfNiZUTxm+mdb2A7/P6wjxEhdCr9WIVZkzDDOoxu4k4NgFeBmrSGKdRays0RSEivQ9f23gnvhS1myJ+DIAQ=="
36
+ "value": "hl7v/J/DAlDB3yKZ6KPCBz78JEXS6/Y77mT7dM3Q5xABC13P6gTFl4/ts6HFQBC/ILPBJAIe+M2jjNVXPTJRAg=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "50547de5b23c0671447358eebc95d3841a2ce278236f5000655182ffb998d547"
14
+ "content": "e32cde49858959e41c0df273dcb2e7c49412c4432ae983f358c19c6f8f705796"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
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.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-aarch64-pc-windows-msvc",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "151f0906eac861f554ce19ede7347d8267048f67aeb71b5f2521c7eaf8fbc034",
19
+ "artifactSha256": "abe713832d59d280780993de17bfe271501f3c6e368cc7660fd73cfe448f855b",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-arm64-msvc.node.sbom.json",
23
- "sha256": "2acb3f0615fee3f77ca7be0110f41c245b760d81811c0299a57aac2f7aa15fc9"
23
+ "sha256": "fedb07ccec7d0db216ee7cf665995024312f4222579437d1b2f4dd99f024f6d9"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
27
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "qMuwIDaEU/3JJj3BuHx/uv8ZCDScOhZGUSHuIKSS64I31OESsH7QuSd6+7QYT9THm5hb0nxuol3BtyyQ3AX3Dg=="
36
+ "value": "cvRigJR42Bz/XnqcHBVMdkfCDTUK3468XFQxFJfwA+dgdffXXne/hZYvu2+Qtc5VDPh+VI/gDgy4S+JjNjXIAw=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "151f0906eac861f554ce19ede7347d8267048f67aeb71b5f2521c7eaf8fbc034"
14
+ "content": "abe713832d59d280780993de17bfe271501f3c6e368cc7660fd73cfe448f855b"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
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.16",
4
- "engineVersion": "5.3.16",
5
- "buildId": "1-5.3.16-x86_64-pc-windows-msvc",
3
+ "cliVersion": "5.3.17",
4
+ "engineVersion": "5.3.17",
5
+ "buildId": "1-5.3.17-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": "b002099edf523c6aa0ca6f658a19514ff0a20ccf154bd88e4e205d49d9135590",
19
+ "artifactSha256": "142bcb2e061e280bf04929920bd88189ad37b14913f39bdd499bf45e287a53eb",
20
20
  "sbom": {
21
21
  "format": "CycloneDX-1.5",
22
22
  "path": "planu-core.win32-x64-msvc.node.sbom.json",
23
- "sha256": "c1b0d2ac50e19c7133dccb297d19f3a317125bfd88e87508ae0743acba413c5f"
23
+ "sha256": "e2345850af3b261c8eac493694d218e9b770c1deeac3131bf62e55655054b29f"
24
24
  },
25
25
  "provenance": {
26
26
  "builder": "scripts/build-rust-local.sh",
27
- "sourceCommit": "0cde0ff71b6b07e6bb7c059c7f03a7a58910e221",
27
+ "sourceCommit": "903b141393635e71607722637a08977e153b8b56",
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": "wQa0ygTquWBg4jFcHX8+sVqOETbJGfViThB7wyshllPFfdCF8s8chApggB+dgjCJd6qz2JaI1aJyifFFsIF9BQ=="
36
+ "value": "IQNeo8h8MLaX/wTJMVV3zdR1F1gX7oV9gLw58botIZo4c/OKtyXpiTQ3iRhXu/hpNQ1rs+hSb7C0AWCt+u6nAA=="
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.16",
7
+ "bom-ref": "pkg:cargo/planu-core@5.3.17",
8
8
  "type": "library",
9
9
  "name": "planu-core",
10
- "version": "5.3.16",
10
+ "version": "5.3.17",
11
11
  "hashes": [
12
12
  {
13
13
  "alg": "SHA-256",
14
- "content": "b002099edf523c6aa0ca6f658a19514ff0a20ccf154bd88e4e205d49d9135590"
14
+ "content": "142bcb2e061e280bf04929920bd88189ad37b14913f39bdd499bf45e287a53eb"
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.16",
1109
+ "ref": "pkg:cargo/planu-core@5.3.17",
1110
1110
  "dependsOn": [
1111
1111
  "pkg:cargo/core-foundation@0.10.1",
1112
1112
  "pkg:cargo/hmac@0.12.1",
@@ -57,6 +57,7 @@ import { readEvidenceArtifacts } from '../../engine/evidence-gates/artifact-read
57
57
  import { checkLifecycleEvidenceGate } from '../../engine/evidence-gates/lifecycle-gate.js';
58
58
  import { buildSpecEvidenceIndex } from '../../engine/evidence-index/index-builder.js';
59
59
  import { checkDoneDriftContract } from '../../engine/evidence-index/done-drift.js';
60
+ import { toRepoRelativePath } from '../../engine/evidence-gates/evidence-autofill.js';
60
61
  import { parseGroundedTechnicalPaths } from '../../engine/spec-grounding/contract.js';
61
62
  import { extractAcceptanceCriteriaTexts } from '../../engine/spec-format/acceptance-criteria.js';
62
63
  import { formatKeyValue } from '../output-formatter.js';
@@ -168,7 +169,11 @@ export async function checkLifecycleEvidenceTransitionGate(args) {
168
169
  message: `Approved canonical ownership is invalid: ${[...new Set(safeBlockers)].join(', ')}.`,
169
170
  });
170
171
  }
171
- result.issues.push(...checkDoneDriftContract({ index, approvedScopePaths }));
172
+ result.issues.push(...checkDoneDriftContract({
173
+ index,
174
+ approvedScopePaths,
175
+ ownSpecMdPath: toRepoRelativePath(args.spec.specPath, args.projectPath),
176
+ }));
172
177
  }
173
178
  if (result.issues.length === 0) {
174
179
  return null;
@@ -17,7 +17,7 @@ import { withApprovalSpecLock } from '../../storage/approval-operation-lock.js';
17
17
  import { isLocked, getLock } from '../../storage/spec-lock-store.js';
18
18
  import { checkDoneGates, checkComplianceGate, checkApprovedFormatGate, checkSpecReviewGate, deriveDoneReviewDigest, } from './dod-gates.js';
19
19
  import { checkLifecycleEvidenceTransitionGate } from './evidence-gate.js';
20
- import { autofillTraceabilityMatrix } from '../../engine/evidence-gates/evidence-autofill.js';
20
+ import { autofillTraceabilityMatrix, toRepoRelativePath, } from '../../engine/evidence-gates/evidence-autofill.js';
21
21
  import { buildStatusResponse, buildDryRunResponse } from './response-builder.js';
22
22
  import { recordDoneMetrics, syncSpecFiles, tryReconcile, recordTerminalTransitionEvent, } from './file-sync.js';
23
23
  import { appendEntry, getLastHash } from '../../storage/audit-trail-store.js';
@@ -165,6 +165,7 @@ async function runTraceabilityAutofillGate(args) {
165
165
  specId: args.specId,
166
166
  projectPath: args.projectPath,
167
167
  specBody,
168
+ ownSpecMdPath: toRepoRelativePath(args.spec.specPath, args.projectPath),
168
169
  });
169
170
  if (!result.written) {
170
171
  return null;
@@ -21,6 +21,8 @@ export interface AutofillTraceabilityMatrixArgs {
21
21
  exec?: EvidenceAutofillExec;
22
22
  /** Branch to diff against for changed-files detection. Defaults to `main`. */
23
23
  baseBranch?: string;
24
+ /** Repo-relative path of this spec's own spec.md, excluded from changedFiles as lifecycle bookkeeping. */
25
+ ownSpecMdPath?: string;
24
26
  }
25
27
  export type AutofillTraceabilityMatrixResult = {
26
28
  written: true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planu/cli",
3
- "version": "5.3.16",
3
+ "version": "5.3.17",
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.16",
39
- "@planu/core-darwin-x64": "5.3.16",
40
- "@planu/core-linux-arm64-gnu": "5.3.16",
41
- "@planu/core-linux-arm64-musl": "5.3.16",
42
- "@planu/core-linux-x64-gnu": "5.3.16",
43
- "@planu/core-linux-x64-musl": "5.3.16",
44
- "@planu/core-win32-arm64-msvc": "5.3.16",
45
- "@planu/core-win32-x64-msvc": "5.3.16"
38
+ "@planu/core-darwin-arm64": "5.3.17",
39
+ "@planu/core-darwin-x64": "5.3.17",
40
+ "@planu/core-linux-arm64-gnu": "5.3.17",
41
+ "@planu/core-linux-arm64-musl": "5.3.17",
42
+ "@planu/core-linux-x64-gnu": "5.3.17",
43
+ "@planu/core-linux-x64-musl": "5.3.17",
44
+ "@planu/core-win32-arm64-msvc": "5.3.17",
45
+ "@planu/core-win32-x64-msvc": "5.3.17"
46
46
  },
47
47
  "engines": {
48
48
  "node": ">=24.0.0"
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.16",
4
+ "version": "5.3.17",
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.16",
5
+ "version": "5.3.17",
6
6
  "icon": "assets/plugin/icon.svg",
7
7
  "command": ["npx", "@planu/cli@latest"],
8
8
  "packageName": "@planu/cli",