@polymorphism-tech/morph-spec 4.10.9 → 4.11.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 +3 -3
- package/LICENSE +71 -71
- package/README.md +5 -11
- package/bin/morph-spec.js +23 -1
- package/bin/task-manager.js +5 -5
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +2 -8
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/css-specialist.md +1 -1
- package/framework/agents/infrastructure/azure-architect.md +149 -149
- package/framework/agents/infrastructure/azure-deploy-specialist.md +4 -4
- package/framework/agents/infrastructure/infra-architect.md +48 -48
- package/framework/commands/morph-apply.md +18 -18
- package/framework/commands/morph-preflight.md +3 -3
- package/framework/commands/morph-proposal.md +15 -15
- package/framework/commands/morph-status.md +3 -3
- package/framework/commands/morph-troubleshoot.md +1 -1
- package/framework/hooks/README.md +204 -204
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +2 -2
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +1 -1
- package/framework/hooks/claude-code/teammate-idle/teammate-idle.js +3 -3
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +2 -2
- package/framework/hooks/git/pre-commit/agents.sh +1 -1
- package/framework/hooks/shared/phase-utils.js +139 -139
- package/framework/rules/csharp-standards.md +13 -13
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +16 -16
- package/framework/rules/testing-standards.md +14 -14
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +8 -8
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +3 -3
- package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +1 -1
- package/framework/skills/level-0-meta/morph-init/SKILL.md +11 -11
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +3 -3
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +1 -1
- package/framework/skills/level-0-meta/morph-simulation-checklist/SKILL.md +4 -4
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +25 -25
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +8 -8
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +7 -7
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +4 -4
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +23 -23
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +38 -0
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +29 -29
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -4
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +9 -9
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +17 -17
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +14 -0
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +12 -12
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +16 -16
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +5 -5
- package/framework/standards/STANDARDS.json +2338 -2041
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
- package/framework/standards/infrastructure/supabase/supabase-custom-jwt.md +206 -0
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/README.md +814 -814
- package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
- package/framework/templates/code/dotnet/contracts/README.md +74 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
- package/framework/templates/code/dotnet/frontend/component.razor +239 -239
- package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
- package/framework/templates/code/dotnet/jobs/job.cs +171 -171
- package/framework/templates/code/dotnet/test.cs +239 -239
- package/framework/templates/code/sql/rls-policy.sql +57 -57
- package/framework/templates/code/sql/supabase-migration.sql +100 -100
- package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
- package/framework/templates/code/typescript/contracts.ts +168 -168
- package/framework/templates/context/CONTEXT.md +181 -181
- package/framework/templates/docs/proposal.md +182 -182
- package/framework/templates/docs/user-stories.md +34 -34
- package/framework/templates/examples/design-system-examples.md +357 -357
- package/framework/templates/examples/spec-examples.md +90 -90
- package/framework/templates/feature/decisions.md +187 -187
- package/framework/templates/feature/recap.md +146 -146
- package/framework/templates/feature/tasks.md +199 -199
- package/framework/templates/infrastructure/azure/README.md +286 -286
- package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
- package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
- package/framework/workflows/README.md +18 -18
- package/framework/workflows/docs/enforcement-pipeline.md +1 -1
- package/framework/workflows/docs/full-morph.md +2 -2
- package/package.json +1 -1
- package/src/commands/agents/dispatch-agents.js +17 -0
- package/src/commands/agents/index.js +13 -13
- package/src/commands/agents/project-metrics.js +74 -0
- package/src/commands/project/doctor.js +3 -4
- package/src/commands/project/install-plugin-cmd.js +28 -28
- package/src/commands/project/setup-infra-cmd.js +12 -12
- package/src/commands/project/status.js +8 -1
- package/src/commands/scope/escalate.js +5 -3
- package/src/commands/standards/context-budget.js +89 -0
- package/src/commands/tasks/index.js +4 -4
- package/src/commands/templates/index.js +5 -5
- package/src/commands/utils/index.js +3 -3
- package/src/commands/validation/index.js +4 -4
- package/src/commands/validation/validate-feature.js +32 -3
- package/src/core/state/phase-state-machine.js +217 -217
- package/src/lib/agents/metrics-aggregator.js +56 -0
- package/src/lib/generators/design-system-generator.js +298 -298
- package/src/lib/generators/index.js +10 -10
- package/src/lib/generators/metadata-extractor.js +387 -387
- package/src/lib/stack-filter.js +65 -65
- package/src/lib/standards/digest-builder.js +57 -3
- package/src/lib/standards/index.js +7 -7
- package/src/lib/standards/standards-context-injector.js +302 -302
- package/src/lib/validators/architecture/architecture-validator.js +387 -387
- package/src/lib/validators/architecture/index.js +7 -7
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
- package/src/lib/validators/blazor/blazor-validator.js +369 -369
- package/src/lib/validators/blazor/index.js +9 -9
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/content/index.js +7 -7
- package/src/lib/validators/contracts/index.js +7 -7
- package/src/lib/validators/css/css-validator.js +352 -352
- package/src/lib/validators/css/index.js +7 -7
- package/src/lib/validators/design-system/design-system-validator.js +231 -231
- package/src/lib/validators/design-system/index.js +7 -7
- package/src/lib/validators/nextjs/index.js +6 -6
- package/src/lib/validators/nextjs/next-component-validator.js +183 -183
- package/src/lib/validators/packages/index.js +7 -7
- package/src/lib/validators/packages/package-validator.js +360 -360
- package/src/lib/validators/shared/index.js +12 -12
- package/src/lib/validators/shared/issue-counter.js +18 -18
- package/src/lib/validators/shared/result-formatter.js +124 -124
- package/src/lib/validators/ui/index.js +7 -7
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
- package/src/scripts/global-install.js +112 -58
- package/src/scripts/install-plugin.js +126 -126
- package/src/utils/claude-md-injector.js +90 -90
- package/src/utils/file-copier.js +200 -200
- package/src/utils/logger.js +32 -32
- package/src/utils/skills-installer.js +178 -178
- package/src/utils/version-checker.js +169 -175
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// CONTRACTS: {{titleCase FEATURE_NAME}}
|
|
3
|
-
// Stack: Next.js + Supabase
|
|
4
|
-
// Generated by MORPH Framework
|
|
5
|
-
// Date: {{DATE}}
|
|
6
|
-
// ============================================================
|
|
7
|
-
|
|
8
|
-
// ----- Supabase Config -----
|
|
9
|
-
|
|
10
|
-
export interface SupabaseConfig {
|
|
11
|
-
url: string;
|
|
12
|
-
anonKey: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// ----- API Client Types -----
|
|
16
|
-
|
|
17
|
-
export interface ApiClientConfig {
|
|
18
|
-
baseUrl: string;
|
|
19
|
-
getAccessToken: () => Promise<string | null>;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface ApiError {
|
|
23
|
-
message: string;
|
|
24
|
-
code: string;
|
|
25
|
-
statusCode: number;
|
|
26
|
-
details?: Record<string, string[]>;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export type ApiResult<T> =
|
|
30
|
-
| { success: true; data: T }
|
|
31
|
-
| { success: false; error: ApiError };
|
|
32
|
-
|
|
33
|
-
// ----- Pagination -----
|
|
34
|
-
|
|
35
|
-
export interface PaginationQuery {
|
|
36
|
-
page?: number;
|
|
37
|
-
pageSize?: number;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface PagedResult<T> {
|
|
41
|
-
items: T[];
|
|
42
|
-
totalCount: number;
|
|
43
|
-
page: number;
|
|
44
|
-
pageSize: number;
|
|
45
|
-
totalPages: number;
|
|
46
|
-
hasNext: boolean;
|
|
47
|
-
hasPrevious: boolean;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// ----- Supabase Client Type Aliases -----
|
|
51
|
-
// Generated by: supabase gen types typescript --project-id <id> > types/database.ts
|
|
52
|
-
|
|
53
|
-
export type Tables<T extends keyof Database["public"]["Tables"]> =
|
|
54
|
-
Database["public"]["Tables"][T]["Row"];
|
|
55
|
-
|
|
56
|
-
export type Insertable<T extends keyof Database["public"]["Tables"]> =
|
|
57
|
-
Database["public"]["Tables"][T]["Insert"];
|
|
58
|
-
|
|
59
|
-
export type Updatable<T extends keyof Database["public"]["Tables"]> =
|
|
60
|
-
Database["public"]["Tables"][T]["Update"];
|
|
61
|
-
|
|
62
|
-
// ----- Database Schema (placeholder - replace with generated types) -----
|
|
63
|
-
|
|
64
|
-
export interface Database {
|
|
65
|
-
public: {
|
|
66
|
-
Tables: {
|
|
67
|
-
{{FEATURE_NAME}}: {
|
|
68
|
-
Row: {
|
|
69
|
-
id: string;
|
|
70
|
-
name: string;
|
|
71
|
-
user_id: string;
|
|
72
|
-
status: {{pascalCase FEATURE_NAME}}Status;
|
|
73
|
-
created_at: string;
|
|
74
|
-
updated_at: string | null;
|
|
75
|
-
};
|
|
76
|
-
Insert: {
|
|
77
|
-
id?: string;
|
|
78
|
-
name: string;
|
|
79
|
-
user_id?: string;
|
|
80
|
-
status?: {{pascalCase FEATURE_NAME}}Status;
|
|
81
|
-
created_at?: string;
|
|
82
|
-
updated_at?: string | null;
|
|
83
|
-
};
|
|
84
|
-
Update: {
|
|
85
|
-
id?: string;
|
|
86
|
-
name?: string;
|
|
87
|
-
user_id?: string;
|
|
88
|
-
status?: {{pascalCase FEATURE_NAME}}Status;
|
|
89
|
-
created_at?: string;
|
|
90
|
-
updated_at?: string | null;
|
|
91
|
-
};
|
|
92
|
-
};
|
|
93
|
-
};
|
|
94
|
-
Views: Record<string, never>;
|
|
95
|
-
Functions: Record<string, never>;
|
|
96
|
-
Enums: {
|
|
97
|
-
{{FEATURE_NAME}}_status: {{pascalCase FEATURE_NAME}}Status;
|
|
98
|
-
};
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// ----- Feature Types -----
|
|
103
|
-
|
|
104
|
-
export type {{pascalCase FEATURE_NAME}}Status =
|
|
105
|
-
| "draft"
|
|
106
|
-
| "active"
|
|
107
|
-
| "completed"
|
|
108
|
-
| "archived"
|
|
109
|
-
| "failed"
|
|
110
|
-
| "cancelled";
|
|
111
|
-
|
|
112
|
-
export interface {{pascalCase FEATURE_NAME}} {
|
|
113
|
-
id: string;
|
|
114
|
-
name: string;
|
|
115
|
-
userId: string;
|
|
116
|
-
status: {{pascalCase FEATURE_NAME}}Status;
|
|
117
|
-
createdAt: string;
|
|
118
|
-
updatedAt: string | null;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export interface Create{{pascalCase FEATURE_NAME}}Input {
|
|
122
|
-
name: string;
|
|
123
|
-
// Add other required fields
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export interface Update{{pascalCase FEATURE_NAME}}Input {
|
|
127
|
-
name?: string;
|
|
128
|
-
// Add other updatable fields
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// ----- Storage Types -----
|
|
132
|
-
|
|
133
|
-
export interface StorageUpload {
|
|
134
|
-
bucket: string;
|
|
135
|
-
path: string;
|
|
136
|
-
file: File;
|
|
137
|
-
contentType?: string;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export interface StorageFile {
|
|
141
|
-
id: string;
|
|
142
|
-
name: string;
|
|
143
|
-
bucket: string;
|
|
144
|
-
path: string;
|
|
145
|
-
publicUrl: string;
|
|
146
|
-
size: number;
|
|
147
|
-
contentType: string;
|
|
148
|
-
createdAt: string;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// ----- Auth Types -----
|
|
152
|
-
|
|
153
|
-
export interface AuthUser {
|
|
154
|
-
id: string;
|
|
155
|
-
email: string;
|
|
156
|
-
displayName: string | null;
|
|
157
|
-
avatarUrl: string | null;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export interface AuthSession {
|
|
161
|
-
user: AuthUser;
|
|
162
|
-
accessToken: string;
|
|
163
|
-
expiresAt: number;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// ----- Form Schemas (use with zod) -----
|
|
167
|
-
// Define zod schemas in component files, not here.
|
|
168
|
-
// This file is for type definitions only.
|
|
1
|
+
// ============================================================
|
|
2
|
+
// CONTRACTS: {{titleCase FEATURE_NAME}}
|
|
3
|
+
// Stack: Next.js + Supabase
|
|
4
|
+
// Generated by MORPH Framework
|
|
5
|
+
// Date: {{DATE}}
|
|
6
|
+
// ============================================================
|
|
7
|
+
|
|
8
|
+
// ----- Supabase Config -----
|
|
9
|
+
|
|
10
|
+
export interface SupabaseConfig {
|
|
11
|
+
url: string;
|
|
12
|
+
anonKey: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// ----- API Client Types -----
|
|
16
|
+
|
|
17
|
+
export interface ApiClientConfig {
|
|
18
|
+
baseUrl: string;
|
|
19
|
+
getAccessToken: () => Promise<string | null>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ApiError {
|
|
23
|
+
message: string;
|
|
24
|
+
code: string;
|
|
25
|
+
statusCode: number;
|
|
26
|
+
details?: Record<string, string[]>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type ApiResult<T> =
|
|
30
|
+
| { success: true; data: T }
|
|
31
|
+
| { success: false; error: ApiError };
|
|
32
|
+
|
|
33
|
+
// ----- Pagination -----
|
|
34
|
+
|
|
35
|
+
export interface PaginationQuery {
|
|
36
|
+
page?: number;
|
|
37
|
+
pageSize?: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface PagedResult<T> {
|
|
41
|
+
items: T[];
|
|
42
|
+
totalCount: number;
|
|
43
|
+
page: number;
|
|
44
|
+
pageSize: number;
|
|
45
|
+
totalPages: number;
|
|
46
|
+
hasNext: boolean;
|
|
47
|
+
hasPrevious: boolean;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ----- Supabase Client Type Aliases -----
|
|
51
|
+
// Generated by: supabase gen types typescript --project-id <id> > types/database.ts
|
|
52
|
+
|
|
53
|
+
export type Tables<T extends keyof Database["public"]["Tables"]> =
|
|
54
|
+
Database["public"]["Tables"][T]["Row"];
|
|
55
|
+
|
|
56
|
+
export type Insertable<T extends keyof Database["public"]["Tables"]> =
|
|
57
|
+
Database["public"]["Tables"][T]["Insert"];
|
|
58
|
+
|
|
59
|
+
export type Updatable<T extends keyof Database["public"]["Tables"]> =
|
|
60
|
+
Database["public"]["Tables"][T]["Update"];
|
|
61
|
+
|
|
62
|
+
// ----- Database Schema (placeholder - replace with generated types) -----
|
|
63
|
+
|
|
64
|
+
export interface Database {
|
|
65
|
+
public: {
|
|
66
|
+
Tables: {
|
|
67
|
+
{{FEATURE_NAME}}: {
|
|
68
|
+
Row: {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
user_id: string;
|
|
72
|
+
status: {{pascalCase FEATURE_NAME}}Status;
|
|
73
|
+
created_at: string;
|
|
74
|
+
updated_at: string | null;
|
|
75
|
+
};
|
|
76
|
+
Insert: {
|
|
77
|
+
id?: string;
|
|
78
|
+
name: string;
|
|
79
|
+
user_id?: string;
|
|
80
|
+
status?: {{pascalCase FEATURE_NAME}}Status;
|
|
81
|
+
created_at?: string;
|
|
82
|
+
updated_at?: string | null;
|
|
83
|
+
};
|
|
84
|
+
Update: {
|
|
85
|
+
id?: string;
|
|
86
|
+
name?: string;
|
|
87
|
+
user_id?: string;
|
|
88
|
+
status?: {{pascalCase FEATURE_NAME}}Status;
|
|
89
|
+
created_at?: string;
|
|
90
|
+
updated_at?: string | null;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
Views: Record<string, never>;
|
|
95
|
+
Functions: Record<string, never>;
|
|
96
|
+
Enums: {
|
|
97
|
+
{{FEATURE_NAME}}_status: {{pascalCase FEATURE_NAME}}Status;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ----- Feature Types -----
|
|
103
|
+
|
|
104
|
+
export type {{pascalCase FEATURE_NAME}}Status =
|
|
105
|
+
| "draft"
|
|
106
|
+
| "active"
|
|
107
|
+
| "completed"
|
|
108
|
+
| "archived"
|
|
109
|
+
| "failed"
|
|
110
|
+
| "cancelled";
|
|
111
|
+
|
|
112
|
+
export interface {{pascalCase FEATURE_NAME}} {
|
|
113
|
+
id: string;
|
|
114
|
+
name: string;
|
|
115
|
+
userId: string;
|
|
116
|
+
status: {{pascalCase FEATURE_NAME}}Status;
|
|
117
|
+
createdAt: string;
|
|
118
|
+
updatedAt: string | null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface Create{{pascalCase FEATURE_NAME}}Input {
|
|
122
|
+
name: string;
|
|
123
|
+
// Add other required fields
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface Update{{pascalCase FEATURE_NAME}}Input {
|
|
127
|
+
name?: string;
|
|
128
|
+
// Add other updatable fields
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ----- Storage Types -----
|
|
132
|
+
|
|
133
|
+
export interface StorageUpload {
|
|
134
|
+
bucket: string;
|
|
135
|
+
path: string;
|
|
136
|
+
file: File;
|
|
137
|
+
contentType?: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface StorageFile {
|
|
141
|
+
id: string;
|
|
142
|
+
name: string;
|
|
143
|
+
bucket: string;
|
|
144
|
+
path: string;
|
|
145
|
+
publicUrl: string;
|
|
146
|
+
size: number;
|
|
147
|
+
contentType: string;
|
|
148
|
+
createdAt: string;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ----- Auth Types -----
|
|
152
|
+
|
|
153
|
+
export interface AuthUser {
|
|
154
|
+
id: string;
|
|
155
|
+
email: string;
|
|
156
|
+
displayName: string | null;
|
|
157
|
+
avatarUrl: string | null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export interface AuthSession {
|
|
161
|
+
user: AuthUser;
|
|
162
|
+
accessToken: string;
|
|
163
|
+
expiresAt: number;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ----- Form Schemas (use with zod) -----
|
|
167
|
+
// Define zod schemas in component files, not here.
|
|
168
|
+
// This file is for type definitions only.
|