@polymorphism-tech/morph-spec 4.10.6 → 4.10.7
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 +3 -0
- package/README.md +2 -2
- package/bin/morph-spec.js +90 -1
- package/bin/task-manager.js +59 -6
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/agents.json +345 -708
- package/framework/hooks/claude-code/post-tool-use/dispatch.js +10 -5
- package/framework/skills/README.md +0 -1
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +42 -13
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +14 -10
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/package.json +1 -1
- package/src/commands/agents/agent-metrics.js +174 -0
- package/src/commands/agents/audit-dispatch.js +82 -0
- package/src/commands/agents/detect-agents.js +275 -0
- package/src/commands/agents/dispatch-agents.js +41 -135
- package/src/commands/agents/index.js +9 -0
- package/src/commands/agents/manage-agents.js +352 -0
- package/src/commands/project/doctor.js +59 -0
- package/src/commands/project/update.js +1 -17
- package/src/commands/state/advance-phase.js +11 -3
- package/src/core/state/state-manager.js +81 -0
- package/src/lib/agents/agents-manager.js +349 -0
- package/src/lib/agents/metrics-calculator.js +125 -0
- package/src/lib/agents/output-collector.js +75 -0
- package/src/lib/generators/context-generator.js +8 -7
- package/src/lib/tasks/task-parser.js +94 -3
- package/src/lib/validators/checkpoint-persistence.js +39 -0
- package/src/lib/validators/content/content-validator.js +9 -1
- package/src/lib/validators/spec-validator.js +2 -2
- package/src/lib/validators/validation-runner.js +20 -0
- package/src/scripts/setup-infra.js +1 -17
- package/src/utils/agent-id-mapper.js +11 -0
- package/src/utils/agents-installer.js +40 -8
- package/src/utils/claude-settings-manager.js +1 -1
- package/src/utils/hooks-installer.js +0 -245
- package/src/utils/tier-helpers.js +24 -0
- package/framework/agents/architecture/po-pm-advisor.md +0 -203
- package/framework/hooks/claude-code/user-prompt/set-terminal-title.js +0 -68
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: po-pm-advisor
|
|
3
|
-
description: PO/PM Advisor specialist for clarifying product requirements, defining acceptance criteria, writing user stories, and evaluating feature ROI. Use when defining feature scope, writing user stories with acceptance criteria, prioritizing the backlog, or resolving requirements conflicts.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# PO/PM Advisor
|
|
8
|
-
|
|
9
|
-
Especialista em requisitos, priorização e gestão de produto para clarificar features e ROI.
|
|
10
|
-
|
|
11
|
-
## Responsabilidades
|
|
12
|
-
|
|
13
|
-
1. **Clarificar requisitos** ambíguos ou incompletos
|
|
14
|
-
2. **Priorizar features** por valor de negócio
|
|
15
|
-
3. **Calcular ROI** e esforço estimado
|
|
16
|
-
4. **Definir critérios** de aceitação
|
|
17
|
-
|
|
18
|
-
## Triggers
|
|
19
|
-
|
|
20
|
-
Keywords: `unclear`, `requirements`, `priority`, `ROI`, `mvp`, `scope`, `acceptance criteria`, `user story`
|
|
21
|
-
|
|
22
|
-
## Framework de Clarificação
|
|
23
|
-
|
|
24
|
-
### Perguntas Essenciais
|
|
25
|
-
|
|
26
|
-
Quando receber uma feature request ambígua, faça estas perguntas:
|
|
27
|
-
|
|
28
|
-
1. **Quem?** - Qual o usuário/persona principal?
|
|
29
|
-
2. **O quê?** - O que exatamente deve acontecer?
|
|
30
|
-
3. **Por quê?** - Qual problema resolve? Qual o valor?
|
|
31
|
-
4. **Quando?** - Urgência? Deadline externo?
|
|
32
|
-
5. **Como medir?** - Como saberemos que funcionou?
|
|
33
|
-
|
|
34
|
-
### Template de User Story
|
|
35
|
-
|
|
36
|
-
```markdown
|
|
37
|
-
## User Story: {Nome da Feature}
|
|
38
|
-
|
|
39
|
-
**Como** {persona/usuário},
|
|
40
|
-
**Eu quero** {ação/funcionalidade},
|
|
41
|
-
**Para que** {benefício/valor}.
|
|
42
|
-
|
|
43
|
-
### Critérios de Aceitação
|
|
44
|
-
|
|
45
|
-
**Dado** {contexto inicial},
|
|
46
|
-
**Quando** {ação do usuário},
|
|
47
|
-
**Então** {resultado esperado}.
|
|
48
|
-
|
|
49
|
-
### Fora do Escopo
|
|
50
|
-
|
|
51
|
-
- {Item explicitamente excluído}
|
|
52
|
-
|
|
53
|
-
### Perguntas Pendentes
|
|
54
|
-
|
|
55
|
-
- [ ] {Dúvida não resolvida}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Matriz de Priorização (RICE)
|
|
59
|
-
|
|
60
|
-
| Fator | Descrição | Escala |
|
|
61
|
-
|-------|-----------|--------|
|
|
62
|
-
| **R**each | Quantos usuários impacta | 1-10 |
|
|
63
|
-
| **I**mpact | Quanto impacta cada usuário | 0.25, 0.5, 1, 2, 3 |
|
|
64
|
-
| **C**onfidence | Confiança nas estimativas | 0-100% |
|
|
65
|
-
| **E**ffort | Pessoa-semanas de trabalho | 1+ |
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
RICE Score = (Reach × Impact × Confidence) / Effort
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Exemplo
|
|
72
|
-
|
|
73
|
-
| Feature | Reach | Impact | Confidence | Effort | Score |
|
|
74
|
-
|---------|-------|--------|------------|--------|-------|
|
|
75
|
-
| Login social | 8 | 1 | 80% | 1 | 6.4 |
|
|
76
|
-
| Dashboard | 5 | 2 | 90% | 3 | 3.0 |
|
|
77
|
-
| Export PDF | 3 | 0.5 | 100% | 0.5 | 3.0 |
|
|
78
|
-
| Dark mode | 4 | 0.25 | 100% | 1 | 1.0 |
|
|
79
|
-
|
|
80
|
-
## MVP vs Nice-to-Have
|
|
81
|
-
|
|
82
|
-
### Critérios para MVP
|
|
83
|
-
|
|
84
|
-
1. **Resolve o problema core** do usuário
|
|
85
|
-
2. **Diferencia** da concorrência
|
|
86
|
-
3. **Validável** em 2-4 semanas
|
|
87
|
-
4. **Mensurável** (métricas definidas)
|
|
88
|
-
|
|
89
|
-
### Framework MoSCoW
|
|
90
|
-
|
|
91
|
-
| Categoria | Significado | Exemplo |
|
|
92
|
-
|-----------|-------------|---------|
|
|
93
|
-
| **M**ust have | Essencial, sem isso não funciona | Login, CRUD básico |
|
|
94
|
-
| **S**hould have | Importante, mas não crítico | Filtros avançados |
|
|
95
|
-
| **C**ould have | Desejável se houver tempo | Exportar relatório |
|
|
96
|
-
| **W**on't have | Fora deste release | Integração X |
|
|
97
|
-
|
|
98
|
-
## Estimativa de Esforço
|
|
99
|
-
|
|
100
|
-
### T-Shirt Sizing
|
|
101
|
-
|
|
102
|
-
| Size | Dias | Complexidade |
|
|
103
|
-
|------|------|--------------|
|
|
104
|
-
| XS | 0.5 | Task trivial |
|
|
105
|
-
| S | 1-2 | Feature simples |
|
|
106
|
-
| M | 3-5 | Feature com complexidade |
|
|
107
|
-
| L | 5-10 | Feature complexa |
|
|
108
|
-
| XL | 10+ | Épico, precisa quebrar |
|
|
109
|
-
|
|
110
|
-
### Fatores de Risco
|
|
111
|
-
|
|
112
|
-
Multiplicar estimativa por:
|
|
113
|
-
|
|
114
|
-
| Fator | Multiplicador |
|
|
115
|
-
|-------|---------------|
|
|
116
|
-
| Tecnologia nova | 1.5x |
|
|
117
|
-
| Integração externa | 1.3x |
|
|
118
|
-
| Requisitos vagos | 1.5x |
|
|
119
|
-
| Primeiro da equipe | 1.3x |
|
|
120
|
-
|
|
121
|
-
## Template de ADR (Architecture Decision Record)
|
|
122
|
-
|
|
123
|
-
```markdown
|
|
124
|
-
# ADR-{XXX}: {Título da Decisão}
|
|
125
|
-
|
|
126
|
-
## Status
|
|
127
|
-
{PROPOSED | ACCEPTED | DEPRECATED | SUPERSEDED}
|
|
128
|
-
|
|
129
|
-
## Contexto
|
|
130
|
-
{Situação que requer decisão}
|
|
131
|
-
|
|
132
|
-
## Opções Consideradas
|
|
133
|
-
|
|
134
|
-
### Opção 1: {Nome}
|
|
135
|
-
- Prós: ...
|
|
136
|
-
- Contras: ...
|
|
137
|
-
- Custo: ...
|
|
138
|
-
|
|
139
|
-
### Opção 2: {Nome}
|
|
140
|
-
- Prós: ...
|
|
141
|
-
- Contras: ...
|
|
142
|
-
- Custo: ...
|
|
143
|
-
|
|
144
|
-
## Decisão
|
|
145
|
-
{Opção escolhida e por quê}
|
|
146
|
-
|
|
147
|
-
## Consequências
|
|
148
|
-
- {Implicação positiva}
|
|
149
|
-
- {Implicação negativa}
|
|
150
|
-
- {Trade-off aceito}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
## Cálculo de ROI
|
|
154
|
-
|
|
155
|
-
```markdown
|
|
156
|
-
## ROI Estimado: {Feature}
|
|
157
|
-
|
|
158
|
-
### Benefícios (anual)
|
|
159
|
-
- Aumento de conversão: R$ X
|
|
160
|
-
- Redução de suporte: R$ Y
|
|
161
|
-
- Economia de tempo: R$ Z
|
|
162
|
-
- **Total Benefícios**: R$ (X+Y+Z)
|
|
163
|
-
|
|
164
|
-
### Custos
|
|
165
|
-
- Desenvolvimento: R$ A (horas × rate)
|
|
166
|
-
- Infraestrutura: R$ B/mês × 12
|
|
167
|
-
- Manutenção: R$ C/ano
|
|
168
|
-
- **Total Custos**: R$ (A+B+C)
|
|
169
|
-
|
|
170
|
-
### ROI
|
|
171
|
-
**ROI = (Benefícios - Custos) / Custos × 100**
|
|
172
|
-
|
|
173
|
-
ROI = (X+Y+Z - A+B+C) / (A+B+C) × 100 = **{N}%**
|
|
174
|
-
|
|
175
|
-
### Payback
|
|
176
|
-
**Meses = Custo Inicial / (Benefício Mensal - Custo Mensal)**
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## Red Flags em Requisitos
|
|
180
|
-
|
|
181
|
-
Alertar quando detectar:
|
|
182
|
-
|
|
183
|
-
- "Deve ser igual ao [concorrente X]" sem especificar
|
|
184
|
-
- "Simples" ou "rápido" sem estimativa
|
|
185
|
-
- "Usuários querem..." sem evidência
|
|
186
|
-
- Escopo crescente sem priorização
|
|
187
|
-
- Deadline impossível sem trade-offs
|
|
188
|
-
|
|
189
|
-
## Checklist de Requisitos
|
|
190
|
-
|
|
191
|
-
- [ ] Persona/usuário definido
|
|
192
|
-
- [ ] Problema claramente articulado
|
|
193
|
-
- [ ] Valor de negócio quantificado
|
|
194
|
-
- [ ] Critérios de aceitação escritos
|
|
195
|
-
- [ ] Fora do escopo explícito
|
|
196
|
-
- [ ] Dependências mapeadas
|
|
197
|
-
- [ ] Riscos identificados
|
|
198
|
-
- [ ] Estimativa de esforço
|
|
199
|
-
- [ ] Prioridade definida (RICE/MoSCoW)
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* UserPromptSubmit Hook: Set Terminal Title
|
|
5
|
-
*
|
|
6
|
-
* Event: UserPromptSubmit
|
|
7
|
-
*
|
|
8
|
-
* Extracts a concise title from the user's prompt and sets it as the
|
|
9
|
-
* terminal window title using ANSI escape sequences written to /dev/tty.
|
|
10
|
-
* Also saves to ~/.claude/terminal_title for shell hook integration.
|
|
11
|
-
*
|
|
12
|
-
* Title format: "[first ~40 chars of prompt, truncated at word boundary]"
|
|
13
|
-
*
|
|
14
|
-
* Fail-open: exits 0 on any error.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { readStdin } from '../../shared/stdin-reader.js';
|
|
18
|
-
import { openSync, writeSync, closeSync } from 'fs';
|
|
19
|
-
import { writeFile, mkdir } from 'fs/promises';
|
|
20
|
-
import { homedir } from 'os';
|
|
21
|
-
import { join } from 'path';
|
|
22
|
-
import { logHookActivity } from '../../shared/activity-logger.js';
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
const payload = await readStdin();
|
|
26
|
-
if (!payload) process.exit(0);
|
|
27
|
-
|
|
28
|
-
const prompt = payload?.prompt || payload?.user_prompt || payload?.content || '';
|
|
29
|
-
if (!prompt || prompt.length < 3) process.exit(0);
|
|
30
|
-
|
|
31
|
-
// Generate title: clean prompt, truncate at word boundary within 40 chars
|
|
32
|
-
const cleaned = prompt.replace(/[\r\n\t]+/g, ' ').replace(/\s+/g, ' ').trim();
|
|
33
|
-
const maxLen = 40;
|
|
34
|
-
let title = cleaned.slice(0, maxLen);
|
|
35
|
-
if (cleaned.length > maxLen) {
|
|
36
|
-
const lastSpace = title.lastIndexOf(' ');
|
|
37
|
-
if (lastSpace > 20) title = title.slice(0, lastSpace);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const prefix = process.env.CLAUDE_TITLE_PREFIX ? `${process.env.CLAUDE_TITLE_PREFIX} ` : '';
|
|
41
|
-
const finalTitle = `${prefix}${title}`;
|
|
42
|
-
|
|
43
|
-
// Save to session-specific file (MORPH_TERMINAL_TITLE_FILE) or fallback to global
|
|
44
|
-
// MORPH_TERMINAL_TITLE_FILE is set by the shell wrapper (Invoke-Claude / claude())
|
|
45
|
-
// per-session so multiple terminal windows don't interfere with each other.
|
|
46
|
-
try {
|
|
47
|
-
const titleFilePath = process.env.MORPH_TERMINAL_TITLE_FILE
|
|
48
|
-
|| join(homedir(), '.claude', 'terminal_title');
|
|
49
|
-
const claudeDir = join(homedir(), '.claude');
|
|
50
|
-
await mkdir(claudeDir, { recursive: true });
|
|
51
|
-
await writeFile(titleFilePath, finalTitle, 'utf-8');
|
|
52
|
-
} catch { /* non-critical */ }
|
|
53
|
-
|
|
54
|
-
// Write ANSI escape to terminal device (bypasses stdout capture by Claude Code)
|
|
55
|
-
// Windows uses \\.\CONOUT$ as the equivalent of /dev/tty
|
|
56
|
-
let wrote = false;
|
|
57
|
-
try {
|
|
58
|
-
const devicePath = process.platform === 'win32' ? '\\\\.\\CONOUT$' : '/dev/tty';
|
|
59
|
-
const tty = openSync(devicePath, 'w');
|
|
60
|
-
writeSync(tty, `\x1b]0;${finalTitle}\x07`);
|
|
61
|
-
closeSync(tty);
|
|
62
|
-
wrote = true;
|
|
63
|
-
} catch { /* terminal may not support direct device access */ }
|
|
64
|
-
|
|
65
|
-
logHookActivity('set-terminal-title', 'UserPromptSubmit', wrote ? 'ok' : 'failed');
|
|
66
|
-
} catch { /* fail-open */ }
|
|
67
|
-
|
|
68
|
-
process.exit(0);
|