@planu/cli 1.0.8 → 1.0.10

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 (61) hide show
  1. package/dist/engine/challenge-prioritizer.d.ts +17 -0
  2. package/dist/engine/challenge-prioritizer.d.ts.map +1 -0
  3. package/dist/engine/challenge-prioritizer.js +77 -0
  4. package/dist/engine/challenge-prioritizer.js.map +1 -0
  5. package/dist/engine/human-summary.d.ts +17 -0
  6. package/dist/engine/human-summary.d.ts.map +1 -0
  7. package/dist/engine/human-summary.js +95 -0
  8. package/dist/engine/human-summary.js.map +1 -0
  9. package/dist/engine/lifecycle-hints.d.ts +12 -0
  10. package/dist/engine/lifecycle-hints.d.ts.map +1 -0
  11. package/dist/engine/lifecycle-hints.js +79 -0
  12. package/dist/engine/lifecycle-hints.js.map +1 -0
  13. package/dist/tools/challenge-spec.d.ts.map +1 -1
  14. package/dist/tools/challenge-spec.js +16 -1
  15. package/dist/tools/challenge-spec.js.map +1 -1
  16. package/dist/tools/check-readiness.d.ts.map +1 -1
  17. package/dist/tools/check-readiness.js +7 -1
  18. package/dist/tools/check-readiness.js.map +1 -1
  19. package/dist/tools/clarify-requirements/multiple-choice.d.ts +30 -0
  20. package/dist/tools/clarify-requirements/multiple-choice.d.ts.map +1 -0
  21. package/dist/tools/clarify-requirements/multiple-choice.js +292 -0
  22. package/dist/tools/clarify-requirements/multiple-choice.js.map +1 -0
  23. package/dist/tools/clarify-requirements.d.ts.map +1 -1
  24. package/dist/tools/clarify-requirements.js +43 -4
  25. package/dist/tools/clarify-requirements.js.map +1 -1
  26. package/dist/tools/create-spec.d.ts.map +1 -1
  27. package/dist/tools/create-spec.js +8 -1
  28. package/dist/tools/create-spec.js.map +1 -1
  29. package/dist/tools/estimate.d.ts.map +1 -1
  30. package/dist/tools/estimate.js +8 -2
  31. package/dist/tools/estimate.js.map +1 -1
  32. package/dist/tools/list-specs.d.ts.map +1 -1
  33. package/dist/tools/list-specs.js +7 -2
  34. package/dist/tools/list-specs.js.map +1 -1
  35. package/dist/tools/resolve-project-id.d.ts +46 -2
  36. package/dist/tools/resolve-project-id.d.ts.map +1 -1
  37. package/dist/tools/resolve-project-id.js +78 -2
  38. package/dist/tools/resolve-project-id.js.map +1 -1
  39. package/dist/tools/resolve-project-path.d.ts +21 -0
  40. package/dist/tools/resolve-project-path.d.ts.map +1 -0
  41. package/dist/tools/resolve-project-path.js +117 -0
  42. package/dist/tools/resolve-project-path.js.map +1 -0
  43. package/dist/tools/update-status/index.d.ts.map +1 -1
  44. package/dist/tools/update-status/index.js +1 -1
  45. package/dist/tools/update-status/index.js.map +1 -1
  46. package/dist/tools/update-status/response-builder.d.ts +1 -1
  47. package/dist/tools/update-status/response-builder.d.ts.map +1 -1
  48. package/dist/tools/update-status/response-builder.js +28 -3
  49. package/dist/tools/update-status/response-builder.js.map +1 -1
  50. package/dist/tools/validate.d.ts.map +1 -1
  51. package/dist/tools/validate.js +4 -1
  52. package/dist/tools/validate.js.map +1 -1
  53. package/dist/types/analysis.d.ts +7 -0
  54. package/dist/types/analysis.d.ts.map +1 -1
  55. package/dist/types/common/primitives.d.ts +14 -0
  56. package/dist/types/common/primitives.d.ts.map +1 -1
  57. package/dist/types/cross-repo-search.d.ts +29 -0
  58. package/dist/types/cross-repo-search.d.ts.map +1 -1
  59. package/dist/types/spec/clarification.d.ts +8 -0
  60. package/dist/types/spec/clarification.d.ts.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ import type { FailureScenario, PrioritizedScenario, Spec } from '../types/index.js';
2
+ /**
3
+ * Compute a relevance score (0-100) for a scenario given the spec's type and target.
4
+ * Formula: base = probability * impact (0-1), boosted by keyword match (up to +30 points).
5
+ */
6
+ export declare function computeRelevanceScore(scenario: FailureScenario, spec: Spec): number;
7
+ /**
8
+ * Given a list of failure scenarios, assign relevanceScore to each and return
9
+ * the top-3 ranked by score descending.
10
+ * Always returns exactly 3 items (or fewer if scenarios has < 3 entries).
11
+ */
12
+ export declare function prioritizeScenarios(scenarios: FailureScenario[], spec: Spec): PrioritizedScenario[];
13
+ /**
14
+ * Build the "must address" summary prefix that leads with the top-3 scenarios.
15
+ */
16
+ export declare function buildPrioritizedSummary(top3: PrioritizedScenario[]): string;
17
+ //# sourceMappingURL=challenge-prioritizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge-prioritizer.d.ts","sourceRoot":"","sources":["../../src/engine/challenge-prioritizer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAkCpF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAkBnF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,eAAe,EAAE,EAC5B,IAAI,EAAE,IAAI,GACT,mBAAmB,EAAE,CAYvB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAO3E"}
@@ -0,0 +1,77 @@
1
+ // engine/challenge-prioritizer.ts — SPEC-338
2
+ // Ranks failure scenarios by relevance to the specific spec type/target
3
+ // and selects the top-3 most critical ones.
4
+ // --- Probability weight map (0-1) ---
5
+ const PROBABILITY_WEIGHT = {
6
+ low: 0.25,
7
+ medium: 0.55,
8
+ high: 1.0,
9
+ };
10
+ // --- Impact weight map (0-1) ---
11
+ const IMPACT_WEIGHT = {
12
+ low: 0.1,
13
+ medium: 0.35,
14
+ high: 0.65,
15
+ critical: 1.0,
16
+ };
17
+ /** Keywords that boost relevance when they appear in the scenario text. */
18
+ const SPEC_TYPE_KEYWORDS = {
19
+ feature: ['data', 'user', 'input', 'validation', 'state'],
20
+ bugfix: ['regression', 'edge case', 'null', 'undefined', 'race'],
21
+ refactor: ['interface', 'contract', 'compatibility', 'migration', 'deprecat'],
22
+ architecture: ['coupling', 'blast radius', 'rollback', 'migration', 'service'],
23
+ spike: ['timeout', 'external', 'rate limit', 'api', 'latency'],
24
+ };
25
+ const SPEC_TARGET_KEYWORDS = {
26
+ backend: ['database', 'concurrency', 'transaction', 'queue', 'retry'],
27
+ frontend: ['render', 'state', 'ux', 'loading', 'offline'],
28
+ fullstack: ['sync', 'consistency', 'cache', 'session', 'race'],
29
+ mobile: ['offline', 'battery', 'network', 'crash', 'permission'],
30
+ infrastructure: ['deployment', 'rollback', 'network', 'config', 'secret'],
31
+ };
32
+ /**
33
+ * Compute a relevance score (0-100) for a scenario given the spec's type and target.
34
+ * Formula: base = probability * impact (0-1), boosted by keyword match (up to +30 points).
35
+ */
36
+ export function computeRelevanceScore(scenario, spec) {
37
+ const probWeight = PROBABILITY_WEIGHT[scenario.probability];
38
+ const impactWeight = IMPACT_WEIGHT[scenario.impact];
39
+ // Base score: probability * impact, scaled to 0-70
40
+ const base = probWeight * impactWeight * 70;
41
+ // Keyword boost: up to +30
42
+ const lower = scenario.scenario.toLowerCase();
43
+ const typeKeywords = SPEC_TYPE_KEYWORDS[spec.type] ?? [];
44
+ const targetKeywords = SPEC_TARGET_KEYWORDS[spec.target] ?? [];
45
+ const allKeywords = [...typeKeywords, ...targetKeywords];
46
+ const matchCount = allKeywords.filter((kw) => lower.includes(kw)).length;
47
+ const maxKeywords = Math.max(allKeywords.length, 1);
48
+ const boost = (matchCount / maxKeywords) * 30;
49
+ return Math.round(Math.min(base + boost, 100));
50
+ }
51
+ /**
52
+ * Given a list of failure scenarios, assign relevanceScore to each and return
53
+ * the top-3 ranked by score descending.
54
+ * Always returns exactly 3 items (or fewer if scenarios has < 3 entries).
55
+ */
56
+ export function prioritizeScenarios(scenarios, spec) {
57
+ const scored = scenarios.map((s) => ({
58
+ ...s,
59
+ relevanceScore: computeRelevanceScore(s, spec),
60
+ }));
61
+ scored.sort((a, b) => b.relevanceScore - a.relevanceScore);
62
+ return scored.slice(0, 3).map((s, idx) => ({
63
+ ...s,
64
+ rank: idx + 1,
65
+ }));
66
+ }
67
+ /**
68
+ * Build the "must address" summary prefix that leads with the top-3 scenarios.
69
+ */
70
+ export function buildPrioritizedSummary(top3) {
71
+ if (top3.length === 0) {
72
+ return '';
73
+ }
74
+ const lines = top3.map((s) => `${s.rank}. ${s.scenario}`);
75
+ return `Here are the 3 things you MUST address before coding:\n${lines.join('\n')}`;
76
+ }
77
+ //# sourceMappingURL=challenge-prioritizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge-prioritizer.js","sourceRoot":"","sources":["../../src/engine/challenge-prioritizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** create_spec — plan was created successfully */
2
+ export declare function buildCreateSpecSummary(title: string, devHours: number): string;
3
+ /** update_status — status transition completed */
4
+ export declare function buildUpdateStatusSummary(title: string, newStatus: string): string;
5
+ /** check_readiness — readiness score evaluated */
6
+ export declare function buildCheckReadinessSummary(score: number, blockerCount: number): string;
7
+ /** challenge_spec — risks and scenarios identified */
8
+ export declare function buildChallengeSpecSummary(topScenarios: {
9
+ scenario: string;
10
+ }[], overallRisk: string): string;
11
+ /** validate — criteria checked against implementation */
12
+ export declare function buildValidateSummary(passing: number, total: number): string;
13
+ /** list_specs — specs listed for a project */
14
+ export declare function buildListSpecsSummary(total: number, byStatus: Record<string, number>): string;
15
+ /** estimate — time and cost estimated for a spec */
16
+ export declare function buildEstimateSummary(title: string, totalHours: number, taskCount: number): string;
17
+ //# sourceMappingURL=human-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-summary.d.ts","sourceRoot":"","sources":["../../src/engine/human-summary.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED,kDAAkD;AAClD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBjF;AAED,kDAAkD;AAClD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAYtF;AAED,sDAAsD;AACtD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,EACpC,WAAW,EAAE,MAAM,GAClB,MAAM,CAaR;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3E;AAED,8CAA8C;AAC9C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAoB7F;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjG"}
@@ -0,0 +1,95 @@
1
+ // engine/human-summary.ts — Plain-language one/two-sentence summaries for tool responses.
2
+ // Rules: no IDs/hashes, no jargon, max 2 sentences, always end with a next-step suggestion.
3
+ /** create_spec — plan was created successfully */
4
+ export function buildCreateSpecSummary(title, devHours) {
5
+ const hours = devHours > 0 ? `Estimated ${String(devHours)}h` : 'Estimation ready';
6
+ return `Plan created for "${title}". ${hours} — tell me when you're ready to review it.`;
7
+ }
8
+ /** update_status — status transition completed */
9
+ export function buildUpdateStatusSummary(title, newStatus) {
10
+ if (newStatus === 'done') {
11
+ return `Done! "${title}" is complete and recorded. Run estimate or start a new plan when you're ready.`;
12
+ }
13
+ if (newStatus === 'approved') {
14
+ return `"${title}" is approved and ready to build. Start implementing whenever you like.`;
15
+ }
16
+ if (newStatus === 'implementing') {
17
+ return `Implementation started for "${title}". Run validate when you think it's done.`;
18
+ }
19
+ if (newStatus === 'review') {
20
+ return `"${title}" is now under review. Approve it or request changes to move forward.`;
21
+ }
22
+ if (newStatus === 'discarded') {
23
+ return `"${title}" has been discarded. Create a new plan whenever you want to restart.`;
24
+ }
25
+ return `"${title}" moved to ${newStatus}. Check the next step suggestion above to continue.`;
26
+ }
27
+ /** check_readiness — readiness score evaluated */
28
+ export function buildCheckReadinessSummary(score, blockerCount) {
29
+ if (score >= 90 && blockerCount === 0) {
30
+ return `This plan has enough detail to start building. No blockers found — go ahead and approve it.`;
31
+ }
32
+ if (blockerCount > 0) {
33
+ const noun = blockerCount === 1 ? 'blocker' : 'blockers';
34
+ return `This plan has ${String(blockerCount)} ${noun} that must be fixed before building. Address them, then run check_readiness again.`;
35
+ }
36
+ if (score >= 70) {
37
+ return `This plan is mostly ready with a score of ${String(score)}/100. Review the warnings, then approve it when satisfied.`;
38
+ }
39
+ return `This plan scores ${String(score)}/100 and needs more detail before it can be approved. Check the recommendations and fill in the gaps.`;
40
+ }
41
+ /** challenge_spec — risks and scenarios identified */
42
+ export function buildChallengeSpecSummary(topScenarios, overallRisk) {
43
+ const count = topScenarios.length;
44
+ if (count === 0) {
45
+ return `No critical issues found — this plan looks solid. Approve it when you're ready to build.`;
46
+ }
47
+ const noun = count === 1 ? 'thing' : 'things';
48
+ const items = topScenarios.map((s) => s.scenario);
49
+ const list = count <= 3
50
+ ? items.join(', ')
51
+ : `${items.slice(0, 3).join(', ')}, and ${String(count - 3)} more`;
52
+ const urgency = overallRisk === 'critical' || overallRisk === 'high' ? ' before coding' : '';
53
+ return `${String(count)} ${noun} you must handle${urgency}: ${list}. Fix these, then run challenge_spec again to confirm.`;
54
+ }
55
+ /** validate — criteria checked against implementation */
56
+ export function buildValidateSummary(passing, total) {
57
+ if (total === 0) {
58
+ return `No criteria could be checked. Add acceptance criteria to the plan and run validate again.`;
59
+ }
60
+ const failing = total - passing;
61
+ if (failing === 0) {
62
+ return `All ${String(total)} criteria pass. Mark this feature as done when you're satisfied.`;
63
+ }
64
+ const noun = failing === 1 ? 'failing one' : `${String(failing)} failing ones`;
65
+ return `${String(passing)} of ${String(total)} criteria pass. Fix the ${noun}, then run validate again.`;
66
+ }
67
+ /** list_specs — specs listed for a project */
68
+ export function buildListSpecsSummary(total, byStatus) {
69
+ if (total === 0) {
70
+ return `No plans found in this project yet. Use create_spec to add your first one.`;
71
+ }
72
+ const get = (key) => byStatus[key] ?? 0;
73
+ const inProgress = get('implementing') + get('approved');
74
+ const inReview = get('review');
75
+ if (inReview > 0 && inProgress > 0) {
76
+ const reviewNoun = inReview === 1 ? 'plan' : 'plans';
77
+ return `You have ${String(inProgress)} in progress and ${String(inReview)} ${reviewNoun} ready to review. Start with the ones under review.`;
78
+ }
79
+ if (inReview > 0) {
80
+ const noun = inReview === 1 ? 'plan' : 'plans';
81
+ return `You have ${String(inReview)} ${noun} ready to review. Approve or request changes to move forward.`;
82
+ }
83
+ if (inProgress > 0) {
84
+ const noun = inProgress === 1 ? 'plan' : 'plans';
85
+ return `You have ${String(inProgress)} ${noun} in progress. Run validate when implementation is done.`;
86
+ }
87
+ return `You have ${String(total)} plans in this project. Approve a plan to start implementing.`;
88
+ }
89
+ /** estimate — time and cost estimated for a spec */
90
+ export function buildEstimateSummary(title, totalHours, taskCount) {
91
+ const taskLabel = taskCount === 1 ? 'task' : 'tasks';
92
+ const taskSuffix = taskCount > 0 ? ` across ${String(taskCount)} ${taskLabel}` : '';
93
+ return `Estimated ${String(totalHours)}h total${taskSuffix} for "${title}". Approve the plan to start implementing.`;
94
+ }
95
+ //# sourceMappingURL=human-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-summary.js","sourceRoot":"","sources":["../../src/engine/human-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SpecStatus, NextAction, LifecycleMap } from '../types/index.js';
2
+ /**
3
+ * Returns the guided next action for a given status transition.
4
+ * The hint targets the *newStatus* reached, guiding what to do from there.
5
+ */
6
+ export declare function buildNextAction(newStatus: SpecStatus): NextAction;
7
+ /**
8
+ * Returns the lifecycle map for the given current status.
9
+ * Shows where the spec is, what's next, and what remains.
10
+ */
11
+ export declare function buildLifecycleMap(currentStatus: SpecStatus): LifecycleMap;
12
+ //# sourceMappingURL=lifecycle-hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-hints.d.ts","sourceRoot":"","sources":["../../src/engine/lifecycle-hints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuC9E;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAYjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,UAAU,GAAG,YAAY,CA0BzE"}
@@ -0,0 +1,79 @@
1
+ /** Forward lifecycle order excluding terminal states */
2
+ const LIFECYCLE_STAGES = ['draft', 'review', 'approved', 'implementing', 'done'];
3
+ /** Maps each forward transition to a guided next action */
4
+ const NEXT_ACTION_MAP = {
5
+ review: {
6
+ step: 'Get approval',
7
+ prompt: "Share this plan with your team or just tell me 'approved' to move forward",
8
+ suggestedCommand: 'update_status(approved)',
9
+ whenToDoIt: "When you're happy with the plan",
10
+ },
11
+ approved: {
12
+ step: 'Create your git branch',
13
+ prompt: 'Run: git checkout -b feat/<spec-slug>',
14
+ suggestedCommand: 'manage_git(branch)',
15
+ whenToDoIt: 'Before writing any code',
16
+ },
17
+ implementing: {
18
+ step: 'Start coding',
19
+ prompt: 'Implement the spec following the technical plan',
20
+ suggestedCommand: 'validate(specId)',
21
+ whenToDoIt: 'While developing',
22
+ },
23
+ done: {
24
+ step: 'Validate your implementation',
25
+ prompt: 'Run validate to check that your code matches the spec',
26
+ suggestedCommand: 'validate(specId)',
27
+ whenToDoIt: 'After all tests pass',
28
+ },
29
+ discarded: {
30
+ step: 'Archive or delete spec',
31
+ prompt: 'This spec has been discarded. You can delete it or keep it for reference.',
32
+ suggestedCommand: 'delete_spec(specId)',
33
+ whenToDoIt: 'When cleanup is needed',
34
+ },
35
+ };
36
+ /**
37
+ * Returns the guided next action for a given status transition.
38
+ * The hint targets the *newStatus* reached, guiding what to do from there.
39
+ */
40
+ export function buildNextAction(newStatus) {
41
+ const hint = NEXT_ACTION_MAP[newStatus];
42
+ if (hint !== undefined) {
43
+ return hint;
44
+ }
45
+ // Fallback for any unrecognised status
46
+ return {
47
+ step: 'Continue',
48
+ prompt: `Spec is now ${newStatus}. Check Planu for next steps.`,
49
+ suggestedCommand: 'list_specs()',
50
+ whenToDoIt: 'When ready',
51
+ };
52
+ }
53
+ /**
54
+ * Returns the lifecycle map for the given current status.
55
+ * Shows where the spec is, what's next, and what remains.
56
+ */
57
+ export function buildLifecycleMap(currentStatus) {
58
+ const currentIdx = LIFECYCLE_STAGES.indexOf(currentStatus);
59
+ if (currentIdx === -1) {
60
+ // Terminal state (discarded) or unknown — show full chain as completed/irrelevant
61
+ return {
62
+ stages: LIFECYCLE_STAGES,
63
+ current: currentStatus,
64
+ next: null,
65
+ remaining: [],
66
+ };
67
+ }
68
+ const nextStatus = currentIdx < LIFECYCLE_STAGES.length - 1
69
+ ? (LIFECYCLE_STAGES[currentIdx + 1] ?? null)
70
+ : null;
71
+ const remaining = LIFECYCLE_STAGES.slice(currentIdx + 2);
72
+ return {
73
+ stages: LIFECYCLE_STAGES,
74
+ current: currentStatus,
75
+ next: nextStatus,
76
+ remaining,
77
+ };
78
+ }
79
+ //# sourceMappingURL=lifecycle-hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-hints.js","sourceRoot":"","sources":["../../src/engine/lifecycle-hints.ts"],"names":[],"mappings":"AAGA,wDAAwD;AACxD,MAAM,gBAAgB,GAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AAE/F,2DAA2D;AAC3D,MAAM,eAAe,GAA4C;IAC/D,MAAM,EAAE;QACN,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,2EAA2E;QACnF,gBAAgB,EAAE,yBAAyB;QAC3C,UAAU,EAAE,iCAAiC;KAC9C;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,uCAAuC;QAC/C,gBAAgB,EAAE,oBAAoB;QACtC,UAAU,EAAE,yBAAyB;KACtC;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,iDAAiD;QACzD,gBAAgB,EAAE,kBAAkB;QACpC,UAAU,EAAE,kBAAkB;KAC/B;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,uDAAuD;QAC/D,gBAAgB,EAAE,kBAAkB;QACpC,UAAU,EAAE,sBAAsB;KACnC;IACD,SAAS,EAAE;QACT,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,2EAA2E;QACnF,gBAAgB,EAAE,qBAAqB;QACvC,UAAU,EAAE,wBAAwB;KACrC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAqB;IACnD,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,uCAAuC;IACvC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,eAAe,SAAS,+BAA+B;QAC/D,gBAAgB,EAAE,cAAc;QAChC,UAAU,EAAE,YAAY;KACzB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAyB;IACzD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAE3D,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,kFAAkF;QAClF,OAAO;YACL,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GACd,UAAU,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAEzD,OAAO;QACL,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,UAAU;QAChB,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"challenge-spec.d.ts","sourceRoot":"","sources":["../../src/tools/challenge-spec.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,kBAAkB,EAIlB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAqC3B,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAoKvF"}
1
+ {"version":3,"file":"challenge-spec.d.ts","sourceRoot":"","sources":["../../src/tools/challenge-spec.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,kBAAkB,EAIlB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAuC3B,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAoLvF"}
@@ -5,6 +5,8 @@ import { specStore, knowledgeStore } from '../storage/index.js';
5
5
  import { t, ti } from '../i18n/index.js';
6
6
  import { generateFailureScenarios, generateSecurityScenarios, generateScaleScenarios, generateDataConsistencyScenarios, generateGameChallenges, generateDesktopAutoUpdateChallenges, } from './challenge-spec-scenarios.js';
7
7
  import { generateConcurrencyAnalysis, buildScalabilityAssessment, calculateOverallRisk, readSpecContent, } from './challenge-spec-helpers.js';
8
+ import { prioritizeScenarios, buildPrioritizedSummary } from '../engine/challenge-prioritizer.js';
9
+ import { buildChallengeSpecSummary } from '../engine/human-summary.js';
8
10
  import { generateAgentChallengeScenarios, isAgentSpec, } from './challenge-spec/agent-challenge-scenarios.js';
9
11
  import { getPlatformChallenges } from './challenge-spec/platform-challenge-scenarios.js';
10
12
  import { generateSecurityChallengeScenarios } from './challenge-spec/security-challenge-scenarios.js';
@@ -102,12 +104,21 @@ export async function handleChallengeSpec(args) {
102
104
  const scalabilityAssessment = buildScalabilityAssessment(spec, knowledge, failureScenarios);
103
105
  // 8. Calculate overall risk
104
106
  const overallRisk = calculateOverallRisk(failureScenarios, concurrencyAnalysis);
107
+ // 9. Compute relevance scores and select top-3 (SPEC-338)
108
+ const prioritized = prioritizeScenarios(failureScenarios, spec);
109
+ const prioritizedSummary = buildPrioritizedSummary(prioritized);
110
+ // Attach relevanceScore to each scenario in the full list
111
+ const failureScenariosScored = failureScenarios.map((s) => {
112
+ const match = prioritized.find((p) => p.scenario === s.scenario);
113
+ return match !== undefined ? { ...s, relevanceScore: match.relevanceScore } : s;
114
+ });
105
115
  const analysis = {
106
- failureScenarios,
116
+ failureScenarios: failureScenariosScored,
107
117
  concurrencyAnalysis,
108
118
  scalabilityAssessment,
109
119
  overallRisk,
110
120
  };
121
+ const humanSummary = buildChallengeSpecSummary(prioritized, overallRisk);
111
122
  return {
112
123
  content: [
113
124
  {
@@ -120,8 +131,11 @@ export async function handleChallengeSpec(args) {
120
131
  type: 'text',
121
132
  text: JSON.stringify({
122
133
  ...analysis,
134
+ prioritized,
123
135
  summary: {
124
136
  totalScenarios: failureScenarios.length,
137
+ shownByDefault: 3,
138
+ mustAddressBeforeCoding: prioritizedSummary,
125
139
  criticalImpact: failureScenarios.filter((s) => s.impact === 'critical').length,
126
140
  highImpact: failureScenarios.filter((s) => s.impact === 'high').length,
127
141
  raceConditions: concurrencyAnalysis.raceConditions.length,
@@ -146,6 +160,7 @@ export async function handleChallengeSpec(args) {
146
160
  : null,
147
161
  }, null, 2),
148
162
  },
163
+ { type: 'text', text: humanSummary },
149
164
  ],
150
165
  };
151
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"challenge-spec.js","sourceRoot":"","sources":["../../src/tools/challenge-spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"challenge-spec.js","sourceRoot":"","sources":["../../src/tools/challenge-spec.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"check-readiness.d.ts","sourceRoot":"","sources":["../../src/tools/check-readiness.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAC;AA6F1F,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,mBAAmB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,UAAU,CAAC,CA0CrB"}
1
+ {"version":3,"file":"check-readiness.d.ts","sourceRoot":"","sources":["../../src/tools/check-readiness.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAC;AA6F1F,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,mBAAmB,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,UAAU,CAAC,CA+CrB"}
@@ -2,6 +2,7 @@
2
2
  import { specStore } from '../storage/index.js';
3
3
  import { checkSpecReadiness } from '../engine/readiness-checker.js';
4
4
  import { scoreSpecQuality } from '../engine/spec-quality-scorer.js';
5
+ import { buildCheckReadinessSummary } from '../engine/human-summary.js';
5
6
  import { resolveProjectId } from './resolve-project-id.js';
6
7
  // ── Formatting helpers ───────────────────────────────────────────────────────
7
8
  function formatScore(score) {
@@ -106,8 +107,12 @@ export async function handleCheckReadiness(args) {
106
107
  ]);
107
108
  const qualityScore = qualityReport.score;
108
109
  const formatted = formatReport(report);
110
+ const humanSummary = buildCheckReadinessSummary(report.score, report.issues.blockers.length);
109
111
  return {
110
- content: [{ type: 'text', text: formatted }],
112
+ content: [
113
+ { type: 'text', text: formatted },
114
+ { type: 'text', text: humanSummary },
115
+ ],
111
116
  structuredContent: {
112
117
  specId: report.specId,
113
118
  score: report.score,
@@ -116,6 +121,7 @@ export async function handleCheckReadiness(args) {
116
121
  issues: report.issues,
117
122
  recommendations: report.recommendations,
118
123
  qualityScore,
124
+ humanSummary,
119
125
  },
120
126
  };
121
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"check-readiness.js","sourceRoot":"","sources":["../../src/tools/check-readiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check-readiness.js","sourceRoot":"","sources":["../../src/tools/check-readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ClarificationQuestion } from '../../types/index.js';
2
+ /** Detected stack info from package files in the project directory. */
3
+ export interface StackDetectionResult {
4
+ framework: string | null;
5
+ language: string | null;
6
+ database: string | null;
7
+ /** Raw names found in package.json dependencies */
8
+ detectedLibs: string[];
9
+ }
10
+ /**
11
+ * Detect the project stack by reading package.json and/or requirements.txt
12
+ * from the given project path.
13
+ */
14
+ export declare function detectStack(projectPath: string): Promise<StackDetectionResult>;
15
+ /**
16
+ * Returns true if the question should be skipped because the stack already
17
+ * provides a definitive answer.
18
+ */
19
+ export declare function shouldSkipQuestion(question: ClarificationQuestion, stack: StackDetectionResult): boolean;
20
+ /**
21
+ * Attaches structured `options[]` to a question based on its content.
22
+ * Each question gets 3-8 concrete choices + 'Other: ___' fallback.
23
+ */
24
+ export declare function attachOptions(question: ClarificationQuestion): ClarificationQuestion;
25
+ /**
26
+ * Builds a `suggestedDescription` string from accumulated answers.
27
+ * The returned string is suitable for passing directly to create_spec.
28
+ */
29
+ export declare function buildSuggestedDescription(topic: string, answers: Record<string, string>, questions: ClarificationQuestion[]): string;
30
+ //# sourceMappingURL=multiple-choice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiple-choice.d.ts","sourceRoot":"","sources":["../../../src/tools/clarify-requirements/multiple-choice.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mDAAmD;IACnD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA4FD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoGpF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAYT;AASD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,qBAAqB,GAAG,qBAAqB,CAwDpF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,SAAS,EAAE,qBAAqB,EAAE,GACjC,MAAM,CAgBR"}