fosmvvm-fields-generatorGenerate FOSMVVM Fields protocols defining form fields, input types, validation rules, and localized messages for consistent, reusable form specifications.
Install via ClawdBot CLI:
clawdbot install foscomputerservices/fosmvvm-fields-generatorGenerate 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. |
AI Usage Analysis
Analysis is being generated… refresh in a few seconds.
Extract text from PDFs with OCR support. Perfect for digitizing documents, processing invoices, or analyzing content. Zero dependencies required.
Fast local PDF parsing with PyMuPDF (fitz) for Markdown/JSON outputs and optional images/tables. Use when speed matters more than robustness, or as a fallback while heavier parsers are unavailable. Default to single-PDF parsing with per-document output folders.
Find, evaluate, and recommend ClawHub skills by need with quality filtering and preference learning.
Fetch full tweets, long tweets, quoted tweets, and X Articles from X/Twitter without login or API keys, using no dependencies and zero configuration.
Skill 查找器 | Skill Finder. 帮助发现和安装 ClawHub Skills | Discover and install ClawHub Skills. 回答'有什么技能可以X'、'找一个技能' | Answers 'what skill can X', 'find a skill'. 触发...
Generate QR codes from text or URL for mobile scanning.