openplanr 0.8.0 → 1.0.0

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 (227) hide show
  1. package/README.md +142 -52
  2. package/dist/agents/index.d.ts +1 -5
  3. package/dist/agents/index.d.ts.map +1 -1
  4. package/dist/agents/index.js +1 -4
  5. package/dist/agents/index.js.map +1 -1
  6. package/dist/agents/task-parser.d.ts +4 -1
  7. package/dist/agents/task-parser.d.ts.map +1 -1
  8. package/dist/agents/task-parser.js +6 -3
  9. package/dist/agents/task-parser.js.map +1 -1
  10. package/dist/agents/utils.d.ts +0 -4
  11. package/dist/agents/utils.d.ts.map +1 -1
  12. package/dist/agents/utils.js +3 -24
  13. package/dist/agents/utils.js.map +1 -1
  14. package/dist/ai/codebase/context-builder.d.ts +22 -3
  15. package/dist/ai/codebase/context-builder.d.ts.map +1 -1
  16. package/dist/ai/codebase/context-builder.js +202 -14
  17. package/dist/ai/codebase/context-builder.js.map +1 -1
  18. package/dist/ai/codebase/file-reader.d.ts.map +1 -1
  19. package/dist/ai/codebase/file-reader.js +7 -3
  20. package/dist/ai/codebase/file-reader.js.map +1 -1
  21. package/dist/ai/codebase/index.d.ts +3 -1
  22. package/dist/ai/codebase/index.d.ts.map +1 -1
  23. package/dist/ai/codebase/index.js +3 -1
  24. package/dist/ai/codebase/index.js.map +1 -1
  25. package/dist/ai/codebase/pattern-rules.d.ts +28 -0
  26. package/dist/ai/codebase/pattern-rules.d.ts.map +1 -0
  27. package/dist/ai/codebase/pattern-rules.js +186 -0
  28. package/dist/ai/codebase/pattern-rules.js.map +1 -0
  29. package/dist/ai/codebase/rules-reader.d.ts +14 -0
  30. package/dist/ai/codebase/rules-reader.d.ts.map +1 -0
  31. package/dist/ai/codebase/rules-reader.js +25 -0
  32. package/dist/ai/codebase/rules-reader.js.map +1 -0
  33. package/dist/ai/codebase/stack-detector.d.ts.map +1 -1
  34. package/dist/ai/codebase/stack-detector.js +4 -1
  35. package/dist/ai/codebase/stack-detector.js.map +1 -1
  36. package/dist/ai/codebase/tree-generator.d.ts.map +1 -1
  37. package/dist/ai/codebase/tree-generator.js +5 -2
  38. package/dist/ai/codebase/tree-generator.js.map +1 -1
  39. package/dist/ai/errors.js +1 -1
  40. package/dist/ai/errors.js.map +1 -1
  41. package/dist/ai/prompts/prompt-builder.d.ts +12 -0
  42. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  43. package/dist/ai/prompts/prompt-builder.js +45 -3
  44. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  45. package/dist/ai/prompts/system-prompts.d.ts +5 -3
  46. package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
  47. package/dist/ai/prompts/system-prompts.js +74 -13
  48. package/dist/ai/prompts/system-prompts.js.map +1 -1
  49. package/dist/ai/schemas/ai-response-schemas.d.ts +48 -2
  50. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
  51. package/dist/ai/schemas/ai-response-schemas.js +19 -0
  52. package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
  53. package/dist/ai/types.d.ts +4 -2
  54. package/dist/ai/types.d.ts.map +1 -1
  55. package/dist/ai/types.js +3 -1
  56. package/dist/ai/types.js.map +1 -1
  57. package/dist/ai/validation/dependency-chains.d.ts +21 -0
  58. package/dist/ai/validation/dependency-chains.d.ts.map +1 -0
  59. package/dist/ai/validation/dependency-chains.js +114 -0
  60. package/dist/ai/validation/dependency-chains.js.map +1 -0
  61. package/dist/ai/validation/index.d.ts +3 -0
  62. package/dist/ai/validation/index.d.ts.map +1 -0
  63. package/dist/ai/validation/index.js +3 -0
  64. package/dist/ai/validation/index.js.map +1 -0
  65. package/dist/ai/validation/task-validator.d.ts +37 -0
  66. package/dist/ai/validation/task-validator.d.ts.map +1 -0
  67. package/dist/ai/validation/task-validator.js +89 -0
  68. package/dist/ai/validation/task-validator.js.map +1 -0
  69. package/dist/cli/commands/backlog.d.ts +10 -0
  70. package/dist/cli/commands/backlog.d.ts.map +1 -0
  71. package/dist/cli/commands/backlog.js +292 -0
  72. package/dist/cli/commands/backlog.js.map +1 -0
  73. package/dist/cli/commands/checklist.js +4 -4
  74. package/dist/cli/commands/checklist.js.map +1 -1
  75. package/dist/cli/commands/config.js +13 -13
  76. package/dist/cli/commands/config.js.map +1 -1
  77. package/dist/cli/commands/epic.d.ts.map +1 -1
  78. package/dist/cli/commands/epic.js +41 -22
  79. package/dist/cli/commands/epic.js.map +1 -1
  80. package/dist/cli/commands/estimate.d.ts.map +1 -1
  81. package/dist/cli/commands/estimate.js +40 -39
  82. package/dist/cli/commands/estimate.js.map +1 -1
  83. package/dist/cli/commands/export.d.ts +8 -0
  84. package/dist/cli/commands/export.d.ts.map +1 -0
  85. package/dist/cli/commands/export.js +282 -0
  86. package/dist/cli/commands/export.js.map +1 -0
  87. package/dist/cli/commands/feature.js +9 -9
  88. package/dist/cli/commands/feature.js.map +1 -1
  89. package/dist/cli/commands/github.d.ts +8 -0
  90. package/dist/cli/commands/github.d.ts.map +1 -0
  91. package/dist/cli/commands/github.js +415 -0
  92. package/dist/cli/commands/github.js.map +1 -0
  93. package/dist/cli/commands/plan.d.ts.map +1 -1
  94. package/dist/cli/commands/plan.js +104 -50
  95. package/dist/cli/commands/plan.js.map +1 -1
  96. package/dist/cli/commands/quick.d.ts.map +1 -1
  97. package/dist/cli/commands/quick.js +37 -107
  98. package/dist/cli/commands/quick.js.map +1 -1
  99. package/dist/cli/commands/refine.js +21 -21
  100. package/dist/cli/commands/refine.js.map +1 -1
  101. package/dist/cli/commands/search.d.ts.map +1 -1
  102. package/dist/cli/commands/search.js +18 -7
  103. package/dist/cli/commands/search.js.map +1 -1
  104. package/dist/cli/commands/sprint.d.ts +9 -0
  105. package/dist/cli/commands/sprint.d.ts.map +1 -0
  106. package/dist/cli/commands/sprint.js +519 -0
  107. package/dist/cli/commands/sprint.js.map +1 -0
  108. package/dist/cli/commands/status.d.ts.map +1 -1
  109. package/dist/cli/commands/status.js +77 -32
  110. package/dist/cli/commands/status.js.map +1 -1
  111. package/dist/cli/commands/story.js +15 -15
  112. package/dist/cli/commands/story.js.map +1 -1
  113. package/dist/cli/commands/sync.js +11 -7
  114. package/dist/cli/commands/sync.js.map +1 -1
  115. package/dist/cli/commands/task.d.ts +0 -2
  116. package/dist/cli/commands/task.d.ts.map +1 -1
  117. package/dist/cli/commands/task.js +14 -169
  118. package/dist/cli/commands/task.js.map +1 -1
  119. package/dist/cli/commands/template.d.ts +10 -0
  120. package/dist/cli/commands/template.d.ts.map +1 -0
  121. package/dist/cli/commands/template.js +269 -0
  122. package/dist/cli/commands/template.js.map +1 -0
  123. package/dist/cli/helpers/task-creation.d.ts +89 -0
  124. package/dist/cli/helpers/task-creation.d.ts.map +1 -0
  125. package/dist/cli/helpers/task-creation.js +140 -0
  126. package/dist/cli/helpers/task-creation.js.map +1 -0
  127. package/dist/cli/index.js +29 -2
  128. package/dist/cli/index.js.map +1 -1
  129. package/dist/models/schema.d.ts +2 -0
  130. package/dist/models/schema.d.ts.map +1 -1
  131. package/dist/models/schema.js +2 -0
  132. package/dist/models/schema.js.map +1 -1
  133. package/dist/models/types.d.ts +32 -1
  134. package/dist/models/types.d.ts.map +1 -1
  135. package/dist/services/artifact-gathering.d.ts +2 -0
  136. package/dist/services/artifact-gathering.d.ts.map +1 -1
  137. package/dist/services/artifact-gathering.js +26 -7
  138. package/dist/services/artifact-gathering.js.map +1 -1
  139. package/dist/services/artifact-service.d.ts +5 -5
  140. package/dist/services/artifact-service.d.ts.map +1 -1
  141. package/dist/services/artifact-service.js +4 -0
  142. package/dist/services/artifact-service.js.map +1 -1
  143. package/dist/services/config-service.d.ts.map +1 -1
  144. package/dist/services/config-service.js +2 -0
  145. package/dist/services/config-service.js.map +1 -1
  146. package/dist/services/credential-backends.d.ts.map +1 -1
  147. package/dist/services/credential-backends.js +15 -7
  148. package/dist/services/credential-backends.js.map +1 -1
  149. package/dist/services/credentials-service.d.ts.map +1 -1
  150. package/dist/services/credentials-service.js +6 -3
  151. package/dist/services/credentials-service.js.map +1 -1
  152. package/dist/services/github-service.d.ts +83 -0
  153. package/dist/services/github-service.d.ts.map +1 -0
  154. package/dist/services/github-service.js +440 -0
  155. package/dist/services/github-service.js.map +1 -0
  156. package/dist/services/template-service.d.ts +2 -1
  157. package/dist/services/template-service.d.ts.map +1 -1
  158. package/dist/services/template-service.js +3 -1
  159. package/dist/services/template-service.js.map +1 -1
  160. package/dist/templates/backlog/backlog-item.md.hbs +40 -0
  161. package/dist/templates/checklists/agile-checklist.md.hbs +1 -1
  162. package/dist/templates/export/planning-report.html.hbs +230 -0
  163. package/dist/templates/export/planning-report.md.hbs +136 -0
  164. package/dist/templates/quick/quick-task.md.hbs +1 -1
  165. package/dist/templates/rules/claude/CLAUDE.md.hbs +78 -35
  166. package/dist/templates/rules/codex/AGENTS.md.hbs +73 -17
  167. package/dist/templates/rules/cursor/2101-implement-task-list.mdc.hbs +66 -14
  168. package/dist/templates/sprints/sprint.md.hbs +42 -0
  169. package/dist/templates/task-templates/api-integration.json +45 -0
  170. package/dist/templates/task-templates/auth-flow.json +48 -0
  171. package/dist/templates/task-templates/database-migration.json +44 -0
  172. package/dist/templates/task-templates/react-component.json +45 -0
  173. package/dist/templates/task-templates/rest-endpoint.json +53 -0
  174. package/dist/templates/tasks/task-list.md.hbs +1 -1
  175. package/dist/utils/constants.d.ts +4 -0
  176. package/dist/utils/constants.d.ts.map +1 -1
  177. package/dist/utils/constants.js +4 -0
  178. package/dist/utils/constants.js.map +1 -1
  179. package/dist/utils/logger.d.ts +31 -1
  180. package/dist/utils/logger.d.ts.map +1 -1
  181. package/dist/utils/logger.js +92 -9
  182. package/dist/utils/logger.js.map +1 -1
  183. package/dist/utils/markdown.d.ts +3 -2
  184. package/dist/utils/markdown.d.ts.map +1 -1
  185. package/dist/utils/markdown.js +3 -1
  186. package/dist/utils/markdown.js.map +1 -1
  187. package/dist/utils/slugify.d.ts +8 -1
  188. package/dist/utils/slugify.d.ts.map +1 -1
  189. package/dist/utils/slugify.js +18 -2
  190. package/dist/utils/slugify.js.map +1 -1
  191. package/package.json +14 -3
  192. package/dist/agents/agent-factory.d.ts +0 -7
  193. package/dist/agents/agent-factory.d.ts.map +0 -1
  194. package/dist/agents/agent-factory.js +0 -22
  195. package/dist/agents/agent-factory.js.map +0 -1
  196. package/dist/agents/claude-agent.d.ts +0 -18
  197. package/dist/agents/claude-agent.d.ts.map +0 -1
  198. package/dist/agents/claude-agent.js +0 -183
  199. package/dist/agents/claude-agent.js.map +0 -1
  200. package/dist/agents/codex-agent.d.ts +0 -17
  201. package/dist/agents/codex-agent.d.ts.map +0 -1
  202. package/dist/agents/codex-agent.js +0 -124
  203. package/dist/agents/codex-agent.js.map +0 -1
  204. package/dist/agents/cursor-agent.d.ts +0 -14
  205. package/dist/agents/cursor-agent.d.ts.map +0 -1
  206. package/dist/agents/cursor-agent.js +0 -49
  207. package/dist/agents/cursor-agent.js.map +0 -1
  208. package/dist/agents/implementation-bridge.d.ts +0 -30
  209. package/dist/agents/implementation-bridge.d.ts.map +0 -1
  210. package/dist/agents/implementation-bridge.js +0 -256
  211. package/dist/agents/implementation-bridge.js.map +0 -1
  212. package/dist/agents/progress.d.ts +0 -62
  213. package/dist/agents/progress.d.ts.map +0 -1
  214. package/dist/agents/progress.js +0 -155
  215. package/dist/agents/progress.js.map +0 -1
  216. package/dist/agents/prompt-composer.d.ts +0 -30
  217. package/dist/agents/prompt-composer.d.ts.map +0 -1
  218. package/dist/agents/prompt-composer.js +0 -81
  219. package/dist/agents/prompt-composer.js.map +0 -1
  220. package/dist/agents/types.d.ts +0 -25
  221. package/dist/agents/types.d.ts.map +0 -1
  222. package/dist/agents/types.js +0 -8
  223. package/dist/agents/types.js.map +0 -1
  224. package/dist/utils/error-context.d.ts +0 -23
  225. package/dist/utils/error-context.d.ts.map +0 -1
  226. package/dist/utils/error-context.js +0 -94
  227. package/dist/utils/error-context.js.map +0 -1
@@ -0,0 +1,519 @@
1
+ /**
2
+ * `planr sprint` command group.
3
+ *
4
+ * Time-boxed iterations with velocity tracking, burndown
5
+ * metrics, and carryover management.
6
+ */
7
+ import path from 'node:path';
8
+ import chalk from 'chalk';
9
+ import { buildSprintAutoSelectPrompt } from '../../ai/prompts/prompt-builder.js';
10
+ import { aiSprintAutoSelectResponseSchema } from '../../ai/schemas/ai-response-schemas.js';
11
+ import { TOKEN_BUDGETS } from '../../ai/types.js';
12
+ import { generateStreamingJSON, getAIProvider, isAIConfigured } from '../../services/ai-service.js';
13
+ import { createArtifact, listArtifacts, readArtifact, readArtifactRaw, updateArtifact, } from '../../services/artifact-service.js';
14
+ import { loadConfig } from '../../services/config-service.js';
15
+ import { promptConfirm, promptEditor, promptText } from '../../services/prompt-service.js';
16
+ import { display, logger } from '../../utils/logger.js';
17
+ import { parseMarkdown } from '../../utils/markdown.js';
18
+ export function registerSprintCommand(program) {
19
+ const sprint = program.command('sprint').description('Time-boxed sprint planning and tracking');
20
+ // -----------------------------------------------------------------------
21
+ // planr sprint create
22
+ // -----------------------------------------------------------------------
23
+ sprint
24
+ .command('create')
25
+ .description('Create a new sprint')
26
+ .option('-n, --name <name>', 'sprint name')
27
+ .option('-d, --duration <duration>', 'sprint duration (e.g., 1w, 2w)', '2w')
28
+ .action(async (opts) => {
29
+ const projectDir = program.opts().projectDir;
30
+ const config = await loadConfig(projectDir);
31
+ // Enforce: only one active sprint at a time
32
+ const existing = await loadSprints(projectDir, config);
33
+ const activeSprint = existing.find((s) => s.status === 'active');
34
+ if (activeSprint) {
35
+ logger.error(`Sprint ${activeSprint.id} is already active. Close it first with \`planr sprint close\`.`);
36
+ return;
37
+ }
38
+ const name = opts.name || (await promptText('Sprint name:'));
39
+ const duration = parseDuration(opts.duration);
40
+ if (!duration) {
41
+ logger.error('Invalid duration. Use format like 1w, 2w, 3w, 4w.');
42
+ return;
43
+ }
44
+ const startDate = new Date().toISOString().split('T')[0];
45
+ const endDate = addDays(new Date(), duration.days).toISOString().split('T')[0];
46
+ const { id, filePath } = await createArtifact(projectDir, config, 'sprint', 'sprints/sprint.md.hbs', {
47
+ title: name,
48
+ name,
49
+ startDate,
50
+ endDate,
51
+ duration: opts.duration,
52
+ status: 'active',
53
+ goals: [],
54
+ taskIds: [],
55
+ });
56
+ logger.success(`Created ${id}: ${name}`);
57
+ logger.dim(` ${startDate} -> ${endDate} (${opts.duration})`);
58
+ logger.dim(` ${filePath}`);
59
+ logger.dim('');
60
+ logger.heading('Next steps:');
61
+ logger.dim(` planr sprint add TASK-001 TASK-002 — Assign tasks`);
62
+ logger.dim(` planr sprint add --auto — AI selects tasks by priority`);
63
+ logger.dim(` planr sprint status — View progress`);
64
+ });
65
+ // -----------------------------------------------------------------------
66
+ // planr sprint add <taskIds...>
67
+ // -----------------------------------------------------------------------
68
+ sprint
69
+ .command('add')
70
+ .description('Add tasks to the active sprint')
71
+ .argument('[taskIds...]', 'task IDs to add (e.g., TASK-001 QT-003)')
72
+ .option('--auto', 'AI auto-selects tasks based on priority and velocity')
73
+ .action(async (taskIds, opts) => {
74
+ const projectDir = program.opts().projectDir;
75
+ const config = await loadConfig(projectDir);
76
+ const active = await getActiveSprint(projectDir, config);
77
+ if (!active)
78
+ return;
79
+ if (opts.auto) {
80
+ await autoSelectTasks(projectDir, config, active.id);
81
+ return;
82
+ }
83
+ if (taskIds.length === 0) {
84
+ logger.error('Provide task IDs or use --auto for AI selection.');
85
+ return;
86
+ }
87
+ // Validate task IDs exist and collect metadata for display
88
+ const validIds = [];
89
+ const taskMeta = {};
90
+ for (const taskId of taskIds) {
91
+ const prefix = taskId.split('-')[0];
92
+ const type = prefix === 'QT' ? 'quick' : prefix === 'TASK' ? 'task' : null;
93
+ if (!type) {
94
+ logger.warn(`Skipping ${taskId} — only TASK-* and QT-* IDs are supported.`);
95
+ continue;
96
+ }
97
+ const artifact = await readArtifact(projectDir, config, type, taskId);
98
+ if (!artifact) {
99
+ logger.warn(`Skipping ${taskId} — not found.`);
100
+ continue;
101
+ }
102
+ validIds.push(taskId);
103
+ const filename = path.basename(artifact.filePath);
104
+ taskMeta[taskId] = {
105
+ title: artifact.data.title || taskId,
106
+ filename,
107
+ };
108
+ }
109
+ if (validIds.length === 0) {
110
+ logger.error('No valid task IDs to add.');
111
+ return;
112
+ }
113
+ // Add task IDs to sprint frontmatter
114
+ const raw = await readArtifactRaw(projectDir, config, 'sprint', active.id);
115
+ if (!raw)
116
+ return;
117
+ const { data } = parseMarkdown(raw);
118
+ const currentIds = Array.isArray(data.taskIds) ? data.taskIds : [];
119
+ const newIds = validIds.filter((id) => !currentIds.includes(id));
120
+ const dupes = validIds.filter((id) => currentIds.includes(id));
121
+ if (dupes.length > 0) {
122
+ logger.warn(`Already in sprint: ${dupes.join(', ')}`);
123
+ }
124
+ if (newIds.length === 0) {
125
+ logger.info('No new tasks to add.');
126
+ return;
127
+ }
128
+ const allIds = [...currentIds, ...newIds];
129
+ let updated = raw.replace(/^taskIds: \[.*\]$/m, `taskIds: [${allIds.map((id) => `"${id}"`).join(', ')}]`);
130
+ // Also add task checkboxes to the ## Tasks section (with title + link)
131
+ const taskLines = newIds
132
+ .map((id) => {
133
+ const meta = taskMeta[id];
134
+ const prefix = id.split('-')[0];
135
+ const dir = prefix === 'QT' ? 'quick' : 'tasks';
136
+ if (meta) {
137
+ return `- [ ] **${id}** ${meta.title} — [view](../${dir}/${meta.filename})`;
138
+ }
139
+ return `- [ ] ${id}`;
140
+ })
141
+ .join('\n');
142
+ updated = updated.replace(/^_No tasks assigned yet\..*$/m, taskLines);
143
+ // If tasks section already has items, append
144
+ if (!updated.includes(taskLines)) {
145
+ updated = updated.replace(/(## Tasks\n(?:- \[[ x]\] .+\n)*)/, `$1${taskLines}\n`);
146
+ }
147
+ await updateArtifact(projectDir, config, 'sprint', active.id, updated);
148
+ logger.success(`Added ${newIds.length} task${newIds.length !== 1 ? 's' : ''} to ${active.id}`);
149
+ for (const id of newIds) {
150
+ logger.dim(` + ${id}`);
151
+ }
152
+ });
153
+ // -----------------------------------------------------------------------
154
+ // planr sprint status
155
+ // -----------------------------------------------------------------------
156
+ sprint
157
+ .command('status')
158
+ .description('Show active sprint progress')
159
+ .action(async () => {
160
+ const projectDir = program.opts().projectDir;
161
+ const config = await loadConfig(projectDir);
162
+ const active = await getActiveSprint(projectDir, config);
163
+ if (!active)
164
+ return;
165
+ const raw = await readArtifactRaw(projectDir, config, 'sprint', active.id);
166
+ if (!raw)
167
+ return;
168
+ const { data } = parseMarkdown(raw);
169
+ const taskIds = Array.isArray(data.taskIds) ? data.taskIds : [];
170
+ logger.heading(`${active.id}: ${data.name || active.title}`);
171
+ display.blank();
172
+ display.line(` Duration: ${data.duration || 'N/A'}`);
173
+ display.line(` Period: ${data.startDate || '?'} -> ${data.endDate || '?'}`);
174
+ // Calculate days remaining
175
+ if (data.endDate) {
176
+ const end = new Date(data.endDate);
177
+ const now = new Date();
178
+ const daysLeft = Math.ceil((end.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
179
+ if (daysLeft > 0) {
180
+ display.line(` Remaining: ${chalk.yellow(`${daysLeft} days`)}`);
181
+ }
182
+ else {
183
+ display.line(` Remaining: ${chalk.red('Sprint ended')}`);
184
+ }
185
+ }
186
+ display.line(` Tasks: ${taskIds.length}`);
187
+ display.blank();
188
+ if (taskIds.length === 0) {
189
+ logger.dim(' No tasks assigned. Run `planr sprint add` to add tasks.');
190
+ return;
191
+ }
192
+ // Compute task completion
193
+ const { parseTaskMarkdown } = await import('../../agents/task-parser.js');
194
+ let totalDone = 0;
195
+ let totalSubtasks = 0;
196
+ for (const taskId of taskIds) {
197
+ const prefix = taskId.split('-')[0];
198
+ const type = prefix === 'QT' ? 'quick' : 'task';
199
+ const taskRaw = await readArtifactRaw(projectDir, config, type, taskId);
200
+ if (!taskRaw) {
201
+ display.line(` ${chalk.red('?')} ${taskId} ${chalk.dim('not found')}`);
202
+ continue;
203
+ }
204
+ const parsed = parseTaskMarkdown(taskRaw);
205
+ const subtasks = parsed.filter((s) => s.depth > 0);
206
+ const total = subtasks.length || parsed.length;
207
+ const done = (subtasks.length > 0 ? subtasks : parsed).filter((s) => s.done).length;
208
+ totalDone += done;
209
+ totalSubtasks += total;
210
+ const pct = total > 0 ? Math.round((done / total) * 100) : 0;
211
+ const icon = pct === 100 ? chalk.green('✓') : pct > 0 ? chalk.yellow('◐') : chalk.dim('○');
212
+ const progress = total > 0 ? colorByPercent(`(${done}/${total}, ${pct}%)`, pct) : '';
213
+ display.line(` ${icon} ${chalk.bold(taskId)} ${progress}`);
214
+ }
215
+ if (totalSubtasks > 0) {
216
+ const overallPct = Math.round((totalDone / totalSubtasks) * 100);
217
+ display.blank();
218
+ // Simple progress bar
219
+ const barWidth = 30;
220
+ const filled = Math.round((overallPct / 100) * barWidth);
221
+ const bar = chalk.green('█'.repeat(filled)) + chalk.dim('░'.repeat(barWidth - filled));
222
+ display.line(` ${bar} ${colorByPercent(`${overallPct}%`, overallPct)}`);
223
+ display.line(chalk.dim(` ${totalDone}/${totalSubtasks} subtasks complete`));
224
+ }
225
+ display.blank();
226
+ });
227
+ // -----------------------------------------------------------------------
228
+ // planr sprint close
229
+ // -----------------------------------------------------------------------
230
+ sprint
231
+ .command('close')
232
+ .description('Close the active sprint and carry over incomplete tasks')
233
+ .action(async () => {
234
+ const projectDir = program.opts().projectDir;
235
+ const config = await loadConfig(projectDir);
236
+ const active = await getActiveSprint(projectDir, config);
237
+ if (!active)
238
+ return;
239
+ const raw = await readArtifactRaw(projectDir, config, 'sprint', active.id);
240
+ if (!raw)
241
+ return;
242
+ const { data } = parseMarkdown(raw);
243
+ const taskIds = Array.isArray(data.taskIds) ? data.taskIds : [];
244
+ // Find incomplete tasks
245
+ const { parseTaskMarkdown } = await import('../../agents/task-parser.js');
246
+ const incomplete = [];
247
+ for (const taskId of taskIds) {
248
+ const prefix = taskId.split('-')[0];
249
+ const type = prefix === 'QT' ? 'quick' : 'task';
250
+ const taskRaw = await readArtifactRaw(projectDir, config, type, taskId);
251
+ if (!taskRaw)
252
+ continue;
253
+ const parsed = parseTaskMarkdown(taskRaw);
254
+ const subtasks = parsed.filter((s) => s.depth > 0);
255
+ const items = subtasks.length > 0 ? subtasks : parsed;
256
+ const allDone = items.every((s) => s.done);
257
+ if (!allDone)
258
+ incomplete.push(taskId);
259
+ }
260
+ // Optional retrospective
261
+ let retro = '';
262
+ const addRetro = await promptConfirm('Add retrospective notes?', false);
263
+ if (addRetro) {
264
+ retro = await promptEditor('Sprint retrospective:');
265
+ }
266
+ // Update sprint status
267
+ let updated = raw.replace(/^status: "active"$/m, 'status: "closed"');
268
+ if (retro) {
269
+ updated = updated.replace(/^_Complete this section when closing.*$/m, retro.trim());
270
+ }
271
+ await updateArtifact(projectDir, config, 'sprint', active.id, updated);
272
+ const completedCount = taskIds.length - incomplete.length;
273
+ logger.success(`Closed ${active.id}: ${data.name || active.title}`);
274
+ logger.dim(` Completed: ${completedCount}/${taskIds.length} tasks`);
275
+ if (incomplete.length > 0) {
276
+ display.blank();
277
+ logger.heading('Incomplete tasks (carry over to next sprint):');
278
+ for (const id of incomplete) {
279
+ logger.dim(` ${id}`);
280
+ }
281
+ logger.dim('');
282
+ logger.dim('Create a new sprint and add them:');
283
+ logger.dim(` planr sprint create --name "Sprint N"`);
284
+ logger.dim(` planr sprint add ${incomplete.join(' ')}`);
285
+ }
286
+ // Show velocity summary
287
+ const sprints = await loadSprints(projectDir, config);
288
+ const closedSprints = sprints.filter((s) => s.status === 'closed');
289
+ if (closedSprints.length >= 2) {
290
+ display.blank();
291
+ displayVelocityHistory(closedSprints);
292
+ }
293
+ });
294
+ // -----------------------------------------------------------------------
295
+ // planr sprint list
296
+ // -----------------------------------------------------------------------
297
+ sprint
298
+ .command('list')
299
+ .description('List all sprints')
300
+ .action(async () => {
301
+ const projectDir = program.opts().projectDir;
302
+ const config = await loadConfig(projectDir);
303
+ const sprints = await loadSprints(projectDir, config);
304
+ if (sprints.length === 0) {
305
+ logger.info('No sprints found. Run "planr sprint create" to start one.');
306
+ return;
307
+ }
308
+ logger.heading('Sprints');
309
+ display.blank();
310
+ for (const s of sprints) {
311
+ const statusColor = s.status === 'active' ? chalk.green : s.status === 'closed' ? chalk.dim : chalk.yellow;
312
+ const badge = statusColor(`[${s.status.toUpperCase()}]`);
313
+ const taskCount = chalk.dim(`(${s.taskCount} tasks)`);
314
+ display.line(` ${chalk.bold(s.id)} ${s.name} ${badge} ${taskCount}`);
315
+ if (s.startDate && s.endDate) {
316
+ display.line(chalk.dim(` ${s.startDate} -> ${s.endDate}`));
317
+ }
318
+ }
319
+ display.blank();
320
+ });
321
+ // -----------------------------------------------------------------------
322
+ // planr sprint history
323
+ // -----------------------------------------------------------------------
324
+ sprint
325
+ .command('history')
326
+ .description('Show velocity history across sprints')
327
+ .action(async () => {
328
+ const projectDir = program.opts().projectDir;
329
+ const config = await loadConfig(projectDir);
330
+ const sprints = await loadSprints(projectDir, config);
331
+ const closed = sprints.filter((s) => s.status === 'closed');
332
+ if (closed.length === 0) {
333
+ logger.info('No closed sprints yet. Complete a sprint to see velocity history.');
334
+ return;
335
+ }
336
+ logger.heading('Sprint Velocity History');
337
+ display.blank();
338
+ displayVelocityHistory(closed);
339
+ });
340
+ }
341
+ async function loadSprints(projectDir, config) {
342
+ const artifacts = await listArtifacts(projectDir, config, 'sprint');
343
+ const sprints = [];
344
+ for (const artifact of artifacts) {
345
+ const raw = await readArtifactRaw(projectDir, config, 'sprint', artifact.id);
346
+ if (!raw)
347
+ continue;
348
+ const { data } = parseMarkdown(raw);
349
+ const taskIds = Array.isArray(data.taskIds) ? data.taskIds : [];
350
+ sprints.push({
351
+ id: artifact.id,
352
+ name: data.name || artifact.title,
353
+ title: artifact.title,
354
+ status: data.status || 'planned',
355
+ startDate: data.startDate,
356
+ endDate: data.endDate,
357
+ duration: data.duration,
358
+ taskCount: taskIds.length,
359
+ taskIds,
360
+ });
361
+ }
362
+ return sprints;
363
+ }
364
+ async function getActiveSprint(projectDir, config) {
365
+ const sprints = await loadSprints(projectDir, config);
366
+ const active = sprints.find((s) => s.status === 'active');
367
+ if (!active) {
368
+ logger.error('No active sprint. Run `planr sprint create` first.');
369
+ return null;
370
+ }
371
+ return active;
372
+ }
373
+ async function autoSelectTasks(projectDir, config, sprintId) {
374
+ if (!isAIConfigured(config)) {
375
+ logger.error('AI not configured. Run `planr config set-provider` first.');
376
+ return;
377
+ }
378
+ // Gather available tasks (not already in a sprint)
379
+ const allSprints = await loadSprints(projectDir, config);
380
+ const assignedIds = new Set(allSprints.flatMap((s) => s.taskIds));
381
+ const tasks = await listArtifacts(projectDir, config, 'task');
382
+ const quickTasks = await listArtifacts(projectDir, config, 'quick');
383
+ const allTasks = [
384
+ ...tasks.map((t) => ({ ...t, type: 'task' })),
385
+ ...quickTasks.map((t) => ({ ...t, type: 'quick' })),
386
+ ].filter((t) => !assignedIds.has(t.id));
387
+ if (allTasks.length === 0) {
388
+ logger.info('No unassigned tasks available.');
389
+ return;
390
+ }
391
+ // Calculate velocity from past sprints
392
+ const velocity = calculateAverageVelocity(allSprints);
393
+ logger.dim(`Found ${allTasks.length} unassigned tasks. Target velocity: ${velocity} points.`);
394
+ logger.dim('AI is selecting tasks...');
395
+ try {
396
+ const provider = await getAIProvider(config);
397
+ // Enrich task summaries with subtask count and parent context
398
+ const taskSummaries = [];
399
+ for (const t of allTasks) {
400
+ const raw = await readArtifactRaw(projectDir, config, t.type, t.id);
401
+ let subtaskCount = 0;
402
+ let parentInfo = '';
403
+ if (raw) {
404
+ const checkboxes = raw.match(/- \[[ x]\]/g);
405
+ subtaskCount = checkboxes ? checkboxes.length : 0;
406
+ const parentMatch = raw.match(/(?:storyId|featureId):\s*"([^"]+)"/);
407
+ if (parentMatch)
408
+ parentInfo = ` (parent: ${parentMatch[1]})`;
409
+ }
410
+ taskSummaries.push({
411
+ id: t.id,
412
+ title: `${t.title}${parentInfo} [${subtaskCount} subtasks]`,
413
+ points: subtaskCount || 1,
414
+ });
415
+ }
416
+ const messages = buildSprintAutoSelectPrompt(taskSummaries, velocity);
417
+ const { result } = await generateStreamingJSON(provider, messages, aiSprintAutoSelectResponseSchema, { maxTokens: TOKEN_BUDGETS.sprintAutoSelect });
418
+ // Display recommendation
419
+ display.separator(50);
420
+ display.heading(' AI Sprint Selection:');
421
+ display.blank();
422
+ for (const taskId of result.selectedTaskIds) {
423
+ const task = allTasks.find((t) => t.id === taskId);
424
+ display.line(` + ${chalk.bold(taskId)} ${task?.title || ''}`);
425
+ }
426
+ display.blank();
427
+ display.line(chalk.dim(` Total: ~${result.totalPoints} points`));
428
+ display.line(chalk.dim(` ${result.reasoning}`));
429
+ display.separator(50);
430
+ const apply = await promptConfirm('Add these tasks to the sprint?', true);
431
+ if (!apply) {
432
+ logger.info('Cancelled.');
433
+ return;
434
+ }
435
+ // Apply by reading and updating the sprint
436
+ const raw = await readArtifactRaw(projectDir, config, 'sprint', sprintId);
437
+ if (!raw)
438
+ return;
439
+ const { data } = parseMarkdown(raw);
440
+ const currentIds = Array.isArray(data.taskIds) ? data.taskIds : [];
441
+ const newIds = result.selectedTaskIds.filter((id) => !currentIds.includes(id));
442
+ const allIds = [...currentIds, ...newIds];
443
+ let updated = raw.replace(/^taskIds: \[.*\]$/m, `taskIds: [${allIds.map((id) => `"${id}"`).join(', ')}]`);
444
+ // Build rich task lines with title + link
445
+ const taskLineEntries = [];
446
+ for (const id of newIds) {
447
+ const task = allTasks.find((t) => t.id === id);
448
+ const prefix = id.split('-')[0];
449
+ const type = prefix === 'QT' ? 'quick' : 'task';
450
+ const dir = prefix === 'QT' ? 'quick' : 'tasks';
451
+ const artifact = await readArtifact(projectDir, config, type, id);
452
+ if (artifact) {
453
+ const fname = path.basename(artifact.filePath);
454
+ taskLineEntries.push(`- [ ] **${id}** ${task?.title || ''} — [view](../${dir}/${fname})`);
455
+ }
456
+ else {
457
+ taskLineEntries.push(`- [ ] ${id}`);
458
+ }
459
+ }
460
+ const taskLines = taskLineEntries.join('\n');
461
+ updated = updated.replace(/^_No tasks assigned yet\..*$/m, taskLines);
462
+ if (!updated.includes(taskLines)) {
463
+ updated = updated.replace(/(## Tasks\n(?:- \[[ x]\] .+\n)*)/, `$1${taskLines}\n`);
464
+ }
465
+ await updateArtifact(projectDir, config, 'sprint', sprintId, updated);
466
+ logger.success(`Added ${newIds.length} tasks to sprint`);
467
+ }
468
+ catch (err) {
469
+ const { AIError } = await import('../../ai/errors.js');
470
+ if (err instanceof AIError) {
471
+ logger.error(err.userMessage);
472
+ }
473
+ else {
474
+ throw err;
475
+ }
476
+ }
477
+ }
478
+ function calculateAverageVelocity(sprints) {
479
+ const closed = sprints.filter((s) => s.status === 'closed');
480
+ if (closed.length === 0)
481
+ return 20; // Default velocity for first sprint
482
+ // Use task count as proxy for velocity (since not all tasks have story points)
483
+ const total = closed.reduce((sum, s) => sum + s.taskCount, 0);
484
+ return Math.round(total / closed.length);
485
+ }
486
+ function displayVelocityHistory(closedSprints) {
487
+ const maxTasks = Math.max(...closedSprints.map((s) => s.taskCount), 1);
488
+ const barWidth = 30;
489
+ for (const s of closedSprints) {
490
+ const filled = Math.round((s.taskCount / maxTasks) * barWidth);
491
+ const bar = chalk.cyan('█'.repeat(filled)) + chalk.dim('░'.repeat(barWidth - filled));
492
+ display.line(` ${chalk.bold(s.id)} ${bar} ${s.taskCount} tasks`);
493
+ }
494
+ const avg = calculateAverageVelocity(closedSprints);
495
+ display.blank();
496
+ display.line(chalk.dim(` Average velocity: ${avg} tasks/sprint`));
497
+ }
498
+ function parseDuration(input) {
499
+ const match = input.match(/^(\d+)w$/);
500
+ if (!match)
501
+ return null;
502
+ const weeks = Number.parseInt(match[1], 10);
503
+ if (weeks < 1 || weeks > 4)
504
+ return null;
505
+ return { weeks, days: weeks * 7 };
506
+ }
507
+ function addDays(date, days) {
508
+ const result = new Date(date);
509
+ result.setDate(result.getDate() + days);
510
+ return result;
511
+ }
512
+ function colorByPercent(text, pct) {
513
+ if (pct >= 75)
514
+ return chalk.green(text);
515
+ if (pct >= 25)
516
+ return chalk.yellow(text);
517
+ return chalk.red(text);
518
+ }
519
+ //# sourceMappingURL=sprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprint.js","sourceRoot":"","sources":["../../../src/cli/commands/sprint.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA2LrD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAiPrD"}