@polymorphism-tech/morph-spec 1.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/README.md +279 -0
- package/bin/morph-spec.js +53 -0
- package/content/.claude/commands/morph-apply.md +66 -0
- package/content/.claude/commands/morph-archive.md +79 -0
- package/content/.claude/commands/morph-costs.md +206 -0
- package/content/.claude/commands/morph-infra.md +209 -0
- package/content/.claude/commands/morph-proposal.md +60 -0
- package/content/.claude/commands/morph-status.md +71 -0
- package/content/.claude/settings.local.json +15 -0
- package/content/.claude/skills/infra/bicep-architect.md +419 -0
- package/content/.claude/skills/infra/container-specialist.md +437 -0
- package/content/.claude/skills/infra/devops-engineer.md +405 -0
- package/content/.claude/skills/integrations/asaas-financial.md +333 -0
- package/content/.claude/skills/integrations/azure-identity.md +309 -0
- package/content/.claude/skills/integrations/clerk-auth.md +290 -0
- package/content/.claude/skills/specialists/azure-architect.md +142 -0
- package/content/.claude/skills/specialists/cost-guardian.md +110 -0
- package/content/.claude/skills/specialists/ef-modeler.md +200 -0
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +245 -0
- package/content/.claude/skills/specialists/ms-agent-expert.md +209 -0
- package/content/.claude/skills/specialists/po-pm-advisor.md +197 -0
- package/content/.claude/skills/specialists/standards-architect.md +78 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +325 -0
- package/content/.claude/skills/stacks/dotnet-blazor.md +352 -0
- package/content/.claude/skills/stacks/dotnet-nextjs.md +402 -0
- package/content/.claude/skills/stacks/shopify.md +445 -0
- package/content/.morph/archive/.gitkeep +25 -0
- package/content/.morph/config/agents.json +149 -0
- package/content/.morph/config/config.template.json +96 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -0
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -0
- package/content/.morph/examples/api-nextjs/spec.md +399 -0
- package/content/.morph/examples/api-nextjs/tasks.md +168 -0
- package/content/.morph/examples/micro-saas/README.md +125 -0
- package/content/.morph/examples/micro-saas/contracts.cs +358 -0
- package/content/.morph/examples/micro-saas/decisions.md +246 -0
- package/content/.morph/examples/micro-saas/spec.md +236 -0
- package/content/.morph/examples/micro-saas/tasks.md +150 -0
- package/content/.morph/examples/multi-agent/README.md +309 -0
- package/content/.morph/examples/multi-agent/contracts.cs +433 -0
- package/content/.morph/examples/multi-agent/spec.md +479 -0
- package/content/.morph/examples/multi-agent/tasks.md +185 -0
- package/content/.morph/features/.gitkeep +25 -0
- package/content/.morph/project.md +159 -0
- package/content/.morph/specs/.gitkeep +20 -0
- package/content/.morph/standards/architecture.md +190 -0
- package/content/.morph/standards/azure.md +184 -0
- package/content/.morph/standards/coding.md +342 -0
- package/content/.morph/templates/agent.cs +172 -0
- package/content/.morph/templates/component.razor +239 -0
- package/content/.morph/templates/contracts.cs +217 -0
- package/content/.morph/templates/decisions.md +106 -0
- package/content/.morph/templates/infra/app-insights.bicep +63 -0
- package/content/.morph/templates/infra/container-app-env.bicep +49 -0
- package/content/.morph/templates/infra/container-app.bicep +156 -0
- package/content/.morph/templates/infra/key-vault.bicep +91 -0
- package/content/.morph/templates/infra/main.bicep +155 -0
- package/content/.morph/templates/infra/parameters.dev.json +23 -0
- package/content/.morph/templates/infra/parameters.prod.json +23 -0
- package/content/.morph/templates/infra/sql-database.bicep +103 -0
- package/content/.morph/templates/infra/storage.bicep +106 -0
- package/content/.morph/templates/integrations/asaas-client.cs +387 -0
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -0
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -0
- package/content/.morph/templates/integrations/clerk-config.cs +258 -0
- package/content/.morph/templates/job.cs +171 -0
- package/content/.morph/templates/migration.cs +83 -0
- package/content/.morph/templates/proposal.md +155 -0
- package/content/.morph/templates/recap.md +105 -0
- package/content/.morph/templates/repository.cs +141 -0
- package/content/.morph/templates/saas/subscription.cs +347 -0
- package/content/.morph/templates/saas/tenant.cs +338 -0
- package/content/.morph/templates/service.cs +139 -0
- package/content/.morph/templates/spec.md +147 -0
- package/content/.morph/templates/tasks.md +235 -0
- package/content/.morph/templates/test.cs +239 -0
- package/content/CLAUDE.md +318 -0
- package/package.json +50 -0
- package/src/commands/doctor.js +132 -0
- package/src/commands/init.js +121 -0
- package/src/commands/update.js +84 -0
- package/src/utils/file-copier.js +50 -0
- package/src/utils/logger.js +32 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
# Shopify Stack
|
|
2
|
+
|
|
3
|
+
Stack para desenvolvimento de apps e storefronts Shopify com Hydrogen e Liquid.
|
|
4
|
+
|
|
5
|
+
## Visão Geral
|
|
6
|
+
|
|
7
|
+
| Aspecto | Tecnologia |
|
|
8
|
+
|---------|------------|
|
|
9
|
+
| **Storefront** | Hydrogen / Liquid |
|
|
10
|
+
| **Apps** | Shopify App Bridge + Remix |
|
|
11
|
+
| **API** | GraphQL Storefront/Admin API |
|
|
12
|
+
| **CLI** | Shopify CLI |
|
|
13
|
+
| **Hosting** | Shopify hosting / Vercel |
|
|
14
|
+
|
|
15
|
+
## Triggers
|
|
16
|
+
|
|
17
|
+
Keywords: `shopify`, `hydrogen`, `liquid`, `ecommerce`, `storefront`, `shopify app`, `graphql`
|
|
18
|
+
|
|
19
|
+
## Tipos de Projetos Shopify
|
|
20
|
+
|
|
21
|
+
### 1. Theme Development (Liquid)
|
|
22
|
+
|
|
23
|
+
Customização de temas existentes ou criação de novos.
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
theme/
|
|
27
|
+
├── assets/
|
|
28
|
+
├── config/
|
|
29
|
+
├── layout/
|
|
30
|
+
│ └── theme.liquid
|
|
31
|
+
├── locales/
|
|
32
|
+
├── sections/
|
|
33
|
+
│ └── hero.liquid
|
|
34
|
+
├── snippets/
|
|
35
|
+
└── templates/
|
|
36
|
+
└── product.liquid
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Custom Storefront (Hydrogen)
|
|
40
|
+
|
|
41
|
+
Storefront headless com React e Remix.
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
hydrogen-app/
|
|
45
|
+
├── app/
|
|
46
|
+
│ ├── components/
|
|
47
|
+
│ ├── routes/
|
|
48
|
+
│ └── styles/
|
|
49
|
+
├── public/
|
|
50
|
+
├── remix.config.js
|
|
51
|
+
└── package.json
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 3. Shopify App
|
|
55
|
+
|
|
56
|
+
App que estende funcionalidades do Shopify Admin.
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
shopify-app/
|
|
60
|
+
├── app/
|
|
61
|
+
│ ├── routes/
|
|
62
|
+
│ │ └── app._index.tsx
|
|
63
|
+
│ └── shopify.server.ts
|
|
64
|
+
├── extensions/
|
|
65
|
+
└── shopify.app.toml
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Shopify CLI
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Instalar
|
|
72
|
+
npm install -g @shopify/cli
|
|
73
|
+
|
|
74
|
+
# Criar app
|
|
75
|
+
shopify app init
|
|
76
|
+
|
|
77
|
+
# Criar tema
|
|
78
|
+
shopify theme init
|
|
79
|
+
|
|
80
|
+
# Criar storefront Hydrogen
|
|
81
|
+
npm create @shopify/hydrogen
|
|
82
|
+
|
|
83
|
+
# Dev server
|
|
84
|
+
shopify app dev
|
|
85
|
+
shopify theme dev
|
|
86
|
+
npm run dev # Hydrogen
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Hydrogen (Storefront)
|
|
90
|
+
|
|
91
|
+
### Setup
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
npm create @shopify/hydrogen@latest -- --template demo-store
|
|
95
|
+
cd my-store
|
|
96
|
+
npm run dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Configuração
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
// hydrogen.config.ts
|
|
103
|
+
import { defineConfig } from '@shopify/hydrogen/config';
|
|
104
|
+
|
|
105
|
+
export default defineConfig({
|
|
106
|
+
shopify: {
|
|
107
|
+
defaultCountryCode: 'BR',
|
|
108
|
+
defaultLanguageCode: 'PT',
|
|
109
|
+
storeDomain: 'your-store.myshopify.com',
|
|
110
|
+
storefrontToken: process.env.PUBLIC_STOREFRONT_API_TOKEN,
|
|
111
|
+
storefrontApiVersion: '2024-01',
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Fetch de Produtos
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
// app/routes/products._index.tsx
|
|
120
|
+
import { json } from '@shopify/remix-oxygen';
|
|
121
|
+
import { useLoaderData } from '@remix-run/react';
|
|
122
|
+
import { ProductGrid } from '~/components/ProductGrid';
|
|
123
|
+
|
|
124
|
+
const PRODUCTS_QUERY = `#graphql
|
|
125
|
+
query Products($first: Int!) {
|
|
126
|
+
products(first: $first) {
|
|
127
|
+
nodes {
|
|
128
|
+
id
|
|
129
|
+
title
|
|
130
|
+
handle
|
|
131
|
+
priceRange {
|
|
132
|
+
minVariantPrice {
|
|
133
|
+
amount
|
|
134
|
+
currencyCode
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
featuredImage {
|
|
138
|
+
url
|
|
139
|
+
altText
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
`;
|
|
145
|
+
|
|
146
|
+
export async function loader({ context }: { context: HydrogenContext }) {
|
|
147
|
+
const { products } = await context.storefront.query(PRODUCTS_QUERY, {
|
|
148
|
+
variables: { first: 12 },
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
return json({ products: products.nodes });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export default function ProductsIndex() {
|
|
155
|
+
const { products } = useLoaderData<typeof loader>();
|
|
156
|
+
|
|
157
|
+
return (
|
|
158
|
+
<div className="container mx-auto p-4">
|
|
159
|
+
<h1 className="text-2xl font-bold mb-6">Produtos</h1>
|
|
160
|
+
<ProductGrid products={products} />
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Componente de Produto
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
// app/components/ProductCard.tsx
|
|
170
|
+
import { Image, Money } from '@shopify/hydrogen';
|
|
171
|
+
import { Link } from '@remix-run/react';
|
|
172
|
+
|
|
173
|
+
interface Props {
|
|
174
|
+
product: {
|
|
175
|
+
id: string;
|
|
176
|
+
title: string;
|
|
177
|
+
handle: string;
|
|
178
|
+
priceRange: {
|
|
179
|
+
minVariantPrice: {
|
|
180
|
+
amount: string;
|
|
181
|
+
currencyCode: string;
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
featuredImage?: {
|
|
185
|
+
url: string;
|
|
186
|
+
altText?: string;
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function ProductCard({ product }: Props) {
|
|
192
|
+
return (
|
|
193
|
+
<Link to={`/products/${product.handle}`} className="group">
|
|
194
|
+
<div className="aspect-square overflow-hidden rounded-lg bg-gray-100">
|
|
195
|
+
{product.featuredImage && (
|
|
196
|
+
<Image
|
|
197
|
+
data={product.featuredImage}
|
|
198
|
+
className="h-full w-full object-cover group-hover:scale-105 transition"
|
|
199
|
+
/>
|
|
200
|
+
)}
|
|
201
|
+
</div>
|
|
202
|
+
<h3 className="mt-4 text-sm text-gray-700">{product.title}</h3>
|
|
203
|
+
<Money
|
|
204
|
+
data={product.priceRange.minVariantPrice}
|
|
205
|
+
className="mt-1 text-lg font-medium text-gray-900"
|
|
206
|
+
/>
|
|
207
|
+
</Link>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Liquid (Theme Development)
|
|
213
|
+
|
|
214
|
+
### Section Exemplo
|
|
215
|
+
|
|
216
|
+
```liquid
|
|
217
|
+
{% comment %} sections/hero.liquid {% endcomment %}
|
|
218
|
+
|
|
219
|
+
<section class="hero" style="background-image: url('{{ section.settings.background_image | img_url: 'master' }}');">
|
|
220
|
+
<div class="hero__content">
|
|
221
|
+
<h1>{{ section.settings.heading }}</h1>
|
|
222
|
+
<p>{{ section.settings.subheading }}</p>
|
|
223
|
+
|
|
224
|
+
{% if section.settings.button_link != blank %}
|
|
225
|
+
<a href="{{ section.settings.button_link }}" class="btn">
|
|
226
|
+
{{ section.settings.button_text }}
|
|
227
|
+
</a>
|
|
228
|
+
{% endif %}
|
|
229
|
+
</div>
|
|
230
|
+
</section>
|
|
231
|
+
|
|
232
|
+
{% schema %}
|
|
233
|
+
{
|
|
234
|
+
"name": "Hero",
|
|
235
|
+
"settings": [
|
|
236
|
+
{
|
|
237
|
+
"type": "image_picker",
|
|
238
|
+
"id": "background_image",
|
|
239
|
+
"label": "Background Image"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"type": "text",
|
|
243
|
+
"id": "heading",
|
|
244
|
+
"label": "Heading",
|
|
245
|
+
"default": "Welcome to our store"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"type": "text",
|
|
249
|
+
"id": "subheading",
|
|
250
|
+
"label": "Subheading"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"type": "url",
|
|
254
|
+
"id": "button_link",
|
|
255
|
+
"label": "Button Link"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"type": "text",
|
|
259
|
+
"id": "button_text",
|
|
260
|
+
"label": "Button Text",
|
|
261
|
+
"default": "Shop Now"
|
|
262
|
+
}
|
|
263
|
+
],
|
|
264
|
+
"presets": [
|
|
265
|
+
{
|
|
266
|
+
"name": "Hero"
|
|
267
|
+
}
|
|
268
|
+
]
|
|
269
|
+
}
|
|
270
|
+
{% endschema %}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Product Template
|
|
274
|
+
|
|
275
|
+
```liquid
|
|
276
|
+
{% comment %} templates/product.liquid {% endcomment %}
|
|
277
|
+
|
|
278
|
+
<div class="product-page">
|
|
279
|
+
<div class="product-gallery">
|
|
280
|
+
{% for image in product.images %}
|
|
281
|
+
<img
|
|
282
|
+
src="{{ image | img_url: '600x600' }}"
|
|
283
|
+
alt="{{ image.alt | escape }}"
|
|
284
|
+
loading="lazy"
|
|
285
|
+
/>
|
|
286
|
+
{% endfor %}
|
|
287
|
+
</div>
|
|
288
|
+
|
|
289
|
+
<div class="product-info">
|
|
290
|
+
<h1>{{ product.title }}</h1>
|
|
291
|
+
<p class="price">{{ product.price | money }}</p>
|
|
292
|
+
|
|
293
|
+
<div class="description">
|
|
294
|
+
{{ product.description }}
|
|
295
|
+
</div>
|
|
296
|
+
|
|
297
|
+
{% form 'product', product %}
|
|
298
|
+
<select name="id">
|
|
299
|
+
{% for variant in product.variants %}
|
|
300
|
+
<option value="{{ variant.id }}" {% unless variant.available %}disabled{% endunless %}>
|
|
301
|
+
{{ variant.title }} - {{ variant.price | money }}
|
|
302
|
+
</option>
|
|
303
|
+
{% endfor %}
|
|
304
|
+
</select>
|
|
305
|
+
|
|
306
|
+
<input type="number" name="quantity" value="1" min="1" />
|
|
307
|
+
|
|
308
|
+
<button type="submit" {% unless product.available %}disabled{% endunless %}>
|
|
309
|
+
{% if product.available %}
|
|
310
|
+
Add to Cart
|
|
311
|
+
{% else %}
|
|
312
|
+
Sold Out
|
|
313
|
+
{% endif %}
|
|
314
|
+
</button>
|
|
315
|
+
{% endform %}
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## Shopify App
|
|
321
|
+
|
|
322
|
+
### App Setup
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
shopify app init --template=remix
|
|
326
|
+
cd my-app
|
|
327
|
+
shopify app dev
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### App Bridge
|
|
331
|
+
|
|
332
|
+
```tsx
|
|
333
|
+
// app/routes/app._index.tsx
|
|
334
|
+
import { json } from '@remix-run/node';
|
|
335
|
+
import { useLoaderData } from '@remix-run/react';
|
|
336
|
+
import { authenticate } from '../shopify.server';
|
|
337
|
+
import { Page, Layout, Card, Text } from '@shopify/polaris';
|
|
338
|
+
|
|
339
|
+
export async function loader({ request }) {
|
|
340
|
+
const { admin, session } = await authenticate.admin(request);
|
|
341
|
+
|
|
342
|
+
const response = await admin.graphql(`
|
|
343
|
+
query {
|
|
344
|
+
shop {
|
|
345
|
+
name
|
|
346
|
+
email
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
`);
|
|
350
|
+
|
|
351
|
+
const { data } = await response.json();
|
|
352
|
+
|
|
353
|
+
return json({ shop: data.shop });
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
export default function Index() {
|
|
357
|
+
const { shop } = useLoaderData<typeof loader>();
|
|
358
|
+
|
|
359
|
+
return (
|
|
360
|
+
<Page title="Dashboard">
|
|
361
|
+
<Layout>
|
|
362
|
+
<Layout.Section>
|
|
363
|
+
<Card>
|
|
364
|
+
<Text variant="headingMd" as="h2">
|
|
365
|
+
Welcome to {shop.name}
|
|
366
|
+
</Text>
|
|
367
|
+
<Text as="p">Store email: {shop.email}</Text>
|
|
368
|
+
</Card>
|
|
369
|
+
</Layout.Section>
|
|
370
|
+
</Layout>
|
|
371
|
+
</Page>
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
## GraphQL APIs
|
|
377
|
+
|
|
378
|
+
### Storefront API
|
|
379
|
+
|
|
380
|
+
```graphql
|
|
381
|
+
# Produtos
|
|
382
|
+
query {
|
|
383
|
+
products(first: 10) {
|
|
384
|
+
nodes {
|
|
385
|
+
id
|
|
386
|
+
title
|
|
387
|
+
handle
|
|
388
|
+
description
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
# Carrinho
|
|
394
|
+
mutation cartCreate($input: CartInput!) {
|
|
395
|
+
cartCreate(input: $input) {
|
|
396
|
+
cart {
|
|
397
|
+
id
|
|
398
|
+
checkoutUrl
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Admin API
|
|
405
|
+
|
|
406
|
+
```graphql
|
|
407
|
+
# Pedidos
|
|
408
|
+
query {
|
|
409
|
+
orders(first: 10) {
|
|
410
|
+
nodes {
|
|
411
|
+
id
|
|
412
|
+
name
|
|
413
|
+
totalPriceSet {
|
|
414
|
+
shopMoney {
|
|
415
|
+
amount
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
## Documentação de Referência
|
|
424
|
+
|
|
425
|
+
- [Shopify CLI](https://shopify.dev/docs/apps/tools/cli)
|
|
426
|
+
- [Hydrogen](https://shopify.dev/docs/storefronts/hydrogen)
|
|
427
|
+
- [Liquid](https://shopify.dev/docs/themes/liquid)
|
|
428
|
+
- [Storefront API](https://shopify.dev/docs/api/storefront)
|
|
429
|
+
- [Admin API](https://shopify.dev/docs/api/admin)
|
|
430
|
+
- [Polaris](https://polaris.shopify.com/)
|
|
431
|
+
|
|
432
|
+
## Checklist de Projeto
|
|
433
|
+
|
|
434
|
+
- [ ] Shopify CLI instalado
|
|
435
|
+
- [ ] Partner account configurado
|
|
436
|
+
- [ ] Development store criada
|
|
437
|
+
- [ ] API tokens configurados
|
|
438
|
+
- [ ] Theme/App estrutura criada
|
|
439
|
+
- [ ] GraphQL queries definidas
|
|
440
|
+
- [ ] Polaris para UI (apps)
|
|
441
|
+
- [ ] Testes com theme check
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Features Arquivadas
|
|
2
|
+
|
|
3
|
+
Esta pasta contém o histórico de features CONCLUÍDAS.
|
|
4
|
+
|
|
5
|
+
## Estrutura
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
archive/
|
|
9
|
+
└── {feature-name}/
|
|
10
|
+
├── proposal.md # Proposta original
|
|
11
|
+
├── spec.md # Especificação final
|
|
12
|
+
├── tasks.md # Tasks completadas
|
|
13
|
+
├── contracts.cs # Contracts finais
|
|
14
|
+
├── decisions.md # ADRs
|
|
15
|
+
└── recap.md # Resumo e métricas
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Por que arquivar?
|
|
19
|
+
|
|
20
|
+
1. Manter histórico de decisões
|
|
21
|
+
2. Referência para features similares
|
|
22
|
+
3. Métricas de produtividade
|
|
23
|
+
4. Lições aprendidas
|
|
24
|
+
|
|
25
|
+
*Gerado pelo MORPH Framework*
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"agents": {
|
|
4
|
+
"core": [
|
|
5
|
+
{
|
|
6
|
+
"id": "standards-architect",
|
|
7
|
+
"name": "Standards Architect",
|
|
8
|
+
"emoji": "📐",
|
|
9
|
+
"type": "core",
|
|
10
|
+
"description": "Guardião dos padrões de código e arquitetura",
|
|
11
|
+
"responsibilities": [
|
|
12
|
+
"Validar aderência aos padrões em .morph/standards/",
|
|
13
|
+
"Revisar nomenclatura e estrutura de código",
|
|
14
|
+
"Garantir consistência entre features",
|
|
15
|
+
"Aprovar código antes de merge"
|
|
16
|
+
],
|
|
17
|
+
"validatesPhases": ["design", "implement"]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "azure-architect",
|
|
21
|
+
"name": "Azure Architect",
|
|
22
|
+
"emoji": "☁️",
|
|
23
|
+
"type": "core",
|
|
24
|
+
"description": "Especialista em infraestrutura Azure",
|
|
25
|
+
"responsibilities": [
|
|
26
|
+
"Desenhar infraestrutura cost-effective",
|
|
27
|
+
"Configurar Container Apps com scale-to-zero",
|
|
28
|
+
"Definir estratégias de deployment",
|
|
29
|
+
"Gerenciar recursos e networking"
|
|
30
|
+
],
|
|
31
|
+
"expertise": ["Container Apps", "Azure SQL", "ACR", "App Insights", "Managed Identity"]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "blazor-builder",
|
|
35
|
+
"name": "Blazor Builder",
|
|
36
|
+
"emoji": "🔥",
|
|
37
|
+
"type": "core",
|
|
38
|
+
"description": "Especialista em componentes Blazor Server",
|
|
39
|
+
"responsibilities": [
|
|
40
|
+
"Criar componentes reutilizáveis",
|
|
41
|
+
"Implementar UI seguindo padrões",
|
|
42
|
+
"Gerenciar estado e lifecycle",
|
|
43
|
+
"Integrar SignalR quando necessário"
|
|
44
|
+
],
|
|
45
|
+
"patterns": ["Component-per-file", "@inject para DI", "Loading states", "Error boundaries"]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "ef-modeler",
|
|
49
|
+
"name": "EF Modeler",
|
|
50
|
+
"emoji": "🗄️",
|
|
51
|
+
"type": "core",
|
|
52
|
+
"description": "Especialista em Entity Framework e modelagem de dados",
|
|
53
|
+
"responsibilities": [
|
|
54
|
+
"Modelar entidades e relacionamentos",
|
|
55
|
+
"Criar migrations seguras",
|
|
56
|
+
"Otimizar queries com EF Core",
|
|
57
|
+
"Configurar DbContext"
|
|
58
|
+
],
|
|
59
|
+
"patterns": ["Fluent API always", "Private setters", "Value Objects", "Owned Types"]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "cost-guardian",
|
|
63
|
+
"name": "Cost Guardian",
|
|
64
|
+
"emoji": "💰",
|
|
65
|
+
"type": "core",
|
|
66
|
+
"description": "Guardião dos custos e otimização financeira",
|
|
67
|
+
"responsibilities": [
|
|
68
|
+
"Validar custos de cada recurso proposto",
|
|
69
|
+
"Alertar sobre recursos caros",
|
|
70
|
+
"Propor alternativas free/cheap",
|
|
71
|
+
"Bloquear recursos acima do budget"
|
|
72
|
+
],
|
|
73
|
+
"limits": {
|
|
74
|
+
"noApproval": "Free tier only",
|
|
75
|
+
"withApproval": "$10/month",
|
|
76
|
+
"requiresJustification": ">$10/month"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "ms-agent-expert",
|
|
81
|
+
"name": "MS Agent Expert",
|
|
82
|
+
"emoji": "🤖",
|
|
83
|
+
"type": "core",
|
|
84
|
+
"description": "Especialista em Microsoft Agent Framework e AI",
|
|
85
|
+
"responsibilities": [
|
|
86
|
+
"Integrar Semantic Kernel",
|
|
87
|
+
"Configurar plugins e skills",
|
|
88
|
+
"Otimizar prompts e tokens",
|
|
89
|
+
"Implementar agents para funcionalidades AI"
|
|
90
|
+
],
|
|
91
|
+
"defaultModel": "gpt-4o-mini",
|
|
92
|
+
"patterns": ["KernelFunction", "DI de Kernel", "Structured outputs", "Retry exponential"]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"specialists": [
|
|
96
|
+
{
|
|
97
|
+
"id": "hangfire-orchestrator",
|
|
98
|
+
"name": "Hangfire Orchestrator",
|
|
99
|
+
"emoji": "⏰",
|
|
100
|
+
"type": "specialist",
|
|
101
|
+
"description": "Especialista em background jobs",
|
|
102
|
+
"autoActivation": {
|
|
103
|
+
"keywords": ["scheduled", "job", "background", "recurring", "batch", "cron", "queue"]
|
|
104
|
+
},
|
|
105
|
+
"responsibilities": [
|
|
106
|
+
"Configurar jobs Hangfire",
|
|
107
|
+
"Definir retry policies",
|
|
108
|
+
"Implementar job chaining",
|
|
109
|
+
"Monitorar via dashboard"
|
|
110
|
+
],
|
|
111
|
+
"patterns": ["AutomaticRetry", "Queue attribute", "DisableConcurrentExecution"]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "uiux-designer",
|
|
115
|
+
"name": "UI/UX Designer",
|
|
116
|
+
"emoji": "🎨",
|
|
117
|
+
"type": "specialist",
|
|
118
|
+
"description": "Especialista em interfaces complexas",
|
|
119
|
+
"autoActivation": {
|
|
120
|
+
"keywords": ["wizard", "dashboard", "complex", "drag", "drop", "multi-step", "chart"]
|
|
121
|
+
},
|
|
122
|
+
"responsibilities": [
|
|
123
|
+
"Desenhar fluxos de usuário",
|
|
124
|
+
"Definir componentes complexos",
|
|
125
|
+
"Garantir responsividade",
|
|
126
|
+
"Acessibilidade WCAG 2.1"
|
|
127
|
+
],
|
|
128
|
+
"deliverables": ["Wireframes ASCII", "User flows", "Component specs"]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "popm-advisor",
|
|
132
|
+
"name": "PO/PM Advisor",
|
|
133
|
+
"emoji": "📋",
|
|
134
|
+
"type": "specialist",
|
|
135
|
+
"description": "Consultor de produto e requisitos",
|
|
136
|
+
"autoActivation": {
|
|
137
|
+
"keywords": ["unclear", "requirements", "priority", "ROI", "business", "value", "scope"]
|
|
138
|
+
},
|
|
139
|
+
"responsibilities": [
|
|
140
|
+
"Clarificar requisitos vagos",
|
|
141
|
+
"Priorizar funcionalidades",
|
|
142
|
+
"Definir MVP vs Nice-to-have",
|
|
143
|
+
"Questionar valor de negócio"
|
|
144
|
+
],
|
|
145
|
+
"techniques": ["5 Whys", "MoSCoW", "User story mapping"]
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"project": {
|
|
4
|
+
"name": "MyProject",
|
|
5
|
+
"description": "Descrição do projeto",
|
|
6
|
+
"type": "blazor-server",
|
|
7
|
+
"repository": "https://dev.azure.com/org/project/_git/repo"
|
|
8
|
+
},
|
|
9
|
+
"azure": {
|
|
10
|
+
"subscription": "subscription-id",
|
|
11
|
+
"resourceGroup": "rg-myproject-dev",
|
|
12
|
+
"location": "eastus2",
|
|
13
|
+
"resources": {
|
|
14
|
+
"containerApps": {
|
|
15
|
+
"enabled": true,
|
|
16
|
+
"environment": "cae-myproject-dev",
|
|
17
|
+
"minReplicas": 0,
|
|
18
|
+
"maxReplicas": 2
|
|
19
|
+
},
|
|
20
|
+
"sql": {
|
|
21
|
+
"enabled": true,
|
|
22
|
+
"server": "sql-myproject-dev",
|
|
23
|
+
"database": "sqldb-myproject-dev",
|
|
24
|
+
"tier": "Free",
|
|
25
|
+
"maxSizeGB": 32
|
|
26
|
+
},
|
|
27
|
+
"openai": {
|
|
28
|
+
"enabled": true,
|
|
29
|
+
"endpoint": "https://oai-myproject.openai.azure.com/",
|
|
30
|
+
"model": "gpt-4o-mini",
|
|
31
|
+
"maxTokensPerRequest": 4000
|
|
32
|
+
},
|
|
33
|
+
"monitoring": {
|
|
34
|
+
"enabled": true,
|
|
35
|
+
"appInsights": "appi-myproject-dev",
|
|
36
|
+
"logLevel": "Information"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"devops": {
|
|
41
|
+
"organization": "https://dev.azure.com/myorg",
|
|
42
|
+
"project": "MyProject",
|
|
43
|
+
"boards": {
|
|
44
|
+
"enabled": true,
|
|
45
|
+
"areaPath": "MyProject\\Features",
|
|
46
|
+
"iterationPath": "MyProject\\Sprint 1"
|
|
47
|
+
},
|
|
48
|
+
"repos": {
|
|
49
|
+
"defaultBranch": "main",
|
|
50
|
+
"featureBranchPrefix": "feature/"
|
|
51
|
+
},
|
|
52
|
+
"pipelines": {
|
|
53
|
+
"buildPipeline": "myproject-ci",
|
|
54
|
+
"releasePipeline": "myproject-cd"
|
|
55
|
+
},
|
|
56
|
+
"wiki": {
|
|
57
|
+
"enabled": true,
|
|
58
|
+
"wikiName": "MyProject.wiki"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"agents": {
|
|
62
|
+
"core": {
|
|
63
|
+
"standardsArchitect": { "enabled": true },
|
|
64
|
+
"azureArchitect": { "enabled": true },
|
|
65
|
+
"blazorBuilder": { "enabled": true },
|
|
66
|
+
"efModeler": { "enabled": true },
|
|
67
|
+
"costGuardian": { "enabled": true },
|
|
68
|
+
"msAgentExpert": { "enabled": true }
|
|
69
|
+
},
|
|
70
|
+
"specialists": {
|
|
71
|
+
"hangfireOrchestrator": {
|
|
72
|
+
"enabled": true,
|
|
73
|
+
"autoActivation": ["scheduled", "job", "background", "recurring", "batch", "cron"]
|
|
74
|
+
},
|
|
75
|
+
"uiuxDesigner": {
|
|
76
|
+
"enabled": true,
|
|
77
|
+
"autoActivation": ["wizard", "dashboard", "complex", "drag", "drop", "multi-step"]
|
|
78
|
+
},
|
|
79
|
+
"popmAdvisor": {
|
|
80
|
+
"enabled": true,
|
|
81
|
+
"autoActivation": ["unclear", "requirements", "priority", "ROI", "business", "value"]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"checkpoints": {
|
|
86
|
+
"afterDesign": true,
|
|
87
|
+
"afterTasks": true,
|
|
88
|
+
"everyNTasks": 3,
|
|
89
|
+
"beforeDeploy": true
|
|
90
|
+
},
|
|
91
|
+
"costs": {
|
|
92
|
+
"monthlyBudget": 15,
|
|
93
|
+
"alertThreshold": 10,
|
|
94
|
+
"requireApprovalAbove": 10
|
|
95
|
+
}
|
|
96
|
+
}
|