@planu/cli 5.3.39 → 5.3.41
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 +16 -0
- package/dist/engine/scope-boundaries/contradiction-checker.js +1 -1
- package/dist/engine/spec-format/acceptance-criteria.d.ts +1 -0
- package/dist/engine/spec-format/acceptance-criteria.js +1 -1
- package/dist/tools/challenge-spec.js +2 -1
- package/package.json +1 -1
- package/planu-plugin.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
## [5.3.41] - 2026-08-23
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
- fix(spec-1591): recognize relax-family verbs in scope-contradiction noun-overlap guard
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## [5.3.40] - 2026-08-23
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
- fix(spec-1590): feed full multi-line BDD criteria to scope-contradiction check
|
|
11
|
+
|
|
12
|
+
### Chores
|
|
13
|
+
- chore(planu): sync state after SPEC-1590 done
|
|
14
|
+
- chore(spec-1273): mark done and reconcile Files with regenerated artifacts
|
|
15
|
+
|
|
16
|
+
|
|
1
17
|
## [5.3.39] - 2026-08-23
|
|
2
18
|
|
|
3
19
|
### Bug Fixes
|
|
@@ -100,7 +100,7 @@ function splitClauses(text) {
|
|
|
100
100
|
.map((clause) => clause.trim())
|
|
101
101
|
.filter(Boolean);
|
|
102
102
|
}
|
|
103
|
-
const AFFIRMATIVE_ACTION_VERBS = /\b(?:build(?:s|ing)?|chang(?:e|es|ing)|modif(?:y|ies|ying)|alter(?:s|ing)?|add(?:s|ing)?|introduc(?:e|es|ing)|implement(?:s|ing)?|enabl(?:e|es|ing)|expos(?:e|es|ing|ed)|mutat(?:e|es|ing)|rewrit(?:e|es|ing|ten)|remov(?:e|es|ing|ed)|forc(?:e|es|ing))\b/;
|
|
103
|
+
const AFFIRMATIVE_ACTION_VERBS = /\b(?:build(?:s|ing)?|chang(?:e|es|ing)|modif(?:y|ies|ying)|alter(?:s|ing)?|add(?:s|ing)?|introduc(?:e|es|ing)|implement(?:s|ing)?|enabl(?:e|es|ing)|expos(?:e|es|ing|ed)|mutat(?:e|es|ing)|rewrit(?:e|es|ing|ten)|remov(?:e|es|ing|ed)|relax(?:es|ing|ed)?|forc(?:e|es|ing))\b/;
|
|
104
104
|
function assertsForbiddenAction(text) {
|
|
105
105
|
return AFFIRMATIVE_ACTION_VERBS.test(normalize(text));
|
|
106
106
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { NormalizedAcceptanceCriterion } from '../../types/spec-format.js';
|
|
2
|
+
export declare function extractSectionCriteria(section: string): string[];
|
|
2
3
|
export declare function extractNormalizedAcceptanceCriteria(raw: string, options?: {
|
|
3
4
|
allowLegacyBodyFallback?: boolean;
|
|
4
5
|
}): NormalizedAcceptanceCriterion[];
|
|
@@ -80,7 +80,7 @@ function extractOneCriterion(body) {
|
|
|
80
80
|
const listItem = extractListItems(body).find((item) => !TECHNICAL_MARKER.test(item));
|
|
81
81
|
return listItem ?? null;
|
|
82
82
|
}
|
|
83
|
-
function extractSectionCriteria(section) {
|
|
83
|
+
export function extractSectionCriteria(section) {
|
|
84
84
|
const explicitBodies = extractExplicitCriterionBodies(section);
|
|
85
85
|
if (explicitBodies.length > 0) {
|
|
86
86
|
return explicitBodies
|
|
@@ -21,6 +21,7 @@ import { detectChallengeCapabilities, } from './challenge-spec/scenarios-utils.j
|
|
|
21
21
|
import { collectCapabilityScenarios } from './challenge-spec/scenario-collector.js';
|
|
22
22
|
import { buildChallengeReport, parseChallengeResolutionEvidence, } from './challenge-spec/challenge-report.js';
|
|
23
23
|
import { extractListItems, findMarkdownSectionRange, } from '../engine/spec-format/markdown-sections.js';
|
|
24
|
+
import { extractSectionCriteria } from '../engine/spec-format/acceptance-criteria.js';
|
|
24
25
|
const ALL_FOCUS_AREAS = [
|
|
25
26
|
'failures',
|
|
26
27
|
'concurrency',
|
|
@@ -219,7 +220,7 @@ export async function handleChallengeSpec(args, server) {
|
|
|
219
220
|
const criteriaRange = findMarkdownSectionRange(specContent, 'Acceptance Criteria');
|
|
220
221
|
const criteriaTexts = criteriaRange === null
|
|
221
222
|
? []
|
|
222
|
-
:
|
|
223
|
+
: extractSectionCriteria(specContent.slice(criteriaRange.contentStart, criteriaRange.end));
|
|
223
224
|
const contradictionResult = checkScopeContradictions(resolvedOutOfScope, criteriaTexts);
|
|
224
225
|
for (const c of contradictionResult.contradictions) {
|
|
225
226
|
failureScenarios.push({
|
package/package.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.41",
|
|
6
6
|
"icon": "assets/plugin/icon.svg",
|
|
7
7
|
"command": ["npx", "@planu/cli@latest"],
|
|
8
8
|
"packageName": "@planu/cli",
|