@planu/cli 1.0.8 → 1.0.9
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/dist/engine/challenge-prioritizer.d.ts +17 -0
- package/dist/engine/challenge-prioritizer.d.ts.map +1 -0
- package/dist/engine/challenge-prioritizer.js +77 -0
- package/dist/engine/challenge-prioritizer.js.map +1 -0
- package/dist/engine/lifecycle-hints.d.ts +12 -0
- package/dist/engine/lifecycle-hints.d.ts.map +1 -0
- package/dist/engine/lifecycle-hints.js +79 -0
- package/dist/engine/lifecycle-hints.js.map +1 -0
- package/dist/tools/challenge-spec.d.ts.map +1 -1
- package/dist/tools/challenge-spec.js +13 -1
- package/dist/tools/challenge-spec.js.map +1 -1
- package/dist/tools/clarify-requirements/multiple-choice.d.ts +30 -0
- package/dist/tools/clarify-requirements/multiple-choice.d.ts.map +1 -0
- package/dist/tools/clarify-requirements/multiple-choice.js +292 -0
- package/dist/tools/clarify-requirements/multiple-choice.js.map +1 -0
- package/dist/tools/clarify-requirements.d.ts.map +1 -1
- package/dist/tools/clarify-requirements.js +43 -4
- package/dist/tools/clarify-requirements.js.map +1 -1
- package/dist/tools/resolve-project-id.d.ts +46 -2
- package/dist/tools/resolve-project-id.d.ts.map +1 -1
- package/dist/tools/resolve-project-id.js +78 -2
- package/dist/tools/resolve-project-id.js.map +1 -1
- package/dist/tools/resolve-project-path.d.ts +21 -0
- package/dist/tools/resolve-project-path.d.ts.map +1 -0
- package/dist/tools/resolve-project-path.js +117 -0
- package/dist/tools/resolve-project-path.js.map +1 -0
- package/dist/tools/update-status/response-builder.d.ts.map +1 -1
- package/dist/tools/update-status/response-builder.js +20 -1
- package/dist/tools/update-status/response-builder.js.map +1 -1
- package/dist/types/analysis.d.ts +7 -0
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/common/primitives.d.ts +14 -0
- package/dist/types/common/primitives.d.ts.map +1 -1
- package/dist/types/cross-repo-search.d.ts +29 -0
- package/dist/types/cross-repo-search.d.ts.map +1 -1
- package/dist/types/spec/clarification.d.ts +8 -0
- package/dist/types/spec/clarification.d.ts.map +1 -1
- 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,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;
|
|
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;AAsC3B,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiLvF"}
|
|
@@ -5,6 +5,7 @@ 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';
|
|
8
9
|
import { generateAgentChallengeScenarios, isAgentSpec, } from './challenge-spec/agent-challenge-scenarios.js';
|
|
9
10
|
import { getPlatformChallenges } from './challenge-spec/platform-challenge-scenarios.js';
|
|
10
11
|
import { generateSecurityChallengeScenarios } from './challenge-spec/security-challenge-scenarios.js';
|
|
@@ -102,8 +103,16 @@ export async function handleChallengeSpec(args) {
|
|
|
102
103
|
const scalabilityAssessment = buildScalabilityAssessment(spec, knowledge, failureScenarios);
|
|
103
104
|
// 8. Calculate overall risk
|
|
104
105
|
const overallRisk = calculateOverallRisk(failureScenarios, concurrencyAnalysis);
|
|
106
|
+
// 9. Compute relevance scores and select top-3 (SPEC-338)
|
|
107
|
+
const prioritized = prioritizeScenarios(failureScenarios, spec);
|
|
108
|
+
const prioritizedSummary = buildPrioritizedSummary(prioritized);
|
|
109
|
+
// Attach relevanceScore to each scenario in the full list
|
|
110
|
+
const failureScenariosScored = failureScenarios.map((s) => {
|
|
111
|
+
const match = prioritized.find((p) => p.scenario === s.scenario);
|
|
112
|
+
return match !== undefined ? { ...s, relevanceScore: match.relevanceScore } : s;
|
|
113
|
+
});
|
|
105
114
|
const analysis = {
|
|
106
|
-
failureScenarios,
|
|
115
|
+
failureScenarios: failureScenariosScored,
|
|
107
116
|
concurrencyAnalysis,
|
|
108
117
|
scalabilityAssessment,
|
|
109
118
|
overallRisk,
|
|
@@ -120,8 +129,11 @@ export async function handleChallengeSpec(args) {
|
|
|
120
129
|
type: 'text',
|
|
121
130
|
text: JSON.stringify({
|
|
122
131
|
...analysis,
|
|
132
|
+
prioritized,
|
|
123
133
|
summary: {
|
|
124
134
|
totalScenarios: failureScenarios.length,
|
|
135
|
+
shownByDefault: 3,
|
|
136
|
+
mustAddressBeforeCoding: prioritizedSummary,
|
|
125
137
|
criticalImpact: failureScenarios.filter((s) => s.impact === 'critical').length,
|
|
126
138
|
highImpact: failureScenarios.filter((s) => s.impact === 'high').length,
|
|
127
139
|
raceConditions: concurrencyAnalysis.raceConditions.length,
|
|
@@ -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":"AAAA,gEAAgE;AAChE,oEAAoE;AACpE,0EAA0E;AAE1E,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAQzC,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,gCAAgC,EAChC,sBAAsB,EACtB,mCAAmC,GACpC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClG,OAAO,EACL,+BAA+B,EAC/B,WAAW,GACZ,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,EAAE,kCAAkC,EAAE,MAAM,kDAAkD,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,iDAAiD,CAAC;AACpG,OAAO,EAAE,+BAA+B,EAAE,MAAM,+CAA+C,CAAC;AAChG,OAAO,EACL,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,oCAAoC,EAAE,MAAM,oDAAoD,CAAC;AAE1G,MAAM,eAAe,GAAyB;IAC5C,UAAU;IACV,aAAa;IACb,OAAO;IACP,UAAU;IACV,kBAAkB;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAwB;IAChE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE1C,eAAe;IACf,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAC/E,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACjE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAErE,uBAAuB;IACvB,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAEhD,2BAA2B;IAC3B,MAAM,UAAU,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC;IAEvE,gCAAgC;IAChC,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAE/C,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,gBAAgB,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,gBAAgB,CAAC,IAAI,CAAC,GAAG,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,gBAAgB,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC5C,gBAAgB,CAAC,IAAI,CAAC,GAAG,gCAAgC,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,yEAAyE;IACzE,IACE,SAAS,CAAC,eAAe,KAAK,MAAM;QACpC,CAAC,SAAS,CAAC,SAAS,KAAK,IAAI;YAC3B,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EACzF,CAAC;QACD,gBAAgB,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,gDAAgD;IAChD,gBAAgB,CAAC,IAAI,CAAC,GAAG,mCAAmC,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE5F,iDAAiD;IACjD,IAAI,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QACnC,gBAAgB,CAAC,IAAI,CAAC,GAAG,+BAA+B,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,yDAAyD;IACzD,gBAAgB,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9E,6DAA6D;IAC7D,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,gBAAgB,CAAC,IAAI,CAAC,GAAG,kCAAkC,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,iEAAiE;IACjE,gBAAgB,CAAC,IAAI,CAAC,GAAG,iCAAiC,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1F,qEAAqE;IACrE,gBAAgB,CAAC,IAAI,CAAC,GAAG,+BAA+B,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAExF,mDAAmD;IACnD,MAAM,MAAM,GACV,SAAS,CAAC,YAAY,CAAC,OAAO,KAAK,KAAK,IAAI,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/F,IAAI,MAAM,EAAE,CAAC;QACX,gBAAgB,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,yEAAyE;IACzE,gBAAgB,CAAC,IAAI,CAAC,GAAG,oCAAoC,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE7F,sDAAsD;IACtD,2FAA2F;IAC3F,6FAA6F;IAC7F,qFAAqF;IACrF,MAAM,WAAW,GAAI,SAAgD,CAAC,WAEzD,CAAC;IACd,IAAI,WAAW,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;QAClC,gBAAgB,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,mCAAmC;IACnC,MAAM,mBAAmB,GAAG,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5D,CAAC,CAAC,2BAA2B,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC;QAC3D,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IAE/E,kCAAkC;IAClC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAE5F,4BAA4B;IAC5B,MAAM,WAAW,GAAG,oBAAoB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAEhF,0DAA0D;IAC1D,MAAM,WAAW,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAEhE,0DAA0D;IAC1D,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;QACjE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAuB;QACnC,gBAAgB,EAAE,sBAAsB;QACxC,mBAAmB;QACnB,qBAAqB;QACrB,WAAW;KACZ,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,EAAE,CAAC,8BAA8B,EAAE;oBACvC,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC;iBAC/C,CAAC;aACH;YACD;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,GAAG,QAAQ;oBACX,WAAW;oBACX,OAAO,EAAE;wBACP,cAAc,EAAE,gBAAgB,CAAC,MAAM;wBACvC,cAAc,EAAE,CAAC;wBACjB,uBAAuB,EAAE,kBAAkB;wBAC3C,cAAc,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM;wBAC9E,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM;wBACtE,cAAc,EAAE,mBAAmB,CAAC,cAAc,CAAC,MAAM;wBACzD,WAAW;wBACX,UAAU,EAAE,UAAU;wBACtB,QAAQ,EACN,WAAW,KAAK,UAAU,IAAI,WAAW,KAAK,MAAM;4BAClD,CAAC,CAAC;gCACE,uCAAuC,WAAW,8DAA8D;gCAChH,WAAW,KAAK,UAAU;oCACxB,CAAC,CAAC,kEAAkE;oCACpE,CAAC,CAAC,2EAA2E;6BAChF;4BACH,CAAC,CAAC,EAAE;qBACT;oBACD,sBAAsB,EAAE,YAAY;wBAClC,CAAC,CAAC;4BACE,eAAe,EAAE,YAAY,CAAC,UAAU,CAAC,MAAM;4BAC/C,WAAW,EAAE,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC;iCAC5E,MAAM;4BACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;yBACpC;wBACH,CAAC,CAAC,IAAI;iBACT,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
// tools/clarify-requirements/multiple-choice.ts — SPEC-337
|
|
2
|
+
// Structured multiple-choice options for clarify_requirements interview mode.
|
|
3
|
+
// Provides: per-question options[], stack detection, suggestedDescription builder.
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
const OPTIONS_CATALOG = {
|
|
7
|
+
stack_frontend: [
|
|
8
|
+
'Next.js',
|
|
9
|
+
'Remix',
|
|
10
|
+
'Nuxt',
|
|
11
|
+
'SvelteKit',
|
|
12
|
+
'Astro',
|
|
13
|
+
'Vite + React',
|
|
14
|
+
'Angular',
|
|
15
|
+
'Other: ___',
|
|
16
|
+
],
|
|
17
|
+
stack_backend: [
|
|
18
|
+
'Express',
|
|
19
|
+
'Fastify',
|
|
20
|
+
'NestJS',
|
|
21
|
+
'Hono',
|
|
22
|
+
'FastAPI',
|
|
23
|
+
'Django',
|
|
24
|
+
'Spring Boot',
|
|
25
|
+
'Other: ___',
|
|
26
|
+
],
|
|
27
|
+
stack_database: [
|
|
28
|
+
'PostgreSQL',
|
|
29
|
+
'MySQL',
|
|
30
|
+
'SQLite',
|
|
31
|
+
'MongoDB',
|
|
32
|
+
'Redis',
|
|
33
|
+
'Supabase',
|
|
34
|
+
'PlanetScale',
|
|
35
|
+
'Other: ___',
|
|
36
|
+
],
|
|
37
|
+
stack_language: ['TypeScript', 'JavaScript', 'Python', 'Go', 'Java', 'Rust', 'Other: ___'],
|
|
38
|
+
auth_method: [
|
|
39
|
+
'Email + password',
|
|
40
|
+
'Google OAuth',
|
|
41
|
+
'GitHub OAuth',
|
|
42
|
+
'Magic link',
|
|
43
|
+
'JWT (custom)',
|
|
44
|
+
'Session-based',
|
|
45
|
+
'API key',
|
|
46
|
+
'Other: ___',
|
|
47
|
+
],
|
|
48
|
+
scope_type: ['New feature', 'Improvement to existing', 'Bug fix', 'Refactor', 'Other: ___'],
|
|
49
|
+
user_type: ['End user', 'Admin', 'Developer / internal', 'All users', 'Other: ___'],
|
|
50
|
+
mvp_scope: [
|
|
51
|
+
'Core happy path only',
|
|
52
|
+
'Happy path + error handling',
|
|
53
|
+
'Full feature with edge cases',
|
|
54
|
+
'MVP first, iterate later',
|
|
55
|
+
'Other: ___',
|
|
56
|
+
],
|
|
57
|
+
performance_target: [
|
|
58
|
+
'< 100ms (real-time)',
|
|
59
|
+
'< 500ms (interactive)',
|
|
60
|
+
'< 2s (acceptable)',
|
|
61
|
+
'No strict SLA',
|
|
62
|
+
'Other: ___',
|
|
63
|
+
],
|
|
64
|
+
ui_mockup: [
|
|
65
|
+
'Yes, Figma mockup available',
|
|
66
|
+
'Rough sketch only',
|
|
67
|
+
'No mockup — describe in text',
|
|
68
|
+
'Other: ___',
|
|
69
|
+
],
|
|
70
|
+
login_method: [
|
|
71
|
+
'Email/password',
|
|
72
|
+
'Google',
|
|
73
|
+
'Apple',
|
|
74
|
+
'Magic link',
|
|
75
|
+
'GitHub',
|
|
76
|
+
'SSO / SAML',
|
|
77
|
+
'Other: ___',
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Detect the project stack by reading package.json and/or requirements.txt
|
|
82
|
+
* from the given project path.
|
|
83
|
+
*/
|
|
84
|
+
export async function detectStack(projectPath) {
|
|
85
|
+
const result = {
|
|
86
|
+
framework: null,
|
|
87
|
+
language: null,
|
|
88
|
+
database: null,
|
|
89
|
+
detectedLibs: [],
|
|
90
|
+
};
|
|
91
|
+
try {
|
|
92
|
+
const pkgRaw = await readFile(join(projectPath, 'package.json'), 'utf-8');
|
|
93
|
+
const pkg = JSON.parse(pkgRaw);
|
|
94
|
+
const allDeps = {
|
|
95
|
+
...(pkg.dependencies ?? {}),
|
|
96
|
+
...(pkg.devDependencies ?? {}),
|
|
97
|
+
};
|
|
98
|
+
const libs = Object.keys(allDeps);
|
|
99
|
+
result.detectedLibs = libs;
|
|
100
|
+
// Framework detection
|
|
101
|
+
if (libs.includes('next')) {
|
|
102
|
+
result.framework = 'Next.js';
|
|
103
|
+
}
|
|
104
|
+
else if (libs.includes('@remix-run/react') || libs.includes('@remix-run/node')) {
|
|
105
|
+
result.framework = 'Remix';
|
|
106
|
+
}
|
|
107
|
+
else if (libs.includes('nuxt')) {
|
|
108
|
+
result.framework = 'Nuxt';
|
|
109
|
+
}
|
|
110
|
+
else if (libs.includes('@sveltejs/kit')) {
|
|
111
|
+
result.framework = 'SvelteKit';
|
|
112
|
+
}
|
|
113
|
+
else if (libs.includes('astro')) {
|
|
114
|
+
result.framework = 'Astro';
|
|
115
|
+
}
|
|
116
|
+
else if (libs.includes('fastify')) {
|
|
117
|
+
result.framework = 'Fastify';
|
|
118
|
+
}
|
|
119
|
+
else if (libs.includes('@nestjs/core')) {
|
|
120
|
+
result.framework = 'NestJS';
|
|
121
|
+
}
|
|
122
|
+
else if (libs.includes('express')) {
|
|
123
|
+
result.framework = 'Express';
|
|
124
|
+
}
|
|
125
|
+
else if (libs.includes('hono')) {
|
|
126
|
+
result.framework = 'Hono';
|
|
127
|
+
}
|
|
128
|
+
// Language (TypeScript presence)
|
|
129
|
+
if (libs.includes('typescript') || libs.includes('ts-node') || libs.includes('tsx')) {
|
|
130
|
+
result.language = 'TypeScript';
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
result.language = 'JavaScript';
|
|
134
|
+
}
|
|
135
|
+
// Database detection
|
|
136
|
+
if (libs.includes('pg') || libs.includes('postgres')) {
|
|
137
|
+
result.database = 'PostgreSQL';
|
|
138
|
+
}
|
|
139
|
+
else if (libs.includes('mysql2') || libs.includes('mysql')) {
|
|
140
|
+
result.database = 'MySQL';
|
|
141
|
+
}
|
|
142
|
+
else if (libs.includes('better-sqlite3') || libs.includes('sqlite3')) {
|
|
143
|
+
result.database = 'SQLite';
|
|
144
|
+
}
|
|
145
|
+
else if (libs.includes('mongoose') || libs.includes('mongodb')) {
|
|
146
|
+
result.database = 'MongoDB';
|
|
147
|
+
}
|
|
148
|
+
else if (libs.includes('@supabase/supabase-js')) {
|
|
149
|
+
result.database = 'Supabase';
|
|
150
|
+
}
|
|
151
|
+
else if (libs.includes('ioredis') || libs.includes('redis')) {
|
|
152
|
+
result.database = 'Redis';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// No package.json — try requirements.txt for Python
|
|
157
|
+
try {
|
|
158
|
+
const reqRaw = await readFile(join(projectPath, 'requirements.txt'), 'utf-8');
|
|
159
|
+
const lines = reqRaw
|
|
160
|
+
.split('\n')
|
|
161
|
+
.map((l) => (l.split('=')[0] ?? l).split('>')[0]?.split('<')[0]?.trim().toLowerCase() ?? '');
|
|
162
|
+
result.detectedLibs = lines.filter(Boolean);
|
|
163
|
+
if (lines.includes('django') || lines.includes('django-rest-framework')) {
|
|
164
|
+
result.framework = 'Django';
|
|
165
|
+
result.language = 'Python';
|
|
166
|
+
}
|
|
167
|
+
else if (lines.includes('fastapi')) {
|
|
168
|
+
result.framework = 'FastAPI';
|
|
169
|
+
result.language = 'Python';
|
|
170
|
+
}
|
|
171
|
+
else if (lines.includes('flask')) {
|
|
172
|
+
result.framework = 'Flask';
|
|
173
|
+
result.language = 'Python';
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
result.language = 'Python';
|
|
177
|
+
}
|
|
178
|
+
if (lines.includes('psycopg2') || lines.includes('psycopg2-binary')) {
|
|
179
|
+
result.database = 'PostgreSQL';
|
|
180
|
+
}
|
|
181
|
+
else if (lines.includes('pymysql') || lines.includes('mysql-connector-python')) {
|
|
182
|
+
result.database = 'MySQL';
|
|
183
|
+
}
|
|
184
|
+
else if (lines.includes('motor') || lines.includes('pymongo')) {
|
|
185
|
+
result.database = 'MongoDB';
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// No manifest files found — detection yields nulls
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Returns true if the question should be skipped because the stack already
|
|
196
|
+
* provides a definitive answer.
|
|
197
|
+
*/
|
|
198
|
+
export function shouldSkipQuestion(question, stack) {
|
|
199
|
+
const lower = question.question.toLowerCase();
|
|
200
|
+
if ((lower.includes('stack') || lower.includes('framework') || lower.includes('language')) &&
|
|
201
|
+
(stack.framework !== null || stack.language !== null)) {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
if (lower.includes('database') && stack.database !== null) {
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Resolves option list from a catalog key.
|
|
211
|
+
*/
|
|
212
|
+
function resolveOptions(key) {
|
|
213
|
+
return OPTIONS_CATALOG[key];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Attaches structured `options[]` to a question based on its content.
|
|
217
|
+
* Each question gets 3-8 concrete choices + 'Other: ___' fallback.
|
|
218
|
+
*/
|
|
219
|
+
export function attachOptions(question) {
|
|
220
|
+
const lower = question.question.toLowerCase();
|
|
221
|
+
let options;
|
|
222
|
+
if (lower.includes('login') || lower.includes('sign in') || lower.includes('sign up')) {
|
|
223
|
+
options = resolveOptions('login_method');
|
|
224
|
+
}
|
|
225
|
+
else if (lower.includes('auth')) {
|
|
226
|
+
options = resolveOptions('auth_method');
|
|
227
|
+
}
|
|
228
|
+
else if (lower.includes('frontend') || lower.includes('ui framework')) {
|
|
229
|
+
options = resolveOptions('stack_frontend');
|
|
230
|
+
}
|
|
231
|
+
else if (lower.includes('backend') || lower.includes('server framework')) {
|
|
232
|
+
options = resolveOptions('stack_backend');
|
|
233
|
+
}
|
|
234
|
+
else if (lower.includes('database') || lower.includes('db')) {
|
|
235
|
+
options = resolveOptions('stack_database');
|
|
236
|
+
}
|
|
237
|
+
else if (lower.includes('stack') || lower.includes('framework') || lower.includes('language')) {
|
|
238
|
+
options = resolveOptions('stack_language');
|
|
239
|
+
}
|
|
240
|
+
else if (lower.includes('new feature') ||
|
|
241
|
+
lower.includes('improvement') ||
|
|
242
|
+
lower.includes('feature or')) {
|
|
243
|
+
options = resolveOptions('scope_type');
|
|
244
|
+
}
|
|
245
|
+
else if (lower.includes('user') &&
|
|
246
|
+
(lower.includes('who') || lower.includes('primary') || lower.includes('persona'))) {
|
|
247
|
+
options = resolveOptions('user_type');
|
|
248
|
+
}
|
|
249
|
+
else if (lower.includes('must-have') ||
|
|
250
|
+
lower.includes('minimum viable') ||
|
|
251
|
+
lower.includes('mvp') ||
|
|
252
|
+
lower.includes('first version')) {
|
|
253
|
+
options = resolveOptions('mvp_scope');
|
|
254
|
+
}
|
|
255
|
+
else if (lower.includes('performance') ||
|
|
256
|
+
lower.includes('response time') ||
|
|
257
|
+
lower.includes('latency')) {
|
|
258
|
+
options = resolveOptions('performance_target');
|
|
259
|
+
}
|
|
260
|
+
else if (lower.includes('mockup') ||
|
|
261
|
+
lower.includes('design') ||
|
|
262
|
+
lower.includes('reference design')) {
|
|
263
|
+
options = resolveOptions('ui_mockup');
|
|
264
|
+
}
|
|
265
|
+
else if (lower.includes('scope') && lower.includes('done')) {
|
|
266
|
+
options = resolveOptions('mvp_scope');
|
|
267
|
+
}
|
|
268
|
+
if (options === undefined) {
|
|
269
|
+
return question;
|
|
270
|
+
}
|
|
271
|
+
return { ...question, options };
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Builds a `suggestedDescription` string from accumulated answers.
|
|
275
|
+
* The returned string is suitable for passing directly to create_spec.
|
|
276
|
+
*/
|
|
277
|
+
export function buildSuggestedDescription(topic, answers, questions) {
|
|
278
|
+
const parts = [`Feature: ${topic}.`];
|
|
279
|
+
for (const q of questions) {
|
|
280
|
+
const answer = answers[q.id];
|
|
281
|
+
if (answer === undefined || answer.trim() === '') {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const trimmedAnswer = answer.trim();
|
|
285
|
+
const shortQuestion = q.question
|
|
286
|
+
.replace(/^(What|Who|Is|Are|Does|Do|How|Which)\s+/i, '')
|
|
287
|
+
.replace(/\?$/, '');
|
|
288
|
+
parts.push(`${shortQuestion}: ${trimmedAnswer}.`);
|
|
289
|
+
}
|
|
290
|
+
return parts.join(' ');
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=multiple-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiple-choice.js","sourceRoot":"","sources":["../../../src/tools/clarify-requirements/multiple-choice.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clarify-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/clarify-requirements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,wBAAwB,EAGxB,UAAU,EACX,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"clarify-requirements.d.ts","sourceRoot":"","sources":["../../src/tools/clarify-requirements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,wBAAwB,EAGxB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAwG3B,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,UAAU,CAAC,CA4HrB"}
|