.cursor/skills/menu-lookup/SKILL.md
Locate a specific FileMaker custom menu or menu set in `agent/xml_parsed/custom_menus/` or `agent/xml_parsed/custom_menu_sets/`. Extracts the real UUIDs required before creating or modifying any menu XML. Use when the user asks to create, modify, review, or look up a custom menu or menu set by name or ID.
npx skillsauth add petrowsky/agentic-fm menu-lookupInstall 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.
Locate a FileMaker custom menu or menu set in the parsed XML export and extract the critical UUIDs required before any menu XML can be created or modified. Without the correct UUIDs, FileMaker silently ignores paste operations.
Resolves using either:
- ID {N}.xml or menu set's <CustomMenuReference id="N">)Performance target: 3 tool calls for unambiguous lookups (discover + read + confirm), 4 for ambiguous.
Run these in parallel (single message, multiple tool calls):
Tool call A — List all menu files:
ls "agent/xml_parsed/custom_menus/"*/ "agent/xml_parsed/custom_menu_sets/"*/ 2>/dev/null
This returns every menu and menu set file across all solutions in one call. The output groups by directory — solution names appear as path prefixes. If no directories exist or the output is empty, report that menus haven't been exported and stop.
Tool call B — List sandbox:
ls agent/sandbox/
Check for any in-progress menu XML.
From the Step 1A file listing:
Multi-solution handling: If files appear under multiple solution subfolders, check whether the user mentioned a solution name or whether CONTEXT.json identifies one. If still ambiguous, use AskUserQuestion to disambiguate before proceeding.
Determine menu type: Infer from the user's request whether the target is a CustomMenu (individual menu, in custom_menus/) or CustomMenuSet (container assigned to a layout, in custom_menu_sets/). If unclear, search both — filenames are distinct between the two directories.
Match against the file listing using this priority (stop at first high-confidence match):
- ID {N}.xmlIf the match is ambiguous (multiple plausible candidates, no clear best), use AskUserQuestion to present candidates and ask which menu to work with.
Once matched, derive the full path from the directory listing. Menu filenames follow the pattern {MenuName} - ID {N}.xml.
Read the matched file to extract UUIDs. If a sandbox match also exists (from Step 1B, matched by name), note it in the report.
Present the report and confirm in one response:
Selected menu
{menu name}{id}Paths found
{path in xml_parsed/custom_menus/ or custom_menu_sets/, or "not found"}{path in agent/sandbox/, or "not found"}Extracted UUIDs
{UUID}{UUID}{N from MenuItemList membercount}Alternates (if any)
Then use AskUserQuestion: "Is this the correct menu? -- {Menu Name} (ID: {id}) in {solution}"
yes -- "Yes, proceed" / no -- "No, let me clarify"FileMaker uses UUIDs to match pasted XML against existing objects in the solution. If either UUID is wrong or made up, the paste silently does nothing.
| UUID | Location in XML | Purpose |
|---|---|---|
| CustomMenuCatalog UUID | <CustomMenuCatalog> > <UUID> | Identifies the solution's menu catalog |
| CustomMenu UUID | <CustomMenu> > <UUID> | Identifies the specific menu to update |
| CustomMenuSetCatalog UUID | <CustomMenuSetCatalog> > <UUID> | Identifies the solution's menu set catalog |
| CustomMenuSet UUID | <CustomMenuSet> > <UUID> | Identifies the specific menu set to update |
Always read these directly from xml_parsed/ -- never invent them.
Once confirmed:
xml_parsed/custom_menus/ as the base -- copy to agent/sandbox/ if not already there.agent/docs/CUSTOM_MENUS.md.CustomMenuCatalog UUID and CustomMenu UUID from the original -- do not regenerate them.python3 agent/scripts/clipboard.py write agent/sandbox/<menu>.xml<CustomMenuItem> elements using the patterns in agent/docs/CUSTOM_MENUS.md.CustomMenuItem UUID and hash values can be placeholder -- FileMaker reassigns on paste.MenuItemList membercount to match the new total.The xml_parsed/ export for this menu won't exist yet. The correct workflow is:
python3 agent/scripts/clipboard.py read agent/sandbox/<menu>-original.xmlagent/docs/CUSTOM_MENUS.md.Full XML patterns, shortcut modifier values, <Override> rules, <Base> element behavior, and the ut16 clipboard format are documented in:
agent/docs/CUSTOM_MENUS.md
User: "Add a Sort Lines item to the Format menu"
Step 1 (parallel):
ls "agent/xml_parsed/custom_menus/"*/ "agent/xml_parsed/custom_menu_sets/"*/ 2>/dev/null -- shows files under Invoice Solution/ onlyls agent/sandbox/ -- no existing menu XMLStep 2:
agent/xml_parsed/custom_menus/Invoice Solution/agentic-fm — Format - ID 40.xml -- extract UUIDsStep 3: Report + confirm -- "Is this the correct menu? -- agentic-fm -- Format (ID: 40) in Invoice Solution"
On confirmation: add the new <CustomMenuItem> block, write to clipboard.
Tool calls: 3 (2 parallel discover + 1 read + confirm in same response)
User: "Look up the Format menu"
Step 1 (parallel):
Invoice Solution/ and agentic-fm/Step 1.5: AskUserQuestion: "Multiple solution files found: Invoice Solution, agentic-fm -- which are you working with?"
Step 2: User selects -- read the matched file, extract UUIDs.
Step 3: Report + confirm.
Tool calls: 4 (2 parallel + 1 ask + 1 read)
User: "Open the Format menu"
Step 1 (parallel):
Step 1.5: AskUserQuestion: "Multiple Format menus found -- which one? agentic-fm -- Format (ID 40) / Format 2 (ID 34) / Format 3 (ID 37)"
Step 2: User selects -- read file, extract UUIDs.
Step 3: Report + confirm.
Tool calls: 4 (2 parallel + 1 ask + 1 read)
User: "Create a View menu"
Step 1 (parallel):
Step 2: Report that the menu hasn't been exported yet. Instruct: create the empty menu in FileMaker, copy it, then run clipboard.py read to capture the real UUIDs before generation begins.
Tool calls: 2 (2 parallel discover -- done)
development
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.