@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
package/content/README.md
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
# MORPH-SPEC Content - Projeto Exemplo
|
|
2
|
-
|
|
3
|
-
Este diretório contém um **projeto exemplo** mostrando como usar o framework MORPH-SPEC em um projeto .NET/Blazor.
|
|
4
|
-
|
|
5
|
-
> 📘 **Nota**: Este não é o código do framework, apenas um exemplo de uso.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 📁 Estrutura
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
content/
|
|
13
|
-
├── .morph/ # Configuração MORPH do projeto exemplo
|
|
14
|
-
│ ├── project/ # Context e outputs do projeto
|
|
15
|
-
│ │ ├── context/
|
|
16
|
-
│ │ ├── standards/
|
|
17
|
-
│ │ └── outputs/
|
|
18
|
-
│ └── config.json # Link para framework global
|
|
19
|
-
│
|
|
20
|
-
├── CLAUDE.md # Instruções para Claude Code
|
|
21
|
-
└── src/ # (futuro) Código exemplo
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 🎯 Objetivo
|
|
27
|
-
|
|
28
|
-
Este exemplo demonstra:
|
|
29
|
-
|
|
30
|
-
1. Como inicializar MORPH em um projeto
|
|
31
|
-
2. Estrutura de `.morph/project/`
|
|
32
|
-
3. Como Claude Code usa o framework
|
|
33
|
-
4. Exemplos de features implementadas com MORPH
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## 🚀 Como Usar Este Exemplo
|
|
38
|
-
|
|
39
|
-
### 1. Instalar MORPH globalmente
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
npm install -g @polymorphism-tech/morph-spec
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 2. Ver estrutura detectada
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
cd content/
|
|
49
|
-
morph-spec detect --verbose
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### 3. Inicializar em seu próprio projeto
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
cd seu-projeto/
|
|
56
|
-
morph-spec init
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 📚 Documentação
|
|
62
|
-
|
|
63
|
-
- **Framework**: Veja `../framework/` para standards e templates
|
|
64
|
-
- **Docs**: Veja `../docs/` para guias completos
|
|
65
|
-
- **CLI**: Execute `morph-spec --help`
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## ⚠️ Importante
|
|
70
|
-
|
|
71
|
-
Este é um **exemplo read-only**. Para criar seu próprio projeto:
|
|
72
|
-
|
|
73
|
-
1. NÃO copie este diretório
|
|
74
|
-
2. Execute `morph-spec init` no seu projeto
|
|
75
|
-
3. O framework será linkado automaticamente
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
1
|
+
# MORPH-SPEC Content - Projeto Exemplo
|
|
2
|
+
|
|
3
|
+
Este diretório contém um **projeto exemplo** mostrando como usar o framework MORPH-SPEC em um projeto .NET/Blazor.
|
|
4
|
+
|
|
5
|
+
> 📘 **Nota**: Este não é o código do framework, apenas um exemplo de uso.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📁 Estrutura
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
content/
|
|
13
|
+
├── .morph/ # Configuração MORPH do projeto exemplo
|
|
14
|
+
│ ├── project/ # Context e outputs do projeto
|
|
15
|
+
│ │ ├── context/
|
|
16
|
+
│ │ ├── standards/
|
|
17
|
+
│ │ └── outputs/
|
|
18
|
+
│ └── config.json # Link para framework global
|
|
19
|
+
│
|
|
20
|
+
├── CLAUDE.md # Instruções para Claude Code
|
|
21
|
+
└── src/ # (futuro) Código exemplo
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 🎯 Objetivo
|
|
27
|
+
|
|
28
|
+
Este exemplo demonstra:
|
|
29
|
+
|
|
30
|
+
1. Como inicializar MORPH em um projeto
|
|
31
|
+
2. Estrutura de `.morph/project/`
|
|
32
|
+
3. Como Claude Code usa o framework
|
|
33
|
+
4. Exemplos de features implementadas com MORPH
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 🚀 Como Usar Este Exemplo
|
|
38
|
+
|
|
39
|
+
### 1. Instalar MORPH globalmente
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install -g @polymorphism-tech/morph-spec
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 2. Ver estrutura detectada
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
cd content/
|
|
49
|
+
morph-spec detect --verbose
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 3. Inicializar em seu próprio projeto
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
cd seu-projeto/
|
|
56
|
+
morph-spec init
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 📚 Documentação
|
|
62
|
+
|
|
63
|
+
- **Framework**: Veja `../framework/` para standards e templates
|
|
64
|
+
- **Docs**: Veja `../docs/` para guias completos
|
|
65
|
+
- **CLI**: Execute `morph-spec --help`
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## ⚠️ Importante
|
|
70
|
+
|
|
71
|
+
Este é um **exemplo read-only**. Para criar seu próprio projeto:
|
|
72
|
+
|
|
73
|
+
1. NÃO copie este diretório
|
|
74
|
+
2. Execute `morph-spec init` no seu projeto
|
|
75
|
+
3. O framework será linkado automaticamente
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,223 +1,223 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Config Detector - Reads configuration files to extract technologies, versions, and dependencies
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { readFileSync, existsSync } from 'fs';
|
|
6
|
-
import { join } from 'path';
|
|
7
|
-
import { glob } from 'glob';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Detect project configuration
|
|
11
|
-
* @param {string} projectPath - Project root path
|
|
12
|
-
* @returns {Promise<Object>} Configuration detection results
|
|
13
|
-
*/
|
|
14
|
-
export async function detectConfig(projectPath) {
|
|
15
|
-
const result = {
|
|
16
|
-
language: 'unknown',
|
|
17
|
-
version: null,
|
|
18
|
-
packageManager: 'unknown',
|
|
19
|
-
dependencies: [],
|
|
20
|
-
technologies: [],
|
|
21
|
-
auth: null,
|
|
22
|
-
database: null,
|
|
23
|
-
hosting: null
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
// Detect .NET projects
|
|
27
|
-
const dotnetConfig = await detectDotNet(projectPath);
|
|
28
|
-
if (dotnetConfig) {
|
|
29
|
-
Object.assign(result, dotnetConfig);
|
|
30
|
-
return result;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Detect Node.js projects
|
|
34
|
-
const nodeConfig = await detectNode(projectPath);
|
|
35
|
-
if (nodeConfig) {
|
|
36
|
-
Object.assign(result, nodeConfig);
|
|
37
|
-
return result;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Detect .NET configuration
|
|
45
|
-
*/
|
|
46
|
-
async function detectDotNet(projectPath) {
|
|
47
|
-
const programCs = join(projectPath, 'Program.cs');
|
|
48
|
-
const csprojFiles = await glob('**/*.csproj', { cwd: projectPath });
|
|
49
|
-
|
|
50
|
-
if (!existsSync(programCs) && csprojFiles.length === 0) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const config = {
|
|
55
|
-
language: 'csharp',
|
|
56
|
-
version: null,
|
|
57
|
-
packageManager: 'dotnet',
|
|
58
|
-
dependencies: [],
|
|
59
|
-
technologies: [],
|
|
60
|
-
auth: null,
|
|
61
|
-
database: null,
|
|
62
|
-
hosting: null
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
// Read Program.cs
|
|
66
|
-
if (existsSync(programCs)) {
|
|
67
|
-
const content = readFileSync(programCs, 'utf8');
|
|
68
|
-
|
|
69
|
-
// Detect .NET version
|
|
70
|
-
if (content.includes('WebApplication.CreateBuilder') || content.includes('.NET')) {
|
|
71
|
-
config.version = detectDotNetVersion(content);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Detect technologies from Program.cs
|
|
75
|
-
config.technologies = detectTechnologiesFromProgramCs(content);
|
|
76
|
-
config.auth = detectAuthMethod(content);
|
|
77
|
-
config.database = detectDatabase(content);
|
|
78
|
-
config.hosting = detectHosting(content);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Read .csproj files
|
|
82
|
-
for (const csprojFile of csprojFiles.slice(0, 3)) { // Read first 3 csproj files
|
|
83
|
-
const csprojPath = join(projectPath, csprojFile);
|
|
84
|
-
const content = readFileSync(csprojPath, 'utf8');
|
|
85
|
-
|
|
86
|
-
config.dependencies.push(...extractNuGetPackages(content));
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Remove duplicates
|
|
90
|
-
config.dependencies = [...new Set(config.dependencies)];
|
|
91
|
-
config.technologies = [...new Set(config.technologies)];
|
|
92
|
-
|
|
93
|
-
return config;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Detect Node.js configuration
|
|
98
|
-
*/
|
|
99
|
-
async function detectNode(projectPath) {
|
|
100
|
-
const packageJsonPath = join(projectPath, 'package.json');
|
|
101
|
-
|
|
102
|
-
if (!existsSync(packageJsonPath)) {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
107
|
-
|
|
108
|
-
const config = {
|
|
109
|
-
language: 'javascript',
|
|
110
|
-
version: packageJson.engines?.node || null,
|
|
111
|
-
packageManager: existsSync(join(projectPath, 'yarn.lock')) ? 'yarn' :
|
|
112
|
-
existsSync(join(projectPath, 'pnpm-lock.yaml')) ? 'pnpm' : 'npm',
|
|
113
|
-
dependencies: [],
|
|
114
|
-
technologies: [],
|
|
115
|
-
auth: null,
|
|
116
|
-
database: null,
|
|
117
|
-
hosting: null
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
// Extract dependencies
|
|
121
|
-
const allDeps = {
|
|
122
|
-
...packageJson.dependencies,
|
|
123
|
-
...packageJson.devDependencies
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
config.dependencies = Object.keys(allDeps);
|
|
127
|
-
|
|
128
|
-
// Detect technologies
|
|
129
|
-
if (allDeps['next']) config.technologies.push('Next.js');
|
|
130
|
-
if (allDeps['react']) config.technologies.push('React');
|
|
131
|
-
if (allDeps['@clerk/nextjs']) config.auth = 'Clerk';
|
|
132
|
-
if (allDeps['prisma']) config.database = 'Prisma';
|
|
133
|
-
|
|
134
|
-
return config;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Detect .NET version from Program.cs
|
|
139
|
-
*/
|
|
140
|
-
function detectDotNetVersion(content) {
|
|
141
|
-
if (content.includes('.NET 10') || content.includes('net10.0')) return '.NET 10';
|
|
142
|
-
if (content.includes('.NET 9') || content.includes('net9.0')) return '.NET 9';
|
|
143
|
-
if (content.includes('.NET 8') || content.includes('net8.0')) return '.NET 8';
|
|
144
|
-
return 'unknown';
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Detect technologies from Program.cs
|
|
149
|
-
*/
|
|
150
|
-
function detectTechnologiesFromProgramCs(content) {
|
|
151
|
-
const techs = [];
|
|
152
|
-
|
|
153
|
-
if (content.includes('AddBlazor') || content.includes('MapBlazorHub')) {
|
|
154
|
-
techs.push('Blazor Server');
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (content.includes('AddHangfire')) {
|
|
158
|
-
techs.push('Hangfire');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (content.includes('IChatClient') || content.includes('Microsoft.Agents')) {
|
|
162
|
-
techs.push('Microsoft Agent Framework');
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (content.includes('AddDbContext') || content.includes('UseSqlServer')) {
|
|
166
|
-
techs.push('Entity Framework Core');
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (content.includes('AddFluentUIComponents') || content.includes('FluentUI')) {
|
|
170
|
-
techs.push('Fluent UI Blazor');
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (content.includes('AddMudServices') || content.includes('MudBlazor')) {
|
|
174
|
-
techs.push('MudBlazor');
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return techs;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Detect authentication method
|
|
182
|
-
*/
|
|
183
|
-
function detectAuthMethod(content) {
|
|
184
|
-
if (content.includes('AddClerk') || content.includes('Clerk')) return 'Clerk';
|
|
185
|
-
if (content.includes('AddMicrosoftIdentity') || content.includes('Entra')) return 'Microsoft Entra';
|
|
186
|
-
if (content.includes('AddAuthentication')) return 'ASP.NET Identity';
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Detect database
|
|
192
|
-
*/
|
|
193
|
-
function detectDatabase(content) {
|
|
194
|
-
if (content.includes('UseSqlServer')) return 'SQL Server';
|
|
195
|
-
if (content.includes('UsePostgres')) return 'PostgreSQL';
|
|
196
|
-
if (content.includes('UseSqlite')) return 'SQLite';
|
|
197
|
-
if (content.includes('UseCosmos')) return 'Cosmos DB';
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Detect hosting platform
|
|
203
|
-
*/
|
|
204
|
-
function detectHosting(content) {
|
|
205
|
-
if (content.includes('Azure') || content.includes('AddAzure')) return 'Azure';
|
|
206
|
-
if (content.includes('AWS')) return 'AWS';
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Extract NuGet packages from .csproj
|
|
212
|
-
*/
|
|
213
|
-
function extractNuGetPackages(csprojContent) {
|
|
214
|
-
const packages = [];
|
|
215
|
-
const regex = /<PackageReference\s+Include="([^"]+)"/g;
|
|
216
|
-
let match;
|
|
217
|
-
|
|
218
|
-
while ((match = regex.exec(csprojContent)) !== null) {
|
|
219
|
-
packages.push(match[1]);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return packages;
|
|
223
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Config Detector - Reads configuration files to extract technologies, versions, and dependencies
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { readFileSync, existsSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { glob } from 'glob';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Detect project configuration
|
|
11
|
+
* @param {string} projectPath - Project root path
|
|
12
|
+
* @returns {Promise<Object>} Configuration detection results
|
|
13
|
+
*/
|
|
14
|
+
export async function detectConfig(projectPath) {
|
|
15
|
+
const result = {
|
|
16
|
+
language: 'unknown',
|
|
17
|
+
version: null,
|
|
18
|
+
packageManager: 'unknown',
|
|
19
|
+
dependencies: [],
|
|
20
|
+
technologies: [],
|
|
21
|
+
auth: null,
|
|
22
|
+
database: null,
|
|
23
|
+
hosting: null
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Detect .NET projects
|
|
27
|
+
const dotnetConfig = await detectDotNet(projectPath);
|
|
28
|
+
if (dotnetConfig) {
|
|
29
|
+
Object.assign(result, dotnetConfig);
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Detect Node.js projects
|
|
34
|
+
const nodeConfig = await detectNode(projectPath);
|
|
35
|
+
if (nodeConfig) {
|
|
36
|
+
Object.assign(result, nodeConfig);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Detect .NET configuration
|
|
45
|
+
*/
|
|
46
|
+
async function detectDotNet(projectPath) {
|
|
47
|
+
const programCs = join(projectPath, 'Program.cs');
|
|
48
|
+
const csprojFiles = await glob('**/*.csproj', { cwd: projectPath });
|
|
49
|
+
|
|
50
|
+
if (!existsSync(programCs) && csprojFiles.length === 0) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const config = {
|
|
55
|
+
language: 'csharp',
|
|
56
|
+
version: null,
|
|
57
|
+
packageManager: 'dotnet',
|
|
58
|
+
dependencies: [],
|
|
59
|
+
technologies: [],
|
|
60
|
+
auth: null,
|
|
61
|
+
database: null,
|
|
62
|
+
hosting: null
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// Read Program.cs
|
|
66
|
+
if (existsSync(programCs)) {
|
|
67
|
+
const content = readFileSync(programCs, 'utf8');
|
|
68
|
+
|
|
69
|
+
// Detect .NET version
|
|
70
|
+
if (content.includes('WebApplication.CreateBuilder') || content.includes('.NET')) {
|
|
71
|
+
config.version = detectDotNetVersion(content);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Detect technologies from Program.cs
|
|
75
|
+
config.technologies = detectTechnologiesFromProgramCs(content);
|
|
76
|
+
config.auth = detectAuthMethod(content);
|
|
77
|
+
config.database = detectDatabase(content);
|
|
78
|
+
config.hosting = detectHosting(content);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Read .csproj files
|
|
82
|
+
for (const csprojFile of csprojFiles.slice(0, 3)) { // Read first 3 csproj files
|
|
83
|
+
const csprojPath = join(projectPath, csprojFile);
|
|
84
|
+
const content = readFileSync(csprojPath, 'utf8');
|
|
85
|
+
|
|
86
|
+
config.dependencies.push(...extractNuGetPackages(content));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Remove duplicates
|
|
90
|
+
config.dependencies = [...new Set(config.dependencies)];
|
|
91
|
+
config.technologies = [...new Set(config.technologies)];
|
|
92
|
+
|
|
93
|
+
return config;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Detect Node.js configuration
|
|
98
|
+
*/
|
|
99
|
+
async function detectNode(projectPath) {
|
|
100
|
+
const packageJsonPath = join(projectPath, 'package.json');
|
|
101
|
+
|
|
102
|
+
if (!existsSync(packageJsonPath)) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
107
|
+
|
|
108
|
+
const config = {
|
|
109
|
+
language: 'javascript',
|
|
110
|
+
version: packageJson.engines?.node || null,
|
|
111
|
+
packageManager: existsSync(join(projectPath, 'yarn.lock')) ? 'yarn' :
|
|
112
|
+
existsSync(join(projectPath, 'pnpm-lock.yaml')) ? 'pnpm' : 'npm',
|
|
113
|
+
dependencies: [],
|
|
114
|
+
technologies: [],
|
|
115
|
+
auth: null,
|
|
116
|
+
database: null,
|
|
117
|
+
hosting: null
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Extract dependencies
|
|
121
|
+
const allDeps = {
|
|
122
|
+
...packageJson.dependencies,
|
|
123
|
+
...packageJson.devDependencies
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
config.dependencies = Object.keys(allDeps);
|
|
127
|
+
|
|
128
|
+
// Detect technologies
|
|
129
|
+
if (allDeps['next']) config.technologies.push('Next.js');
|
|
130
|
+
if (allDeps['react']) config.technologies.push('React');
|
|
131
|
+
if (allDeps['@clerk/nextjs']) config.auth = 'Clerk';
|
|
132
|
+
if (allDeps['prisma']) config.database = 'Prisma';
|
|
133
|
+
|
|
134
|
+
return config;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Detect .NET version from Program.cs
|
|
139
|
+
*/
|
|
140
|
+
function detectDotNetVersion(content) {
|
|
141
|
+
if (content.includes('.NET 10') || content.includes('net10.0')) return '.NET 10';
|
|
142
|
+
if (content.includes('.NET 9') || content.includes('net9.0')) return '.NET 9';
|
|
143
|
+
if (content.includes('.NET 8') || content.includes('net8.0')) return '.NET 8';
|
|
144
|
+
return 'unknown';
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Detect technologies from Program.cs
|
|
149
|
+
*/
|
|
150
|
+
function detectTechnologiesFromProgramCs(content) {
|
|
151
|
+
const techs = [];
|
|
152
|
+
|
|
153
|
+
if (content.includes('AddBlazor') || content.includes('MapBlazorHub')) {
|
|
154
|
+
techs.push('Blazor Server');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (content.includes('AddHangfire')) {
|
|
158
|
+
techs.push('Hangfire');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (content.includes('IChatClient') || content.includes('Microsoft.Agents')) {
|
|
162
|
+
techs.push('Microsoft Agent Framework');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (content.includes('AddDbContext') || content.includes('UseSqlServer')) {
|
|
166
|
+
techs.push('Entity Framework Core');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (content.includes('AddFluentUIComponents') || content.includes('FluentUI')) {
|
|
170
|
+
techs.push('Fluent UI Blazor');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (content.includes('AddMudServices') || content.includes('MudBlazor')) {
|
|
174
|
+
techs.push('MudBlazor');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return techs;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Detect authentication method
|
|
182
|
+
*/
|
|
183
|
+
function detectAuthMethod(content) {
|
|
184
|
+
if (content.includes('AddClerk') || content.includes('Clerk')) return 'Clerk';
|
|
185
|
+
if (content.includes('AddMicrosoftIdentity') || content.includes('Entra')) return 'Microsoft Entra';
|
|
186
|
+
if (content.includes('AddAuthentication')) return 'ASP.NET Identity';
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Detect database
|
|
192
|
+
*/
|
|
193
|
+
function detectDatabase(content) {
|
|
194
|
+
if (content.includes('UseSqlServer')) return 'SQL Server';
|
|
195
|
+
if (content.includes('UsePostgres')) return 'PostgreSQL';
|
|
196
|
+
if (content.includes('UseSqlite')) return 'SQLite';
|
|
197
|
+
if (content.includes('UseCosmos')) return 'Cosmos DB';
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Detect hosting platform
|
|
203
|
+
*/
|
|
204
|
+
function detectHosting(content) {
|
|
205
|
+
if (content.includes('Azure') || content.includes('AddAzure')) return 'Azure';
|
|
206
|
+
if (content.includes('AWS')) return 'AWS';
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Extract NuGet packages from .csproj
|
|
212
|
+
*/
|
|
213
|
+
function extractNuGetPackages(csprojContent) {
|
|
214
|
+
const packages = [];
|
|
215
|
+
const regex = /<PackageReference\s+Include="([^"]+)"/g;
|
|
216
|
+
let match;
|
|
217
|
+
|
|
218
|
+
while ((match = regex.exec(csprojContent)) !== null) {
|
|
219
|
+
packages.push(match[1]);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return packages;
|
|
223
|
+
}
|