@planu/cli 1.0.7 → 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/engine/pdf/browser-finder.d.ts.map +1 -1
- package/dist/engine/pdf/browser-finder.js +61 -2
- package/dist/engine/pdf/browser-finder.js.map +1 -1
- package/dist/engine/pdf/html-to-pdf.d.ts.map +1 -1
- package/dist/engine/pdf/html-to-pdf.js +33 -8
- package/dist/engine/pdf/html-to-pdf.js.map +1 -1
- 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/export-pdf.d.ts.map +1 -1
- package/dist/tools/export-pdf.js +2 -8
- package/dist/tools/export-pdf.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":"browser-finder.d.ts","sourceRoot":"","sources":["../../../src/engine/pdf/browser-finder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-finder.d.ts","sourceRoot":"","sources":["../../../src/engine/pdf/browser-finder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,WAAW,EAAE,CAAC;AA0J5B,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAsCxD;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAEpD"}
|
|
@@ -15,6 +15,14 @@ const MACOS_PATHS = [
|
|
|
15
15
|
path: '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',
|
|
16
16
|
name: 'edge',
|
|
17
17
|
},
|
|
18
|
+
{
|
|
19
|
+
path: '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser',
|
|
20
|
+
name: 'brave',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
path: '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',
|
|
24
|
+
name: 'chrome',
|
|
25
|
+
},
|
|
18
26
|
];
|
|
19
27
|
const WINDOWS_PATHS = [
|
|
20
28
|
{
|
|
@@ -29,6 +37,10 @@ const WINDOWS_PATHS = [
|
|
|
29
37
|
path: 'C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe',
|
|
30
38
|
name: 'edge',
|
|
31
39
|
},
|
|
40
|
+
{
|
|
41
|
+
path: 'C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe',
|
|
42
|
+
name: 'brave',
|
|
43
|
+
},
|
|
32
44
|
];
|
|
33
45
|
const LINUX_BINARIES = [
|
|
34
46
|
{ bin: 'google-chrome', name: 'chrome' },
|
|
@@ -36,8 +48,48 @@ const LINUX_BINARIES = [
|
|
|
36
48
|
{ bin: 'chromium-browser', name: 'chromium' },
|
|
37
49
|
{ bin: 'chromium', name: 'chromium' },
|
|
38
50
|
{ bin: 'microsoft-edge', name: 'edge' },
|
|
51
|
+
{ bin: 'brave-browser', name: 'brave' },
|
|
52
|
+
{ bin: 'brave', name: 'brave' },
|
|
53
|
+
];
|
|
54
|
+
// Hardcoded Linux paths for synchronous detection (no `which` available sync)
|
|
55
|
+
const LINUX_PATHS = [
|
|
56
|
+
{ path: '/usr/bin/google-chrome', name: 'chrome' },
|
|
57
|
+
{ path: '/usr/bin/google-chrome-stable', name: 'chrome' },
|
|
58
|
+
{ path: '/usr/bin/chromium-browser', name: 'chromium' },
|
|
59
|
+
{ path: '/usr/bin/chromium', name: 'chromium' },
|
|
60
|
+
{ path: '/snap/bin/chromium', name: 'chromium' },
|
|
61
|
+
{ path: '/usr/bin/microsoft-edge', name: 'edge' },
|
|
62
|
+
{ path: '/usr/bin/brave-browser', name: 'brave' },
|
|
39
63
|
];
|
|
40
|
-
|
|
64
|
+
function buildBrowserNotFoundMessage() {
|
|
65
|
+
const platform = process.platform;
|
|
66
|
+
const installHints = platform === 'darwin'
|
|
67
|
+
? [
|
|
68
|
+
' brew install --cask google-chrome',
|
|
69
|
+
' # or: brew install --cask chromium',
|
|
70
|
+
' # or: brew install --cask microsoft-edge',
|
|
71
|
+
]
|
|
72
|
+
: platform === 'linux'
|
|
73
|
+
? [
|
|
74
|
+
' # Debian/Ubuntu: sudo apt-get install -y google-chrome-stable',
|
|
75
|
+
' # Fedora/RHEL: sudo dnf install -y chromium',
|
|
76
|
+
' # Snap: sudo snap install chromium',
|
|
77
|
+
]
|
|
78
|
+
: [' winget install Google.Chrome', ' # or: winget install Microsoft.Edge'];
|
|
79
|
+
return [
|
|
80
|
+
'No Chromium-based browser found for PDF generation.',
|
|
81
|
+
'',
|
|
82
|
+
'Planu needs Chrome, Chromium, Edge, or Brave to convert HTML to PDF.',
|
|
83
|
+
'',
|
|
84
|
+
'How to fix:',
|
|
85
|
+
'',
|
|
86
|
+
' Option 1 — Install a supported browser:',
|
|
87
|
+
...installHints,
|
|
88
|
+
'',
|
|
89
|
+
' Option 2 — Set PLANU_CHROME_PATH to your browser executable:',
|
|
90
|
+
' export PLANU_CHROME_PATH="/path/to/chrome"',
|
|
91
|
+
].join('\n');
|
|
92
|
+
}
|
|
41
93
|
async function getBrowserVersion(browserPath) {
|
|
42
94
|
try {
|
|
43
95
|
const { stdout } = await execFileAsync(browserPath, ['--version'], { timeout: 5000 });
|
|
@@ -77,6 +129,13 @@ function findBrowserSyncFromEnvOrPaths() {
|
|
|
77
129
|
}
|
|
78
130
|
}
|
|
79
131
|
}
|
|
132
|
+
if (platform === 'linux') {
|
|
133
|
+
for (const candidate of LINUX_PATHS) {
|
|
134
|
+
if (existsSync(candidate.path)) {
|
|
135
|
+
return { path: candidate.path, name: candidate.name };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
80
139
|
return null;
|
|
81
140
|
}
|
|
82
141
|
export async function findBrowser() {
|
|
@@ -111,7 +170,7 @@ export async function findBrowser() {
|
|
|
111
170
|
}
|
|
112
171
|
}
|
|
113
172
|
}
|
|
114
|
-
throw new Error(
|
|
173
|
+
throw new Error(buildBrowserNotFoundMessage());
|
|
115
174
|
}
|
|
116
175
|
export function findBrowserSync() {
|
|
117
176
|
return findBrowserSyncFromEnvOrPaths();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-finder.js","sourceRoot":"","sources":["../../../src/engine/pdf/browser-finder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAKjC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,WAAW,GAAqC;IACpD;QACE,IAAI,EAAE,8DAA8D;QACpE,IAAI,EAAE,QAAQ;KACf;IACD;QACE,IAAI,EAAE,oDAAoD;QAC1D,IAAI,EAAE,UAAU;KACjB;IACD;QACE,IAAI,EAAE,gEAAgE;QACtE,IAAI,EAAE,MAAM;KACb;CACF,CAAC;AAEF,MAAM,aAAa,GAAqC;IACtD;QACE,IAAI,EAAE,4DAA4D;QAClE,IAAI,EAAE,QAAQ;KACf;IACD;QACE,IAAI,EAAE,kEAAkE;QACxE,IAAI,EAAE,QAAQ;KACf;IACD;QACE,IAAI,EAAE,6DAA6D;QACnE,IAAI,EAAE,MAAM;KACb;CACF,CAAC;AAEF,MAAM,cAAc,GAAoC;IACtD,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE;IACxC,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC/C,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE;IAC7C,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE;IACrC,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"browser-finder.js","sourceRoot":"","sources":["../../../src/engine/pdf/browser-finder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-to-pdf.d.ts","sourceRoot":"","sources":["../../../src/engine/pdf/html-to-pdf.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoFhE,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAC5B,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"html-to-pdf.d.ts","sourceRoot":"","sources":["../../../src/engine/pdf/html-to-pdf.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoFhE,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAC5B,OAAO,CAAC,SAAS,CAAC,CA8EpB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { execFile } from 'child_process';
|
|
2
2
|
import { promisify } from 'util';
|
|
3
3
|
import { resolve, dirname, join } from 'path';
|
|
4
|
-
import { stat, writeFile, readFile, unlink } from 'fs/promises';
|
|
4
|
+
import { stat, writeFile, readFile, unlink, mkdir } from 'fs/promises';
|
|
5
5
|
import { findBrowser } from './browser-finder.js';
|
|
6
6
|
import { DEFAULT_PDF_OPTIONS, formatFileSize, resolveOutputPath } from './pdf-options.js';
|
|
7
7
|
const execFileAsync = promisify(execFile);
|
|
@@ -82,15 +82,29 @@ function buildChromeArgs(tempHtmlPath, outputPath) {
|
|
|
82
82
|
export async function htmlToPdf(htmlPath, options) {
|
|
83
83
|
const opts = { ...DEFAULT_PDF_OPTIONS, ...options };
|
|
84
84
|
const absoluteHtmlPath = resolve(htmlPath);
|
|
85
|
+
const browser = await findBrowser();
|
|
86
|
+
const outputPath = resolveOutputPath(absoluteHtmlPath, opts.outputPath);
|
|
87
|
+
// Ensure output directory exists before launching Chrome
|
|
88
|
+
const outputDir = dirname(outputPath);
|
|
85
89
|
try {
|
|
86
|
-
await
|
|
90
|
+
await mkdir(outputDir, { recursive: true });
|
|
87
91
|
}
|
|
88
|
-
catch {
|
|
89
|
-
|
|
92
|
+
catch (err) {
|
|
93
|
+
const e = err;
|
|
94
|
+
throw new Error(`Cannot create output directory: ${outputDir} — ${e.message}`, { cause: err });
|
|
95
|
+
}
|
|
96
|
+
// Read HTML — single operation replacing stat+readFile (eliminates TOCTOU race)
|
|
97
|
+
let htmlContent;
|
|
98
|
+
try {
|
|
99
|
+
htmlContent = await readFile(absoluteHtmlPath, 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
const e = err;
|
|
103
|
+
if (e.code === 'ENOENT') {
|
|
104
|
+
throw new Error(`HTML file not found: ${absoluteHtmlPath}`, { cause: err });
|
|
105
|
+
}
|
|
106
|
+
throw new Error(`Cannot read HTML file: ${absoluteHtmlPath} — ${e.message}`, { cause: err });
|
|
90
107
|
}
|
|
91
|
-
const browser = await findBrowser();
|
|
92
|
-
const outputPath = resolveOutputPath(absoluteHtmlPath, opts.outputPath);
|
|
93
|
-
const htmlContent = await readFile(absoluteHtmlPath, 'utf-8');
|
|
94
108
|
const enhancedHtml = injectCssIntoHtml(htmlContent, buildPrintEnhancementCSS(opts));
|
|
95
109
|
const tempHtmlPath = join(dirname(absoluteHtmlPath), `.print-temp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.html`);
|
|
96
110
|
await writeFile(tempHtmlPath, enhancedHtml, 'utf-8');
|
|
@@ -113,7 +127,18 @@ export async function htmlToPdf(htmlPath, options) {
|
|
|
113
127
|
console.error('[Planu] Failed to clean up temp HTML file:', err);
|
|
114
128
|
});
|
|
115
129
|
}
|
|
116
|
-
|
|
130
|
+
let pdfStat;
|
|
131
|
+
try {
|
|
132
|
+
pdfStat = await stat(outputPath);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
const e = err;
|
|
136
|
+
if (e.code === 'ENOENT') {
|
|
137
|
+
throw new Error(`PDF was not created at: ${outputPath}. ` +
|
|
138
|
+
`Verify the output directory exists and the browser has write permissions.`, { cause: err });
|
|
139
|
+
}
|
|
140
|
+
throw new Error(`Cannot access generated PDF: ${outputPath} — ${e.message}`, { cause: err });
|
|
141
|
+
}
|
|
117
142
|
const fileSize = pdfStat.size;
|
|
118
143
|
const browserLabel = browser.version ? `${browser.name} ${browser.version}` : browser.name;
|
|
119
144
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-to-pdf.js","sourceRoot":"","sources":["../../../src/engine/pdf/html-to-pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"html-to-pdf.js","sourceRoot":"","sources":["../../../src/engine/pdf/html-to-pdf.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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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"}
|