feat(P01): interactive validation + doc updates + multi-project CLI — IDEATE-12,13,14 + MULTI-02,06
---ci---
phase: 1
milestone: v0.10
status: execute
decisions:
- id: D-083
decision: Interactive one-at-a-time validation with accept/skip/modify
rationale: Gives user full control over ideation results
confidence: 0.87
- id: D-085
decision: Ask-after-validation kickoff of run workflow
rationale: Balances automation with user control
confidence: 0.85
- id: D-091
decision: Full multi-project support with active_projects array + parallel execution
rationale: User wants complete multi-project capability
confidence: 0.85
requirements:
covered:
- IDEATE-12
- IDEATE-13
- IDEATE-14
- MULTI-02
- MULTI-06
---/ci---
- IDEATE-12: Interactive accept/skip/modify validation with readline
- IDEATE-13: acceptIdea/acceptIdeas methods update REQUIREMENTS.md and ROADMAP.md
- IDEATE-14: Ask-after-validation kickoff prompt for
- MULTI-02: --project flag accepts comma-separated or 'all' in pre-action hook
- MULTI-06: ciagent status shows active_projects and ideation config
- projects list shows all active projects with multi-marker
- projects set updates both active_project and active_projects
This commit is contained in:
@@ -846,4 +846,95 @@ export class IdeationEngine {
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
acceptIdea(idea: Idea): { reqId: string; addedToRequirements: boolean; addedToRoadmap: boolean } {
|
||||
const reqId = idea.id;
|
||||
const reqs = this.ciFiles.readRequirementsMd();
|
||||
const roadmap = this.ciFiles.readRoadmapMd();
|
||||
|
||||
let addedToRequirements = false;
|
||||
let addedToRoadmap = false;
|
||||
|
||||
if (reqs) {
|
||||
const categoryMap: Record<string, string> = {
|
||||
security: "Security",
|
||||
quality: "Quality",
|
||||
architecture: "Architecture",
|
||||
coverage: "Coverage",
|
||||
improvement: "Improvement",
|
||||
spec: "Specification",
|
||||
chaos: "Resilience",
|
||||
};
|
||||
|
||||
const categoryName = categoryMap[idea.category] || "Improvement";
|
||||
let foundCategory = false;
|
||||
for (const cat of reqs.v1) {
|
||||
if (cat.category.toLowerCase() === categoryName.toLowerCase()) {
|
||||
cat.items.push({ id: reqId, description: idea.title });
|
||||
foundCategory = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!foundCategory) {
|
||||
reqs.v1.push({
|
||||
category: categoryName,
|
||||
items: [{ id: reqId, description: idea.title }],
|
||||
});
|
||||
}
|
||||
|
||||
reqs.traceability.push({
|
||||
requirement: reqId,
|
||||
phase: 0,
|
||||
status: "pending",
|
||||
});
|
||||
|
||||
this.ciFiles.writeRequirementsMd(reqs);
|
||||
addedToRequirements = true;
|
||||
}
|
||||
|
||||
if (roadmap) {
|
||||
const lastPhase = roadmap.phases.length > 0
|
||||
? roadmap.phases[roadmap.phases.length - 1]
|
||||
: null;
|
||||
|
||||
const nextPhaseNumber = lastPhase ? lastPhase.number + 1 : 1;
|
||||
const phaseName = idea.category === "security" ? "security-hardening"
|
||||
: idea.category === "architecture" ? "architecture-fix"
|
||||
: idea.category === "coverage" ? "coverage-expansion"
|
||||
: idea.category === "quality" ? "quality-improvement"
|
||||
: idea.category === "spec" ? "spec-refinement"
|
||||
: idea.category === "chaos" ? "resilience-hardening"
|
||||
: "improvement";
|
||||
|
||||
roadmap.phases.push({
|
||||
number: nextPhaseNumber,
|
||||
name: phaseName,
|
||||
description: idea.title,
|
||||
status: "not_started",
|
||||
dependsOn: lastPhase ? [lastPhase.number] : [],
|
||||
requirements: [reqId],
|
||||
successCriteria: [idea.rationale],
|
||||
});
|
||||
|
||||
this.ciFiles.writeRoadmapMd(roadmap);
|
||||
addedToRoadmap = true;
|
||||
}
|
||||
|
||||
return { reqId, addedToRequirements, addedToRoadmap };
|
||||
}
|
||||
|
||||
acceptIdeas(ideas: Idea[]): { accepted: Idea[]; results: Array<{ reqId: string; addedToRequirements: boolean; addedToRoadmap: boolean }> } {
|
||||
const accepted: Idea[] = [];
|
||||
const results: Array<{ reqId: string; addedToRequirements: boolean; addedToRoadmap: boolean }> = [];
|
||||
|
||||
for (const idea of ideas) {
|
||||
const result = this.acceptIdea(idea);
|
||||
if (result.addedToRequirements || result.addedToRoadmap) {
|
||||
accepted.push(idea);
|
||||
results.push(result);
|
||||
}
|
||||
}
|
||||
|
||||
return { accepted, results };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user