@planu/cli 0.54.2 → 0.55.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/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/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/types/docs.d.ts +34 -0
- package/dist/types/docs.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Spec, GeneratedDocument } from '../../../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Generate a self-contained HTML executive report for a single spec.
|
|
4
|
-
* Includes: header, metrics,
|
|
4
|
+
* Includes: header, metrics, actuals comparison, acceptance criteria,
|
|
5
|
+
* risk scorecard, living spec status, dependencies, effort SVG, tags.
|
|
6
|
+
* All rich sections are conditionally rendered based on data availability.
|
|
5
7
|
*/
|
|
6
8
|
export declare function generatePerSpecExecutiveReport(spec: Spec, affectedFiles: string[], architecturalDecisions: string[]): GeneratedDocument;
|
|
7
9
|
//# sourceMappingURL=executive-report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executive-report.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/executive-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"executive-report.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/executive-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAiBvE;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EAAE,EACvB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,iBAAiB,CA4DnB"}
|
|
@@ -1,18 +1,38 @@
|
|
|
1
1
|
import { extractPerSpecData } from './spec-data-extractor.js';
|
|
2
|
-
import { buildSpecHeaderSection, buildSpecMetricsSection, buildSpecDependenciesSection, buildSpecTagsSection, buildEffortDistributionSvg, buildSpecFooterSection, } from './spec-section-builders.js';
|
|
2
|
+
import { buildSpecHeaderSection, buildSpecMetricsSection, buildSpecDependenciesSection, buildSpecTagsSection, buildEffortDistributionSvg, buildSpecFooterSection, buildAcceptanceCriteriaSection, buildActualsComparisonSection, buildRiskScorecard, buildLivingSpecSection, buildSimilarSpecsSection, } from './spec-section-builders.js';
|
|
3
3
|
import { wrapPerSpecHtml } from './html-wrapper.js';
|
|
4
4
|
/**
|
|
5
5
|
* Generate a self-contained HTML executive report for a single spec.
|
|
6
|
-
* Includes: header, metrics,
|
|
6
|
+
* Includes: header, metrics, actuals comparison, acceptance criteria,
|
|
7
|
+
* risk scorecard, living spec status, dependencies, effort SVG, tags.
|
|
8
|
+
* All rich sections are conditionally rendered based on data availability.
|
|
7
9
|
*/
|
|
8
10
|
export function generatePerSpecExecutiveReport(spec, affectedFiles, architecturalDecisions) {
|
|
9
11
|
const data = extractPerSpecData(spec, affectedFiles, architecturalDecisions);
|
|
12
|
+
const actualsSection = data.actuals !== undefined
|
|
13
|
+
? buildActualsComparisonSection(data.actuals, data.devHours, data.reviewHours, data.totalCostUsd)
|
|
14
|
+
: '';
|
|
15
|
+
const acSection = data.acceptanceCriteria !== undefined && data.acceptanceCriteria.length > 0
|
|
16
|
+
? buildAcceptanceCriteriaSection(data.acceptanceCriteria)
|
|
17
|
+
: '';
|
|
18
|
+
const riskSection = data.riskBreakdown !== undefined && data.riskBreakdown.length > 0
|
|
19
|
+
? buildRiskScorecard(data.riskBreakdown)
|
|
20
|
+
: '';
|
|
21
|
+
const livingSection = data.livingSpec !== undefined ? buildLivingSpecSection(data.livingSpec) : '';
|
|
22
|
+
const similarSection = data.similarSpecs !== undefined && data.similarSpecs.length > 0
|
|
23
|
+
? buildSimilarSpecsSection(data.similarSpecs)
|
|
24
|
+
: '';
|
|
10
25
|
const body = [
|
|
11
26
|
buildSpecHeaderSection(data),
|
|
12
27
|
buildSpecMetricsSection(data),
|
|
28
|
+
actualsSection,
|
|
13
29
|
buildEffortDistributionSvg(data.devHours, data.reviewHours),
|
|
30
|
+
acSection,
|
|
31
|
+
riskSection,
|
|
32
|
+
livingSection,
|
|
14
33
|
buildSpecDependenciesSection(data),
|
|
15
34
|
buildSpecTagsSection(data),
|
|
35
|
+
similarSection,
|
|
16
36
|
buildSpecFooterSection(),
|
|
17
37
|
]
|
|
18
38
|
.filter(Boolean)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executive-report.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/executive-report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,
|
|
1
|
+
{"version":3,"file":"executive-report.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/executive-report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC9B,6BAA6B,EAC7B,kBAAkB,EAClB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAU,EACV,aAAuB,EACvB,sBAAgC;IAEhC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,sBAAsB,CAAC,CAAC;IAE7E,MAAM,cAAc,GAClB,IAAI,CAAC,OAAO,KAAK,SAAS;QACxB,CAAC,CAAC,6BAA6B,CAC3B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAClB;QACH,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,SAAS,GACb,IAAI,CAAC,kBAAkB,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;QACzE,CAAC,CAAC,8BAA8B,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACzD,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,WAAW,GACf,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAC/D,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC;QACxC,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,aAAa,GACjB,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/E,MAAM,cAAc,GAClB,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QAC7D,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC;QAC7C,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,IAAI,GAAG;QACX,sBAAsB,CAAC,IAAI,CAAC;QAC5B,uBAAuB,CAAC,IAAI,CAAC;QAC7B,cAAc;QACd,0BAA0B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;QAC3D,SAAS;QACT,WAAW;QACX,aAAa;QACb,4BAA4B,CAAC,IAAI,CAAC;QAClC,oBAAoB,CAAC,IAAI,CAAC;QAC1B,cAAc;QACd,sBAAsB,EAAE;KACzB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,sBAAsB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7C,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,KAAK;QACL,IAAI,EAAE,uBAAuB;QAC7B,OAAO;QACP,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Spec, PerSpecReportData } from '../../../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Extract report data from a single spec for HTML reports.
|
|
4
|
+
* Populates all available fields including impactAnalysis, actuals, etc.
|
|
4
5
|
*/
|
|
5
6
|
export declare function extractPerSpecData(spec: Spec, affectedFiles: string[], architecturalDecisions: string[]): PerSpecReportData;
|
|
6
7
|
//# sourceMappingURL=spec-data-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-data-extractor.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"spec-data-extractor.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-data-extractor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,IAAI,EACJ,iBAAiB,EAIlB,MAAM,yBAAyB,CAAC;AAEjC;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EAAE,EACvB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,iBAAiB,CAwBnB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Extract report data from a single spec for HTML reports.
|
|
3
|
+
* Populates all available fields including impactAnalysis, actuals, etc.
|
|
3
4
|
*/
|
|
4
5
|
export function extractPerSpecData(spec, affectedFiles, architecturalDecisions) {
|
|
5
6
|
return {
|
|
@@ -21,6 +22,34 @@ export function extractPerSpecData(spec, affectedFiles, architecturalDecisions)
|
|
|
21
22
|
affectedFiles,
|
|
22
23
|
architecturalDecisions,
|
|
23
24
|
generatedAt: new Date().toISOString(),
|
|
25
|
+
impactAnalysis: extractImpactAnalysis(spec),
|
|
26
|
+
actuals: extractActuals(spec),
|
|
27
|
+
estimationReasoning: spec.estimation.tokenOptimization.reasoning || undefined,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function extractImpactAnalysis(spec) {
|
|
31
|
+
if (!spec.impactAnalysis) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const ia = spec.impactAnalysis;
|
|
35
|
+
return {
|
|
36
|
+
affectedModules: ia.affectedModules,
|
|
37
|
+
affectedFiles: ia.affectedFiles,
|
|
38
|
+
breakingChanges: ia.breakingChanges,
|
|
39
|
+
rollbackPlan: ia.rollbackPlan,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function extractActuals(spec) {
|
|
43
|
+
if (!spec.actuals) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const a = spec.actuals;
|
|
47
|
+
return {
|
|
48
|
+
devHours: a.devHours,
|
|
49
|
+
reviewHours: a.reviewHours,
|
|
50
|
+
totalCostUsd: a.totalCostUsd,
|
|
51
|
+
completedAt: a.completedAt,
|
|
52
|
+
notes: a.notes,
|
|
24
53
|
};
|
|
25
54
|
}
|
|
26
55
|
//# sourceMappingURL=spec-data-extractor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-data-extractor.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-data-extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spec-data-extractor.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-data-extractor.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAU,EACV,aAAuB,EACvB,sBAAgC;IAEhC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;QAClC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;QACxC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY;QAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,EAAmB;QAC7B,aAAa;QACb,sBAAsB;QACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC;QAC3C,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;QAC7B,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,SAAS,IAAI,SAAS;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAU;IACvC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;IAC/B,OAAO;QACL,eAAe,EAAE,EAAE,CAAC,eAAe;QACnC,aAAa,EAAE,EAAE,CAAC,aAAa;QAC/B,eAAe,EAAE,EAAE,CAAC,eAAe;QACnC,YAAY,EAAE,EAAE,CAAC,YAAY;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAU;IAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACvB,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PerSpecReportData } from '../../../types/index.js';
|
|
1
|
+
import type { PerSpecReportData, PerSpecAcceptanceCriterion, PerSpecActuals, PerSpecImpactAnalysis, PerSpecLivingSpec, PerSpecRiskDimension } from '../../../types/index.js';
|
|
2
2
|
export declare function buildSpecHeaderSection(data: PerSpecReportData): string;
|
|
3
3
|
export declare function buildSpecMetricsSection(data: PerSpecReportData): string;
|
|
4
4
|
export declare function buildSpecDependenciesSection(data: PerSpecReportData): string;
|
|
@@ -7,4 +7,11 @@ export declare function buildEffortDistributionSvg(devHours: number, reviewHours
|
|
|
7
7
|
export declare function buildAffectedFilesSection(files: string[]): string;
|
|
8
8
|
export declare function buildArchDecisionsSection(decisions: string[]): string;
|
|
9
9
|
export declare function buildSpecFooterSection(): string;
|
|
10
|
+
export declare function buildAcceptanceCriteriaSection(criteria: PerSpecAcceptanceCriterion[]): string;
|
|
11
|
+
export declare function buildActualsComparisonSection(actuals: PerSpecActuals, devHours: number, reviewHours: number, totalCostUsd: number): string;
|
|
12
|
+
export declare function buildImpactAnalysisSection(impact: PerSpecImpactAnalysis): string;
|
|
13
|
+
export declare function buildRiskScorecard(risks: PerSpecRiskDimension[]): string;
|
|
14
|
+
export declare function buildLivingSpecSection(living: PerSpecLivingSpec): string;
|
|
15
|
+
export declare function buildEstimationReasoningSection(reasoning: string): string;
|
|
16
|
+
export declare function buildSimilarSpecsSection(similarSpecs: string[]): string;
|
|
10
17
|
//# sourceMappingURL=spec-section-builders.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-section-builders.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-section-builders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"spec-section-builders.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-section-builders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAUjC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAiBtE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAWvE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAkB5E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAapE;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAoBxF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAWjE;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAWrE;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C;AAUD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,0BAA0B,EAAE,GAAG,MAAM,CA8B7F;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CA0DR;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CA6BhF;AASD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAgCxE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAexE;AAED,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAWvE"}
|
|
@@ -105,6 +105,194 @@ export function buildSpecFooterSection() {
|
|
|
105
105
|
Generated by <strong>Planu</strong> — Spec Driven Development
|
|
106
106
|
</div>`;
|
|
107
107
|
}
|
|
108
|
+
// ── SPEC-139: Rich data section builders ──────────────────────────────────────
|
|
109
|
+
const AC_STATUS_CONFIG = {
|
|
110
|
+
met: { icon: '●', color: '#059669', label: 'Met' },
|
|
111
|
+
pending: { icon: '○', color: '#d97706', label: 'Pending' },
|
|
112
|
+
drift: { icon: '▲', color: '#dc2626', label: 'Drift' },
|
|
113
|
+
};
|
|
114
|
+
export function buildAcceptanceCriteriaSection(criteria) {
|
|
115
|
+
if (criteria.length === 0) {
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
const rows = criteria
|
|
119
|
+
.map((c) => {
|
|
120
|
+
const defaultAcConfig = { icon: '○', color: '#d97706', label: 'Pending' };
|
|
121
|
+
const cfg = AC_STATUS_CONFIG[c.status] ?? defaultAcConfig;
|
|
122
|
+
return `<tr>
|
|
123
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;">${escapeHtml(c.criterion)}</td>
|
|
124
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;white-space:nowrap;">
|
|
125
|
+
<span style="color:${cfg.color};font-weight:600;">${cfg.icon} ${escapeHtml(cfg.label)}</span>
|
|
126
|
+
</td>
|
|
127
|
+
</tr>`;
|
|
128
|
+
})
|
|
129
|
+
.join('\n');
|
|
130
|
+
return `<div class="section">
|
|
131
|
+
<h2>Acceptance Criteria</h2>
|
|
132
|
+
<table style="width:100%;border-collapse:collapse;font-size:14px;">
|
|
133
|
+
<thead>
|
|
134
|
+
<tr style="background:#f9fafb;">
|
|
135
|
+
<th style="padding:10px 12px;text-align:left;border-bottom:2px solid #e5e7eb;font-weight:600;">Criterion</th>
|
|
136
|
+
<th style="padding:10px 12px;text-align:left;border-bottom:2px solid #e5e7eb;font-weight:600;">Status</th>
|
|
137
|
+
</tr>
|
|
138
|
+
</thead>
|
|
139
|
+
<tbody>${rows}</tbody>
|
|
140
|
+
</table>
|
|
141
|
+
</div>`;
|
|
142
|
+
}
|
|
143
|
+
export function buildActualsComparisonSection(actuals, devHours, reviewHours, totalCostUsd) {
|
|
144
|
+
const devVariance = actuals.devHours - devHours;
|
|
145
|
+
const costVariance = actuals.totalCostUsd - totalCostUsd;
|
|
146
|
+
const devVariancePct = devHours > 0 ? Math.round((Math.abs(devVariance) / devHours) * 100) : 0;
|
|
147
|
+
const costVariancePct = totalCostUsd > 0 ? Math.round((Math.abs(costVariance) / totalCostUsd) * 100) : 0;
|
|
148
|
+
const devSign = devVariance >= 0 ? '+' : '-';
|
|
149
|
+
const costSign = costVariance >= 0 ? '+' : '-';
|
|
150
|
+
const devColor = devVariance > 0 ? '#dc2626' : '#059669';
|
|
151
|
+
const costColor = costVariance > 0 ? '#dc2626' : '#059669';
|
|
152
|
+
const completedDate = actuals.completedAt
|
|
153
|
+
? new Date(actuals.completedAt).toLocaleDateString('en-US', {
|
|
154
|
+
year: 'numeric',
|
|
155
|
+
month: 'long',
|
|
156
|
+
day: 'numeric',
|
|
157
|
+
})
|
|
158
|
+
: '—';
|
|
159
|
+
const notesRow = actuals.notes
|
|
160
|
+
? `<p style="margin-top:12px;font-size:13px;color:#6b7280;"><strong>Notes:</strong> ${escapeHtml(actuals.notes)}</p>`
|
|
161
|
+
: '';
|
|
162
|
+
return `<div class="section">
|
|
163
|
+
<h2>Estimated vs Actual</h2>
|
|
164
|
+
<p style="font-size:13px;color:#6b7280;margin-bottom:12px;">Completed: ${escapeHtml(completedDate)}</p>
|
|
165
|
+
<table style="width:100%;border-collapse:collapse;font-size:14px;">
|
|
166
|
+
<thead>
|
|
167
|
+
<tr style="background:#f9fafb;">
|
|
168
|
+
<th style="padding:10px 12px;text-align:left;border-bottom:2px solid #e5e7eb;font-weight:600;">Metric</th>
|
|
169
|
+
<th style="padding:10px 12px;text-align:right;border-bottom:2px solid #e5e7eb;font-weight:600;">Estimated</th>
|
|
170
|
+
<th style="padding:10px 12px;text-align:right;border-bottom:2px solid #e5e7eb;font-weight:600;">Actual</th>
|
|
171
|
+
<th style="padding:10px 12px;text-align:right;border-bottom:2px solid #e5e7eb;font-weight:600;">Variance</th>
|
|
172
|
+
</tr>
|
|
173
|
+
</thead>
|
|
174
|
+
<tbody>
|
|
175
|
+
<tr>
|
|
176
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;">Dev Hours</td>
|
|
177
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;text-align:right;">${String(devHours)}h</td>
|
|
178
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;text-align:right;">${String(actuals.devHours)}h</td>
|
|
179
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;text-align:right;color:${devColor};font-weight:600;">${devSign}${String(devVariancePct)}%</td>
|
|
180
|
+
</tr>
|
|
181
|
+
<tr>
|
|
182
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;">Review Hours</td>
|
|
183
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;text-align:right;">${String(reviewHours)}h</td>
|
|
184
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;text-align:right;">${String(actuals.reviewHours)}h</td>
|
|
185
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;text-align:right;color:#6b7280;">—</td>
|
|
186
|
+
</tr>
|
|
187
|
+
<tr>
|
|
188
|
+
<td style="padding:8px 12px;">Total Cost</td>
|
|
189
|
+
<td style="padding:8px 12px;text-align:right;">$${String(totalCostUsd)}</td>
|
|
190
|
+
<td style="padding:8px 12px;text-align:right;">$${String(actuals.totalCostUsd)}</td>
|
|
191
|
+
<td style="padding:8px 12px;text-align:right;color:${costColor};font-weight:600;">${costSign}${String(costVariancePct)}%</td>
|
|
192
|
+
</tr>
|
|
193
|
+
</tbody>
|
|
194
|
+
</table>
|
|
195
|
+
${notesRow}
|
|
196
|
+
</div>`;
|
|
197
|
+
}
|
|
198
|
+
export function buildImpactAnalysisSection(impact) {
|
|
199
|
+
const breakingBadge = impact.breakingChanges
|
|
200
|
+
? `<span style="background:#fee2e2;color:#dc2626;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;">BREAKING CHANGES</span>`
|
|
201
|
+
: `<span style="background:#d1fae5;color:#059669;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;">No Breaking Changes</span>`;
|
|
202
|
+
const modulesHtml = impact.affectedModules.length > 0
|
|
203
|
+
? `<p><strong>Affected Modules:</strong> ${impact.affectedModules.map(escapeHtml).join(', ')}</p>`
|
|
204
|
+
: '';
|
|
205
|
+
const filesHtml = impact.affectedFiles.length > 0
|
|
206
|
+
? `<p><strong>Affected Files (${String(impact.affectedFiles.length)}):</strong></p>
|
|
207
|
+
<ul style="font-size:13px;margin:4px 0 8px 0;">
|
|
208
|
+
${impact.affectedFiles.map((f) => `<li><code>${escapeHtml(f)}</code></li>`).join('\n ')}
|
|
209
|
+
</ul>`
|
|
210
|
+
: '';
|
|
211
|
+
const rollbackHtml = impact.rollbackPlan
|
|
212
|
+
? `<p><strong>Rollback Plan:</strong> ${escapeHtml(impact.rollbackPlan)}</p>`
|
|
213
|
+
: '';
|
|
214
|
+
return `<div class="section">
|
|
215
|
+
<h2>Impact Analysis</h2>
|
|
216
|
+
<p>${breakingBadge}</p>
|
|
217
|
+
${modulesHtml}
|
|
218
|
+
${filesHtml}
|
|
219
|
+
${rollbackHtml}
|
|
220
|
+
</div>`;
|
|
221
|
+
}
|
|
222
|
+
const RISK_LEVEL_COLORS = {
|
|
223
|
+
low: { bg: '#d1fae5', fg: '#065f46' },
|
|
224
|
+
medium: { bg: '#fef3c7', fg: '#92400e' },
|
|
225
|
+
high: { bg: '#fee2e2', fg: '#991b1b' },
|
|
226
|
+
critical: { bg: '#fce7f3', fg: '#9d174d' },
|
|
227
|
+
};
|
|
228
|
+
export function buildRiskScorecard(risks) {
|
|
229
|
+
if (risks.length === 0) {
|
|
230
|
+
return '';
|
|
231
|
+
}
|
|
232
|
+
const rows = risks
|
|
233
|
+
.map((r) => {
|
|
234
|
+
const defaultColors = { bg: '#e5e7eb', fg: '#374151' };
|
|
235
|
+
const colors = RISK_LEVEL_COLORS[r.level.toLowerCase()] ?? defaultColors;
|
|
236
|
+
return `<tr>
|
|
237
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;font-weight:500;">${escapeHtml(r.dimension)}</td>
|
|
238
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;">
|
|
239
|
+
<span style="background:${colors.bg};color:${colors.fg};padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;">${escapeHtml(r.level)}</span>
|
|
240
|
+
</td>
|
|
241
|
+
<td style="padding:8px 12px;border-bottom:1px solid #e5e7eb;font-size:13px;color:#6b7280;">${escapeHtml(r.detail)}</td>
|
|
242
|
+
</tr>`;
|
|
243
|
+
})
|
|
244
|
+
.join('\n');
|
|
245
|
+
return `<div class="section">
|
|
246
|
+
<h2>Risk Scorecard</h2>
|
|
247
|
+
<table style="width:100%;border-collapse:collapse;font-size:14px;">
|
|
248
|
+
<thead>
|
|
249
|
+
<tr style="background:#f9fafb;">
|
|
250
|
+
<th style="padding:10px 12px;text-align:left;border-bottom:2px solid #e5e7eb;font-weight:600;">Dimension</th>
|
|
251
|
+
<th style="padding:10px 12px;text-align:left;border-bottom:2px solid #e5e7eb;font-weight:600;">Level</th>
|
|
252
|
+
<th style="padding:10px 12px;text-align:left;border-bottom:2px solid #e5e7eb;font-weight:600;">Detail</th>
|
|
253
|
+
</tr>
|
|
254
|
+
</thead>
|
|
255
|
+
<tbody>${rows}</tbody>
|
|
256
|
+
</table>
|
|
257
|
+
</div>`;
|
|
258
|
+
}
|
|
259
|
+
export function buildLivingSpecSection(living) {
|
|
260
|
+
const pct = Math.min(100, Math.max(0, living.completionPercent));
|
|
261
|
+
const barColor = pct >= 80 ? '#059669' : pct >= 50 ? '#d97706' : '#dc2626';
|
|
262
|
+
const driftBadge = living.driftDetected
|
|
263
|
+
? `<span style="background:#fee2e2;color:#dc2626;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;margin-left:8px;">DRIFT DETECTED</span>`
|
|
264
|
+
: `<span style="background:#d1fae5;color:#059669;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;margin-left:8px;">In Sync</span>`;
|
|
265
|
+
return `<div class="section">
|
|
266
|
+
<h2>Living Spec Status</h2>
|
|
267
|
+
<p><strong>Completion:</strong> ${String(pct)}%${driftBadge}</p>
|
|
268
|
+
<div style="background:#e5e7eb;border-radius:8px;height:12px;width:100%;margin:8px 0;">
|
|
269
|
+
<div style="background:${barColor};border-radius:8px;height:12px;width:${String(pct)}%;transition:width 0.3s;"></div>
|
|
270
|
+
</div>
|
|
271
|
+
<p style="font-size:13px;color:#6b7280;">Changed files tracked: ${String(living.changedFileCount)}</p>
|
|
272
|
+
</div>`;
|
|
273
|
+
}
|
|
274
|
+
export function buildEstimationReasoningSection(reasoning) {
|
|
275
|
+
if (!reasoning) {
|
|
276
|
+
return '';
|
|
277
|
+
}
|
|
278
|
+
return `<div class="section">
|
|
279
|
+
<h2>Estimation Reasoning</h2>
|
|
280
|
+
<p style="font-size:14px;color:#374151;line-height:1.6;">${escapeHtml(reasoning)}</p>
|
|
281
|
+
</div>`;
|
|
282
|
+
}
|
|
283
|
+
export function buildSimilarSpecsSection(similarSpecs) {
|
|
284
|
+
if (similarSpecs.length === 0) {
|
|
285
|
+
return '';
|
|
286
|
+
}
|
|
287
|
+
const badges = similarSpecs
|
|
288
|
+
.map((s) => `<span class="badge badge-draft" style="margin-right:4px;">${escapeHtml(s)}</span>`)
|
|
289
|
+
.join('');
|
|
290
|
+
return `<div class="section">
|
|
291
|
+
<h2>Similar Specs</h2>
|
|
292
|
+
<p>${badges}</p>
|
|
293
|
+
</div>`;
|
|
294
|
+
}
|
|
295
|
+
// ── Internal helpers ──────────────────────────────────────────────────────────
|
|
108
296
|
function metricCard(value, label) {
|
|
109
297
|
return `<div class="metric-card">
|
|
110
298
|
<div class="metric-value">${escapeHtml(value)}</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-section-builders.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-section-builders.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spec-section-builders.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/spec-section-builders.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Spec, GeneratedDocument, SpecDiagram } from '../../../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Generate a self-contained HTML technical report for a single spec.
|
|
4
|
-
* Includes: header,
|
|
4
|
+
* Includes: header, scope, diagrams, impact analysis, affected files,
|
|
5
|
+
* architectural decisions, acceptance criteria, living spec, estimation reasoning.
|
|
6
|
+
* All rich sections are conditionally rendered based on data availability.
|
|
5
7
|
*/
|
|
6
8
|
export declare function generatePerSpecTechnicalReport(spec: Spec, diagrams: SpecDiagram[], affectedFiles: string[], architecturalDecisions: string[]): GeneratedDocument;
|
|
7
9
|
//# sourceMappingURL=technical-report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"technical-report.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/technical-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"technical-report.d.ts","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/technical-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAepF;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,WAAW,EAAE,EACvB,aAAa,EAAE,MAAM,EAAE,EACvB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,iBAAiB,CAuDnB"}
|
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
import { extractPerSpecData } from './spec-data-extractor.js';
|
|
2
|
-
import { buildSpecHeaderSection, buildAffectedFilesSection, buildArchDecisionsSection, buildSpecFooterSection, } from './spec-section-builders.js';
|
|
2
|
+
import { buildSpecHeaderSection, buildAffectedFilesSection, buildArchDecisionsSection, buildSpecFooterSection, buildImpactAnalysisSection, buildEstimationReasoningSection, buildLivingSpecSection, buildAcceptanceCriteriaSection, } from './spec-section-builders.js';
|
|
3
3
|
import { renderMermaidDiagrams, getMermaidScript } from './mermaid-renderer.js';
|
|
4
4
|
import { wrapPerSpecHtml } from './html-wrapper.js';
|
|
5
5
|
/**
|
|
6
6
|
* Generate a self-contained HTML technical report for a single spec.
|
|
7
|
-
* Includes: header,
|
|
7
|
+
* Includes: header, scope, diagrams, impact analysis, affected files,
|
|
8
|
+
* architectural decisions, acceptance criteria, living spec, estimation reasoning.
|
|
9
|
+
* All rich sections are conditionally rendered based on data availability.
|
|
8
10
|
*/
|
|
9
11
|
export function generatePerSpecTechnicalReport(spec, diagrams, affectedFiles, architecturalDecisions) {
|
|
10
12
|
const data = extractPerSpecData(spec, affectedFiles, architecturalDecisions);
|
|
11
|
-
const scopeInfo =
|
|
12
|
-
<h2>Scope</h2>
|
|
13
|
-
<p><strong>Scope:</strong> ${escapeHtml(data.scope)} · <strong>Target:</strong> ${escapeHtml(data.target)}</p>
|
|
14
|
-
${data.gitBranch ? `<p><strong>Branch:</strong> <code>${escapeHtml(data.gitBranch)}</code></p>` : ''}
|
|
15
|
-
</div>`;
|
|
13
|
+
const scopeInfo = buildScopeSection(data.scope, data.target, data.gitBranch);
|
|
16
14
|
const diagramsSection = diagrams.length > 0
|
|
17
15
|
? `<div class="section"><h2>Diagrams</h2>${renderMermaidDiagrams(diagrams)}</div>`
|
|
18
16
|
: '';
|
|
17
|
+
const impactSection = data.impactAnalysis !== undefined ? buildImpactAnalysisSection(data.impactAnalysis) : '';
|
|
18
|
+
const acSection = data.acceptanceCriteria !== undefined && data.acceptanceCriteria.length > 0
|
|
19
|
+
? buildAcceptanceCriteriaSection(data.acceptanceCriteria)
|
|
20
|
+
: '';
|
|
21
|
+
const livingSection = data.livingSpec !== undefined ? buildLivingSpecSection(data.livingSpec) : '';
|
|
22
|
+
const reasoningSection = data.estimationReasoning !== undefined && data.estimationReasoning.length > 0
|
|
23
|
+
? buildEstimationReasoningSection(data.estimationReasoning)
|
|
24
|
+
: '';
|
|
19
25
|
const body = [
|
|
20
26
|
buildSpecHeaderSection(data),
|
|
21
27
|
scopeInfo,
|
|
22
28
|
diagramsSection,
|
|
29
|
+
impactSection,
|
|
23
30
|
buildAffectedFilesSection(data.affectedFiles),
|
|
24
31
|
buildArchDecisionsSection(data.architecturalDecisions),
|
|
32
|
+
acSection,
|
|
33
|
+
livingSection,
|
|
34
|
+
reasoningSection,
|
|
25
35
|
buildSpecFooterSection(),
|
|
26
36
|
]
|
|
27
37
|
.filter(Boolean)
|
|
@@ -40,6 +50,13 @@ export function generatePerSpecTechnicalReport(spec, diagrams, affectedFiles, ar
|
|
|
40
50
|
relatedSpecs: [data.specId],
|
|
41
51
|
};
|
|
42
52
|
}
|
|
53
|
+
function buildScopeSection(scope, target, gitBranch) {
|
|
54
|
+
return `<div class="section">
|
|
55
|
+
<h2>Scope</h2>
|
|
56
|
+
<p><strong>Scope:</strong> ${escapeHtml(scope)} · <strong>Target:</strong> ${escapeHtml(target)}</p>
|
|
57
|
+
${gitBranch ? `<p><strong>Branch:</strong> <code>${escapeHtml(gitBranch)}</code></p>` : ''}
|
|
58
|
+
</div>`;
|
|
59
|
+
}
|
|
43
60
|
function escapeHtml(str) {
|
|
44
61
|
return str
|
|
45
62
|
.replace(/&/g, '&')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"technical-report.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/technical-report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"technical-report.js","sourceRoot":"","sources":["../../../../src/engine/doc-generator/per-spec-report/technical-report.ts"],"names":[],"mappings":"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"}
|
package/dist/types/docs.d.ts
CHANGED
|
@@ -105,6 +105,33 @@ export interface MermaidDiagram {
|
|
|
105
105
|
title: string;
|
|
106
106
|
}
|
|
107
107
|
export type PerSpecReportType = 'per-spec-executive' | 'per-spec-technical';
|
|
108
|
+
export interface PerSpecImpactAnalysis {
|
|
109
|
+
affectedModules: string[];
|
|
110
|
+
affectedFiles: string[];
|
|
111
|
+
breakingChanges: boolean;
|
|
112
|
+
rollbackPlan: string;
|
|
113
|
+
}
|
|
114
|
+
export interface PerSpecActuals {
|
|
115
|
+
devHours: number;
|
|
116
|
+
reviewHours: number;
|
|
117
|
+
totalCostUsd: number;
|
|
118
|
+
completedAt: string;
|
|
119
|
+
notes: string;
|
|
120
|
+
}
|
|
121
|
+
export interface PerSpecLivingSpec {
|
|
122
|
+
completionPercent: number;
|
|
123
|
+
driftDetected: boolean;
|
|
124
|
+
changedFileCount: number;
|
|
125
|
+
}
|
|
126
|
+
export interface PerSpecAcceptanceCriterion {
|
|
127
|
+
criterion: string;
|
|
128
|
+
status: 'met' | 'pending' | 'drift';
|
|
129
|
+
}
|
|
130
|
+
export interface PerSpecRiskDimension {
|
|
131
|
+
dimension: string;
|
|
132
|
+
level: string;
|
|
133
|
+
detail: string;
|
|
134
|
+
}
|
|
108
135
|
export interface PerSpecReportData {
|
|
109
136
|
specId: string;
|
|
110
137
|
title: string;
|
|
@@ -124,6 +151,13 @@ export interface PerSpecReportData {
|
|
|
124
151
|
affectedFiles: string[];
|
|
125
152
|
architecturalDecisions: string[];
|
|
126
153
|
generatedAt: string;
|
|
154
|
+
impactAnalysis?: PerSpecImpactAnalysis;
|
|
155
|
+
actuals?: PerSpecActuals;
|
|
156
|
+
livingSpec?: PerSpecLivingSpec;
|
|
157
|
+
acceptanceCriteria?: PerSpecAcceptanceCriterion[];
|
|
158
|
+
riskBreakdown?: PerSpecRiskDimension[];
|
|
159
|
+
estimationReasoning?: string;
|
|
160
|
+
similarSpecs?: string[];
|
|
127
161
|
}
|
|
128
162
|
export interface ProgressSection {
|
|
129
163
|
title: string;
|
package/dist/types/docs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/types/docs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/types/docs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planu/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.55.0",
|
|
4
4
|
"description": "Planu — MCP Server for Spec Driven Development. Manages specs, estimations, reverse engineering, and auto-learning across any language/framework.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|