@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 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
- : extractListItems(specContent.slice(criteriaRange.contentStart, criteriaRange.end));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planu/cli",
3
- "version": "5.3.39",
3
+ "version": "5.3.41",
4
4
  "description": "Planu — MCP Server for Spec Driven Development. Cross-platform (Linux/macOS/Windows, x64/arm64).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
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.39",
5
+ "version": "5.3.41",
6
6
  "icon": "assets/plugin/icon.svg",
7
7
  "command": ["npx", "@planu/cli@latest"],
8
8
  "packageName": "@planu/cli",