@polymorphism-tech/morph-spec 4.12.0 → 4.14.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 +7 -7
- package/README.md +28 -34
- package/bin/morph-spec.js +41 -24
- package/bin/task-manager.js +962 -1341
- package/bin/validate.js +1 -1
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +14 -16
- package/docs/QUICKSTART.md +15 -15
- package/framework/CLAUDE.md +5 -2
- package/framework/agents/README.md +3 -4
- package/framework/agents/ai-agents/ai-system-architect.md +6 -10
- package/framework/agents/architecture/seo-growth-hacker.md +166 -326
- package/framework/agents/architecture/standards-architect.md +21 -31
- package/framework/agents/backend/dotnet-senior.md +160 -86
- package/framework/agents/backend/ef-modeler.md +2 -6
- package/framework/agents/backend/hangfire-orchestrator.md +8 -9
- package/framework/agents/backend/ms-agent-expert.md +1 -1
- package/framework/agents/frontend/nextjs-expert.md +198 -133
- package/framework/agents/frontend/ui-ux-designer.md +226 -267
- package/framework/agents/infrastructure/infra-architect.md +191 -27
- package/framework/agents/integrations/clerk-auth.md +19 -26
- package/framework/agents/integrations/hangfire-integration.md +1 -4
- package/framework/agents.json +1084 -2278
- package/framework/commands/morph-apply.md +4 -6
- package/framework/commands/morph-preflight.md +192 -269
- package/framework/commands/morph-proposal.md +210 -238
- package/framework/commands/morph-status.md +72 -92
- package/framework/commands/morph-troubleshoot.md +6 -13
- package/framework/hooks/README.md +1 -6
- package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
- package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
- package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
- package/framework/hooks/claude-code/statusline.py +4 -5
- package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
- package/framework/hooks/shared/compact-restore.js +28 -5
- package/framework/hooks/shared/phase-utils.js +4 -8
- package/framework/hooks/shared/state-reader.js +34 -3
- package/framework/phases.json +162 -200
- package/framework/rules/ai-agents-standards.md +15 -0
- package/framework/rules/asaas-standards.md +13 -0
- package/framework/rules/clerk-standards.md +13 -0
- package/framework/rules/csharp-standards.md +8 -4
- package/framework/rules/data-standards.md +18 -0
- package/framework/rules/dotnet-templates.md +87 -0
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/hangfire-standards.md +13 -0
- package/framework/rules/infrastructure-standards.md +27 -16
- package/framework/rules/morph-workflow.md +73 -13
- package/framework/rules/nextjs-standards.md +1 -0
- package/framework/rules/nextjs-templates.md +40 -0
- package/framework/rules/resend-standards.md +12 -0
- package/framework/rules/supabase-standards.md +29 -0
- package/framework/skills/README.md +6 -8
- package/framework/skills/level-0-meta/mcp-registry.json +21 -99
- package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
- package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
- package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
- package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
- package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
- package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
- package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
- package/framework/skills/level-1-workflows/README.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +57 -123
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
- package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
- package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +143 -172
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/squad-templates/backend-only.json +6 -6
- package/framework/squad-templates/frontend-only.json +17 -8
- package/framework/squad-templates/full-stack.json +29 -24
- package/framework/standards/STANDARDS.json +1021 -2369
- package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
- package/framework/standards/backend/dotnet/result-pattern.md +213 -0
- package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
- package/framework/standards/backend/dotnet/scrutor.md +158 -0
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
- package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
- package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
- package/framework/standards/integration/mcp/mcp-tools.md +91 -77
- package/framework/templates/IDE-SNIPPETS.md +2 -6
- package/framework/templates/README.md +709 -814
- package/framework/templates/REGISTRY.json +223 -762
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
- package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
- package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
- package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
- package/framework/templates/code/dotnet/backend/repository.cs +148 -141
- package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
- package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
- package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
- package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
- package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
- package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
- package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
- package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
- package/framework/templates/code/dotnet/jobs/job.cs +21 -17
- package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
- package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
- package/framework/templates/code/dotnet/test.cs +192 -106
- package/framework/templates/context/ARCHITECTURE.md +89 -0
- package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
- package/framework/templates/context/CONTEXT.md +180 -181
- package/framework/templates/context/design-system.md +1 -5
- package/framework/templates/docs/onboarding.md +2 -3
- package/framework/templates/docs/proposal.md +171 -182
- package/framework/templates/docs/spec.md +1 -3
- package/framework/templates/docs/ui-components.md +0 -72
- package/framework/templates/examples/design-system-examples.md +4 -4
- package/framework/templates/feature/decisions.md +0 -66
- package/framework/templates/feature/recap.md +1 -2
- package/framework/templates/infrastructure/github/README.md +56 -593
- package/framework/templates/integrations/clerk-config.cs +0 -41
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
- package/framework/templates/project/validate.js +2 -4
- package/framework/templates/ui/design-system.css +1 -1
- package/framework/workflows/README.md +8 -8
- package/framework/workflows/configs/fast-track.json +51 -0
- package/framework/workflows/configs/full.json +68 -0
- package/framework/workflows/configs/standard.json +7 -3
- package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
- package/framework/workflows/docs/enforcement-pipeline.md +18 -19
- package/framework/workflows/docs/full-morph.md +69 -76
- package/framework/workflows/docs/standard.md +49 -44
- package/framework/workflows/docs/ui-refresh.md +1 -1
- package/package.json +3 -3
- package/src/commands/agents/dispatch-agents.js +55 -116
- package/src/commands/context/context-refresh.js +79 -0
- package/src/commands/phase/phase-reset.js +1 -1
- package/src/commands/project/doctor.js +10 -32
- package/src/commands/project/init.js +12 -0
- package/src/commands/project/status.js +6 -12
- package/src/commands/scaffold/scaffold.js +131 -0
- package/src/commands/scope/escalate.js +1 -1
- package/src/commands/state/advance-phase.js +15 -29
- package/src/commands/state/state.js +20 -5
- package/src/commands/tasks/task.js +0 -30
- package/src/commands/validation/validate-feature.js +3 -10
- package/src/core/paths/output-schema.js +12 -13
- package/src/core/state/phase-state-machine.js +211 -217
- package/src/core/state/state-manager.js +9 -9
- package/src/lib/agents/agents-manager.js +2 -2
- package/src/lib/agents/output-collector.js +1 -2
- package/src/lib/detectors/design-system-detector.js +4 -4
- package/src/lib/detectors/index.js +1 -11
- package/src/lib/generators/architecture-scanner.js +640 -0
- package/src/lib/generators/context-generator.js +3 -3
- package/src/lib/generators/design-system-generator.js +508 -587
- package/src/lib/generators/index.js +12 -10
- package/src/lib/generators/metadata-extractor.js +386 -387
- package/src/lib/generators/recap-generator.js +4 -4
- package/src/lib/generators/scaffold-generator.js +317 -0
- package/src/lib/generators/settings-generator.js +0 -1
- package/src/lib/phase-chain/phase-validator.js +64 -42
- package/src/lib/stack/stack-profile.js +2 -2
- package/src/lib/standards/digest-builder.js +72 -285
- package/src/lib/tasks/task-parser.js +11 -5
- package/src/lib/validators/architecture/architecture-validator.js +259 -387
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/css/css-validator.js +340 -352
- package/src/lib/validators/packages/package-validator.js +347 -360
- package/src/lib/validators/shared/issue-counter.js +14 -18
- package/src/lib/validators/validation-runner.js +3 -19
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agents-installer.js +61 -10
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +11 -19
- package/src/utils/skills-installer.js +178 -178
- package/framework/agents/architecture/prompt-engineer.md +0 -195
- package/framework/agents/backend/api-designer.md +0 -106
- package/framework/agents/frontend/blazor-builder.md +0 -229
- package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
- package/framework/agents/infrastructure/azure-architect.md +0 -150
- package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
- package/framework/agents/infrastructure/bicep-architect.md +0 -132
- package/framework/agents/infrastructure/container-specialist.md +0 -137
- package/framework/agents/infrastructure/devops-engineer.md +0 -126
- package/framework/agents/integrations/azure-identity.md +0 -148
- package/framework/agents/quality/code-analyzer.md +0 -239
- package/framework/agents/quality/testing-specialist.md +0 -130
- package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
- package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
- package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
- package/framework/index/troubleshooting-index.json +0 -184
- package/framework/rules/testing-standards.md +0 -14
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
- package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
- package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
- package/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
- package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
- package/framework/standards/architecture/ddd/entities.md +0 -99
- package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
- package/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/framework/standards/backend/api/minimal-api.md +0 -494
- package/framework/standards/backend/api/rest.md +0 -492
- package/framework/standards/backend/authentication/passkeys.md +0 -428
- package/framework/standards/backend/database/ef-core.md +0 -199
- package/framework/standards/backend/database/migrations.md +0 -393
- package/framework/standards/backend/database/repository-patterns.md +0 -528
- package/framework/standards/backend/dotnet/async.md +0 -366
- package/framework/standards/backend/dotnet/core.md +0 -117
- package/framework/standards/backend/dotnet/di.md +0 -439
- package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/framework/standards/context/analytics.md +0 -96
- package/framework/standards/context/bundles.md +0 -110
- package/framework/standards/context/priming.md +0 -78
- package/framework/standards/core/architecture.md +0 -185
- package/framework/standards/core/coding.md +0 -214
- package/framework/standards/core/git-branching-strategy.md +0 -403
- package/framework/standards/core/git.md +0 -185
- package/framework/standards/core/testing.md +0 -295
- package/framework/standards/data/nosql/blob-storage.md +0 -102
- package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/framework/standards/frontend/blazor/state.md +0 -191
- package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
- package/framework/standards/frontend/design-system/design-trends.md +0 -171
- package/framework/standards/infrastructure/azure/azure.md +0 -624
- package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
- package/framework/standards/integration/api/graphql.md +0 -91
- package/framework/standards/integration/api/grpc.md +0 -114
- package/framework/standards/integration/api/rest-design.md +0 -95
- package/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/framework/standards/observability/logging.md +0 -131
- package/framework/standards/observability/metrics.md +0 -121
- package/framework/standards/observability/monitoring.md +0 -114
- package/framework/standards/observability/tracing.md +0 -132
- package/framework/standards/workflows/parallel-execution.md +0 -112
- package/framework/standards/workflows/thread-management.md +0 -113
- package/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
- package/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/framework/templates/infrastructure/azure/README.md +0 -286
- package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/framework/templates/project-structure/dotnet-ddd.md +0 -70
- package/framework/templates/saas/subscription.cs +0 -347
- package/framework/templates/saas/tenant.cs +0 -338
- package/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/framework/templates/ui/MudTheme.cs +0 -281
- package/framework/workflows/configs/nodejs-cli.json +0 -40
- package/src/commands/standards/context-budget.js +0 -89
- package/src/lib/standards/index.js +0 -7
- package/src/lib/standards/standards-context-injector.js +0 -302
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
- package/src/lib/validators/blazor/blazor-validator.js +0 -369
- package/src/lib/validators/blazor/index.js +0 -9
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
@* ============================================================
|
|
2
|
-
BLAZOR COMPONENT TEMPLATE
|
|
3
|
-
Generated by MORPH Framework
|
|
4
|
-
============================================================ *@
|
|
5
|
-
|
|
6
|
-
@page "/{{kebabCase FEATURE_NAME}}/{{kebabCase FEATURE_NAME}}s"
|
|
7
|
-
@attribute [Authorize(Policy = "CanView{{pascalCase FEATURE_NAME}}")]
|
|
8
|
-
@inject I{{pascalCase FEATURE_NAME}}Service {{pascalCase FEATURE_NAME}}Service
|
|
9
|
-
@inject ILogger<{{pascalCase FEATURE_NAME}}List> Logger
|
|
10
|
-
@inject NavigationManager Navigation
|
|
11
|
-
|
|
12
|
-
<PageTitle>{{pascalCase FEATURE_NAME}}s</PageTitle>
|
|
13
|
-
|
|
14
|
-
<div class="container-fluid">
|
|
15
|
-
<div class="row mb-4">
|
|
16
|
-
<div class="col">
|
|
17
|
-
<h1>{{pascalCase FEATURE_NAME}}s</h1>
|
|
18
|
-
</div>
|
|
19
|
-
<div class="col-auto">
|
|
20
|
-
<AuthorizeView Policy="CanManage{{pascalCase FEATURE_NAME}}">
|
|
21
|
-
<button class="btn btn-primary" @onclick="ShowCreateModal">
|
|
22
|
-
<i class="bi bi-plus-lg"></i> New {{pascalCase FEATURE_NAME}}
|
|
23
|
-
</button>
|
|
24
|
-
</AuthorizeView>
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
@if (_isLoading)
|
|
29
|
-
{
|
|
30
|
-
<div class="d-flex justify-content-center py-5">
|
|
31
|
-
<div class="spinner-border text-primary" role="status">
|
|
32
|
-
<span class="visually-hidden">Loading...</span>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
}
|
|
36
|
-
else if (_error is not null)
|
|
37
|
-
{
|
|
38
|
-
<div class="alert alert-danger" role="alert">
|
|
39
|
-
<i class="bi bi-exclamation-triangle"></i>
|
|
40
|
-
@_error
|
|
41
|
-
<button class="btn btn-link" @onclick="LoadDataAsync">Retry</button>
|
|
42
|
-
</div>
|
|
43
|
-
}
|
|
44
|
-
else if (_items is null || !_items.Any())
|
|
45
|
-
{
|
|
46
|
-
<div class="text-center py-5">
|
|
47
|
-
<i class="bi bi-inbox display-1 text-muted"></i>
|
|
48
|
-
<p class="lead mt-3">No {{kebabCase FEATURE_NAME}}s found</p>
|
|
49
|
-
<AuthorizeView Policy="CanManage{{pascalCase FEATURE_NAME}}">
|
|
50
|
-
<button class="btn btn-primary" @onclick="ShowCreateModal">
|
|
51
|
-
Create your first {{kebabCase FEATURE_NAME}}
|
|
52
|
-
</button>
|
|
53
|
-
</AuthorizeView>
|
|
54
|
-
</div>
|
|
55
|
-
}
|
|
56
|
-
else
|
|
57
|
-
{
|
|
58
|
-
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4">
|
|
59
|
-
@foreach (var item in _items)
|
|
60
|
-
{
|
|
61
|
-
<div class="col">
|
|
62
|
-
<div class="card h-100">
|
|
63
|
-
<div class="card-body">
|
|
64
|
-
<h5 class="card-title">@item.Name</h5>
|
|
65
|
-
<p class="card-text">
|
|
66
|
-
<span class="badge @GetStatusBadgeClass(item.Status)">
|
|
67
|
-
@item.Status
|
|
68
|
-
</span>
|
|
69
|
-
</p>
|
|
70
|
-
</div>
|
|
71
|
-
<div class="card-footer bg-transparent">
|
|
72
|
-
<small class="text-muted">
|
|
73
|
-
Created @item.CreatedAt.ToString("d")
|
|
74
|
-
</small>
|
|
75
|
-
<AuthorizeView Policy="CanManage{{pascalCase FEATURE_NAME}}">
|
|
76
|
-
<div class="float-end">
|
|
77
|
-
<button class="btn btn-sm btn-outline-primary"
|
|
78
|
-
@onclick="() => ShowEditModal(item)">
|
|
79
|
-
Edit
|
|
80
|
-
</button>
|
|
81
|
-
</div>
|
|
82
|
-
</AuthorizeView>
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
}
|
|
87
|
-
</div>
|
|
88
|
-
}
|
|
89
|
-
</div>
|
|
90
|
-
|
|
91
|
-
@* Modal for Create/Edit *@
|
|
92
|
-
@if (_showModal)
|
|
93
|
-
{
|
|
94
|
-
<div class="modal fade show d-block" tabindex="-1" style="background: rgba(0,0,0,0.5)">
|
|
95
|
-
<div class="modal-dialog">
|
|
96
|
-
<div class="modal-content">
|
|
97
|
-
<div class="modal-header">
|
|
98
|
-
<h5 class="modal-title">
|
|
99
|
-
@(_editingItem is null ? "New {{pascalCase FEATURE_NAME}}" : "Edit {{pascalCase FEATURE_NAME}}")
|
|
100
|
-
</h5>
|
|
101
|
-
<button type="button" class="btn-close" @onclick="CloseModal"></button>
|
|
102
|
-
</div>
|
|
103
|
-
<EditForm Model="_formModel" OnValidSubmit="HandleSubmitAsync">
|
|
104
|
-
<DataAnnotationsValidator />
|
|
105
|
-
<div class="modal-body">
|
|
106
|
-
<div class="mb-3">
|
|
107
|
-
<label class="form-label">Name</label>
|
|
108
|
-
<InputText class="form-control" @bind-Value="_formModel.Name" />
|
|
109
|
-
<ValidationMessage For="() => _formModel.Name" />
|
|
110
|
-
</div>
|
|
111
|
-
@* Add more fields as needed *@
|
|
112
|
-
</div>
|
|
113
|
-
<div class="modal-footer">
|
|
114
|
-
<button type="button" class="btn btn-secondary" @onclick="CloseModal">
|
|
115
|
-
Cancel
|
|
116
|
-
</button>
|
|
117
|
-
<button type="submit" class="btn btn-primary" disabled="@_isSaving">
|
|
118
|
-
@if (_isSaving)
|
|
119
|
-
{
|
|
120
|
-
<span class="spinner-border spinner-border-sm"></span>
|
|
121
|
-
}
|
|
122
|
-
Save
|
|
123
|
-
</button>
|
|
124
|
-
</div>
|
|
125
|
-
</EditForm>
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
</div>
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
@code {
|
|
132
|
-
private List<{{pascalCase FEATURE_NAME}}Dto>? _items;
|
|
133
|
-
private bool _isLoading = true;
|
|
134
|
-
private bool _showModal;
|
|
135
|
-
private bool _isSaving;
|
|
136
|
-
private string? _error;
|
|
137
|
-
private {{pascalCase FEATURE_NAME}}Dto? _editingItem;
|
|
138
|
-
private {{pascalCase FEATURE_NAME}}FormModel _formModel = new();
|
|
139
|
-
|
|
140
|
-
protected override async Task OnInitializedAsync()
|
|
141
|
-
{
|
|
142
|
-
await LoadDataAsync();
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
private async Task LoadDataAsync()
|
|
146
|
-
{
|
|
147
|
-
_isLoading = true;
|
|
148
|
-
_error = null;
|
|
149
|
-
|
|
150
|
-
try
|
|
151
|
-
{
|
|
152
|
-
_items = await {{pascalCase FEATURE_NAME}}Service.GetAllAsync();
|
|
153
|
-
}
|
|
154
|
-
catch (Exception ex)
|
|
155
|
-
{
|
|
156
|
-
Logger.LogError(ex, "Failed to load {{kebabCase FEATURE_NAME}}s");
|
|
157
|
-
_error = "Failed to load data. Please try again.";
|
|
158
|
-
}
|
|
159
|
-
finally
|
|
160
|
-
{
|
|
161
|
-
_isLoading = false;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
private void ShowCreateModal()
|
|
166
|
-
{
|
|
167
|
-
_editingItem = null;
|
|
168
|
-
_formModel = new {{pascalCase FEATURE_NAME}}FormModel();
|
|
169
|
-
_showModal = true;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
private void ShowEditModal({{pascalCase FEATURE_NAME}}Dto item)
|
|
173
|
-
{
|
|
174
|
-
_editingItem = item;
|
|
175
|
-
_formModel = new {{pascalCase FEATURE_NAME}}FormModel
|
|
176
|
-
{
|
|
177
|
-
Name = item.Name
|
|
178
|
-
// Map other fields
|
|
179
|
-
};
|
|
180
|
-
_showModal = true;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
private void CloseModal()
|
|
184
|
-
{
|
|
185
|
-
_showModal = false;
|
|
186
|
-
_formModel = new();
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
private async Task HandleSubmitAsync()
|
|
190
|
-
{
|
|
191
|
-
_isSaving = true;
|
|
192
|
-
|
|
193
|
-
try
|
|
194
|
-
{
|
|
195
|
-
if (_editingItem is null)
|
|
196
|
-
{
|
|
197
|
-
// Create
|
|
198
|
-
var request = new Create{{pascalCase FEATURE_NAME}}Request(_formModel.Name);
|
|
199
|
-
await {{pascalCase FEATURE_NAME}}Service.CreateAsync(request);
|
|
200
|
-
}
|
|
201
|
-
else
|
|
202
|
-
{
|
|
203
|
-
// Update
|
|
204
|
-
var request = new Update{{pascalCase FEATURE_NAME}}Request(_formModel.Name);
|
|
205
|
-
await {{pascalCase FEATURE_NAME}}Service.UpdateAsync(_editingItem.Id, request);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
CloseModal();
|
|
209
|
-
await LoadDataAsync();
|
|
210
|
-
}
|
|
211
|
-
catch (Exception ex)
|
|
212
|
-
{
|
|
213
|
-
Logger.LogError(ex, "Failed to save {{kebabCase FEATURE_NAME}}");
|
|
214
|
-
// Show error to user
|
|
215
|
-
}
|
|
216
|
-
finally
|
|
217
|
-
{
|
|
218
|
-
_isSaving = false;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
private static string GetStatusBadgeClass({{pascalCase FEATURE_NAME}}Status status) => status switch
|
|
223
|
-
{
|
|
224
|
-
{{pascalCase FEATURE_NAME}}Status.Active => "bg-success",
|
|
225
|
-
{{pascalCase FEATURE_NAME}}Status.Pending => "bg-warning text-dark",
|
|
226
|
-
{{pascalCase FEATURE_NAME}}Status.Completed => "bg-info",
|
|
227
|
-
{{pascalCase FEATURE_NAME}}Status.Failed => "bg-danger",
|
|
228
|
-
_ => "bg-secondary"
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
private class {{pascalCase FEATURE_NAME}}FormModel
|
|
232
|
-
{
|
|
233
|
-
[Required]
|
|
234
|
-
[StringLength(200, MinimumLength = 3)]
|
|
235
|
-
public string Name { get; set; } = string.Empty;
|
|
236
|
-
|
|
237
|
-
// Add more fields as needed
|
|
238
|
-
}
|
|
239
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# ==============================================================================
|
|
2
|
-
# MORPH-SPEC - .NET 8 Blazor Server Dockerfile
|
|
3
|
-
# Multi-stage build for production-ready container
|
|
4
|
-
# ==============================================================================
|
|
5
|
-
|
|
6
|
-
# ==============================================================================
|
|
7
|
-
# Stage 1: Base Runtime
|
|
8
|
-
# ==============================================================================
|
|
9
|
-
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
|
10
|
-
|
|
11
|
-
# Set working directory
|
|
12
|
-
WORKDIR /app
|
|
13
|
-
|
|
14
|
-
# Expose ports
|
|
15
|
-
EXPOSE 8080
|
|
16
|
-
EXPOSE 8081
|
|
17
|
-
|
|
18
|
-
# Create non-root user for security
|
|
19
|
-
RUN adduser --disabled-password --gecos '' appuser && chown -R appuser /app
|
|
20
|
-
USER appuser
|
|
21
|
-
|
|
22
|
-
# ==============================================================================
|
|
23
|
-
# Stage 2: Build
|
|
24
|
-
# ==============================================================================
|
|
25
|
-
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
|
26
|
-
|
|
27
|
-
# Set working directory
|
|
28
|
-
WORKDIR /src
|
|
29
|
-
|
|
30
|
-
# Copy project files
|
|
31
|
-
# Adjust paths according to your solution structure
|
|
32
|
-
COPY ["src/YourApp/YourApp.csproj", "src/YourApp/"]
|
|
33
|
-
COPY ["src/YourApp.Core/YourApp.Core.csproj", "src/YourApp.Core/"]
|
|
34
|
-
COPY ["src/YourApp.Infrastructure/YourApp.Infrastructure.csproj", "src/YourApp.Infrastructure/"]
|
|
35
|
-
|
|
36
|
-
# Restore dependencies
|
|
37
|
-
RUN dotnet restore "src/YourApp/YourApp.csproj"
|
|
38
|
-
|
|
39
|
-
# Copy all source code
|
|
40
|
-
COPY . .
|
|
41
|
-
|
|
42
|
-
# Build project
|
|
43
|
-
WORKDIR "/src/src/YourApp"
|
|
44
|
-
RUN dotnet build "YourApp.csproj" -c Release -o /app/build
|
|
45
|
-
|
|
46
|
-
# ==============================================================================
|
|
47
|
-
# Stage 3: Publish
|
|
48
|
-
# ==============================================================================
|
|
49
|
-
FROM build AS publish
|
|
50
|
-
|
|
51
|
-
# Publish application
|
|
52
|
-
RUN dotnet publish "YourApp.csproj" \
|
|
53
|
-
-c Release \
|
|
54
|
-
-o /app/publish \
|
|
55
|
-
/p:UseAppHost=false \
|
|
56
|
-
/p:PublishTrimmed=false \
|
|
57
|
-
/p:PublishSingleFile=false
|
|
58
|
-
|
|
59
|
-
# ==============================================================================
|
|
60
|
-
# Stage 4: Final
|
|
61
|
-
# ==============================================================================
|
|
62
|
-
FROM base AS final
|
|
63
|
-
|
|
64
|
-
# Set working directory
|
|
65
|
-
WORKDIR /app
|
|
66
|
-
|
|
67
|
-
# Copy published files from publish stage
|
|
68
|
-
COPY --from=publish /app/publish .
|
|
69
|
-
|
|
70
|
-
# Set environment variables
|
|
71
|
-
ENV ASPNETCORE_URLS=http://+:8080
|
|
72
|
-
ENV ASPNETCORE_ENVIRONMENT=Production
|
|
73
|
-
ENV DOTNET_RUNNING_IN_CONTAINER=true
|
|
74
|
-
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
|
|
75
|
-
|
|
76
|
-
# Health check endpoint
|
|
77
|
-
# Adjust path to match your health check endpoint
|
|
78
|
-
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
|
|
79
|
-
CMD curl -f http://localhost:8080/health || exit 1
|
|
80
|
-
|
|
81
|
-
# Set entry point
|
|
82
|
-
ENTRYPOINT ["dotnet", "YourApp.dll"]
|
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
# MORPH-SPEC - Templates Bicep
|
|
2
|
-
|
|
3
|
-
Templates de infraestrutura para Azure com suporte a App Service e Container Apps.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 🚀 Quick Start
|
|
8
|
-
|
|
9
|
-
### 1. App Service Free (Desenvolvimento - $0/mês)
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
# Deploy infraestrutura com App Service Free
|
|
13
|
-
az deployment group create \
|
|
14
|
-
--resource-group rg-myapp-dev \
|
|
15
|
-
--template-file main.bicep \
|
|
16
|
-
--parameters @parameters.dev.json \
|
|
17
|
-
--parameters appName=myapp
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### 2. Container Apps (Produção - $5-15/mês)
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
# Build e push imagem para ACR
|
|
24
|
-
az acr build \
|
|
25
|
-
--registry acrXXXX \
|
|
26
|
-
--image myapp:v1.0.0 \
|
|
27
|
-
--file Dockerfile \
|
|
28
|
-
.
|
|
29
|
-
|
|
30
|
-
# Deploy infraestrutura com Container Apps
|
|
31
|
-
az deployment group create \
|
|
32
|
-
--resource-group rg-myapp-prod \
|
|
33
|
-
--template-file main.bicep \
|
|
34
|
-
--parameters @parameters.prod.json \
|
|
35
|
-
--parameters appName=myapp
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## 📁 Estrutura de Arquivos
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
infra/
|
|
44
|
-
├── main.bicep # Entry point com lógica condicional
|
|
45
|
-
├── parameters.dev.json # Params dev (App Service Free)
|
|
46
|
-
├── parameters.prod.json # Params prod (Container Apps)
|
|
47
|
-
├── app-service.bicep # Template App Service
|
|
48
|
-
├── container-app.bicep # Template Container App
|
|
49
|
-
├── container-app-env.bicep # Container Apps Environment
|
|
50
|
-
├── sql-database.bicep # Azure SQL Database
|
|
51
|
-
├── storage.bicep # Storage Account
|
|
52
|
-
├── key-vault.bicep # Key Vault
|
|
53
|
-
└── app-insights.bicep # Application Insights
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## ⚙️ Parâmetros Principais
|
|
59
|
-
|
|
60
|
-
### main.bicep
|
|
61
|
-
|
|
62
|
-
| Parâmetro | Tipo | Default | Descrição |
|
|
63
|
-
|-----------|------|---------|-----------|
|
|
64
|
-
| `environment` | string | `dev` | Ambiente (dev, staging, prod) |
|
|
65
|
-
| `appName` | string | **required** | Nome da aplicação (3-15 chars) |
|
|
66
|
-
| `location` | string | `resourceGroup().location` | Região Azure |
|
|
67
|
-
| `hostingType` | string | `appservice` | Tipo de hosting (`appservice` ou `containerapp`) |
|
|
68
|
-
| `appServiceSku` | string | `F1` | SKU do App Service (F1, B1, S1, P1v2) |
|
|
69
|
-
| `containerImage` | string | `mcr.microsoft.com/hello-world:latest` | Imagem Docker (apenas Container Apps) |
|
|
70
|
-
| `sqlAdminPassword` | securestring | **required** | Senha do SQL Server |
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## 🌐 Escolhendo o Hosting Type
|
|
75
|
-
|
|
76
|
-
### App Service (`hostingType: appservice`)
|
|
77
|
-
|
|
78
|
-
**Usar quando:**
|
|
79
|
-
- ✅ Orçamento zero (Free F1)
|
|
80
|
-
- ✅ MVP ou protótipo
|
|
81
|
-
- ✅ Tráfego baixo (<100 req/dia)
|
|
82
|
-
- ✅ App tolerante a cold starts (20 min sleep)
|
|
83
|
-
- ✅ Deploy simplificado (sem Docker)
|
|
84
|
-
|
|
85
|
-
**SKUs disponíveis:**
|
|
86
|
-
- `F1` (Free): $0/mês - 1GB RAM, 60 min CPU/dia, sleep após 20min
|
|
87
|
-
- `B1` (Basic): $13/mês - 1.75GB RAM, always-on
|
|
88
|
-
- `S1` (Standard): $70/mês - 1.75GB RAM, auto-scale, slots
|
|
89
|
-
- `P1v2` (Premium): $85/mês - 3.5GB RAM, melhor performance
|
|
90
|
-
|
|
91
|
-
### Container Apps (`hostingType: containerapp`)
|
|
92
|
-
|
|
93
|
-
**Usar quando:**
|
|
94
|
-
- ✅ Produção com SLA 24/7
|
|
95
|
-
- ✅ Auto-scaling baseado em demanda
|
|
96
|
-
- ✅ SSL customizado necessário
|
|
97
|
-
- ✅ Background jobs (Hangfire)
|
|
98
|
-
- ✅ Arquitetura microserviços
|
|
99
|
-
|
|
100
|
-
**Custo:** $0-15/mês (scale-to-zero + consumo)
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## 📝 Configuração por Ambiente
|
|
105
|
-
|
|
106
|
-
### Development (parameters.dev.json)
|
|
107
|
-
|
|
108
|
-
```json
|
|
109
|
-
{
|
|
110
|
-
"environment": { "value": "dev" },
|
|
111
|
-
"hostingType": { "value": "appservice" },
|
|
112
|
-
"appServiceSku": { "value": "F1" }
|
|
113
|
-
}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
**Infraestrutura:**
|
|
117
|
-
- App Service Free F1
|
|
118
|
-
- Azure SQL Free (32GB)
|
|
119
|
-
- App Insights Free (5GB)
|
|
120
|
-
|
|
121
|
-
**Custo total:** $0/mês
|
|
122
|
-
|
|
123
|
-
### Staging (parameters.staging.json)
|
|
124
|
-
|
|
125
|
-
```json
|
|
126
|
-
{
|
|
127
|
-
"environment": { "value": "staging" },
|
|
128
|
-
"hostingType": { "value": "containerapp" },
|
|
129
|
-
"minReplicas": { "value": 0 } // scale-to-zero
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**Infraestrutura:**
|
|
134
|
-
- Container Apps (scale-to-zero)
|
|
135
|
-
- Azure SQL Free (32GB)
|
|
136
|
-
- ACR Basic
|
|
137
|
-
- App Insights Free
|
|
138
|
-
|
|
139
|
-
**Custo total:** $5-10/mês
|
|
140
|
-
|
|
141
|
-
### Production (parameters.prod.json)
|
|
142
|
-
|
|
143
|
-
```json
|
|
144
|
-
{
|
|
145
|
-
"environment": { "value": "prod" },
|
|
146
|
-
"hostingType": { "value": "containerapp" },
|
|
147
|
-
"minReplicas": { "value": 1 } // always-on
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
**Infraestrutura:**
|
|
152
|
-
- Container Apps (min 1 replica)
|
|
153
|
-
- Azure SQL Free (ou pago se necessário)
|
|
154
|
-
- ACR Basic
|
|
155
|
-
- App Insights (pode ultrapassar free tier)
|
|
156
|
-
|
|
157
|
-
**Custo total:** $10-20/mês
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## 🔧 Customização
|
|
162
|
-
|
|
163
|
-
### Adicionar variáveis de ambiente
|
|
164
|
-
|
|
165
|
-
**App Service:**
|
|
166
|
-
```bicep
|
|
167
|
-
module appService 'app-service.bicep' = {
|
|
168
|
-
params: {
|
|
169
|
-
envVars: {
|
|
170
|
-
MY_CUSTOM_VAR: 'value'
|
|
171
|
-
ANOTHER_VAR: 'another-value'
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**Container Apps:**
|
|
178
|
-
```bicep
|
|
179
|
-
module containerApp 'container-app.bicep' = {
|
|
180
|
-
params: {
|
|
181
|
-
envVars: [
|
|
182
|
-
{
|
|
183
|
-
name: 'MY_CUSTOM_VAR'
|
|
184
|
-
value: 'value'
|
|
185
|
-
}
|
|
186
|
-
]
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### Usar secrets do Key Vault
|
|
192
|
-
|
|
193
|
-
```bicep
|
|
194
|
-
param sqlAdminPassword string {
|
|
195
|
-
reference: {
|
|
196
|
-
keyVault: {
|
|
197
|
-
id: '/subscriptions/.../providers/Microsoft.KeyVault/vaults/kv-myapp'
|
|
198
|
-
}
|
|
199
|
-
secretName: 'sql-admin-password'
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
## 🔄 Migração App Service → Container Apps
|
|
207
|
-
|
|
208
|
-
Ver guia completo em: `../../standards/migration-guide.md`
|
|
209
|
-
|
|
210
|
-
**Resumo:**
|
|
211
|
-
1. Criar Dockerfile
|
|
212
|
-
2. Implementar health checks
|
|
213
|
-
3. Build e push para ACR
|
|
214
|
-
4. Atualizar `parameters.json` → `hostingType: containerapp`
|
|
215
|
-
5. Redeploy
|
|
216
|
-
6. Testar
|
|
217
|
-
7. Cutover DNS
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## 📊 Outputs Gerados
|
|
222
|
-
|
|
223
|
-
Após deploy, os seguintes outputs são gerados:
|
|
224
|
-
|
|
225
|
-
```bash
|
|
226
|
-
# Obter URL da aplicação
|
|
227
|
-
az deployment group show \
|
|
228
|
-
-g rg-myapp-dev \
|
|
229
|
-
-n deployment-name \
|
|
230
|
-
--query properties.outputs.appUrl.value
|
|
231
|
-
|
|
232
|
-
# Obter connection string SQL
|
|
233
|
-
az deployment group show \
|
|
234
|
-
-g rg-myapp-dev \
|
|
235
|
-
-n deployment-name \
|
|
236
|
-
--query properties.outputs.sqlConnectionString.value
|
|
237
|
-
|
|
238
|
-
# Obter App Insights connection string
|
|
239
|
-
az deployment group show \
|
|
240
|
-
-g rg-myapp-dev \
|
|
241
|
-
-n deployment-name \
|
|
242
|
-
--query properties.outputs.appInsightsConnectionString.value
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
247
|
-
## 🆘 Troubleshooting
|
|
248
|
-
|
|
249
|
-
### Erro: "The template deployment 'X' is not valid"
|
|
250
|
-
|
|
251
|
-
Validar template:
|
|
252
|
-
```bash
|
|
253
|
-
az deployment group validate \
|
|
254
|
-
--resource-group rg-myapp-dev \
|
|
255
|
-
--template-file main.bicep \
|
|
256
|
-
--parameters @parameters.dev.json
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
### Erro: "SKU not available in this location"
|
|
260
|
-
|
|
261
|
-
Verificar SKUs disponíveis:
|
|
262
|
-
```bash
|
|
263
|
-
az appservice list-locations --sku F1
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
### Deploy muito lento
|
|
267
|
-
|
|
268
|
-
Container Apps pode levar 5-10 minutos no primeiro deploy. Use `--no-wait` para não bloquear:
|
|
269
|
-
```bash
|
|
270
|
-
az deployment group create \
|
|
271
|
-
... \
|
|
272
|
-
--no-wait
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
---
|
|
276
|
-
|
|
277
|
-
## 📚 Referências
|
|
278
|
-
|
|
279
|
-
- [Bicep Documentation](https://learn.microsoft.com/azure/azure-resource-manager/bicep/)
|
|
280
|
-
- [App Service Bicep Reference](https://learn.microsoft.com/azure/templates/microsoft.web/sites)
|
|
281
|
-
- [Container Apps Bicep Reference](https://learn.microsoft.com/azure/templates/microsoft.app/containerapps)
|
|
282
|
-
- [Azure CLI Reference](https://learn.microsoft.com/cli/azure/)
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
// ==============================================================================
|
|
2
|
-
// MORPH-SPEC - Application Insights
|
|
3
|
-
// Azure Application Insights for monitoring and telemetry
|
|
4
|
-
// ==============================================================================
|
|
5
|
-
|
|
6
|
-
@description('Application Insights name')
|
|
7
|
-
param name string
|
|
8
|
-
|
|
9
|
-
@description('Location')
|
|
10
|
-
param location string
|
|
11
|
-
|
|
12
|
-
@description('Tags')
|
|
13
|
-
param tags object = {}
|
|
14
|
-
|
|
15
|
-
@description('Log Analytics Workspace ID')
|
|
16
|
-
param logAnalyticsWorkspaceId string
|
|
17
|
-
|
|
18
|
-
@description('Application type')
|
|
19
|
-
@allowed(['web', 'other'])
|
|
20
|
-
param applicationType string = 'web'
|
|
21
|
-
|
|
22
|
-
@description('Retention in days')
|
|
23
|
-
@minValue(30)
|
|
24
|
-
@maxValue(730)
|
|
25
|
-
param retentionInDays int = 90
|
|
26
|
-
|
|
27
|
-
// ==============================================================================
|
|
28
|
-
// APPLICATION INSIGHTS
|
|
29
|
-
// ==============================================================================
|
|
30
|
-
|
|
31
|
-
resource appInsights 'Microsoft.Insights/components@2020-02-02' = {
|
|
32
|
-
name: name
|
|
33
|
-
location: location
|
|
34
|
-
tags: tags
|
|
35
|
-
kind: applicationType
|
|
36
|
-
properties: {
|
|
37
|
-
Application_Type: applicationType
|
|
38
|
-
WorkspaceResourceId: logAnalyticsWorkspaceId
|
|
39
|
-
IngestionMode: 'LogAnalytics'
|
|
40
|
-
publicNetworkAccessForIngestion: 'Enabled'
|
|
41
|
-
publicNetworkAccessForQuery: 'Enabled'
|
|
42
|
-
RetentionInDays: retentionInDays
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// ==============================================================================
|
|
47
|
-
// OUTPUTS
|
|
48
|
-
// ==============================================================================
|
|
49
|
-
|
|
50
|
-
@description('Application Insights ID')
|
|
51
|
-
output id string = appInsights.id
|
|
52
|
-
|
|
53
|
-
@description('Application Insights name')
|
|
54
|
-
output name string = appInsights.name
|
|
55
|
-
|
|
56
|
-
@description('Instrumentation Key')
|
|
57
|
-
output instrumentationKey string = appInsights.properties.InstrumentationKey
|
|
58
|
-
|
|
59
|
-
@description('Connection String')
|
|
60
|
-
output connectionString string = appInsights.properties.ConnectionString
|
|
61
|
-
|
|
62
|
-
@description('App ID')
|
|
63
|
-
output appId string = appInsights.properties.AppId
|