openplanr 0.1.0 → 0.3.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 +23 -5
- package/dist/agents/agent-factory.d.ts +7 -0
- package/dist/agents/agent-factory.d.ts.map +1 -0
- package/dist/agents/agent-factory.js +22 -0
- package/dist/agents/agent-factory.js.map +1 -0
- package/dist/agents/claude-agent.d.ts +13 -0
- package/dist/agents/claude-agent.d.ts.map +1 -0
- package/dist/agents/claude-agent.js +48 -0
- package/dist/agents/claude-agent.js.map +1 -0
- package/dist/agents/codex-agent.d.ts +13 -0
- package/dist/agents/codex-agent.d.ts.map +1 -0
- package/dist/agents/codex-agent.js +47 -0
- package/dist/agents/codex-agent.js.map +1 -0
- package/dist/agents/cursor-agent.d.ts +13 -0
- package/dist/agents/cursor-agent.d.ts.map +1 -0
- package/dist/agents/cursor-agent.js +40 -0
- package/dist/agents/cursor-agent.js.map +1 -0
- package/dist/agents/implementation-bridge.d.ts +21 -0
- package/dist/agents/implementation-bridge.d.ts.map +1 -0
- package/dist/agents/implementation-bridge.js +173 -0
- package/dist/agents/implementation-bridge.js.map +1 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/prompt-composer.d.ts +30 -0
- package/dist/agents/prompt-composer.d.ts.map +1 -0
- package/dist/agents/prompt-composer.js +81 -0
- package/dist/agents/prompt-composer.js.map +1 -0
- package/dist/agents/task-parser.d.ts +38 -0
- package/dist/agents/task-parser.d.ts.map +1 -0
- package/dist/agents/task-parser.js +83 -0
- package/dist/agents/task-parser.js.map +1 -0
- package/dist/agents/types.d.ts +23 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +8 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/utils.d.ts +9 -0
- package/dist/agents/utils.d.ts.map +1 -0
- package/dist/agents/utils.js +21 -0
- package/dist/agents/utils.js.map +1 -0
- package/dist/ai/codebase/context-builder.d.ts +31 -0
- package/dist/ai/codebase/context-builder.d.ts.map +1 -0
- package/dist/ai/codebase/context-builder.js +93 -0
- package/dist/ai/codebase/context-builder.js.map +1 -0
- package/dist/ai/codebase/file-reader.d.ts +22 -0
- package/dist/ai/codebase/file-reader.d.ts.map +1 -0
- package/dist/ai/codebase/file-reader.js +111 -0
- package/dist/ai/codebase/file-reader.js.map +1 -0
- package/dist/ai/codebase/index.d.ts +5 -0
- package/dist/ai/codebase/index.d.ts.map +1 -0
- package/dist/ai/codebase/index.js +5 -0
- package/dist/ai/codebase/index.js.map +1 -0
- package/dist/ai/codebase/stack-detector.d.ts +18 -0
- package/dist/ai/codebase/stack-detector.d.ts.map +1 -0
- package/dist/ai/codebase/stack-detector.js +147 -0
- package/dist/ai/codebase/stack-detector.js.map +1 -0
- package/dist/ai/codebase/tree-generator.d.ts +8 -0
- package/dist/ai/codebase/tree-generator.d.ts.map +1 -0
- package/dist/ai/codebase/tree-generator.js +85 -0
- package/dist/ai/codebase/tree-generator.js.map +1 -0
- package/dist/ai/errors.d.ts +22 -0
- package/dist/ai/errors.d.ts.map +1 -0
- package/dist/ai/errors.js +70 -0
- package/dist/ai/errors.js.map +1 -0
- package/dist/ai/index.d.ts +11 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +10 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts/prompt-builder.d.ts +42 -0
- package/dist/ai/prompts/prompt-builder.d.ts.map +1 -0
- package/dist/ai/prompts/prompt-builder.js +96 -0
- package/dist/ai/prompts/prompt-builder.js.map +1 -0
- package/dist/ai/prompts/system-prompts.d.ts +13 -0
- package/dist/ai/prompts/system-prompts.d.ts.map +1 -0
- package/dist/ai/prompts/system-prompts.js +124 -0
- package/dist/ai/prompts/system-prompts.js.map +1 -0
- package/dist/ai/provider-factory.d.ts +10 -0
- package/dist/ai/provider-factory.d.ts.map +1 -0
- package/dist/ai/provider-factory.js +33 -0
- package/dist/ai/provider-factory.js.map +1 -0
- package/dist/ai/providers/anthropic-provider.d.ts +22 -0
- package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/providers/anthropic-provider.js +82 -0
- package/dist/ai/providers/anthropic-provider.js.map +1 -0
- package/dist/ai/providers/ollama-provider.d.ts +13 -0
- package/dist/ai/providers/ollama-provider.d.ts.map +1 -0
- package/dist/ai/providers/ollama-provider.js +16 -0
- package/dist/ai/providers/ollama-provider.js.map +1 -0
- package/dist/ai/providers/openai-provider.d.ts +17 -0
- package/dist/ai/providers/openai-provider.d.ts.map +1 -0
- package/dist/ai/providers/openai-provider.js +58 -0
- package/dist/ai/providers/openai-provider.js.map +1 -0
- package/dist/ai/schemas/ai-response-schemas.d.ts +425 -0
- package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -0
- package/dist/ai/schemas/ai-response-schemas.js +87 -0
- package/dist/ai/schemas/ai-response-schemas.js.map +1 -0
- package/dist/ai/types.d.ts +40 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +16 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli/commands/checklist.d.ts.map +1 -1
- package/dist/cli/commands/checklist.js +60 -1
- package/dist/cli/commands/checklist.js.map +1 -1
- package/dist/cli/commands/config.d.ts +8 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +112 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/epic.d.ts +7 -0
- package/dist/cli/commands/epic.d.ts.map +1 -1
- package/dist/cli/commands/epic.js +161 -31
- package/dist/cli/commands/epic.js.map +1 -1
- package/dist/cli/commands/feature.d.ts +6 -0
- package/dist/cli/commands/feature.d.ts.map +1 -1
- package/dist/cli/commands/feature.js +143 -30
- package/dist/cli/commands/feature.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +48 -6
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +15 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +259 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/refine.d.ts +9 -0
- package/dist/cli/commands/refine.d.ts.map +1 -0
- package/dist/cli/commands/refine.js +101 -0
- package/dist/cli/commands/refine.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +150 -18
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/story.d.ts +6 -0
- package/dist/cli/commands/story.d.ts.map +1 -1
- package/dist/cli/commands/story.js +259 -45
- package/dist/cli/commands/story.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +12 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +227 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +9 -0
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +350 -35
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/index.js +16 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/models/schema.d.ts +41 -0
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +9 -0
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +9 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/ai-service.d.ts +40 -0
- package/dist/services/ai-service.d.ts.map +1 -0
- package/dist/services/ai-service.js +150 -0
- package/dist/services/ai-service.js.map +1 -0
- package/dist/services/artifact-gathering.d.ts +49 -0
- package/dist/services/artifact-gathering.d.ts.map +1 -0
- package/dist/services/artifact-gathering.js +128 -0
- package/dist/services/artifact-gathering.js.map +1 -0
- package/dist/services/artifact-service.d.ts +47 -0
- package/dist/services/artifact-service.d.ts.map +1 -1
- package/dist/services/artifact-service.js +169 -0
- package/dist/services/artifact-service.js.map +1 -1
- package/dist/services/checklist-service.d.ts +23 -0
- package/dist/services/checklist-service.d.ts.map +1 -1
- package/dist/services/checklist-service.js +44 -0
- package/dist/services/checklist-service.js.map +1 -1
- package/dist/services/credentials-service.d.ts +22 -0
- package/dist/services/credentials-service.d.ts.map +1 -0
- package/dist/services/credentials-service.js +58 -0
- package/dist/services/credentials-service.js.map +1 -0
- package/dist/services/id-service.d.ts.map +1 -1
- package/dist/services/id-service.js +8 -5
- package/dist/services/id-service.js.map +1 -1
- package/dist/services/prompt-service.d.ts +6 -0
- package/dist/services/prompt-service.d.ts.map +1 -1
- package/dist/services/prompt-service.js +7 -1
- package/dist/services/prompt-service.js.map +1 -1
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +6 -0
- package/dist/services/template-service.js.map +1 -1
- package/dist/templates/checklists/agile-checklist.md.hbs +8 -8
- package/dist/templates/epics/epic.md.hbs +8 -2
- package/dist/templates/features/feature.md.hbs +3 -3
- package/dist/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/2002-agile-create-features.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +1 -1
- package/dist/templates/stories/user-story.md.hbs +2 -2
- package/dist/templates/tasks/task-list.md.hbs +26 -3
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -0
- package/dist/utils/logger.js.map +1 -1
- package/package.json +12 -5
- package/dist/templates/templates/adrs/adr-general.md.hbs +0 -46
- package/dist/templates/templates/checklists/agile-checklist.md.hbs +0 -49
- package/dist/templates/templates/epics/epic.md.hbs +0 -46
- package/dist/templates/templates/features/feature.md.hbs +0 -42
- package/dist/templates/templates/rules/claude/CLAUDE.md.hbs +0 -63
- package/dist/templates/templates/rules/codex/AGENTS.md.hbs +0 -28
- package/dist/templates/templates/rules/cursor/2000-agile-checklist.mdc.hbs +0 -33
- package/dist/templates/templates/rules/cursor/2001-agile-create-epic.mdc.hbs +0 -35
- package/dist/templates/templates/rules/cursor/2002-agile-create-features.mdc.hbs +0 -35
- package/dist/templates/templates/rules/cursor/2003-agile-create-user-story.mdc.hbs +0 -31
- package/dist/templates/templates/rules/cursor/2100-create-task-list.mdc.hbs +0 -36
- package/dist/templates/templates/rules/cursor/2101-implement-task-list.mdc.hbs +0 -28
- package/dist/templates/templates/stories/gherkin.feature.hbs +0 -13
- package/dist/templates/templates/stories/user-story.md.hbs +0 -28
- package/dist/templates/templates/tasks/task-list.md.hbs +0 -24
|
@@ -1,38 +1,170 @@
|
|
|
1
1
|
import { loadConfig } from '../../services/config-service.js';
|
|
2
|
-
import { listArtifacts } from '../../services/artifact-service.js';
|
|
2
|
+
import { listArtifacts, readArtifact, readArtifactRaw } from '../../services/artifact-service.js';
|
|
3
|
+
import { parseTaskMarkdown } from '../../agents/task-parser.js';
|
|
3
4
|
import { logger } from '../../utils/logger.js';
|
|
5
|
+
import chalk from 'chalk';
|
|
4
6
|
export function registerStatusCommand(program) {
|
|
5
7
|
program
|
|
6
8
|
.command('status')
|
|
7
9
|
.description('Show project planning status')
|
|
8
|
-
.
|
|
10
|
+
.option('--all', 'show all items without truncation')
|
|
11
|
+
.action(async (opts) => {
|
|
9
12
|
const projectDir = program.opts().projectDir;
|
|
10
13
|
const config = await loadConfig(projectDir);
|
|
14
|
+
const showAll = !!opts.all;
|
|
11
15
|
logger.heading(`OpenPlanr Status — ${config.projectName}`);
|
|
12
16
|
console.log('');
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if (
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
// Gather all artifacts
|
|
18
|
+
const epics = await listArtifacts(projectDir, config, 'epic');
|
|
19
|
+
const features = await listArtifacts(projectDir, config, 'feature');
|
|
20
|
+
const stories = await listArtifacts(projectDir, config, 'story');
|
|
21
|
+
const tasks = await listArtifacts(projectDir, config, 'task');
|
|
22
|
+
// Build parent lookups: featureId → epicId, storyId → featureId, taskId → storyId/featureId
|
|
23
|
+
const featureToEpic = new Map();
|
|
24
|
+
const storyToFeature = new Map();
|
|
25
|
+
const taskToParent = new Map();
|
|
26
|
+
for (const f of features) {
|
|
27
|
+
const data = await readArtifact(projectDir, config, 'feature', f.id);
|
|
28
|
+
if (data?.data.epicId)
|
|
29
|
+
featureToEpic.set(f.id, data.data.epicId);
|
|
30
|
+
}
|
|
31
|
+
for (const s of stories) {
|
|
32
|
+
const data = await readArtifact(projectDir, config, 'story', s.id);
|
|
33
|
+
if (data?.data.featureId)
|
|
34
|
+
storyToFeature.set(s.id, data.data.featureId);
|
|
35
|
+
}
|
|
36
|
+
for (const t of tasks) {
|
|
37
|
+
const data = await readArtifact(projectDir, config, 'task', t.id);
|
|
38
|
+
const parentStory = data?.data.storyId;
|
|
39
|
+
const parentFeature = data?.data.featureId;
|
|
40
|
+
if (parentStory)
|
|
41
|
+
taskToParent.set(t.id, parentStory);
|
|
42
|
+
else if (parentFeature)
|
|
43
|
+
taskToParent.set(t.id, parentFeature);
|
|
44
|
+
}
|
|
45
|
+
// Task completion metrics
|
|
46
|
+
const taskMetrics = new Map();
|
|
47
|
+
for (const t of tasks) {
|
|
48
|
+
const raw = await readArtifactRaw(projectDir, config, 'task', t.id);
|
|
49
|
+
if (raw) {
|
|
50
|
+
const parsed = parseTaskMarkdown(raw);
|
|
51
|
+
const subtasks = parsed.filter((s) => s.depth > 0);
|
|
52
|
+
const total = subtasks.length || parsed.length;
|
|
53
|
+
const done = (subtasks.length > 0 ? subtasks : parsed).filter((s) => s.done).length;
|
|
54
|
+
taskMetrics.set(t.id, { done, total });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Tree view: group by epic hierarchy
|
|
58
|
+
if (epics.length > 0) {
|
|
59
|
+
printSection('Epics', epics, showAll);
|
|
60
|
+
for (const epic of epics) {
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(chalk.bold.cyan(` ${epic.id}: ${epic.title}`));
|
|
63
|
+
// Features under this epic
|
|
64
|
+
const epicFeatures = features.filter((f) => featureToEpic.get(f.id) === epic.id);
|
|
65
|
+
if (epicFeatures.length > 0) {
|
|
66
|
+
const featureList = showAll ? epicFeatures : epicFeatures.slice(0, 5);
|
|
67
|
+
for (const f of featureList) {
|
|
68
|
+
console.log(chalk.white(` ${f.id} ${f.title}`));
|
|
69
|
+
// Stories under this feature
|
|
70
|
+
const featureStories = stories.filter((s) => storyToFeature.get(s.id) === f.id);
|
|
71
|
+
const storyList = showAll ? featureStories : featureStories.slice(0, 3);
|
|
72
|
+
for (const s of storyList) {
|
|
73
|
+
console.log(chalk.dim(` ${s.id} ${s.title}`));
|
|
74
|
+
}
|
|
75
|
+
if (!showAll && featureStories.length > 3) {
|
|
76
|
+
console.log(chalk.dim(` ... and ${featureStories.length - 3} more stories`));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!showAll && epicFeatures.length > 5) {
|
|
80
|
+
console.log(chalk.dim(` ... and ${epicFeatures.length - 5} more features`));
|
|
81
|
+
}
|
|
27
82
|
}
|
|
28
|
-
|
|
29
|
-
|
|
83
|
+
}
|
|
84
|
+
// Show orphaned features (no epic parent)
|
|
85
|
+
const orphanFeatures = features.filter((f) => !featureToEpic.has(f.id));
|
|
86
|
+
if (orphanFeatures.length > 0) {
|
|
87
|
+
console.log('');
|
|
88
|
+
console.log(chalk.yellow(` Unlinked Features: ${orphanFeatures.length}`));
|
|
89
|
+
for (const f of showAll ? orphanFeatures : orphanFeatures.slice(0, 5)) {
|
|
90
|
+
console.log(chalk.dim(` ${f.id} ${f.title}`));
|
|
30
91
|
}
|
|
31
92
|
}
|
|
93
|
+
// Show orphaned stories (no feature parent)
|
|
94
|
+
const orphanStories = stories.filter((s) => !storyToFeature.has(s.id));
|
|
95
|
+
if (orphanStories.length > 0) {
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log(chalk.yellow(` Unlinked Stories: ${orphanStories.length}`));
|
|
98
|
+
for (const s of showAll ? orphanStories : orphanStories.slice(0, 5)) {
|
|
99
|
+
console.log(chalk.dim(` ${s.id} ${s.title}`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// No epics — flat listing fallback
|
|
105
|
+
printSection('Features', features, showAll);
|
|
106
|
+
printSection('User Stories', stories, showAll);
|
|
32
107
|
}
|
|
108
|
+
// Task lists with completion metrics
|
|
33
109
|
console.log('');
|
|
110
|
+
const taskIcon = tasks.length > 0 ? '●' : '○';
|
|
111
|
+
console.log(` ${taskIcon} Task Lists: ${tasks.length}`);
|
|
112
|
+
if (tasks.length > 0) {
|
|
113
|
+
const taskList = showAll ? tasks : tasks.slice(0, 5);
|
|
114
|
+
for (const t of taskList) {
|
|
115
|
+
const metrics = taskMetrics.get(t.id);
|
|
116
|
+
if (metrics && metrics.total > 0) {
|
|
117
|
+
const pct = Math.round((metrics.done / metrics.total) * 100);
|
|
118
|
+
const progressText = `(${metrics.done}/${metrics.total} subtasks, ${pct}%)`;
|
|
119
|
+
const coloredProgress = colorByPercent(progressText, pct);
|
|
120
|
+
console.log(` ${t.id} ${t.title} ${coloredProgress}`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log(` ${t.id} ${t.title}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!showAll && tasks.length > 5) {
|
|
127
|
+
console.log(chalk.dim(` ... and ${tasks.length - 5} more`));
|
|
128
|
+
}
|
|
129
|
+
// Overall task completion summary
|
|
130
|
+
let totalDone = 0;
|
|
131
|
+
let totalSubtasks = 0;
|
|
132
|
+
for (const m of taskMetrics.values()) {
|
|
133
|
+
totalDone += m.done;
|
|
134
|
+
totalSubtasks += m.total;
|
|
135
|
+
}
|
|
136
|
+
if (totalSubtasks > 0) {
|
|
137
|
+
const overallPct = Math.round((totalDone / totalSubtasks) * 100);
|
|
138
|
+
console.log('');
|
|
139
|
+
console.log(` ${colorByPercent(`Overall: ${totalDone}/${totalSubtasks} subtasks complete (${overallPct}%)`, overallPct)}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Summary counts
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log(chalk.dim(` Totals: ${epics.length} epics, ${features.length} features, ${stories.length} stories, ${tasks.length} task lists`));
|
|
34
145
|
logger.dim('Targets: ' + config.targets.join(', '));
|
|
35
146
|
logger.dim('Artifacts: ' + config.outputPaths.agile + '/');
|
|
36
147
|
});
|
|
37
148
|
}
|
|
149
|
+
function printSection(label, items, showAll) {
|
|
150
|
+
const count = items.length;
|
|
151
|
+
const icon = count > 0 ? '●' : '○';
|
|
152
|
+
console.log(` ${icon} ${label}: ${count}`);
|
|
153
|
+
if (count > 0) {
|
|
154
|
+
const list = showAll ? items : items.slice(0, 5);
|
|
155
|
+
for (const item of list) {
|
|
156
|
+
console.log(` ${item.id} ${item.title}`);
|
|
157
|
+
}
|
|
158
|
+
if (!showAll && count > 5) {
|
|
159
|
+
console.log(chalk.dim(` ... and ${count - 5} more`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function colorByPercent(text, pct) {
|
|
164
|
+
if (pct >= 75)
|
|
165
|
+
return chalk.green(text);
|
|
166
|
+
if (pct >= 25)
|
|
167
|
+
return chalk.yellow(text);
|
|
168
|
+
return chalk.red(text);
|
|
169
|
+
}
|
|
38
170
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `planr story` command group.
|
|
3
|
+
*
|
|
4
|
+
* AI-powered by default: reads the parent feature and epic context
|
|
5
|
+
* to generate user stories with Gherkin scenarios.
|
|
6
|
+
*/
|
|
1
7
|
import { Command } from 'commander';
|
|
2
8
|
export declare function registerStoryCommand(program: Command): void;
|
|
3
9
|
//# sourceMappingURL=story.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"story.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"story.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA+IpD"}
|
|
@@ -1,64 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `planr story` command group.
|
|
3
|
+
*
|
|
4
|
+
* AI-powered by default: reads the parent feature and epic context
|
|
5
|
+
* to generate user stories with Gherkin scenarios.
|
|
6
|
+
*/
|
|
1
7
|
import path from 'node:path';
|
|
2
8
|
import { loadConfig } from '../../services/config-service.js';
|
|
3
|
-
import { createArtifact, listArtifacts, readArtifact, getArtifactDir, } from '../../services/artifact-service.js';
|
|
4
|
-
import {
|
|
9
|
+
import { createArtifact, listArtifacts, readArtifact, readArtifactRaw, getArtifactDir, resolveArtifactFilename, addChildReference, } from '../../services/artifact-service.js';
|
|
10
|
+
import { isAIConfigured, getAIProvider, generateStreamingJSON } from '../../services/ai-service.js';
|
|
11
|
+
import { promptText, promptConfirm } from '../../services/prompt-service.js';
|
|
5
12
|
import { renderTemplate } from '../../services/template-service.js';
|
|
6
13
|
import { writeFile } from '../../utils/fs.js';
|
|
14
|
+
import { buildStoriesPrompt } from '../../ai/prompts/prompt-builder.js';
|
|
15
|
+
import { aiStoriesResponseSchema } from '../../ai/schemas/ai-response-schemas.js';
|
|
7
16
|
import { logger } from '../../utils/logger.js';
|
|
17
|
+
import chalk from 'chalk';
|
|
8
18
|
export function registerStoryCommand(program) {
|
|
9
19
|
const story = program.command('story').description('Manage user stories');
|
|
10
20
|
story
|
|
11
21
|
.command('create')
|
|
12
|
-
.description('Create
|
|
13
|
-
.
|
|
14
|
-
.option('--
|
|
22
|
+
.description('Create user stories from a feature or all features under an epic')
|
|
23
|
+
.option('--feature <featureId>', 'parent feature ID (e.g., FEAT-001)')
|
|
24
|
+
.option('--epic <epicId>', 'parent epic ID — generates stories for ALL features under this epic')
|
|
25
|
+
.option('--title <title>', 'story title (manual mode only)')
|
|
26
|
+
.option('--manual', 'use manual interactive prompts instead of AI')
|
|
15
27
|
.action(async (opts) => {
|
|
16
28
|
const projectDir = program.opts().projectDir;
|
|
17
29
|
const config = await loadConfig(projectDir);
|
|
30
|
+
// Validate: exactly one of --feature or --epic must be provided
|
|
31
|
+
if (opts.feature && opts.epic) {
|
|
32
|
+
logger.error('Cannot use both --feature and --epic. Choose one.');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (!opts.feature && !opts.epic) {
|
|
36
|
+
logger.error('Must provide --feature <featureId> or --epic <epicId>.');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
if (opts.epic) {
|
|
40
|
+
// Batch mode: generate stories for all features under the epic
|
|
41
|
+
if (opts.manual) {
|
|
42
|
+
logger.error('--manual is not supported with --epic. Use --feature for manual mode.');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
if (!isAIConfigured(config)) {
|
|
46
|
+
logger.error('AI not configured. Run `planr config set-provider` to enable AI.');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const epicData = await readArtifact(projectDir, config, 'epic', opts.epic);
|
|
50
|
+
if (!epicData) {
|
|
51
|
+
logger.error(`Epic ${opts.epic} not found.`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
// Find all features under this epic
|
|
55
|
+
const allFeatures = await listArtifacts(projectDir, config, 'feature');
|
|
56
|
+
const epicFeatures = [];
|
|
57
|
+
for (const f of allFeatures) {
|
|
58
|
+
const data = await readArtifact(projectDir, config, 'feature', f.id);
|
|
59
|
+
if (data && data.data.epicId === opts.epic) {
|
|
60
|
+
epicFeatures.push({ id: f.id, title: data.data.title || f.title });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (epicFeatures.length === 0) {
|
|
64
|
+
logger.error(`No features found under ${opts.epic}. Create features first with \`planr feature create --epic ${opts.epic}\`.`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
logger.heading(`Batch Story Generation for ${opts.epic}`);
|
|
68
|
+
console.log(chalk.dim(`Found ${epicFeatures.length} feature(s):`));
|
|
69
|
+
for (const f of epicFeatures) {
|
|
70
|
+
console.log(chalk.dim(` ${f.id}: ${f.title}`));
|
|
71
|
+
}
|
|
72
|
+
console.log('');
|
|
73
|
+
const confirmBatch = await promptConfirm(`Generate stories for all ${epicFeatures.length} features?`, true);
|
|
74
|
+
if (!confirmBatch) {
|
|
75
|
+
logger.info('Batch story generation cancelled.');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
let totalCreated = 0;
|
|
79
|
+
for (const feature of epicFeatures) {
|
|
80
|
+
const count = await createStoriesWithAI(projectDir, config, feature.id);
|
|
81
|
+
totalCreated += count;
|
|
82
|
+
}
|
|
83
|
+
console.log('');
|
|
84
|
+
console.log(chalk.dim('━'.repeat(50)));
|
|
85
|
+
logger.success(`Batch complete: created ${totalCreated} stories across ${epicFeatures.length} features.`);
|
|
86
|
+
logger.dim('');
|
|
87
|
+
logger.heading('Next steps:');
|
|
88
|
+
logger.dim(' 1. planr story list — View all stories');
|
|
89
|
+
logger.dim(' 2. planr task create --story <ID> — Generate tasks for a story');
|
|
90
|
+
logger.dim(' 3. planr task create --feature <ID> — Generate tasks for a feature');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Single feature mode
|
|
18
94
|
const featureData = await readArtifact(projectDir, config, 'feature', opts.feature);
|
|
19
95
|
if (!featureData) {
|
|
20
96
|
logger.error(`Feature ${opts.feature} not found.`);
|
|
21
97
|
process.exit(1);
|
|
22
98
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
role,
|
|
34
|
-
goal,
|
|
35
|
-
benefit,
|
|
36
|
-
additionalNotes: additionalNotes || undefined,
|
|
37
|
-
});
|
|
38
|
-
// Create companion Gherkin file
|
|
39
|
-
const storyDir = path.join(projectDir, getArtifactDir(config, 'story'));
|
|
40
|
-
const gherkinContent = await renderTemplate('stories/gherkin.feature.hbs', {
|
|
41
|
-
id,
|
|
42
|
-
title,
|
|
43
|
-
role,
|
|
44
|
-
goal,
|
|
45
|
-
benefit,
|
|
46
|
-
scenarios: [
|
|
47
|
-
{
|
|
48
|
-
name: 'Happy path',
|
|
49
|
-
given: 'the preconditions are met',
|
|
50
|
-
when: `the user ${goal.toLowerCase()}`,
|
|
51
|
-
then: 'the expected outcome occurs',
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
}, config.templateOverrides);
|
|
55
|
-
const gherkinPath = path.join(storyDir, `${id}-gherkin.feature`);
|
|
56
|
-
await writeFile(gherkinPath, gherkinContent);
|
|
57
|
-
logger.success(`Created user story ${id}: ${title}`);
|
|
58
|
-
logger.dim(` ${filePath}`);
|
|
59
|
-
logger.dim(` ${gherkinPath}`);
|
|
60
|
-
logger.dim('');
|
|
61
|
-
logger.dim(`Next: planr task create --story ${id}`);
|
|
99
|
+
const useAI = !opts.manual && isAIConfigured(config);
|
|
100
|
+
if (useAI) {
|
|
101
|
+
await createStoriesWithAI(projectDir, config, opts.feature);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
if (!opts.manual && !isAIConfigured(config)) {
|
|
105
|
+
logger.warn('AI not configured. Using manual mode.');
|
|
106
|
+
}
|
|
107
|
+
await createStoryManually(projectDir, config, opts);
|
|
108
|
+
}
|
|
62
109
|
});
|
|
63
110
|
story
|
|
64
111
|
.command('list')
|
|
@@ -72,10 +119,177 @@ export function registerStoryCommand(program) {
|
|
|
72
119
|
logger.info('No stories found. Run "planr story create --feature <ID>" to create one.');
|
|
73
120
|
return;
|
|
74
121
|
}
|
|
122
|
+
// Filter by feature if specified
|
|
123
|
+
let filtered = stories;
|
|
124
|
+
if (opts.feature) {
|
|
125
|
+
filtered = [];
|
|
126
|
+
for (const s of stories) {
|
|
127
|
+
const data = await readArtifact(projectDir, config, 'story', s.id);
|
|
128
|
+
if (data && data.data.featureId === opts.feature) {
|
|
129
|
+
filtered.push(s);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (filtered.length === 0) {
|
|
133
|
+
logger.info(`No stories found for feature ${opts.feature}.`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
75
137
|
logger.heading('User Stories');
|
|
76
|
-
for (const s of
|
|
138
|
+
for (const s of filtered) {
|
|
77
139
|
console.log(` ${s.id} ${s.title}`);
|
|
78
140
|
}
|
|
79
141
|
});
|
|
80
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Generate stories with AI for a single feature. Returns the number of stories created.
|
|
145
|
+
*/
|
|
146
|
+
async function createStoriesWithAI(projectDir, config, featureId) {
|
|
147
|
+
logger.heading(`Create User Stories (AI-powered from ${featureId})`);
|
|
148
|
+
const featureRaw = await readArtifactRaw(projectDir, config, 'feature', featureId);
|
|
149
|
+
if (!featureRaw) {
|
|
150
|
+
logger.error(`Could not read feature ${featureId}.`);
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
// Read parent epic for context
|
|
154
|
+
const featureData = await readArtifact(projectDir, config, 'feature', featureId);
|
|
155
|
+
const epicId = featureData?.data.epicId;
|
|
156
|
+
let epicRaw = '';
|
|
157
|
+
if (epicId) {
|
|
158
|
+
epicRaw = (await readArtifactRaw(projectDir, config, 'epic', epicId)) || '';
|
|
159
|
+
}
|
|
160
|
+
// Find existing stories for THIS feature (for dedup + warning)
|
|
161
|
+
const allStories = await listArtifacts(projectDir, config, 'story');
|
|
162
|
+
const featureStories = [];
|
|
163
|
+
for (const s of allStories) {
|
|
164
|
+
const data = await readArtifact(projectDir, config, 'story', s.id);
|
|
165
|
+
if (data && data.data.featureId === featureId) {
|
|
166
|
+
featureStories.push({ id: s.id, title: data.data.title || s.title });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (featureStories.length > 0) {
|
|
170
|
+
logger.warn(`${featureId} already has ${featureStories.length} story/stories:`);
|
|
171
|
+
for (const s of featureStories) {
|
|
172
|
+
console.log(chalk.dim(` ${s.id}: ${s.title}`));
|
|
173
|
+
}
|
|
174
|
+
const continueCreate = await promptConfirm('Generate additional stories? (AI will avoid duplicates)', false);
|
|
175
|
+
if (!continueCreate) {
|
|
176
|
+
logger.info('Story creation cancelled.');
|
|
177
|
+
return 0;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const existingTitles = featureStories.map((s) => `${s.id}: ${s.title}`);
|
|
181
|
+
logger.dim('AI is generating user stories...');
|
|
182
|
+
try {
|
|
183
|
+
const provider = await getAIProvider(config);
|
|
184
|
+
const messages = buildStoriesPrompt(featureRaw, epicRaw, existingTitles);
|
|
185
|
+
const result = await generateStreamingJSON(provider, messages, aiStoriesResponseSchema);
|
|
186
|
+
// Display generated stories
|
|
187
|
+
console.log(chalk.dim('━'.repeat(50)));
|
|
188
|
+
result.stories.forEach((story, i) => {
|
|
189
|
+
console.log(chalk.bold(` ${i + 1}. ${story.title}`));
|
|
190
|
+
console.log(chalk.dim(` As a ${story.role}, I want to ${story.goal}`));
|
|
191
|
+
console.log(chalk.dim(` So that ${story.benefit}`));
|
|
192
|
+
console.log(` Scenarios: ${story.gherkinScenarios.length}`);
|
|
193
|
+
});
|
|
194
|
+
console.log(chalk.dim('━'.repeat(50)));
|
|
195
|
+
const confirmAll = await promptConfirm(`Create all ${result.stories.length} user stories?`, true);
|
|
196
|
+
if (!confirmAll) {
|
|
197
|
+
logger.info('Story creation cancelled.');
|
|
198
|
+
return 0;
|
|
199
|
+
}
|
|
200
|
+
const createdIds = [];
|
|
201
|
+
const storyDir = path.join(projectDir, getArtifactDir(config, 'story'));
|
|
202
|
+
const featureFilename = await resolveArtifactFilename(projectDir, config, 'feature', featureId);
|
|
203
|
+
for (const story of result.stories) {
|
|
204
|
+
// Create the user story markdown
|
|
205
|
+
const { id, filePath } = await createArtifact(projectDir, config, 'story', 'stories/user-story.md.hbs', {
|
|
206
|
+
title: story.title,
|
|
207
|
+
featureId,
|
|
208
|
+
featureFilename,
|
|
209
|
+
role: story.role,
|
|
210
|
+
goal: story.goal,
|
|
211
|
+
benefit: story.benefit,
|
|
212
|
+
additionalNotes: story.additionalNotes || undefined,
|
|
213
|
+
});
|
|
214
|
+
// Create companion Gherkin file
|
|
215
|
+
const gherkinContent = await renderTemplate('stories/gherkin.feature.hbs', {
|
|
216
|
+
id,
|
|
217
|
+
title: story.title,
|
|
218
|
+
role: story.role,
|
|
219
|
+
goal: story.goal,
|
|
220
|
+
benefit: story.benefit,
|
|
221
|
+
scenarios: story.gherkinScenarios.map((s) => ({
|
|
222
|
+
name: s.name,
|
|
223
|
+
given: s.given,
|
|
224
|
+
when: s.when,
|
|
225
|
+
then: s.then,
|
|
226
|
+
})),
|
|
227
|
+
}, config.templateOverrides);
|
|
228
|
+
const gherkinPath = path.join(storyDir, `${id}-gherkin.feature`);
|
|
229
|
+
await writeFile(gherkinPath, gherkinContent);
|
|
230
|
+
createdIds.push(id);
|
|
231
|
+
await addChildReference(projectDir, config, 'feature', featureId, 'story', id, story.title);
|
|
232
|
+
logger.success(`Created ${id}: ${story.title}`);
|
|
233
|
+
logger.dim(` ${filePath}`);
|
|
234
|
+
}
|
|
235
|
+
logger.dim('');
|
|
236
|
+
logger.heading('Next steps:');
|
|
237
|
+
logger.dim(` 1. planr task create --story ${createdIds[0]} — Generate implementation tasks`);
|
|
238
|
+
logger.dim(` 2. planr task implement TASK-* — Implement with your coding agent`);
|
|
239
|
+
return createdIds.length;
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
const { AIError } = await import('../../ai/errors.js');
|
|
243
|
+
if (err instanceof AIError) {
|
|
244
|
+
logger.error(err.userMessage);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
throw err;
|
|
248
|
+
}
|
|
249
|
+
return 0;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async function createStoryManually(projectDir, config, opts) {
|
|
253
|
+
logger.heading(`Create User Story (from ${opts.feature})`);
|
|
254
|
+
const title = opts.title || (await promptText('Story title:'));
|
|
255
|
+
const role = await promptText('As a (role):');
|
|
256
|
+
const goal = await promptText('I want to (goal):');
|
|
257
|
+
const benefit = await promptText('So that (benefit):');
|
|
258
|
+
const additionalNotes = await promptText('Additional notes:', '');
|
|
259
|
+
const featureFilename = await resolveArtifactFilename(projectDir, config, 'feature', opts.feature);
|
|
260
|
+
const { id, filePath } = await createArtifact(projectDir, config, 'story', 'stories/user-story.md.hbs', {
|
|
261
|
+
title,
|
|
262
|
+
featureId: opts.feature,
|
|
263
|
+
featureFilename,
|
|
264
|
+
role,
|
|
265
|
+
goal,
|
|
266
|
+
benefit,
|
|
267
|
+
additionalNotes: additionalNotes || undefined,
|
|
268
|
+
});
|
|
269
|
+
// Create companion Gherkin file
|
|
270
|
+
const storyDir = path.join(projectDir, getArtifactDir(config, 'story'));
|
|
271
|
+
const gherkinContent = await renderTemplate('stories/gherkin.feature.hbs', {
|
|
272
|
+
id,
|
|
273
|
+
title,
|
|
274
|
+
role,
|
|
275
|
+
goal,
|
|
276
|
+
benefit,
|
|
277
|
+
scenarios: [
|
|
278
|
+
{
|
|
279
|
+
name: 'Happy path',
|
|
280
|
+
given: 'the preconditions are met',
|
|
281
|
+
when: `the user ${goal.toLowerCase()}`,
|
|
282
|
+
then: 'the expected outcome occurs',
|
|
283
|
+
},
|
|
284
|
+
],
|
|
285
|
+
}, config.templateOverrides);
|
|
286
|
+
const gherkinPath = path.join(storyDir, `${id}-gherkin.feature`);
|
|
287
|
+
await writeFile(gherkinPath, gherkinContent);
|
|
288
|
+
await addChildReference(projectDir, config, 'feature', opts.feature, 'story', id, title);
|
|
289
|
+
logger.success(`Created user story ${id}: ${title}`);
|
|
290
|
+
logger.dim(` ${filePath}`);
|
|
291
|
+
logger.dim(` ${gherkinPath}`);
|
|
292
|
+
logger.dim('');
|
|
293
|
+
logger.dim(`Next: planr task create --story ${id}`);
|
|
294
|
+
}
|
|
81
295
|
//# sourceMappingURL=story.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"story.js","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"story.js","sourceRoot":"","sources":["../../../src/cli/commands/story.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `planr sync` command.
|
|
3
|
+
*
|
|
4
|
+
* Validates and repairs cross-references across all artifacts:
|
|
5
|
+
* - Removes links to non-existent artifacts
|
|
6
|
+
* - Adds missing links (e.g., feature references epic but epic doesn't list it)
|
|
7
|
+
* - Deduplicates link lists
|
|
8
|
+
* - Reports all fixes
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export declare function registerSyncCommand(program: Command): void;
|
|
12
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAuDnD"}
|