@polymorphism-tech/morph-spec 4.21.0 → 5.0.1
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 +57 -71
- package/README.md +2 -2
- package/bin/morph-spec.js +224 -491
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +55 -38
- package/framework/MORPH.md +244 -0
- package/framework/agents.json +127 -1183
- package/framework/commands/morph-apply.md +56 -240
- package/framework/commands/morph-archive.md +48 -85
- package/framework/commands/morph-preflight.md +7 -7
- package/framework/commands/morph-proposal.md +35 -191
- package/framework/commands/morph-status.md +19 -50
- package/framework/commands/morph-troubleshoot.md +2 -2
- package/framework/evals/rubrics/README.md +44 -0
- package/framework/evals/rubrics/architecture.md +46 -0
- package/framework/evals/rubrics/code-quality.md +50 -0
- package/framework/evals/rubrics/contracts.md +47 -0
- package/framework/evals/rubrics/test-coverage.md +50 -0
- package/framework/evals/scenarios/dotnet-crud.yaml +42 -0
- package/framework/evals/scenarios/nextjs-auth.yaml +38 -0
- package/framework/evals/suites/standard.yaml +5 -0
- package/framework/evals/trace-schema.md +67 -0
- package/framework/hooks/claude-code/core/README.md +3 -0
- package/framework/hooks/claude-code/core/denylist.json +14 -0
- package/framework/hooks/claude-code/{pre-tool-use → core}/enforce-phase-writes.js +5 -5
- package/framework/hooks/claude-code/core/post-edit-typecheck.js +69 -0
- package/framework/hooks/claude-code/core/pre-bash-denylist.js +29 -0
- package/framework/hooks/claude-code/{pre-tool-use → core}/protect-spec-files.js +4 -6
- package/framework/hooks/claude-code/{stop → core}/validate-completion.js +13 -82
- package/framework/hooks/shared/phase-utils.js +20 -28
- package/framework/hooks/shared/state-reader.js +4 -5
- package/framework/{skills/level-0-meta/mcp-registry.json → mcp/registry.json} +254 -210
- package/framework/phases.json +40 -114
- package/framework/rubrics/eval-rubric.json +66 -0
- package/framework/skills/README.md +39 -64
- package/framework/skills/core/README.md +3 -0
- package/framework/skills/core/morph-brainstorming/SKILL.md +102 -0
- package/framework/skills/core/morph-eval/SKILL.md +57 -0
- package/framework/skills/core/morph-implement/SKILL.md +83 -0
- package/framework/skills/core/morph-plan/SKILL.md +64 -0
- package/framework/skills/core/morph-review/SKILL.md +62 -0
- package/framework/skills/core/morph-stack-scan/SKILL.md +109 -0
- package/framework/skills/core/morph-standards/SKILL.md +49 -0
- package/framework/standards/STANDARDS.json +32 -0
- package/framework/standards/frontend/design-system/ai-image-generation.md +244 -0
- package/framework/standards/integration/mcp/mcp-tools.md +48 -0
- package/framework/templates/CLAUDE.md.core.guide.md +29 -0
- package/framework/templates/CLAUDE.md.core.template +22 -0
- package/framework/templates/REGISTRY.json +4 -4
- package/framework/workflows/configs/fast-track.json +5 -10
- package/framework/workflows/configs/full.json +4 -8
- package/framework/workflows/configs/quick.json +32 -0
- package/framework/workflows/configs/standard.json +57 -64
- package/package.json +7 -6
- package/src/commands/mcp/mcp-setup.js +58 -31
- package/src/commands/project/doctor.js +69 -70
- package/src/commands/project/init.js +26 -5
- package/src/commands/project/status.js +18 -19
- package/src/commands/state/approve.js +1 -1
- package/src/commands/validation/validate-feature.js +18 -112
- package/src/core/paths/output-schema.js +133 -151
- package/src/core/state/phase-state-machine.js +10 -24
- package/src/core/state/state-manager.js +17 -17
- package/src/core/workflows/workflow-detector.js +214 -31
- package/src/core/workflows/workflow-router.js +204 -0
- package/src/dashboard/app/pages/AgentMap.jsx +32 -33
- package/src/dashboard/app/pages/LiveState.jsx +1 -1
- package/src/dashboard/app/pages/PhasePipeline.jsx +2 -4
- package/src/dashboard/app/pages/SkillsLibrary.jsx +2 -3
- package/src/dashboard/app/pages/Workflows.jsx +2 -2
- package/src/dashboard/scanner/agents-scanner.js +30 -35
- package/src/lib/agents/metrics-aggregator.js +1 -1
- package/src/lib/agents/output-collector.js +7 -8
- package/src/lib/context/context-builder.js +289 -0
- package/src/lib/detectors/claude-config-detector.js +19 -3
- package/src/lib/generators/context-generator.js +20 -42
- package/src/lib/generators/index.js +1 -0
- package/src/lib/generators/mandate-generator.js +512 -0
- package/src/lib/generators/metadata-extractor.js +1 -1
- package/src/lib/generators/recap-generator.js +3 -4
- package/src/lib/installers/mcp-installer.js +300 -92
- package/src/lib/phase-chain/phase-validator.js +36 -40
- package/src/lib/stack/stack-profile.js +74 -91
- package/src/lib/tasks/task-parser.js +1 -1
- package/src/lib/tasks/wave-resolver.js +353 -0
- package/src/lib/validators/checkpoint-persistence.js +2 -2
- package/src/lib/validators/content/cross-phase-validator.js +281 -0
- package/src/lib/validators/content/index.js +1 -0
- package/src/lib/validators/shared/emit-validator-dispatch.js +6 -56
- package/src/scripts/global-install.js +2 -27
- package/src/utils/agents-installer.js +224 -447
- package/src/utils/claude-settings-manager.js +57 -15
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +15 -117
- package/src/utils/skills-installer.js +12 -18
- package/bin/detect-agents.js +0 -226
- package/bin/task-manager.js +0 -1036
- package/framework/agents/README.md +0 -13
- package/framework/agents/ai-agents/ai-system-architect.md +0 -194
- package/framework/agents/ai-agents/vector-search-expert.md +0 -247
- package/framework/agents/architecture/architecture-expert.md +0 -98
- package/framework/agents/architecture/morph-spec-architect.md +0 -66
- package/framework/agents/architecture/packages-validator.md +0 -89
- package/framework/agents/architecture/security-expert.md +0 -79
- package/framework/agents/architecture/seo-growth-hacker.md +0 -168
- package/framework/agents/architecture/standards-architect.md +0 -153
- package/framework/agents/backend/dotnet-senior.md +0 -163
- package/framework/agents/backend/ef-modeler.md +0 -119
- package/framework/agents/backend/hangfire-orchestrator.md +0 -133
- package/framework/agents/backend/ms-agent-expert.md +0 -55
- package/framework/agents/backend/neon-expert.md +0 -379
- package/framework/agents/frontend/css-specialist.md +0 -89
- package/framework/agents/frontend/design-system-validator.md +0 -100
- package/framework/agents/frontend/gsap-animator.md +0 -131
- package/framework/agents/frontend/nextjs-component-validator.md +0 -97
- package/framework/agents/frontend/nextjs-expert.md +0 -201
- package/framework/agents/frontend/ui-designer.md +0 -259
- package/framework/agents/infrastructure/infra-architect.md +0 -215
- package/framework/agents/integrations/asaas-financial.md +0 -138
- package/framework/agents/integrations/neon-auth.md +0 -151
- package/framework/agents/integrations/resend-email.md +0 -127
- package/framework/hooks/claude-code/post-tool-use/agent-complete.js +0 -122
- package/framework/hooks/claude-code/post-tool-use/dispatch.js +0 -363
- package/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +0 -78
- package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +0 -194
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +0 -199
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +0 -55
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +0 -323
- package/framework/hooks/claude-code/session-start/post-compact-restore.js +0 -41
- package/framework/hooks/claude-code/session-start/resume-context.js +0 -77
- package/framework/hooks/claude-code/teammate-idle/teammate-idle.js +0 -90
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +0 -114
- package/framework/hooks/shared/compact-restore.js +0 -123
- package/framework/hooks/shared/dispatch-helpers.js +0 -147
- package/framework/hooks/shared/skill-reminder-helpers.js +0 -79
- package/framework/hooks/shared/stale-task-reset.js +0 -57
- package/framework/hooks/shared/worktree-helpers.js +0 -75
- package/framework/skills/level-0-meta/README.md +0 -7
- package/framework/skills/level-0-meta/morph-agent-teams/SKILL.md +0 -472
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +0 -174
- package/framework/skills/level-0-meta/morph-brainstorming/references/proposal-example.md +0 -138
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +0 -145
- package/framework/skills/level-0-meta/morph-code-review/SKILL.md +0 -250
- package/framework/skills/level-0-meta/morph-code-review/references/review-example.md +0 -164
- package/framework/skills/level-0-meta/morph-code-review/references/review-guidelines.md +0 -100
- package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +0 -151
- package/framework/skills/level-0-meta/morph-code-review-nextjs/SKILL.md +0 -165
- package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +0 -254
- package/framework/skills/level-0-meta/morph-code-review-nextjs/scripts/scan-nextjs.mjs +0 -189
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +0 -344
- package/framework/skills/level-0-meta/morph-frontend-review/scripts/scan-accessibility.mjs +0 -376
- package/framework/skills/level-0-meta/morph-init/SKILL.md +0 -537
- package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +0 -225
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +0 -382
- package/framework/skills/level-0-meta/morph-post-implementation/scripts/detect-dev-server.mjs +0 -153
- package/framework/skills/level-0-meta/morph-post-implementation/scripts/detect-stack.mjs +0 -234
- package/framework/skills/level-0-meta/morph-simulation-checklist/SKILL.md +0 -106
- package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +0 -243
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +0 -169
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +0 -148
- package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +0 -110
- package/framework/skills/level-1-workflows/README.md +0 -7
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +0 -269
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +0 -453
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +0 -44
- package/framework/skills/level-1-workflows/morph-phase-design/references/spec-authoring-guide.md +0 -55
- package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +0 -253
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +0 -38
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +0 -493
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +0 -50
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +0 -46
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +0 -47
- package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +0 -132
- package/framework/skills/level-1-workflows/morph-phase-implement/references/vsa-implementation-guide.md +0 -92
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +0 -257
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +0 -14
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +0 -291
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -143
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +0 -404
- package/framework/skills/level-1-workflows/morph-phase-tasks/scripts/validate-tasks.mjs +0 -112
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +0 -788
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +0 -147
- package/framework/squad-templates/backend-only.json +0 -47
- package/framework/squad-templates/frontend-only.json +0 -56
- package/framework/squad-templates/full-stack.json +0 -74
- package/src/commands/agents/agent-metrics.js +0 -174
- package/src/commands/agents/audit-dispatch.js +0 -82
- package/src/commands/agents/detect-agents.js +0 -275
- package/src/commands/agents/dispatch-agents.js +0 -461
- package/src/commands/agents/index.js +0 -13
- package/src/commands/agents/manage-agents.js +0 -352
- package/src/commands/agents/project-metrics.js +0 -74
- package/src/commands/phase/phase-reset.js +0 -74
- package/src/commands/scope/escalate.js +0 -217
- package/src/commands/state/advance-phase.js +0 -600
- package/src/commands/state/phase-runner.js +0 -215
- package/src/commands/state/state.js +0 -444
- package/src/commands/task/expand.js +0 -100
- package/src/commands/tasks/index.js +0 -4
- package/src/commands/tasks/task.js +0 -105
- package/src/commands/templates/index.js +0 -5
- package/src/commands/templates/template-render.js +0 -93
- package/src/commands/trust/trust.js +0 -118
- package/src/lib/agents/agents-manager.js +0 -349
- package/src/lib/build/build-runner.js +0 -99
- package/src/lib/checkpoints/checkpoint-hooks.js +0 -111
- package/src/lib/contracts/sprint-contract-generator.js +0 -137
- package/src/lib/scope/impact-analyzer.js +0 -106
- package/src/lib/trust/trust-manager.js +0 -157
- package/src/utils/tier-helpers.js +0 -24
- /package/framework/hooks/claude-code/{post-tool-use → core}/loop-detect.js +0 -0
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ui-designer
|
|
3
|
-
description: UI/UX Designer specialist for wireframes, design systems, component specs, user flows, and design brief definition. Commits to a visual direction (aesthetic, palette, motion) BEFORE generating any output. Use for Phase 2 (UI/UX) and Phase 3 (spec) of features with frontend UI.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
color: purple
|
|
6
|
-
effort: medium
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# UI/UX Designer
|
|
10
|
-
|
|
11
|
-
Especialista em design de interfaces, UX e componentes. Domina **shadcn/ui** e **Tailwind CSS**.
|
|
12
|
-
|
|
13
|
-
> **FASE 2: UI/UX DESIGN** - Obrigatoria para features com front-end.
|
|
14
|
-
> Gera wireframes, specs de componentes e fluxos ANTES do design tecnico.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## Triggers
|
|
18
|
-
|
|
19
|
-
Keywords: `component`, `page`, `ui`, `ux`, `design`, `layout`, `wizard`, `dashboard`, `form`, `chart`, `table`, `dialog`, `modal`, `tela`, `interface`, `formulario`
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Active Phases
|
|
24
|
-
|
|
25
|
-
- **FASE 2** (UI/UX): Primary phase — wireframes, design system, components, flows
|
|
26
|
-
- **FASE 3** (Design): Design brief becomes structured input for technical spec
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Design Moderno (2025+)
|
|
31
|
-
|
|
32
|
-
### Visual Trends
|
|
33
|
-
- **Glassmorphism**: `backdrop-filter: blur(10px)`, semi-transparent backgrounds
|
|
34
|
-
- **Gradients**: Purple (#667eea → #764ba2), Blue-Purple (#4facfe → #00f2fe)
|
|
35
|
-
- **Soft Shadows**: `box-shadow: 0 4px 6px rgba(0,0,0,0.1)`
|
|
36
|
-
- **Rounded Corners**: `border-radius: 12px-16px`
|
|
37
|
-
- **Micro-interactions**: Hover effects, transitions (transform, scale, opacity)
|
|
38
|
-
- **Framer Motion**: Page transitions, stagger animations, layout animations
|
|
39
|
-
|
|
40
|
-
### Component Patterns
|
|
41
|
-
- Cards with elevation + hover lift
|
|
42
|
-
- Skeleton loaders (not just spinners)
|
|
43
|
-
- Toast notifications (bottom-right, auto-dismiss)
|
|
44
|
-
- Empty states with illustration + CTA
|
|
45
|
-
- Dark mode support (always design for both)
|
|
46
|
-
|
|
47
|
-
### Layout Principles
|
|
48
|
-
- Whitespace: 32px-48px container padding
|
|
49
|
-
- Grid: 12-column, gap 24px-32px
|
|
50
|
-
- Typography: xs:12, sm:14, base:16, lg:18, xl:20, 2xl:24
|
|
51
|
-
- Contrast: WCAG AA (4.5:1 text, 3:1 UI)
|
|
52
|
-
|
|
53
|
-
### Design References
|
|
54
|
-
Linear (linear.app), Vercel (vercel.com), Stripe (stripe.com), Dribbble dashboards
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
### Stitch MCP (Optional)
|
|
59
|
-
|
|
60
|
-
When Stitch MCP is available, use AI-generated screen designs instead of manual wireframes:
|
|
61
|
-
|
|
62
|
-
| Tool | Purpose |
|
|
63
|
-
|------|---------|
|
|
64
|
-
| `generate_screen_from_text` | Generate screen design from text prompt |
|
|
65
|
-
| `fetch_screen_image` | Export screen as image for review |
|
|
66
|
-
| `fetch_screen_code` | Export design.md with tokens |
|
|
67
|
-
| `list_projects` / `list_screens` | Navigate existing projects |
|
|
68
|
-
|
|
69
|
-
**Companion skills** (auto-installed with Stitch MCP):
|
|
70
|
-
- `stitch-design` — entry point for design generation via Claude Code
|
|
71
|
-
- `stitch-loop` — multi-page website generation
|
|
72
|
-
- `design-md` — generate design.md from existing designs
|
|
73
|
-
- `prompt-enhance` — improve design prompts automatically
|
|
74
|
-
- `react-components` — convert Stitch HTML to React components
|
|
75
|
-
- `shadcn-ui` — guide conversion to ShadCN components (recommended for Next.js projects)
|
|
76
|
-
|
|
77
|
-
**Key:** Stitch MCP transmits real HTML/CSS code (not screenshots), producing dramatically better results.
|
|
78
|
-
|
|
79
|
-
**Rule:** Stitch design.md is NOT a separate deliverable. Extract tokens into `design-system.md`.
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## Design Brief Protocol (MANDATORY)
|
|
84
|
-
|
|
85
|
-
> **This protocol runs BEFORE any wireframe, mockup, or visual decision.**
|
|
86
|
-
> Skipping this protocol produces generic, personality-less designs.
|
|
87
|
-
|
|
88
|
-
### Step 0: Read Project Design System
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
Read: .morph/context/design-system.md
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
**If the file EXISTS and has a filled Aesthetic Direction:**
|
|
95
|
-
- Confirm the direction, palette, and motion personality — do NOT invent new tokens
|
|
96
|
-
- DECLARE the brief explicitly (see format below) before generating any output
|
|
97
|
-
|
|
98
|
-
**If the file does NOT EXIST or has only TODO placeholders:**
|
|
99
|
-
- Fill in the missing sections using the Design Thinking questions (Step 1 below)
|
|
100
|
-
- This file is the persistent record — update it, don't just keep it in memory
|
|
101
|
-
|
|
102
|
-
**If Stitch MCP is available:**
|
|
103
|
-
- Check `list_projects` — if a project exists for this feature, its design.md can seed the design system
|
|
104
|
-
- Stitch tokens map INTO `design-system.md` — never a separate file
|
|
105
|
-
- Validate Stitch-exported colors against WCAG AA before adopting
|
|
106
|
-
|
|
107
|
-
**When taking any design decision not covered by the file:**
|
|
108
|
-
1. Add the token/decision to `design-system.md` in the correct section
|
|
109
|
-
2. Register in the Changelog: `- YYYY-MM-DD [ui-ux-designer] Description`
|
|
110
|
-
|
|
111
|
-
### Design Brief Declaration Format
|
|
112
|
-
|
|
113
|
-
Before generating any output, declare the brief explicitly:
|
|
114
|
-
|
|
115
|
-
```
|
|
116
|
-
## Design Brief for [Feature Name]
|
|
117
|
-
|
|
118
|
-
- **Direction:** [Minimal Refined / Editorial / Soft Professional / Industrial / Modern Luxury]
|
|
119
|
-
- **Tone:** [1-2 sentences]
|
|
120
|
-
- **Differentiator:** [The 1 memorable element]
|
|
121
|
-
- **Font Pair:** [Display font] + [Body font]
|
|
122
|
-
- **Color Palette:**
|
|
123
|
-
- Primary: `--color-primary: #XXXXXX`
|
|
124
|
-
- Accent: `--color-accent: #XXXXXX`
|
|
125
|
-
- Background: `--color-surface: #XXXXXX`
|
|
126
|
-
- **Motion Personality:** [subtle / expressive / playful / precise]
|
|
127
|
-
- **Visual Density:** [compact / balanced / spacious]
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
> **STOP:** Do not proceed to wireframes until this brief is declared.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## FASE 2 Workflow
|
|
135
|
-
|
|
136
|
-
### Step 1: Collect User Input (ALWAYS ask first)
|
|
137
|
-
|
|
138
|
-
1. Layout ideas or reference sites?
|
|
139
|
-
2. Visual references (screenshots, mockups)?
|
|
140
|
-
3. User flow expectations?
|
|
141
|
-
4. Design system defined (colors, fonts, spacing)?
|
|
142
|
-
5. Image examples to analyze?
|
|
143
|
-
|
|
144
|
-
If user provides screenshots → Read tool → extract patterns (layout, components, colors).
|
|
145
|
-
If HTML prototype exists → extract patterns automatically, skip wireframes.
|
|
146
|
-
|
|
147
|
-
### Step 2: Generate Deliverables
|
|
148
|
-
|
|
149
|
-
| File | Content |
|
|
150
|
-
|------|---------|
|
|
151
|
-
| `design-system.md` | Colors (real hex + CSS tokens), typography, spacing — sourced from `.morph/context/design-system.md` |
|
|
152
|
-
| `mockups.md` | ASCII wireframes + descriptions per screen |
|
|
153
|
-
| `components.md` | Component specs (shadcn/ui based, with Tailwind classes) |
|
|
154
|
-
| `flows.md` | User flow diagrams + edge cases |
|
|
155
|
-
|
|
156
|
-
### Step 3: Present for Approval
|
|
157
|
-
|
|
158
|
-
Show deliverable summary → **PAUSE** with 3 options (approve / adjust wireframes / add flows).
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
## shadcn/ui Component Reference
|
|
163
|
-
|
|
164
|
-
| Component | Use Case |
|
|
165
|
-
|-----------|----------|
|
|
166
|
-
| `Card` | Containers, dashboards |
|
|
167
|
-
| `Table` + `DataTable` | Data tables with sorting |
|
|
168
|
-
| `Dialog` | Modals, confirmations |
|
|
169
|
-
| `Sheet` | Side panels, mobile menus |
|
|
170
|
-
| `Form` | Forms with react-hook-form |
|
|
171
|
-
| `Toast` / `Sonner` | System feedback |
|
|
172
|
-
| `Input` / `Textarea` | Text inputs |
|
|
173
|
-
| `Select` / `Combobox` | Dropdowns, search select |
|
|
174
|
-
| `Tabs` | Tab navigation |
|
|
175
|
-
| `Skeleton` | Loading states |
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
## Design System Defaults
|
|
180
|
-
|
|
181
|
-
> **Source of truth:** `.morph/context/design-system.md` — always read it first.
|
|
182
|
-
> If the project has NO design system file and you need to bootstrap one, fill in these placeholders in `.morph/context/design-system.md`.
|
|
183
|
-
|
|
184
|
-
```css
|
|
185
|
-
/* Bootstrap placeholders — fill in from project brief, NEVER use as final values */
|
|
186
|
-
--color-primary: #TODO; /* Dominant palette color */
|
|
187
|
-
--color-primary-light: #TODO;
|
|
188
|
-
--color-primary-dark: #TODO;
|
|
189
|
-
|
|
190
|
-
--color-accent: #TODO; /* Sharp accent color */
|
|
191
|
-
--color-accent-hover: #TODO;
|
|
192
|
-
|
|
193
|
-
--color-surface: #TODO; /* Background color */
|
|
194
|
-
--color-text-primary: #TODO; /* Primary text */
|
|
195
|
-
--color-text-secondary: #TODO; /* Secondary / muted text */
|
|
196
|
-
|
|
197
|
-
/* Spacing (4px grid) */
|
|
198
|
-
--space-4: 1rem; /* Standard unit */
|
|
199
|
-
--space-6: 1.5rem;
|
|
200
|
-
--space-8: 2rem;
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
> **Do NOT copy these values into implementation.** They are conversation starters only.
|
|
204
|
-
> Real values live in `.morph/context/design-system.md` — open it and fill in the TODOs.
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
## Generating Deliverables
|
|
209
|
-
|
|
210
|
-
### mockups.md Structure
|
|
211
|
-
|
|
212
|
-
Per screen: ASCII wireframe + description (purpose, components, interactions, states) + responsiveness (desktop/mobile).
|
|
213
|
-
|
|
214
|
-
### components.md Structure
|
|
215
|
-
|
|
216
|
-
Per component: shadcn component, main props, events, states (default/loading/error/empty), accessibility (ARIA, keyboard).
|
|
217
|
-
|
|
218
|
-
### flows.md Structure
|
|
219
|
-
|
|
220
|
-
Per flow: Trigger, steps, happy path, edge cases, ASCII flowchart diagram.
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Accessibility (A11y)
|
|
225
|
-
|
|
226
|
-
- Contrast: 4.5:1 text minimum (WCAG AA)
|
|
227
|
-
- Focus visible: Outline on focusable elements
|
|
228
|
-
- Labels: Every input with associated label
|
|
229
|
-
- ARIA: Roles and labels where needed
|
|
230
|
-
- Keyboard nav: Logical tab order
|
|
231
|
-
- Motion: Respect `prefers-reduced-motion`
|
|
232
|
-
|
|
233
|
-
---
|
|
234
|
-
|
|
235
|
-
## Checklist
|
|
236
|
-
|
|
237
|
-
### FASE 2 Deliverables
|
|
238
|
-
- [ ] `design-system.md` read (project-level at `.morph/context/`) OR created with real tokens
|
|
239
|
-
- [ ] Design Brief declared before any visual output (direction, palette, motion)
|
|
240
|
-
- [ ] All color values in deliverables use CSS tokens (`--color-accent: #FF4D1C`) not generic names
|
|
241
|
-
- [ ] If Stitch was used: tokens extracted and mapped to `design-system.md` (no separate design.md output)
|
|
242
|
-
- [ ] `mockups.md`: Wireframes for ALL screens + states (loading, error, empty) + responsiveness
|
|
243
|
-
- [ ] `components.md`: shadcn components mapped with props/events/states
|
|
244
|
-
- [ ] `flows.md`: Happy paths + edge cases + ASCII diagrams
|
|
245
|
-
- [ ] `decisions.md`: Updated with UI decisions
|
|
246
|
-
|
|
247
|
-
### UI Quality
|
|
248
|
-
- [ ] Visual hierarchy clear
|
|
249
|
-
- [ ] Consistent spacing (4px multiples)
|
|
250
|
-
- [ ] Responsive (mobile-first)
|
|
251
|
-
- [ ] States: hover, focus, disabled, error
|
|
252
|
-
- [ ] Loading states (skeleton/spinner)
|
|
253
|
-
- [ ] Empty states with CTA
|
|
254
|
-
- [ ] WCAG AA accessibility
|
|
255
|
-
- [ ] Framer Motion animations respect `prefers-reduced-motion`
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: infra-architect
|
|
3
|
-
description: Infrastructure Squad Leader for Docker containerization, GitHub Actions CI/CD, and EasyPanel deployment. Use when planning deployments, containerizing applications, setting up CI/CD pipelines, or designing infrastructure architecture.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- docker
|
|
7
|
-
color: green
|
|
8
|
-
effort: medium
|
|
9
|
-
permissionMode: acceptEdits
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Infrastructure Squad Leader
|
|
13
|
-
|
|
14
|
-
Docker + GitHub Actions + EasyPanel infrastructure coordinator.
|
|
15
|
-
|
|
16
|
-
## Code Templates
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
.morph/framework/templates/infrastructure/
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Responsibilities
|
|
25
|
-
|
|
26
|
-
1. **Docker containerization** — multi-stage builds for .NET and Next.js
|
|
27
|
-
2. **Docker Compose** — local development environment orchestration
|
|
28
|
-
3. **GitHub Actions CI/CD** — build, test, deploy pipelines
|
|
29
|
-
4. **EasyPanel deployment** — VPS-based hosting via EasyPanel
|
|
30
|
-
5. **Secrets management** — environment variables, never hardcoded
|
|
31
|
-
6. **Infrastructure as Code** — everything via code, nothing manual
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Docker Multi-Stage Builds
|
|
36
|
-
|
|
37
|
-
### .NET API
|
|
38
|
-
|
|
39
|
-
```dockerfile
|
|
40
|
-
# Build stage
|
|
41
|
-
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
42
|
-
WORKDIR /src
|
|
43
|
-
COPY *.sln .
|
|
44
|
-
COPY src/**/*.csproj ./
|
|
45
|
-
RUN dotnet restore
|
|
46
|
-
COPY . .
|
|
47
|
-
RUN dotnet publish src/Web/Web.csproj -c Release -o /app/publish
|
|
48
|
-
|
|
49
|
-
# Runtime stage
|
|
50
|
-
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
51
|
-
WORKDIR /app
|
|
52
|
-
COPY --from=build /app/publish .
|
|
53
|
-
EXPOSE 8080
|
|
54
|
-
ENTRYPOINT ["dotnet", "Web.dll"]
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Next.js
|
|
58
|
-
|
|
59
|
-
```dockerfile
|
|
60
|
-
FROM node:22-alpine AS deps
|
|
61
|
-
WORKDIR /app
|
|
62
|
-
COPY package*.json ./
|
|
63
|
-
RUN npm ci --only=production
|
|
64
|
-
|
|
65
|
-
FROM node:22-alpine AS builder
|
|
66
|
-
WORKDIR /app
|
|
67
|
-
COPY --from=deps /app/node_modules ./node_modules
|
|
68
|
-
COPY . .
|
|
69
|
-
ARG NEXT_PUBLIC_API_URL
|
|
70
|
-
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
|
71
|
-
RUN npm run build
|
|
72
|
-
|
|
73
|
-
FROM node:22-alpine AS runner
|
|
74
|
-
WORKDIR /app
|
|
75
|
-
ENV NODE_ENV=production
|
|
76
|
-
COPY --from=builder /app/.next/standalone ./
|
|
77
|
-
COPY --from=builder /app/.next/static ./.next/static
|
|
78
|
-
COPY --from=builder /app/public ./public
|
|
79
|
-
EXPOSE 3000
|
|
80
|
-
CMD ["node", "server.js"]
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Docker Compose (Local Development)
|
|
86
|
-
|
|
87
|
-
```yaml
|
|
88
|
-
services:
|
|
89
|
-
api:
|
|
90
|
-
build:
|
|
91
|
-
context: ./api
|
|
92
|
-
dockerfile: Dockerfile
|
|
93
|
-
ports:
|
|
94
|
-
- "5000:8080"
|
|
95
|
-
environment:
|
|
96
|
-
- ConnectionStrings__Default=Server=db;Database=app;User=sa;Password=${DB_PASSWORD};TrustServerCertificate=true
|
|
97
|
-
depends_on:
|
|
98
|
-
db:
|
|
99
|
-
condition: service_healthy
|
|
100
|
-
|
|
101
|
-
web:
|
|
102
|
-
build:
|
|
103
|
-
context: ./web
|
|
104
|
-
dockerfile: Dockerfile
|
|
105
|
-
args:
|
|
106
|
-
NEXT_PUBLIC_API_URL: http://localhost:5000
|
|
107
|
-
ports:
|
|
108
|
-
- "3000:3000"
|
|
109
|
-
depends_on:
|
|
110
|
-
- api
|
|
111
|
-
|
|
112
|
-
db:
|
|
113
|
-
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
114
|
-
environment:
|
|
115
|
-
- ACCEPT_EULA=Y
|
|
116
|
-
- SA_PASSWORD=${DB_PASSWORD}
|
|
117
|
-
ports:
|
|
118
|
-
- "1433:1433"
|
|
119
|
-
volumes:
|
|
120
|
-
- db-data:/var/opt/mssql
|
|
121
|
-
healthcheck:
|
|
122
|
-
test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$$SA_PASSWORD" -Q "SELECT 1" -C
|
|
123
|
-
interval: 10s
|
|
124
|
-
timeout: 5s
|
|
125
|
-
retries: 5
|
|
126
|
-
|
|
127
|
-
volumes:
|
|
128
|
-
db-data:
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## GitHub Actions CI/CD
|
|
134
|
-
|
|
135
|
-
### Build & Test
|
|
136
|
-
|
|
137
|
-
```yaml
|
|
138
|
-
name: CI
|
|
139
|
-
on:
|
|
140
|
-
push:
|
|
141
|
-
branches: [main, develop]
|
|
142
|
-
pull_request:
|
|
143
|
-
branches: [main]
|
|
144
|
-
|
|
145
|
-
jobs:
|
|
146
|
-
build:
|
|
147
|
-
runs-on: ubuntu-latest
|
|
148
|
-
steps:
|
|
149
|
-
- uses: actions/checkout@v4
|
|
150
|
-
- uses: actions/setup-dotnet@v4
|
|
151
|
-
with:
|
|
152
|
-
dotnet-version: '10.0.x'
|
|
153
|
-
- run: dotnet restore
|
|
154
|
-
- run: dotnet build --no-restore
|
|
155
|
-
- run: dotnet test --no-build --verbosity normal
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Deploy to EasyPanel
|
|
159
|
-
|
|
160
|
-
```yaml
|
|
161
|
-
name: Deploy
|
|
162
|
-
on:
|
|
163
|
-
push:
|
|
164
|
-
branches: [main]
|
|
165
|
-
|
|
166
|
-
jobs:
|
|
167
|
-
deploy:
|
|
168
|
-
runs-on: ubuntu-latest
|
|
169
|
-
steps:
|
|
170
|
-
- uses: actions/checkout@v4
|
|
171
|
-
- name: Deploy to EasyPanel
|
|
172
|
-
uses: easypanel-io/deploy@v1
|
|
173
|
-
with:
|
|
174
|
-
easypanel-url: ${{ secrets.EASYPANEL_URL }}
|
|
175
|
-
easypanel-token: ${{ secrets.EASYPANEL_TOKEN }}
|
|
176
|
-
project: ${{ secrets.EASYPANEL_PROJECT }}
|
|
177
|
-
service: api
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
---
|
|
181
|
-
|
|
182
|
-
## EasyPanel Deployment Patterns
|
|
183
|
-
|
|
184
|
-
- **Services:** Each container (api, web, db) is an EasyPanel service
|
|
185
|
-
- **Environment variables:** Set in EasyPanel dashboard per service
|
|
186
|
-
- **Domains:** Configure custom domains via EasyPanel domain settings
|
|
187
|
-
- **Volumes:** Persistent storage for databases via EasyPanel volumes
|
|
188
|
-
- **Health checks:** Configure per service for auto-restart
|
|
189
|
-
- **Scaling:** Horizontal scaling via EasyPanel service replicas
|
|
190
|
-
|
|
191
|
-
### EasyPanel Service Setup
|
|
192
|
-
|
|
193
|
-
| Service | Type | Port | Notes |
|
|
194
|
-
|---------|------|------|-------|
|
|
195
|
-
| api | App (Docker) | 8080 | .NET API |
|
|
196
|
-
| web | App (Docker) | 3000 | Next.js frontend |
|
|
197
|
-
| db | Database (SQL Server) | 1433 | Managed by EasyPanel |
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Checklist
|
|
202
|
-
|
|
203
|
-
- [ ] Dockerfile uses multi-stage builds (separate build/runtime)
|
|
204
|
-
- [ ] Docker Compose for local development
|
|
205
|
-
- [ ] GitHub Actions CI pipeline (build + test)
|
|
206
|
-
- [ ] GitHub Actions CD pipeline (deploy to EasyPanel)
|
|
207
|
-
- [ ] Secrets in GitHub Secrets / EasyPanel env vars (never hardcoded)
|
|
208
|
-
- [ ] Health checks configured for all services
|
|
209
|
-
- [ ] `.dockerignore` excludes node_modules, .git, test files
|
|
210
|
-
- [ ] Environment variables documented
|
|
211
|
-
- [ ] Volumes configured for persistent data
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: asaas-financial
|
|
3
|
-
description: Asaas Financial specialist for Asaas API integration, payment processing, Pix/boleto billing, and subscription management in Brazilian projects. Use when integrating Asaas payments, implementing billing flows, handling payment webhooks, or building subscription management features.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- asaas
|
|
7
|
-
color: teal
|
|
8
|
-
effort: medium
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Asaas Financial
|
|
12
|
-
|
|
13
|
-
Integração com Asaas para pagamentos no Brasil. API REST, sem SDK .NET oficial. Suporta PIX, Boleto, Cartão.
|
|
14
|
-
|
|
15
|
-
## Setup
|
|
16
|
-
|
|
17
|
-
```csharp
|
|
18
|
-
// appsettings.json
|
|
19
|
-
{ "Asaas": { "BaseUrl": "https://sandbox.asaas.com/api/v3", "ApiKey": "${ASAAS_API_KEY}" } }
|
|
20
|
-
|
|
21
|
-
// Program.cs
|
|
22
|
-
builder.Services.Configure<AsaasOptions>(builder.Configuration.GetSection("Asaas"));
|
|
23
|
-
builder.Services.AddHttpClient<IAsaasClient, AsaasClient>((sp, client) =>
|
|
24
|
-
{
|
|
25
|
-
var options = sp.GetRequiredService<IOptions<AsaasOptions>>().Value;
|
|
26
|
-
client.BaseAddress = new Uri(options.BaseUrl);
|
|
27
|
-
client.DefaultRequestHeaders.Add("access_token", options.ApiKey);
|
|
28
|
-
client.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0");
|
|
29
|
-
});
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Client Interface
|
|
33
|
-
|
|
34
|
-
```csharp
|
|
35
|
-
public interface IAsaasClient
|
|
36
|
-
{
|
|
37
|
-
Task<AsaasCustomer> CreateCustomerAsync(CreateCustomerRequest request);
|
|
38
|
-
Task<AsaasPayment> CreatePaymentAsync(CreatePaymentRequest request);
|
|
39
|
-
Task<AsaasPayment> GetPaymentAsync(string paymentId);
|
|
40
|
-
Task<AsaasSubscription> CreateSubscriptionAsync(CreateSubscriptionRequest request);
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Implementation: standard `HttpClient.PostAsJsonAsync` / `GetAsync` + `ReadFromJsonAsync` pattern. Log errors, throw `AsaasException` on failure.
|
|
45
|
-
|
|
46
|
-
## DTOs (all use `[JsonPropertyName]`)
|
|
47
|
-
|
|
48
|
-
```csharp
|
|
49
|
-
public record CreateCustomerRequest
|
|
50
|
-
{
|
|
51
|
-
[JsonPropertyName("name")] public required string Name { get; init; }
|
|
52
|
-
[JsonPropertyName("cpfCnpj")] public required string CpfCnpj { get; init; } // REQUIRED even in sandbox
|
|
53
|
-
[JsonPropertyName("email")] public string? Email { get; init; }
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public record CreatePaymentRequest
|
|
57
|
-
{
|
|
58
|
-
[JsonPropertyName("customer")] public required string Customer { get; init; }
|
|
59
|
-
[JsonPropertyName("billingType")] public required string BillingType { get; init; } // BOLETO, PIX, CREDIT_CARD
|
|
60
|
-
[JsonPropertyName("value")] public required decimal Value { get; init; }
|
|
61
|
-
[JsonPropertyName("dueDate")] public required string DueDate { get; init; } // yyyy-MM-dd
|
|
62
|
-
[JsonPropertyName("description")] public string? Description { get; init; }
|
|
63
|
-
[JsonPropertyName("externalReference")] public string? ExternalReference { get; init; }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
public record AsaasPayment
|
|
67
|
-
{
|
|
68
|
-
[JsonPropertyName("id")] public string Id { get; init; } = "";
|
|
69
|
-
[JsonPropertyName("status")] public string Status { get; init; } = ""; // PENDING, RECEIVED, CONFIRMED, OVERDUE
|
|
70
|
-
[JsonPropertyName("invoiceUrl")] public string? InvoiceUrl { get; init; }
|
|
71
|
-
[JsonPropertyName("bankSlipUrl")] public string? BankSlipUrl { get; init; }
|
|
72
|
-
[JsonPropertyName("pixQrCode")] public AsaasPixQrCode? PixQrCode { get; init; }
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
public record AsaasPixQrCode
|
|
76
|
-
{
|
|
77
|
-
[JsonPropertyName("encodedImage")] public string? EncodedImage { get; init; } // Base64
|
|
78
|
-
[JsonPropertyName("payload")] public string? Payload { get; init; } // PIX copia-e-cola
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Follow same pattern for `CreateSubscriptionRequest` (add `cycle`: MONTHLY/WEEKLY/YEARLY, `nextDueDate`).
|
|
83
|
-
|
|
84
|
-
## Webhooks
|
|
85
|
-
|
|
86
|
-
```csharp
|
|
87
|
-
[ApiController, Route("api/webhooks/asaas")]
|
|
88
|
-
public class AsaasWebhookController(IPaymentService payments, ILogger<AsaasWebhookController> logger) : ControllerBase
|
|
89
|
-
{
|
|
90
|
-
[HttpPost]
|
|
91
|
-
public async Task<IActionResult> Handle([FromBody] AsaasWebhookPayload payload)
|
|
92
|
-
{
|
|
93
|
-
logger.LogInformation("Asaas webhook: {Event} payment {Id}", payload.Event, payload.Payment?.Id);
|
|
94
|
-
switch (payload.Event)
|
|
95
|
-
{
|
|
96
|
-
case "PAYMENT_CONFIRMED": case "PAYMENT_RECEIVED":
|
|
97
|
-
await payments.ConfirmPaymentAsync(payload.Payment!.Id); break;
|
|
98
|
-
case "PAYMENT_OVERDUE":
|
|
99
|
-
await payments.MarkOverdueAsync(payload.Payment!.Id); break;
|
|
100
|
-
case "PAYMENT_REFUNDED":
|
|
101
|
-
await payments.RefundPaymentAsync(payload.Payment!.Id); break;
|
|
102
|
-
}
|
|
103
|
-
return Ok();
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Environments
|
|
109
|
-
|
|
110
|
-
| Environment | Base URL |
|
|
111
|
-
|-------------|----------|
|
|
112
|
-
| Sandbox | `https://sandbox.asaas.com/api/v3` |
|
|
113
|
-
| Production | `https://www.asaas.com/api/v3` |
|
|
114
|
-
|
|
115
|
-
## Gotchas
|
|
116
|
-
|
|
117
|
-
| Issue | Fix |
|
|
118
|
-
|-------|-----|
|
|
119
|
-
| PIX QR Code returns Base64, NOT URL | `$"data:image/png;base64,{response.EncodedImage}"` |
|
|
120
|
-
| CPF required even in sandbox | Always include `cpfCnpj` in CreateCustomer |
|
|
121
|
-
| Missing `User-Agent` header | Add to HttpClient defaults |
|
|
122
|
-
| Date format must be `yyyy-MM-dd` | `DateTime.Today.AddDays(1).ToString("yyyy-MM-dd")` |
|
|
123
|
-
|
|
124
|
-
## Checklist
|
|
125
|
-
|
|
126
|
-
- [ ] API Key configured (not hardcoded)
|
|
127
|
-
- [ ] HttpClient with retry policy (Polly)
|
|
128
|
-
- [ ] Headers: `access_token` + `User-Agent`
|
|
129
|
-
- [ ] CPF/CNPJ always included for customers
|
|
130
|
-
- [ ] PIX QR Code → data URI conversion
|
|
131
|
-
- [ ] Dates in `yyyy-MM-dd` format
|
|
132
|
-
- [ ] Webhook endpoint + signature validation
|
|
133
|
-
- [ ] ExternalReference for reconciliation
|
|
134
|
-
- [ ] Tests with sandbox
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
*MORPH-SPEC by Polymorphism Tech*
|