@polymorphism-tech/morph-spec 2.4.0 → 3.0.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 +158 -26
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +8 -0
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- 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-archive.md +79 -79
- package/content/.claude/commands/morph-deploy.md +529 -0
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -227
- package/content/.claude/commands/morph-troubleshoot.md +122 -122
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
- package/content/.claude/skills/level-0-meta/README.md +7 -0
- package/content/.claude/skills/{checklists → level-0-meta}/morph-checklist.md +117 -117
- package/content/.claude/skills/level-1-workflows/README.md +7 -0
- package/content/.claude/skills/{workflows → level-1-workflows}/morph-replicate.md +213 -213
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-clarify.md +131 -131
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-design.md +213 -205
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-setup.md +106 -92
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-tasks.md +164 -164
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-uiux.md +169 -138
- package/content/.claude/skills/level-2-domains/README.md +14 -0
- package/content/.claude/skills/{specialists → level-2-domains/quality}/testing-specialist.md +126 -126
- package/content/.claude/skills/level-3-technologies/README.md +7 -0
- package/content/.claude/skills/level-4-patterns/README.md +7 -0
- package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
- package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +742 -358
- package/content/.morph/config/config.template.json +33 -0
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -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 -158
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -95
- package/content/.morph/examples/scheduled-reports/spec.md +267 -267
- package/content/.morph/examples/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +158 -0
- 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/hooks/task-completed.js +73 -0
- package/content/.morph/hooks/teammate-idle.js +68 -0
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -220
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-teams-workflow.md +474 -0
- package/content/.morph/standards/coding.md +377 -377
- 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/CONTEXT-FEATURE.md +276 -0
- package/content/.morph/templates/CONTEXT.md +170 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/clarify-questions.md +159 -159
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -74
- package/content/.morph/templates/contracts/Entities.cs +25 -25
- package/content/.morph/templates/contracts/Queries.cs +74 -74
- package/content/.morph/templates/contracts/README.md +74 -74
- package/content/.morph/templates/contracts.cs +217 -217
- 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/azure-pipelines-deploy.yml +480 -0
- 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 -426
- 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/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/sprint-status.yaml +68 -68
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/test.cs +239 -239
- 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/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/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/templates.md +418 -418
- package/package.json +1 -1
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +83 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -0
- package/src/commands/detect-agents.js +34 -6
- package/src/commands/detect.js +104 -104
- package/src/commands/generate-context.js +40 -0
- package/src/commands/generate.js +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- 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/troubleshoot.js +222 -222
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/context-generator.js +513 -0
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-detector.js +187 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/design-system-scaffolder.js +299 -0
- package/src/lib/hook-executor.js +256 -0
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/spec-validator.js +258 -0
- package/src/lib/standards-context-injector.js +287 -0
- package/src/lib/team-orchestrator.js +322 -0
- package/src/lib/troubleshoot-grep.js +194 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validation-runner.js +65 -13
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/design-system-validator.js +231 -0
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/file-copier.js +9 -1
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/content/.claude/skills/{checklists → level-0-meta}/code-review.md +0 -0
- /package/content/.claude/skills/{checklists → level-0-meta}/simulation-checklist.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/ai-agents}/ai-system-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/standards-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/dotnet-senior.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ef-modeler.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/hangfire-orchestrator.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ms-agent-expert.md +0 -0
- /package/content/.claude/skills/{stacks/dotnet-blazor.md → level-2-domains/frontend/blazor-builder.md} +0 -0
- /package/content/.claude/skills/{stacks/dotnet-nextjs.md → level-2-domains/frontend/nextjs-expert.md} +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/frontend}/ui-ux-designer.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/bicep-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/container-specialist.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/devops-engineer.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/asaas-financial.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/azure-identity.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/clerk-auth.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/resend-email.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/quality}/code-analyzer.md +0 -0
package/content/.claude/skills/{specialists → level-2-domains/quality}/testing-specialist.md
RENAMED
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
# Testing Specialist
|
|
2
|
-
|
|
3
|
-
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** test, testing, mock, fake, simulation, unit test, integration test
|
|
4
|
-
|
|
5
|
-
Especialista em testes, mocking e simulação para projetos .NET.
|
|
6
|
-
|
|
7
|
-
## Strategy
|
|
8
|
-
|
|
9
|
-
| Level | What | Tools |
|
|
10
|
-
|-------|------|-------|
|
|
11
|
-
| **Unit** | Business logic, domain, handlers | xUnit + Moq + FluentAssertions |
|
|
12
|
-
| **Integration** | API flows, DB operations | WebApplicationFactory + TestContainers |
|
|
13
|
-
| **Component** | Blazor rendering, events | bUnit |
|
|
14
|
-
| **E2E** | Critical user journeys | Playwright (if needed) |
|
|
15
|
-
|
|
16
|
-
**Focus:** Critical/complex code. Don't aim for 100%, aim for value. Cover edge cases and error paths.
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Core Patterns
|
|
21
|
-
|
|
22
|
-
### AAA (Arrange-Act-Assert)
|
|
23
|
-
|
|
24
|
-
```csharp
|
|
25
|
-
[Fact]
|
|
26
|
-
public async Task CreateOrder_Should_ReturnSuccess_When_ValidInput()
|
|
27
|
-
{
|
|
28
|
-
// Arrange
|
|
29
|
-
var command = new CreateOrderCommand { CustomerId = 1, Items = [...] };
|
|
30
|
-
var handler = new CreateOrderHandler(_mockRepo.Object);
|
|
31
|
-
// Act
|
|
32
|
-
var result = await handler.Handle(command, CancellationToken.None);
|
|
33
|
-
// Assert
|
|
34
|
-
result.IsSuccess.Should().BeTrue();
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### Naming Convention
|
|
39
|
-
```
|
|
40
|
-
[Method]_Should_[ExpectedResult]_When_[Condition]
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Test Data Builders
|
|
44
|
-
Use builder pattern for complex test entities: `new OrderBuilder().WithCustomer(123).WithStatus(Completed).Build()`
|
|
45
|
-
|
|
46
|
-
### Mocking (Moq)
|
|
47
|
-
```csharp
|
|
48
|
-
var mockRepo = new Mock<IOrderRepository>();
|
|
49
|
-
mockRepo.Setup(r => r.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(new Order { Id = 1 });
|
|
50
|
-
mockRepo.Verify(r => r.SaveAsync(It.IsAny<Order>()), Times.Once);
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Integration Tests (WebApplicationFactory)
|
|
54
|
-
Replace real DB with in-memory in `ConfigureServices`, use `CreateClient()` for HTTP calls.
|
|
55
|
-
|
|
56
|
-
### bUnit (Blazor)
|
|
57
|
-
`RenderComponent<Counter>()` → `Find("button").Click()` → assert `TextContent`.
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## Libraries
|
|
62
|
-
|
|
63
|
-
| Library | Purpose | NuGet |
|
|
64
|
-
|---------|---------|-------|
|
|
65
|
-
| xUnit | Test framework | `xunit` |
|
|
66
|
-
| Moq | Mocking | `Moq` |
|
|
67
|
-
| FluentAssertions | Readable assertions | `FluentAssertions` |
|
|
68
|
-
| Bogus | Fake data | `Bogus` |
|
|
69
|
-
| TestContainers | DB containers | `Testcontainers` |
|
|
70
|
-
| Respawn | DB reset | `Respawn` |
|
|
71
|
-
| WireMock | HTTP mocking | `WireMock.Net` |
|
|
72
|
-
| bUnit | Blazor testing | `bunit` |
|
|
73
|
-
|
|
74
|
-
## Folder Structure
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
tests/
|
|
78
|
-
├── Unit/{Domain,Application,Builders}/
|
|
79
|
-
├── Integration/{Api,Fixtures}/
|
|
80
|
-
└── E2E/
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Anti-Patterns
|
|
84
|
-
1. **Fragile tests** — test behavior, not implementation
|
|
85
|
-
2. **Slow tests** — use mocks, not real DB for unit tests
|
|
86
|
-
3. **Coupled tests** — each test independent
|
|
87
|
-
4. **Vague assertions** — use specific FluentAssertions
|
|
88
|
-
5. **Giant setup** — extract to builders/fixtures
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## Simulation of External Services
|
|
93
|
-
|
|
94
|
-
> **Ref:** `.claude/skills/checklists/simulation-checklist.md` for complete checklist
|
|
95
|
-
|
|
96
|
-
### Key Rules
|
|
97
|
-
|
|
98
|
-
| Mock Type | Characteristic | DI Lifetime |
|
|
99
|
-
|-----------|---------------|-------------|
|
|
100
|
-
| **Stateful** (Dictionary, List) | Keeps data between calls | `Singleton` |
|
|
101
|
-
| **Stateless** | No state | `Scoped` |
|
|
102
|
-
|
|
103
|
-
```csharp
|
|
104
|
-
// ❌ Stateful with Scoped = loses state between requests
|
|
105
|
-
services.AddScoped<IReplicateClient, FakeReplicateClient>();
|
|
106
|
-
// ✅ Stateful with Singleton
|
|
107
|
-
services.AddSingleton<IReplicateClient, FakeReplicateClient>();
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**Before implementing mocks:** Map ALL dependencies (interfaces, transitive deps, lifetimes).
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Checklists
|
|
115
|
-
|
|
116
|
-
### Per Test Type
|
|
117
|
-
| Target | Test |
|
|
118
|
-
|--------|------|
|
|
119
|
-
| Entity/Domain | Creation validation, state transitions (valid + invalid), invariants |
|
|
120
|
-
| Handler/Service | Happy path, invalid input, not found (404), auth error, timeout |
|
|
121
|
-
| API | Status codes, response body, request validation, auth |
|
|
122
|
-
| Blazor Component | Initial render, user events, states (loading/error/empty), form validation |
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
1
|
+
# Testing Specialist
|
|
2
|
+
|
|
3
|
+
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** test, testing, mock, fake, simulation, unit test, integration test
|
|
4
|
+
|
|
5
|
+
Especialista em testes, mocking e simulação para projetos .NET.
|
|
6
|
+
|
|
7
|
+
## Strategy
|
|
8
|
+
|
|
9
|
+
| Level | What | Tools |
|
|
10
|
+
|-------|------|-------|
|
|
11
|
+
| **Unit** | Business logic, domain, handlers | xUnit + Moq + FluentAssertions |
|
|
12
|
+
| **Integration** | API flows, DB operations | WebApplicationFactory + TestContainers |
|
|
13
|
+
| **Component** | Blazor rendering, events | bUnit |
|
|
14
|
+
| **E2E** | Critical user journeys | Playwright (if needed) |
|
|
15
|
+
|
|
16
|
+
**Focus:** Critical/complex code. Don't aim for 100%, aim for value. Cover edge cases and error paths.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Core Patterns
|
|
21
|
+
|
|
22
|
+
### AAA (Arrange-Act-Assert)
|
|
23
|
+
|
|
24
|
+
```csharp
|
|
25
|
+
[Fact]
|
|
26
|
+
public async Task CreateOrder_Should_ReturnSuccess_When_ValidInput()
|
|
27
|
+
{
|
|
28
|
+
// Arrange
|
|
29
|
+
var command = new CreateOrderCommand { CustomerId = 1, Items = [...] };
|
|
30
|
+
var handler = new CreateOrderHandler(_mockRepo.Object);
|
|
31
|
+
// Act
|
|
32
|
+
var result = await handler.Handle(command, CancellationToken.None);
|
|
33
|
+
// Assert
|
|
34
|
+
result.IsSuccess.Should().BeTrue();
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Naming Convention
|
|
39
|
+
```
|
|
40
|
+
[Method]_Should_[ExpectedResult]_When_[Condition]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Test Data Builders
|
|
44
|
+
Use builder pattern for complex test entities: `new OrderBuilder().WithCustomer(123).WithStatus(Completed).Build()`
|
|
45
|
+
|
|
46
|
+
### Mocking (Moq)
|
|
47
|
+
```csharp
|
|
48
|
+
var mockRepo = new Mock<IOrderRepository>();
|
|
49
|
+
mockRepo.Setup(r => r.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(new Order { Id = 1 });
|
|
50
|
+
mockRepo.Verify(r => r.SaveAsync(It.IsAny<Order>()), Times.Once);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Integration Tests (WebApplicationFactory)
|
|
54
|
+
Replace real DB with in-memory in `ConfigureServices`, use `CreateClient()` for HTTP calls.
|
|
55
|
+
|
|
56
|
+
### bUnit (Blazor)
|
|
57
|
+
`RenderComponent<Counter>()` → `Find("button").Click()` → assert `TextContent`.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Libraries
|
|
62
|
+
|
|
63
|
+
| Library | Purpose | NuGet |
|
|
64
|
+
|---------|---------|-------|
|
|
65
|
+
| xUnit | Test framework | `xunit` |
|
|
66
|
+
| Moq | Mocking | `Moq` |
|
|
67
|
+
| FluentAssertions | Readable assertions | `FluentAssertions` |
|
|
68
|
+
| Bogus | Fake data | `Bogus` |
|
|
69
|
+
| TestContainers | DB containers | `Testcontainers` |
|
|
70
|
+
| Respawn | DB reset | `Respawn` |
|
|
71
|
+
| WireMock | HTTP mocking | `WireMock.Net` |
|
|
72
|
+
| bUnit | Blazor testing | `bunit` |
|
|
73
|
+
|
|
74
|
+
## Folder Structure
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
tests/
|
|
78
|
+
├── Unit/{Domain,Application,Builders}/
|
|
79
|
+
├── Integration/{Api,Fixtures}/
|
|
80
|
+
└── E2E/
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Anti-Patterns
|
|
84
|
+
1. **Fragile tests** — test behavior, not implementation
|
|
85
|
+
2. **Slow tests** — use mocks, not real DB for unit tests
|
|
86
|
+
3. **Coupled tests** — each test independent
|
|
87
|
+
4. **Vague assertions** — use specific FluentAssertions
|
|
88
|
+
5. **Giant setup** — extract to builders/fixtures
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Simulation of External Services
|
|
93
|
+
|
|
94
|
+
> **Ref:** `.claude/skills/checklists/simulation-checklist.md` for complete checklist
|
|
95
|
+
|
|
96
|
+
### Key Rules
|
|
97
|
+
|
|
98
|
+
| Mock Type | Characteristic | DI Lifetime |
|
|
99
|
+
|-----------|---------------|-------------|
|
|
100
|
+
| **Stateful** (Dictionary, List) | Keeps data between calls | `Singleton` |
|
|
101
|
+
| **Stateless** | No state | `Scoped` |
|
|
102
|
+
|
|
103
|
+
```csharp
|
|
104
|
+
// ❌ Stateful with Scoped = loses state between requests
|
|
105
|
+
services.AddScoped<IReplicateClient, FakeReplicateClient>();
|
|
106
|
+
// ✅ Stateful with Singleton
|
|
107
|
+
services.AddSingleton<IReplicateClient, FakeReplicateClient>();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Before implementing mocks:** Map ALL dependencies (interfaces, transitive deps, lifetimes).
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Checklists
|
|
115
|
+
|
|
116
|
+
### Per Test Type
|
|
117
|
+
| Target | Test |
|
|
118
|
+
|--------|------|
|
|
119
|
+
| Entity/Domain | Creation validation, state transitions (valid + invalid), invariants |
|
|
120
|
+
| Handler/Service | Happy path, invalid input, not found (404), auth error, timeout |
|
|
121
|
+
| API | Status codes, response body, request validation, auth |
|
|
122
|
+
| Blazor Component | Initial render, user events, states (loading/error/empty), form validation |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Prompt Engineer
|
|
2
|
+
|
|
3
|
+
Especialista em engenharia de prompts para LLMs e sistemas de IA. Use PROATIVAMENTE ao construir features de IA, melhorar performance de agentes ou criar system prompts.
|
|
4
|
+
|
|
5
|
+
## Responsabilidades
|
|
6
|
+
|
|
7
|
+
1. Criar prompts otimizados para LLMs
|
|
8
|
+
2. Aplicar técnicas avançadas de prompting
|
|
9
|
+
3. Definir formatos de output estruturados
|
|
10
|
+
4. Otimizar prompts existentes
|
|
11
|
+
5. Adaptar prompts para diferentes modelos
|
|
12
|
+
|
|
13
|
+
## Triggers
|
|
14
|
+
|
|
15
|
+
Keywords: `prompt`, `prompting`, `system prompt`, `few-shot`, `chain-of-thought`, `llm prompt`, `agent prompt`, `engenharia de prompt`
|
|
16
|
+
|
|
17
|
+
## Áreas de Expertise
|
|
18
|
+
|
|
19
|
+
### Otimização de Prompts
|
|
20
|
+
|
|
21
|
+
- Seleção few-shot vs zero-shot
|
|
22
|
+
- Raciocínio chain-of-thought
|
|
23
|
+
- Role-playing e definição de perspectiva
|
|
24
|
+
- Especificação de formato de output
|
|
25
|
+
- Definição de constraints e limites
|
|
26
|
+
|
|
27
|
+
### Arsenal de Técnicas
|
|
28
|
+
|
|
29
|
+
- Constitutional AI principles
|
|
30
|
+
- Recursive prompting
|
|
31
|
+
- Tree of thoughts
|
|
32
|
+
- Self-consistency checking
|
|
33
|
+
- Prompt chaining e pipelines
|
|
34
|
+
|
|
35
|
+
### Otimização por Modelo
|
|
36
|
+
|
|
37
|
+
- **Claude**: Ênfase em helpful, harmless, honest
|
|
38
|
+
- **GPT**: Estrutura clara e exemplos
|
|
39
|
+
- **Open models**: Necessidades específicas de formatação
|
|
40
|
+
- **Modelos especializados**: Adaptação de domínio
|
|
41
|
+
|
|
42
|
+
## Processo de Otimização
|
|
43
|
+
|
|
44
|
+
1. Analisar caso de uso pretendido
|
|
45
|
+
2. Identificar requisitos e constraints chave
|
|
46
|
+
3. Selecionar técnicas de prompting apropriadas
|
|
47
|
+
4. Criar prompt inicial com estrutura clara
|
|
48
|
+
5. Testar e iterar baseado em outputs
|
|
49
|
+
6. Documentar padrões efetivos
|
|
50
|
+
|
|
51
|
+
## Formato de Output Obrigatório
|
|
52
|
+
|
|
53
|
+
**IMPORTANTE:** SEMPRE que criar qualquer prompt, DEVE exibir o texto completo. NUNCA apenas descreva um prompt.
|
|
54
|
+
|
|
55
|
+
### O Prompt
|
|
56
|
+
```
|
|
57
|
+
[Exibir texto completo do prompt aqui]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Notas de Implementação
|
|
61
|
+
- Técnicas chave usadas
|
|
62
|
+
- Por que essas escolhas foram feitas
|
|
63
|
+
- Outcomes esperados
|
|
64
|
+
|
|
65
|
+
## Deliverables
|
|
66
|
+
|
|
67
|
+
- **O texto do prompt** (exibido completo, formatado)
|
|
68
|
+
- Explicação das escolhas de design
|
|
69
|
+
- Guidelines de uso
|
|
70
|
+
- Exemplos de outputs esperados
|
|
71
|
+
- Benchmarks de performance
|
|
72
|
+
- Estratégias de tratamento de erro
|
|
73
|
+
|
|
74
|
+
## Padrões Comuns
|
|
75
|
+
|
|
76
|
+
### Estrutura System/User/Assistant
|
|
77
|
+
```
|
|
78
|
+
<system>
|
|
79
|
+
[Contexto e personalidade]
|
|
80
|
+
</system>
|
|
81
|
+
|
|
82
|
+
<user>
|
|
83
|
+
[Input do usuário]
|
|
84
|
+
</user>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Tags XML para Seções Claras
|
|
88
|
+
```xml
|
|
89
|
+
<context>
|
|
90
|
+
[Background information]
|
|
91
|
+
</context>
|
|
92
|
+
|
|
93
|
+
<instructions>
|
|
94
|
+
[What to do]
|
|
95
|
+
</instructions>
|
|
96
|
+
|
|
97
|
+
<output_format>
|
|
98
|
+
[Expected format]
|
|
99
|
+
</output_format>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Outros Padrões
|
|
103
|
+
- Formatos de output explícitos
|
|
104
|
+
- Raciocínio passo-a-passo
|
|
105
|
+
- Critérios de auto-avaliação
|
|
106
|
+
|
|
107
|
+
## Exemplo de Output
|
|
108
|
+
|
|
109
|
+
Quando solicitado a criar prompt para code review:
|
|
110
|
+
|
|
111
|
+
### O Prompt
|
|
112
|
+
```
|
|
113
|
+
You are an expert code reviewer with 10+ years of experience. Review the provided code focusing on:
|
|
114
|
+
1. Security vulnerabilities
|
|
115
|
+
2. Performance optimizations
|
|
116
|
+
3. Code maintainability
|
|
117
|
+
4. Best practices
|
|
118
|
+
|
|
119
|
+
For each issue found, provide:
|
|
120
|
+
- Severity level (Critical/High/Medium/Low)
|
|
121
|
+
- Specific line numbers
|
|
122
|
+
- Explanation of the issue
|
|
123
|
+
- Suggested fix with code example
|
|
124
|
+
|
|
125
|
+
Format your response as a structured report with clear sections.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Notas de Implementação
|
|
129
|
+
- Usa role-playing para estabelecer expertise
|
|
130
|
+
- Fornece critérios de avaliação claros
|
|
131
|
+
- Especifica formato de output para consistência
|
|
132
|
+
- Inclui requisitos de feedback acionável
|
|
133
|
+
|
|
134
|
+
## Técnicas Avançadas
|
|
135
|
+
|
|
136
|
+
### Few-Shot Prompting
|
|
137
|
+
```
|
|
138
|
+
Here are examples of good responses:
|
|
139
|
+
|
|
140
|
+
Example 1:
|
|
141
|
+
Input: [example input]
|
|
142
|
+
Output: [example output]
|
|
143
|
+
|
|
144
|
+
Example 2:
|
|
145
|
+
Input: [example input]
|
|
146
|
+
Output: [example output]
|
|
147
|
+
|
|
148
|
+
Now process this:
|
|
149
|
+
Input: [actual input]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Chain-of-Thought
|
|
153
|
+
```
|
|
154
|
+
Think through this step by step:
|
|
155
|
+
1. First, identify...
|
|
156
|
+
2. Then, analyze...
|
|
157
|
+
3. Finally, conclude...
|
|
158
|
+
|
|
159
|
+
Show your reasoning before giving the final answer.
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Self-Consistency
|
|
163
|
+
```
|
|
164
|
+
Generate 3 different approaches to solve this problem.
|
|
165
|
+
Compare the approaches and select the most robust one.
|
|
166
|
+
Explain why this approach is best.
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Checklist Antes de Completar
|
|
170
|
+
|
|
171
|
+
- [ ] Exibiu texto completo do prompt (não apenas descreveu)
|
|
172
|
+
- [ ] Marcou claramente com headers ou code blocks
|
|
173
|
+
- [ ] Forneceu instruções de uso
|
|
174
|
+
- [ ] Explicou escolhas de design
|
|
175
|
+
- [ ] Incluiu exemplos de outputs esperados
|
|
176
|
+
|
|
177
|
+
## Documentação de Referência
|
|
178
|
+
|
|
179
|
+
- [Anthropic Prompt Engineering Guide](https://docs.anthropic.com/claude/docs/prompt-engineering)
|
|
180
|
+
- [OpenAI Prompt Engineering](https://platform.openai.com/docs/guides/prompt-engineering)
|
|
181
|
+
- [Prompt Engineering Patterns](https://www.promptingguide.ai/)
|
|
182
|
+
|
|
183
|
+
## Anti-Patterns a Evitar
|
|
184
|
+
|
|
185
|
+
1. **Prompts vagos**: "Faça algo bom" → Especifique critérios claros
|
|
186
|
+
2. **Sem formato de output**: Sempre definir estrutura esperada
|
|
187
|
+
3. **Instruções contraditórias**: Revisar consistência antes de usar
|
|
188
|
+
4. **Overloading**: Muitas instruções = confusão. Priorize as essenciais
|
|
189
|
+
5. **Falta de exemplos**: Few-shot geralmente supera zero-shot
|