openplanr 1.7.2 → 1.8.1

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/README.md CHANGED
@@ -128,7 +128,7 @@ planr spec shape SPEC-001 # 4 questions, no $EDITOR
128
128
 
129
129
  ### Spec-driven mode
130
130
 
131
- Third planning posture — designed for handing features to AI coding agents. Specs decompose into User Stories and Tasks with explicit file Create / Modify / Preserve lists, `Type: UI | Tech`, agent assignment, and DoD with build / test commands. Schema matches [OpenPlanr Protocol v1.0.0](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol).
131
+ Third planning posture — designed for handing features to AI coding agents. Specs decompose into User Stories and Tasks with explicit file Create / Modify / Preserve lists, `Type: UI | Tech`, agent assignment, and DoD with build / test commands. Schema matches [OpenPlanr Protocol v1.0.0](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol); canonical JSON Schemas for this cleanup cycle live in `openplanr/planr-pipeline` under `schemas/v1.0.0/`.
132
132
 
133
133
  | Command | Description |
134
134
  |---|---|
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerGraphCommand(program: Command): void;
3
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA6BpD"}
@@ -0,0 +1,32 @@
1
+ import chalk from 'chalk';
2
+ import { loadConfig } from '../../services/config-service.js';
3
+ import { readProjectGraph } from '../../services/graph-service.js';
4
+ import { display, logger } from '../../utils/logger.js';
5
+ export function registerGraphCommand(program) {
6
+ program
7
+ .command('graph')
8
+ .description('Emit the OpenPlanr artifact graph')
9
+ .option('--json', 'output the graph as JSON')
10
+ .action(async (opts) => {
11
+ const projectDir = program.opts().projectDir;
12
+ const config = await loadConfig(projectDir);
13
+ const graph = readProjectGraph(projectDir, config);
14
+ if (opts.json) {
15
+ display.line(JSON.stringify(graph, null, 2));
16
+ return;
17
+ }
18
+ const counts = graph.nodes.reduce((acc, node) => {
19
+ acc[node.type] = (acc[node.type] || 0) + 1;
20
+ return acc;
21
+ }, {});
22
+ logger.heading(`Project Graph - ${config.projectName}`);
23
+ display.blank();
24
+ for (const [type, count] of Object.entries(counts).sort()) {
25
+ display.line(` ${chalk.bold(type)}: ${count}`);
26
+ }
27
+ display.blank();
28
+ logger.dim(`Nodes: ${graph.nodes.length} | Edges: ${graph.edges.length}`);
29
+ logger.dim('Use --json for the protocol graph payload.');
30
+ });
31
+ }
32
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/cli/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,QAAQ,EAAE,0BAA0B,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACtE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,CAAC,OAAO,CAAC,mBAAmB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/cli/index.js CHANGED
@@ -14,6 +14,7 @@ import { registerEstimateCommand } from './commands/estimate.js';
14
14
  import { registerExportCommand } from './commands/export.js';
15
15
  import { registerFeatureCommand } from './commands/feature.js';
16
16
  import { registerGitHubCommand } from './commands/github.js';
17
+ import { registerGraphCommand } from './commands/graph.js';
17
18
  import { registerInitCommand } from './commands/init.js';
18
19
  import { registerLinearCommand } from './commands/linear.js';
19
20
  import { registerPlanCommand } from './commands/plan.js';
@@ -86,6 +87,7 @@ registerReportLinterCommand(program);
86
87
  registerContextCommand(program);
87
88
  registerVoiceCommand(program);
88
89
  registerGitHubCommand(program);
90
+ registerGraphCommand(program);
89
91
  registerSearchCommand(program);
90
92
  registerPlanCommand(program);
91
93
  registerSprintCommand(program);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ArtifactFrontmatter, OpenPlanrConfig } from '../models/types.js';
2
+ export type GraphNodeType = 'epic' | 'feature' | 'story' | 'task' | 'spec' | 'backlog' | 'quick' | 'sprint' | 'adr';
3
+ export type GraphStatus = 'done' | 'in-progress' | 'blocked' | 'outstanding' | 'addressed';
4
+ export type GraphEdgeKind = 'contains' | 'depends_on';
5
+ export interface GraphNode {
6
+ id: string;
7
+ type: GraphNodeType;
8
+ title: string;
9
+ status: GraphStatus;
10
+ frontmatter: ArtifactFrontmatter;
11
+ githubIssue?: string | number;
12
+ linearIssueIdentifier?: string;
13
+ body?: string;
14
+ }
15
+ export interface GraphEdge {
16
+ from: string;
17
+ to: string;
18
+ kind: GraphEdgeKind;
19
+ }
20
+ export interface ProjectGraph {
21
+ nodes: GraphNode[];
22
+ edges: GraphEdge[];
23
+ }
24
+ export interface ReadGraphOptions {
25
+ includeBody?: boolean;
26
+ }
27
+ export declare function classifyGraphStatus(rawStatus: unknown): GraphStatus;
28
+ export declare function readGraph(planrDir: string, opts?: ReadGraphOptions): ProjectGraph;
29
+ export declare function readProjectGraph(projectDir: string, config: OpenPlanrConfig, opts?: ReadGraphOptions): ProjectGraph;
30
+ //# sourceMappingURL=graph-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-service.d.ts","sourceRoot":"","sources":["../../src/services/graph-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG/E,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO,GACP,QAAQ,GACR,KAAK,CAAC;AAEV,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAC3F,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAuID,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,WAAW,CAWnE;AA2DD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,YAAY,CAmDrF;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,EACvB,IAAI,GAAE,gBAAqB,GAC1B,YAAY,CAEd"}
@@ -0,0 +1,262 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseMarkdown } from '../utils/markdown.js';
4
+ const AGILE_DIRS = ['epics', 'features', 'stories', 'tasks', 'backlog', 'quick', 'sprints', 'adrs'];
5
+ const PARENT_FIELDS = ['epicId', 'featureId', 'storyId', 'specId'];
6
+ const DONE_STATES = new Set(['done', 'closed', 'completed', 'shipped', 'released']);
7
+ const ADDRESSED_STATES = new Set(['promoted', 'superseded']);
8
+ const ID_PREFIX_TYPE = {
9
+ EPIC: 'epic',
10
+ FEAT: 'feature',
11
+ US: 'story',
12
+ T: 'task',
13
+ TASK: 'task',
14
+ SPEC: 'spec',
15
+ ADR: 'adr',
16
+ };
17
+ function isArtifactFile(name) {
18
+ if (name.startsWith('.'))
19
+ return false;
20
+ if (name.endsWith('-error-report.md'))
21
+ return false;
22
+ if (name.endsWith('-gherkin.feature'))
23
+ return false;
24
+ return name.endsWith('.md');
25
+ }
26
+ function walkAgileDir(dir, acc) {
27
+ let entries;
28
+ try {
29
+ entries = readdirSync(dir, { withFileTypes: true });
30
+ }
31
+ catch {
32
+ return acc;
33
+ }
34
+ for (const entry of entries) {
35
+ const fullPath = path.join(dir, entry.name);
36
+ if (entry.isDirectory()) {
37
+ if (!entry.name.startsWith('.'))
38
+ walkAgileDir(fullPath, acc);
39
+ }
40
+ else if (entry.isFile() && isArtifactFile(entry.name)) {
41
+ acc.push(fullPath);
42
+ }
43
+ }
44
+ return acc;
45
+ }
46
+ function collectSpecDir(specDir, acc) {
47
+ let entries;
48
+ try {
49
+ entries = readdirSync(specDir, { withFileTypes: true });
50
+ }
51
+ catch {
52
+ return acc;
53
+ }
54
+ for (const entry of entries) {
55
+ const fullPath = path.join(specDir, entry.name);
56
+ if (entry.isFile()) {
57
+ if (/^SPEC-\d+.*\.md$/.test(entry.name))
58
+ acc.push(fullPath);
59
+ }
60
+ else if (entry.isDirectory() && (entry.name === 'stories' || entry.name === 'tasks')) {
61
+ const prefix = entry.name === 'stories' ? 'US-' : 'T-';
62
+ let inner;
63
+ try {
64
+ inner = readdirSync(fullPath, { withFileTypes: true });
65
+ }
66
+ catch {
67
+ continue;
68
+ }
69
+ for (const file of inner) {
70
+ if (file.isFile() && file.name.startsWith(prefix) && isArtifactFile(file.name)) {
71
+ acc.push(path.join(fullPath, file.name));
72
+ }
73
+ }
74
+ }
75
+ }
76
+ return acc;
77
+ }
78
+ function collectArtifacts(planrDir) {
79
+ const acc = [];
80
+ for (const dir of AGILE_DIRS) {
81
+ walkAgileDir(path.join(planrDir, dir), acc);
82
+ }
83
+ const specsRoot = path.join(planrDir, 'specs');
84
+ let specEntries = [];
85
+ try {
86
+ specEntries = readdirSync(specsRoot, { withFileTypes: true });
87
+ }
88
+ catch {
89
+ specEntries = [];
90
+ }
91
+ for (const entry of specEntries) {
92
+ if (entry.isDirectory() && /^SPEC-\d+/.test(entry.name)) {
93
+ collectSpecDir(path.join(specsRoot, entry.name), acc);
94
+ }
95
+ }
96
+ return acc;
97
+ }
98
+ function inferType(relativeDir, id) {
99
+ const segments = relativeDir.split('/').filter(Boolean);
100
+ const top = segments[0] || '';
101
+ switch (top) {
102
+ case 'epics':
103
+ return 'epic';
104
+ case 'features':
105
+ return 'feature';
106
+ case 'stories':
107
+ return 'story';
108
+ case 'tasks':
109
+ return 'task';
110
+ case 'backlog':
111
+ return 'backlog';
112
+ case 'quick':
113
+ return 'quick';
114
+ case 'sprints':
115
+ return 'sprint';
116
+ case 'adrs':
117
+ return 'adr';
118
+ case 'specs':
119
+ if (segments.includes('stories'))
120
+ return 'story';
121
+ if (segments.includes('tasks'))
122
+ return 'task';
123
+ return 'spec';
124
+ default:
125
+ break;
126
+ }
127
+ const prefix = (id || '').split('-')[0].toUpperCase();
128
+ return ID_PREFIX_TYPE[prefix] ?? 'spec';
129
+ }
130
+ function specScopeOf(relativeDir) {
131
+ const segments = relativeDir.split('/').filter(Boolean);
132
+ if (segments[0] !== 'specs')
133
+ return null;
134
+ const match = /^(SPEC-\d+)/.exec(segments[1] || '');
135
+ return match ? match[1] : null;
136
+ }
137
+ export function classifyGraphStatus(rawStatus) {
138
+ const status = String(rawStatus ?? '')
139
+ .trim()
140
+ .toLowerCase();
141
+ if (status === 'blocked')
142
+ return 'blocked';
143
+ if (status === 'in-progress' || status === 'in_progress' || status === 'in progress') {
144
+ return 'in-progress';
145
+ }
146
+ if (DONE_STATES.has(status))
147
+ return 'done';
148
+ if (ADDRESSED_STATES.has(status))
149
+ return 'addressed';
150
+ return 'outstanding';
151
+ }
152
+ function buildNode(absPath, planrDir, includeBody) {
153
+ let raw;
154
+ try {
155
+ raw = readFileSync(absPath, 'utf-8');
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ const parsed = parseMarkdown(raw);
161
+ const frontmatter = { ...(parsed.data || {}) };
162
+ const relativeDir = path
163
+ .relative(planrDir, path.dirname(absPath))
164
+ .split(path.sep)
165
+ .join('/')
166
+ .replace(/^\//, '');
167
+ const localId = frontmatter.id != null && String(frontmatter.id).trim() !== ''
168
+ ? String(frontmatter.id)
169
+ : path.basename(absPath, '.md');
170
+ const type = inferType(relativeDir, localId);
171
+ const scope = specScopeOf(relativeDir);
172
+ const id = scope && type !== 'spec' ? `${scope}/${localId}` : localId;
173
+ const title = frontmatter.title != null && String(frontmatter.title).trim() !== ''
174
+ ? String(frontmatter.title)
175
+ : localId;
176
+ frontmatter.id = localId;
177
+ if (scope)
178
+ frontmatter.specScope = scope;
179
+ const node = {
180
+ id,
181
+ type,
182
+ title,
183
+ status: classifyGraphStatus(frontmatter.status),
184
+ frontmatter,
185
+ };
186
+ if (frontmatter.githubIssue !== undefined && frontmatter.githubIssue !== '') {
187
+ node.githubIssue = frontmatter.githubIssue;
188
+ }
189
+ if (frontmatter.linearIssueIdentifier !== undefined && frontmatter.linearIssueIdentifier !== '') {
190
+ node.linearIssueIdentifier = String(frontmatter.linearIssueIdentifier);
191
+ }
192
+ if (includeBody)
193
+ node.body = parsed.content;
194
+ return node;
195
+ }
196
+ function resolveRef(rawRef, scope, field) {
197
+ const ref = String(rawRef);
198
+ if (!scope)
199
+ return ref;
200
+ if (field === 'specId' || /^SPEC-\d+/.test(ref))
201
+ return ref;
202
+ return `${scope}/${ref}`;
203
+ }
204
+ export function readGraph(planrDir, opts = {}) {
205
+ if (!planrDir || !existsSync(planrDir))
206
+ return { nodes: [], edges: [] };
207
+ let stat;
208
+ try {
209
+ stat = statSync(planrDir);
210
+ }
211
+ catch {
212
+ return { nodes: [], edges: [] };
213
+ }
214
+ if (!stat.isDirectory())
215
+ return { nodes: [], edges: [] };
216
+ const nodes = [];
217
+ const idSet = new Set();
218
+ for (const file of collectArtifacts(planrDir)) {
219
+ const node = buildNode(file, planrDir, opts.includeBody === true);
220
+ if (!node?.id || idSet.has(node.id))
221
+ continue;
222
+ nodes.push(node);
223
+ idSet.add(node.id);
224
+ }
225
+ const edges = [];
226
+ const edgeSet = new Set();
227
+ const addEdge = (from, to, kind) => {
228
+ if (!from || !to)
229
+ return;
230
+ const key = `${kind}\0${from}\0${to}`;
231
+ if (edgeSet.has(key))
232
+ return;
233
+ edgeSet.add(key);
234
+ edges.push({ from, to, kind });
235
+ };
236
+ for (const node of nodes) {
237
+ const scope = typeof node.frontmatter.specScope === 'string' ? node.frontmatter.specScope : null;
238
+ for (const field of PARENT_FIELDS) {
239
+ const parent = node.frontmatter[field];
240
+ if (parent == null || parent === '')
241
+ continue;
242
+ const parentId = resolveRef(parent, scope, field);
243
+ if (idSet.has(parentId))
244
+ addEdge(parentId, node.id, 'contains');
245
+ }
246
+ const dependsOn = node.frontmatter.dependsOn;
247
+ if (Array.isArray(dependsOn)) {
248
+ for (const dep of dependsOn) {
249
+ if (dep == null || dep === '')
250
+ continue;
251
+ const depId = resolveRef(dep, scope, 'dependsOn');
252
+ if (idSet.has(depId))
253
+ addEdge(node.id, depId, 'depends_on');
254
+ }
255
+ }
256
+ }
257
+ return { nodes, edges };
258
+ }
259
+ export function readProjectGraph(projectDir, config, opts = {}) {
260
+ return readGraph(path.join(projectDir, config.outputPaths.agile), opts);
261
+ }
262
+ //# sourceMappingURL=graph-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-service.js","sourceRoot":"","sources":["../../src/services/graph-service.ts"],"names":[],"mappings":"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"}
@@ -130,7 +130,7 @@ error_reports:
130
130
 
131
131
  - **R1** — Never auto-chain PLAN → SHIP. Always wait for explicit "ship {feature}".
132
132
  - **R2** — Max 2 tasks per US.
133
- - **R3** — Roles using `Sonnet 4.6` are analysis/decomposition; roles using `Opus 4.8` are codegen. On Codex, use the model picker to match.
133
+ - **R3** — Roles using `Sonnet 5` are analysis/decomposition; roles using `Opus 4.8` are codegen. On Codex, use the model picker to match.
134
134
  - **R5** — Files in any task's `Preserve:` list MUST NOT be touched. Conformance test asserts this via `git diff` on Preserve paths.
135
135
  - **R6** — Max 3 correction iterations per task.
136
136
  - **R7** — Refresh CLAUDE.md (or skip if planr-managed); always write `.pipeline-shipped` marker.
@@ -82,7 +82,7 @@ The generated file must contain exactly these 10 sections:
82
82
  ```markdown
83
83
  # Design Spec — feat-{name}
84
84
 
85
- > Auto-generated by designer-agent (Sonnet 4.6)
85
+ > Auto-generated by designer-agent (Sonnet 5)
86
86
  > Source PNGs: [list of files analyzed]
87
87
  > Generated: [timestamp]
88
88
 
@@ -92,7 +92,7 @@ Output: a single Markdown file at output/feats/feat-{name}/qa-report.md.
92
92
  ```markdown
93
93
  # QA Report — feat-{name}
94
94
 
95
- > Generated by QA Agent (Sonnet 4.6) at {timestamp}
95
+ > Generated by QA Agent (Sonnet 5) at {timestamp}
96
96
 
97
97
  ## Summary
98
98
 
@@ -85,7 +85,7 @@ Be concrete: file paths, function names, endpoint names, DB table names.
85
85
 
86
86
  > **Feature:** feat-{name}
87
87
  > **Status:** pending
88
- > **Agent:** Specification Agent (Sonnet 4.6)
88
+ > **Agent:** Specification Agent (Sonnet 5)
89
89
 
90
90
  ---
91
91
 
@@ -97,7 +97,7 @@ list. **Treat the restrictions as binding.**
97
97
 
98
98
  - **R1** — Never auto-chain PO → DEV. Two user invocations required.
99
99
  - **R2** — Max 2 tasks per US (1 if no PNG, 2 if PNG present).
100
- - **R3** — Model assignments: roles using `Sonnet 4.6` are analysis/decomposition;
100
+ - **R3** — Model assignments: roles using `Sonnet 5` are analysis/decomposition;
101
101
  roles using `Opus 4.8` are codegen. On Cursor, use the runtime's tier
102
102
  selector (Cursor's "Composer model" setting) and pick the equivalent.
103
103
  - **R5** — Files in any task's `Preserve:` list MUST NOT be touched.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "1.7.2",
3
+ "version": "1.8.1",
4
4
  "description": "AI-powered planning CLI — backlog, sprints, task templates, estimation, GitHub and Linear sync, and AI agent rules for Cursor, Claude Code, and Codex",
5
5
  "type": "module",
6
6
  "main": "./dist/cli/index.js",