@planu/cli 0.54.2 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/license-plans.json +1 -0
- package/dist/engine/doc-generator/executive-summary/executive-summary-generator.d.ts +7 -1
- package/dist/engine/doc-generator/executive-summary/executive-summary-generator.d.ts.map +1 -1
- package/dist/engine/doc-generator/executive-summary/executive-summary-generator.js +16 -3
- package/dist/engine/doc-generator/executive-summary/executive-summary-generator.js.map +1 -1
- package/dist/engine/doc-generator/executive-summary/html-template.d.ts +5 -2
- package/dist/engine/doc-generator/executive-summary/html-template.d.ts.map +1 -1
- package/dist/engine/doc-generator/executive-summary/html-template.js +7 -3
- package/dist/engine/doc-generator/executive-summary/html-template.js.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/executive-report.d.ts +3 -1
- package/dist/engine/doc-generator/per-spec-report/executive-report.d.ts.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/executive-report.js +22 -2
- package/dist/engine/doc-generator/per-spec-report/executive-report.js.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/html-wrapper.d.ts +5 -3
- package/dist/engine/doc-generator/per-spec-report/html-wrapper.d.ts.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/html-wrapper.js +27 -6
- package/dist/engine/doc-generator/per-spec-report/html-wrapper.js.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/spec-data-extractor.d.ts +1 -0
- package/dist/engine/doc-generator/per-spec-report/spec-data-extractor.d.ts.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/spec-data-extractor.js +29 -0
- package/dist/engine/doc-generator/per-spec-report/spec-data-extractor.js.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/spec-section-builders.d.ts +8 -1
- package/dist/engine/doc-generator/per-spec-report/spec-section-builders.d.ts.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/spec-section-builders.js +188 -0
- package/dist/engine/doc-generator/per-spec-report/spec-section-builders.js.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/technical-report.d.ts +3 -1
- package/dist/engine/doc-generator/per-spec-report/technical-report.d.ts.map +1 -1
- package/dist/engine/doc-generator/per-spec-report/technical-report.js +24 -7
- package/dist/engine/doc-generator/per-spec-report/technical-report.js.map +1 -1
- package/dist/engine/doc-generator/portal/analytics-page.d.ts +8 -0
- package/dist/engine/doc-generator/portal/analytics-page.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/analytics-page.js +265 -0
- package/dist/engine/doc-generator/portal/analytics-page.js.map +1 -0
- package/dist/engine/doc-generator/portal/architecture-page.d.ts +6 -0
- package/dist/engine/doc-generator/portal/architecture-page.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/architecture-page.js +250 -0
- package/dist/engine/doc-generator/portal/architecture-page.js.map +1 -0
- package/dist/engine/doc-generator/portal/changelog-page.d.ts +6 -0
- package/dist/engine/doc-generator/portal/changelog-page.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/changelog-page.js +204 -0
- package/dist/engine/doc-generator/portal/changelog-page.js.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/accuracy-aggregator.d.ts +11 -0
- package/dist/engine/doc-generator/portal/data-aggregators/accuracy-aggregator.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/accuracy-aggregator.js +24 -0
- package/dist/engine/doc-generator/portal/data-aggregators/accuracy-aggregator.js.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/bottleneck-detector.d.ts +9 -0
- package/dist/engine/doc-generator/portal/data-aggregators/bottleneck-detector.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/bottleneck-detector.js +31 -0
- package/dist/engine/doc-generator/portal/data-aggregators/bottleneck-detector.js.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/burndown-aggregator.d.ts +10 -0
- package/dist/engine/doc-generator/portal/data-aggregators/burndown-aggregator.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/burndown-aggregator.js +77 -0
- package/dist/engine/doc-generator/portal/data-aggregators/burndown-aggregator.js.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/velocity-aggregator.d.ts +9 -0
- package/dist/engine/doc-generator/portal/data-aggregators/velocity-aggregator.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/data-aggregators/velocity-aggregator.js +31 -0
- package/dist/engine/doc-generator/portal/data-aggregators/velocity-aggregator.js.map +1 -0
- package/dist/engine/doc-generator/portal/decision-page.d.ts +6 -0
- package/dist/engine/doc-generator/portal/decision-page.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/decision-page.js +169 -0
- package/dist/engine/doc-generator/portal/decision-page.js.map +1 -0
- package/dist/engine/doc-generator/portal/decision-timeline-builder.d.ts +8 -0
- package/dist/engine/doc-generator/portal/decision-timeline-builder.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/decision-timeline-builder.js +131 -0
- package/dist/engine/doc-generator/portal/decision-timeline-builder.js.map +1 -0
- package/dist/engine/doc-generator/portal/index.d.ts +19 -0
- package/dist/engine/doc-generator/portal/index.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/index.js +21 -0
- package/dist/engine/doc-generator/portal/index.js.map +1 -0
- package/dist/engine/doc-generator/portal/kanban-view-builder.d.ts +8 -0
- package/dist/engine/doc-generator/portal/kanban-view-builder.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/kanban-view-builder.js +140 -0
- package/dist/engine/doc-generator/portal/kanban-view-builder.js.map +1 -0
- package/dist/engine/doc-generator/portal/portal-breadcrumbs.d.ts +27 -0
- package/dist/engine/doc-generator/portal/portal-breadcrumbs.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/portal-breadcrumbs.js +139 -0
- package/dist/engine/doc-generator/portal/portal-breadcrumbs.js.map +1 -0
- package/dist/engine/doc-generator/portal/portal-landing-cards.d.ts +8 -0
- package/dist/engine/doc-generator/portal/portal-landing-cards.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/portal-landing-cards.js +177 -0
- package/dist/engine/doc-generator/portal/portal-landing-cards.js.map +1 -0
- package/dist/engine/doc-generator/portal/portal-navbar.d.ts +15 -0
- package/dist/engine/doc-generator/portal/portal-navbar.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/portal-navbar.js +143 -0
- package/dist/engine/doc-generator/portal/portal-navbar.js.map +1 -0
- package/dist/engine/doc-generator/portal/portal-page-detector.d.ts +22 -0
- package/dist/engine/doc-generator/portal/portal-page-detector.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/portal-page-detector.js +58 -0
- package/dist/engine/doc-generator/portal/portal-page-detector.js.map +1 -0
- package/dist/engine/doc-generator/portal/portal-theme.d.ts +7 -0
- package/dist/engine/doc-generator/portal/portal-theme.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/portal-theme.js +53 -0
- package/dist/engine/doc-generator/portal/portal-theme.js.map +1 -0
- package/dist/engine/doc-generator/portal/risk-gauge-svg.d.ts +5 -0
- package/dist/engine/doc-generator/portal/risk-gauge-svg.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/risk-gauge-svg.js +80 -0
- package/dist/engine/doc-generator/portal/risk-gauge-svg.js.map +1 -0
- package/dist/engine/doc-generator/portal/risk-matrix-svg.d.ts +11 -0
- package/dist/engine/doc-generator/portal/risk-matrix-svg.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/risk-matrix-svg.js +181 -0
- package/dist/engine/doc-generator/portal/risk-matrix-svg.js.map +1 -0
- package/dist/engine/doc-generator/portal/risk-page.d.ts +7 -0
- package/dist/engine/doc-generator/portal/risk-page.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/risk-page.js +219 -0
- package/dist/engine/doc-generator/portal/risk-page.js.map +1 -0
- package/dist/engine/doc-generator/portal/roadmap-page.d.ts +7 -0
- package/dist/engine/doc-generator/portal/roadmap-page.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/roadmap-page.js +204 -0
- package/dist/engine/doc-generator/portal/roadmap-page.js.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/bar-chart.d.ts +4 -0
- package/dist/engine/doc-generator/portal/svg-charts/bar-chart.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/bar-chart.js +50 -0
- package/dist/engine/doc-generator/portal/svg-charts/bar-chart.js.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/chart-utils.d.ts +16 -0
- package/dist/engine/doc-generator/portal/svg-charts/chart-utils.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/chart-utils.js +45 -0
- package/dist/engine/doc-generator/portal/svg-charts/chart-utils.js.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/line-chart.d.ts +16 -0
- package/dist/engine/doc-generator/portal/svg-charts/line-chart.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/line-chart.js +159 -0
- package/dist/engine/doc-generator/portal/svg-charts/line-chart.js.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/pie-chart.d.ts +7 -0
- package/dist/engine/doc-generator/portal/svg-charts/pie-chart.d.ts.map +1 -0
- package/dist/engine/doc-generator/portal/svg-charts/pie-chart.js +52 -0
- package/dist/engine/doc-generator/portal/svg-charts/pie-chart.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-gantt-builder.d.ts +8 -0
- package/dist/engine/doc-generator/proposal/proposal-gantt-builder.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-gantt-builder.js +126 -0
- package/dist/engine/doc-generator/proposal/proposal-gantt-builder.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-generator.d.ts +10 -0
- package/dist/engine/doc-generator/proposal/proposal-generator.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-generator.js +93 -0
- package/dist/engine/doc-generator/proposal/proposal-generator.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-html-wrapper.d.ts +7 -0
- package/dist/engine/doc-generator/proposal/proposal-html-wrapper.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-html-wrapper.js +31 -0
- package/dist/engine/doc-generator/proposal/proposal-html-wrapper.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-i18n.d.ts +12 -0
- package/dist/engine/doc-generator/proposal/proposal-i18n.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-i18n.js +230 -0
- package/dist/engine/doc-generator/proposal/proposal-i18n.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-kpi-builder.d.ts +8 -0
- package/dist/engine/doc-generator/proposal/proposal-kpi-builder.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-kpi-builder.js +32 -0
- package/dist/engine/doc-generator/proposal/proposal-kpi-builder.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders-advanced.d.ts +14 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders-advanced.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders-advanced.js +248 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders-advanced.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders.d.ts +13 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders.js +423 -0
- package/dist/engine/doc-generator/proposal/proposal-section-builders.js.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-themes.d.ts +4 -0
- package/dist/engine/doc-generator/proposal/proposal-themes.d.ts.map +1 -0
- package/dist/engine/doc-generator/proposal/proposal-themes.js +194 -0
- package/dist/engine/doc-generator/proposal/proposal-themes.js.map +1 -0
- package/dist/engine/spec-summary-html.d.ts.map +1 -1
- package/dist/engine/spec-summary-html.js +17 -5
- package/dist/engine/spec-summary-html.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/generate-proposal.d.ts +3 -0
- package/dist/tools/generate-proposal.d.ts.map +1 -0
- package/dist/tools/generate-proposal.js +166 -0
- package/dist/tools/generate-proposal.js.map +1 -0
- package/dist/types/docs.d.ts +75 -0
- package/dist/types/docs.d.ts.map +1 -1
- package/dist/types/portal.d.ts +128 -0
- package/dist/types/portal.d.ts.map +1 -0
- package/dist/types/portal.js +3 -0
- package/dist/types/portal.js.map +1 -0
- package/dist/types/proposal.d.ts +57 -0
- package/dist/types/proposal.d.ts.map +1 -0
- package/dist/types/proposal.js +2 -0
- package/dist/types/proposal.js.map +1 -0
- package/package.json +1 -1
- package/src/config/license-plans.json +1 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const PHASE_COLORS = [
|
|
2
|
+
'#7c3aed',
|
|
3
|
+
'#0891b2',
|
|
4
|
+
'#059669',
|
|
5
|
+
'#d97706',
|
|
6
|
+
'#e94560',
|
|
7
|
+
'#6366f1',
|
|
8
|
+
'#0f766e',
|
|
9
|
+
'#b45309',
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Assign specs to weeks using a simple sequential schedule with parallelism.
|
|
13
|
+
* Each spec duration = ceil(totalHours / 40) weeks (1 week = 40 dev hours).
|
|
14
|
+
*/
|
|
15
|
+
function assignWeeks(specs, phases) {
|
|
16
|
+
if (specs.length === 0) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
const phaseColorMap = new Map();
|
|
20
|
+
if (phases && phases.length > 0) {
|
|
21
|
+
phases.forEach((p, i) => {
|
|
22
|
+
phaseColorMap.set(p.name, PHASE_COLORS[i % PHASE_COLORS.length] ?? '#7c3aed');
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
let currentWeek = 1;
|
|
26
|
+
const rows = [];
|
|
27
|
+
const specWeekMap = new Map();
|
|
28
|
+
// Build dependency map
|
|
29
|
+
const specMap = new Map(specs.map((s) => [s.id, s]));
|
|
30
|
+
for (const spec of specs) {
|
|
31
|
+
const totalHours = spec.estimation.devHours + spec.estimation.reviewHours;
|
|
32
|
+
const durationWeeks = Math.max(1, Math.ceil(totalHours / 40));
|
|
33
|
+
// Determine start: after all dependencies
|
|
34
|
+
let startWeek = currentWeek;
|
|
35
|
+
for (const dep of spec.dependencies) {
|
|
36
|
+
const depEnd = specWeekMap.get(dep)?.end ?? 0;
|
|
37
|
+
startWeek = Math.max(startWeek, depEnd + 1);
|
|
38
|
+
}
|
|
39
|
+
if (!spec.dependencies.length) {
|
|
40
|
+
startWeek = currentWeek;
|
|
41
|
+
}
|
|
42
|
+
specWeekMap.set(spec.id, { start: startWeek, end: startWeek + durationWeeks - 1 });
|
|
43
|
+
// Find phase name
|
|
44
|
+
let phaseName = 'Default';
|
|
45
|
+
let color = PHASE_COLORS[0] ?? '#7c3aed';
|
|
46
|
+
if (phases && phases.length > 0) {
|
|
47
|
+
const foundPhase = phases.find((p) => p.specIds.includes(spec.id));
|
|
48
|
+
if (foundPhase) {
|
|
49
|
+
phaseName = foundPhase.name;
|
|
50
|
+
const phaseIdx = phases.indexOf(foundPhase);
|
|
51
|
+
color = foundPhase.color ?? PHASE_COLORS[phaseIdx % PHASE_COLORS.length] ?? '#7c3aed';
|
|
52
|
+
phaseColorMap.set(phaseName, color);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Color by index
|
|
57
|
+
const idx = rows.length;
|
|
58
|
+
color = PHASE_COLORS[idx % PHASE_COLORS.length] ?? '#7c3aed';
|
|
59
|
+
}
|
|
60
|
+
rows.push({
|
|
61
|
+
id: spec.id,
|
|
62
|
+
label: `${spec.id}: ${spec.title.length > 30 ? spec.title.slice(0, 30) + '…' : spec.title}`,
|
|
63
|
+
color,
|
|
64
|
+
startWeek,
|
|
65
|
+
durationWeeks,
|
|
66
|
+
phase: phaseName,
|
|
67
|
+
});
|
|
68
|
+
// Advance current week only when no dependencies (sequential default)
|
|
69
|
+
if (!spec.dependencies.length) {
|
|
70
|
+
currentWeek = startWeek + durationWeeks;
|
|
71
|
+
}
|
|
72
|
+
// Cross-dep: track if we need to reset
|
|
73
|
+
const depSpec = specMap.get(spec.id);
|
|
74
|
+
if (!depSpec?.dependencies.length) {
|
|
75
|
+
currentWeek = startWeek + durationWeeks;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return rows;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build a CSS Grid Gantt chart from specs and optional phases.
|
|
82
|
+
* Returns an HTML string with the full Gantt visualization.
|
|
83
|
+
*/
|
|
84
|
+
export function buildGanttChart(specs, phases, _startDate) {
|
|
85
|
+
if (specs.length === 0) {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
const rows = assignWeeks(specs, phases);
|
|
89
|
+
if (rows.length === 0) {
|
|
90
|
+
return '';
|
|
91
|
+
}
|
|
92
|
+
const totalWeeks = Math.max(...rows.map((r) => r.startWeek + r.durationWeeks - 1), 4);
|
|
93
|
+
// Week headers
|
|
94
|
+
const weekHeaders = Array.from({ length: totalWeeks }, (_, i) => `<div class="gantt-week">W${String(i + 1)}</div>`).join('');
|
|
95
|
+
// Gantt rows
|
|
96
|
+
const ganttRows = rows.map((row) => {
|
|
97
|
+
const startPct = ((row.startWeek - 1) / totalWeeks) * 100;
|
|
98
|
+
const widthPct = (row.durationWeeks / totalWeeks) * 100;
|
|
99
|
+
return `<div class="gantt-row">
|
|
100
|
+
<div class="gantt-label" title="${escapeHtml(row.label)}">${escapeHtml(row.label)}</div>
|
|
101
|
+
<div class="gantt-track">
|
|
102
|
+
<div class="gantt-bar" style="left:${startPct.toFixed(1)}%;width:${widthPct.toFixed(1)}%;background:${escapeHtml(row.color)};">
|
|
103
|
+
${String(row.durationWeeks)}w
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>`;
|
|
107
|
+
});
|
|
108
|
+
return `<div class="gantt-container">
|
|
109
|
+
<div class="gantt-header">
|
|
110
|
+
<div class="gantt-header-label"></div>
|
|
111
|
+
<div class="gantt-header-weeks">${weekHeaders}</div>
|
|
112
|
+
</div>
|
|
113
|
+
<div class="gantt-grid">
|
|
114
|
+
${ganttRows.join('\n')}
|
|
115
|
+
</div>
|
|
116
|
+
</div>`;
|
|
117
|
+
}
|
|
118
|
+
// Internal helper
|
|
119
|
+
function escapeHtml(str) {
|
|
120
|
+
return str
|
|
121
|
+
.replace(/&/g, '&')
|
|
122
|
+
.replace(/</g, '<')
|
|
123
|
+
.replace(/>/g, '>')
|
|
124
|
+
.replace(/"/g, '"');
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=proposal-gantt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-gantt-builder.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-gantt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProposalData } from '../../../types/docs.js';
|
|
2
|
+
/** Canonical section IDs for includeSections / excludeSections filtering. */
|
|
3
|
+
export declare const SECTION_IDS: readonly ["hero", "executive-summary", "scope", "spec-breakdown", "timeline", "budget", "investment-summary", "architecture", "risk", "decisions", "impact-analysis", "gap-analysis", "team-resources", "pricing-methodology", "design-system", "quality-metrics", "living-spec", "assumptions", "alternatives", "post-launch", "module-mapping"];
|
|
4
|
+
/**
|
|
5
|
+
* Generate a self-contained HTML proposal document.
|
|
6
|
+
* All sections are conditional — empty string returned when data is insufficient.
|
|
7
|
+
* Sections can be filtered via ProposalConfig.includeSections / excludeSections.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateProposal(data: ProposalData): string;
|
|
10
|
+
//# sourceMappingURL=proposal-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-generator.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,wBAAwB,CAAC;AA4BtE,6EAA6E;AAC7E,eAAO,MAAM,WAAW,mVAsBd,CAAC;AAwDX;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAoB3D"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { buildHeroSection, buildExecutiveSummarySection, buildScopeSection, buildSpecBreakdownSection, buildTimelineSection, buildBudgetSection, buildInvestmentSummarySection, buildArchitectureSection, buildRiskSection, buildDecisionsSection, buildImpactAnalysisSection, buildGapAnalysisSection, buildTeamResourcesSection, buildPricingMethodologySection, buildDesignSystemSection, buildQualityMetricsSection, buildLivingSpecSection, buildAssumptionsSection, buildAlternativesSection, buildPostLaunchSection, buildModuleMappingSection, buildFooterSection, } from './proposal-section-builders.js';
|
|
2
|
+
import { wrapProposalHtml } from './proposal-html-wrapper.js';
|
|
3
|
+
/** Canonical section IDs for includeSections / excludeSections filtering. */
|
|
4
|
+
export const SECTION_IDS = [
|
|
5
|
+
'hero',
|
|
6
|
+
'executive-summary',
|
|
7
|
+
'scope',
|
|
8
|
+
'spec-breakdown',
|
|
9
|
+
'timeline',
|
|
10
|
+
'budget',
|
|
11
|
+
'investment-summary',
|
|
12
|
+
'architecture',
|
|
13
|
+
'risk',
|
|
14
|
+
'decisions',
|
|
15
|
+
'impact-analysis',
|
|
16
|
+
'gap-analysis',
|
|
17
|
+
'team-resources',
|
|
18
|
+
'pricing-methodology',
|
|
19
|
+
'design-system',
|
|
20
|
+
'quality-metrics',
|
|
21
|
+
'living-spec',
|
|
22
|
+
'assumptions',
|
|
23
|
+
'alternatives',
|
|
24
|
+
'post-launch',
|
|
25
|
+
'module-mapping',
|
|
26
|
+
];
|
|
27
|
+
/** Build a section filter based on include/exclude lists. */
|
|
28
|
+
function makeSectionFilter(include, exclude) {
|
|
29
|
+
if (include && include.length > 0) {
|
|
30
|
+
return (id) => include.includes(id);
|
|
31
|
+
}
|
|
32
|
+
if (exclude && exclude.length > 0) {
|
|
33
|
+
return (id) => !exclude.includes(id);
|
|
34
|
+
}
|
|
35
|
+
return () => true;
|
|
36
|
+
}
|
|
37
|
+
function buildCoreSections(data, isEnabled) {
|
|
38
|
+
return [
|
|
39
|
+
isEnabled('executive-summary') ? buildExecutiveSummarySection(data) : '',
|
|
40
|
+
isEnabled('scope') ? buildScopeSection(data) : '',
|
|
41
|
+
isEnabled('spec-breakdown') ? buildSpecBreakdownSection(data) : '',
|
|
42
|
+
isEnabled('timeline') ? buildTimelineSection(data) : '',
|
|
43
|
+
isEnabled('budget') ? buildBudgetSection(data) : '',
|
|
44
|
+
isEnabled('investment-summary') ? buildInvestmentSummarySection(data) : '',
|
|
45
|
+
isEnabled('architecture') ? buildArchitectureSection(data) : '',
|
|
46
|
+
isEnabled('risk') ? buildRiskSection(data) : '',
|
|
47
|
+
isEnabled('decisions') ? buildDecisionsSection(data) : '',
|
|
48
|
+
isEnabled('impact-analysis') ? buildImpactAnalysisSection(data) : '',
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
function buildAdvancedSections(data, isEnabled) {
|
|
52
|
+
return [
|
|
53
|
+
isEnabled('gap-analysis') ? buildGapAnalysisSection(data) : '',
|
|
54
|
+
isEnabled('team-resources') ? buildTeamResourcesSection(data) : '',
|
|
55
|
+
isEnabled('pricing-methodology') ? buildPricingMethodologySection(data) : '',
|
|
56
|
+
isEnabled('design-system') ? buildDesignSystemSection(data) : '',
|
|
57
|
+
isEnabled('quality-metrics') ? buildQualityMetricsSection(data) : '',
|
|
58
|
+
isEnabled('living-spec') ? buildLivingSpecSection(data) : '',
|
|
59
|
+
isEnabled('assumptions') ? buildAssumptionsSection(data) : '',
|
|
60
|
+
isEnabled('alternatives') ? buildAlternativesSection(data) : '',
|
|
61
|
+
isEnabled('post-launch') ? buildPostLaunchSection(data) : '',
|
|
62
|
+
isEnabled('module-mapping') ? buildModuleMappingSection(data) : '',
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
/** Build all content sections (everything except hero and footer). */
|
|
66
|
+
function buildContentSections(data, isEnabled) {
|
|
67
|
+
return [...buildCoreSections(data, isEnabled), ...buildAdvancedSections(data, isEnabled)]
|
|
68
|
+
.filter(Boolean)
|
|
69
|
+
.join('\n');
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate a self-contained HTML proposal document.
|
|
73
|
+
* All sections are conditional — empty string returned when data is insufficient.
|
|
74
|
+
* Sections can be filtered via ProposalConfig.includeSections / excludeSections.
|
|
75
|
+
*/
|
|
76
|
+
export function generateProposal(data) {
|
|
77
|
+
const { includeSections, excludeSections, theme, language } = data.config;
|
|
78
|
+
const isEnabled = makeSectionFilter(includeSections, excludeSections);
|
|
79
|
+
const hero = isEnabled('hero') ? buildHeroSection(data) : '';
|
|
80
|
+
const contentSections = buildContentSections(data, isEnabled);
|
|
81
|
+
const body = [
|
|
82
|
+
hero,
|
|
83
|
+
contentSections ? `<div class="content">\n${contentSections}\n</div>` : '',
|
|
84
|
+
buildFooterSection(data),
|
|
85
|
+
]
|
|
86
|
+
.filter(Boolean)
|
|
87
|
+
.join('\n');
|
|
88
|
+
const docTitle = data.config.title ?? data.projectName;
|
|
89
|
+
const docTheme = theme ?? 'light';
|
|
90
|
+
const docLang = language ?? 'en';
|
|
91
|
+
return wrapProposalHtml(docTitle, body, docTheme, docLang);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=proposal-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-generator.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ProposalTheme } from './proposal-themes.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wrap body content in a full self-contained HTML document for the proposal.
|
|
4
|
+
* Includes inline CSS (theme), print styles, and responsive layout.
|
|
5
|
+
*/
|
|
6
|
+
export declare function wrapProposalHtml(title: string, bodyContent: string, theme?: ProposalTheme, lang?: string): string;
|
|
7
|
+
//# sourceMappingURL=proposal-html-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-html-wrapper.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-html-wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE/E;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,aAAuB,EAC9B,IAAI,SAAO,GACV,MAAM,CAsBR"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Planu — HTML wrapper for project proposal documents
|
|
2
|
+
import { getProposalThemeCSS } from './proposal-themes.js';
|
|
3
|
+
/**
|
|
4
|
+
* Wrap body content in a full self-contained HTML document for the proposal.
|
|
5
|
+
* Includes inline CSS (theme), print styles, and responsive layout.
|
|
6
|
+
*/
|
|
7
|
+
export function wrapProposalHtml(title, bodyContent, theme = 'light', lang = 'en') {
|
|
8
|
+
const escapedTitle = title
|
|
9
|
+
.replace(/&/g, '&')
|
|
10
|
+
.replace(/</g, '<')
|
|
11
|
+
.replace(/>/g, '>')
|
|
12
|
+
.replace(/"/g, '"');
|
|
13
|
+
const css = getProposalThemeCSS(theme);
|
|
14
|
+
return `<!DOCTYPE html>
|
|
15
|
+
<html lang="${escapeAttr(lang)}">
|
|
16
|
+
<head>
|
|
17
|
+
<meta charset="UTF-8"/>
|
|
18
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
19
|
+
<meta name="generator" content="Planu — Spec Driven Development"/>
|
|
20
|
+
<title>${escapedTitle}</title>
|
|
21
|
+
<style>${css}</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body>
|
|
24
|
+
${bodyContent}
|
|
25
|
+
</body>
|
|
26
|
+
</html>`;
|
|
27
|
+
}
|
|
28
|
+
function escapeAttr(str) {
|
|
29
|
+
return str.replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=proposal-html-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-html-wrapper.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-html-wrapper.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAE/E;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,WAAmB,EACnB,QAAuB,OAAO,EAC9B,IAAI,GAAG,IAAI;IAEX,MAAM,YAAY,GAAG,KAAK;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3B,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAEvC,OAAO;cACK,UAAU,CAAC,IAAI,CAAC;;;;;WAKnB,YAAY;WACZ,GAAG;;;EAGZ,WAAW;;QAEL,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProposalLang, TranslationKey } from '../../../types/docs.js';
|
|
2
|
+
export type { ProposalLang, TranslationKey };
|
|
3
|
+
/**
|
|
4
|
+
* Get all translation strings for the given language.
|
|
5
|
+
* Falls back to English for unknown keys.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getTranslations(lang?: string): Record<TranslationKey, string>;
|
|
8
|
+
/**
|
|
9
|
+
* Translate a single key.
|
|
10
|
+
*/
|
|
11
|
+
export declare function t(lang: string, key: string): string;
|
|
12
|
+
//# sourceMappingURL=proposal-i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-i18n.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-i18n.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE3E,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AA6N7C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAO,GAAG,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
const EN = {
|
|
2
|
+
generatedBy: 'Generated by Planu',
|
|
3
|
+
confidential: 'CONFIDENTIAL',
|
|
4
|
+
expires: 'Valid until',
|
|
5
|
+
executiveSummary: 'Executive Summary',
|
|
6
|
+
totalInvestment: 'Total Investment',
|
|
7
|
+
estimatedHours: 'Estimated Hours',
|
|
8
|
+
totalSpecs: 'Total Specs',
|
|
9
|
+
timeline: 'Timeline',
|
|
10
|
+
avgRisk: 'Avg Risk Score',
|
|
11
|
+
completionRate: 'Completion Rate',
|
|
12
|
+
scope: 'Project Scope',
|
|
13
|
+
inScope: 'In Scope',
|
|
14
|
+
outOfScope: 'Out of Scope',
|
|
15
|
+
specBreakdown: 'Spec Breakdown',
|
|
16
|
+
specId: 'ID',
|
|
17
|
+
title: 'Title',
|
|
18
|
+
type: 'Type',
|
|
19
|
+
difficulty: 'Difficulty',
|
|
20
|
+
risk: 'Risk',
|
|
21
|
+
devHours: 'Dev Hours',
|
|
22
|
+
reviewHours: 'Review Hours',
|
|
23
|
+
cost: 'Cost (USD)',
|
|
24
|
+
status: 'Status',
|
|
25
|
+
subtotal: 'Subtotal',
|
|
26
|
+
total: 'Total',
|
|
27
|
+
timeline_section: 'Timeline & Schedule',
|
|
28
|
+
budget: 'Budget & Costs',
|
|
29
|
+
apiCosts: 'API Costs',
|
|
30
|
+
humanCosts: 'Human Costs',
|
|
31
|
+
infrastructure: 'Infrastructure',
|
|
32
|
+
investmentSummary: 'Investment Summary',
|
|
33
|
+
architecture: 'Project Architecture',
|
|
34
|
+
riskAnalysis: 'Risk Analysis',
|
|
35
|
+
category: 'Category',
|
|
36
|
+
probability: 'Probability',
|
|
37
|
+
impactUsd: 'Impact (USD)',
|
|
38
|
+
impactDays: 'Impact (Days)',
|
|
39
|
+
mitigation: 'Mitigation',
|
|
40
|
+
owner: 'Owner',
|
|
41
|
+
decisions: 'Architectural Decisions',
|
|
42
|
+
what: 'Decision',
|
|
43
|
+
why: 'Rationale',
|
|
44
|
+
alternatives: 'Alternatives',
|
|
45
|
+
decidedBy: 'Decided By',
|
|
46
|
+
impactAnalysis: 'Impact Analysis',
|
|
47
|
+
affectedModules: 'Affected Modules',
|
|
48
|
+
affectedFiles: 'Affected Files',
|
|
49
|
+
breakingChanges: 'Breaking Changes',
|
|
50
|
+
rollbackPlan: 'Rollback Plan',
|
|
51
|
+
teamResources: 'Team & Resources',
|
|
52
|
+
pricingMethodology: 'Pricing Methodology',
|
|
53
|
+
qualityMetrics: 'Quality Metrics',
|
|
54
|
+
accuracyScore: 'Accuracy Score',
|
|
55
|
+
livingSpec: 'Living Spec Status',
|
|
56
|
+
completion: 'Completion',
|
|
57
|
+
driftDetected: 'Drift Detected',
|
|
58
|
+
assumptions: 'Assumptions & Constraints',
|
|
59
|
+
postLaunch: 'Post-Launch Plan',
|
|
60
|
+
moduleMapping: 'Module Mapping',
|
|
61
|
+
module: 'Module',
|
|
62
|
+
files: 'Files',
|
|
63
|
+
coverage: 'Coverage',
|
|
64
|
+
footer: 'Generated by Planu — Spec Driven Development · planu.dev',
|
|
65
|
+
phase: 'Phase',
|
|
66
|
+
noData: 'No data available',
|
|
67
|
+
weeks: 'weeks',
|
|
68
|
+
days: 'days',
|
|
69
|
+
hours: 'hours',
|
|
70
|
+
};
|
|
71
|
+
const ES = {
|
|
72
|
+
generatedBy: 'Generado por Planu',
|
|
73
|
+
confidential: 'CONFIDENCIAL',
|
|
74
|
+
expires: 'Válido hasta',
|
|
75
|
+
executiveSummary: 'Resumen Ejecutivo',
|
|
76
|
+
totalInvestment: 'Inversión Total',
|
|
77
|
+
estimatedHours: 'Horas Estimadas',
|
|
78
|
+
totalSpecs: 'Total de Specs',
|
|
79
|
+
timeline: 'Cronograma',
|
|
80
|
+
avgRisk: 'Riesgo Promedio',
|
|
81
|
+
completionRate: 'Tasa de Completitud',
|
|
82
|
+
scope: 'Alcance del Proyecto',
|
|
83
|
+
inScope: 'En Alcance',
|
|
84
|
+
outOfScope: 'Fuera de Alcance',
|
|
85
|
+
specBreakdown: 'Desglose por Spec',
|
|
86
|
+
specId: 'ID',
|
|
87
|
+
title: 'Título',
|
|
88
|
+
type: 'Tipo',
|
|
89
|
+
difficulty: 'Dificultad',
|
|
90
|
+
risk: 'Riesgo',
|
|
91
|
+
devHours: 'Horas Dev',
|
|
92
|
+
reviewHours: 'Horas Review',
|
|
93
|
+
cost: 'Costo (USD)',
|
|
94
|
+
status: 'Estado',
|
|
95
|
+
subtotal: 'Subtotal',
|
|
96
|
+
total: 'Total',
|
|
97
|
+
timeline_section: 'Cronograma y Timeline',
|
|
98
|
+
budget: 'Presupuesto y Costos',
|
|
99
|
+
apiCosts: 'Costos de API',
|
|
100
|
+
humanCosts: 'Costos Humanos',
|
|
101
|
+
infrastructure: 'Infraestructura',
|
|
102
|
+
investmentSummary: 'Resumen de Inversión',
|
|
103
|
+
architecture: 'Arquitectura del Proyecto',
|
|
104
|
+
riskAnalysis: 'Análisis de Riesgos',
|
|
105
|
+
category: 'Categoría',
|
|
106
|
+
probability: 'Probabilidad',
|
|
107
|
+
impactUsd: 'Impacto (USD)',
|
|
108
|
+
impactDays: 'Impacto (Días)',
|
|
109
|
+
mitigation: 'Mitigación',
|
|
110
|
+
owner: 'Responsable',
|
|
111
|
+
decisions: 'Decisiones Arquitectónicas',
|
|
112
|
+
what: 'Decisión',
|
|
113
|
+
why: 'Justificación',
|
|
114
|
+
alternatives: 'Alternativas',
|
|
115
|
+
decidedBy: 'Decidido por',
|
|
116
|
+
impactAnalysis: 'Análisis de Impacto',
|
|
117
|
+
affectedModules: 'Módulos Afectados',
|
|
118
|
+
affectedFiles: 'Archivos Afectados',
|
|
119
|
+
breakingChanges: 'Cambios Disruptivos',
|
|
120
|
+
rollbackPlan: 'Plan de Rollback',
|
|
121
|
+
teamResources: 'Equipo y Recursos',
|
|
122
|
+
pricingMethodology: 'Metodología de Precios',
|
|
123
|
+
qualityMetrics: 'Métricas de Calidad',
|
|
124
|
+
accuracyScore: 'Score de Precisión',
|
|
125
|
+
livingSpec: 'Estado Living Spec',
|
|
126
|
+
completion: 'Completitud',
|
|
127
|
+
driftDetected: 'Drift Detectado',
|
|
128
|
+
assumptions: 'Supuestos y Restricciones',
|
|
129
|
+
postLaunch: 'Plan Post-Lanzamiento',
|
|
130
|
+
moduleMapping: 'Mapeo de Módulos',
|
|
131
|
+
module: 'Módulo',
|
|
132
|
+
files: 'Archivos',
|
|
133
|
+
coverage: 'Cobertura',
|
|
134
|
+
footer: 'Generado por Planu — Spec Driven Development · planu.dev',
|
|
135
|
+
phase: 'Fase',
|
|
136
|
+
noData: 'Sin datos disponibles',
|
|
137
|
+
weeks: 'semanas',
|
|
138
|
+
days: 'días',
|
|
139
|
+
hours: 'horas',
|
|
140
|
+
};
|
|
141
|
+
const PT = {
|
|
142
|
+
generatedBy: 'Gerado por Planu',
|
|
143
|
+
confidential: 'CONFIDENCIAL',
|
|
144
|
+
expires: 'Válido até',
|
|
145
|
+
executiveSummary: 'Resumo Executivo',
|
|
146
|
+
totalInvestment: 'Investimento Total',
|
|
147
|
+
estimatedHours: 'Horas Estimadas',
|
|
148
|
+
totalSpecs: 'Total de Specs',
|
|
149
|
+
timeline: 'Cronograma',
|
|
150
|
+
avgRisk: 'Risco Médio',
|
|
151
|
+
completionRate: 'Taxa de Conclusão',
|
|
152
|
+
scope: 'Escopo do Projeto',
|
|
153
|
+
inScope: 'No Escopo',
|
|
154
|
+
outOfScope: 'Fora do Escopo',
|
|
155
|
+
specBreakdown: 'Detalhamento por Spec',
|
|
156
|
+
specId: 'ID',
|
|
157
|
+
title: 'Título',
|
|
158
|
+
type: 'Tipo',
|
|
159
|
+
difficulty: 'Dificuldade',
|
|
160
|
+
risk: 'Risco',
|
|
161
|
+
devHours: 'Horas Dev',
|
|
162
|
+
reviewHours: 'Horas Review',
|
|
163
|
+
cost: 'Custo (USD)',
|
|
164
|
+
status: 'Status',
|
|
165
|
+
subtotal: 'Subtotal',
|
|
166
|
+
total: 'Total',
|
|
167
|
+
timeline_section: 'Cronograma e Agenda',
|
|
168
|
+
budget: 'Orçamento e Custos',
|
|
169
|
+
apiCosts: 'Custos de API',
|
|
170
|
+
humanCosts: 'Custos Humanos',
|
|
171
|
+
infrastructure: 'Infraestrutura',
|
|
172
|
+
investmentSummary: 'Resumo do Investimento',
|
|
173
|
+
architecture: 'Arquitetura do Projeto',
|
|
174
|
+
riskAnalysis: 'Análise de Riscos',
|
|
175
|
+
category: 'Categoria',
|
|
176
|
+
probability: 'Probabilidade',
|
|
177
|
+
impactUsd: 'Impacto (USD)',
|
|
178
|
+
impactDays: 'Impacto (Dias)',
|
|
179
|
+
mitigation: 'Mitigação',
|
|
180
|
+
owner: 'Responsável',
|
|
181
|
+
decisions: 'Decisões Arquiteturais',
|
|
182
|
+
what: 'Decisão',
|
|
183
|
+
why: 'Justificativa',
|
|
184
|
+
alternatives: 'Alternativas',
|
|
185
|
+
decidedBy: 'Decidido por',
|
|
186
|
+
impactAnalysis: 'Análise de Impacto',
|
|
187
|
+
affectedModules: 'Módulos Afetados',
|
|
188
|
+
affectedFiles: 'Arquivos Afetados',
|
|
189
|
+
breakingChanges: 'Mudanças Disruptivas',
|
|
190
|
+
rollbackPlan: 'Plano de Rollback',
|
|
191
|
+
teamResources: 'Equipe e Recursos',
|
|
192
|
+
pricingMethodology: 'Metodologia de Preços',
|
|
193
|
+
qualityMetrics: 'Métricas de Qualidade',
|
|
194
|
+
accuracyScore: 'Score de Precisão',
|
|
195
|
+
livingSpec: 'Status Living Spec',
|
|
196
|
+
completion: 'Conclusão',
|
|
197
|
+
driftDetected: 'Drift Detectado',
|
|
198
|
+
assumptions: 'Premissas e Restrições',
|
|
199
|
+
postLaunch: 'Plano Pós-Lançamento',
|
|
200
|
+
moduleMapping: 'Mapeamento de Módulos',
|
|
201
|
+
module: 'Módulo',
|
|
202
|
+
files: 'Arquivos',
|
|
203
|
+
coverage: 'Cobertura',
|
|
204
|
+
footer: 'Gerado por Planu — Spec Driven Development · planu.dev',
|
|
205
|
+
phase: 'Fase',
|
|
206
|
+
noData: 'Sem dados disponíveis',
|
|
207
|
+
weeks: 'semanas',
|
|
208
|
+
days: 'dias',
|
|
209
|
+
hours: 'horas',
|
|
210
|
+
};
|
|
211
|
+
const TRANSLATIONS = {
|
|
212
|
+
en: EN,
|
|
213
|
+
es: ES,
|
|
214
|
+
pt: PT,
|
|
215
|
+
};
|
|
216
|
+
/**
|
|
217
|
+
* Get all translation strings for the given language.
|
|
218
|
+
* Falls back to English for unknown keys.
|
|
219
|
+
*/
|
|
220
|
+
export function getTranslations(lang = 'en') {
|
|
221
|
+
return TRANSLATIONS[lang] ?? EN;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Translate a single key.
|
|
225
|
+
*/
|
|
226
|
+
export function t(lang, key) {
|
|
227
|
+
const map = TRANSLATIONS[lang] ?? EN;
|
|
228
|
+
return map[key] ?? key;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=proposal-i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-i18n.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-i18n.ts"],"names":[],"mappings":"AAKA,MAAM,EAAE,GAAmC;IACzC,WAAW,EAAE,oBAAoB;IACjC,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,aAAa;IACtB,gBAAgB,EAAE,mBAAmB;IACrC,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,UAAU,EAAE,aAAa;IACzB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,gBAAgB;IACzB,cAAc,EAAE,iBAAiB;IACjC,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,cAAc;IAC1B,aAAa,EAAE,gBAAgB;IAC/B,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,cAAc;IAC3B,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,gBAAgB,EAAE,qBAAqB;IACvC,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,aAAa;IACzB,cAAc,EAAE,gBAAgB;IAChC,iBAAiB,EAAE,oBAAoB;IACvC,YAAY,EAAE,sBAAsB;IACpC,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,cAAc;IACzB,UAAU,EAAE,eAAe;IAC3B,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,yBAAyB;IACpC,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,WAAW;IAChB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,YAAY;IACvB,cAAc,EAAE,iBAAiB;IACjC,eAAe,EAAE,kBAAkB;IACnC,aAAa,EAAE,gBAAgB;IAC/B,eAAe,EAAE,kBAAkB;IACnC,YAAY,EAAE,eAAe;IAC7B,aAAa,EAAE,kBAAkB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,gBAAgB;IAC/B,UAAU,EAAE,oBAAoB;IAChC,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,gBAAgB;IAC/B,WAAW,EAAE,2BAA2B;IACxC,UAAU,EAAE,kBAAkB;IAC9B,aAAa,EAAE,gBAAgB;IAC/B,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,0DAA0D;IAClE,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,EAAE,GAAmC;IACzC,WAAW,EAAE,oBAAoB;IACjC,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,cAAc;IACvB,gBAAgB,EAAE,mBAAmB;IACrC,eAAe,EAAE,iBAAiB;IAClC,cAAc,EAAE,iBAAiB;IACjC,UAAU,EAAE,gBAAgB;IAC5B,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,iBAAiB;IAC1B,cAAc,EAAE,qBAAqB;IACrC,KAAK,EAAE,sBAAsB;IAC7B,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,kBAAkB;IAC9B,aAAa,EAAE,mBAAmB;IAClC,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,cAAc;IAC3B,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,gBAAgB,EAAE,uBAAuB;IACzC,MAAM,EAAE,sBAAsB;IAC9B,QAAQ,EAAE,eAAe;IACzB,UAAU,EAAE,gBAAgB;IAC5B,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,sBAAsB;IACzC,YAAY,EAAE,2BAA2B;IACzC,YAAY,EAAE,qBAAqB;IACnC,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,cAAc;IAC3B,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,4BAA4B;IACvC,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,eAAe;IACpB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,cAAc;IACzB,cAAc,EAAE,qBAAqB;IACrC,eAAe,EAAE,mBAAmB;IACpC,aAAa,EAAE,oBAAoB;IACnC,eAAe,EAAE,qBAAqB;IACtC,YAAY,EAAE,kBAAkB;IAChC,aAAa,EAAE,mBAAmB;IAClC,kBAAkB,EAAE,wBAAwB;IAC5C,cAAc,EAAE,qBAAqB;IACrC,aAAa,EAAE,oBAAoB;IACnC,UAAU,EAAE,oBAAoB;IAChC,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,iBAAiB;IAChC,WAAW,EAAE,2BAA2B;IACxC,UAAU,EAAE,uBAAuB;IACnC,aAAa,EAAE,kBAAkB;IACjC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,0DAA0D;IAClE,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,uBAAuB;IAC/B,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,EAAE,GAAmC;IACzC,WAAW,EAAE,kBAAkB;IAC/B,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,YAAY;IACrB,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,oBAAoB;IACrC,cAAc,EAAE,iBAAiB;IACjC,UAAU,EAAE,gBAAgB;IAC5B,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,aAAa;IACtB,cAAc,EAAE,mBAAmB;IACnC,KAAK,EAAE,mBAAmB;IAC1B,OAAO,EAAE,WAAW;IACpB,UAAU,EAAE,gBAAgB;IAC5B,aAAa,EAAE,uBAAuB;IACtC,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,aAAa;IACzB,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,cAAc;IAC3B,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,gBAAgB,EAAE,qBAAqB;IACvC,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,eAAe;IACzB,UAAU,EAAE,gBAAgB;IAC5B,cAAc,EAAE,gBAAgB;IAChC,iBAAiB,EAAE,wBAAwB;IAC3C,YAAY,EAAE,wBAAwB;IACtC,YAAY,EAAE,mBAAmB;IACjC,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,eAAe;IAC5B,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,wBAAwB;IACnC,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,eAAe;IACpB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,cAAc;IACzB,cAAc,EAAE,oBAAoB;IACpC,eAAe,EAAE,kBAAkB;IACnC,aAAa,EAAE,mBAAmB;IAClC,eAAe,EAAE,sBAAsB;IACvC,YAAY,EAAE,mBAAmB;IACjC,aAAa,EAAE,mBAAmB;IAClC,kBAAkB,EAAE,uBAAuB;IAC3C,cAAc,EAAE,uBAAuB;IACvC,aAAa,EAAE,mBAAmB;IAClC,UAAU,EAAE,oBAAoB;IAChC,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,iBAAiB;IAChC,WAAW,EAAE,wBAAwB;IACrC,UAAU,EAAE,sBAAsB;IAClC,aAAa,EAAE,uBAAuB;IACtC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,wDAAwD;IAChE,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,uBAAuB;IAC/B,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,YAAY,GAAyD;IACzE,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAI,GAAG,IAAI;IACzC,OAAQ,YAA+D,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,CAAC,CAAC,IAAY,EAAE,GAAW;IACzC,MAAM,GAAG,GAAI,YAAuD,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjF,OAAQ,GAA8B,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { KpiItem } from '../../../types/docs.js';
|
|
2
|
+
export type { KpiItem };
|
|
3
|
+
/**
|
|
4
|
+
* Build a responsive KPI grid with large value + small label per card.
|
|
5
|
+
* Uses CSS class `.kpi-grid` and `.kpi-card` from proposal-themes.ts.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildKpiGrid(kpis: KpiItem[]): string;
|
|
8
|
+
//# sourceMappingURL=proposal-kpi-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-kpi-builder.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-kpi-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,YAAY,EAAE,OAAO,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAqBpD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a responsive KPI grid with large value + small label per card.
|
|
3
|
+
* Uses CSS class `.kpi-grid` and `.kpi-card` from proposal-themes.ts.
|
|
4
|
+
*/
|
|
5
|
+
export function buildKpiGrid(kpis) {
|
|
6
|
+
if (kpis.length === 0) {
|
|
7
|
+
return '';
|
|
8
|
+
}
|
|
9
|
+
const cards = kpis
|
|
10
|
+
.map((kpi) => {
|
|
11
|
+
const valueClass = kpi.variant === 'accent'
|
|
12
|
+
? 'kpi-value accent'
|
|
13
|
+
: kpi.variant === 'secondary'
|
|
14
|
+
? 'kpi-value secondary'
|
|
15
|
+
: 'kpi-value';
|
|
16
|
+
return `<div class="kpi-card">
|
|
17
|
+
<div class="${valueClass}">${escapeHtml(kpi.value)}</div>
|
|
18
|
+
<div class="kpi-label">${escapeHtml(kpi.label)}</div>
|
|
19
|
+
</div>`;
|
|
20
|
+
})
|
|
21
|
+
.join('\n');
|
|
22
|
+
return `<div class="kpi-grid">${cards}</div>`;
|
|
23
|
+
}
|
|
24
|
+
// Internal helper
|
|
25
|
+
function escapeHtml(str) {
|
|
26
|
+
return str
|
|
27
|
+
.replace(/&/g, '&')
|
|
28
|
+
.replace(/</g, '<')
|
|
29
|
+
.replace(/>/g, '>')
|
|
30
|
+
.replace(/"/g, '"');
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=proposal-kpi-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-kpi-builder.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-kpi-builder.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI;SACf,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,UAAU,GACd,GAAG,CAAC,OAAO,KAAK,QAAQ;YACtB,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,WAAW;gBAC3B,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,WAAW,CAAC;QACpB,OAAO;gBACG,UAAU,KAAK,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;2BACzB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;OACzC,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,yBAAyB,KAAK,QAAQ,CAAC;AAChD,CAAC;AAED,kBAAkB;AAClB,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ProposalData } from '../../../types/docs.js';
|
|
2
|
+
export declare function buildImpactAnalysisSection(data: ProposalData): string;
|
|
3
|
+
export declare function buildTeamResourcesSection(data: ProposalData): string;
|
|
4
|
+
export declare function buildPricingMethodologySection(data: ProposalData): string;
|
|
5
|
+
export declare function buildQualityMetricsSection(data: ProposalData): string;
|
|
6
|
+
export declare function buildLivingSpecSection(data: ProposalData): string;
|
|
7
|
+
export declare function buildAssumptionsSection(data: ProposalData): string;
|
|
8
|
+
export declare function buildAlternativesSection(data: ProposalData): string;
|
|
9
|
+
export declare function buildPostLaunchSection(data: ProposalData): string;
|
|
10
|
+
export declare function buildModuleMappingSection(data: ProposalData): string;
|
|
11
|
+
export declare function buildFooterSection(data: ProposalData): string;
|
|
12
|
+
export declare function buildGapAnalysisSection(data: ProposalData): string;
|
|
13
|
+
export declare function buildDesignSystemSection(data: ProposalData): string;
|
|
14
|
+
//# sourceMappingURL=proposal-section-builders-advanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-section-builders-advanced.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/proposal/proposal-section-builders-advanced.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA4B3D,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA0BrE;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAsBpE;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAWzE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAsBrE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAmBjE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAalE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA0BnE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAajE;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA+BpE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAW7D;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA8BlE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA4BnE"}
|