@polymorphism-tech/morph-spec 2.2.0 → 2.4.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 +314 -1673
- package/LICENSE +72 -72
- package/README.md +515 -516
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +358 -173
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/task-manager.js +429 -0
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/bin/validate.js +369 -0
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-apply.md +221 -158
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -0
- package/content/.claude/commands/morph-proposal.md +122 -101
- package/content/.claude/commands/morph-status.md +86 -86
- package/content/.claude/commands/morph-troubleshoot.md +122 -0
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/checklists/code-review.md +226 -0
- package/content/.claude/skills/checklists/morph-checklist.md +117 -0
- package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
- package/content/.claude/skills/infra/bicep-architect.md +126 -419
- package/content/.claude/skills/infra/container-specialist.md +131 -437
- package/content/.claude/skills/infra/devops-engineer.md +119 -405
- package/content/.claude/skills/integrations/asaas-financial.md +130 -333
- package/content/.claude/skills/integrations/azure-identity.md +142 -309
- package/content/.claude/skills/integrations/clerk-auth.md +108 -290
- package/content/.claude/skills/integrations/resend-email.md +119 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
- package/content/.claude/skills/specialists/azure-architect.md +142 -142
- package/content/.claude/skills/specialists/code-analyzer.md +235 -0
- package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
- package/content/.claude/skills/specialists/ef-modeler.md +113 -200
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
- package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
- package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
- package/content/.claude/skills/specialists/standards-architect.md +156 -78
- package/content/.claude/skills/specialists/testing-specialist.md +126 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
- package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
- package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
- package/content/.claude/skills/workflows/morph-replicate.md +213 -0
- package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
- package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
- package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
- package/content/.claude/skills/workflows/phase-tasks.md +164 -0
- package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +378 -242
- package/content/.morph/config/config.template.json +89 -108
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/design-impl.md +37 -0
- package/content/.morph/docs/workflows/fast-track.md +29 -0
- package/content/.morph/docs/workflows/full-morph.md +76 -0
- package/content/.morph/docs/workflows/standard.md +44 -0
- package/content/.morph/docs/workflows/ui-refresh.md +39 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
- package/content/.morph/examples/scheduled-reports/spec.md +267 -0
- package/content/.morph/examples/state-v3.json +188 -0
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +190 -239
- package/content/.morph/hooks/pre-commit-agents.sh +24 -24
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -0
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
- package/content/.morph/standards/agent-framework-production.md +410 -0
- package/content/.morph/standards/agent-framework-setup.md +413 -453
- package/content/.morph/standards/agent-framework-workflows.md +349 -0
- package/content/.morph/standards/architecture.md +325 -325
- package/content/.morph/standards/azure.md +605 -379
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/dotnet10-migration.md +520 -494
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/agent.cs +163 -172
- package/content/.morph/templates/clarify-questions.md +159 -0
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -0
- package/content/.morph/templates/contracts/Entities.cs +25 -0
- package/content/.morph/templates/contracts/Queries.cs +74 -0
- package/content/.morph/templates/contracts/README.md +74 -0
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/decisions.md +123 -106
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/proposal.md +141 -155
- package/content/.morph/templates/recap.md +94 -105
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/simulation.md +353 -0
- package/content/.morph/templates/spec.md +149 -148
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/state.template.json +222 -222
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/tasks.md +257 -235
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-components.md +362 -276
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/CLAUDE.md +150 -442
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/detectors/structure-detector.js +245 -250
- package/docs/README.md +144 -149
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/getting-started.md +301 -302
- package/docs/installation.md +361 -361
- package/docs/templates.md +418 -418
- package/docs/validation-checklist.md +265 -266
- package/package.json +80 -80
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +183 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -0
- package/src/commands/create-story.js +351 -351
- package/src/commands/detect-agents.js +139 -0
- package/src/commands/detect.js +104 -104
- package/src/commands/doctor.js +356 -280
- package/src/commands/generate.js +149 -149
- package/src/commands/init.js +258 -245
- package/src/commands/lint-fluent.js +352 -0
- package/src/commands/rollback-phase.js +185 -0
- package/src/commands/session-summary.js +291 -0
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/task.js +78 -0
- package/src/commands/troubleshoot.js +222 -0
- package/src/commands/update.js +192 -159
- package/src/commands/validate-blazor-state.js +210 -0
- package/src/commands/validate-blazor.js +156 -0
- package/src/commands/validate-css.js +84 -0
- package/src/commands/validate-phase.js +221 -0
- package/src/lib/blazor-concurrency-analyzer.js +288 -0
- package/src/lib/blazor-state-validator.js +291 -0
- package/src/lib/blazor-validator.js +374 -0
- package/src/lib/complexity-analyzer.js +441 -292
- package/src/lib/continuous-validator.js +421 -0
- package/src/lib/css-validator.js +352 -0
- package/src/lib/decision-constraint-loader.js +109 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/learning-system.js +520 -0
- package/src/lib/mockup-generator.js +366 -0
- package/src/lib/recap-generator.js +205 -0
- package/src/lib/state-manager.js +397 -340
- package/src/lib/troubleshoot-grep.js +194 -0
- package/src/lib/troubleshoot-index.js +144 -0
- package/src/lib/ui-detector.js +350 -0
- package/src/lib/validation-runner.js +231 -0
- package/src/lib/validators/architecture-validator.js +387 -0
- package/src/lib/validators/contract-compliance-validator.js +273 -0
- package/src/lib/validators/package-validator.js +360 -0
- package/src/lib/validators/ui-contrast-validator.js +422 -0
- package/src/utils/file-copier.js +179 -139
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- package/content/.claude/commands/morph-costs.md +0 -206
- package/content/.claude/commands/morph-tasks.md +0 -319
- package/content/.claude/skills/specialists/cost-guardian.md +0 -110
- package/content/.claude/skills/stacks/shopify.md +0 -445
- package/content/.morph/config/azure-pricing.json +0 -70
- package/content/.morph/config/azure-pricing.schema.json +0 -50
- package/content/.morph/hooks/pre-commit-costs.sh +0 -91
- package/docs/api/cost-calculator.js.html +0 -513
- package/docs/api/design-system-generator.js.html +0 -382
- package/docs/api/global.html +0 -5263
- package/docs/api/index.html +0 -96
- package/docs/api/state-manager.js.html +0 -423
- package/src/commands/cost.js +0 -181
- package/src/commands/update-pricing.js +0 -206
- package/src/lib/cost-calculator.js +0 -429
|
@@ -1,445 +0,0 @@
|
|
|
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*
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "./azure-pricing.schema.json",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"region": "eastus2",
|
|
5
|
-
"currency": "USD",
|
|
6
|
-
"lastUpdated": "2025-01-10T00:00:00Z",
|
|
7
|
-
"resources": {
|
|
8
|
-
"Microsoft.Sql/servers/databases": {
|
|
9
|
-
"Free": 0,
|
|
10
|
-
"Basic": 4.99,
|
|
11
|
-
"S0": 14.72,
|
|
12
|
-
"S1": 29.44,
|
|
13
|
-
"S2": 73.61,
|
|
14
|
-
"S3": 147.22,
|
|
15
|
-
"S4": 294.44,
|
|
16
|
-
"P1": 465.00,
|
|
17
|
-
"P2": 930.00,
|
|
18
|
-
"GP_Gen5_2": 328.00,
|
|
19
|
-
"GP_Gen5_4": 656.00,
|
|
20
|
-
"BC_Gen5_2": 1092.00
|
|
21
|
-
},
|
|
22
|
-
"Microsoft.App/containerApps": {
|
|
23
|
-
"Consumption": 0,
|
|
24
|
-
"Consumption_Active": 5.00,
|
|
25
|
-
"Dedicated_D2": 55.00,
|
|
26
|
-
"Dedicated_D4": 110.00
|
|
27
|
-
},
|
|
28
|
-
"Microsoft.Storage/storageAccounts": {
|
|
29
|
-
"Standard_LRS": 0.02,
|
|
30
|
-
"Standard_GRS": 0.05,
|
|
31
|
-
"Premium_LRS": 0.15
|
|
32
|
-
},
|
|
33
|
-
"Microsoft.Insights/components": {
|
|
34
|
-
"Free": 0,
|
|
35
|
-
"Basic": 2.30
|
|
36
|
-
},
|
|
37
|
-
"Microsoft.KeyVault/vaults": {
|
|
38
|
-
"Standard": 0.03,
|
|
39
|
-
"Premium": 1.00
|
|
40
|
-
},
|
|
41
|
-
"Microsoft.DocumentDB/databaseAccounts": {
|
|
42
|
-
"Serverless": 0,
|
|
43
|
-
"Provisioned_400RU": 23.36,
|
|
44
|
-
"Provisioned_1000RU": 58.40
|
|
45
|
-
},
|
|
46
|
-
"Microsoft.Web/serverfarms": {
|
|
47
|
-
"F1": 0,
|
|
48
|
-
"D1": 9.67,
|
|
49
|
-
"B1": 13.14,
|
|
50
|
-
"B2": 26.28,
|
|
51
|
-
"S1": 69.35,
|
|
52
|
-
"P1v2": 146.00
|
|
53
|
-
},
|
|
54
|
-
"Microsoft.ServiceBus/namespaces": {
|
|
55
|
-
"Basic": 0.05,
|
|
56
|
-
"Standard": 10.00,
|
|
57
|
-
"Premium": 677.00
|
|
58
|
-
},
|
|
59
|
-
"Microsoft.Cache/redis": {
|
|
60
|
-
"C0": 16.06,
|
|
61
|
-
"C1": 61.32,
|
|
62
|
-
"C2": 122.63,
|
|
63
|
-
"P1": 486.00
|
|
64
|
-
},
|
|
65
|
-
"Microsoft.Web/sites": {
|
|
66
|
-
"Consumption": 0,
|
|
67
|
-
"Premium_EP1": 146.00
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://polymorphism.com.br/schemas/azure-pricing.json",
|
|
4
|
-
"title": "Azure Pricing Table",
|
|
5
|
-
"description": "Monthly pricing for Azure resources by SKU (East US 2 / Brazil South)",
|
|
6
|
-
"type": "object",
|
|
7
|
-
"properties": {
|
|
8
|
-
"$schema": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"description": "JSON Schema reference"
|
|
11
|
-
},
|
|
12
|
-
"version": {
|
|
13
|
-
"type": "string",
|
|
14
|
-
"description": "Schema version",
|
|
15
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+$"
|
|
16
|
-
},
|
|
17
|
-
"region": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"description": "Azure region for pricing",
|
|
20
|
-
"enum": ["eastus2", "brazilsouth", "westus2", "northeurope"]
|
|
21
|
-
},
|
|
22
|
-
"currency": {
|
|
23
|
-
"type": "string",
|
|
24
|
-
"description": "Currency code",
|
|
25
|
-
"enum": ["USD", "BRL", "EUR"]
|
|
26
|
-
},
|
|
27
|
-
"lastUpdated": {
|
|
28
|
-
"type": "string",
|
|
29
|
-
"format": "date-time",
|
|
30
|
-
"description": "Last time pricing was updated"
|
|
31
|
-
},
|
|
32
|
-
"resources": {
|
|
33
|
-
"type": "object",
|
|
34
|
-
"description": "Resource types and their SKU pricing",
|
|
35
|
-
"patternProperties": {
|
|
36
|
-
"^Microsoft\\.[A-Za-z]+/[A-Za-z]+$": {
|
|
37
|
-
"type": "object",
|
|
38
|
-
"description": "SKU pricing for a resource type",
|
|
39
|
-
"additionalProperties": {
|
|
40
|
-
"type": "number",
|
|
41
|
-
"minimum": 0,
|
|
42
|
-
"description": "Monthly cost in specified currency"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
"required": ["version", "region", "currency", "lastUpdated", "resources"],
|
|
49
|
-
"additionalProperties": false
|
|
50
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# MORPH-SPEC Pre-commit Hook: Cost Validation
|
|
4
|
-
#
|
|
5
|
-
# Valida custos de arquivos Bicep antes de permitir commit.
|
|
6
|
-
# Bloqueia commits que excedem o limite configurado sem ADR.
|
|
7
|
-
#
|
|
8
|
-
# Instalação:
|
|
9
|
-
# cp .morph/hooks/pre-commit-costs.sh .git/hooks/pre-commit
|
|
10
|
-
# chmod +x .git/hooks/pre-commit
|
|
11
|
-
#
|
|
12
|
-
# Ou use symlink:
|
|
13
|
-
# ln -s ../../.morph/hooks/pre-commit-costs.sh .git/hooks/pre-commit
|
|
14
|
-
|
|
15
|
-
set -e
|
|
16
|
-
|
|
17
|
-
# Colors
|
|
18
|
-
RED='\033[0;31m'
|
|
19
|
-
YELLOW='\033[1;33m'
|
|
20
|
-
GREEN='\033[0;32m'
|
|
21
|
-
NC='\033[0m' # No Color
|
|
22
|
-
|
|
23
|
-
echo -e "${GREEN}🔍 MORPH-SPEC: Validating infrastructure costs...${NC}"
|
|
24
|
-
|
|
25
|
-
# Encontrar arquivos Bicep modificados no staged area
|
|
26
|
-
BICEP_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.bicep$' || true)
|
|
27
|
-
|
|
28
|
-
if [ -z "$BICEP_FILES" ]; then
|
|
29
|
-
echo -e "${GREEN}✓ No Bicep files changed, skipping cost validation.${NC}"
|
|
30
|
-
exit 0
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
echo "Found Bicep files:"
|
|
34
|
-
echo "$BICEP_FILES" | sed 's/^/ - /'
|
|
35
|
-
|
|
36
|
-
# Rodar cost calculator
|
|
37
|
-
RESULT=$(node bin/calculate-costs.js $BICEP_FILES --json 2>&1)
|
|
38
|
-
EXIT_CODE=$?
|
|
39
|
-
|
|
40
|
-
# Parse result JSON
|
|
41
|
-
MONTHLY_COST=$(echo "$RESULT" | grep -o '"monthly":[^,]*' | cut -d':' -f2 | tr -d ' ')
|
|
42
|
-
REQUIRES_ADR=$(echo "$RESULT" | grep -o '"requiresADR":[^,]*' | cut -d':' -f2 | tr -d ' ')
|
|
43
|
-
|
|
44
|
-
echo -e "\n${YELLOW}Estimated Monthly Cost: \$${MONTHLY_COST}${NC}"
|
|
45
|
-
|
|
46
|
-
# Se não requer ADR, aprovar
|
|
47
|
-
if [ "$REQUIRES_ADR" != "true" ]; then
|
|
48
|
-
echo -e "${GREEN}✓ Cost is within limits. Proceeding with commit.${NC}"
|
|
49
|
-
exit 0
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
# Se requer ADR, verificar se existe decisions.md com ADR de custo
|
|
53
|
-
echo -e "\n${YELLOW}⚠️ Cost exceeds ADR threshold!${NC}"
|
|
54
|
-
echo "Checking for cost ADR in decisions.md..."
|
|
55
|
-
|
|
56
|
-
# Procurar decisions.md em outputs de features
|
|
57
|
-
DECISIONS_FILES=$(find .morph/project/outputs -name "decisions.md" 2>/dev/null || true)
|
|
58
|
-
|
|
59
|
-
ADR_FOUND=false
|
|
60
|
-
|
|
61
|
-
for file in $DECISIONS_FILES; do
|
|
62
|
-
# Procurar por ADR que menciona "cost" ou "Infrastructure Costs"
|
|
63
|
-
if grep -qi "ADR.*cost\|Infrastructure Costs" "$file"; then
|
|
64
|
-
echo -e "${GREEN}✓ Found cost ADR in: $file${NC}"
|
|
65
|
-
ADR_FOUND=true
|
|
66
|
-
break
|
|
67
|
-
fi
|
|
68
|
-
done
|
|
69
|
-
|
|
70
|
-
if [ "$ADR_FOUND" = true ]; then
|
|
71
|
-
echo -e "${GREEN}✓ Cost ADR documented. Proceeding with commit.${NC}"
|
|
72
|
-
exit 0
|
|
73
|
-
else
|
|
74
|
-
echo -e "${RED}❌ COMMIT BLOCKED!${NC}"
|
|
75
|
-
echo ""
|
|
76
|
-
echo "Monthly cost (\$$MONTHLY_COST) exceeds the configured ADR threshold."
|
|
77
|
-
echo ""
|
|
78
|
-
echo "To proceed, you must:"
|
|
79
|
-
echo " 1. Document a cost ADR in .morph/project/outputs/{feature}/decisions.md"
|
|
80
|
-
echo " 2. Include justification for infrastructure costs"
|
|
81
|
-
echo ""
|
|
82
|
-
echo "Example ADR:"
|
|
83
|
-
echo " ## ADR-XXX: Infrastructure Costs"
|
|
84
|
-
echo " "
|
|
85
|
-
echo " **Estimated Monthly Cost:** \$$MONTHLY_COST"
|
|
86
|
-
echo " "
|
|
87
|
-
echo " **Justification:**"
|
|
88
|
-
echo " {Why these resources are necessary and cost-effective}"
|
|
89
|
-
echo ""
|
|
90
|
-
exit 1
|
|
91
|
-
fi
|