@planu/cli 5.3.0 → 5.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +1 -1
- package/dist/config/hook-templates/planu-session-safeguard.sh +14 -4
- package/dist/config/official-sdd-tools.d.ts +1 -1
- package/dist/config/official-sdd-tools.js +1 -0
- package/dist/config/registries/hosts/codex.json +2 -1
- package/dist/engine/handoff-packager.d.ts +3 -0
- package/dist/engine/handoff-packager.js +18 -3
- package/dist/engine/planu-core.darwin-arm64.node.manifest.json +7 -7
- package/dist/engine/planu-core.darwin-arm64.node.sbom.json +4 -4
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +7 -7
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +4 -4
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +7 -7
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +4 -4
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +4 -4
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +7 -7
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +4 -4
- package/dist/engine/session-safeguard/autopush.js +8 -2
- package/dist/tools/package-handoff.d.ts +2 -1
- package/dist/tools/package-handoff.js +23 -4
- package/dist/tools/reconcile-session-safeguard-hook.js +14 -3
- package/dist/tools/register-sdd-tools.js +2 -0
- package/dist/types/readiness.d.ts +1 -0
- package/package.json +9 -9
- package/planu-native.json +1 -1
- package/planu-plugin.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
## [5.3.2] - 2026-08-06
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
- fix(tools): restore declared bump_spec_version runtime tool (SPEC-1254)
|
|
5
|
+
- fix(handoff): address SPEC-1255 debate review findings
|
|
6
|
+
- fix(handoff): allow test-only specs to produce unblocked handoffs (SPEC-1255)
|
|
7
|
+
|
|
8
|
+
### Chores
|
|
9
|
+
- chore(planu): redact local paths from SPEC-1392 reproducer
|
|
10
|
+
- chore(planu): SPEC-1254 and SPEC-1255 done with debate-review evidence
|
|
11
|
+
- chore(planu): session checkpoint for debate-protocol batch
|
|
12
|
+
- chore(planu): approve SPEC-1254/1255/1271, file SPEC-1386..1391, add debate-review rule
|
|
13
|
+
- chore(planu): approve SPEC-1206 and SPEC-1250 with reviewer evidence, SPEC-1240 rework feedback
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## [5.3.1] - 2026-08-05
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
- fix(session-safeguard): abort detect via FETCH_HEAD, drop invalid push --ff-only, harden refs
|
|
20
|
+
- fix(session-safeguard): never autopush protected branches and detect pushed bump in release abort
|
|
21
|
+
|
|
22
|
+
### Refactoring
|
|
23
|
+
- refactor(tests): split release-pipeline suite, harness cache, mirror auto-sync
|
|
24
|
+
|
|
25
|
+
### Chores
|
|
26
|
+
- chore(planu): SPEC-1384 done state and SPEC-1385 dogfood bug spec
|
|
27
|
+
- chore(planu): SPEC-1379 done state
|
|
28
|
+
- chore(planu): split incidental session-context churn out of SPEC-1379 delta
|
|
29
|
+
- chore(planu): file SPEC-1381 challenge resolution, SPEC-1382 operator guides, SPEC-1383 validate budget dogfood specs
|
|
30
|
+
- chore(planu): SPEC-1378 done state and v5.3.0 session checkpoint
|
|
31
|
+
|
|
32
|
+
|
|
1
33
|
## [5.3.0] - 2026-08-05
|
|
2
34
|
|
|
3
35
|
### Features
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Planu is a Spec Driven Development stack for AI coding agents: an MCP server and
|
|
|
21
21
|
- **Local change detection** — observes project changes without requiring a hosted configuration service.
|
|
22
22
|
- **Unified Spec Format** — Requirements and technical details in a single, context-efficient `spec.md`.
|
|
23
23
|
- **Atomic Integrity** — Indestructible writes and **Freeze-on-done** immutability (P0).
|
|
24
|
-
- **
|
|
24
|
+
- **29 official MCP tools** for the public SDD surface, with advanced workflows kept in skills, CLI commands, and internal pipelines.
|
|
25
25
|
- **Multi-agent compatible** — Optimized for Claude Code, Cursor, Windsurf, and Gemini CLI.
|
|
26
26
|
|
|
27
27
|
---
|
|
@@ -7,10 +7,20 @@ mkdir -p "$(dirname "$log")"
|
|
|
7
7
|
echo "[$(date -u +%FT%TZ)] PreCompaction safeguard fired"
|
|
8
8
|
cd "${CLAUDE_PROJECT_DIR:-.}" || exit 0
|
|
9
9
|
current=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
case "$current" in
|
|
11
|
+
""|HEAD|main|master|develop|release|production)
|
|
12
|
+
# SPEC-1379: never autopush protected branches — mirrors PROTECTED_BRANCHES
|
|
13
|
+
# in src/engine/session-safeguard/autopush.ts. --no-verify below is safe
|
|
14
|
+
# ONLY because of this guard; remove one, remove both.
|
|
15
|
+
echo "skip: protected or detached ($current)"
|
|
16
|
+
;;
|
|
17
|
+
*)
|
|
18
|
+
# No --force: the remote rejects any non-fast-forward push, so this can
|
|
19
|
+
# never overwrite remote history. --end-of-options hardens against
|
|
20
|
+
# refnames that start with a dash.
|
|
21
|
+
git push --no-verify --end-of-options origin "$current" 2>&1 || echo "push failed or nothing to push"
|
|
22
|
+
;;
|
|
23
|
+
esac
|
|
14
24
|
} >> "$log" 2>&1
|
|
15
25
|
|
|
16
26
|
exit 0
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/** Single editable authority for the official local SDD tool surface. */
|
|
2
|
-
export declare const OFFICIAL_SDD_TOOL_NAMES: readonly ['planu_status', 'session_checkpoint', 'facilitate', 'init_project', 'clarify_requirements', 'create_spec', 'list_specs', 'challenge_spec', 'check_readiness', 'update_status', 'update_status_batch', 'package_handoff', 'validate', 'get_job', 'watch_job', 'cancel_job', 'restart_job', 'reconcile_spec', 'create_rule', 'create_skill', 'skill_search', 'configure_code_graph', 'code_graph_status', 'submit_feedback', 'triage_feedback', 'resolve_feedback', 'sync_feedback', 'feedback_status'];
|
|
2
|
+
export declare const OFFICIAL_SDD_TOOL_NAMES: readonly ['planu_status', 'session_checkpoint', 'facilitate', 'init_project', 'clarify_requirements', 'create_spec', 'list_specs', 'challenge_spec', 'check_readiness', 'update_status', 'update_status_batch', 'package_handoff', 'validate', 'get_job', 'watch_job', 'cancel_job', 'restart_job', 'reconcile_spec', 'create_rule', 'create_skill', 'skill_search', 'configure_code_graph', 'code_graph_status', 'submit_feedback', 'triage_feedback', 'resolve_feedback', 'sync_feedback', 'feedback_status', 'bump_spec_version'];
|
|
3
3
|
export declare function readCanonicalToolNames(): string[];
|
|
4
4
|
//# sourceMappingURL=official-sdd-tools.d.ts.map
|
|
@@ -16,6 +16,9 @@ export declare function extractCanonicalFileOwnership(content: string): {
|
|
|
16
16
|
toModify: string[];
|
|
17
17
|
toCreate: string[];
|
|
18
18
|
toTest: string[];
|
|
19
|
+
/** Test paths as declared, before conflict filtering — used to exclude conflicted
|
|
20
|
+
* paths from other categories even though they no longer appear in `toTest`. */
|
|
21
|
+
toTestDeclared: string[];
|
|
19
22
|
blockers: string[];
|
|
20
23
|
};
|
|
21
24
|
export declare function packageHandoff(spec: Spec, knowledge: ProjectKnowledge): Promise<HandoffPackage>;
|
|
@@ -174,7 +174,14 @@ export function normalizeChangedFilePath(value) {
|
|
|
174
174
|
export function extractCanonicalFileOwnership(content) {
|
|
175
175
|
const filesSection = sectionContentAtLevel(content, 'Files', 2);
|
|
176
176
|
if (filesSection === null) {
|
|
177
|
-
return {
|
|
177
|
+
return {
|
|
178
|
+
present: false,
|
|
179
|
+
toModify: [],
|
|
180
|
+
toCreate: [],
|
|
181
|
+
toTest: [],
|
|
182
|
+
toTestDeclared: [],
|
|
183
|
+
blockers: [],
|
|
184
|
+
};
|
|
178
185
|
}
|
|
179
186
|
const blockers = [];
|
|
180
187
|
const addBlocker = (blocker) => {
|
|
@@ -215,6 +222,7 @@ export function extractCanonicalFileOwnership(content) {
|
|
|
215
222
|
toCreate: toCreate.filter((path) => !conflicts.includes(path)),
|
|
216
223
|
toModify: toModify.filter((path) => !conflicts.includes(path)),
|
|
217
224
|
toTest: toTest.filter((path) => !conflicts.includes(path)),
|
|
225
|
+
toTestDeclared: toTest,
|
|
218
226
|
blockers,
|
|
219
227
|
};
|
|
220
228
|
}
|
|
@@ -541,7 +549,7 @@ export async function packageHandoff(spec, knowledge) {
|
|
|
541
549
|
const canonicalFiles = extractCanonicalFileOwnership(rawSpecContent);
|
|
542
550
|
const canonicalOwnership = extractStrictCanonicalOwnership(ownershipContent);
|
|
543
551
|
const workPlanOwnership = extractFileLevelWorkPlanOwnership(ownershipContent);
|
|
544
|
-
const testOwnedPaths = new Set(canonicalFiles.
|
|
552
|
+
const testOwnedPaths = new Set(canonicalFiles.toTestDeclared);
|
|
545
553
|
const explicitOwnership = canonicalOwnership.present
|
|
546
554
|
? {
|
|
547
555
|
...canonicalOwnership,
|
|
@@ -574,7 +582,9 @@ export async function packageHandoff(spec, knowledge) {
|
|
|
574
582
|
}
|
|
575
583
|
const blockers = [
|
|
576
584
|
...(criteria.length === 0 ? ['Missing BDD acceptance criteria'] : []),
|
|
577
|
-
...(toModify.length + toCreate.length === 0
|
|
585
|
+
...(toModify.length + toCreate.length + canonicalFiles.toTest.length === 0
|
|
586
|
+
? ['Missing file ownership / target files']
|
|
587
|
+
: []),
|
|
578
588
|
...(operational.testPlan.length === 0 ? ['Missing test plan'] : []),
|
|
579
589
|
...(operational.risks.length === 0 ? ['Missing risk analysis'] : []),
|
|
580
590
|
...(operational.ownership.length === 0 ? ['Missing ownership'] : []),
|
|
@@ -594,6 +604,7 @@ export async function packageHandoff(spec, knowledge) {
|
|
|
594
604
|
criteria,
|
|
595
605
|
filesToModify: toModify,
|
|
596
606
|
filesToCreate: toCreate,
|
|
607
|
+
filesToTest: canonicalFiles.toTest,
|
|
597
608
|
ownership: operational.ownership,
|
|
598
609
|
testPlan: operational.testPlan,
|
|
599
610
|
risks: operational.risks,
|
|
@@ -626,6 +637,10 @@ function renderPersistedHandoff(pkg) {
|
|
|
626
637
|
'## Files To Create',
|
|
627
638
|
...pkg.filesToCreate.map((filePath) => `- ${filePath}`),
|
|
628
639
|
'',
|
|
640
|
+
'## Test Files',
|
|
641
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- compat guard: callers may construct a HandoffPackage object predating this field
|
|
642
|
+
...(pkg.filesToTest ?? []).map((filePath) => `- ${filePath}`),
|
|
643
|
+
'',
|
|
629
644
|
'## Ownership',
|
|
630
645
|
...pkg.ownership.map((item) => `- ${item}`),
|
|
631
646
|
'',
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-aarch64-apple-darwin",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
"platform": "darwin",
|
|
18
18
|
"arch": "arm64",
|
|
19
19
|
"libc": null,
|
|
20
|
-
"artifactSha256": "
|
|
20
|
+
"artifactSha256": "d871c6912f7857fedb31608d895a4e80fbf550c18875d307cf068fa966412cb7",
|
|
21
21
|
"sbom": {
|
|
22
22
|
"format": "CycloneDX-1.5",
|
|
23
23
|
"path": "planu-core.darwin-arm64.node.sbom.json",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "93613e9e650a12618265c467fd3007c96ad6c261dcf373ff321d70210c1fdf90"
|
|
25
25
|
},
|
|
26
26
|
"provenance": {
|
|
27
27
|
"builder": "scripts/build-rust-local.sh",
|
|
28
|
-
"sourceCommit": "
|
|
28
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
29
29
|
"sourceTreeDirty": false,
|
|
30
30
|
"sourceDateEpoch": 1,
|
|
31
31
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
"signature": {
|
|
35
35
|
"algorithm": "Ed25519",
|
|
36
36
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
37
|
-
"value": "
|
|
37
|
+
"value": "5A14AujfQn9F0F6V4dCbHhSlzyWfH43wAF+8tSzLXg0t7+yELQKNNH8XqNGSqL9qGHPVxSYeTu1nh/3qQECxBQ=="
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "d871c6912f7857fedb31608d895a4e80fbf550c18875d307cf068fa966412cb7"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-x86_64-apple-darwin",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
"platform": "darwin",
|
|
18
18
|
"arch": "x64",
|
|
19
19
|
"libc": null,
|
|
20
|
-
"artifactSha256": "
|
|
20
|
+
"artifactSha256": "2e160dbfb5616b778ea6bc1b85b6663ae9618c664824498e0089a3b82353923e",
|
|
21
21
|
"sbom": {
|
|
22
22
|
"format": "CycloneDX-1.5",
|
|
23
23
|
"path": "planu-core.darwin-x64.node.sbom.json",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "b4aa09e9d3bc3d5f4d0d80953f4d32389aa40fafabcac6895ebd296c4a2f6873"
|
|
25
25
|
},
|
|
26
26
|
"provenance": {
|
|
27
27
|
"builder": "scripts/build-rust-local.sh",
|
|
28
|
-
"sourceCommit": "
|
|
28
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
29
29
|
"sourceTreeDirty": false,
|
|
30
30
|
"sourceDateEpoch": 1,
|
|
31
31
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
"signature": {
|
|
35
35
|
"algorithm": "Ed25519",
|
|
36
36
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
37
|
-
"value": "
|
|
37
|
+
"value": "xN3AVrLnDNmagcrLzUS+voWOuOHZhY4+i+nfep/66x39IdztoQEqh/jF1H/P5qxnIwGFuSztuCS3cG0pAsRqCw=="
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "2e160dbfb5616b778ea6bc1b85b6663ae9618c664824498e0089a3b82353923e"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-aarch64-unknown-linux-gnu",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "arm64",
|
|
18
18
|
"libc": "glibc",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "c688e223eaed377810f13b4fb59b95269c6ac386e9e22122012322aa20b4119f",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-arm64-gnu.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "05e6cde28bdf46282c2024bec9491908e67cf0875a1043a879533fe26e2acf6c"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "evvZQIYp2VmYUaaLu8nK5yLjTSms9hMRYoF4zM3qsCHwLLKRThOR+KrFgZ9ySZk6WRWx9CE8F/c+pKFRi/7nBg=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "c688e223eaed377810f13b4fb59b95269c6ac386e9e22122012322aa20b4119f"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-aarch64-unknown-linux-musl",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "arm64",
|
|
18
18
|
"libc": "musl",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "ffe6b8382aded44408171166a385d31d25fa6a95919c14ec73ca5197351da8ac",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-arm64-musl.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "6612f0831ad90d8d69aa88bbc53658d5dc55d5ff3e337e4253cb8943c7471aa5"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "3AhxDy080JazcjbYv9SH3w6tpj4iKKLlhI95pAy1/VQ8c9iDEDLmTfFaQv4R1FXjEAUSqZ/hYZEAQ0A3XpQPCA=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "ffe6b8382aded44408171166a385d31d25fa6a95919c14ec73ca5197351da8ac"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-x86_64-unknown-linux-gnu",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "x64",
|
|
18
18
|
"libc": "glibc",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "c1aeb15763bf3ee0b2d37ac694340fe65cfc106f95f6813c2e188c099c826013",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-x64-gnu.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "cd651b3c7af8a03fb3725d6342ee679dfef8272b65bc28e9f523dbfb88fa0ed8"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "T9ypzN3DZ+ks4rQIjeuMKqxHHxGc7Qm/ep9zyVEsU6BvzVjOaiZijDkJXsiaNS8AqfrZkmnr6I/HtWNCqiqjCw=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "c1aeb15763bf3ee0b2d37ac694340fe65cfc106f95f6813c2e188c099c826013"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-x86_64-unknown-linux-musl",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "linux",
|
|
17
17
|
"arch": "x64",
|
|
18
18
|
"libc": "musl",
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "d44f03ecaed34427ca6ed682ce695f432d25eac3366fc5e779cfa78fe39d504b",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.linux-x64-musl.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "86d8219cdb5f5205d458cfa205ef619f68997f7a414f04a3a30f53704650b488"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "O6Ay8rgviCK8bLJJbkQAsX9msRJoCxB2jkgpY6+v+7oyVohsZ3hKly1kFnQ35WRbibF4l2TBchxZI7IlKbAgCg=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "d44f03ecaed34427ca6ed682ce695f432d25eac3366fc5e779cfa78fe39d504b"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-aarch64-pc-windows-msvc",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "win32",
|
|
17
17
|
"arch": "arm64",
|
|
18
18
|
"libc": null,
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "9a10e393e1b0aad7856de5973ea8efb018513bcb4e2c47ddb013be9bda7e3bda",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.win32-arm64-msvc.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "38f38493f6013f50daff7808dcbbab81133b141bce61cba430e7a07fe9a89fc2"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "ktHCgTSn2Br8NhGf6Pjz5fCP38a9sGluOqs617pwRXymMiUBu2GNjvyp7mLqk2gY/L8KAbzvF6FHoqEVDzb9AA=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "9a10e393e1b0aad7856de5973ea8efb018513bcb4e2c47ddb013be9bda7e3bda"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"cliVersion": "5.3.
|
|
4
|
-
"engineVersion": "5.3.
|
|
5
|
-
"buildId": "1-5.3.
|
|
3
|
+
"cliVersion": "5.3.2",
|
|
4
|
+
"engineVersion": "5.3.2",
|
|
5
|
+
"buildId": "1-5.3.2-x86_64-pc-windows-msvc",
|
|
6
6
|
"protocolAbi": 1,
|
|
7
7
|
"capabilityAbi": 2,
|
|
8
8
|
"nodeApiAbi": 4,
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"platform": "win32",
|
|
17
17
|
"arch": "x64",
|
|
18
18
|
"libc": null,
|
|
19
|
-
"artifactSha256": "
|
|
19
|
+
"artifactSha256": "4a41383ea29c9dd64a668143e206b4af1859ba6f35b79fdeb7ea8f812113811c",
|
|
20
20
|
"sbom": {
|
|
21
21
|
"format": "CycloneDX-1.5",
|
|
22
22
|
"path": "planu-core.win32-x64-msvc.node.sbom.json",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "f96dbf4fd6d9cab1aa9b90057325829de42e018dfa2bf4220c78c9bbfab0f9c5"
|
|
24
24
|
},
|
|
25
25
|
"provenance": {
|
|
26
26
|
"builder": "scripts/build-rust-local.sh",
|
|
27
|
-
"sourceCommit": "
|
|
27
|
+
"sourceCommit": "30226657c1e66411b6ff233c2ea82e47573d533a",
|
|
28
28
|
"sourceTreeDirty": false,
|
|
29
29
|
"sourceDateEpoch": 1,
|
|
30
30
|
"rustToolchain": "rustc 1.95.0 (59807616e 2026-04-14)",
|
|
@@ -33,6 +33,6 @@
|
|
|
33
33
|
"signature": {
|
|
34
34
|
"algorithm": "Ed25519",
|
|
35
35
|
"keyId": "e2ee765cb5ad9fbdc433ece332bce26d746d5e350b3acde0721a4c8c6337ff7b",
|
|
36
|
-
"value": "
|
|
36
|
+
"value": "vZ49hewESnK5idVecQPyBFUD+GPcbfa0ihzAKkxuqBSsyVEWNFGaGU4c/rzvXD6D3SKnApFEM3vZ9D2uCfSjDA=="
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"version": 1,
|
|
5
5
|
"metadata": {
|
|
6
6
|
"component": {
|
|
7
|
-
"bom-ref": "pkg:cargo/planu-core@5.3.
|
|
7
|
+
"bom-ref": "pkg:cargo/planu-core@5.3.2",
|
|
8
8
|
"type": "library",
|
|
9
9
|
"name": "planu-core",
|
|
10
|
-
"version": "5.3.
|
|
10
|
+
"version": "5.3.2",
|
|
11
11
|
"hashes": [
|
|
12
12
|
{
|
|
13
13
|
"alg": "SHA-256",
|
|
14
|
-
"content": "
|
|
14
|
+
"content": "4a41383ea29c9dd64a668143e206b4af1859ba6f35b79fdeb7ea8f812113811c"
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1106,7 +1106,7 @@
|
|
|
1106
1106
|
"dependsOn": []
|
|
1107
1107
|
},
|
|
1108
1108
|
{
|
|
1109
|
-
"ref": "pkg:cargo/planu-core@5.3.
|
|
1109
|
+
"ref": "pkg:cargo/planu-core@5.3.2",
|
|
1110
1110
|
"dependsOn": [
|
|
1111
1111
|
"pkg:cargo/core-foundation@0.10.1",
|
|
1112
1112
|
"pkg:cargo/hmac@0.12.1",
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
import { execFile } from 'node:child_process';
|
|
3
3
|
import { promisify } from 'node:util';
|
|
4
4
|
const execFileAsync = promisify(execFile);
|
|
5
|
-
|
|
5
|
+
// SPEC-1379: unified with DEFAULT_PROTECTED_BRANCHES (git-helpers.ts) plus the
|
|
6
|
+
// `release` mirror branch; the shell hook template mirrors this same set.
|
|
7
|
+
const PROTECTED_BRANCHES = new Set(['main', 'master', 'develop', 'release', 'production']);
|
|
6
8
|
/** Resolve the current branch name for the given projectPath. */
|
|
7
9
|
async function getCurrentBranch(projectPath) {
|
|
8
10
|
try {
|
|
@@ -88,7 +90,11 @@ export async function safeAutopush(projectPath, allowedPatterns = ['feat/*', 'fi
|
|
|
88
90
|
};
|
|
89
91
|
}
|
|
90
92
|
try {
|
|
91
|
-
|
|
93
|
+
// No --force (git push has no --ff-only flag): the receiving remote
|
|
94
|
+
// rejects any non-fast-forward push, which is the ff-only guarantee.
|
|
95
|
+
await execFileAsync('git', ['push', '--end-of-options', 'origin', branch], {
|
|
96
|
+
cwd: projectPath,
|
|
97
|
+
});
|
|
92
98
|
return { pushed: true, commitsPushed: commitCount, ref: `origin/${branch}` };
|
|
93
99
|
}
|
|
94
100
|
catch (err) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { ToolResult, PackageHandoffInput } from '../types/index.js';
|
|
1
|
+
import type { ToolResult, PackageHandoffInput, HandoffPackage } from '../types/index.js';
|
|
2
|
+
export declare function formatHandoff(pkg: HandoffPackage): string;
|
|
2
3
|
export declare function handlePackageHandoff(args: PackageHandoffInput): Promise<ToolResult>;
|
|
3
4
|
//# sourceMappingURL=package-handoff.d.ts.map
|
|
@@ -8,7 +8,7 @@ import { appendTransitionEvent } from '../storage/transition-log.js';
|
|
|
8
8
|
import { formatProjectGraphContext, queryProjectGraphSlice, } from '../engine/project-graph/index.js';
|
|
9
9
|
import { analyzeMinimalImplementation, loadMinimalImplementationPolicy, } from '../engine/minimality/index.js';
|
|
10
10
|
// ── Formatting helpers ───────────────────────────────────────────────────────
|
|
11
|
-
function formatHandoff(pkg) {
|
|
11
|
+
export function formatHandoff(pkg) {
|
|
12
12
|
const lines = [];
|
|
13
13
|
lines.push(`# Implementation Handoff Package — ${pkg.specId}`);
|
|
14
14
|
lines.push('');
|
|
@@ -59,6 +59,19 @@ function formatHandoff(pkg) {
|
|
|
59
59
|
lines.push('_(None identified)_');
|
|
60
60
|
}
|
|
61
61
|
lines.push('');
|
|
62
|
+
lines.push('## Test Files');
|
|
63
|
+
lines.push('');
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- compat guard: callers may construct a HandoffPackage object predating this field
|
|
65
|
+
const filesToTest = pkg.filesToTest ?? [];
|
|
66
|
+
if (filesToTest.length > 0) {
|
|
67
|
+
for (const f of filesToTest) {
|
|
68
|
+
lines.push(`- ${f}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
lines.push('_(None identified)_');
|
|
73
|
+
}
|
|
74
|
+
lines.push('');
|
|
62
75
|
lines.push('## Ownership');
|
|
63
76
|
lines.push('');
|
|
64
77
|
if (pkg.ownership.length > 0) {
|
|
@@ -152,7 +165,9 @@ function buildHandoffSummaryText(args) {
|
|
|
152
165
|
if (args.pkg.contextHash) {
|
|
153
166
|
lines.push(`Context Hash: ${args.pkg.contextHash}`);
|
|
154
167
|
}
|
|
155
|
-
|
|
168
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- compat guard: callers may construct a HandoffPackage object predating this field
|
|
169
|
+
const filesToTestCount = (args.pkg.filesToTest ?? []).length;
|
|
170
|
+
lines.push(`Counts: ${String(args.pkg.criteria.length)} criteria, ${String(args.pkg.filesToModify.length)} files to modify, ${String(args.pkg.filesToCreate.length)} files to create, ${String(filesToTestCount)} files to test, ${String(args.pkg.testPlan.length)} tests, ${String(args.pkg.risks.length)} risks.`);
|
|
156
171
|
if (args.topBlockers.length > 0) {
|
|
157
172
|
lines.push(`Top blockers: ${args.topBlockers.join('; ')}`);
|
|
158
173
|
}
|
|
@@ -238,7 +253,8 @@ async function buildHandoffTokenWasteReport(pkg, knowledge, spec) {
|
|
|
238
253
|
const context = analyzeContextPreflight({
|
|
239
254
|
action: 'package_handoff',
|
|
240
255
|
policy,
|
|
241
|
-
|
|
256
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- compat guard: callers may construct a HandoffPackage object predating this field
|
|
257
|
+
candidates: [...pkg.filesToModify, ...pkg.filesToCreate, ...(pkg.filesToTest ?? [])].map((path) => ({
|
|
242
258
|
path,
|
|
243
259
|
reason: 'Referenced by handoff package.',
|
|
244
260
|
})),
|
|
@@ -297,7 +313,8 @@ async function buildMinimalImplementationReport(pkg, knowledge, spec, handoffTex
|
|
|
297
313
|
specId: spec.id,
|
|
298
314
|
specRisk: spec.risk,
|
|
299
315
|
handoffText,
|
|
300
|
-
|
|
316
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- compat guard: callers may construct a HandoffPackage object predating this field
|
|
317
|
+
files: [...pkg.filesToModify, ...pkg.filesToCreate, ...(pkg.filesToTest ?? [])].map((path) => ({ path, content: path })),
|
|
301
318
|
evidence,
|
|
302
319
|
});
|
|
303
320
|
}
|
|
@@ -421,6 +438,8 @@ export async function handlePackageHandoff(args) {
|
|
|
421
438
|
criteria: pkgWithScore.criteria.length,
|
|
422
439
|
filesToModify: pkgWithScore.filesToModify.length,
|
|
423
440
|
filesToCreate: pkgWithScore.filesToCreate.length,
|
|
441
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- compat guard: callers may construct a HandoffPackage object predating this field
|
|
442
|
+
filesToTest: (pkgWithScore.filesToTest ?? []).length,
|
|
424
443
|
ownership: pkgWithScore.ownership.length,
|
|
425
444
|
testPlan: pkgWithScore.testPlan.length,
|
|
426
445
|
risks: pkgWithScore.risks.length,
|
|
@@ -61,9 +61,20 @@ async function installHookFile(projectPath) {
|
|
|
61
61
|
' echo "[$(date -u +%FT%TZ)] session-safeguard fired"',
|
|
62
62
|
' cd "${CLAUDE_PROJECT_DIR:-.}" || exit 0',
|
|
63
63
|
' current=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")',
|
|
64
|
-
'
|
|
65
|
-
'
|
|
66
|
-
'
|
|
64
|
+
' case "$current" in',
|
|
65
|
+
' ""|HEAD|main|master|develop|release|production)',
|
|
66
|
+
' # SPEC-1379: never autopush protected branches — mirrors PROTECTED_BRANCHES',
|
|
67
|
+
' # in src/engine/session-safeguard/autopush.ts. --no-verify below is safe',
|
|
68
|
+
' # ONLY because of this guard; remove one, remove both.',
|
|
69
|
+
' echo "skip: protected or detached ($current)"',
|
|
70
|
+
' ;;',
|
|
71
|
+
' *)',
|
|
72
|
+
' # No --force: the remote rejects any non-fast-forward push, so this can',
|
|
73
|
+
' # never overwrite remote history. --end-of-options hardens against',
|
|
74
|
+
' # refnames that start with a dash.',
|
|
75
|
+
' git push --no-verify --end-of-options origin "$current" 2>&1 || echo "push failed or nothing to push"',
|
|
76
|
+
' ;;',
|
|
77
|
+
' esac',
|
|
67
78
|
'} >> "$log" 2>&1',
|
|
68
79
|
'exit 0',
|
|
69
80
|
].join('\n') + '\n';
|
|
@@ -11,6 +11,7 @@ import { safe } from './safe-handler.js';
|
|
|
11
11
|
import { handleCreateRule } from './create-rule.js';
|
|
12
12
|
import { handleCreateSkill } from './create-skill.js';
|
|
13
13
|
import { handleReconcileUniversalRules } from './reconcile-universal-rules.js';
|
|
14
|
+
import { registerBumpSpecVersionTool } from './bump-spec-version.js';
|
|
14
15
|
import { registerPrompts } from '../prompts/index.js';
|
|
15
16
|
import { OFFICIAL_SDD_TOOL_NAMES } from './tool-registry/inventory.js';
|
|
16
17
|
export { OFFICIAL_SDD_TOOL_NAMES } from './tool-registry/inventory.js';
|
|
@@ -110,6 +111,7 @@ export function registerSddTools(server) {
|
|
|
110
111
|
registerOnly(server, OFFICIAL_SDD_TOOL_SET, registerQualityComplianceGroupTools);
|
|
111
112
|
registerOnly(server, OFFICIAL_SDD_TOOL_SET, registerInfraGroupTools);
|
|
112
113
|
registerOnly(server, OFFICIAL_SDD_TOOL_SET, registerUniversalRulesTools);
|
|
114
|
+
registerOnly(server, OFFICIAL_SDD_TOOL_SET, registerBumpSpecVersionTool);
|
|
113
115
|
registerPrompts(server);
|
|
114
116
|
}
|
|
115
117
|
//# sourceMappingURL=register-sdd-tools.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planu/cli",
|
|
3
|
-
"version": "5.3.
|
|
3
|
+
"version": "5.3.2",
|
|
4
4
|
"description": "Planu — MCP Server for Spec Driven Development with native Rust acceleration for hot paths. Cross-platform (Linux/macOS/Windows, x64/arm64, glibc/musl).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -35,14 +35,14 @@
|
|
|
35
35
|
"packageName": "@planu/core"
|
|
36
36
|
},
|
|
37
37
|
"optionalDependencies": {
|
|
38
|
-
"@planu/core-darwin-arm64": "5.3.
|
|
39
|
-
"@planu/core-darwin-x64": "5.3.
|
|
40
|
-
"@planu/core-linux-arm64-gnu": "5.3.
|
|
41
|
-
"@planu/core-linux-arm64-musl": "5.3.
|
|
42
|
-
"@planu/core-linux-x64-gnu": "5.3.
|
|
43
|
-
"@planu/core-linux-x64-musl": "5.3.
|
|
44
|
-
"@planu/core-win32-arm64-msvc": "5.3.
|
|
45
|
-
"@planu/core-win32-x64-msvc": "5.3.
|
|
38
|
+
"@planu/core-darwin-arm64": "5.3.2",
|
|
39
|
+
"@planu/core-darwin-x64": "5.3.2",
|
|
40
|
+
"@planu/core-linux-arm64-gnu": "5.3.2",
|
|
41
|
+
"@planu/core-linux-arm64-musl": "5.3.2",
|
|
42
|
+
"@planu/core-linux-x64-gnu": "5.3.2",
|
|
43
|
+
"@planu/core-linux-x64-musl": "5.3.2",
|
|
44
|
+
"@planu/core-win32-arm64-msvc": "5.3.2",
|
|
45
|
+
"@planu/core-win32-x64-msvc": "5.3.2"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
48
|
"node": ">=24.0.0"
|
package/planu-native.json
CHANGED
package/planu-plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dev.planu.cli",
|
|
3
3
|
"displayName": "Planu — Spec Driven Development",
|
|
4
4
|
"description": "Manage software specs, estimations, and autonomous SDD workflows. Language-agnostic MCP server for Claude Code.",
|
|
5
|
-
"version": "5.3.
|
|
5
|
+
"version": "5.3.2",
|
|
6
6
|
"icon": "assets/plugin/icon.svg",
|
|
7
7
|
"command": ["npx", "@planu/cli@latest"],
|
|
8
8
|
"packageName": "@planu/cli",
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
"triage_feedback",
|
|
36
36
|
"resolve_feedback",
|
|
37
37
|
"sync_feedback",
|
|
38
|
-
"feedback_status"
|
|
38
|
+
"feedback_status",
|
|
39
|
+
"bump_spec_version"
|
|
39
40
|
],
|
|
40
41
|
"resources": ["planu://specs/list", "planu://specs/{id}", "planu://project/status", "planu://roadmap"],
|
|
41
42
|
"prompts": ["create-spec-from-idea", "review-spec-readiness", "generate-implementation-plan"],
|