@mmerterden/multi-agent-pipeline 20.35.0 → 20.37.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/CHANGELOG.md +26 -0
- package/README.md +6 -5
- package/README.tr.md +6 -5
- package/docs/architecture.md +3 -3
- package/docs/ecosystem.md +5 -5
- package/docs/facts.json +4 -4
- package/install/catalog-history.json +1 -1
- package/manifest.json +210 -136
- package/package.json +5 -1
- package/pipeline/commands/multi-agent/SKILL.md +33 -154
- package/pipeline/commands/multi-agent/analysis/SKILL.md +14 -68
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +5 -8
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +38 -109
- package/pipeline/commands/multi-agent/channels/SKILL.md +38 -167
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +37 -144
- package/pipeline/commands/multi-agent/design-check/SKILL.md +27 -131
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +22 -48
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +37 -180
- package/pipeline/commands/multi-agent/jira/SKILL.md +16 -46
- package/pipeline/commands/multi-agent/office-pair/SKILL.md +66 -0
- package/pipeline/commands/multi-agent/office-status/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/refactor/SKILL.md +23 -184
- package/pipeline/commands/multi-agent/resume/SKILL.md +30 -136
- package/pipeline/commands/multi-agent/review/SKILL.md +24 -199
- package/pipeline/commands/multi-agent/setup/SKILL.md +25 -181
- package/pipeline/commands/multi-agent/stack/SKILL.md +9 -53
- package/pipeline/commands/multi-agent/status/SKILL.md +13 -2
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +27 -226
- package/pipeline/commands/multi-agent/sync/SKILL.md +38 -167
- package/pipeline/commands/multi-agent/test-gen/SKILL.md +2 -4
- package/pipeline/commands/multi-agent/update/SKILL.md +18 -60
- package/pipeline/contract/CHANGELOG.md +9 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
- package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
- package/pipeline/contract/fixtures/error-unsigned.json +1 -1
- package/pipeline/contract/fixtures/runs-awaiting-question.json +1 -1
- package/pipeline/contract/fixtures/runs-empty.json +1 -1
- package/pipeline/contract/fixtures/runs-failed.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +1 -1
- package/pipeline/contract/fixtures/runs-pr-opened.json +1 -1
- package/pipeline/contract/fixtures/runs-running.json +1 -1
- package/pipeline/contract/manifest.json +5 -5
- package/pipeline/contract/types/index.d.ts +3 -2
- package/pipeline/lib/qr-code.mjs +26 -0
- package/pipeline/multi-agent-refs/autopilot-on/details.md +148 -0
- package/pipeline/multi-agent-refs/channels/generator.md +14 -0
- package/pipeline/multi-agent-refs/channels/preview.md +13 -0
- package/pipeline/multi-agent-refs/channels/reference.md +46 -0
- package/pipeline/multi-agent-refs/complaint-analysis/phases.md +159 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
- package/pipeline/multi-agent-refs/design-check/export.md +1 -0
- package/pipeline/multi-agent-refs/design-check/init-inventory.md +1 -1
- package/pipeline/multi-agent-refs/design-check/scope-and-ledger.md +64 -0
- package/pipeline/multi-agent-refs/features/analysis-command-notes.md +53 -0
- package/pipeline/multi-agent-refs/garbage-collect/phases.md +60 -0
- package/pipeline/multi-agent-refs/help/en.md +1 -0
- package/pipeline/multi-agent-refs/help/tr.md +1 -0
- package/pipeline/multi-agent-refs/ios-coding-standard/plan.md +71 -0
- package/pipeline/multi-agent-refs/ios-coding-standard/resolve-and-scan.md +135 -0
- package/pipeline/multi-agent-refs/jira/picker-detail.md +71 -0
- package/pipeline/multi-agent-refs/orchestrator/copilot-pipeline.md +88 -0
- package/pipeline/multi-agent-refs/orchestrator/dispatcher.md +96 -1
- package/pipeline/multi-agent-refs/refactor/sweep.md +190 -0
- package/pipeline/multi-agent-refs/resume/details.md +115 -2
- package/pipeline/multi-agent-refs/review/inputs.md +33 -1
- package/pipeline/multi-agent-refs/review/module-guides.md +9 -1
- package/pipeline/multi-agent-refs/review/panel.md +75 -0
- package/pipeline/multi-agent-refs/review/valven.md +5 -1
- package/pipeline/multi-agent-refs/setup/hooks-and-plugins.md +4 -0
- package/pipeline/multi-agent-refs/setup/token-save-flow.md +13 -0
- package/pipeline/multi-agent-refs/stack/background.md +72 -0
- package/pipeline/multi-agent-refs/store-ready/gates.md +139 -0
- package/pipeline/multi-agent-refs/store-ready/report.md +40 -2
- package/pipeline/multi-agent-refs/sync/office.md +10 -0
- package/pipeline/multi-agent-refs/sync/overview.md +61 -0
- package/pipeline/multi-agent-refs/sync/repo.md +91 -0
- package/pipeline/multi-agent-refs/update/details.md +83 -0
- package/pipeline/schemas/runs-index.schema.json +2 -1
- package/pipeline/scripts/contract-server.mjs +1 -1
- package/pipeline/scripts/office-pair.mjs +40 -9
- package/pipeline/scripts/runs-index.mjs +34 -7
- package/pipeline/scripts/status-overview.mjs +401 -0
- package/pipeline/skills/.skill-manifest.json +69 -65
- package/pipeline/skills/.skills-index.json +15 -4
- package/pipeline/skills/shared/README.md +4 -3
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +8 -71
- package/pipeline/skills/shared/core/apple-archive-compliance/references/examples.md +67 -0
- package/pipeline/skills/shared/core/apple-archive-compliance/references/version-history.md +8 -0
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +11 -73
- package/pipeline/skills/shared/core/google-play-compliance/references/examples.md +69 -0
- package/pipeline/skills/shared/core/google-play-compliance/references/notes.md +7 -0
- package/pipeline/skills/shared/core/google-play-compliance/references/version-history.md +5 -0
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +39 -262
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +35 -73
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +37 -337
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +27 -122
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +8 -340
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +37 -180
- package/pipeline/skills/shared/core/multi-agent-office-pair/SKILL.md +19 -0
- package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +23 -184
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +14 -82
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +25 -277
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +13 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +75 -219
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +11 -162
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-code.md +257 -0
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +7 -58
- package/pipeline/skills/shared/external/android-architecture/references/code-examples.md +68 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +3 -45
- package/pipeline/skills/shared/external/app-intents/references/code-examples.md +54 -0
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +5 -81
- package/pipeline/skills/shared/external/app-store-optimization/references/engagement-and-localization.md +96 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +6 -112
- package/pipeline/skills/shared/external/app-store-review/references/monetization-and-submission.md +138 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +10 -117
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models-code.md +186 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +3 -50
- package/pipeline/skills/shared/external/authentication/references/code-examples.md +59 -0
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +3 -84
- package/pipeline/skills/shared/external/callkit-voip/references/code-examples.md +93 -0
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +7 -263
- package/pipeline/skills/shared/external/ci-cd-pipelines/references/pipeline-examples.md +281 -0
- package/pipeline/skills/shared/external/clean-code/SKILL.md +8 -41
- package/pipeline/skills/shared/external/clean-code/references/code-examples.md +56 -0
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +8 -146
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-code.md +214 -0
- package/pipeline/skills/shared/external/compose-components/SKILL.md +6 -80
- package/pipeline/skills/shared/external/compose-components/references/code-examples.md +89 -0
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +5 -64
- package/pipeline/skills/shared/external/compose-navigation/references/code-examples.md +70 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +9 -157
- package/pipeline/skills/shared/external/core-data/references/core-data-code.md +221 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +3 -89
- package/pipeline/skills/shared/external/core-nfc/references/code-examples.md +98 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +17 -133
- package/pipeline/skills/shared/external/coreml/references/coreml-code.md +208 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +8 -131
- package/pipeline/skills/shared/external/css-modern/references/code-examples.md +142 -0
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +6 -103
- package/pipeline/skills/shared/external/database-patterns/references/orm-examples.md +112 -0
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +7 -48
- package/pipeline/skills/shared/external/html-semantic/references/code-examples.md +54 -0
- package/pipeline/skills/shared/external/humanizer/SKILL.md +6 -19
- package/pipeline/skills/shared/external/humanizer/references/voice.md +24 -0
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +13 -170
- package/pipeline/skills/shared/external/ios-accessibility/references/assistive-tech-review.md +224 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +2 -24
- package/pipeline/skills/shared/external/ios-localization/references/code-examples.md +30 -0
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +3 -58
- package/pipeline/skills/shared/external/ios-networking/references/code-examples.md +67 -0
- package/pipeline/skills/shared/external/ios-security/SKILL.md +4 -64
- package/pipeline/skills/shared/external/ios-security/references/code-examples.md +74 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -90
- package/pipeline/skills/shared/external/live-activities/references/code-examples.md +108 -0
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +9 -23
- package/pipeline/skills/shared/external/localization-reuse-map/references/project-settings.md +22 -0
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +5 -95
- package/pipeline/skills/shared/external/mapkit-location/references/code-examples.md +117 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +7 -106
- package/pipeline/skills/shared/external/nextjs-app-router/references/app-router-examples.md +124 -0
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -31
- package/pipeline/skills/shared/external/permissionkit/references/code-examples.md +37 -0
- package/pipeline/skills/shared/external/play-store-review/SKILL.md +6 -74
- package/pipeline/skills/shared/external/play-store-review/references/signing-and-policies.md +83 -0
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +8 -125
- package/pipeline/skills/shared/external/push-notifications/references/notification-code.md +176 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +7 -158
- package/pipeline/skills/shared/external/python-patterns/references/python-examples.md +176 -0
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +7 -157
- package/pipeline/skills/shared/external/rest-api-design/references/api-examples.md +175 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +11 -230
- package/pipeline/skills/shared/external/swift-architecture/references/pattern-examples.md +295 -0
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +17 -149
- package/pipeline/skills/shared/external/swift-codable/references/codable-recipes.md +207 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +12 -99
- package/pipeline/skills/shared/external/swift-concurrency/references/code-examples.md +100 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-additions.md +18 -0
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +9 -78
- package/pipeline/skills/shared/external/swift-formatstyle/references/formatstyle-examples.md +113 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -56
- package/pipeline/skills/shared/external/swift-language/references/code-examples.md +65 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +1 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +6 -122
- package/pipeline/skills/shared/external/swiftdata/references/code-examples.md +140 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +12 -139
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/interop-code.md +198 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +9 -81
- package/pipeline/skills/shared/external/tailwind-css/references/code-examples.md +91 -0
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +7 -207
- package/pipeline/skills/shared/external/testing-backend/references/testing-examples.md +225 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +8 -89
- package/pipeline/skills/shared/external/typescript-patterns/references/code-examples.md +100 -0
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -20
- package/pipeline/skills/shared/external/vision-framework/references/code-examples.md +26 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +7 -169
- package/pipeline/skills/shared/external/vue-composition/references/vue-examples.md +187 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +7 -174
- package/pipeline/skills/shared/external/web-accessibility/references/a11y-examples.md +192 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +8 -66
- package/pipeline/skills/shared/external/web-performance/references/code-examples.md +77 -0
- package/pipeline/skills/shared/external/web-testing/SKILL.md +11 -186
- package/pipeline/skills/shared/external/web-testing/references/testing-examples.md +213 -0
- package/pipeline/skills/skills-index.md +2 -1
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/format-and-output.md +0 -0
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/publish-and-snapshot.md +0 -0
- /package/pipeline/skills/shared/external/localization-reuse-map/{reference → references}/sources-and-recipes.md +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Modern CSS Code Examples
|
|
2
|
+
|
|
3
|
+
Full code samples for the SKILL.md sections that link here. The rules and the decision guidance stay in SKILL.md; each heading below matches the SKILL.md section the code belongs to.
|
|
4
|
+
|
|
5
|
+
## CSS Custom Properties (Variables)
|
|
6
|
+
|
|
7
|
+
```css
|
|
8
|
+
:root {
|
|
9
|
+
/* Color system */
|
|
10
|
+
--color-brand: oklch(55% 0.25 265);
|
|
11
|
+
--color-brand-light: oklch(70% 0.2 265);
|
|
12
|
+
--color-brand-dark: oklch(40% 0.25 265);
|
|
13
|
+
|
|
14
|
+
--color-surface: #ffffff;
|
|
15
|
+
--color-surface-elevated: #f9fafb;
|
|
16
|
+
--color-text: #111827;
|
|
17
|
+
--color-text-muted: #6b7280;
|
|
18
|
+
--color-border: #e5e7eb;
|
|
19
|
+
|
|
20
|
+
/* Spacing scale */
|
|
21
|
+
--space-xs: 0.25rem;
|
|
22
|
+
--space-sm: 0.5rem;
|
|
23
|
+
--space-md: 1rem;
|
|
24
|
+
--space-lg: 1.5rem;
|
|
25
|
+
--space-xl: 2rem;
|
|
26
|
+
--space-2xl: 3rem;
|
|
27
|
+
|
|
28
|
+
/* Typography */
|
|
29
|
+
--font-sans: 'Inter', system-ui, sans-serif;
|
|
30
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
31
|
+
|
|
32
|
+
/* Transitions */
|
|
33
|
+
--transition-fast: 150ms ease;
|
|
34
|
+
--transition-normal: 250ms ease;
|
|
35
|
+
--transition-slow: 400ms ease;
|
|
36
|
+
|
|
37
|
+
/* Shadows */
|
|
38
|
+
--shadow-sm: 0 1px 2px rgb(0 0 0 / 0.05);
|
|
39
|
+
--shadow-md: 0 4px 6px rgb(0 0 0 / 0.1);
|
|
40
|
+
--shadow-lg: 0 10px 15px rgb(0 0 0 / 0.1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Dark theme override */
|
|
44
|
+
@media (prefers-color-scheme: dark) {
|
|
45
|
+
:root {
|
|
46
|
+
--color-surface: #111827;
|
|
47
|
+
--color-surface-elevated: #1f2937;
|
|
48
|
+
--color-text: #f9fafb;
|
|
49
|
+
--color-text-muted: #9ca3af;
|
|
50
|
+
--color-border: #374151;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Component using tokens */
|
|
55
|
+
.card {
|
|
56
|
+
background: var(--color-surface-elevated);
|
|
57
|
+
color: var(--color-text);
|
|
58
|
+
border: 1px solid var(--color-border);
|
|
59
|
+
border-radius: 0.75rem;
|
|
60
|
+
padding: var(--space-lg);
|
|
61
|
+
box-shadow: var(--shadow-sm);
|
|
62
|
+
transition: box-shadow var(--transition-normal);
|
|
63
|
+
|
|
64
|
+
&:hover {
|
|
65
|
+
box-shadow: var(--shadow-md);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Animations and Transitions
|
|
71
|
+
|
|
72
|
+
```css
|
|
73
|
+
/* View Transitions API */
|
|
74
|
+
@view-transition {
|
|
75
|
+
navigation: auto;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.hero-image {
|
|
79
|
+
view-transition-name: hero;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
::view-transition-old(hero) {
|
|
83
|
+
animation: fade-out 300ms ease;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
::view-transition-new(hero) {
|
|
87
|
+
animation: fade-in 300ms ease;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Scroll-driven animations */
|
|
91
|
+
@keyframes slide-in {
|
|
92
|
+
from { opacity: 0; transform: translateY(50px); }
|
|
93
|
+
to { opacity: 1; transform: translateY(0); }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.scroll-reveal {
|
|
97
|
+
animation: slide-in linear both;
|
|
98
|
+
animation-timeline: view();
|
|
99
|
+
animation-range: entry 0% entry 100%;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Transition with discrete properties */
|
|
103
|
+
.dialog {
|
|
104
|
+
transition: opacity 300ms ease, display 300ms ease allow-discrete;
|
|
105
|
+
opacity: 0;
|
|
106
|
+
display: none;
|
|
107
|
+
|
|
108
|
+
&[open] {
|
|
109
|
+
opacity: 1;
|
|
110
|
+
display: block;
|
|
111
|
+
|
|
112
|
+
@starting-style {
|
|
113
|
+
opacity: 0;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Keyframe animation */
|
|
119
|
+
@keyframes shimmer {
|
|
120
|
+
0% { background-position: -200% 0; }
|
|
121
|
+
100% { background-position: 200% 0; }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.skeleton {
|
|
125
|
+
background: linear-gradient(
|
|
126
|
+
90deg,
|
|
127
|
+
#f0f0f0 25%,
|
|
128
|
+
#e0e0e0 50%,
|
|
129
|
+
#f0f0f0 75%
|
|
130
|
+
);
|
|
131
|
+
background-size: 200% 100%;
|
|
132
|
+
animation: shimmer 1.5s infinite ease-in-out;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Respect motion preferences */
|
|
136
|
+
@media (prefers-reduced-motion: reduce) {
|
|
137
|
+
.scroll-reveal {
|
|
138
|
+
animation: none;
|
|
139
|
+
opacity: 1;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
@@ -197,112 +197,11 @@ ALTER TABLE "user" DROP COLUMN IF EXISTS preferences;
|
|
|
197
197
|
|
|
198
198
|
## Prisma ORM (TypeScript)
|
|
199
199
|
|
|
200
|
-
|
|
201
|
-
// prisma/schema.prisma
|
|
202
|
-
generator client {
|
|
203
|
-
provider = "prisma-client-js"
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
datasource db {
|
|
207
|
-
provider = "postgresql"
|
|
208
|
-
url = env("DATABASE_URL")
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
model User {
|
|
212
|
-
id String @id @default(uuid())
|
|
213
|
-
email String @unique
|
|
214
|
-
name String
|
|
215
|
-
role Role @default(USER)
|
|
216
|
-
posts Post[]
|
|
217
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
218
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
219
|
-
|
|
220
|
-
@@map("user")
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
model Post {
|
|
224
|
-
id String @id @default(uuid())
|
|
225
|
-
title String
|
|
226
|
-
slug String @unique
|
|
227
|
-
content String @default("")
|
|
228
|
-
status PostStatus @default(DRAFT)
|
|
229
|
-
publishedAt DateTime? @map("published_at")
|
|
230
|
-
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
|
|
231
|
-
authorId String @map("author_id")
|
|
232
|
-
tags Tag[]
|
|
233
|
-
createdAt DateTime @default(now()) @map("created_at")
|
|
234
|
-
updatedAt DateTime @updatedAt @map("updated_at")
|
|
235
|
-
|
|
236
|
-
@@index([authorId, status])
|
|
237
|
-
@@map("post")
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
enum Role { ADMIN USER VIEWER }
|
|
241
|
-
enum PostStatus { DRAFT PUBLISHED ARCHIVED }
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
// queries
|
|
246
|
-
const posts = await prisma.post.findMany({
|
|
247
|
-
where: { status: 'PUBLISHED', author: { role: 'ADMIN' } },
|
|
248
|
-
include: { author: { select: { name: true, email: true } }, tags: true },
|
|
249
|
-
orderBy: { publishedAt: 'desc' },
|
|
250
|
-
take: 20,
|
|
251
|
-
skip: 0,
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
// Transaction
|
|
255
|
-
const [post, notification] = await prisma.$transaction([
|
|
256
|
-
prisma.post.update({ where: { id }, data: { status: 'PUBLISHED', publishedAt: new Date() } }),
|
|
257
|
-
prisma.notification.create({ data: { userId: authorId, type: 'POST_PUBLISHED' } }),
|
|
258
|
-
]);
|
|
259
|
-
```
|
|
200
|
+
Code for this section: [ORM examples](references/orm-examples.md).
|
|
260
201
|
|
|
261
202
|
## Drizzle ORM (TypeScript)
|
|
262
203
|
|
|
263
|
-
|
|
264
|
-
// schema.ts
|
|
265
|
-
import { pgTable, uuid, text, timestamp, boolean, pgEnum } from 'drizzle-orm/pg-core';
|
|
266
|
-
|
|
267
|
-
export const roleEnum = pgEnum('role', ['admin', 'user', 'viewer']);
|
|
268
|
-
|
|
269
|
-
export const users = pgTable('user', {
|
|
270
|
-
id: uuid('id').primaryKey().defaultRandom(),
|
|
271
|
-
email: text('email').notNull().unique(),
|
|
272
|
-
name: text('name').notNull(),
|
|
273
|
-
role: roleEnum('role').notNull().default('user'),
|
|
274
|
-
isActive: boolean('is_active').notNull().default(true),
|
|
275
|
-
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
|
276
|
-
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
export const posts = pgTable('post', {
|
|
280
|
-
id: uuid('id').primaryKey().defaultRandom(),
|
|
281
|
-
authorId: uuid('author_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
|
|
282
|
-
title: text('title').notNull(),
|
|
283
|
-
slug: text('slug').notNull().unique(),
|
|
284
|
-
content: text('content').notNull().default(''),
|
|
285
|
-
status: text('status', { enum: ['draft', 'published', 'archived'] }).notNull().default('draft'),
|
|
286
|
-
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
// queries
|
|
290
|
-
import { eq, and, desc } from 'drizzle-orm';
|
|
291
|
-
|
|
292
|
-
const publishedPosts = await db
|
|
293
|
-
.select()
|
|
294
|
-
.from(posts)
|
|
295
|
-
.where(and(eq(posts.status, 'published'), eq(posts.authorId, userId)))
|
|
296
|
-
.orderBy(desc(posts.createdAt))
|
|
297
|
-
.limit(20);
|
|
298
|
-
|
|
299
|
-
// Join query
|
|
300
|
-
const postsWithAuthors = await db
|
|
301
|
-
.select({ post: posts, authorName: users.name })
|
|
302
|
-
.from(posts)
|
|
303
|
-
.innerJoin(users, eq(posts.authorId, users.id))
|
|
304
|
-
.where(eq(posts.status, 'published'));
|
|
305
|
-
```
|
|
204
|
+
Code for this section: [ORM examples](references/orm-examples.md).
|
|
306
205
|
|
|
307
206
|
## Do's
|
|
308
207
|
|
|
@@ -336,3 +235,7 @@ const postsWithAuthors = await db
|
|
|
336
235
|
| Data inconsistency | Missing constraints or transaction | Add foreign keys, use transactions for multi-step ops |
|
|
337
236
|
| Migration fails | Incompatible schema change | Use additive migrations: add column, backfill, then drop old |
|
|
338
237
|
| ORM generates bad SQL | Complex query expressed in ORM | Use raw SQL for complex analytical queries |
|
|
238
|
+
|
|
239
|
+
## References
|
|
240
|
+
|
|
241
|
+
- [ORM examples](references/orm-examples.md): open when defining schemas or writing queries with Prisma or Drizzle.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# ORM examples
|
|
2
|
+
|
|
3
|
+
Schema and query code for Prisma and Drizzle. SKILL.md keeps schema design, indexing, query optimization and migration rules.
|
|
4
|
+
|
|
5
|
+
## Prisma ORM (TypeScript)
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// prisma/schema.prisma
|
|
9
|
+
generator client {
|
|
10
|
+
provider = "prisma-client-js"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
datasource db {
|
|
14
|
+
provider = "postgresql"
|
|
15
|
+
url = env("DATABASE_URL")
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
model User {
|
|
19
|
+
id String @id @default(uuid())
|
|
20
|
+
email String @unique
|
|
21
|
+
name String
|
|
22
|
+
role Role @default(USER)
|
|
23
|
+
posts Post[]
|
|
24
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
25
|
+
updatedAt DateTime @updatedAt @map("updated_at")
|
|
26
|
+
|
|
27
|
+
@@map("user")
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
model Post {
|
|
31
|
+
id String @id @default(uuid())
|
|
32
|
+
title String
|
|
33
|
+
slug String @unique
|
|
34
|
+
content String @default("")
|
|
35
|
+
status PostStatus @default(DRAFT)
|
|
36
|
+
publishedAt DateTime? @map("published_at")
|
|
37
|
+
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
|
|
38
|
+
authorId String @map("author_id")
|
|
39
|
+
tags Tag[]
|
|
40
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
41
|
+
updatedAt DateTime @updatedAt @map("updated_at")
|
|
42
|
+
|
|
43
|
+
@@index([authorId, status])
|
|
44
|
+
@@map("post")
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
enum Role { ADMIN USER VIEWER }
|
|
48
|
+
enum PostStatus { DRAFT PUBLISHED ARCHIVED }
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// queries
|
|
53
|
+
const posts = await prisma.post.findMany({
|
|
54
|
+
where: { status: 'PUBLISHED', author: { role: 'ADMIN' } },
|
|
55
|
+
include: { author: { select: { name: true, email: true } }, tags: true },
|
|
56
|
+
orderBy: { publishedAt: 'desc' },
|
|
57
|
+
take: 20,
|
|
58
|
+
skip: 0,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Transaction
|
|
62
|
+
const [post, notification] = await prisma.$transaction([
|
|
63
|
+
prisma.post.update({ where: { id }, data: { status: 'PUBLISHED', publishedAt: new Date() } }),
|
|
64
|
+
prisma.notification.create({ data: { userId: authorId, type: 'POST_PUBLISHED' } }),
|
|
65
|
+
]);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Drizzle ORM (TypeScript)
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// schema.ts
|
|
72
|
+
import { pgTable, uuid, text, timestamp, boolean, pgEnum } from 'drizzle-orm/pg-core';
|
|
73
|
+
|
|
74
|
+
export const roleEnum = pgEnum('role', ['admin', 'user', 'viewer']);
|
|
75
|
+
|
|
76
|
+
export const users = pgTable('user', {
|
|
77
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
78
|
+
email: text('email').notNull().unique(),
|
|
79
|
+
name: text('name').notNull(),
|
|
80
|
+
role: roleEnum('role').notNull().default('user'),
|
|
81
|
+
isActive: boolean('is_active').notNull().default(true),
|
|
82
|
+
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
|
83
|
+
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
export const posts = pgTable('post', {
|
|
87
|
+
id: uuid('id').primaryKey().defaultRandom(),
|
|
88
|
+
authorId: uuid('author_id').notNull().references(() => users.id, { onDelete: 'cascade' }),
|
|
89
|
+
title: text('title').notNull(),
|
|
90
|
+
slug: text('slug').notNull().unique(),
|
|
91
|
+
content: text('content').notNull().default(''),
|
|
92
|
+
status: text('status', { enum: ['draft', 'published', 'archived'] }).notNull().default('draft'),
|
|
93
|
+
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// queries
|
|
97
|
+
import { eq, and, desc } from 'drizzle-orm';
|
|
98
|
+
|
|
99
|
+
const publishedPosts = await db
|
|
100
|
+
.select()
|
|
101
|
+
.from(posts)
|
|
102
|
+
.where(and(eq(posts.status, 'published'), eq(posts.authorId, userId)))
|
|
103
|
+
.orderBy(desc(posts.createdAt))
|
|
104
|
+
.limit(20);
|
|
105
|
+
|
|
106
|
+
// Join query
|
|
107
|
+
const postsWithAuthors = await db
|
|
108
|
+
.select({ post: posts, authorName: users.name })
|
|
109
|
+
.from(posts)
|
|
110
|
+
.innerJoin(users, eq(posts.authorId, users.id))
|
|
111
|
+
.where(eq(posts.status, 'published'));
|
|
112
|
+
```
|
|
@@ -205,54 +205,9 @@ improves accessibility, SEO, and maintainability. Style with CSS, not with HTML
|
|
|
205
205
|
|
|
206
206
|
## SEO Best Practices
|
|
207
207
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
<title>Primary Keyword - Brand Name</title>
|
|
212
|
-
<meta name="description" content="Compelling description with primary keywords (150-160 chars)" />
|
|
213
|
-
<meta name="robots" content="index, follow" />
|
|
214
|
-
<link rel="canonical" href="https://example.com/current-page" />
|
|
215
|
-
|
|
216
|
-
<!-- Open Graph (Facebook, LinkedIn) -->
|
|
217
|
-
<meta property="og:type" content="article" />
|
|
218
|
-
<meta property="og:title" content="Article Title" />
|
|
219
|
-
<meta property="og:description" content="Compelling description for social sharing" />
|
|
220
|
-
<meta property="og:image" content="https://example.com/og-image.jpg" />
|
|
221
|
-
<meta property="og:image:width" content="1200" />
|
|
222
|
-
<meta property="og:image:height" content="630" />
|
|
223
|
-
<meta property="og:url" content="https://example.com/article" />
|
|
224
|
-
<meta property="og:site_name" content="Site Name" />
|
|
225
|
-
|
|
226
|
-
<!-- Twitter Cards -->
|
|
227
|
-
<meta name="twitter:card" content="summary_large_image" />
|
|
228
|
-
<meta name="twitter:site" content="@sitehandle" />
|
|
229
|
-
<meta name="twitter:title" content="Article Title" />
|
|
230
|
-
<meta name="twitter:description" content="Description for Twitter" />
|
|
231
|
-
<meta name="twitter:image" content="https://example.com/twitter-card.jpg" />
|
|
232
|
-
|
|
233
|
-
<!-- Structured Data (JSON-LD) -->
|
|
234
|
-
<script type="application/ld+json">
|
|
235
|
-
{
|
|
236
|
-
"@context": "https://schema.org",
|
|
237
|
-
"@type": "Article",
|
|
238
|
-
"headline": "Article Title",
|
|
239
|
-
"author": {
|
|
240
|
-
"@type": "Person",
|
|
241
|
-
"name": "Jane Doe",
|
|
242
|
-
"url": "https://example.com/authors/jane"
|
|
243
|
-
},
|
|
244
|
-
"datePublished": "2025-01-15",
|
|
245
|
-
"dateModified": "2025-01-20",
|
|
246
|
-
"image": "https://example.com/article-image.jpg",
|
|
247
|
-
"publisher": {
|
|
248
|
-
"@type": "Organization",
|
|
249
|
-
"name": "Site Name",
|
|
250
|
-
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
</script>
|
|
254
|
-
</head>
|
|
255
|
-
```
|
|
208
|
+
Every page head carries a title, a meta description, robots and a canonical link, then Open Graph tags (absolute `og:image` URL, 1200x630), Twitter Card tags and JSON-LD structured data.
|
|
209
|
+
|
|
210
|
+
Code: [SEO Best Practices](references/code-examples.md#seo-best-practices).
|
|
256
211
|
|
|
257
212
|
### Heading Hierarchy
|
|
258
213
|
|
|
@@ -302,3 +257,7 @@ improves accessibility, SEO, and maintainability. Style with CSS, not with HTML
|
|
|
302
257
|
| Form not submitting | Missing `name` attribute on inputs | Add `name` to every form input |
|
|
303
258
|
| Accessibility audit fails | Divs used as buttons, missing labels | Replace with semantic elements, add labels |
|
|
304
259
|
| Heading outline broken | Skipped heading levels | Fix hierarchy: h1 > h2 > h3 sequentially |
|
|
260
|
+
|
|
261
|
+
## References
|
|
262
|
+
|
|
263
|
+
- [Code examples](references/code-examples.md): open for the full code behind SEO Best Practices.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Semantic HTML Code Examples
|
|
2
|
+
|
|
3
|
+
Full code samples for the SKILL.md sections that link here. The rules and the decision guidance stay in SKILL.md; each heading below matches the SKILL.md section the code belongs to.
|
|
4
|
+
|
|
5
|
+
## SEO Best Practices
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<head>
|
|
9
|
+
<!-- Essential meta -->
|
|
10
|
+
<title>Primary Keyword - Brand Name</title>
|
|
11
|
+
<meta name="description" content="Compelling description with primary keywords (150-160 chars)" />
|
|
12
|
+
<meta name="robots" content="index, follow" />
|
|
13
|
+
<link rel="canonical" href="https://example.com/current-page" />
|
|
14
|
+
|
|
15
|
+
<!-- Open Graph (Facebook, LinkedIn) -->
|
|
16
|
+
<meta property="og:type" content="article" />
|
|
17
|
+
<meta property="og:title" content="Article Title" />
|
|
18
|
+
<meta property="og:description" content="Compelling description for social sharing" />
|
|
19
|
+
<meta property="og:image" content="https://example.com/og-image.jpg" />
|
|
20
|
+
<meta property="og:image:width" content="1200" />
|
|
21
|
+
<meta property="og:image:height" content="630" />
|
|
22
|
+
<meta property="og:url" content="https://example.com/article" />
|
|
23
|
+
<meta property="og:site_name" content="Site Name" />
|
|
24
|
+
|
|
25
|
+
<!-- Twitter Cards -->
|
|
26
|
+
<meta name="twitter:card" content="summary_large_image" />
|
|
27
|
+
<meta name="twitter:site" content="@sitehandle" />
|
|
28
|
+
<meta name="twitter:title" content="Article Title" />
|
|
29
|
+
<meta name="twitter:description" content="Description for Twitter" />
|
|
30
|
+
<meta name="twitter:image" content="https://example.com/twitter-card.jpg" />
|
|
31
|
+
|
|
32
|
+
<!-- Structured Data (JSON-LD) -->
|
|
33
|
+
<script type="application/ld+json">
|
|
34
|
+
{
|
|
35
|
+
"@context": "https://schema.org",
|
|
36
|
+
"@type": "Article",
|
|
37
|
+
"headline": "Article Title",
|
|
38
|
+
"author": {
|
|
39
|
+
"@type": "Person",
|
|
40
|
+
"name": "Jane Doe",
|
|
41
|
+
"url": "https://example.com/authors/jane"
|
|
42
|
+
},
|
|
43
|
+
"datePublished": "2025-01-15",
|
|
44
|
+
"dateModified": "2025-01-20",
|
|
45
|
+
"image": "https://example.com/article-image.jpg",
|
|
46
|
+
"publisher": {
|
|
47
|
+
"@type": "Organization",
|
|
48
|
+
"name": "Site Name",
|
|
49
|
+
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
</script>
|
|
53
|
+
</head>
|
|
54
|
+
```
|
|
@@ -110,26 +110,9 @@ vibrant, leverage, streamline, seamless, robust, comprehensive, innovative
|
|
|
110
110
|
| Over-hyphenation | "cross-functional, data-driven, client-facing" everywhere | Humans are inconsistent with hyphens - drop some |
|
|
111
111
|
| Authority tropes | "At its core", "The real question is" | State the point directly |
|
|
112
112
|
|
|
113
|
-
## Voice
|
|
113
|
+
## Voice
|
|
114
114
|
|
|
115
|
-
Removing AI patterns is half the job
|
|
116
|
-
|
|
117
|
-
- **Have opinions.** "I'm not sure this is the right approach" beats neutral reporting.
|
|
118
|
-
- **Vary rhythm.** Short sentences. Then longer ones that take their time. Mix it up.
|
|
119
|
-
- **Be specific.** Not "this is concerning" but "this breaks on iOS 17 when the user rotates."
|
|
120
|
-
- **Use "I" when it fits.** First person is not unprofessional.
|
|
121
|
-
- **Leave room for imperfection.** Perfect structure feels algorithmic.
|
|
122
|
-
|
|
123
|
-
## Voice Calibration
|
|
124
|
-
|
|
125
|
-
If the user provides a writing sample, match their style:
|
|
126
|
-
- Sentence length patterns
|
|
127
|
-
- Word choice level (casual vs. academic)
|
|
128
|
-
- Paragraph openings
|
|
129
|
-
- Punctuation habits
|
|
130
|
-
- Transition style
|
|
131
|
-
|
|
132
|
-
When no sample is provided, default to clear, direct, slightly opinionated.
|
|
115
|
+
Removing AI patterns is half the job; the result should have a voice. Match the user's writing sample when one is given; otherwise default to clear, direct, slightly opinionated. The voice guidelines and the calibration checklist are in [references/voice.md](references/voice.md).
|
|
133
116
|
|
|
134
117
|
## Output language
|
|
135
118
|
|
|
@@ -177,3 +160,7 @@ that exist and ask which was meant.
|
|
|
177
160
|
|
|
178
161
|
1. Rewrite the text
|
|
179
162
|
2. Brief list of what you changed and why
|
|
163
|
+
|
|
164
|
+
## References
|
|
165
|
+
|
|
166
|
+
- [Voice](references/voice.md): open when shaping the voice of a rewrite or matching a user-supplied writing sample.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Voice
|
|
2
|
+
|
|
3
|
+
What the rewrite should sound like once the AI patterns are gone, and how to match a writing sample the user supplies.
|
|
4
|
+
|
|
5
|
+
## Voice Guidelines
|
|
6
|
+
|
|
7
|
+
Removing AI patterns is half the job. The result should have a voice.
|
|
8
|
+
|
|
9
|
+
- **Have opinions.** "I'm not sure this is the right approach" beats neutral reporting.
|
|
10
|
+
- **Vary rhythm.** Short sentences. Then longer ones that take their time. Mix it up.
|
|
11
|
+
- **Be specific.** Not "this is concerning" but "this breaks on iOS 17 when the user rotates."
|
|
12
|
+
- **Use "I" when it fits.** First person is not unprofessional.
|
|
13
|
+
- **Leave room for imperfection.** Perfect structure feels algorithmic.
|
|
14
|
+
|
|
15
|
+
## Voice Calibration
|
|
16
|
+
|
|
17
|
+
If the user provides a writing sample, match their style:
|
|
18
|
+
- Sentence length patterns
|
|
19
|
+
- Word choice level (casual vs. academic)
|
|
20
|
+
- Paragraph openings
|
|
21
|
+
- Punctuation habits
|
|
22
|
+
- Transition style
|
|
23
|
+
|
|
24
|
+
When no sample is provided, default to clear, direct, slightly opinionated.
|