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.
- package/README.md +142 -52
- package/dist/agents/index.d.ts +1 -5
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -4
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/task-parser.d.ts +4 -1
- package/dist/agents/task-parser.d.ts.map +1 -1
- package/dist/agents/task-parser.js +6 -3
- package/dist/agents/task-parser.js.map +1 -1
- package/dist/agents/utils.d.ts +0 -4
- package/dist/agents/utils.d.ts.map +1 -1
- package/dist/agents/utils.js +3 -24
- package/dist/agents/utils.js.map +1 -1
- package/dist/ai/codebase/context-builder.d.ts +22 -3
- package/dist/ai/codebase/context-builder.d.ts.map +1 -1
- package/dist/ai/codebase/context-builder.js +202 -14
- package/dist/ai/codebase/context-builder.js.map +1 -1
- package/dist/ai/codebase/file-reader.d.ts.map +1 -1
- package/dist/ai/codebase/file-reader.js +7 -3
- package/dist/ai/codebase/file-reader.js.map +1 -1
- package/dist/ai/codebase/index.d.ts +3 -1
- package/dist/ai/codebase/index.d.ts.map +1 -1
- package/dist/ai/codebase/index.js +3 -1
- package/dist/ai/codebase/index.js.map +1 -1
- package/dist/ai/codebase/pattern-rules.d.ts +28 -0
- package/dist/ai/codebase/pattern-rules.d.ts.map +1 -0
- package/dist/ai/codebase/pattern-rules.js +186 -0
- package/dist/ai/codebase/pattern-rules.js.map +1 -0
- package/dist/ai/codebase/rules-reader.d.ts +14 -0
- package/dist/ai/codebase/rules-reader.d.ts.map +1 -0
- package/dist/ai/codebase/rules-reader.js +25 -0
- package/dist/ai/codebase/rules-reader.js.map +1 -0
- package/dist/ai/codebase/stack-detector.d.ts.map +1 -1
- package/dist/ai/codebase/stack-detector.js +4 -1
- package/dist/ai/codebase/stack-detector.js.map +1 -1
- package/dist/ai/codebase/tree-generator.d.ts.map +1 -1
- package/dist/ai/codebase/tree-generator.js +5 -2
- package/dist/ai/codebase/tree-generator.js.map +1 -1
- package/dist/ai/errors.js +1 -1
- package/dist/ai/errors.js.map +1 -1
- package/dist/ai/prompts/prompt-builder.d.ts +12 -0
- package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
- package/dist/ai/prompts/prompt-builder.js +45 -3
- package/dist/ai/prompts/prompt-builder.js.map +1 -1
- package/dist/ai/prompts/system-prompts.d.ts +5 -3
- package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
- package/dist/ai/prompts/system-prompts.js +74 -13
- package/dist/ai/prompts/system-prompts.js.map +1 -1
- package/dist/ai/schemas/ai-response-schemas.d.ts +48 -2
- package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
- package/dist/ai/schemas/ai-response-schemas.js +19 -0
- package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
- package/dist/ai/types.d.ts +4 -2
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/types.js +3 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/ai/validation/dependency-chains.d.ts +21 -0
- package/dist/ai/validation/dependency-chains.d.ts.map +1 -0
- package/dist/ai/validation/dependency-chains.js +114 -0
- package/dist/ai/validation/dependency-chains.js.map +1 -0
- package/dist/ai/validation/index.d.ts +3 -0
- package/dist/ai/validation/index.d.ts.map +1 -0
- package/dist/ai/validation/index.js +3 -0
- package/dist/ai/validation/index.js.map +1 -0
- package/dist/ai/validation/task-validator.d.ts +37 -0
- package/dist/ai/validation/task-validator.d.ts.map +1 -0
- package/dist/ai/validation/task-validator.js +89 -0
- package/dist/ai/validation/task-validator.js.map +1 -0
- package/dist/cli/commands/backlog.d.ts +10 -0
- package/dist/cli/commands/backlog.d.ts.map +1 -0
- package/dist/cli/commands/backlog.js +292 -0
- package/dist/cli/commands/backlog.js.map +1 -0
- package/dist/cli/commands/checklist.js +4 -4
- package/dist/cli/commands/checklist.js.map +1 -1
- package/dist/cli/commands/config.js +13 -13
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/epic.d.ts.map +1 -1
- package/dist/cli/commands/epic.js +41 -22
- package/dist/cli/commands/epic.js.map +1 -1
- package/dist/cli/commands/estimate.d.ts.map +1 -1
- package/dist/cli/commands/estimate.js +40 -39
- package/dist/cli/commands/estimate.js.map +1 -1
- package/dist/cli/commands/export.d.ts +8 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +282 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/feature.js +9 -9
- package/dist/cli/commands/feature.js.map +1 -1
- package/dist/cli/commands/github.d.ts +8 -0
- package/dist/cli/commands/github.d.ts.map +1 -0
- package/dist/cli/commands/github.js +415 -0
- package/dist/cli/commands/github.js.map +1 -0
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +104 -50
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/quick.d.ts.map +1 -1
- package/dist/cli/commands/quick.js +37 -107
- package/dist/cli/commands/quick.js.map +1 -1
- package/dist/cli/commands/refine.js +21 -21
- package/dist/cli/commands/refine.js.map +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +18 -7
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts +9 -0
- package/dist/cli/commands/sprint.d.ts.map +1 -0
- package/dist/cli/commands/sprint.js +519 -0
- package/dist/cli/commands/sprint.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +77 -32
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/story.js +15 -15
- package/dist/cli/commands/story.js.map +1 -1
- package/dist/cli/commands/sync.js +11 -7
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/task.d.ts +0 -2
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +14 -169
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/template.d.ts +10 -0
- package/dist/cli/commands/template.d.ts.map +1 -0
- package/dist/cli/commands/template.js +269 -0
- package/dist/cli/commands/template.js.map +1 -0
- package/dist/cli/helpers/task-creation.d.ts +89 -0
- package/dist/cli/helpers/task-creation.d.ts.map +1 -0
- package/dist/cli/helpers/task-creation.js +140 -0
- package/dist/cli/helpers/task-creation.js.map +1 -0
- package/dist/cli/index.js +29 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/models/schema.d.ts +2 -0
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +2 -0
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +32 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/artifact-gathering.d.ts +2 -0
- package/dist/services/artifact-gathering.d.ts.map +1 -1
- package/dist/services/artifact-gathering.js +26 -7
- package/dist/services/artifact-gathering.js.map +1 -1
- package/dist/services/artifact-service.d.ts +5 -5
- package/dist/services/artifact-service.d.ts.map +1 -1
- package/dist/services/artifact-service.js +4 -0
- package/dist/services/artifact-service.js.map +1 -1
- package/dist/services/config-service.d.ts.map +1 -1
- package/dist/services/config-service.js +2 -0
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/credential-backends.d.ts.map +1 -1
- package/dist/services/credential-backends.js +15 -7
- package/dist/services/credential-backends.js.map +1 -1
- package/dist/services/credentials-service.d.ts.map +1 -1
- package/dist/services/credentials-service.js +6 -3
- package/dist/services/credentials-service.js.map +1 -1
- package/dist/services/github-service.d.ts +83 -0
- package/dist/services/github-service.d.ts.map +1 -0
- package/dist/services/github-service.js +440 -0
- package/dist/services/github-service.js.map +1 -0
- package/dist/services/template-service.d.ts +2 -1
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +3 -1
- package/dist/services/template-service.js.map +1 -1
- package/dist/templates/backlog/backlog-item.md.hbs +40 -0
- package/dist/templates/checklists/agile-checklist.md.hbs +1 -1
- package/dist/templates/export/planning-report.html.hbs +230 -0
- package/dist/templates/export/planning-report.md.hbs +136 -0
- package/dist/templates/quick/quick-task.md.hbs +1 -1
- package/dist/templates/rules/claude/CLAUDE.md.hbs +78 -35
- package/dist/templates/rules/codex/AGENTS.md.hbs +73 -17
- package/dist/templates/rules/cursor/2101-implement-task-list.mdc.hbs +66 -14
- package/dist/templates/sprints/sprint.md.hbs +42 -0
- package/dist/templates/task-templates/api-integration.json +45 -0
- package/dist/templates/task-templates/auth-flow.json +48 -0
- package/dist/templates/task-templates/database-migration.json +44 -0
- package/dist/templates/task-templates/react-component.json +45 -0
- package/dist/templates/task-templates/rest-endpoint.json +53 -0
- package/dist/templates/tasks/task-list.md.hbs +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +4 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/logger.d.ts +31 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -9
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/markdown.d.ts +3 -2
- package/dist/utils/markdown.d.ts.map +1 -1
- package/dist/utils/markdown.js +3 -1
- package/dist/utils/markdown.js.map +1 -1
- package/dist/utils/slugify.d.ts +8 -1
- package/dist/utils/slugify.d.ts.map +1 -1
- package/dist/utils/slugify.js +18 -2
- package/dist/utils/slugify.js.map +1 -1
- package/package.json +14 -3
- package/dist/agents/agent-factory.d.ts +0 -7
- package/dist/agents/agent-factory.d.ts.map +0 -1
- package/dist/agents/agent-factory.js +0 -22
- package/dist/agents/agent-factory.js.map +0 -1
- package/dist/agents/claude-agent.d.ts +0 -18
- package/dist/agents/claude-agent.d.ts.map +0 -1
- package/dist/agents/claude-agent.js +0 -183
- package/dist/agents/claude-agent.js.map +0 -1
- package/dist/agents/codex-agent.d.ts +0 -17
- package/dist/agents/codex-agent.d.ts.map +0 -1
- package/dist/agents/codex-agent.js +0 -124
- package/dist/agents/codex-agent.js.map +0 -1
- package/dist/agents/cursor-agent.d.ts +0 -14
- package/dist/agents/cursor-agent.d.ts.map +0 -1
- package/dist/agents/cursor-agent.js +0 -49
- package/dist/agents/cursor-agent.js.map +0 -1
- package/dist/agents/implementation-bridge.d.ts +0 -30
- package/dist/agents/implementation-bridge.d.ts.map +0 -1
- package/dist/agents/implementation-bridge.js +0 -256
- package/dist/agents/implementation-bridge.js.map +0 -1
- package/dist/agents/progress.d.ts +0 -62
- package/dist/agents/progress.d.ts.map +0 -1
- package/dist/agents/progress.js +0 -155
- package/dist/agents/progress.js.map +0 -1
- package/dist/agents/prompt-composer.d.ts +0 -30
- package/dist/agents/prompt-composer.d.ts.map +0 -1
- package/dist/agents/prompt-composer.js +0 -81
- package/dist/agents/prompt-composer.js.map +0 -1
- package/dist/agents/types.d.ts +0 -25
- package/dist/agents/types.d.ts.map +0 -1
- package/dist/agents/types.js +0 -8
- package/dist/agents/types.js.map +0 -1
- package/dist/utils/error-context.d.ts +0 -23
- package/dist/utils/error-context.d.ts.map +0 -1
- package/dist/utils/error-context.js +0 -94
- 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;
|
|
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"}
|