.cursor/skills/data-seed/SKILL.md
Generate realistic seed or test data and load it into a live FileMaker solution via OData. Populates tables with contextually appropriate data while respecting referential integrity. Use when the developer asks to "seed data", "test data", "populate solution", "generate records", or wants sample records in a new or existing schema.
npx skillsauth add petrowsky/agentic-fm data-seedInstall 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 realistic seed/test data and load it into a live FileMaker solution via OData POST requests. Useful for populating a new schema before scripts and layouts are built, or for creating test datasets in an existing solution.
Read agent/config/automation.json and identify the target solution:
agent/CONTEXT.json exists, read CONTEXT.json["solution"] to get the solution name.automation.json["solutions"][solution_name]["odata"] for the OData credentials and base URL.odata block exists for the solution, stop and inform the developer:OData is not configured for this solution. Add an
odatablock toagent/config/automation.jsonundersolutions.{solution name}withbase_url,database,username,password, andscript_bridge. SeeCLAUDE.mdfor the structure.
Use the following sources in order of preference to understand the solution's tables, fields, and relationships:
agent/CONTEXT.json for tables (fields with types), relationships (join fields, cascade settings).agent/context/{solution}/fields.index -- all fields across all tablesagent/context/{solution}/relationships.index -- full relationship graphagent/context/{solution}/table_occurrences.index -- TO-to-base-table mapping$metadata (fallback)If index files are not available, fetch the schema from OData:
GET {odata.base_url}/{odata.database}/$metadata
Authorization: Basic <base64(username:password)>
Parse EntityType elements for field names and types. Parse NavigationProperty for relationships.
If neither source is available, ask the developer to describe the tables and fields, or to run Explode XML or Push Context first.
For each table that will be seeded, classify every field:
| Category | Action | |----------|--------| | Auto-enter serial / UUID / PrimaryKey | Skip -- FileMaker auto-generates these | | ForeignKey fields | Populate with valid PrimaryKey values from the parent table (requires parent records to exist first) | | Global fields | Skip -- read-only via OData | | Container fields | Skip -- binary data cannot be sent via OData | | Calculation fields | Skip -- read-only, computed by FM engine | | Summary fields | Skip -- read-only, computed by FM engine | | CreationTimestamp / ModificationTimestamp | Skip -- auto-enter by FM | | CreatedBy / ModifiedBy | Skip -- auto-enter by FM | | All other fields | Generate appropriate data |
Match field names (case-insensitive) to realistic data patterns:
| Field name pattern | Data type | Example values |
|-------------------|-----------|----------------|
| *Name*, *FirstName* | Text | "Sarah", "James", "Maria" |
| *LastName*, *Surname* | Text | "Chen", "Rodriguez", "Okafor" |
| *Company*, *Organization* | Text | "Meridian Systems", "Atlas Corp" |
| *Email* | Text | "[email protected]" |
| *Phone*, *Mobile*, *Fax* | Text | "555-0142", "(212) 555-0198" |
| *Address*, *Street* | Text | "742 Maple Avenue" |
| *City* | Text | "Portland", "Austin", "Denver" |
| *State* | Text | "OR", "TX", "CO" |
| *Zip*, *PostalCode* | Text | "97201", "73301" |
| *Country* | Text | "United States", "Canada" |
| *Date*, *DateDue*, *DateStart* | Date | "01/15/2025" (MM/DD/YYYY for OData) |
| *Status* | Text | Context-dependent: "Active", "Pending", "Complete" |
| *Amount*, *Price*, *Cost*, *Total* | Number | 29.99, 150.00, 1250.50 |
| *Qty*, *Quantity* | Number | 1, 5, 12, 100 |
| *Rate*, *Percentage* | Number | 0.15, 8.5, 12.0 |
| *Description*, *Notes*, *Comment* | Text | Contextually appropriate sentences |
| *URL*, *Website* | Text | "https://www.example.com" |
| *Boolean*, *Flag*, *Is*, *Active* | Number | 0 or 1 |
For fields that do not match any pattern, use the FM field type:
Generate varied, realistic data -- avoid repeating the same values across records. Use diverse names spanning multiple cultures. Vary numeric values realistically (not all the same price, not all the same quantity).
Build a dependency graph from the relationships:
Example order for a typical solution:
1. Clients (no FK dependencies)
2. Products (no FK dependencies)
3. Staff (no FK dependencies)
4. Invoices (depends on Clients, Staff)
5. Line Items (depends on Invoices, Products)
IMPORTANT: Always confirm before creating any records.
Present the seed plan:
Seed plan for {Solution Name}
| Order | Table | Records | Dependencies | |-------|-------|---------|--------------| | 1 | Clients | 10 | -- | | 2 | Products | 15 | -- | | 3 | Invoices | 25 | Clients | | 4 | Line Items | 75 | Invoices, Products |
Skipped fields: PrimaryKey (auto-enter), CreationTimestamp, ModificationTimestamp, CreatedBy, ModifiedBy, all globals, all containers, all calculations
Shall I proceed?
If the developer has specified volume (e.g., "10 clients, 50 invoices"), use those numbers. Otherwise, suggest reasonable defaults and ask for confirmation.
Create records one at a time via OData POST. The OData endpoint for creating records:
POST {odata.base_url}/{odata.database}/{TableOccurrenceName}
Authorization: Basic <base64(username:password)>
Content-Type: application/json
{
"FieldName1": "value1",
"FieldName2": 42,
"FieldName3": "01/15/2025"
}
Important OData details:
$metadata EntitySet names if unsure.For each table in topological order:
Present a summary:
Seed complete for {Solution Name}
| Table | Requested | Created | Failed | |-------|-----------|---------|--------| | Clients | 10 | 10 | 0 | | Products | 15 | 15 | 0 | | Invoices | 25 | 24 | 1 | | Line Items | 75 | 73 | 2 |
Total: 122/125 records created
Errors (3):
- Invoices record 18: 400 Bad Request -- "Field 'Status' validation failed"
- Line Items record 41: 500 Server Error -- "Field not modifiable"
- Line Items record 62: 500 Server Error -- "Field not modifiable"
value_lists, use those values for fields that reference them (e.g., Status fields should use values from the Status value list, not arbitrary strings).DefaultCurrency, DefaultCountry), use those known values rather than generating arbitrary ones.$metadata but are read-only. Filter them out before generating POST bodies.User: "Seed the solution with 10 clients, 30 invoices, and 100 line items"
$metadata or read index files for schemaUser: "Generate test data for this solution"
odata blockodata block to automation.json for this solution to enable data seeding."User: "Seed 5 clients"
{base_url}/{database}/Clients?$top=1 -- returns a recorddevelopment
Generate a complete web application inside a FileMaker Web Viewer — self-contained HTML/CSS/JS styled with the FM theme, plus companion FM bridge scripts for bidirectional data flow. Use when the developer says "web viewer", "webviewer app", "HTML in FileMaker", "build web viewer", or when the layout-design skill delegates to the web-first output path. Recommended for modern, responsive UI, complex interactions (drag-and-drop, charts, rich text), or solutions considering future migration off FileMaker.
development
Trace references to a FileMaker object across the entire solution. Supports usage reports ("where is this field used?"), impact analysis ("what breaks if I rename this?"), and dead object scans ("show unused fields/scripts"). Use when the developer says "trace", "find references", "where is X used", "impact of renaming", "unused fields/scripts", "dead code", "what references X", or "is X used anywhere".
development
Analyze a FileMaker solution and produce a structured profile covering data model, business logic, UI layer, integrations, and health metrics. Uses on-disk pre-processing to handle solutions of any size without sending raw XML through the agent. Use when the developer says "analyze solution", "solution overview", "solution analysis", "solution profile", "solution spec", "what does this solution do", "solution summary", or wants a high-level understanding of an entire FileMaker solution.
development
Interactive setup wizard for agentic-fm. Detects what's already configured, walks the user through each remaining step, and verifies completion before proceeding. Use when the developer says "help me set up", "setup", "get started", "onboard", "first time setup", "install agentic-fm", "configure agentic-fm", or is clearly new to the project and needs guidance.