@planu/cli 0.28.0 → 0.29.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/model-routing-rules.json +98 -0
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
- package/dist/engine/ai-cost-estimator/core.js +2 -202
- package/dist/engine/ai-cost-estimator/core.js.map +1 -1
- package/dist/engine/ai-cost-estimator/recommender.d.ts +8 -0
- package/dist/engine/ai-cost-estimator/recommender.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/recommender.js +94 -0
- package/dist/engine/ai-cost-estimator/recommender.js.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts +13 -0
- package/dist/engine/ai-cost-estimator/spec-loader.d.ts.map +1 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js +102 -0
- package/dist/engine/ai-cost-estimator/spec-loader.js.map +1 -0
- package/dist/engine/code-transforms/transform-engine.d.ts +7 -0
- package/dist/engine/code-transforms/transform-engine.d.ts.map +1 -0
- package/dist/engine/code-transforms/transform-engine.js +67 -0
- package/dist/engine/code-transforms/transform-engine.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js +92 -0
- package/dist/engine/code-transforms/typescript/add-error-handling.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js +83 -0
- package/dist/engine/code-transforms/typescript/add-jsdoc.js.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/add-types.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/add-types.js +182 -0
- package/dist/engine/code-transforms/typescript/add-types.js.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts +38 -0
- package/dist/engine/code-transforms/typescript/ast-utils.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js +90 -0
- package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts +6 -0
- package/dist/engine/code-transforms/typescript/extract-interface.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js +103 -0
- package/dist/engine/code-transforms/typescript/extract-interface.js.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts +3 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js +213 -0
- package/dist/engine/code-transforms/typescript/modernize-syntax.js.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts +8 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.d.ts.map +1 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js +40 -0
- package/dist/engine/code-transforms/typescript/rename-symbol.js.map +1 -0
- package/dist/engine/mermaid/core.d.ts +18 -0
- package/dist/engine/mermaid/core.d.ts.map +1 -0
- package/dist/engine/mermaid/core.js +88 -0
- package/dist/engine/mermaid/core.js.map +1 -0
- package/dist/engine/mermaid/diagram-generators.d.ts +22 -0
- package/dist/engine/mermaid/diagram-generators.d.ts.map +1 -0
- package/dist/engine/mermaid/diagram-generators.js +139 -0
- package/dist/engine/mermaid/diagram-generators.js.map +1 -0
- package/dist/engine/mermaid/helpers.d.ts +8 -0
- package/dist/engine/mermaid/helpers.d.ts.map +1 -0
- package/dist/engine/mermaid/helpers.js +61 -0
- package/dist/engine/mermaid/helpers.js.map +1 -0
- package/dist/engine/mermaid-generator.d.ts +2 -37
- package/dist/engine/mermaid-generator.d.ts.map +1 -1
- package/dist/engine/mermaid-generator.js +4 -276
- package/dist/engine/mermaid-generator.js.map +1 -1
- package/dist/engine/model-router/complexity-analyzer.d.ts +26 -0
- package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -0
- package/dist/engine/model-router/complexity-analyzer.js +182 -0
- package/dist/engine/model-router/complexity-analyzer.js.map +1 -0
- package/dist/engine/model-router/cost-estimator.d.ts +6 -0
- package/dist/engine/model-router/cost-estimator.d.ts.map +1 -0
- package/dist/engine/model-router/cost-estimator.js +60 -0
- package/dist/engine/model-router/cost-estimator.js.map +1 -0
- package/dist/engine/model-router/historical-learner.d.ts +26 -0
- package/dist/engine/model-router/historical-learner.d.ts.map +1 -0
- package/dist/engine/model-router/historical-learner.js +91 -0
- package/dist/engine/model-router/historical-learner.js.map +1 -0
- package/dist/engine/model-router/rules-engine.d.ts +13 -0
- package/dist/engine/model-router/rules-engine.d.ts.map +1 -0
- package/dist/engine/model-router/rules-engine.js +142 -0
- package/dist/engine/model-router/rules-engine.js.map +1 -0
- package/dist/engine/spec-coverage/criteria-mapper.d.ts +1 -2
- package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -1
- package/dist/engine/spec-coverage/criteria-mapper.js +4 -203
- package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -1
- package/dist/engine/spec-coverage/keyword-extractor.d.ts +10 -0
- package/dist/engine/spec-coverage/keyword-extractor.d.ts.map +1 -0
- package/dist/engine/spec-coverage/keyword-extractor.js +147 -0
- package/dist/engine/spec-coverage/keyword-extractor.js.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts +9 -0
- package/dist/engine/spec-coverage/test-matchers.d.ts.map +1 -0
- package/dist/engine/spec-coverage/test-matchers.js +59 -0
- package/dist/engine/spec-coverage/test-matchers.js.map +1 -0
- package/dist/engine/spec-templates/catalog-extra.d.ts +1 -1
- package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog-extra.js +8 -363
- package/dist/engine/spec-templates/catalog-extra.js.map +1 -1
- package/dist/engine/spec-templates/catalog.d.ts.map +1 -1
- package/dist/engine/spec-templates/catalog.js +10 -381
- package/dist/engine/spec-templates/catalog.js.map +1 -1
- package/dist/engine/spec-templates/templates-api-ui.d.ts +6 -0
- package/dist/engine/spec-templates/templates-api-ui.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-api-ui.js +188 -0
- package/dist/engine/spec-templates/templates-api-ui.js.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts +6 -0
- package/dist/engine/spec-templates/templates-auth-crud.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-auth-crud.js +198 -0
- package/dist/engine/spec-templates/templates-auth-crud.js.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts +6 -0
- package/dist/engine/spec-templates/templates-data-security.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-data-security.js +172 -0
- package/dist/engine/spec-templates/templates-data-security.js.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts +6 -0
- package/dist/engine/spec-templates/templates-perf-integration.d.ts.map +1 -0
- package/dist/engine/spec-templates/templates-perf-integration.js +199 -0
- package/dist/engine/spec-templates/templates-perf-integration.js.map +1 -0
- package/dist/engine/vector-store/hnsw.d.ts +37 -0
- package/dist/engine/vector-store/hnsw.d.ts.map +1 -0
- package/dist/engine/vector-store/hnsw.js +294 -0
- package/dist/engine/vector-store/hnsw.js.map +1 -0
- package/dist/engine/vector-store/similarity.d.ts +21 -0
- package/dist/engine/vector-store/similarity.d.ts.map +1 -0
- package/dist/engine/vector-store/similarity.js +86 -0
- package/dist/engine/vector-store/similarity.js.map +1 -0
- package/dist/engine/vector-store/tfidf.d.ts +35 -0
- package/dist/engine/vector-store/tfidf.d.ts.map +1 -0
- package/dist/engine/vector-store/tfidf.js +255 -0
- package/dist/engine/vector-store/tfidf.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/vector-store/backend-factory.d.ts +9 -0
- package/dist/storage/vector-store/backend-factory.d.ts.map +1 -0
- package/dist/storage/vector-store/backend-factory.js +33 -0
- package/dist/storage/vector-store/backend-factory.js.map +1 -0
- package/dist/storage/vector-store/json-fallback.d.ts +21 -0
- package/dist/storage/vector-store/json-fallback.d.ts.map +1 -0
- package/dist/storage/vector-store/json-fallback.js +85 -0
- package/dist/storage/vector-store/json-fallback.js.map +1 -0
- package/dist/storage/vector-store/migrator.d.ts +10 -0
- package/dist/storage/vector-store/migrator.d.ts.map +1 -0
- package/dist/storage/vector-store/migrator.js +139 -0
- package/dist/storage/vector-store/migrator.js.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts +28 -0
- package/dist/storage/vector-store/sqlite-adapter.d.ts.map +1 -0
- package/dist/storage/vector-store/sqlite-adapter.js +142 -0
- package/dist/storage/vector-store/sqlite-adapter.js.map +1 -0
- package/dist/tools/create-spec/constitution-validator.d.ts +4 -0
- package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -0
- package/dist/tools/create-spec/constitution-validator.js +37 -0
- package/dist/tools/create-spec/constitution-validator.js.map +1 -0
- package/dist/tools/create-spec/post-creation.d.ts +11 -0
- package/dist/tools/create-spec/post-creation.d.ts.map +1 -0
- package/dist/tools/create-spec/post-creation.js +48 -0
- package/dist/tools/create-spec/post-creation.js.map +1 -0
- package/dist/tools/create-spec/spec-builder.d.ts +14 -0
- package/dist/tools/create-spec/spec-builder.d.ts.map +1 -0
- package/dist/tools/create-spec/spec-builder.js +131 -0
- package/dist/tools/create-spec/spec-builder.js.map +1 -0
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +42 -172
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/recommend-model-handler.d.ts +8 -0
- package/dist/tools/recommend-model-handler.d.ts.map +1 -0
- package/dist/tools/recommend-model-handler.js +65 -0
- package/dist/tools/recommend-model-handler.js.map +1 -0
- package/dist/tools/register-model-tools.d.ts +3 -0
- package/dist/tools/register-model-tools.d.ts.map +1 -0
- package/dist/tools/register-model-tools.js +50 -0
- package/dist/tools/register-model-tools.js.map +1 -0
- package/dist/tools/register-search-tools.d.ts +7 -0
- package/dist/tools/register-search-tools.d.ts.map +1 -0
- package/dist/tools/register-search-tools.js +34 -0
- package/dist/tools/register-search-tools.js.map +1 -0
- package/dist/tools/register-transform-tools.d.ts +3 -0
- package/dist/tools/register-transform-tools.d.ts.map +1 -0
- package/dist/tools/register-transform-tools.js +29 -0
- package/dist/tools/register-transform-tools.js.map +1 -0
- package/dist/tools/semantic-search-handler.d.ts +7 -0
- package/dist/tools/semantic-search-handler.d.ts.map +1 -0
- package/dist/tools/semantic-search-handler.js +72 -0
- package/dist/tools/semantic-search-handler.js.map +1 -0
- package/dist/tools/transform-code-handler.d.ts +7 -0
- package/dist/tools/transform-code-handler.d.ts.map +1 -0
- package/dist/tools/transform-code-handler.js +58 -0
- package/dist/tools/transform-code-handler.js.map +1 -0
- package/dist/types/advanced-framework.d.ts +47 -0
- package/dist/types/advanced-framework.d.ts.map +1 -0
- package/dist/types/advanced-framework.js +3 -0
- package/dist/types/advanced-framework.js.map +1 -0
- package/dist/types/code-transforms.d.ts +114 -0
- package/dist/types/code-transforms.d.ts.map +1 -0
- package/dist/types/code-transforms.js +11 -0
- package/dist/types/code-transforms.js.map +1 -0
- package/dist/types/css-framework.d.ts +110 -0
- package/dist/types/css-framework.d.ts.map +1 -0
- package/dist/types/css-framework.js +3 -0
- package/dist/types/css-framework.js.map +1 -0
- package/dist/types/dashboard.d.ts +77 -0
- package/dist/types/dashboard.d.ts.map +1 -0
- package/dist/types/dashboard.js +2 -0
- package/dist/types/dashboard.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/model-routing.d.ts +127 -0
- package/dist/types/model-routing.d.ts.map +1 -0
- package/dist/types/model-routing.js +3 -0
- package/dist/types/model-routing.js.map +1 -0
- package/dist/types/spec/core.d.ts +28 -1
- package/dist/types/spec/core.d.ts.map +1 -1
- package/dist/types/spec/inputs.d.ts +1 -6
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/ui.d.ts +3 -231
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/ui.js +7 -1
- package/dist/types/ui.js.map +1 -1
- package/dist/types/vector-store.d.ts +137 -0
- package/dist/types/vector-store.d.ts.map +1 -0
- package/dist/types/vector-store.js +3 -0
- package/dist/types/vector-store.js.map +1 -0
- package/package.json +1 -1
- package/src/config/model-routing-rules.json +98 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// engine/mermaid/diagram-generators.ts — Individual diagram type generators.
|
|
2
|
+
// Extracted from mermaid-generator.ts to keep file sizes within limits.
|
|
3
|
+
import { buildParticipants } from './helpers.js';
|
|
4
|
+
/**
|
|
5
|
+
* Generate an ER diagram for database changes.
|
|
6
|
+
*/
|
|
7
|
+
export function generateErDiagram(spec, knowledge) {
|
|
8
|
+
const dbEngine = knowledge?.database ?? 'unknown';
|
|
9
|
+
const lines = [
|
|
10
|
+
'erDiagram',
|
|
11
|
+
` %% Database: ${dbEngine}`,
|
|
12
|
+
` %% Spec: ${spec.title}`,
|
|
13
|
+
' ENTITY_A {',
|
|
14
|
+
' string id PK',
|
|
15
|
+
' string name',
|
|
16
|
+
' datetime created_at',
|
|
17
|
+
' }',
|
|
18
|
+
' ENTITY_B {',
|
|
19
|
+
' string id PK',
|
|
20
|
+
' string entity_a_id FK',
|
|
21
|
+
' string value',
|
|
22
|
+
' }',
|
|
23
|
+
' ENTITY_A ||--o{ ENTITY_B : "has many"',
|
|
24
|
+
];
|
|
25
|
+
return {
|
|
26
|
+
type: 'er',
|
|
27
|
+
title: `Entity Relationship — ${spec.title}`,
|
|
28
|
+
format: 'mermaid',
|
|
29
|
+
content: lines.join('\n'),
|
|
30
|
+
description: 'Entity-relationship diagram for database schema changes. Customize entities to match your domain.',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate a sequence diagram for cross-module interactions.
|
|
35
|
+
*/
|
|
36
|
+
export function generateSequenceDiagram(spec, knowledge) {
|
|
37
|
+
const participants = buildParticipants(spec.target, knowledge);
|
|
38
|
+
const lines = ['sequenceDiagram'];
|
|
39
|
+
for (const p of participants) {
|
|
40
|
+
lines.push(` participant ${p.id} as ${p.label}`);
|
|
41
|
+
}
|
|
42
|
+
// Generate basic request-response flow
|
|
43
|
+
const first = participants[0];
|
|
44
|
+
const second = participants[1];
|
|
45
|
+
if (first && second) {
|
|
46
|
+
lines.push(` ${first.id}->>+${second.id}: Request`);
|
|
47
|
+
const third = participants[2];
|
|
48
|
+
if (third) {
|
|
49
|
+
lines.push(` ${second.id}->>+${third.id}: Process`);
|
|
50
|
+
lines.push(` ${third.id}-->>-${second.id}: Result`);
|
|
51
|
+
}
|
|
52
|
+
lines.push(` ${second.id}-->>-${first.id}: Response`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
type: 'sequence',
|
|
56
|
+
title: `Sequence Diagram — ${spec.title}`,
|
|
57
|
+
format: 'mermaid',
|
|
58
|
+
content: lines.join('\n'),
|
|
59
|
+
description: 'Sequence diagram showing interactions between modules. Customize messages to match your flow.',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate a component diagram for UI specs.
|
|
64
|
+
*/
|
|
65
|
+
export function generateComponentDiagram(spec, knowledge) {
|
|
66
|
+
const framework = knowledge?.framework ?? 'UI';
|
|
67
|
+
const lines = [
|
|
68
|
+
'graph TD',
|
|
69
|
+
` Page["${spec.title} Page"]`,
|
|
70
|
+
` Page --> Header[Header]`,
|
|
71
|
+
` Page --> Main[Main Content]`,
|
|
72
|
+
` Page --> Footer[Footer]`,
|
|
73
|
+
` Main --> CompA["Component A"]`,
|
|
74
|
+
` Main --> CompB["Component B"]`,
|
|
75
|
+
` CompA --> Store["${framework} State"]`,
|
|
76
|
+
` CompB --> Store`,
|
|
77
|
+
];
|
|
78
|
+
return {
|
|
79
|
+
type: 'component',
|
|
80
|
+
title: `Component Diagram — ${spec.title}`,
|
|
81
|
+
format: 'mermaid',
|
|
82
|
+
content: lines.join('\n'),
|
|
83
|
+
description: 'UI component hierarchy diagram. Customize components to match your design.',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Generate a state machine diagram for transitions.
|
|
88
|
+
*/
|
|
89
|
+
export function generateStateDiagram(spec) {
|
|
90
|
+
const lines = [
|
|
91
|
+
'stateDiagram-v2',
|
|
92
|
+
` [*] --> Initial`,
|
|
93
|
+
` Initial --> Processing: Start`,
|
|
94
|
+
` Processing --> Success: Complete`,
|
|
95
|
+
` Processing --> Error: Fail`,
|
|
96
|
+
` Error --> Processing: Retry`,
|
|
97
|
+
` Success --> [*]`,
|
|
98
|
+
];
|
|
99
|
+
return {
|
|
100
|
+
type: 'state-machine',
|
|
101
|
+
title: `State Machine — ${spec.title}`,
|
|
102
|
+
format: 'mermaid',
|
|
103
|
+
content: lines.join('\n'),
|
|
104
|
+
description: 'State machine diagram showing state transitions. Customize states to match your domain.',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generate an architecture diagram for architectural specs.
|
|
109
|
+
*/
|
|
110
|
+
export function generateArchitectureDiagram(spec, knowledge) {
|
|
111
|
+
const arch = knowledge?.architecture;
|
|
112
|
+
const pattern = arch ? arch.primary : 'layered';
|
|
113
|
+
const externalServices = knowledge?.externalServices ?? [];
|
|
114
|
+
const externalLabel = externalServices.length > 0 ? externalServices.slice(0, 2).join(' / ') : 'External Services';
|
|
115
|
+
const lines = [
|
|
116
|
+
'graph TB',
|
|
117
|
+
` subgraph "${spec.title}"`,
|
|
118
|
+
` direction TB`,
|
|
119
|
+
` Client["Client Layer"]`,
|
|
120
|
+
` API["API Gateway"]`,
|
|
121
|
+
` Service["Service Layer"]`,
|
|
122
|
+
` Data["Data Layer"]`,
|
|
123
|
+
` Client --> API`,
|
|
124
|
+
` API --> Service`,
|
|
125
|
+
` Service --> Data`,
|
|
126
|
+
` end`,
|
|
127
|
+
` External["${externalLabel}"]`,
|
|
128
|
+
` Service --> External`,
|
|
129
|
+
` %% Architecture: ${pattern}`,
|
|
130
|
+
];
|
|
131
|
+
return {
|
|
132
|
+
type: 'architecture',
|
|
133
|
+
title: `Architecture — ${spec.title}`,
|
|
134
|
+
format: 'mermaid',
|
|
135
|
+
content: lines.join('\n'),
|
|
136
|
+
description: `Architecture diagram using ${pattern} pattern. Customize to match your system.`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=diagram-generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagram-generators.js","sourceRoot":"","sources":["../../../src/engine/mermaid/diagram-generators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SpecScope, SpecTarget, ProjectKnowledge, LayerNode } from '../../types/index.js';
|
|
2
|
+
/** Checks if a scope meets or exceeds a threshold in the scope ordering. */
|
|
3
|
+
export declare function isScopeAtLeast(scope: SpecScope, threshold: SpecScope): boolean;
|
|
4
|
+
/** Builds layer nodes for data flow diagrams based on target and knowledge. */
|
|
5
|
+
export declare function buildLayers(target: SpecTarget, knowledge: ProjectKnowledge | null): LayerNode[];
|
|
6
|
+
/** Builds participant nodes for sequence diagrams based on target and knowledge. */
|
|
7
|
+
export declare function buildParticipants(target: SpecTarget, knowledge: ProjectKnowledge | null): LayerNode[];
|
|
8
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/engine/mermaid/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE/F,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAQ9E;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAAE,CA4C/F;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,SAAS,EAAE,CAgBb"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// engine/mermaid/helpers.ts — Shared helpers for mermaid diagram generation.
|
|
2
|
+
// Extracted from mermaid-generator.ts to keep file sizes within limits.
|
|
3
|
+
/** Checks if a scope meets or exceeds a threshold in the scope ordering. */
|
|
4
|
+
export function isScopeAtLeast(scope, threshold) {
|
|
5
|
+
const order = {
|
|
6
|
+
trivial: 0,
|
|
7
|
+
feature: 1,
|
|
8
|
+
'cross-module': 2,
|
|
9
|
+
architectural: 3,
|
|
10
|
+
};
|
|
11
|
+
return order[scope] >= order[threshold];
|
|
12
|
+
}
|
|
13
|
+
/** Builds layer nodes for data flow diagrams based on target and knowledge. */
|
|
14
|
+
export function buildLayers(target, knowledge) {
|
|
15
|
+
// If knowledge has real architecture layers, prefer them over target-inferred ones
|
|
16
|
+
if (knowledge && knowledge.architecture.layers.length > 0) {
|
|
17
|
+
return knowledge.architecture.layers.map((l) => ({
|
|
18
|
+
id: l.name.replace(/[^a-zA-Z0-9]/g, '_'),
|
|
19
|
+
label: l.name,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
const framework = knowledge?.framework ?? '';
|
|
23
|
+
const layers = [];
|
|
24
|
+
if (target === 'frontend' || target === 'fullstack') {
|
|
25
|
+
layers.push({ id: 'Client', label: framework ? `Client (${framework})` : 'Client' });
|
|
26
|
+
}
|
|
27
|
+
if (target !== 'database' && target !== 'infrastructure') {
|
|
28
|
+
layers.push({ id: 'Action', label: 'Action/Controller' });
|
|
29
|
+
layers.push({ id: 'Service', label: 'Service' });
|
|
30
|
+
}
|
|
31
|
+
if (target === 'backend' || target === 'fullstack' || target === 'database') {
|
|
32
|
+
layers.push({ id: 'Repo', label: 'Repository' });
|
|
33
|
+
const dbRaw = knowledge?.database ?? 'DB';
|
|
34
|
+
const db = dbRaw === 'unknown' ? 'DB' : dbRaw;
|
|
35
|
+
layers.push({ id: 'DB', label: db });
|
|
36
|
+
}
|
|
37
|
+
if (target === 'infrastructure') {
|
|
38
|
+
layers.push({ id: 'Infra', label: 'Infrastructure' });
|
|
39
|
+
layers.push({ id: 'Cloud', label: 'Cloud Provider' });
|
|
40
|
+
}
|
|
41
|
+
// Fallback if empty
|
|
42
|
+
if (layers.length === 0) {
|
|
43
|
+
layers.push({ id: 'Input', label: 'Input' }, { id: 'Process', label: 'Process' }, { id: 'Output', label: 'Output' });
|
|
44
|
+
}
|
|
45
|
+
return layers;
|
|
46
|
+
}
|
|
47
|
+
/** Builds participant nodes for sequence diagrams based on target and knowledge. */
|
|
48
|
+
export function buildParticipants(target, knowledge) {
|
|
49
|
+
const participants = [];
|
|
50
|
+
if (target === 'frontend' || target === 'fullstack') {
|
|
51
|
+
participants.push({ id: 'UI', label: 'UI' });
|
|
52
|
+
}
|
|
53
|
+
participants.push({ id: 'API', label: 'API' });
|
|
54
|
+
participants.push({ id: 'SVC', label: 'Service' });
|
|
55
|
+
if (target === 'backend' || target === 'fullstack' || target === 'database') {
|
|
56
|
+
const db = knowledge?.database ?? 'DB';
|
|
57
|
+
participants.push({ id: 'DB', label: db });
|
|
58
|
+
}
|
|
59
|
+
return participants;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/engine/mermaid/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
export { generateDiagrams, generateDataFlowDiagram, formatDiagramsAsMarkdown, } from './mermaid/core.js';
|
|
2
|
+
export { generateErDiagram, generateSequenceDiagram, generateComponentDiagram, generateStateDiagram, generateArchitectureDiagram, } from './mermaid/diagram-generators.js';
|
|
2
3
|
export { generateClassDiagram, generateGanttDiagram, generatePieDiagram, } from './mermaid-extended.js';
|
|
3
|
-
/**
|
|
4
|
-
* Generate all applicable diagrams for a spec based on its scope and context.
|
|
5
|
-
*/
|
|
6
|
-
export declare function generateDiagrams(spec: Spec, knowledge: ProjectKnowledge | null, options: {
|
|
7
|
-
hasDatabase: boolean;
|
|
8
|
-
hasUi: boolean;
|
|
9
|
-
hasTransitions: boolean;
|
|
10
|
-
}): SpecDiagram[];
|
|
11
|
-
/**
|
|
12
|
-
* Generate a data flow diagram: Client -> Action -> Service -> Repo -> DB
|
|
13
|
-
*/
|
|
14
|
-
export declare function generateDataFlowDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
|
|
15
|
-
/**
|
|
16
|
-
* Generate an ER diagram for database changes.
|
|
17
|
-
*/
|
|
18
|
-
export declare function generateErDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
|
|
19
|
-
/**
|
|
20
|
-
* Generate a sequence diagram for cross-module interactions.
|
|
21
|
-
*/
|
|
22
|
-
export declare function generateSequenceDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
|
|
23
|
-
/**
|
|
24
|
-
* Generate a component diagram for UI specs.
|
|
25
|
-
*/
|
|
26
|
-
export declare function generateComponentDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
|
|
27
|
-
/**
|
|
28
|
-
* Generate a state machine diagram for transitions.
|
|
29
|
-
*/
|
|
30
|
-
export declare function generateStateDiagram(spec: Spec): SpecDiagram;
|
|
31
|
-
/**
|
|
32
|
-
* Generate an architecture diagram for architectural specs.
|
|
33
|
-
*/
|
|
34
|
-
export declare function generateArchitectureDiagram(spec: Spec, knowledge: ProjectKnowledge | null): SpecDiagram;
|
|
35
|
-
/**
|
|
36
|
-
* Format diagrams as Mermaid code blocks for inclusion in markdown.
|
|
37
|
-
*/
|
|
38
|
-
export declare function formatDiagramsAsMarkdown(diagrams: SpecDiagram[]): string;
|
|
39
4
|
//# sourceMappingURL=mermaid-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mermaid-generator.d.ts","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"mermaid-generator.d.ts","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,278 +1,6 @@
|
|
|
1
|
-
// Planu — Mermaid Diagram Generator
|
|
2
|
-
//
|
|
1
|
+
// Planu — Mermaid Diagram Generator (facade)
|
|
2
|
+
// Re-exports from mermaid/ subdirectory + mermaid-extended.ts for backward compatibility.
|
|
3
|
+
export { generateDiagrams, generateDataFlowDiagram, formatDiagramsAsMarkdown, } from './mermaid/core.js';
|
|
4
|
+
export { generateErDiagram, generateSequenceDiagram, generateComponentDiagram, generateStateDiagram, generateArchitectureDiagram, } from './mermaid/diagram-generators.js';
|
|
3
5
|
export { generateClassDiagram, generateGanttDiagram, generatePieDiagram, } from './mermaid-extended.js';
|
|
4
|
-
import { generateClassDiagram, generateGanttDiagram, generatePieDiagram, } from './mermaid-extended.js';
|
|
5
|
-
/**
|
|
6
|
-
* Generate all applicable diagrams for a spec based on its scope and context.
|
|
7
|
-
*/
|
|
8
|
-
export function generateDiagrams(spec, knowledge, options) {
|
|
9
|
-
const diagrams = [];
|
|
10
|
-
// Data flow diagram for ALL specs (except trivial)
|
|
11
|
-
if (spec.scope !== 'trivial') {
|
|
12
|
-
diagrams.push(generateDataFlowDiagram(spec, knowledge));
|
|
13
|
-
}
|
|
14
|
-
// ER diagram if database changes
|
|
15
|
-
if (options.hasDatabase) {
|
|
16
|
-
diagrams.push(generateErDiagram(spec, knowledge));
|
|
17
|
-
}
|
|
18
|
-
// Sequence diagram if scope >= cross-module
|
|
19
|
-
if (isScopeAtLeast(spec.scope, 'cross-module')) {
|
|
20
|
-
diagrams.push(generateSequenceDiagram(spec, knowledge));
|
|
21
|
-
}
|
|
22
|
-
// Component diagram if UI
|
|
23
|
-
if (options.hasUi) {
|
|
24
|
-
diagrams.push(generateComponentDiagram(spec, knowledge));
|
|
25
|
-
}
|
|
26
|
-
// State machine diagram if transitions
|
|
27
|
-
if (options.hasTransitions) {
|
|
28
|
-
diagrams.push(generateStateDiagram(spec));
|
|
29
|
-
}
|
|
30
|
-
// Architecture diagram if scope = architectural
|
|
31
|
-
if (spec.scope === 'architectural') {
|
|
32
|
-
diagrams.push(generateArchitectureDiagram(spec, knowledge));
|
|
33
|
-
}
|
|
34
|
-
// Class diagram for cross-module+ backend/shared specs
|
|
35
|
-
if (isScopeAtLeast(spec.scope, 'cross-module') &&
|
|
36
|
-
(spec.target === 'backend' || spec.target === 'shared' || spec.target === 'fullstack')) {
|
|
37
|
-
diagrams.push(generateClassDiagram(spec));
|
|
38
|
-
}
|
|
39
|
-
// Gantt diagram for larger specs (> 8 dev hours)
|
|
40
|
-
if (spec.estimation.devHours > 8) {
|
|
41
|
-
diagrams.push(generateGanttDiagram(spec));
|
|
42
|
-
}
|
|
43
|
-
// Pie chart for effort distribution (always for per-spec reports)
|
|
44
|
-
diagrams.push(generatePieDiagram(spec));
|
|
45
|
-
return diagrams;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Generate a data flow diagram: Client -> Action -> Service -> Repo -> DB
|
|
49
|
-
*/
|
|
50
|
-
export function generateDataFlowDiagram(spec, knowledge) {
|
|
51
|
-
const layers = buildLayers(spec.target, knowledge);
|
|
52
|
-
const lines = ['graph LR'];
|
|
53
|
-
layers.forEach((from, i) => {
|
|
54
|
-
const to = layers[i + 1];
|
|
55
|
-
if (to) {
|
|
56
|
-
lines.push(` ${from.id}[${from.label}] --> ${to.id}[${to.label}]`);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
return {
|
|
60
|
-
type: 'data-flow',
|
|
61
|
-
title: `Data Flow — ${spec.title}`,
|
|
62
|
-
format: 'mermaid',
|
|
63
|
-
content: lines.join('\n'),
|
|
64
|
-
description: 'Data flow diagram showing how data moves through the system layers.',
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Generate an ER diagram for database changes.
|
|
69
|
-
*/
|
|
70
|
-
export function generateErDiagram(spec, knowledge) {
|
|
71
|
-
const dbEngine = knowledge?.database ?? 'unknown';
|
|
72
|
-
const lines = [
|
|
73
|
-
'erDiagram',
|
|
74
|
-
` %% Database: ${dbEngine}`,
|
|
75
|
-
` %% Spec: ${spec.title}`,
|
|
76
|
-
' ENTITY_A {',
|
|
77
|
-
' string id PK',
|
|
78
|
-
' string name',
|
|
79
|
-
' datetime created_at',
|
|
80
|
-
' }',
|
|
81
|
-
' ENTITY_B {',
|
|
82
|
-
' string id PK',
|
|
83
|
-
' string entity_a_id FK',
|
|
84
|
-
' string value',
|
|
85
|
-
' }',
|
|
86
|
-
' ENTITY_A ||--o{ ENTITY_B : "has many"',
|
|
87
|
-
];
|
|
88
|
-
return {
|
|
89
|
-
type: 'er',
|
|
90
|
-
title: `Entity Relationship — ${spec.title}`,
|
|
91
|
-
format: 'mermaid',
|
|
92
|
-
content: lines.join('\n'),
|
|
93
|
-
description: 'Entity-relationship diagram for database schema changes. Customize entities to match your domain.',
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Generate a sequence diagram for cross-module interactions.
|
|
98
|
-
*/
|
|
99
|
-
export function generateSequenceDiagram(spec, knowledge) {
|
|
100
|
-
const participants = buildParticipants(spec.target, knowledge);
|
|
101
|
-
const lines = ['sequenceDiagram'];
|
|
102
|
-
for (const p of participants) {
|
|
103
|
-
lines.push(` participant ${p.id} as ${p.label}`);
|
|
104
|
-
}
|
|
105
|
-
// Generate basic request-response flow
|
|
106
|
-
const first = participants[0];
|
|
107
|
-
const second = participants[1];
|
|
108
|
-
if (first && second) {
|
|
109
|
-
lines.push(` ${first.id}->>+${second.id}: Request`);
|
|
110
|
-
const third = participants[2];
|
|
111
|
-
if (third) {
|
|
112
|
-
lines.push(` ${second.id}->>+${third.id}: Process`);
|
|
113
|
-
lines.push(` ${third.id}-->>-${second.id}: Result`);
|
|
114
|
-
}
|
|
115
|
-
lines.push(` ${second.id}-->>-${first.id}: Response`);
|
|
116
|
-
}
|
|
117
|
-
return {
|
|
118
|
-
type: 'sequence',
|
|
119
|
-
title: `Sequence Diagram — ${spec.title}`,
|
|
120
|
-
format: 'mermaid',
|
|
121
|
-
content: lines.join('\n'),
|
|
122
|
-
description: 'Sequence diagram showing interactions between modules. Customize messages to match your flow.',
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Generate a component diagram for UI specs.
|
|
127
|
-
*/
|
|
128
|
-
export function generateComponentDiagram(spec, knowledge) {
|
|
129
|
-
const framework = knowledge?.framework ?? 'UI';
|
|
130
|
-
const lines = [
|
|
131
|
-
'graph TD',
|
|
132
|
-
` Page["${spec.title} Page"]`,
|
|
133
|
-
` Page --> Header[Header]`,
|
|
134
|
-
` Page --> Main[Main Content]`,
|
|
135
|
-
` Page --> Footer[Footer]`,
|
|
136
|
-
` Main --> CompA["Component A"]`,
|
|
137
|
-
` Main --> CompB["Component B"]`,
|
|
138
|
-
` CompA --> Store["${framework} State"]`,
|
|
139
|
-
` CompB --> Store`,
|
|
140
|
-
];
|
|
141
|
-
return {
|
|
142
|
-
type: 'component',
|
|
143
|
-
title: `Component Diagram — ${spec.title}`,
|
|
144
|
-
format: 'mermaid',
|
|
145
|
-
content: lines.join('\n'),
|
|
146
|
-
description: 'UI component hierarchy diagram. Customize components to match your design.',
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Generate a state machine diagram for transitions.
|
|
151
|
-
*/
|
|
152
|
-
export function generateStateDiagram(spec) {
|
|
153
|
-
const lines = [
|
|
154
|
-
'stateDiagram-v2',
|
|
155
|
-
` [*] --> Initial`,
|
|
156
|
-
` Initial --> Processing: Start`,
|
|
157
|
-
` Processing --> Success: Complete`,
|
|
158
|
-
` Processing --> Error: Fail`,
|
|
159
|
-
` Error --> Processing: Retry`,
|
|
160
|
-
` Success --> [*]`,
|
|
161
|
-
];
|
|
162
|
-
return {
|
|
163
|
-
type: 'state-machine',
|
|
164
|
-
title: `State Machine — ${spec.title}`,
|
|
165
|
-
format: 'mermaid',
|
|
166
|
-
content: lines.join('\n'),
|
|
167
|
-
description: 'State machine diagram showing state transitions. Customize states to match your domain.',
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Generate an architecture diagram for architectural specs.
|
|
172
|
-
*/
|
|
173
|
-
export function generateArchitectureDiagram(spec, knowledge) {
|
|
174
|
-
const arch = knowledge?.architecture;
|
|
175
|
-
const pattern = arch ? arch.primary : 'layered';
|
|
176
|
-
const externalServices = knowledge?.externalServices ?? [];
|
|
177
|
-
const externalLabel = externalServices.length > 0 ? externalServices.slice(0, 2).join(' / ') : 'External Services';
|
|
178
|
-
const lines = [
|
|
179
|
-
'graph TB',
|
|
180
|
-
` subgraph "${spec.title}"`,
|
|
181
|
-
` direction TB`,
|
|
182
|
-
` Client["Client Layer"]`,
|
|
183
|
-
` API["API Gateway"]`,
|
|
184
|
-
` Service["Service Layer"]`,
|
|
185
|
-
` Data["Data Layer"]`,
|
|
186
|
-
` Client --> API`,
|
|
187
|
-
` API --> Service`,
|
|
188
|
-
` Service --> Data`,
|
|
189
|
-
` end`,
|
|
190
|
-
` External["${externalLabel}"]`,
|
|
191
|
-
` Service --> External`,
|
|
192
|
-
` %% Architecture: ${pattern}`,
|
|
193
|
-
];
|
|
194
|
-
return {
|
|
195
|
-
type: 'architecture',
|
|
196
|
-
title: `Architecture — ${spec.title}`,
|
|
197
|
-
format: 'mermaid',
|
|
198
|
-
content: lines.join('\n'),
|
|
199
|
-
description: `Architecture diagram using ${pattern} pattern. Customize to match your system.`,
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Format diagrams as Mermaid code blocks for inclusion in markdown.
|
|
204
|
-
*/
|
|
205
|
-
export function formatDiagramsAsMarkdown(diagrams) {
|
|
206
|
-
if (diagrams.length === 0) {
|
|
207
|
-
return '';
|
|
208
|
-
}
|
|
209
|
-
const sections = [];
|
|
210
|
-
for (const diagram of diagrams) {
|
|
211
|
-
sections.push(`### ${diagram.title}`);
|
|
212
|
-
sections.push('');
|
|
213
|
-
sections.push(`> ${diagram.description}`);
|
|
214
|
-
sections.push('');
|
|
215
|
-
sections.push('```mermaid');
|
|
216
|
-
sections.push(diagram.content);
|
|
217
|
-
sections.push('```');
|
|
218
|
-
sections.push('');
|
|
219
|
-
}
|
|
220
|
-
return sections.join('\n');
|
|
221
|
-
}
|
|
222
|
-
// === Internal helpers ===
|
|
223
|
-
function isScopeAtLeast(scope, threshold) {
|
|
224
|
-
const order = {
|
|
225
|
-
trivial: 0,
|
|
226
|
-
feature: 1,
|
|
227
|
-
'cross-module': 2,
|
|
228
|
-
architectural: 3,
|
|
229
|
-
};
|
|
230
|
-
return order[scope] >= order[threshold];
|
|
231
|
-
}
|
|
232
|
-
function buildLayers(target, knowledge) {
|
|
233
|
-
// If knowledge has real architecture layers, prefer them over target-inferred ones
|
|
234
|
-
if (knowledge && knowledge.architecture.layers.length > 0) {
|
|
235
|
-
return knowledge.architecture.layers.map((l) => ({
|
|
236
|
-
id: l.name.replace(/[^a-zA-Z0-9]/g, '_'),
|
|
237
|
-
label: l.name,
|
|
238
|
-
}));
|
|
239
|
-
}
|
|
240
|
-
const framework = knowledge?.framework ?? '';
|
|
241
|
-
const layers = [];
|
|
242
|
-
if (target === 'frontend' || target === 'fullstack') {
|
|
243
|
-
layers.push({ id: 'Client', label: framework ? `Client (${framework})` : 'Client' });
|
|
244
|
-
}
|
|
245
|
-
if (target !== 'database' && target !== 'infrastructure') {
|
|
246
|
-
layers.push({ id: 'Action', label: 'Action/Controller' });
|
|
247
|
-
layers.push({ id: 'Service', label: 'Service' });
|
|
248
|
-
}
|
|
249
|
-
if (target === 'backend' || target === 'fullstack' || target === 'database') {
|
|
250
|
-
layers.push({ id: 'Repo', label: 'Repository' });
|
|
251
|
-
const dbRaw = knowledge?.database ?? 'DB';
|
|
252
|
-
const db = dbRaw === 'unknown' ? 'DB' : dbRaw;
|
|
253
|
-
layers.push({ id: 'DB', label: db });
|
|
254
|
-
}
|
|
255
|
-
if (target === 'infrastructure') {
|
|
256
|
-
layers.push({ id: 'Infra', label: 'Infrastructure' });
|
|
257
|
-
layers.push({ id: 'Cloud', label: 'Cloud Provider' });
|
|
258
|
-
}
|
|
259
|
-
// Fallback if empty
|
|
260
|
-
if (layers.length === 0) {
|
|
261
|
-
layers.push({ id: 'Input', label: 'Input' }, { id: 'Process', label: 'Process' }, { id: 'Output', label: 'Output' });
|
|
262
|
-
}
|
|
263
|
-
return layers;
|
|
264
|
-
}
|
|
265
|
-
function buildParticipants(target, knowledge) {
|
|
266
|
-
const participants = [];
|
|
267
|
-
if (target === 'frontend' || target === 'fullstack') {
|
|
268
|
-
participants.push({ id: 'UI', label: 'UI' });
|
|
269
|
-
}
|
|
270
|
-
participants.push({ id: 'API', label: 'API' });
|
|
271
|
-
participants.push({ id: 'SVC', label: 'Service' });
|
|
272
|
-
if (target === 'backend' || target === 'fullstack' || target === 'database') {
|
|
273
|
-
const db = knowledge?.database ?? 'DB';
|
|
274
|
-
participants.push({ id: 'DB', label: db });
|
|
275
|
-
}
|
|
276
|
-
return participants;
|
|
277
|
-
}
|
|
278
6
|
//# sourceMappingURL=mermaid-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mermaid-generator.js","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"mermaid-generator.js","sourceRoot":"","sources":["../../src/engine/mermaid-generator.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,0FAA0F;AAE1F,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ComplexitySignals, NormalisedSignals, PartialSignals } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract complexity signals from a text description (spec content or task description).
|
|
4
|
+
* Missing signals are filled with sensible defaults.
|
|
5
|
+
*/
|
|
6
|
+
export declare function extractSignals(text: string, overrides?: PartialSignals): ComplexitySignals;
|
|
7
|
+
/** Build signals entirely from an explicit partial object (no text analysis). */
|
|
8
|
+
export declare function buildSignalsFromPartial(partial: PartialSignals): ComplexitySignals;
|
|
9
|
+
/** Normalise raw numeric signals to the 0-1 range. */
|
|
10
|
+
export declare function normaliseSignals(raw: {
|
|
11
|
+
criteriaCount: number;
|
|
12
|
+
fileCount: number;
|
|
13
|
+
dependencyDepth: number;
|
|
14
|
+
crossLayerCount: number;
|
|
15
|
+
estimatedHours: number;
|
|
16
|
+
hasNewTypes: boolean;
|
|
17
|
+
hasDBChanges: boolean;
|
|
18
|
+
hasSecurityImplications: boolean;
|
|
19
|
+
isReadOnly: boolean;
|
|
20
|
+
}): NormalisedSignals;
|
|
21
|
+
/**
|
|
22
|
+
* Compute a weighted overall complexity score (0-1) from normalised signals.
|
|
23
|
+
* Higher = more complex.
|
|
24
|
+
*/
|
|
25
|
+
export declare function computeOverallScore(n: NormalisedSignals): number;
|
|
26
|
+
//# sourceMappingURL=complexity-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAiK9B;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,iBAAiB,CAO1F;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAElF;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,iBAAiB,CAYpB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAmBhE"}
|