@planu/cli 0.27.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/config/tool-groups.json +140 -0
- package/dist/engine/ai-cost-estimator/core.d.ts +1 -1
- package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -1
- package/dist/engine/ai-cost-estimator/core.js +3 -167
- 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/focus-tracker.d.ts.map +1 -1
- package/dist/engine/focus-tracker.js +1 -0
- package/dist/engine/focus-tracker.js.map +1 -1
- 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/planu-config-writer.d.ts +2 -2
- package/dist/engine/planu-config-writer.d.ts.map +1 -1
- package/dist/engine/planu-config-writer.js +4 -6
- package/dist/engine/planu-config-writer.js.map +1 -1
- 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-migrator.d.ts +17 -0
- package/dist/engine/spec-migrator.d.ts.map +1 -0
- package/dist/engine/spec-migrator.js +119 -0
- package/dist/engine/spec-migrator.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/tool-groups/context-analyzer.d.ts +11 -0
- package/dist/engine/tool-groups/context-analyzer.d.ts.map +1 -0
- package/dist/engine/tool-groups/context-analyzer.js +40 -0
- package/dist/engine/tool-groups/context-analyzer.js.map +1 -0
- package/dist/engine/tool-groups/group-manager.d.ts +35 -0
- package/dist/engine/tool-groups/group-manager.d.ts.map +1 -0
- package/dist/engine/tool-groups/group-manager.js +201 -0
- package/dist/engine/tool-groups/group-manager.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/engine/web-fetcher/registry-loader.d.ts.map +1 -1
- package/dist/engine/web-fetcher/registry-loader.js +2 -0
- package/dist/engine/web-fetcher/registry-loader.js.map +1 -1
- package/dist/index.js +19 -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/data-governance/audit-handler.d.ts.map +1 -1
- package/dist/tools/data-governance/audit-handler.js +1 -0
- package/dist/tools/data-governance/audit-handler.js.map +1 -1
- package/dist/tools/design-schema.d.ts.map +1 -1
- package/dist/tools/design-schema.js +1 -0
- package/dist/tools/design-schema.js.map +1 -1
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +48 -14
- package/dist/tools/init-project/handler.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-ai-cost-tools.js +1 -1
- package/dist/tools/register-ai-cost-tools.js.map +1 -1
- 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-spec-tools/core-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.js +0 -4
- package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
- package/dist/tools/register-tool-groups.d.ts +7 -0
- package/dist/tools/register-tool-groups.d.ts.map +1 -0
- package/dist/tools/register-tool-groups.js +39 -0
- package/dist/tools/register-tool-groups.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/suggest-tooling/orchestration-generator.js +1 -1
- package/dist/tools/suggest-tooling/orchestration-generator.js.map +1 -1
- package/dist/tools/tool-group-handler.d.ts +9 -0
- package/dist/tools/tool-group-handler.d.ts.map +1 -0
- package/dist/tools/tool-group-handler.js +82 -0
- package/dist/tools/tool-group-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 +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -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/project/inputs.d.ts +0 -1
- package/dist/types/project/inputs.d.ts.map +1 -1
- 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 +9 -6
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/dist/types/tool-groups.d.ts +57 -0
- package/dist/types/tool-groups.d.ts.map +1 -0
- package/dist/types/tool-groups.js +3 -0
- package/dist/types/tool-groups.js.map +1 -0
- 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
- package/src/config/tool-groups.json +140 -0
|
@@ -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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// engine/model-router/complexity-analyzer.ts — Extract and normalise complexity signals.
|
|
2
|
+
// SPEC-076 AC-01
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Normalisation ceilings (signals are clamped to 0-1 using these maximums)
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const MAX_CRITERIA = 40;
|
|
7
|
+
const MAX_FILES = 30;
|
|
8
|
+
const MAX_DEPTH = 6;
|
|
9
|
+
const MAX_CROSS_LAYER = 5;
|
|
10
|
+
const MAX_HOURS = 80;
|
|
11
|
+
/** Clamp a value into [0, 1] by dividing by its ceiling. */
|
|
12
|
+
function norm(value, ceiling) {
|
|
13
|
+
if (ceiling <= 0) {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
return Math.min(Math.max(value / ceiling, 0), 1);
|
|
17
|
+
}
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Signal extraction from text
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
const TASK_KEYWORDS = {
|
|
22
|
+
search: ['search', 'find', 'explore', 'list', 'read', 'summarize', 'grep'],
|
|
23
|
+
generation: ['generate', 'create', 'implement', 'write', 'build', 'add', 'scaffold'],
|
|
24
|
+
architecture: ['architect', 'design', 'restructure', 'system', 'plan', 'rfc'],
|
|
25
|
+
debugging: ['debug', 'fix', 'investigate', 'trace', 'diagnose', 'bug', 'error'],
|
|
26
|
+
refactor: ['refactor', 'rename', 'extract', 'simplify', 'clean', 'reorganize', 'move'],
|
|
27
|
+
};
|
|
28
|
+
const SECURITY_KEYWORDS = [
|
|
29
|
+
'security',
|
|
30
|
+
'auth',
|
|
31
|
+
'permission',
|
|
32
|
+
'rbac',
|
|
33
|
+
'encryption',
|
|
34
|
+
'token',
|
|
35
|
+
'jwt',
|
|
36
|
+
'cors',
|
|
37
|
+
'csrf',
|
|
38
|
+
'xss',
|
|
39
|
+
'injection',
|
|
40
|
+
'sanitize',
|
|
41
|
+
'pii',
|
|
42
|
+
'gdpr',
|
|
43
|
+
];
|
|
44
|
+
const DB_KEYWORDS = [
|
|
45
|
+
'database',
|
|
46
|
+
'migration',
|
|
47
|
+
'schema',
|
|
48
|
+
'table',
|
|
49
|
+
'column',
|
|
50
|
+
'index',
|
|
51
|
+
'query',
|
|
52
|
+
'sql',
|
|
53
|
+
'postgres',
|
|
54
|
+
'mysql',
|
|
55
|
+
'mongo',
|
|
56
|
+
'redis',
|
|
57
|
+
'prisma',
|
|
58
|
+
'drizzle',
|
|
59
|
+
];
|
|
60
|
+
/** Infer a TaskType from a text description. */
|
|
61
|
+
function inferTaskType(text) {
|
|
62
|
+
const lower = text.toLowerCase();
|
|
63
|
+
let bestType = 'generation';
|
|
64
|
+
let bestScore = 0;
|
|
65
|
+
for (const [type, keywords] of Object.entries(TASK_KEYWORDS)) {
|
|
66
|
+
const score = keywords.filter((kw) => lower.includes(kw)).length;
|
|
67
|
+
if (score > bestScore) {
|
|
68
|
+
bestScore = score;
|
|
69
|
+
bestType = type;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return bestType;
|
|
73
|
+
}
|
|
74
|
+
/** Count how many keywords from a list appear in a text. */
|
|
75
|
+
function keywordHits(text, keywords) {
|
|
76
|
+
const lower = text.toLowerCase();
|
|
77
|
+
return keywords.filter((kw) => lower.includes(kw)).length;
|
|
78
|
+
}
|
|
79
|
+
/** Count acceptance criteria by looking for AC- or numbered list patterns. */
|
|
80
|
+
function countCriteria(text) {
|
|
81
|
+
const acMatches = text.match(/\bAC-\d+/g);
|
|
82
|
+
if (acMatches) {
|
|
83
|
+
return acMatches.length;
|
|
84
|
+
}
|
|
85
|
+
// Fallback: count markdown list items that look like criteria
|
|
86
|
+
const listItems = text.match(/^[-*]\s+/gm);
|
|
87
|
+
return listItems ? Math.ceil(listItems.length / 2) : 0;
|
|
88
|
+
}
|
|
89
|
+
/** Estimate file count from technical sheet patterns. */
|
|
90
|
+
function countFiles(text) {
|
|
91
|
+
const fileRefs = text.match(/`[^`]+\.(ts|js|json|md|tsx|jsx|py|go|rs)`/g);
|
|
92
|
+
return fileRefs ? fileRefs.length : 0;
|
|
93
|
+
}
|
|
94
|
+
/** Count distinct architectural layers referenced. */
|
|
95
|
+
function countLayers(text) {
|
|
96
|
+
const layers = ['types/', 'engine/', 'tools/', 'storage/', 'config/', 'resources/'];
|
|
97
|
+
return layers.filter((l) => text.includes(l)).length;
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Internal helpers to reduce extractSignals complexity
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
/** Extract boolean and categorical signals from text, applying overrides. */
|
|
103
|
+
function extractQualitativeSignals(text, overrides) {
|
|
104
|
+
return {
|
|
105
|
+
hasNewTypes: overrides?.hasNewTypes ?? text.includes('types/'),
|
|
106
|
+
hasDBChanges: overrides?.hasDBChanges ?? keywordHits(text, DB_KEYWORDS) >= 2,
|
|
107
|
+
hasSecurityImplications: overrides?.hasSecurityImplications ?? keywordHits(text, SECURITY_KEYWORDS) >= 2,
|
|
108
|
+
isReadOnly: overrides?.isReadOnly ?? false,
|
|
109
|
+
taskType: overrides?.taskType ?? inferTaskType(text),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Extract raw signal values from text, applying overrides. */
|
|
113
|
+
function extractRawSignals(text, overrides) {
|
|
114
|
+
const criteriaCount = overrides?.criteriaCount ?? countCriteria(text);
|
|
115
|
+
const fileCount = overrides?.fileCount ?? countFiles(text);
|
|
116
|
+
const crossLayerCount = overrides?.crossLayerCount ?? countLayers(text);
|
|
117
|
+
const dependencyDepth = overrides?.dependencyDepth ?? Math.min(crossLayerCount, MAX_DEPTH);
|
|
118
|
+
const estimatedHours = overrides?.estimatedHours ?? criteriaCount * 0.5;
|
|
119
|
+
const qualitative = extractQualitativeSignals(text, overrides);
|
|
120
|
+
return {
|
|
121
|
+
criteriaCount,
|
|
122
|
+
fileCount,
|
|
123
|
+
dependencyDepth,
|
|
124
|
+
crossLayerCount,
|
|
125
|
+
estimatedHours,
|
|
126
|
+
...qualitative,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Public API
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
/**
|
|
133
|
+
* Extract complexity signals from a text description (spec content or task description).
|
|
134
|
+
* Missing signals are filled with sensible defaults.
|
|
135
|
+
*/
|
|
136
|
+
export function extractSignals(text, overrides) {
|
|
137
|
+
const raw = extractRawSignals(text, overrides);
|
|
138
|
+
const normalised = normaliseSignals(raw);
|
|
139
|
+
const overallScore = computeOverallScore(normalised);
|
|
140
|
+
return { ...raw, overallScore };
|
|
141
|
+
}
|
|
142
|
+
/** Build signals entirely from an explicit partial object (no text analysis). */
|
|
143
|
+
export function buildSignalsFromPartial(partial) {
|
|
144
|
+
return extractSignals('', partial);
|
|
145
|
+
}
|
|
146
|
+
/** Normalise raw numeric signals to the 0-1 range. */
|
|
147
|
+
export function normaliseSignals(raw) {
|
|
148
|
+
return {
|
|
149
|
+
criteriaCount: norm(raw.criteriaCount, MAX_CRITERIA),
|
|
150
|
+
fileCount: norm(raw.fileCount, MAX_FILES),
|
|
151
|
+
dependencyDepth: norm(raw.dependencyDepth, MAX_DEPTH),
|
|
152
|
+
crossLayerCount: norm(raw.crossLayerCount, MAX_CROSS_LAYER),
|
|
153
|
+
estimatedHours: norm(raw.estimatedHours, MAX_HOURS),
|
|
154
|
+
hasNewTypes: raw.hasNewTypes ? 1 : 0,
|
|
155
|
+
hasDBChanges: raw.hasDBChanges ? 1 : 0,
|
|
156
|
+
hasSecurityImplications: raw.hasSecurityImplications ? 1 : 0,
|
|
157
|
+
isReadOnly: raw.isReadOnly ? 1 : 0,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Compute a weighted overall complexity score (0-1) from normalised signals.
|
|
162
|
+
* Higher = more complex.
|
|
163
|
+
*/
|
|
164
|
+
export function computeOverallScore(n) {
|
|
165
|
+
const weights = {
|
|
166
|
+
criteriaCount: 0.25,
|
|
167
|
+
fileCount: 0.15,
|
|
168
|
+
dependencyDepth: 0.1,
|
|
169
|
+
crossLayerCount: 0.15,
|
|
170
|
+
estimatedHours: 0.1,
|
|
171
|
+
hasNewTypes: 0.05,
|
|
172
|
+
hasDBChanges: 0.05,
|
|
173
|
+
hasSecurityImplications: 0.1,
|
|
174
|
+
isReadOnly: -0.05, // read-only reduces complexity
|
|
175
|
+
};
|
|
176
|
+
let score = 0;
|
|
177
|
+
for (const [key, weight] of Object.entries(weights)) {
|
|
178
|
+
score += n[key] * weight;
|
|
179
|
+
}
|
|
180
|
+
return Math.min(Math.max(score, 0), 1);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=complexity-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-analyzer.js","sourceRoot":"","sources":["../../../src/engine/model-router/complexity-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ComplexitySignals, CostEstimate, ModelTier } from '../../types/index.js';
|
|
2
|
+
/** Calculate the cost estimate for a given model tier and complexity signals. */
|
|
3
|
+
export declare function calculateCost(tier: ModelTier, signals: ComplexitySignals): CostEstimate;
|
|
4
|
+
/** Calculate costs for all three tiers so the user can compare. */
|
|
5
|
+
export declare function calculateAllTierCosts(signals: ComplexitySignals): Record<ModelTier, CostEstimate>;
|
|
6
|
+
//# sourceMappingURL=cost-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.d.ts","sourceRoot":"","sources":["../../../src/engine/model-router/cost-estimator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,SAAS,EAEV,MAAM,sBAAsB,CAAC;AAkD9B,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,GAAG,YAAY,CAYvF;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAMjG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// engine/model-router/cost-estimator.ts — Token and USD cost estimation per model tier.
|
|
2
|
+
// SPEC-076 AC-04
|
|
3
|
+
import pricingJson from '../../config/ai-model-pricing.json' with { type: 'json' };
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Pricing lookup
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
const MODEL_IDS = {
|
|
8
|
+
haiku: 'claude-haiku-3-5',
|
|
9
|
+
sonnet: 'claude-sonnet-4',
|
|
10
|
+
opus: 'claude-opus-4',
|
|
11
|
+
};
|
|
12
|
+
function getPricing(tier) {
|
|
13
|
+
const modelId = MODEL_IDS[tier];
|
|
14
|
+
const entry = pricingJson.models.find((m) => m.id === modelId);
|
|
15
|
+
/* c8 ignore next 3 */
|
|
16
|
+
if (!entry) {
|
|
17
|
+
return { id: modelId, inputPricePerMillion: 3, outputPricePerMillion: 15 };
|
|
18
|
+
}
|
|
19
|
+
return entry;
|
|
20
|
+
}
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Token estimation heuristic
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/** Base token estimates per complexity range (overall score brackets). */
|
|
25
|
+
function estimateTokens(signals) {
|
|
26
|
+
const score = signals.overallScore;
|
|
27
|
+
// Read-only tasks consume less output
|
|
28
|
+
const outputMultiplier = signals.isReadOnly ? 0.3 : 1;
|
|
29
|
+
if (score < 0.3) {
|
|
30
|
+
return { input: 2_000, output: Math.round(1_000 * outputMultiplier) };
|
|
31
|
+
}
|
|
32
|
+
if (score < 0.6) {
|
|
33
|
+
return { input: 8_000, output: Math.round(5_000 * outputMultiplier) };
|
|
34
|
+
}
|
|
35
|
+
return { input: 20_000, output: Math.round(15_000 * outputMultiplier) };
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Public API
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/** Calculate the cost estimate for a given model tier and complexity signals. */
|
|
41
|
+
export function calculateCost(tier, signals) {
|
|
42
|
+
const pricing = getPricing(tier);
|
|
43
|
+
const tokens = estimateTokens(signals);
|
|
44
|
+
const inputCost = (tokens.input / 1_000_000) * pricing.inputPricePerMillion;
|
|
45
|
+
const outputCost = (tokens.output / 1_000_000) * pricing.outputPricePerMillion;
|
|
46
|
+
return {
|
|
47
|
+
estimatedTokens: tokens.input + tokens.output,
|
|
48
|
+
estimatedUSD: Math.round((inputCost + outputCost) * 10_000) / 10_000,
|
|
49
|
+
breakdown: { input: tokens.input, output: tokens.output },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Calculate costs for all three tiers so the user can compare. */
|
|
53
|
+
export function calculateAllTierCosts(signals) {
|
|
54
|
+
return {
|
|
55
|
+
haiku: calculateCost('haiku', signals),
|
|
56
|
+
sonnet: calculateCost('sonnet', signals),
|
|
57
|
+
opus: calculateCost('opus', signals),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=cost-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-estimator.js","sourceRoot":"","sources":["../../../src/engine/model-router/cost-estimator.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,iBAAiB;AASjB,OAAO,WAAW,MAAM,oCAAoC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEnF,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,SAAS,GAA8B;IAC3C,KAAK,EAAE,kBAAkB;IACzB,MAAM,EAAE,iBAAiB;IACzB,IAAI,EAAE,eAAe;CACtB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAe;IACjC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAI,WAAW,CAAC,MAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAEnF,sBAAsB;IACtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,qBAAqB,EAAE,EAAE,EAAE,CAAC;IAC7E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,0EAA0E;AAC1E,SAAS,cAAc,CAAC,OAA0B;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAEnC,sCAAsC;IACtC,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,IAAe,EAAE,OAA0B;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAC5E,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAE/E,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM;QAC7C,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM;QACpE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;KAC1D,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,qBAAqB,CAAC,OAA0B;IAC9D,OAAO;QACL,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC;QACtC,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC;QACxC,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC;KACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { HistoricalAdjustment, ModelOutcome, ModelTier } from '../../types/index.js';
|
|
2
|
+
/** Record a model outcome for future learning. */
|
|
3
|
+
export declare function recordOutcome(outcome: ModelOutcome): void;
|
|
4
|
+
/** Get all recorded outcomes (for testing / export). */
|
|
5
|
+
export declare function getOutcomes(): readonly ModelOutcome[];
|
|
6
|
+
/** Clear all outcomes (for testing). */
|
|
7
|
+
export declare function clearOutcomes(): void;
|
|
8
|
+
/** Load outcomes from an external source (e.g. JSON file). */
|
|
9
|
+
export declare function loadOutcomes(loaded: ModelOutcome[]): void;
|
|
10
|
+
/**
|
|
11
|
+
* Find outcomes whose taskSignature matches the given signature.
|
|
12
|
+
* Uses exact match for now; vector similarity can be added later (SPEC-075).
|
|
13
|
+
*/
|
|
14
|
+
export declare function findSimilarOutcomes(taskSignature: string): ModelOutcome[];
|
|
15
|
+
/**
|
|
16
|
+
* Compute a task signature from a description or spec ID.
|
|
17
|
+
* For now this is a simple normalisation; in the future it can use embeddings.
|
|
18
|
+
*/
|
|
19
|
+
export declare function computeTaskSignature(text: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Given the rules engine recommendation and a task signature,
|
|
22
|
+
* adjust the tier based on historical outcomes.
|
|
23
|
+
* Maximum adjustment: plus or minus 1 tier.
|
|
24
|
+
*/
|
|
25
|
+
export declare function adjustFromHistory(recommendedModel: ModelTier, taskSignature: string): HistoricalAdjustment;
|
|
26
|
+
//# sourceMappingURL=historical-learner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historical-learner.d.ts","sourceRoot":"","sources":["../../../src/engine/model-router/historical-learner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAuB1F,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAEzD;AAED,wDAAwD;AACxD,wBAAgB,WAAW,IAAI,SAAS,YAAY,EAAE,CAErD;AAED,wCAAwC;AACxC,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,EAAE,CAEzE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,gBAAgB,EAAE,SAAS,EAC3B,aAAa,EAAE,MAAM,GACpB,oBAAoB,CA6CtB"}
|