From db0a9fdcd9980022a1963c5c0aa01c61d044b7ab Mon Sep 17 00:00:00 2001 From: Nate Bross Date: Tue, 30 Jun 2026 09:25:25 -0500 Subject: [PATCH 01/21] feat(scripting): canonicalize script-step XML against the FileMaker reference Vendor the reverse-engineered FileMaker XML skill (v1.12) and Clockwork Inspector extracts under docs/filemaker-xml-canonical, with CC BY 4.0 attribution and a refresh script. Add a generated canonical-fixture round-trip suite (253 fixtures covering all 217 documented step ids) that pins each step's emission to the skill's paste-clean form. KnownDivergences tracks the steps still to migrate. Introduce a declarative ShapeNode model on StepMetadata.Shape plus a shape-driven renderer, parser, display renderer and validator. The shape owns the documented silent-failure-mode primitives so no migrated step can reintroduce them. Cut over the worst offenders to the shape engine: - Set Variable (canonical exemplar, no output change) - the control-flow steps, restoring / per the skill - Install OnTimer Script, fixing element order to Interval -> Script - New Window, using the NewWindowStyles value type and optional slots - Configure RAG Account, nesting fields in the wrapper - Go to Related Record, dropping the spurious element Behavioral changes are catalogued in docs/filemaker-xml-canonical/divergence-review.md for second review. --- docs/filemaker-xml-canonical/LICENSE.md | 40 + docs/filemaker-xml-canonical/README.md | 45 + .../divergence-review.md | 81 ++ .../extract-fixtures.cs | 160 ++++ .../inspector/FM_STEP_IDS.js | 222 +++++ .../inspector/extractStepText.js | 200 +++++ .../refresh-canonical.ps1 | 66 ++ .../skill/README.upstream.md | 150 ++++ docs/filemaker-xml-canonical/skill/SKILL.md | 140 +++ .../skill/references/core.md | 607 +++++++++++++ .../skill/references/custom-functions.md | 100 +++ .../references/steps-accounts-ai-misc.md | 826 ++++++++++++++++++ .../skill/references/steps-control.md | 244 ++++++ .../skill/references/steps-fields-records.md | 619 +++++++++++++ .../references/steps-navigation-editing.md | 292 +++++++ .../skill/references/steps-pdf.md | 296 +++++++ .../skill/references/steps-plugin.md | 103 +++ .../skill/references/steps-windows-files.md | 351 ++++++++ .../skill/references/worked-example.md | 203 +++++ .../Scripting/Registry/StepMetadata.cs | 15 + .../Serialization/ShapeReflection.cs | 27 + .../Serialization/StepDisplayRenderer.cs | 108 +++ .../Scripting/Serialization/StepXmlParser.cs | 163 ++++ .../Serialization/StepXmlRenderer.cs | 203 +++++ .../Serialization/StepXmlValidator.cs | 76 ++ .../Scripting/Shapes/ShapeNode.cs | 158 ++++ .../Steps/ConfigureRAGAccountStep.cs | 56 +- .../Scripting/Steps/ControlFlowSteps.cs | 142 +-- .../Scripting/Steps/GoToRelatedRecordStep.cs | 85 +- .../Steps/InstallOnTimerScriptStep.cs | 34 +- .../Scripting/Steps/NewWindowStep.cs | 174 +--- .../Scripting/Steps/SetVariableStep.cs | 53 +- .../CanonicalSkill/CanonicalSkillFixtures.cs | 79 ++ .../CanonicalSkillRoundTripTests.cs | 49 ++ .../CanonicalSkill/KnownDivergences.cs | 122 +++ .../fixtures/001-PerformScript.xml | 3 + .../fixtures/003-SaveACopyAsXML-1.xml | 3 + .../fixtures/003-SaveACopyAsXML-2.xml | 36 + .../fixtures/004-GoToNextField.xml | 1 + .../fixtures/005-GoToPreviousField.xml | 1 + .../fixtures/006-GoToLayout-1.xml | 3 + .../fixtures/006-GoToLayout-2.xml | 4 + .../fixtures/007-NewRecordRequest.xml | 1 + .../fixtures/008-DuplicateRecordRequest.xml | 1 + .../fixtures/009-DeleteRecordRequest.xml | 3 + .../fixtures/010-DeleteAllRecords.xml | 3 + .../fixtures/011-InsertFromIndex.xml | 3 + .../fixtures/012-InsertFromLastVisited.xml | 3 + .../fixtures/013-InsertCurrentDate.xml | 3 + .../fixtures/014-InsertCurrentTime.xml | 3 + .../fixtures/016-GoToRecordRequestPage.xml | 4 + .../fixtures/017-GoToField-1.xml | 3 + .../fixtures/017-GoToField-2.xml | 4 + .../fixtures/018-CheckSelection.xml | 3 + .../fixtures/019-CheckRecord.xml | 1 + .../fixtures/020-CheckFoundSet.xml | 1 + .../fixtures/021-UnsortRecords.xml | 1 + .../fixtures/022-EnterFindMode.xml | 4 + .../fixtures/023-ShowAllRecords.xml | 1 + .../fixtures/024-ModifyLastFind.xml | 1 + .../fixtures/025-OmitRecord.xml | 1 + .../fixtures/026-OmitMultipleRecords.xml | 3 + .../fixtures/027-ShowOmittedOnly.xml | 1 + .../fixtures/028-PerformFind-1.xml | 3 + .../fixtures/028-PerformFind-2.xml | 15 + .../fixtures/029-ShowHideToolbars.xml | 5 + .../CanonicalSkill/fixtures/030-ViewAs.xml | 3 + .../fixtures/031-AdjustWindow.xml | 3 + .../CanonicalSkill/fixtures/032-OpenHelp.xml | 1 + .../CanonicalSkill/fixtures/033-OpenFile.xml | 3 + .../CanonicalSkill/fixtures/034-CloseFile.xml | 1 + .../fixtures/035-ImportRecords.xml | 5 + .../fixtures/036-ExportRecords.xml | 7 + .../fixtures/037-SaveACopyAs.xml | 6 + .../fixtures/038-OpenManageDatabase.xml | 1 + .../fixtures/039-SortRecords-1.xml | 4 + .../fixtures/039-SortRecords-2.xml | 16 + .../fixtures/040-RelookupFieldContents.xml | 3 + .../fixtures/041-EnterPreviewMode.xml | 3 + .../fixtures/042-PrintSetup.xml | 4 + .../CanonicalSkill/fixtures/043-Print.xml | 4 + .../fixtures/044-ExitApplication.xml | 1 + .../CanonicalSkill/fixtures/045-UndoRedo.xml | 3 + .../CanonicalSkill/fixtures/046-Cut.xml | 3 + .../CanonicalSkill/fixtures/047-Copy.xml | 3 + .../CanonicalSkill/fixtures/048-Paste.xml | 5 + .../CanonicalSkill/fixtures/049-Clear.xml | 3 + .../CanonicalSkill/fixtures/050-SelectAll.xml | 1 + .../fixtures/051-RevertRecordRequest.xml | 3 + .../fixtures/055-EnterBrowseMode.xml | 3 + .../fixtures/056-InsertPicture.xml | 3 + .../CanonicalSkill/fixtures/057-SendEvent.xml | 4 + .../fixtures/060-InsertCurrentUserName.xml | 3 + .../fixtures/061-InsertText.xml | 3 + .../fixtures/062-PauseResumeScript.xml | 3 + .../CanonicalSkill/fixtures/063-SendMail.xml | 9 + .../fixtures/064-SendDDEExecute.xml | 3 + .../CanonicalSkill/fixtures/065-DialPhone.xml | 3 + .../CanonicalSkill/fixtures/066-Speak.xml | 3 + .../fixtures/067-PerformAppleScript.xml | 3 + .../CanonicalSkill/fixtures/068-If.xml | 4 + .../CanonicalSkill/fixtures/069-Else.xml | 3 + .../CanonicalSkill/fixtures/070-EndIf.xml | 1 + .../CanonicalSkill/fixtures/071-Loop.xml | 4 + .../fixtures/072-ExitLoopIf.xml | 3 + .../CanonicalSkill/fixtures/073-EndLoop.xml | 1 + .../fixtures/074-GoToRelatedRecord-1.xml | 10 + .../fixtures/074-GoToRelatedRecord-2.xml | 9 + .../fixtures/075-CommitRecordsRequests.xml | 5 + .../fixtures/076-SetField-1.xml | 1 + .../fixtures/076-SetField-2.xml | 4 + .../fixtures/077-InsertCalculatedResult.xml | 3 + .../fixtures/079-FreezeWindow.xml | 1 + .../fixtures/080-RefreshWindow.xml | 4 + .../fixtures/081-ScrollWindow.xml | 3 + .../CanonicalSkill/fixtures/082-NewFile.xml | 1 + .../fixtures/083-ChangePassword.xml | 3 + .../fixtures/084-SetMultiUser.xml | 3 + .../fixtures/085-AllowUserAbort.xml | 3 + .../fixtures/086-SetErrorCapture.xml | 3 + .../fixtures/087-ShowCustomDialog-1.xml | 1 + .../fixtures/087-ShowCustomDialog-2.xml | 29 + .../fixtures/087-ShowCustomDialog-3.xml | 12 + .../fixtures/087-ShowCustomDialog-4.xml | 15 + .../fixtures/088-OpenScriptWorkspace.xml | 1 + .../CanonicalSkill/fixtures/089-Comment-1.xml | 1 + .../CanonicalSkill/fixtures/089-Comment-2.xml | 3 + .../fixtures/090-HaltScript.xml | 1 + .../fixtures/091-ReplaceFieldContents.xml | 6 + .../fixtures/092-ShowHideTextRuler.xml | 3 + .../CanonicalSkill/fixtures/093-Beep.xml | 1 + .../fixtures/094-SetUseSystemFormats.xml | 3 + .../fixtures/095-RecoverFile.xml | 3 + .../fixtures/096-SaveACopyAsAddOnPackage.xml | 3 + .../fixtures/097-SetZoomLevel-1.xml | 4 + .../fixtures/097-SetZoomLevel-2.xml | 5 + .../fixtures/098-CopyAllRecordsRequests.xml | 1 + .../fixtures/099-GoToPortalRow-1.xml | 5 + .../fixtures/099-GoToPortalRow-2.xml | 6 + .../fixtures/101-CopyRecordRequest.xml | 1 + .../fixtures/102-FlushCacheToDisk.xml | 1 + .../fixtures/103-ExitScript-1.xml | 1 + .../fixtures/103-ExitScript-2.xml | 3 + .../fixtures/104-DeletePortalRow.xml | 3 + .../fixtures/105-OpenSettings.xml | 1 + .../fixtures/106-CorrectWord.xml | 1 + .../fixtures/107-SpellingOptions.xml | 1 + .../fixtures/108-SelectDictionaries.xml | 1 + .../fixtures/109-EditUserDictionary.xml | 1 + .../CanonicalSkill/fixtures/111-OpenURL.xml | 4 + .../fixtures/112-OpenManageValueLists.xml | 1 + .../fixtures/113-OpenSharing.xml | 1 + .../fixtures/114-OpenFileOptions.xml | 1 + .../fixtures/115-AllowFormattingBar.xml | 3 + .../fixtures/116-SetNextSerialValue.xml | 1 + .../fixtures/117-ExecuteSQL.xml | 3 + .../CanonicalSkill/fixtures/118-OpenHosts.xml | 1 + .../fixtures/119-MoveResizeWindow.xml | 4 + .../fixtures/120-ArrangeAllWindows.xml | 3 + .../fixtures/121-CloseWindow-1.xml | 4 + .../fixtures/121-CloseWindow-2.xml | 7 + .../fixtures/122-NewWindow-1.xml | 4 + .../fixtures/122-NewWindow-2.xml | 8 + .../fixtures/123-SelectWindow.xml | 4 + .../fixtures/124-SetWindowTitle.xml | 4 + .../CanonicalSkill/fixtures/125-ElseIf.xml | 4 + .../fixtures/126-ConstrainFoundSet-1.xml | 4 + .../fixtures/126-ConstrainFoundSet-2.xml | 12 + .../fixtures/127-ExtendFoundSet.xml | 3 + .../fixtures/128-PerformFindReplace.xml | 4 + .../fixtures/129-OpenFindReplace.xml | 1 + .../fixtures/130-SetSelection.xml | 1 + .../fixtures/131-InsertFile.xml | 8 + .../fixtures/132-ExportFieldContents.xml | 5 + .../fixtures/133-OpenRecordRequest.xml | 1 + .../fixtures/134-AddAccount.xml | 6 + .../fixtures/135-DeleteAccount.xml | 1 + .../fixtures/136-ResetAccountPassword.xml | 3 + .../fixtures/137-EnableAccount.xml | 3 + .../CanonicalSkill/fixtures/138-ReLogin-1.xml | 3 + .../CanonicalSkill/fixtures/138-ReLogin-2.xml | 9 + .../fixtures/139-ConvertFile.xml | 6 + .../fixtures/140-OpenManageDataSources.xml | 1 + .../fixtures/141-SetVariable.xml | 9 + .../fixtures/142-InstallMenuSet.xml | 4 + .../fixtures/143-SaveRecordsAsExcel.xml | 9 + .../fixtures/144-SaveRecordsAsPDF-1.xml | 28 + .../fixtures/144-SaveRecordsAsPDF-2.xml | 41 + .../fixtures/145-GoToObject-1.xml | 1 + .../fixtures/145-GoToObject-2.xml | 5 + .../fixtures/146-SetWebViewer-1.xml | 3 + .../fixtures/146-SetWebViewer-2.xml | 6 + .../fixtures/146-SetWebViewer-3.xml | 9 + .../fixtures/147-SetFieldByName.xml | 1 + .../fixtures/148-InstallOnTimerScript-1.xml | 1 + .../fixtures/148-InstallOnTimerScript-2.xml | 6 + .../fixtures/149-OpenEditSavedFinds.xml | 1 + .../fixtures/150-PerformQuickFind.xml | 1 + .../fixtures/151-OpenManageLayouts.xml | 1 + .../152-SaveRecordsAsSnapshotLink.xml | 5 + .../fixtures/154-SortRecordsByField.xml | 3 + .../fixtures/155-FindMatchingRecords.xml | 3 + .../fixtures/156-OpenManageContainers.xml | 1 + .../fixtures/157-InstallPlugInFile.xml | 1 + .../CanonicalSkill/fixtures/158-InsertPDF.xml | 3 + .../fixtures/159-InsertAudioVideo.xml | 3 + .../fixtures/160-InsertFromURL-1.xml | 6 + .../fixtures/160-InsertFromURL-2.xml | 12 + .../fixtures/161-InsertFromDevice.xml | 8 + .../fixtures/164-PerformScriptOnServer-1.xml | 4 + .../fixtures/164-PerformScriptOnServer-2.xml | 5 + .../fixtures/165-OpenManageThemes.xml | 1 + .../fixtures/166-ShowHideMenubar.xml | 4 + .../fixtures/167-RefreshObject-1.xml | 1 + .../fixtures/167-RefreshObject-2.xml | 5 + .../fixtures/168-SetLayoutObjectAnimation.xml | 3 + .../fixtures/169-ClosePopover.xml | 1 + .../fixtures/172-OpenUploadToHost.xml | 1 + .../fixtures/174-EnableTouchKeyboard.xml | 3 + .../175-PerformJavaScriptInWebViewer-1.xml | 1 + .../175-PerformJavaScriptInWebViewer-2.xml | 19 + .../fixtures/177-AVPlayerPlay.xml | 3 + .../fixtures/178-AVPlayerSetPlaybackState.xml | 3 + .../fixtures/179-AVPlayerSetOptions.xml | 1 + .../fixtures/180-RefreshPortal.xml | 1 + .../fixtures/181-GetFolderPath.xml | 3 + .../fixtures/182-TruncateTable.xml | 4 + .../fixtures/183-OpenFavorites.xml | 1 + .../185-ConfigureRegionMonitorScript.xml | 3 + .../CanonicalSkill/fixtures/186-MBS.xml | 49 ++ .../187-ConfigureLocalNotification.xml | 3 + .../fixtures/188-GetFileExists.xml | 1 + .../fixtures/189-GetFileSize.xml | 1 + .../fixtures/190-CreateDataFile.xml | 3 + .../fixtures/191-OpenDataFile.xml | 1 + .../fixtures/192-WriteToDataFile.xml | 4 + .../fixtures/193-ReadFromDataFile.xml | 3 + .../fixtures/194-GetDataFilePosition.xml | 1 + .../fixtures/195-SetDataFilePosition.xml | 1 + .../fixtures/196-CloseDataFile.xml | 1 + .../fixtures/197-DeleteFile.xml | 1 + .../fixtures/199-RenameFile.xml | 1 + .../fixtures/200-SetErrorLogging.xml | 3 + .../fixtures/201-ConfigureNFCReading.xml | 3 + .../202-ConfigureMachineLearningModel.xml | 3 + .../fixtures/203-ExecuteFileMakerDataAPI.xml | 3 + .../fixtures/205-OpenTransaction.xml | 6 + .../fixtures/206-CommitTransaction.xml | 1 + .../fixtures/207-RevertTransaction.xml | 3 + .../fixtures/208-SetSessionIdentifier.xml | 1 + .../fixtures/209-SetDictionary.xml | 3 + .../210-PerformScriptOnServerWithCallback.xml | 4 + .../fixtures/211-TriggerClarisConnectFlow.xml | 11 + .../fixtures/212-ConfigureAIAccount-1.xml | 4 + .../fixtures/212-ConfigureAIAccount-2.xml | 11 + .../fixtures/212-ConfigureAIAccount-3.xml | 15 + .../fixtures/213-FineTuneModel.xml | 8 + .../214-PerformSQLQueryByNaturalLanguage.xml | 11 + .../fixtures/215-InsertEmbedding.xml | 3 + .../216-InsertEmbeddingInFoundSet.xml | 3 + .../fixtures/217-SetAICallLogging.xml | 4 + .../fixtures/218-PerformSemanticFind.xml | 6 + .../fixtures/219-PerformRAGAction.xml | 6 + .../220-GenerateResponseFromModel.xml | 10 + .../221-PerformFindByNaturalLanguage.xml | 7 + .../fixtures/222-ConfigureRegressionModel.xml | 6 + .../223-SetRevertTransactionOnError.xml | 3 + .../fixtures/225-SaveRecordsAsJSONL.xml | 8 + .../fixtures/226-ConfigurePromptTemplate.xml | 7 + .../fixtures/227-ConfigureRAGAccount.xml | 4 + .../fixtures/228-GoToListOfRecords.xml | 5 + .../fixtures/237-FlushWebViewerCookies.xml | 1 + .../238-ConfigurePersistentData-1.xml | 3 + .../238-ConfigurePersistentData-2.xml | 10 + .../238-ConfigurePersistentData-3.xml | 7 + .../240-InsertImageCaptionsInFoundSet.xml | 3 + .../fixtures/241-InsertImageCaption.xml | 3 + .../fixtures/242-PrintPDF-1.xml | 7 + .../fixtures/242-PrintPDF-2.xml | 22 + .../fixtures/243-CreatePDF-1.xml | 22 + .../fixtures/243-CreatePDF-2.xml | 34 + .../fixtures/244-AppendPDF-1.xml | 6 + .../fixtures/244-AppendPDF-2.xml | 10 + .../fixtures/245-ClosePDF-1.xml | 8 + .../fixtures/245-ClosePDF-2.xml | 9 + .../CanonicalSkill/fixtures/246-OpenPDF-1.xml | 6 + .../CanonicalSkill/fixtures/246-OpenPDF-2.xml | 10 + .../CanonicalSkill/fixtures/247-CancelPDF.xml | 1 + .../Serialization/StepDisplayRendererTests.cs | 65 ++ .../Serialization/StepXmlParserTests.cs | 72 ++ .../Serialization/StepXmlRendererTests.cs | 89 ++ .../Serialization/StepXmlValidatorTests.cs | 72 ++ .../Steps/ConfigureRAGAccountStepTests.cs | 4 +- .../Scripting/Steps/ControlFlowStepsTests.cs | 13 +- .../Steps/GoToRelatedRecordStepTests.cs | 3 +- .../Scripting/Steps/IfStepTests.cs | 35 +- .../Steps/InstallOnTimerScriptStepTests.cs | 3 +- .../Scripting/Steps/NewWindowStepTests.cs | 6 +- tests/SharpFM.Tests/SharpFM.Tests.csproj | 7 + 299 files changed, 7508 insertions(+), 344 deletions(-) create mode 100644 docs/filemaker-xml-canonical/LICENSE.md create mode 100644 docs/filemaker-xml-canonical/README.md create mode 100644 docs/filemaker-xml-canonical/divergence-review.md create mode 100644 docs/filemaker-xml-canonical/extract-fixtures.cs create mode 100644 docs/filemaker-xml-canonical/inspector/FM_STEP_IDS.js create mode 100644 docs/filemaker-xml-canonical/inspector/extractStepText.js create mode 100644 docs/filemaker-xml-canonical/refresh-canonical.ps1 create mode 100644 docs/filemaker-xml-canonical/skill/README.upstream.md create mode 100644 docs/filemaker-xml-canonical/skill/SKILL.md create mode 100644 docs/filemaker-xml-canonical/skill/references/core.md create mode 100644 docs/filemaker-xml-canonical/skill/references/custom-functions.md create mode 100644 docs/filemaker-xml-canonical/skill/references/steps-accounts-ai-misc.md create mode 100644 docs/filemaker-xml-canonical/skill/references/steps-control.md create mode 100644 docs/filemaker-xml-canonical/skill/references/steps-fields-records.md create mode 100644 docs/filemaker-xml-canonical/skill/references/steps-navigation-editing.md create mode 100644 docs/filemaker-xml-canonical/skill/references/steps-pdf.md create mode 100644 docs/filemaker-xml-canonical/skill/references/steps-plugin.md create mode 100644 docs/filemaker-xml-canonical/skill/references/steps-windows-files.md create mode 100644 docs/filemaker-xml-canonical/skill/references/worked-example.md create mode 100644 src/SharpFM.Model/Scripting/Serialization/ShapeReflection.cs create mode 100644 src/SharpFM.Model/Scripting/Serialization/StepDisplayRenderer.cs create mode 100644 src/SharpFM.Model/Scripting/Serialization/StepXmlParser.cs create mode 100644 src/SharpFM.Model/Scripting/Serialization/StepXmlRenderer.cs create mode 100644 src/SharpFM.Model/Scripting/Serialization/StepXmlValidator.cs create mode 100644 src/SharpFM.Model/Scripting/Shapes/ShapeNode.cs create mode 100644 tests/SharpFM.Tests/CanonicalSkill/CanonicalSkillFixtures.cs create mode 100644 tests/SharpFM.Tests/CanonicalSkill/CanonicalSkillRoundTripTests.cs create mode 100644 tests/SharpFM.Tests/CanonicalSkill/KnownDivergences.cs create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/001-PerformScript.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/003-SaveACopyAsXML-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/003-SaveACopyAsXML-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/004-GoToNextField.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/005-GoToPreviousField.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/006-GoToLayout-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/006-GoToLayout-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/007-NewRecordRequest.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/008-DuplicateRecordRequest.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/009-DeleteRecordRequest.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/010-DeleteAllRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/011-InsertFromIndex.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/012-InsertFromLastVisited.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/013-InsertCurrentDate.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/014-InsertCurrentTime.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/016-GoToRecordRequestPage.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/017-GoToField-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/017-GoToField-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/018-CheckSelection.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/019-CheckRecord.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/020-CheckFoundSet.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/021-UnsortRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/022-EnterFindMode.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/023-ShowAllRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/024-ModifyLastFind.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/025-OmitRecord.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/026-OmitMultipleRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/027-ShowOmittedOnly.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/028-PerformFind-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/028-PerformFind-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/029-ShowHideToolbars.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/030-ViewAs.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/031-AdjustWindow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/032-OpenHelp.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/033-OpenFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/034-CloseFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/035-ImportRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/036-ExportRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/037-SaveACopyAs.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/038-OpenManageDatabase.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/039-SortRecords-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/039-SortRecords-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/040-RelookupFieldContents.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/041-EnterPreviewMode.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/042-PrintSetup.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/043-Print.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/044-ExitApplication.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/045-UndoRedo.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/046-Cut.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/047-Copy.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/048-Paste.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/049-Clear.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/050-SelectAll.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/051-RevertRecordRequest.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/055-EnterBrowseMode.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/056-InsertPicture.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/057-SendEvent.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/060-InsertCurrentUserName.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/061-InsertText.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/062-PauseResumeScript.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/063-SendMail.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/064-SendDDEExecute.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/065-DialPhone.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/066-Speak.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/067-PerformAppleScript.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/068-If.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/069-Else.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/070-EndIf.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/071-Loop.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/072-ExitLoopIf.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/073-EndLoop.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/074-GoToRelatedRecord-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/074-GoToRelatedRecord-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/075-CommitRecordsRequests.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/076-SetField-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/076-SetField-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/077-InsertCalculatedResult.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/079-FreezeWindow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/080-RefreshWindow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/081-ScrollWindow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/082-NewFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/083-ChangePassword.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/084-SetMultiUser.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/085-AllowUserAbort.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/086-SetErrorCapture.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/087-ShowCustomDialog-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/087-ShowCustomDialog-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/087-ShowCustomDialog-3.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/087-ShowCustomDialog-4.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/088-OpenScriptWorkspace.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/089-Comment-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/089-Comment-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/090-HaltScript.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/091-ReplaceFieldContents.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/092-ShowHideTextRuler.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/093-Beep.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/094-SetUseSystemFormats.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/095-RecoverFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/096-SaveACopyAsAddOnPackage.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/097-SetZoomLevel-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/097-SetZoomLevel-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/098-CopyAllRecordsRequests.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/099-GoToPortalRow-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/099-GoToPortalRow-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/101-CopyRecordRequest.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/102-FlushCacheToDisk.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/103-ExitScript-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/103-ExitScript-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/104-DeletePortalRow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/105-OpenSettings.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/106-CorrectWord.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/107-SpellingOptions.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/108-SelectDictionaries.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/109-EditUserDictionary.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/111-OpenURL.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/112-OpenManageValueLists.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/113-OpenSharing.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/114-OpenFileOptions.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/115-AllowFormattingBar.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/116-SetNextSerialValue.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/117-ExecuteSQL.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/118-OpenHosts.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/119-MoveResizeWindow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/120-ArrangeAllWindows.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/121-CloseWindow-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/121-CloseWindow-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/122-NewWindow-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/122-NewWindow-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/123-SelectWindow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/124-SetWindowTitle.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/125-ElseIf.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/126-ConstrainFoundSet-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/126-ConstrainFoundSet-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/127-ExtendFoundSet.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/128-PerformFindReplace.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/129-OpenFindReplace.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/130-SetSelection.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/131-InsertFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/132-ExportFieldContents.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/133-OpenRecordRequest.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/134-AddAccount.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/135-DeleteAccount.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/136-ResetAccountPassword.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/137-EnableAccount.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/138-ReLogin-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/138-ReLogin-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/139-ConvertFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/140-OpenManageDataSources.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/141-SetVariable.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/142-InstallMenuSet.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/143-SaveRecordsAsExcel.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/144-SaveRecordsAsPDF-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/144-SaveRecordsAsPDF-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/145-GoToObject-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/145-GoToObject-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/146-SetWebViewer-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/146-SetWebViewer-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/146-SetWebViewer-3.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/147-SetFieldByName.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/148-InstallOnTimerScript-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/148-InstallOnTimerScript-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/149-OpenEditSavedFinds.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/150-PerformQuickFind.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/151-OpenManageLayouts.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/152-SaveRecordsAsSnapshotLink.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/154-SortRecordsByField.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/155-FindMatchingRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/156-OpenManageContainers.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/157-InstallPlugInFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/158-InsertPDF.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/159-InsertAudioVideo.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/160-InsertFromURL-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/160-InsertFromURL-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/161-InsertFromDevice.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/164-PerformScriptOnServer-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/164-PerformScriptOnServer-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/165-OpenManageThemes.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/166-ShowHideMenubar.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/167-RefreshObject-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/167-RefreshObject-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/168-SetLayoutObjectAnimation.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/169-ClosePopover.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/172-OpenUploadToHost.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/174-EnableTouchKeyboard.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/175-PerformJavaScriptInWebViewer-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/175-PerformJavaScriptInWebViewer-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/177-AVPlayerPlay.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/178-AVPlayerSetPlaybackState.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/179-AVPlayerSetOptions.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/180-RefreshPortal.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/181-GetFolderPath.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/182-TruncateTable.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/183-OpenFavorites.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/185-ConfigureRegionMonitorScript.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/186-MBS.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/187-ConfigureLocalNotification.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/188-GetFileExists.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/189-GetFileSize.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/190-CreateDataFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/191-OpenDataFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/192-WriteToDataFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/193-ReadFromDataFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/194-GetDataFilePosition.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/195-SetDataFilePosition.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/196-CloseDataFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/197-DeleteFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/199-RenameFile.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/200-SetErrorLogging.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/201-ConfigureNFCReading.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/202-ConfigureMachineLearningModel.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/203-ExecuteFileMakerDataAPI.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/205-OpenTransaction.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/206-CommitTransaction.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/207-RevertTransaction.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/208-SetSessionIdentifier.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/209-SetDictionary.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/210-PerformScriptOnServerWithCallback.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/211-TriggerClarisConnectFlow.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/212-ConfigureAIAccount-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/212-ConfigureAIAccount-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/212-ConfigureAIAccount-3.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/213-FineTuneModel.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/214-PerformSQLQueryByNaturalLanguage.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/215-InsertEmbedding.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/216-InsertEmbeddingInFoundSet.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/217-SetAICallLogging.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/218-PerformSemanticFind.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/219-PerformRAGAction.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/220-GenerateResponseFromModel.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/221-PerformFindByNaturalLanguage.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/222-ConfigureRegressionModel.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/223-SetRevertTransactionOnError.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/225-SaveRecordsAsJSONL.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/226-ConfigurePromptTemplate.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/227-ConfigureRAGAccount.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/228-GoToListOfRecords.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/237-FlushWebViewerCookies.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/238-ConfigurePersistentData-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/238-ConfigurePersistentData-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/238-ConfigurePersistentData-3.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/240-InsertImageCaptionsInFoundSet.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/241-InsertImageCaption.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/242-PrintPDF-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/242-PrintPDF-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/243-CreatePDF-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/243-CreatePDF-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/244-AppendPDF-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/244-AppendPDF-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/245-ClosePDF-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/245-ClosePDF-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/246-OpenPDF-1.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/246-OpenPDF-2.xml create mode 100644 tests/SharpFM.Tests/CanonicalSkill/fixtures/247-CancelPDF.xml create mode 100644 tests/SharpFM.Tests/Scripting/Serialization/StepDisplayRendererTests.cs create mode 100644 tests/SharpFM.Tests/Scripting/Serialization/StepXmlParserTests.cs create mode 100644 tests/SharpFM.Tests/Scripting/Serialization/StepXmlRendererTests.cs create mode 100644 tests/SharpFM.Tests/Scripting/Serialization/StepXmlValidatorTests.cs diff --git a/docs/filemaker-xml-canonical/LICENSE.md b/docs/filemaker-xml-canonical/LICENSE.md new file mode 100644 index 0000000..9a5bc01 --- /dev/null +++ b/docs/filemaker-xml-canonical/LICENSE.md @@ -0,0 +1,40 @@ +# License — Vendored canonical FileMaker XML references + +The reference material in this directory is **not** original to SharpFM. It is +vendored, unmodified except where noted, from two open-source projects by +**Andrew Kear** of **Clockwork Creative Technology** (https://www.clockworkct.co.uk), +and is redistributed here under its original licence. + +## License: CC BY 4.0 + +Both sources are licensed under the +[Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). + +You are free to share and adapt the material for any purpose, provided you give +appropriate credit. SharpFM gives that credit here and in the `README.md` +alongside this file. + +## Attribution + +- **FileMaker XML Snippet Claude Skill** — reverse-engineered specification of + FileMaker's `fmxmlsnippet` clipboard format. + Source: https://github.com/andykear/FileMaker-XMLsnippet-Claude-Skill + Vendored version: **v1.12** (FileMaker Pro 2026 / FM 26 support). + Vendored under `skill/`. + +- **Clockwork Inspector** — open-source FileMaker DDR / database-design XML + analyzer. SharpFM vendors only two extracts: the `FM_STEP_IDS` step catalog + and the `extractStepText` display renderer, used as a cross-check catalog and + a reference for SharpFM's own step-display convention. + Source: https://github.com/andykear/FileMaker-XML-inspector-open-source + Vendored version: **v2.0**. + Vendored under `inspector/`. + +## What SharpFM uses this for + +SharpFM is an XML-faithful FileMaker clipboard editor. These references are the +authoritative description of the exact native XML FileMaker's Script Workspace +paste handler accepts cleanly, including the documented silent-failure modes. +SharpFM's step model is validated against them. No SharpFM source code is +derived from Clockwork's code; the vendored files are reference data and are +parsed at test time only. diff --git a/docs/filemaker-xml-canonical/README.md b/docs/filemaker-xml-canonical/README.md new file mode 100644 index 0000000..b659300 --- /dev/null +++ b/docs/filemaker-xml-canonical/README.md @@ -0,0 +1,45 @@ +# Canonical FileMaker XML references (vendored) + +This directory vendors the authoritative, reverse-engineered description of the +native XML FileMaker Pro's Script Workspace paste handler accepts. SharpFM's +script-step model (`src/SharpFM.Model/Scripting/`) is validated against it so +that XML written back to the clipboard round-trips through FileMaker with no +silently-dropped elements. + +See [`LICENSE.md`](LICENSE.md) for attribution. Both sources are CC BY 4.0, +authored by Andrew Kear / Clockwork Creative Technology. + +## Layout + +| Path | Source | Used for | +|------|--------|----------| +| `skill/SKILL.md`, `skill/references/*.md` | FileMaker XML Snippet Skill **v1.12** | Canonical clip-XML skeletons per step. The refresh step extracts these fenced blocks into checked-in test fixtures (under `tests/SharpFM.Tests/CanonicalSkill/fixtures/`) that the round-trip suite reads — the markdown is not parsed live at test time. **Sole source of truth for clip-XML emission.** | +| `skill/README.upstream.md` | same | The upstream project's own README, kept for provenance. | +| `inspector/FM_STEP_IDS.js` | Clockwork Inspector **v2.0** | Verbatim 217-entry `stepId → {name, category}` catalog. Used as the **working list** to align SharpFM's POCO `StepMetadata` (Id/Name/Category) and find the steps we don't yet model. Once the POCOs match it, **SharpFM's `StepMetadata` is the authoritative catalog** — this file stays only as the upstream reference for spotting drift on future FM releases. | +| `inspector/extractStepText.js` | Clockwork Inspector **v2.0** | Verbatim reference renderer for human-readable step text. Seeds SharpFM's `StepDisplayRenderer` convention. The Inspector's DDR parser is **not** reused — it targets a different XML dialect (database-design XML, not clip XML). | + +## Silent-failure modes (from `skill/references/core.md`) + +The paste handler is lenient as an XML parser but strict as a paste handler. +Structurally valid XML can paste with data silently dropped. The verified modes +SharpFM's renderer must respect: + +- **Set Variable** — the variable name must be in a `` child, present and + last. A bare `` or misplaced name pastes with no variable name. +- **Perform JavaScript in Web Viewer** — parameters use `

`; a `` element is silently dropped. +- **Install OnTimer Script** — the interval must be wrapped in ``; a bare top-level `` binds to the wrong slot and the timer never fires. + +## Refreshing + +Run [`refresh-canonical.ps1`](refresh-canonical.ps1) to re-sync both sources +from upstream. Review the diff before committing — upstream version bumps (new +FM releases) may add steps or change canonical shapes, which is exactly the +signal the audit tests are meant to surface. After refreshing, regenerate the +test fixtures from the updated skill markdown: + +``` +dotnet run --file docs/filemaker-xml-canonical/extract-fixtures.cs +``` + +This rewrites `tests/SharpFM.Tests/CanonicalSkill/fixtures/` and reports any +catalog ids left without a fixture. diff --git a/docs/filemaker-xml-canonical/divergence-review.md b/docs/filemaker-xml-canonical/divergence-review.md new file mode 100644 index 0000000..6ad8a59 --- /dev/null +++ b/docs/filemaker-xml-canonical/divergence-review.md @@ -0,0 +1,81 @@ +# Divergence review log + +Every place SharpFM's emitted XML **changed** to match the vendored skill's +canonical form during the canonicalization audit. The policy is *trust the +skill*: where our output differed, we adopt the skill's form and record the +change here for a second review. + +Each entry: the step, what we emitted **before**, what we emit **now**, the +skill section that mandates it, and a review box. Tick the box once a human has +confirmed the change is correct. + +> Status legend: `[ ]` awaiting review · `[x]` reviewed & accepted · `[!]` flagged for discussion + +## Phase 5 — worst offenders + +### Set Variable (141) — no behavioral change +- [ ] Already canonical (skill §3). Refactored to the shape-driven renderer; + emitted XML is byte-for-byte unchanged. Listed for completeness only. + +### If (68), Else If (125), Else (69) — added `` +- **Before:** `` was dropped on read and never emitted. +- **Now:** emit `` as the first child (before + `` where present). +- **Skill:** §8.1. Round-trip tested against FM Pro 2025/2026 — FileMaker *does* + write it. Supersedes the earlier `docs/advanced-filemaker-scripting-syntax.md` + note that claimed FM never emits it. +- [ ] Reviewed + +### Loop (71) — added `` and `` +- **Before:** emitted no children. +- **Now:** emit `` then ``. +- **Skill:** §8.1. +- [ ] Reviewed + +> Both values are fixed (FileMaker never varies them), so they are hidden from +> the display line and round-tripped in XML only. + +### Install OnTimer Script (148) — element order Interval → Script +- **Before:** emitted `