@polymorphism-tech/morph-spec 1.0.2 → 2.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 +1381 -0
- package/LICENSE +72 -0
- package/README.md +114 -12
- package/bin/detect-agents.js +225 -0
- package/bin/morph-spec.js +120 -0
- package/bin/render-template.js +302 -0
- package/bin/semantic-detect-agents.js +246 -0
- package/bin/validate-agents-skills.js +239 -0
- package/bin/validate-agents.js +69 -0
- package/bin/validate-phase.js +263 -0
- package/content/.azure/README.md +293 -0
- package/content/.azure/docs/azure-devops-setup.md +454 -0
- package/content/.azure/docs/branch-strategy.md +398 -0
- package/content/.azure/docs/local-development.md +515 -0
- package/content/.azure/pipelines/pipeline-variables.yml +34 -0
- package/content/.azure/pipelines/prod-pipeline.yml +319 -0
- package/content/.azure/pipelines/staging-pipeline.yml +234 -0
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -0
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -0
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -0
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -0
- package/content/.claude/commands/morph-apply.md +118 -26
- package/content/.claude/commands/morph-archive.md +9 -9
- package/content/.claude/commands/morph-clarify.md +184 -0
- package/content/.claude/commands/morph-design.md +275 -0
- package/content/.claude/commands/morph-proposal.md +56 -15
- package/content/.claude/commands/morph-setup.md +100 -0
- package/content/.claude/commands/morph-status.md +47 -32
- package/content/.claude/commands/morph-tasks.md +319 -0
- package/content/.claude/commands/morph-uiux.md +211 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +604 -0
- package/content/.claude/skills/specialists/ms-agent-expert.md +143 -89
- package/content/.claude/skills/specialists/ui-ux-designer.md +744 -9
- package/content/.claude/skills/stacks/dotnet-blazor.md +244 -8
- package/content/.claude/skills/stacks/dotnet-nextjs.md +2 -2
- package/content/.morph/.morphversion +5 -0
- package/content/.morph/config/agents.json +101 -8
- package/content/.morph/config/azure-pricing.json +70 -0
- package/content/.morph/config/azure-pricing.schema.json +50 -0
- package/content/.morph/config/config.template.json +15 -3
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -0
- package/content/.morph/hooks/README.md +239 -0
- package/content/.morph/hooks/pre-commit-agents.sh +24 -0
- package/content/.morph/hooks/pre-commit-all.sh +48 -0
- package/content/.morph/hooks/pre-commit-costs.sh +91 -0
- package/content/.morph/hooks/pre-commit-specs.sh +49 -0
- package/content/.morph/hooks/pre-commit-tests.sh +60 -0
- package/content/.morph/project.md +5 -4
- package/content/.morph/schemas/agent.schema.json +296 -0
- package/content/.morph/standards/agent-framework-setup.md +453 -0
- package/content/.morph/standards/architecture.md +142 -7
- package/content/.morph/standards/azure.md +218 -23
- package/content/.morph/standards/coding.md +47 -12
- package/content/.morph/standards/dotnet10-migration.md +494 -0
- package/content/.morph/standards/fluent-ui-setup.md +590 -0
- package/content/.morph/standards/migration-guide.md +514 -0
- package/content/.morph/standards/passkeys-auth.md +423 -0
- package/content/.morph/standards/vector-search-rag.md +536 -0
- package/content/.morph/state.json +18 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -0
- package/content/.morph/templates/MudTheme.cs +281 -0
- package/content/.morph/templates/contracts.cs +55 -55
- package/content/.morph/templates/decisions.md +4 -4
- package/content/.morph/templates/design-system.css +226 -0
- package/content/.morph/templates/infra/.dockerignore.example +89 -0
- package/content/.morph/templates/infra/Dockerfile.example +82 -0
- package/content/.morph/templates/infra/README.md +286 -0
- package/content/.morph/templates/infra/app-service.bicep +164 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -0
- package/content/.morph/templates/infra/deploy.sh +208 -0
- package/content/.morph/templates/infra/main.bicep +41 -7
- package/content/.morph/templates/infra/parameters.dev.json +6 -0
- package/content/.morph/templates/infra/parameters.prod.json +6 -0
- package/content/.morph/templates/infra/parameters.staging.json +29 -0
- package/content/.morph/templates/proposal.md +3 -3
- package/content/.morph/templates/recap.md +3 -3
- package/content/.morph/templates/spec.md +9 -8
- package/content/.morph/templates/sprint-status.yaml +68 -0
- package/content/.morph/templates/state.template.json +222 -0
- package/content/.morph/templates/story.md +143 -0
- package/content/.morph/templates/tasks.md +1 -1
- package/content/.morph/templates/ui-components.md +276 -0
- package/content/.morph/templates/ui-design-system.md +286 -0
- package/content/.morph/templates/ui-flows.md +336 -0
- package/content/.morph/templates/ui-mockups.md +133 -0
- package/content/.morph/test-infra/example.bicep +59 -0
- package/content/CLAUDE.md +124 -0
- package/content/README.md +79 -0
- package/detectors/config-detector.js +223 -0
- package/detectors/conversation-analyzer.js +163 -0
- package/detectors/index.js +84 -0
- package/detectors/standards-generator.js +275 -0
- package/detectors/structure-detector.js +221 -0
- package/docs/README.md +149 -0
- package/docs/api/cost-calculator.js.html +513 -0
- package/docs/api/design-system-generator.js.html +382 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/api/global.html +5263 -0
- package/docs/api/index.html +96 -0
- package/docs/api/scripts/collapse.js +39 -0
- package/docs/api/scripts/commonNav.js +28 -0
- package/docs/api/scripts/linenumber.js +25 -0
- package/docs/api/scripts/nav.js +12 -0
- package/docs/api/scripts/polyfill.js +4 -0
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/prettify/lang-css.js +2 -0
- package/docs/api/scripts/prettify/prettify.js +28 -0
- package/docs/api/scripts/search.js +99 -0
- package/docs/api/state-manager.js.html +423 -0
- package/docs/api/styles/jsdoc.css +776 -0
- package/docs/api/styles/prettify.css +80 -0
- package/docs/examples.md +328 -0
- package/docs/getting-started.md +302 -0
- package/docs/installation.md +361 -0
- package/docs/templates.md +418 -0
- package/docs/validation-checklist.md +266 -0
- package/package.json +39 -12
- package/src/commands/cost.js +181 -0
- package/src/commands/create-story.js +283 -0
- package/src/commands/detect.js +104 -0
- package/src/commands/doctor.js +67 -0
- package/src/commands/generate.js +149 -0
- package/src/commands/init.js +71 -46
- package/src/commands/shard-spec.js +224 -0
- package/src/commands/sprint-status.js +250 -0
- package/src/commands/state.js +333 -0
- package/src/commands/sync.js +167 -0
- package/src/commands/update-pricing.js +206 -0
- package/src/commands/update.js +88 -13
- package/src/lib/complexity-analyzer.js +292 -0
- package/src/lib/cost-calculator.js +429 -0
- package/src/lib/design-system-generator.js +298 -0
- package/src/lib/state-manager.js +340 -0
- package/src/utils/file-copier.js +63 -0
- package/src/utils/version-checker.js +175 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
# Story-Driven Development - Guia do Usuário
|
|
2
|
+
|
|
3
|
+
> **O que você faz quando implementa uma feature usando MORPH-SPEC**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📋 Você Está Aqui
|
|
8
|
+
|
|
9
|
+
Você acabou de terminar as fases 0-4 do MORPH:
|
|
10
|
+
- ✅ Criou `spec.md` (especificação técnica)
|
|
11
|
+
- ✅ Criou `contracts.cs` (interfaces/DTOs)
|
|
12
|
+
- ✅ Criou `tasks.json` (lista de tasks)
|
|
13
|
+
- ✅ Aprovou tudo
|
|
14
|
+
|
|
15
|
+
**Agora você vai implementar. Este guia mostra como.**
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🚀 Passo a Passo Completo
|
|
20
|
+
|
|
21
|
+
### Cenário: Feature "scheduled-reports" com 10 tasks
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# ============================================================================
|
|
25
|
+
# ETAPA 1: PREPARAÇÃO (1x por feature)
|
|
26
|
+
# ============================================================================
|
|
27
|
+
|
|
28
|
+
# 1.1 - Dividir spec.md em partes menores (opcional, mas recomendado)
|
|
29
|
+
morph-spec story shard scheduled-reports
|
|
30
|
+
|
|
31
|
+
# Isso cria:
|
|
32
|
+
# .morph/project/outputs/scheduled-reports/spec/
|
|
33
|
+
# ├── index.md
|
|
34
|
+
# ├── entity-design.md
|
|
35
|
+
# ├── service-layer.md
|
|
36
|
+
# └── ui-components.md
|
|
37
|
+
|
|
38
|
+
# 1.2 - Criar primeira story
|
|
39
|
+
morph-spec story create scheduled-reports SR-001 \
|
|
40
|
+
--title "Create ScheduledReport entity" \
|
|
41
|
+
--tasks "Create entity,Configure EF mapping,Create migration,Write tests"
|
|
42
|
+
|
|
43
|
+
# Isso cria:
|
|
44
|
+
# .morph/project/outputs/scheduled-reports/stories/SR-001.md
|
|
45
|
+
# (arquivo com TODO o contexto que você precisa)
|
|
46
|
+
|
|
47
|
+
# 1.3 - Criar demais stories
|
|
48
|
+
morph-spec story create scheduled-reports SR-002 \
|
|
49
|
+
--title "Implement ReportService" \
|
|
50
|
+
--tasks "Create interface,Implement service,Add DI,Write tests"
|
|
51
|
+
|
|
52
|
+
morph-spec story create scheduled-reports SR-003 \
|
|
53
|
+
--title "Create report UI component" \
|
|
54
|
+
--tasks "Create razor component,Add to router,Style with Fluent UI"
|
|
55
|
+
|
|
56
|
+
# ... criar SR-004, SR-005, etc.
|
|
57
|
+
|
|
58
|
+
# 1.4 - Ver todas as stories criadas
|
|
59
|
+
morph-spec story status scheduled-reports show
|
|
60
|
+
|
|
61
|
+
# Output:
|
|
62
|
+
# 📊 Sprint Status: scheduled-reports
|
|
63
|
+
# Progress: 0% (0/10 stories done)
|
|
64
|
+
# Stories:
|
|
65
|
+
# ✅ SR-001: Create ScheduledReport entity (ready)
|
|
66
|
+
# ✅ SR-002: Implement ReportService (ready)
|
|
67
|
+
# ✅ SR-003: Create report UI component (ready)
|
|
68
|
+
# ...
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# ============================================================================
|
|
72
|
+
# ETAPA 2: IMPLEMENTAR STORY SR-001 (repetir para cada story)
|
|
73
|
+
# ============================================================================
|
|
74
|
+
|
|
75
|
+
# 2.1 - Marcar que você vai começar a trabalhar nela
|
|
76
|
+
morph-spec story status scheduled-reports start SR-001
|
|
77
|
+
|
|
78
|
+
# 2.2 - Abrir a story
|
|
79
|
+
cat .morph/project/outputs/scheduled-reports/stories/SR-001.md
|
|
80
|
+
|
|
81
|
+
# Você vai ver:
|
|
82
|
+
# - Context (resumo do que fazer)
|
|
83
|
+
# - Dev Notes (dicas automáticas tipo "use Primary Constructor")
|
|
84
|
+
# - Tasks (lista de tarefas)
|
|
85
|
+
# - Acceptance Criteria (como validar se tá certo)
|
|
86
|
+
|
|
87
|
+
# 2.3 - Ler SÓ a parte relevante do spec (não o spec inteiro)
|
|
88
|
+
cat .morph/project/outputs/scheduled-reports/spec/entity-design.md
|
|
89
|
+
|
|
90
|
+
# 2.4 - Implementar o código
|
|
91
|
+
# (você vai escrever o código da entity, testes, etc.)
|
|
92
|
+
|
|
93
|
+
# 2.5 - Editar a story para adicionar suas notas
|
|
94
|
+
nano .morph/project/outputs/scheduled-reports/stories/SR-001.md
|
|
95
|
+
|
|
96
|
+
# Procurar a seção "### Dev Notes (Added by Dev Agent)"
|
|
97
|
+
# Adicionar algo tipo:
|
|
98
|
+
### Dev Notes (Added by Dev Agent)
|
|
99
|
+
```
|
|
100
|
+
✅ Implementado ScheduledReport.cs (linha 12)
|
|
101
|
+
✅ EF mapping em ReportDbContext.cs (linha 45)
|
|
102
|
+
✅ Migration: 20251209_AddScheduledReports.cs
|
|
103
|
+
✅ Testes: ScheduledReportTests.cs (12 tests)
|
|
104
|
+
⚠️ RecurrencePattern usa regex complexo
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
# 2.6 - Marcar que terminou e está pronto para revisar
|
|
108
|
+
morph-spec story status scheduled-reports qa SR-001
|
|
109
|
+
|
|
110
|
+
# 2.7 - Commitar código
|
|
111
|
+
git add .
|
|
112
|
+
git commit -m "feat(SR-001): create ScheduledReport entity"
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# ============================================================================
|
|
116
|
+
# ETAPA 3: REVISAR STORY SR-001 (QA)
|
|
117
|
+
# ============================================================================
|
|
118
|
+
|
|
119
|
+
# 3.1 - Ver status
|
|
120
|
+
morph-spec story status scheduled-reports show
|
|
121
|
+
|
|
122
|
+
# Output:
|
|
123
|
+
# 👀 SR-001: Create ScheduledReport entity (ready_for_qa)
|
|
124
|
+
|
|
125
|
+
# 3.2 - Abrir a story (agora com as notas do Dev)
|
|
126
|
+
cat .morph/project/outputs/scheduled-reports/stories/SR-001.md
|
|
127
|
+
|
|
128
|
+
# Você vai ver as Dev Notes que foram adicionadas:
|
|
129
|
+
# "✅ Implementado ScheduledReport.cs (linha 12)"
|
|
130
|
+
# "⚠️ RecurrencePattern usa regex complexo"
|
|
131
|
+
|
|
132
|
+
# 3.3 - Revisar o código
|
|
133
|
+
cat src/Domain/Entities/ScheduledReport.cs
|
|
134
|
+
cat tests/Unit/ScheduledReportTests.cs
|
|
135
|
+
|
|
136
|
+
# 3.4 - Se precisar refatorar, refatore
|
|
137
|
+
|
|
138
|
+
# 3.5 - Editar a story para adicionar notas de revisão
|
|
139
|
+
nano .morph/project/outputs/scheduled-reports/stories/SR-001.md
|
|
140
|
+
|
|
141
|
+
# Procurar a seção "### QA Notes (Added by QA Agent)"
|
|
142
|
+
# Adicionar algo tipo:
|
|
143
|
+
### QA Notes (Added by QA Agent)
|
|
144
|
+
```
|
|
145
|
+
✅ Código OK, segue padrões
|
|
146
|
+
✅ Refatorei ValidateRecurrence() (linha 89)
|
|
147
|
+
✅ Adicionei 3 testes de edge cases
|
|
148
|
+
✅ Todos os acceptance criteria validados
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
# 3.6 - Marcar como concluída
|
|
152
|
+
morph-spec story status scheduled-reports done SR-001
|
|
153
|
+
|
|
154
|
+
# Output:
|
|
155
|
+
# ✅ Story SR-001 marked as DONE
|
|
156
|
+
# 📋 Next Story: SR-002
|
|
157
|
+
|
|
158
|
+
# 3.7 - Commitar mudanças (se fez refactoring)
|
|
159
|
+
git add .
|
|
160
|
+
git commit -m "refactor(SR-001): extract ValidateRecurrence method"
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# ============================================================================
|
|
164
|
+
# ETAPA 4: PRÓXIMA STORY (SR-002)
|
|
165
|
+
# ============================================================================
|
|
166
|
+
|
|
167
|
+
# Repetir ETAPA 2 e 3 para SR-002:
|
|
168
|
+
morph-spec story status scheduled-reports start SR-002
|
|
169
|
+
cat .morph/project/outputs/scheduled-reports/stories/SR-002.md
|
|
170
|
+
cat .morph/project/outputs/scheduled-reports/spec/service-layer.md
|
|
171
|
+
# ... implementar ...
|
|
172
|
+
# ... adicionar Dev Notes ...
|
|
173
|
+
morph-spec story status scheduled-reports qa SR-002
|
|
174
|
+
# ... revisar ...
|
|
175
|
+
# ... adicionar QA Notes ...
|
|
176
|
+
morph-spec story status scheduled-reports done SR-002
|
|
177
|
+
|
|
178
|
+
# Repetir para SR-003, SR-004, ..., SR-010
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
# ============================================================================
|
|
182
|
+
# ETAPA 5: FINALIZAÇÃO
|
|
183
|
+
# ============================================================================
|
|
184
|
+
|
|
185
|
+
# Ver progresso geral
|
|
186
|
+
morph-spec story status scheduled-reports show
|
|
187
|
+
|
|
188
|
+
# Output:
|
|
189
|
+
# 📊 Sprint Status: scheduled-reports
|
|
190
|
+
# Progress: 100% (10/10 stories done)
|
|
191
|
+
# 🎉 All stories completed!
|
|
192
|
+
|
|
193
|
+
# Pronto! Feature implementada.
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 📝 Comandos que Você Usa
|
|
199
|
+
|
|
200
|
+
### Criar stories (início da feature)
|
|
201
|
+
```bash
|
|
202
|
+
morph-spec story shard <feature-name>
|
|
203
|
+
morph-spec story create <feature-name> <story-id> --title "..." --tasks "..."
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Ver status
|
|
207
|
+
```bash
|
|
208
|
+
morph-spec story status <feature-name> show
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Marcar que vai começar
|
|
212
|
+
```bash
|
|
213
|
+
morph-spec story status <feature-name> start <story-id>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Marcar que terminou (vai para QA)
|
|
217
|
+
```bash
|
|
218
|
+
morph-spec story status <feature-name> qa <story-id>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Marcar como concluída
|
|
222
|
+
```bash
|
|
223
|
+
morph-spec story status <feature-name> done <story-id>
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Ver próxima story
|
|
227
|
+
```bash
|
|
228
|
+
morph-spec story status <feature-name> next
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 🔄 Seu Dia a Dia
|
|
234
|
+
|
|
235
|
+
### Segunda-feira: Criar as stories
|
|
236
|
+
```bash
|
|
237
|
+
morph-spec story shard my-feature
|
|
238
|
+
morph-spec story create my-feature MF-001 --title "..." --tasks "..."
|
|
239
|
+
morph-spec story create my-feature MF-002 --title "..." --tasks "..."
|
|
240
|
+
morph-spec story create my-feature MF-003 --title "..." --tasks "..."
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Terça-feira: Implementar MF-001
|
|
244
|
+
```bash
|
|
245
|
+
morph-spec story status my-feature start MF-001
|
|
246
|
+
cat .morph/project/outputs/my-feature/stories/MF-001.md
|
|
247
|
+
cat .morph/project/outputs/my-feature/spec/entity-design.md
|
|
248
|
+
# [implementar código]
|
|
249
|
+
# [adicionar Dev Notes na story]
|
|
250
|
+
morph-spec story status my-feature qa MF-001
|
|
251
|
+
git commit ...
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Terça à tarde: Revisar MF-001
|
|
255
|
+
```bash
|
|
256
|
+
cat .morph/project/outputs/my-feature/stories/MF-001.md # ver Dev Notes
|
|
257
|
+
# [revisar código]
|
|
258
|
+
# [adicionar QA Notes na story]
|
|
259
|
+
morph-spec story status my-feature done MF-001
|
|
260
|
+
git commit ...
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Quarta-feira: Implementar MF-002
|
|
264
|
+
```bash
|
|
265
|
+
morph-spec story status my-feature start MF-002
|
|
266
|
+
# ... repetir workflow
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## ❓ Perguntas Comuns
|
|
272
|
+
|
|
273
|
+
### "Preciso shardar o spec?"
|
|
274
|
+
**Não é obrigatório.** Só recomendado se seu `spec.md` for grande (5+ seções).
|
|
275
|
+
|
|
276
|
+
Se for pequeno, pule o `shard-spec.js` e vá direto para `create-story.js`.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
### "Quantas tasks por story?"
|
|
281
|
+
**4-8 tasks** é ideal. Se tiver mais, quebre em sub-stories.
|
|
282
|
+
|
|
283
|
+
Exemplo:
|
|
284
|
+
- ❌ Ruim: Story com 20 tasks (muito grande)
|
|
285
|
+
- ✅ Bom: Story com 5 tasks (1 dia de trabalho)
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
### "O que são Dev Notes e QA Notes?"
|
|
290
|
+
**Dev Notes:** Você (Dev) escreve o que implementou, para o QA saber.
|
|
291
|
+
|
|
292
|
+
**QA Notes:** Você (QA) escreve o que revisou/refatorou.
|
|
293
|
+
|
|
294
|
+
**Exemplo:**
|
|
295
|
+
```markdown
|
|
296
|
+
### Dev Notes (Added by Dev Agent)
|
|
297
|
+
```
|
|
298
|
+
✅ Implementei X.cs na pasta Domain/
|
|
299
|
+
⚠️ Cuidado: usa regex complexo na linha 67
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### QA Notes (Added by QA Agent)
|
|
303
|
+
```
|
|
304
|
+
✅ Revisei e está OK
|
|
305
|
+
✅ Refatorei método ValidateX() para ficar mais claro
|
|
306
|
+
```
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
### "Onde adiciono Dev/QA Notes?"
|
|
312
|
+
**No arquivo da story.**
|
|
313
|
+
|
|
314
|
+
1. Abra: `.morph/project/outputs/my-feature/stories/MF-001.md`
|
|
315
|
+
2. Procure a seção `### Dev Notes (Added by Dev Agent)`
|
|
316
|
+
3. Substitua `[VOCÊ VAI PREENCHER AQUI APÓS IMPLEMENTAR]` pelas suas notas
|
|
317
|
+
4. Salve
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
### "E se eu esquecer de adicionar Dev Notes?"
|
|
322
|
+
Sem problema. Edite a story manualmente:
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
nano .morph/project/outputs/my-feature/stories/MF-001.md
|
|
326
|
+
# Adicione as notas na seção correta
|
|
327
|
+
# Salve
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
### "Posso implementar várias stories na mesma sessão?"
|
|
333
|
+
**Não recomendado.**
|
|
334
|
+
|
|
335
|
+
Cada story = nova sessão do Claude (se usar Claude Code).
|
|
336
|
+
|
|
337
|
+
Por quê? Evita confusão e economiza tokens.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## ✅ Checklist Rápido
|
|
342
|
+
|
|
343
|
+
**No início da feature:**
|
|
344
|
+
- [ ] Roda `shard-spec.js` (opcional)
|
|
345
|
+
- [ ] Roda `create-story.js` para cada story
|
|
346
|
+
- [ ] Roda `show` para ver todas criadas
|
|
347
|
+
|
|
348
|
+
**Para cada story:**
|
|
349
|
+
- [ ] `start` → Marcar que vai começar
|
|
350
|
+
- [ ] Ler story file (`.morph/project/outputs/.../stories/XX.md`)
|
|
351
|
+
- [ ] Ler spec shard (`.morph/project/outputs/.../spec/xxx.md`)
|
|
352
|
+
- [ ] Implementar código
|
|
353
|
+
- [ ] Adicionar Dev Notes na story
|
|
354
|
+
- [ ] `qa` → Marcar que terminou
|
|
355
|
+
- [ ] Commit código
|
|
356
|
+
- [ ] Revisar código
|
|
357
|
+
- [ ] Adicionar QA Notes na story
|
|
358
|
+
- [ ] `done` → Marcar como concluída
|
|
359
|
+
- [ ] Commit mudanças
|
|
360
|
+
|
|
361
|
+
**No final:**
|
|
362
|
+
- [ ] `show` → Ver que 100% completo
|
|
363
|
+
- [ ] Todas stories têm Dev Notes e QA Notes preenchidas
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 📚 Referência Rápida
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
# Ver ajuda de qualquer comando
|
|
371
|
+
morph-spec story --help
|
|
372
|
+
morph-spec story shard --help
|
|
373
|
+
morph-spec story create --help
|
|
374
|
+
morph-spec story status --help
|
|
375
|
+
|
|
376
|
+
# Estrutura de pastas (após criar stories)
|
|
377
|
+
.morph/project/outputs/my-feature/
|
|
378
|
+
├── spec/ # Spec dividido em partes
|
|
379
|
+
│ ├── index.md
|
|
380
|
+
│ ├── entity-design.md
|
|
381
|
+
│ └── service-layer.md
|
|
382
|
+
├── stories/ # Stories auto-contidas
|
|
383
|
+
│ ├── MF-001.md
|
|
384
|
+
│ ├── MF-002.md
|
|
385
|
+
│ └── MF-003.md
|
|
386
|
+
└── sprint-status.yaml # Progresso automático
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
*MORPH-SPEC Framework - Guia do Usuário*
|
|
392
|
+
*Use este guia como referência rápida durante o desenvolvimento*
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# MORPH-SPEC Git Hooks
|
|
2
|
+
|
|
3
|
+
Pre-commit hooks for automatic validation before committing.
|
|
4
|
+
|
|
5
|
+
## Available Hooks
|
|
6
|
+
|
|
7
|
+
| Hook | Description | Action |
|
|
8
|
+
|------|-------------|--------|
|
|
9
|
+
| `pre-commit-agents.sh` | Validates agents.json with JSON Schema | ❌ Blocks commit |
|
|
10
|
+
| `pre-commit-costs.sh` | Validates Azure costs don't exceed limits | ❌ Blocks commit |
|
|
11
|
+
| `pre-commit-specs.sh` | Validates spec.md has required sections | ❌ Blocks commit |
|
|
12
|
+
| `pre-commit-tests.sh` | Checks if new code has tests | ⚠️ Warns only |
|
|
13
|
+
| `pre-commit-all.sh` | Runs all hooks in sequence | ❌ Blocks if any fail |
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
### Option 1: Install Individual Hooks
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Install cost validation
|
|
21
|
+
ln -s ../../content/.morph/hooks/pre-commit-costs.sh .git/hooks/pre-commit
|
|
22
|
+
|
|
23
|
+
# Or symlink all at once
|
|
24
|
+
ln -s ../../content/.morph/hooks/pre-commit-all.sh .git/hooks/pre-commit
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Option 2: Copy Hooks
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Copy master hook
|
|
31
|
+
cp content/.morph/hooks/pre-commit-all.sh .git/hooks/pre-commit
|
|
32
|
+
chmod +x .git/hooks/pre-commit
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Option 3: Use Existing Hooks
|
|
36
|
+
|
|
37
|
+
If you already have `.git/hooks/pre-commit`, add this to the end:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Run MORPH-SPEC validations
|
|
41
|
+
bash content/.morph/hooks/pre-commit-all.sh || exit 1
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## What Each Hook Does
|
|
45
|
+
|
|
46
|
+
### pre-commit-agents.sh
|
|
47
|
+
|
|
48
|
+
**Validates:** `agents.json` configuration
|
|
49
|
+
|
|
50
|
+
**Checks:**
|
|
51
|
+
- JSON Schema compliance
|
|
52
|
+
- Required fields (id, name, emoji, type, etc.)
|
|
53
|
+
- Keyword patterns (alphanumeric + hyphens/underscores)
|
|
54
|
+
- No duplicate keywords
|
|
55
|
+
- autoActivation for specialist agents
|
|
56
|
+
|
|
57
|
+
**Example Output:**
|
|
58
|
+
```
|
|
59
|
+
🤖 Validating agent configuration...
|
|
60
|
+
Detected changes to agents.json
|
|
61
|
+
|
|
62
|
+
=== MORPH-SPEC Agent Validator ===
|
|
63
|
+
|
|
64
|
+
Version: 1.0.0
|
|
65
|
+
Core Agents: 6
|
|
66
|
+
Specialist Agents: 4
|
|
67
|
+
|
|
68
|
+
✓ Validation PASSED
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### pre-commit-costs.sh
|
|
72
|
+
|
|
73
|
+
**Validates:** Bicep files for Azure costs
|
|
74
|
+
|
|
75
|
+
**Checks:**
|
|
76
|
+
- Parses modified `.bicep` files
|
|
77
|
+
- Calculates monthly costs
|
|
78
|
+
- Blocks if > `requiresADR` limit (default: $10)
|
|
79
|
+
- Checks if ADR exists in decisions.md
|
|
80
|
+
|
|
81
|
+
**Example Output:**
|
|
82
|
+
```
|
|
83
|
+
💰 Calculating Azure costs...
|
|
84
|
+
|
|
85
|
+
╔════════════════════════════════════════════════╗
|
|
86
|
+
║ sqlDatabase (Basic) $4.99/mo ║
|
|
87
|
+
║ containerApp (Consumption) $0.00/mo ║
|
|
88
|
+
╠════════════════════════════════════════════════╣
|
|
89
|
+
║ Total: $4.99 ║
|
|
90
|
+
║ Requires ADR: NO ║
|
|
91
|
+
╚════════════════════════════════════════════════╝
|
|
92
|
+
|
|
93
|
+
✓ Cost validation passed
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### pre-commit-specs.sh
|
|
97
|
+
|
|
98
|
+
**Validates:** `spec.md` files have required sections
|
|
99
|
+
|
|
100
|
+
**Checks:**
|
|
101
|
+
- `## 📋 Metadata`
|
|
102
|
+
- `## 🎯 Overview`
|
|
103
|
+
- `## 🏗️ Technical Design`
|
|
104
|
+
- `## ✅ Acceptance Criteria`
|
|
105
|
+
- Warns if no user stories found
|
|
106
|
+
|
|
107
|
+
**Example Output:**
|
|
108
|
+
```
|
|
109
|
+
🔍 Validating spec files...
|
|
110
|
+
Checking: .morph/outputs/my-feature/spec.md
|
|
111
|
+
✓ All required sections found
|
|
112
|
+
✓ All spec files are valid
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### pre-commit-tests.sh
|
|
116
|
+
|
|
117
|
+
**Validates:** New C# code has corresponding tests
|
|
118
|
+
|
|
119
|
+
**Checks:**
|
|
120
|
+
- Finds modified `.cs` files (excluding tests)
|
|
121
|
+
- Looks for `*Tests.cs` or `Test*.cs`
|
|
122
|
+
- Skips trivial files (DTOs, records, models)
|
|
123
|
+
- **Warns only, doesn't block**
|
|
124
|
+
|
|
125
|
+
**Example Output:**
|
|
126
|
+
```
|
|
127
|
+
🧪 Checking test coverage...
|
|
128
|
+
✓ Test found for: Services/UserService.cs
|
|
129
|
+
⚠️ No test found for: Services/PaymentService.cs
|
|
130
|
+
|
|
131
|
+
⚠️ WARNING: Some files don't have tests
|
|
132
|
+
Override with: git commit --no-verify
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### pre-commit-all.sh (Master Hook)
|
|
136
|
+
|
|
137
|
+
**Runs:** All hooks in sequence
|
|
138
|
+
|
|
139
|
+
**Output:**
|
|
140
|
+
```
|
|
141
|
+
╔════════════════════════════════════════════════╗
|
|
142
|
+
║ MORPH-SPEC PRE-COMMIT VALIDATION ║
|
|
143
|
+
╚════════════════════════════════════════════════╝
|
|
144
|
+
|
|
145
|
+
─────────────────────────────────────────────────
|
|
146
|
+
🤖 Validating agent configuration...
|
|
147
|
+
✓ No changes to agents.json
|
|
148
|
+
|
|
149
|
+
─────────────────────────────────────────────────
|
|
150
|
+
💰 Calculating Azure costs...
|
|
151
|
+
✓ No Bicep files modified
|
|
152
|
+
|
|
153
|
+
─────────────────────────────────────────────────
|
|
154
|
+
🔍 Validating spec files...
|
|
155
|
+
✓ No spec files modified
|
|
156
|
+
|
|
157
|
+
─────────────────────────────────────────────────
|
|
158
|
+
🧪 Checking test coverage...
|
|
159
|
+
✓ Test found for: Services/UserService.cs
|
|
160
|
+
|
|
161
|
+
═════════════════════════════════════════════════
|
|
162
|
+
✅ ALL PRE-COMMIT VALIDATIONS PASSED
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Bypassing Hooks
|
|
166
|
+
|
|
167
|
+
If you need to commit without validation (e.g., WIP commit):
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
git commit --no-verify -m "WIP: work in progress"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**⚠️ Use sparingly** - hooks exist to prevent errors.
|
|
174
|
+
|
|
175
|
+
## Customizing Hooks
|
|
176
|
+
|
|
177
|
+
### Adjust Cost Limits
|
|
178
|
+
|
|
179
|
+
Edit `content/.morph/config/config.json`:
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
{
|
|
183
|
+
"costs": {
|
|
184
|
+
"limits": {
|
|
185
|
+
"requiresADR": 15 // Change from $10 to $15
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Disable Specific Hooks
|
|
192
|
+
|
|
193
|
+
Edit `.git/hooks/pre-commit` and comment out unwanted hooks:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
HOOKS=(
|
|
197
|
+
"pre-commit-agents.sh"
|
|
198
|
+
# "pre-commit-costs.sh" # Disabled
|
|
199
|
+
"pre-commit-specs.sh"
|
|
200
|
+
"pre-commit-tests.sh"
|
|
201
|
+
)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Troubleshooting
|
|
205
|
+
|
|
206
|
+
### Hook Not Running
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# Check if hook exists
|
|
210
|
+
ls -la .git/hooks/pre-commit
|
|
211
|
+
|
|
212
|
+
# Check if executable
|
|
213
|
+
chmod +x .git/hooks/pre-commit
|
|
214
|
+
|
|
215
|
+
# Test manually
|
|
216
|
+
bash .git/hooks/pre-commit
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Hook Fails Unexpectedly
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# Run individual hook for debugging
|
|
223
|
+
bash content/.morph/hooks/pre-commit-costs.sh
|
|
224
|
+
|
|
225
|
+
# Check hook output
|
|
226
|
+
bash -x content/.morph/hooks/pre-commit-costs.sh
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Benefits
|
|
230
|
+
|
|
231
|
+
- ✅ **Prevents Errors:** Catches issues before commit
|
|
232
|
+
- ✅ **Enforces Quality:** Requires tests, specs, ADRs
|
|
233
|
+
- ✅ **Cost Control:** Blocks expensive infrastructure
|
|
234
|
+
- ✅ **Fast Feedback:** Fails early in dev workflow
|
|
235
|
+
- ✅ **Consistent:** Same validation for entire team
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
*MORPH-SPEC Framework - Git Hooks*
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# MORPH-SPEC Pre-Commit Hook: Agent Configuration Validation
|
|
3
|
+
# Uses validate-agents.js to check agents.json
|
|
4
|
+
|
|
5
|
+
echo "🤖 Validating agent configuration..."
|
|
6
|
+
|
|
7
|
+
# Check if agents.json is being modified
|
|
8
|
+
if git diff --cached --name-only | grep -q 'agents\.json$'; then
|
|
9
|
+
echo "Detected changes to agents.json"
|
|
10
|
+
|
|
11
|
+
# Run validator
|
|
12
|
+
if ! node bin/validate-agents.js; then
|
|
13
|
+
echo ""
|
|
14
|
+
echo "❌ COMMIT BLOCKED: agents.json validation failed"
|
|
15
|
+
echo " Fix errors above before committing"
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
echo "✓ agents.json is valid"
|
|
20
|
+
else
|
|
21
|
+
echo "✓ No changes to agents.json"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
exit 0
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# MORPH-SPEC Master Pre-Commit Hook
|
|
3
|
+
# Runs all validation hooks in sequence
|
|
4
|
+
|
|
5
|
+
echo "╔════════════════════════════════════════════════╗"
|
|
6
|
+
echo "║ MORPH-SPEC PRE-COMMIT VALIDATION ║"
|
|
7
|
+
echo "╚════════════════════════════════════════════════╝"
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
HOOKS_DIR="$(dirname "$0")"
|
|
11
|
+
|
|
12
|
+
# Run all hooks in order
|
|
13
|
+
HOOKS=(
|
|
14
|
+
"pre-commit-agents.sh"
|
|
15
|
+
"pre-commit-costs.sh"
|
|
16
|
+
"pre-commit-specs.sh"
|
|
17
|
+
"pre-commit-tests.sh"
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
HAS_FAILURES=false
|
|
21
|
+
|
|
22
|
+
for hook in "${HOOKS[@]}"; do
|
|
23
|
+
HOOK_PATH="$HOOKS_DIR/$hook"
|
|
24
|
+
|
|
25
|
+
if [ ! -f "$HOOK_PATH" ]; then
|
|
26
|
+
echo "⚠️ Hook not found: $hook (skipping)"
|
|
27
|
+
continue
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
echo "─────────────────────────────────────────────────"
|
|
31
|
+
if ! bash "$HOOK_PATH"; then
|
|
32
|
+
HAS_FAILURES=true
|
|
33
|
+
echo "❌ Hook failed: $hook"
|
|
34
|
+
fi
|
|
35
|
+
echo ""
|
|
36
|
+
done
|
|
37
|
+
|
|
38
|
+
echo "═════════════════════════════════════════════════"
|
|
39
|
+
|
|
40
|
+
if [ "$HAS_FAILURES" = true ]; then
|
|
41
|
+
echo "❌ PRE-COMMIT VALIDATION FAILED"
|
|
42
|
+
echo " Fix errors above before committing"
|
|
43
|
+
echo " Or use: git commit --no-verify to skip"
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
echo "✅ ALL PRE-COMMIT VALIDATIONS PASSED"
|
|
48
|
+
exit 0
|