@polymorphism-tech/morph-spec 2.2.0 → 2.4.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/CLAUDE.md +314 -1673
- package/LICENSE +72 -72
- package/README.md +515 -516
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +358 -173
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/task-manager.js +429 -0
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/bin/validate.js +369 -0
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-apply.md +221 -158
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -0
- package/content/.claude/commands/morph-proposal.md +122 -101
- package/content/.claude/commands/morph-status.md +86 -86
- package/content/.claude/commands/morph-troubleshoot.md +122 -0
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/checklists/code-review.md +226 -0
- package/content/.claude/skills/checklists/morph-checklist.md +117 -0
- package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
- package/content/.claude/skills/infra/bicep-architect.md +126 -419
- package/content/.claude/skills/infra/container-specialist.md +131 -437
- package/content/.claude/skills/infra/devops-engineer.md +119 -405
- package/content/.claude/skills/integrations/asaas-financial.md +130 -333
- package/content/.claude/skills/integrations/azure-identity.md +142 -309
- package/content/.claude/skills/integrations/clerk-auth.md +108 -290
- package/content/.claude/skills/integrations/resend-email.md +119 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
- package/content/.claude/skills/specialists/azure-architect.md +142 -142
- package/content/.claude/skills/specialists/code-analyzer.md +235 -0
- package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
- package/content/.claude/skills/specialists/ef-modeler.md +113 -200
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
- package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
- package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
- package/content/.claude/skills/specialists/standards-architect.md +156 -78
- package/content/.claude/skills/specialists/testing-specialist.md +126 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
- package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
- package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
- package/content/.claude/skills/workflows/morph-replicate.md +213 -0
- package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
- package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
- package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
- package/content/.claude/skills/workflows/phase-tasks.md +164 -0
- package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +378 -242
- package/content/.morph/config/config.template.json +89 -108
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/design-impl.md +37 -0
- package/content/.morph/docs/workflows/fast-track.md +29 -0
- package/content/.morph/docs/workflows/full-morph.md +76 -0
- package/content/.morph/docs/workflows/standard.md +44 -0
- package/content/.morph/docs/workflows/ui-refresh.md +39 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
- package/content/.morph/examples/scheduled-reports/spec.md +267 -0
- package/content/.morph/examples/state-v3.json +188 -0
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +190 -239
- package/content/.morph/hooks/pre-commit-agents.sh +24 -24
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -0
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
- package/content/.morph/standards/agent-framework-production.md +410 -0
- package/content/.morph/standards/agent-framework-setup.md +413 -453
- package/content/.morph/standards/agent-framework-workflows.md +349 -0
- package/content/.morph/standards/architecture.md +325 -325
- package/content/.morph/standards/azure.md +605 -379
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/dotnet10-migration.md +520 -494
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/agent.cs +163 -172
- package/content/.morph/templates/clarify-questions.md +159 -0
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -0
- package/content/.morph/templates/contracts/Entities.cs +25 -0
- package/content/.morph/templates/contracts/Queries.cs +74 -0
- package/content/.morph/templates/contracts/README.md +74 -0
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/decisions.md +123 -106
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/proposal.md +141 -155
- package/content/.morph/templates/recap.md +94 -105
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/simulation.md +353 -0
- package/content/.morph/templates/spec.md +149 -148
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/state.template.json +222 -222
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/tasks.md +257 -235
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-components.md +362 -276
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/CLAUDE.md +150 -442
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/detectors/structure-detector.js +245 -250
- package/docs/README.md +144 -149
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/getting-started.md +301 -302
- package/docs/installation.md +361 -361
- package/docs/templates.md +418 -418
- package/docs/validation-checklist.md +265 -266
- package/package.json +80 -80
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +183 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -0
- package/src/commands/create-story.js +351 -351
- package/src/commands/detect-agents.js +139 -0
- package/src/commands/detect.js +104 -104
- package/src/commands/doctor.js +356 -280
- package/src/commands/generate.js +149 -149
- package/src/commands/init.js +258 -245
- package/src/commands/lint-fluent.js +352 -0
- package/src/commands/rollback-phase.js +185 -0
- package/src/commands/session-summary.js +291 -0
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/task.js +78 -0
- package/src/commands/troubleshoot.js +222 -0
- package/src/commands/update.js +192 -159
- package/src/commands/validate-blazor-state.js +210 -0
- package/src/commands/validate-blazor.js +156 -0
- package/src/commands/validate-css.js +84 -0
- package/src/commands/validate-phase.js +221 -0
- package/src/lib/blazor-concurrency-analyzer.js +288 -0
- package/src/lib/blazor-state-validator.js +291 -0
- package/src/lib/blazor-validator.js +374 -0
- package/src/lib/complexity-analyzer.js +441 -292
- package/src/lib/continuous-validator.js +421 -0
- package/src/lib/css-validator.js +352 -0
- package/src/lib/decision-constraint-loader.js +109 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/learning-system.js +520 -0
- package/src/lib/mockup-generator.js +366 -0
- package/src/lib/recap-generator.js +205 -0
- package/src/lib/state-manager.js +397 -340
- package/src/lib/troubleshoot-grep.js +194 -0
- package/src/lib/troubleshoot-index.js +144 -0
- package/src/lib/ui-detector.js +350 -0
- package/src/lib/validation-runner.js +231 -0
- package/src/lib/validators/architecture-validator.js +387 -0
- package/src/lib/validators/contract-compliance-validator.js +273 -0
- package/src/lib/validators/package-validator.js +360 -0
- package/src/lib/validators/ui-contrast-validator.js +422 -0
- package/src/utils/file-copier.js +179 -139
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- package/content/.claude/commands/morph-costs.md +0 -206
- package/content/.claude/commands/morph-tasks.md +0 -319
- package/content/.claude/skills/specialists/cost-guardian.md +0 -110
- package/content/.claude/skills/stacks/shopify.md +0 -445
- package/content/.morph/config/azure-pricing.json +0 -70
- package/content/.morph/config/azure-pricing.schema.json +0 -50
- package/content/.morph/hooks/pre-commit-costs.sh +0 -91
- package/docs/api/cost-calculator.js.html +0 -513
- package/docs/api/design-system-generator.js.html +0 -382
- package/docs/api/global.html +0 -5263
- package/docs/api/index.html +0 -96
- package/docs/api/state-manager.js.html +0 -423
- package/src/commands/cost.js +0 -181
- package/src/commands/update-pricing.js +0 -206
- package/src/lib/cost-calculator.js +0 -429
|
@@ -1,292 +1,441 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MORPH-SPEC Complexity Analyzer Library
|
|
3
|
-
*
|
|
4
|
-
* Analyzes user requests and classifies them into workflows:
|
|
5
|
-
* - fast-track: Trivial changes (bug fixes, small adjustments)
|
|
6
|
-
* - standard: Medium features (simple additions, improvements)
|
|
7
|
-
* - full-morph: Complex features (new subsystems, architecture)
|
|
8
|
-
*
|
|
9
|
-
* Used both by CLI commands and internal automation.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// COMPLEXITY THRESHOLDS
|
|
14
|
-
// ============================================================================
|
|
15
|
-
|
|
16
|
-
export const COMPLEXITY_THRESHOLDS = {
|
|
17
|
-
'fast-track': {
|
|
18
|
-
maxFiles: 3,
|
|
19
|
-
maxLines: 50,
|
|
20
|
-
maxComponents: 0,
|
|
21
|
-
requiresInfrastructure: false,
|
|
22
|
-
requiresArchitecturalDecisions: false,
|
|
23
|
-
description: 'Bug fixes, small adjustments, edge cases, hotfixes'
|
|
24
|
-
},
|
|
25
|
-
'standard': {
|
|
26
|
-
maxFiles: 10,
|
|
27
|
-
maxLines: 500,
|
|
28
|
-
maxComponents: 2,
|
|
29
|
-
requiresInfrastructure: false,
|
|
30
|
-
requiresArchitecturalDecisions: false, // Only tactical decisions
|
|
31
|
-
description: 'Simple features, refactorings, incremental improvements'
|
|
32
|
-
},
|
|
33
|
-
'full-morph': {
|
|
34
|
-
maxFiles: Infinity,
|
|
35
|
-
maxLines: Infinity,
|
|
36
|
-
maxComponents: Infinity,
|
|
37
|
-
requiresInfrastructure: true, // Can have infrastructure
|
|
38
|
-
requiresArchitecturalDecisions: true, // Strategic decisions
|
|
39
|
-
description: 'Complex features, new subsystems, architectural changes'
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
// ============================================================================
|
|
44
|
-
// KEYWORD DETECTION
|
|
45
|
-
// ============================================================================
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Keywords that indicate different complexity levels
|
|
49
|
-
*/
|
|
50
|
-
const COMPLEXITY_KEYWORDS = {
|
|
51
|
-
trivial: [
|
|
52
|
-
'bug', 'fix', 'corrigir', 'ajustar', 'typo', 'correção',
|
|
53
|
-
'edge case', 'hotfix', 'urgente', 'rápido', 'quick',
|
|
54
|
-
'cor', 'color', 'texto', 'text', 'label', 'validação',
|
|
55
|
-
'mensagem', 'message', 'css', 'style', 'espaçamento'
|
|
56
|
-
],
|
|
57
|
-
|
|
58
|
-
infrastructure: [
|
|
59
|
-
'azure', 'bicep', 'deploy', 'infra', 'infrastructure',
|
|
60
|
-
'container', 'kubernetes', 'k8s', 'database', 'sql',
|
|
61
|
-
'storage', 'queue', 'service bus', 'redis', 'cosmos'
|
|
62
|
-
],
|
|
63
|
-
|
|
64
|
-
architectural: [
|
|
65
|
-
'sistema', 'system', 'arquitetura', 'architecture',
|
|
66
|
-
'pattern', 'cqrs', 'event sourcing', 'microservice',
|
|
67
|
-
'subsistema', 'subsystem', 'integração', 'integration',
|
|
68
|
-
'autenticação', 'authentication', 'autorização', 'authorization'
|
|
69
|
-
],
|
|
70
|
-
|
|
71
|
-
newComponents: [
|
|
72
|
-
'novo', 'new', 'criar', 'create', 'adicionar', 'add',
|
|
73
|
-
'implementar', 'implement', 'desenvolver', 'develop',
|
|
74
|
-
'componente', 'component', 'serviço', 'service',
|
|
75
|
-
'tela', 'screen', 'página', 'page', 'formulário', 'form'
|
|
76
|
-
]
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
//
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
*
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
*
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
1
|
+
/**
|
|
2
|
+
* MORPH-SPEC Complexity Analyzer Library
|
|
3
|
+
*
|
|
4
|
+
* Analyzes user requests and classifies them into workflows:
|
|
5
|
+
* - fast-track: Trivial changes (bug fixes, small adjustments)
|
|
6
|
+
* - standard: Medium features (simple additions, improvements)
|
|
7
|
+
* - full-morph: Complex features (new subsystems, architecture)
|
|
8
|
+
*
|
|
9
|
+
* Used both by CLI commands and internal automation.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// COMPLEXITY THRESHOLDS
|
|
14
|
+
// ============================================================================
|
|
15
|
+
|
|
16
|
+
export const COMPLEXITY_THRESHOLDS = {
|
|
17
|
+
'fast-track': {
|
|
18
|
+
maxFiles: 3,
|
|
19
|
+
maxLines: 50,
|
|
20
|
+
maxComponents: 0,
|
|
21
|
+
requiresInfrastructure: false,
|
|
22
|
+
requiresArchitecturalDecisions: false,
|
|
23
|
+
description: 'Bug fixes, small adjustments, edge cases, hotfixes'
|
|
24
|
+
},
|
|
25
|
+
'standard': {
|
|
26
|
+
maxFiles: 10,
|
|
27
|
+
maxLines: 500,
|
|
28
|
+
maxComponents: 2,
|
|
29
|
+
requiresInfrastructure: false,
|
|
30
|
+
requiresArchitecturalDecisions: false, // Only tactical decisions
|
|
31
|
+
description: 'Simple features, refactorings, incremental improvements'
|
|
32
|
+
},
|
|
33
|
+
'full-morph': {
|
|
34
|
+
maxFiles: Infinity,
|
|
35
|
+
maxLines: Infinity,
|
|
36
|
+
maxComponents: Infinity,
|
|
37
|
+
requiresInfrastructure: true, // Can have infrastructure
|
|
38
|
+
requiresArchitecturalDecisions: true, // Strategic decisions
|
|
39
|
+
description: 'Complex features, new subsystems, architectural changes'
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// KEYWORD DETECTION
|
|
45
|
+
// ============================================================================
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Keywords that indicate different complexity levels
|
|
49
|
+
*/
|
|
50
|
+
const COMPLEXITY_KEYWORDS = {
|
|
51
|
+
trivial: [
|
|
52
|
+
'bug', 'fix', 'corrigir', 'ajustar', 'typo', 'correção',
|
|
53
|
+
'edge case', 'hotfix', 'urgente', 'rápido', 'quick',
|
|
54
|
+
'cor', 'color', 'texto', 'text', 'label', 'validação',
|
|
55
|
+
'mensagem', 'message', 'css', 'style', 'espaçamento'
|
|
56
|
+
],
|
|
57
|
+
|
|
58
|
+
infrastructure: [
|
|
59
|
+
'azure', 'bicep', 'deploy', 'infra', 'infrastructure',
|
|
60
|
+
'container', 'kubernetes', 'k8s', 'database', 'sql',
|
|
61
|
+
'storage', 'queue', 'service bus', 'redis', 'cosmos'
|
|
62
|
+
],
|
|
63
|
+
|
|
64
|
+
architectural: [
|
|
65
|
+
'sistema', 'system', 'arquitetura', 'architecture',
|
|
66
|
+
'pattern', 'cqrs', 'event sourcing', 'microservice',
|
|
67
|
+
'subsistema', 'subsystem', 'integração', 'integration',
|
|
68
|
+
'autenticação', 'authentication', 'autorização', 'authorization'
|
|
69
|
+
],
|
|
70
|
+
|
|
71
|
+
newComponents: [
|
|
72
|
+
'novo', 'new', 'criar', 'create', 'adicionar', 'add',
|
|
73
|
+
'implementar', 'implement', 'desenvolver', 'develop',
|
|
74
|
+
'componente', 'component', 'serviço', 'service',
|
|
75
|
+
'tela', 'screen', 'página', 'page', 'formulário', 'form'
|
|
76
|
+
],
|
|
77
|
+
|
|
78
|
+
// UI Refresh workflow - visual only changes
|
|
79
|
+
uiRefresh: [
|
|
80
|
+
'redesign', 'redesenhar', 'bonito', 'bonitas', 'visual',
|
|
81
|
+
'estetica', 'aesthetics', 'modernizar', 'modernize',
|
|
82
|
+
'melhorar visual', 'mais bonito', 'prettier', 'beautiful',
|
|
83
|
+
'refresh', 'design system'
|
|
84
|
+
],
|
|
85
|
+
|
|
86
|
+
// Design Implementation workflow - prototype to code
|
|
87
|
+
designImplementation: [
|
|
88
|
+
'prototipo', 'prototype', 'figma', 'html para',
|
|
89
|
+
'converter design', 'replicar', 'from design',
|
|
90
|
+
'based on mockup', 'mockup', 'wireframe', 'implementar tela'
|
|
91
|
+
]
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Hidden complexity indicators for Blazor Server
|
|
96
|
+
* These keyword combinations indicate complexity that isn't obvious at first glance.
|
|
97
|
+
* When detected together, they should force full-morph workflow.
|
|
98
|
+
*
|
|
99
|
+
* See: framework/standards/blazor-efcore.md, blazor-state.md
|
|
100
|
+
*/
|
|
101
|
+
const HIDDEN_COMPLEXITY_INDICATORS = {
|
|
102
|
+
// Session + Blazor = complex circuit/state management
|
|
103
|
+
session: {
|
|
104
|
+
primary: ['session', 'sessão', 'estado', 'state'],
|
|
105
|
+
context: ['blazor', 'persist', 'persistir', 'circuit', 'scoped']
|
|
106
|
+
},
|
|
107
|
+
// Background operations = DbContext concurrency issues
|
|
108
|
+
background: {
|
|
109
|
+
primary: ['task.run', 'background', 'segundo plano', 'job', 'hangfire'],
|
|
110
|
+
context: ['concurrent', 'concorrente', 'async', 'parallel', 'paralelo', 'dbcontext', 'ef core']
|
|
111
|
+
},
|
|
112
|
+
// Navigation = potential state loss
|
|
113
|
+
navigation: {
|
|
114
|
+
primary: ['redirect', 'navigate', 'navegar', 'navegação'],
|
|
115
|
+
context: ['circuit', 'signalr', 'forceload', 'refresh', 'reload']
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// ============================================================================
|
|
120
|
+
// ANALYSIS FUNCTIONS
|
|
121
|
+
// ============================================================================
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Detect keywords in user input
|
|
125
|
+
* @param {string} userInput - User request
|
|
126
|
+
* @param {Array<string>} keywords - Keywords to search for
|
|
127
|
+
* @returns {number} Count of keyword matches
|
|
128
|
+
*/
|
|
129
|
+
function detectKeywords(userInput, keywords) {
|
|
130
|
+
const lowerInput = userInput.toLowerCase();
|
|
131
|
+
return keywords.filter(keyword => lowerInput.includes(keyword)).length;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Estimate code impact from user input
|
|
136
|
+
* @param {string} userInput - User request
|
|
137
|
+
* @returns {Object} Estimated impact
|
|
138
|
+
*/
|
|
139
|
+
export function estimateCodeImpact(userInput) {
|
|
140
|
+
const lowerInput = userInput.toLowerCase();
|
|
141
|
+
|
|
142
|
+
// Trivial indicators
|
|
143
|
+
const trivialCount = detectKeywords(lowerInput, COMPLEXITY_KEYWORDS.trivial);
|
|
144
|
+
if (trivialCount > 0) {
|
|
145
|
+
return {
|
|
146
|
+
estimatedFiles: 1,
|
|
147
|
+
estimatedLines: 10,
|
|
148
|
+
estimatedComponents: 0,
|
|
149
|
+
confidence: 'high'
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Count indicators of new components
|
|
154
|
+
const newComponentCount = detectKeywords(lowerInput, COMPLEXITY_KEYWORDS.newComponents);
|
|
155
|
+
|
|
156
|
+
// Multiple components/features mentioned (separated by "e", "and", or commas)
|
|
157
|
+
const separators = [' e ', ' and ', ','];
|
|
158
|
+
const hasSeparator = separators.some(sep => lowerInput.includes(sep));
|
|
159
|
+
|
|
160
|
+
if (hasSeparator) {
|
|
161
|
+
// Split by any separator
|
|
162
|
+
let parts = [lowerInput];
|
|
163
|
+
for (const sep of separators) {
|
|
164
|
+
parts = parts.flatMap(part => part.split(sep));
|
|
165
|
+
}
|
|
166
|
+
parts = parts.filter(p => p.trim().length > 0);
|
|
167
|
+
|
|
168
|
+
// If we found multiple parts, estimate high complexity
|
|
169
|
+
if (parts.length > 1) {
|
|
170
|
+
return {
|
|
171
|
+
estimatedFiles: Math.min(parts.length * 3, 15),
|
|
172
|
+
estimatedLines: Math.min(parts.length * 200, 1000),
|
|
173
|
+
estimatedComponents: Math.min(parts.length, 5),
|
|
174
|
+
confidence: 'medium'
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// New component indicators
|
|
180
|
+
if (newComponentCount > 0) {
|
|
181
|
+
return {
|
|
182
|
+
estimatedFiles: 5,
|
|
183
|
+
estimatedLines: 200,
|
|
184
|
+
estimatedComponents: 1,
|
|
185
|
+
confidence: 'medium'
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Default to standard complexity
|
|
190
|
+
return {
|
|
191
|
+
estimatedFiles: 5,
|
|
192
|
+
estimatedLines: 150,
|
|
193
|
+
estimatedComponents: 1,
|
|
194
|
+
confidence: 'low'
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Detect if request involves infrastructure
|
|
200
|
+
* @param {string} userInput - User request
|
|
201
|
+
* @returns {boolean} True if infrastructure is involved
|
|
202
|
+
*/
|
|
203
|
+
export function detectInfrastructure(userInput) {
|
|
204
|
+
const infraCount = detectKeywords(userInput, COMPLEXITY_KEYWORDS.infrastructure);
|
|
205
|
+
return infraCount > 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Detect if request involves architectural decisions
|
|
210
|
+
* @param {string} userInput - User request
|
|
211
|
+
* @returns {boolean} True if architectural decisions are involved
|
|
212
|
+
*/
|
|
213
|
+
export function detectArchitecturalDecisions(userInput) {
|
|
214
|
+
const archCount = detectKeywords(userInput, COMPLEXITY_KEYWORDS.architectural);
|
|
215
|
+
return archCount > 0;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Detect if request is a UI refresh (visual redesign only)
|
|
220
|
+
* @param {string} userInput - User request
|
|
221
|
+
* @returns {boolean} True if UI refresh is detected
|
|
222
|
+
*/
|
|
223
|
+
export function detectUiRefresh(userInput) {
|
|
224
|
+
const refreshCount = detectKeywords(userInput, COMPLEXITY_KEYWORDS.uiRefresh);
|
|
225
|
+
// Need at least one refresh keyword AND no infrastructure/architectural keywords
|
|
226
|
+
const hasInfra = detectKeywords(userInput, COMPLEXITY_KEYWORDS.infrastructure) > 0;
|
|
227
|
+
const hasArch = detectKeywords(userInput, COMPLEXITY_KEYWORDS.architectural) > 0;
|
|
228
|
+
return refreshCount > 0 && !hasInfra && !hasArch;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Detect if request is a design implementation (prototype to code)
|
|
233
|
+
* @param {string} userInput - User request
|
|
234
|
+
* @returns {boolean} True if design implementation is detected
|
|
235
|
+
*/
|
|
236
|
+
export function detectDesignImplementation(userInput) {
|
|
237
|
+
const designCount = detectKeywords(userInput, COMPLEXITY_KEYWORDS.designImplementation);
|
|
238
|
+
return designCount > 0;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Detect hidden complexity in Blazor Server requests
|
|
243
|
+
* These are keyword combinations that indicate non-obvious complexity.
|
|
244
|
+
* @param {string} userInput - User request
|
|
245
|
+
* @returns {Object} Detection result with matched indicators
|
|
246
|
+
*/
|
|
247
|
+
export function detectHiddenComplexity(userInput) {
|
|
248
|
+
const lowerInput = userInput.toLowerCase();
|
|
249
|
+
const matchedIndicators = [];
|
|
250
|
+
|
|
251
|
+
for (const [indicatorName, indicator] of Object.entries(HIDDEN_COMPLEXITY_INDICATORS)) {
|
|
252
|
+
const hasPrimary = indicator.primary.some(keyword => lowerInput.includes(keyword));
|
|
253
|
+
const hasContext = indicator.context.some(keyword => lowerInput.includes(keyword));
|
|
254
|
+
|
|
255
|
+
if (hasPrimary && hasContext) {
|
|
256
|
+
matchedIndicators.push({
|
|
257
|
+
name: indicatorName,
|
|
258
|
+
reason: `Detected ${indicatorName} complexity: primary keywords + context keywords found`
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
hasHiddenComplexity: matchedIndicators.length > 0,
|
|
265
|
+
indicators: matchedIndicators
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Classify workflow based on analysis
|
|
271
|
+
* @param {Object} impact - Code impact estimation
|
|
272
|
+
* @param {boolean} hasInfrastructure - Has infrastructure
|
|
273
|
+
* @param {boolean} hasArchitecturalDecisions - Has architectural decisions
|
|
274
|
+
* @returns {string} Workflow type: "fast-track" | "standard" | "full-morph"
|
|
275
|
+
*/
|
|
276
|
+
export function classifyWorkflow(impact, hasInfrastructure, hasArchitecturalDecisions) {
|
|
277
|
+
const { estimatedFiles, estimatedLines, estimatedComponents } = impact;
|
|
278
|
+
|
|
279
|
+
// Full MORPH: Infrastructure or architectural decisions
|
|
280
|
+
if (hasInfrastructure || hasArchitecturalDecisions) {
|
|
281
|
+
return 'full-morph';
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Full MORPH: Large code impact
|
|
285
|
+
if (estimatedFiles > COMPLEXITY_THRESHOLDS.standard.maxFiles ||
|
|
286
|
+
estimatedLines > COMPLEXITY_THRESHOLDS.standard.maxLines ||
|
|
287
|
+
estimatedComponents > COMPLEXITY_THRESHOLDS.standard.maxComponents) {
|
|
288
|
+
return 'full-morph';
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Fast Track: Trivial changes
|
|
292
|
+
if (estimatedFiles <= COMPLEXITY_THRESHOLDS['fast-track'].maxFiles &&
|
|
293
|
+
estimatedLines <= COMPLEXITY_THRESHOLDS['fast-track'].maxLines &&
|
|
294
|
+
estimatedComponents <= COMPLEXITY_THRESHOLDS['fast-track'].maxComponents) {
|
|
295
|
+
return 'fast-track';
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Default: Standard workflow
|
|
299
|
+
return 'standard';
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Analyze request complexity - Main entry point
|
|
304
|
+
* @param {string} userInput - User request
|
|
305
|
+
* @param {Object} options - Options
|
|
306
|
+
* @param {string} options.forceWorkflow - Force specific workflow
|
|
307
|
+
* @returns {Object} Complete analysis
|
|
308
|
+
*/
|
|
309
|
+
export function analyzeRequestComplexity(userInput, options = {}) {
|
|
310
|
+
// Check for forced workflow
|
|
311
|
+
if (options.forceWorkflow) {
|
|
312
|
+
return {
|
|
313
|
+
workflow: options.forceWorkflow,
|
|
314
|
+
forced: true,
|
|
315
|
+
reason: 'Manually overridden by user'
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Check for special workflows first (UI Refresh, Design Implementation)
|
|
320
|
+
const isUiRefresh = detectUiRefresh(userInput);
|
|
321
|
+
const isDesignImplementation = detectDesignImplementation(userInput);
|
|
322
|
+
|
|
323
|
+
if (isUiRefresh) {
|
|
324
|
+
return {
|
|
325
|
+
workflow: 'ui-refresh',
|
|
326
|
+
forced: false,
|
|
327
|
+
impact: { estimatedFiles: 5, estimatedLines: 200, estimatedComponents: 0 },
|
|
328
|
+
hasInfrastructure: false,
|
|
329
|
+
hasArchitecturalDecisions: false,
|
|
330
|
+
hasHiddenComplexity: false,
|
|
331
|
+
hiddenComplexityIndicators: [],
|
|
332
|
+
confidence: 'high',
|
|
333
|
+
reason: 'UI refresh detected: visual-only changes, no infrastructure or architecture',
|
|
334
|
+
thresholds: COMPLEXITY_THRESHOLDS.standard // Uses standard thresholds
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (isDesignImplementation) {
|
|
339
|
+
return {
|
|
340
|
+
workflow: 'design-implementation',
|
|
341
|
+
forced: false,
|
|
342
|
+
impact: { estimatedFiles: 8, estimatedLines: 400, estimatedComponents: 2 },
|
|
343
|
+
hasInfrastructure: false,
|
|
344
|
+
hasArchitecturalDecisions: false,
|
|
345
|
+
hasHiddenComplexity: false,
|
|
346
|
+
hiddenComplexityIndicators: [],
|
|
347
|
+
confidence: 'high',
|
|
348
|
+
reason: 'Design implementation detected: prototype to code conversion',
|
|
349
|
+
thresholds: COMPLEXITY_THRESHOLDS.standard // Uses standard thresholds
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Analyze request
|
|
354
|
+
const impact = estimateCodeImpact(userInput);
|
|
355
|
+
const hasInfrastructure = detectInfrastructure(userInput);
|
|
356
|
+
const hasArchitecturalDecisions = detectArchitecturalDecisions(userInput);
|
|
357
|
+
const hiddenComplexity = detectHiddenComplexity(userInput);
|
|
358
|
+
|
|
359
|
+
// Hidden complexity forces full-morph (Blazor Server specific concerns)
|
|
360
|
+
let workflow;
|
|
361
|
+
if (hiddenComplexity.hasHiddenComplexity) {
|
|
362
|
+
workflow = 'full-morph';
|
|
363
|
+
} else {
|
|
364
|
+
workflow = classifyWorkflow(impact, hasInfrastructure, hasArchitecturalDecisions);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Build reason
|
|
368
|
+
let reason = `Estimated ${impact.estimatedFiles} files, ${impact.estimatedLines} lines, ${impact.estimatedComponents} components`;
|
|
369
|
+
if (hasInfrastructure) reason += ', requires infrastructure';
|
|
370
|
+
if (hasArchitecturalDecisions) reason += ', requires architectural decisions';
|
|
371
|
+
if (hiddenComplexity.hasHiddenComplexity) {
|
|
372
|
+
reason += `, hidden complexity detected: ${hiddenComplexity.indicators.map(i => i.name).join(', ')}`;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return {
|
|
376
|
+
workflow,
|
|
377
|
+
forced: false,
|
|
378
|
+
impact,
|
|
379
|
+
hasInfrastructure,
|
|
380
|
+
hasArchitecturalDecisions,
|
|
381
|
+
hasHiddenComplexity: hiddenComplexity.hasHiddenComplexity,
|
|
382
|
+
hiddenComplexityIndicators: hiddenComplexity.indicators,
|
|
383
|
+
confidence: impact.confidence,
|
|
384
|
+
reason,
|
|
385
|
+
thresholds: COMPLEXITY_THRESHOLDS[workflow]
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Get workflow phases
|
|
391
|
+
* @param {string} workflow - Workflow type
|
|
392
|
+
* @returns {Array<string>} List of phases to execute
|
|
393
|
+
*/
|
|
394
|
+
export function getWorkflowPhases(workflow) {
|
|
395
|
+
switch (workflow) {
|
|
396
|
+
case 'fast-track':
|
|
397
|
+
return ['quick-analysis', 'implement'];
|
|
398
|
+
|
|
399
|
+
case 'standard':
|
|
400
|
+
return ['proposal', 'design', 'tasks', 'implement'];
|
|
401
|
+
|
|
402
|
+
case 'full-morph':
|
|
403
|
+
return ['context', 'proposal', 'setup', 'uiux', 'design', 'clarify', 'tasks', 'implement', 'sync'];
|
|
404
|
+
|
|
405
|
+
case 'ui-refresh':
|
|
406
|
+
return ['visual-analysis', 'design-system', 'implement'];
|
|
407
|
+
|
|
408
|
+
case 'design-implementation':
|
|
409
|
+
return ['prototype-analysis', 'tasks', 'implement'];
|
|
410
|
+
|
|
411
|
+
default:
|
|
412
|
+
return ['context', 'proposal', 'setup', 'uiux', 'design', 'clarify', 'tasks', 'implement', 'sync'];
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Get workflow description
|
|
418
|
+
* @param {string} workflow - Workflow type
|
|
419
|
+
* @returns {string} Human-readable description
|
|
420
|
+
*/
|
|
421
|
+
export function getWorkflowDescription(workflow) {
|
|
422
|
+
switch (workflow) {
|
|
423
|
+
case 'fast-track':
|
|
424
|
+
return 'Fast Track: Quick fixes without formal spec (1 pause, no outputs)';
|
|
425
|
+
|
|
426
|
+
case 'standard':
|
|
427
|
+
return 'Standard: Medium complexity with simplified workflow (2-3 pauses, minimal outputs)';
|
|
428
|
+
|
|
429
|
+
case 'full-morph':
|
|
430
|
+
return 'Full MORPH: Complete 8-phase workflow with all outputs';
|
|
431
|
+
|
|
432
|
+
case 'ui-refresh':
|
|
433
|
+
return 'UI Refresh: Visual redesign only (3 phases: Visual Analysis → Design System → Implement)';
|
|
434
|
+
|
|
435
|
+
case 'design-implementation':
|
|
436
|
+
return 'Design Implementation: Prototype to code conversion (3 phases: Prototype Analysis → Tasks → Implement)';
|
|
437
|
+
|
|
438
|
+
default:
|
|
439
|
+
return 'Unknown workflow';
|
|
440
|
+
}
|
|
441
|
+
}
|