.claude/skills/fosmvvm-fields-generator/SKILL.md
Generate FOSMVVM Fields protocols with validation rules, FormField definitions, and localized messages. Define form contracts once, validate everywhere.
npx skillsauth add foscomputerservices/FOSUtilities fosmvvm-fields-generatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate Form Specifications following FOSMVVM patterns.
For full architecture context, see FOSMVVMArchitecture.md | OpenClaw reference
A Form Specification (implemented as a {Name}Fields protocol) is the single source of truth for user input. It answers:
The Form Specification is defined once, used everywhere:
// Same protocol adopted by different consumers:
struct CreateIdeaRequestBody: ServerRequestBody, IdeaFields { ... } // HTTP transmission
@ViewModel struct IdeaFormViewModel: IdeaFields { ... } // Form rendering
final class Idea: Model, IdeaFields { ... } // Persistence validation
This ensures:
Form Specifications integrate with:
LocalizableStringValidatableModel protocolValidatableModelfosmvvm-fluent-datamodel-generator needs form fields for a DataModelA complete Form Specification consists of 3 files:
| File | Purpose |
|------|---------|
| {Name}Fields.swift | Protocol + FormField definitions + validation methods |
| {Name}FieldsMessages.swift | @FieldValidationModel struct with @LocalizedString properties |
| {Name}FieldsMessages.yml | YAML localization (titles, placeholders, error messages) |
Replace placeholders with your project's actual paths:
| Placeholder | Description | Example |
|-------------|-------------|---------|
| {ViewModelsTarget} | Shared ViewModels SPM target | ViewModels, SharedViewModels |
| {ResourcesPath} | Localization resources path | Sources/Resources |
Expected Structure:
Sources/
{ViewModelsTarget}/
FieldModels/
{Name}Fields.swift
{Name}FieldsMessages.swift
{ResourcesPath}/
FieldModels/
{Name}FieldsMessages.yml
Invocation: /fosmvvm-fields-generator
Prerequisites:
Workflow integration: This skill is used when defining form validation and user input contracts. The skill references conversation context automatically—no file paths or Q&A needed. Often precedes fosmvvm-fluent-datamodel-generator for form-backed models.
This skill references conversation context to determine Fields protocol structure:
From conversation context, the skill identifies:
For each field from requirements:
Skill references information from:
public protocol {Name}Fields: ValidatableModel, Codable, Sendable {
var fieldName: FieldType { get set }
var {name}ValidationMessages: {Name}FieldsMessages { get }
}
static var contentField: FormField<String?> { .init(
fieldId: .init(id: "content"),
title: .localized(for: {Name}FieldsMessages.self, propertyName: "content", messageKey: "title"),
placeholder: .localized(for: {Name}FieldsMessages.self, propertyName: "content", messageKey: "placeholder"),
type: .textArea(inputType: .text),
options: [
.required(value: true)
] + FormInputOption.rangeLength(contentRange)
) }
| FormFieldType | Use Case |
|---------------|----------|
| .text(inputType:) | Single-line input |
| .textArea(inputType:) | Multi-line input |
| .checkbox | Boolean toggle |
| .select | Dropdown selection |
| .colorPicker | Color selection |
| FormInputType | Keyboard/Autofill |
|---------------|-------------------|
| .text | Default keyboard |
| .emailAddress | Email keyboard, email autofill |
| .password | Secure entry |
| .tel | Phone keyboard |
| .url | URL keyboard |
| .date, .datetimeLocal | Date picker |
| .givenName, .familyName | Name autofill |
internal func validateContent(_ fields: [FormFieldBase]?) -> [ValidationResult]? {
guard fields == nil || (fields?.contains(Self.contentField) == true) else {
return nil
}
var result = [ValidationResult]()
if content.isEmpty {
result.append(.init(
status: .error,
field: Self.contentField,
message: {name}ValidationMessages.contentRequiredMessage
))
} else if !Self.contentRange.contains(NSString(string: content).length) {
result.append(.init(
status: .error,
field: Self.contentField,
message: {name}ValidationMessages.contentOutOfRangeMessage
))
}
return result.isEmpty ? nil : result
}
@FieldValidationModel public struct {Name}FieldsMessages {
@LocalizedString("content", messageGroup: "validationMessages", messageKey: "required")
public var contentRequiredMessage
@LocalizedString("content", messageGroup: "validationMessages", messageKey: "outOfRange")
public var contentOutOfRangeMessage
}
en:
{Name}FieldsMessages:
content:
title: "Content"
placeholder: "Enter your content..."
validationMessages:
required: "Content is required"
outOfRange: "Content must be between 1 and 10,000 characters"
| Concept | Convention | Example |
|---------|------------|---------|
| Protocol | {Name}Fields | IdeaFields, CreateIdeaFields |
| Messages struct | {Name}FieldsMessages | IdeaFieldsMessages |
| Messages property | {name}ValidationMessages | ideaValidationMessages |
| Field definition | {fieldName}Field | contentField |
| Range constant | {fieldName}Range | contentRange |
| Validate method | validate{FieldName} | validateContent |
| Required message | {fieldName}RequiredMessage | contentRequiredMessage |
| OutOfRange message | {fieldName}OutOfRangeMessage | contentOutOfRangeMessage |
| Version | Date | Changes | |---------|------|---------| | 1.0 | 2024-12-24 | Initial skill | | 2.0 | 2024-12-26 | Rewritten with conceptual foundation; generalized from Kairos-specific | | 2.1 | 2026-01-24 | Update to context-aware approach (remove file-parsing/Q&A). Skill references conversation context instead of asking questions or accepting file paths. |
development
Generate new Claude Code skills following the context-aware pattern. Scaffolds SKILL.md, reference docs, and frontmatter.
testing
Generate ViewModel tests with codable round-trip, versioning stability, and multi-locale translation verification.
data-ai
Generate FOSMVVM ViewModels for SwiftUI screens, pages, and components. Scaffolds RequestableViewModel, localization bindings, and stub factories.
testing
Generate UI tests for FOSMVVM SwiftUI views using XCTest and FOSTestingUI. Covers accessibility identifiers, ViewModelOperations, and test data transport.