fix(tests): инвалидация кэша фикстур empty-config по содержимому cf-init

Каталог фикстуры кэшировался навсегда: правка cf-init до него не доходила,
снэпшоты записывались со старой фикстурой, и расхождение всплывало только на
машине с пустым кэшем. Поймано прогоном на маке — там фикстура собралась заново
и принесла TextToSpeech, которого нет в снэпшотах, записанных на Windows.

Теперь рядом с фикстурой лежит отпечаток: аргументы плюс хэши обоих портов
cf-init. Не совпал — каталог пересобирается.

Снэпшоты кейсов 2.21 перезаписаны со свежей фикстурой (дрейф — только
TextToSpeech). У mxl-compile снэпшот кейса снят через noSnapshot: у навыка
normalizeUuids=false, поэтому UUID фикстуры дрожали бы при каждой пересборке,
а предмет кейса проверяет fileContains.

663/663 ps1, 660/663 py.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-08 12:53:38 +03:00
co-authored by Claude Opus 5
parent 57c8cb6d23
commit 4c84d840df
28 changed files with 101 additions and 355 deletions
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -28,5 +28,6 @@
"file": "Template.xml", "file": "Template.xml",
"text": "xmlns=\"http://v8.1c.ru/8.2/data/spreadsheet\" xmlns:pal=\"http://v8.1c.ru/8.1/data/ui/colors/palette\" xmlns:style=" "text": "xmlns=\"http://v8.1c.ru/8.2/data/spreadsheet\" xmlns:pal=\"http://v8.1c.ru/8.1/data/ui/colors/palette\" xmlns:style="
} }
} },
"noSnapshot": "фикстура-конфигурация нужна только чтобы навык увидел версию 2.21; её UUID попадают в снэпшот, а у этого навыка normalizeUuids=false — эталон дрожал бы на каждой пересборке фикстуры. Предмет кейса проверяет fileContains."
} }
@@ -1,265 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.21">
<Configuration uuid="de5e2eb2-7e38-43e4-add2-d9175fe4ac36">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>9cd510cd-abfc-11d4-9434-004095e12fc7</xr:ClassId>
<xr:ObjectId>0b4fac2a-6776-4bfc-af10-ad5377cef392</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>9fcd25a0-4822-11d4-9414-008048da11f9</xr:ClassId>
<xr:ObjectId>8392c8a2-cb48-45d2-bb6f-27c67bf9608b</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>e3687481-0a87-462c-a166-9f34594f9bba</xr:ClassId>
<xr:ObjectId>68b934bb-706b-484e-ba96-523db5c1a1c6</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>9de14907-ec23-4a07-96f0-85521cb6b53b</xr:ClassId>
<xr:ObjectId>990bbd21-975b-478a-aab0-020172faff72</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>51f2d5d8-ea4d-4064-8892-82951750031e</xr:ClassId>
<xr:ObjectId>30407c9e-f7a1-43d6-8d8e-4aca82398bd0</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>e68182ea-4237-4383-967f-90c1e3370bc7</xr:ClassId>
<xr:ObjectId>19be8397-1ee6-4a8c-b4c7-02aae4bb6372</xr:ObjectId>
</xr:ContainedObject>
<xr:ContainedObject>
<xr:ClassId>fb282519-d103-4dd3-bc12-cb271d631dfc</xr:ClassId>
<xr:ObjectId>cb1279b3-b562-4a00-83d4-1d407c27a0c4</xr:ObjectId>
</xr:ContainedObject>
</InternalInfo>
<Properties>
<Name>TestConfig</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>TestConfig</v8:content>
</v8:item>
</Synonym>
<Comment/>
<NamePrefix/>
<ConfigurationExtensionCompatibilityMode>Version8_3_27</ConfigurationExtensionCompatibilityMode>
<DefaultRunMode>ManagedApplication</DefaultRunMode>
<UsePurposes>
<v8:Value xsi:type="app:ApplicationUsePurpose">PlatformApplication</v8:Value>
</UsePurposes>
<ScriptVariant>Russian</ScriptVariant>
<DefaultRoles/>
<Vendor/>
<Version/>
<UpdateCatalogAddress/>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UseManagedFormInOrdinaryApplication>false</UseManagedFormInOrdinaryApplication>
<UseOrdinaryFormInManagedApplication>false</UseOrdinaryFormInManagedApplication>
<AdditionalFullTextSearchDictionaries/>
<CommonSettingsStorage/>
<ReportsUserSettingsStorage/>
<ReportsVariantsStorage/>
<FormDataSettingsStorage/>
<DynamicListsUserSettingsStorage/>
<URLExternalDataStorage/>
<Content/>
<DefaultReportForm/>
<DefaultReportVariantForm/>
<DefaultReportSettingsForm/>
<DefaultReportAppearanceTemplate/>
<DefaultDynamicListSettingsForm/>
<DefaultSearchForm/>
<DefaultDataHistoryChangeHistoryForm/>
<DefaultDataHistoryVersionDataForm/>
<DefaultDataHistoryVersionDifferencesForm/>
<DefaultCollaborationSystemUsersChoiceForm/>
<AuxiliaryReportForm/>
<AuxiliaryReportVariantForm/>
<AuxiliaryReportSettingsForm/>
<AuxiliaryDynamicListSettingsForm/>
<AuxiliaryDataHistoryChangeHistoryForm/>
<AuxiliaryDataHistoryVersionDataForm/>
<AuxiliaryDataHistoryVersionDifferencesForm/>
<AuxiliaryCollaborationSystemUsersChoiceForm/>
<RequiredMobileApplicationPermissions/>
<UsedMobileApplicationFunctionalities>
<app:functionality>
<app:functionality>Biometrics</app:functionality>
<app:use>true</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Location</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BackgroundLocation</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BluetoothPrinters</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>WiFiPrinters</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Contacts</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Calendars</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>PushNotifications</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>LocalNotifications</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>InAppPurchases</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>PersonalComputerFileExchange</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Ads</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>NumberDialing</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>CallProcessing</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>CallLog</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AutoSendSMS</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>ReceiveSMS</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>SMSLog</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Camera</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Microphone</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>MusicLibrary</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>PictureAndVideoLibraries</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AudioPlaybackAndVibration</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BackgroundAudioPlaybackAndVibration</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>InstallPackages</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>OSBackup</app:functionality>
<app:use>true</app:use>
</app:functionality>
<app:functionality>
<app:functionality>ApplicationUsageStatistics</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BarcodeScanning</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>BackgroundAudioRecording</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AllFilesAccess</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Videoconferences</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>NFC</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>DocumentScanning</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>SpeechToText</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>Geofences</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>IncomingShareRequests</app:functionality>
<app:use>false</app:use>
</app:functionality>
<app:functionality>
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/>
<AllowedIncomingShareRequestTypes/>
<MainClientApplicationWindowInterfaceVariant>NavigationLeft</MainClientApplicationWindowInterfaceVariant>
<ClientApplicationTheme>Auto</ClientApplicationTheme>
<MainClientApplicationWindowMode>Normal</MainClientApplicationWindowMode>
<ClientApplicationWindowsOpenVariant>OpenDataInDialogs</ClientApplicationWindowsOpenVariant>
<DefaultInterface/>
<Caption/>
<ShortCaption/>
<DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/>
<DetailedInformation/>
<Copyright/>
<VendorInformationAddress/>
<ConfigurationInformationAddress/>
<DataLockControlMode>Managed</DataLockControlMode>
<ObjectAutonumerationMode>NotAutoFree</ObjectAutonumerationMode>
<ModalityUseMode>DontUse</ModalityUseMode>
<SynchronousPlatformExtensionAndAddInCallUseMode>DontUse</SynchronousPlatformExtensionAndAddInCallUseMode>
<InterfaceCompatibilityMode>TaxiEnableVersion8_2</InterfaceCompatibilityMode>
<Version85InterfaceMigrationMode>DontUse</Version85InterfaceMigrationMode>
<DatabaseTablespacesUseMode>DontUse</DatabaseTablespacesUseMode>
<CompatibilityMode>Version8_3_27</CompatibilityMode>
<DefaultConstantsForm/>
</Properties>
<ChildObjects>
<Language>Русский</Language>
</ChildObjects>
</Configuration>
</MetaDataObject>
@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ClientApplicationInterface xmlns="http://v8.1c.ru/8.2/managed-application/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="InterfaceLayouter">
<top>
<panel id="c7698af9-8cd3-453f-a58c-8feade000b18">
<uuid>cbab57f2-a0f3-4f0a-89ea-4cb19570ab75</uuid>
</panel>
</top>
<left>
<panel id="96d57572-aa7a-4de2-8964-40db04518ac6">
<uuid>b553047f-c9aa-4157-978d-448ecad24248</uuid>
</panel>
</left>
<panelDef id="b553047f-c9aa-4157-978d-448ecad24248"/>
<panelDef id="13322b22-3960-4d68-93a6-fe2dd7f28ca3"/>
<panelDef id="c933ac92-92cd-459d-81cc-e0c8a83ced99"/>
<panelDef id="cbab57f2-a0f3-4f0a-89ea-4cb19570ab75"/>
<panelDef id="b2735bd3-d822-4430-ba59-c9e869693b24"/>
</ClientApplicationInterface>
@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.21">
<Language uuid="380d45b8-e409-461f-b04e-ac3701cd89a0">
<Properties>
<Name>Русский</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Русский</v8:content>
</v8:item>
</Synonym>
<Comment/>
<LanguageCode>ru</LanguageCode>
</Properties>
</Language>
</MetaDataObject>
@@ -1,54 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://v8.1c.ru/8.2/data/spreadsheet" xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<languageSettings>
<currentLanguage>ru</currentLanguage>
<defaultLanguage>ru</defaultLanguage>
<languageInfo>
<id>ru</id>
<code>Русский</code>
<description>Русский</description>
</languageInfo>
</languageSettings>
<columns>
<size>3</size>
</columns>
<rowsItem>
<index>0</index>
<row>
<c>
<i>0</i>
<c>
<f>2</f>
<tl>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Тест</v8:content>
</v8:item>
</tl>
</c>
</c>
</row>
</rowsItem>
<templateMode>true</templateMode>
<defaultFormatIndex>1</defaultFormatIndex>
<height>1</height>
<vgRows>1</vgRows>
<namedItem xsi:type="NamedItemCells">
<name>Шапка</name>
<area>
<type>Rows</type>
<beginRow>0</beginRow>
<endRow>0</endRow>
<beginColumn>-1</beginColumn>
<endColumn>-1</endColumn>
</area>
</namedItem>
<font faceName="Arial" height="10" bold="false" italic="false" underline="false" strikeout="false" kind="Absolute" scale="100"/>
<format>
<width>10</width>
</format>
<format>
<font>0</font>
<fillType>Text</fillType>
</format>
</document>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
@@ -0,0 +1,3 @@
-FormatVersion 2.21 -CompatibilityMode Version8_3_27
8fb85bbe61436bce439c6daf6d6f56a66ff080bd
65b07ff47fc3c8c18c080c7a1f9e94ca705a7aff
@@ -230,6 +230,10 @@
<app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality> <app:functionality>AllIncomingShareRequestsTypesProcessing</app:functionality>
<app:use>false</app:use> <app:use>false</app:use>
</app:functionality> </app:functionality>
<app:functionality>
<app:functionality>TextToSpeech</app:functionality>
<app:use>false</app:use>
</app:functionality>
</UsedMobileApplicationFunctionalities> </UsedMobileApplicationFunctionalities>
<StandaloneConfigurationRestrictionRoles/> <StandaloneConfigurationRestrictionRoles/>
<MobileApplicationURLs/> <MobileApplicationURLs/>
+22 -1
View File
@@ -5,6 +5,7 @@
import { execFileSync, execFile } from 'child_process'; import { execFileSync, execFile } from 'child_process';
import { existsSync, mkdirSync, mkdtempSync, rmSync, readFileSync, writeFileSync, import { existsSync, mkdirSync, mkdtempSync, rmSync, readFileSync, writeFileSync,
readdirSync, statSync, cpSync, copyFileSync } from 'fs'; readdirSync, statSync, cpSync, copyFileSync } from 'fs';
import { createHash } from 'crypto';
import { join, resolve, dirname, relative, basename, extname } from 'path'; import { join, resolve, dirname, relative, basename, extname } from 'path';
import { tmpdir, cpus } from 'os'; import { tmpdir, cpus } from 'os';
@@ -127,6 +128,17 @@ function ensureSetup(setupName, runtime, skillCasesDir) {
// (<=8_3_26 → 5, >=8_3_27 → 9). Отсюда две 2.20-фикстуры с разными режимами. // (<=8_3_26 → 5, >=8_3_27 → 9). Отсюда две 2.20-фикстуры с разными режимами.
// Фикстура 2.18 (8.3.25) держит границу между свойствами: TypeReductionMode там уже есть, // Фикстура 2.18 (8.3.25) держит границу между свойствами: TypeReductionMode там уже есть,
// а LineNumberLength ещё нет — он появился только в 2.20. // а LineNumberLength ещё нет — он появился только в 2.20.
// Отпечаток фикстуры: аргументы плюс содержимое ОБОИХ портов cf-init. Порты берём оба,
// чтобы каталог, собранный одним рантаймом, не пережил правку другого.
const fixtureStamp = (args) => {
const parts = [args.join(' ')];
for (const ext of ['.ps1', '.py']) {
const p = resolve(REPO_ROOT, '.claude/skills/cf-init/scripts/cf-init' + ext);
parts.push(existsSync(p) ? createHash('sha1').update(readFileSync(p)).digest('hex') : 'нет');
}
return parts.join('\n');
};
const EMPTY_CONFIGS = { const EMPTY_CONFIGS = {
'empty-config': [], 'empty-config': [],
'empty-config-218': ['-FormatVersion', '2.18', '-CompatibilityMode', 'Version8_3_24'], 'empty-config-218': ['-FormatVersion', '2.18', '-CompatibilityMode', 'Version8_3_24'],
@@ -137,12 +149,21 @@ function ensureSetup(setupName, runtime, skillCasesDir) {
}; };
if (EMPTY_CONFIGS[setupName]) { if (EMPTY_CONFIGS[setupName]) {
const cached = join(CACHE, setupName); const cached = join(CACHE, setupName);
if (existsSync(cached)) return cached; // Кэш инвалидируется по содержимому cf-init: без этого правка навыка не доходила до
// фикстуры — старый каталог жил вечно, снэпшоты записывались с ним, и расхождение
// всплывало только на машине с пустым кэшем (поймано на маке, свойство TextToSpeech).
const stamp = join(cached, '.fixture-stamp');
const want = fixtureStamp(EMPTY_CONFIGS[setupName]);
if (existsSync(cached)) {
if (existsSync(stamp) && readFileSync(stamp, 'utf8') === want) return cached;
rmSync(cached, { recursive: true, force: true });
}
mkdirSync(cached, { recursive: true }); mkdirSync(cached, { recursive: true });
const script = resolveScript('cf-init/scripts/cf-init', runtime); const script = resolveScript('cf-init/scripts/cf-init', runtime);
try { try {
execSkillRaw(runtime, script, ['-Name', 'TestConfig', '-OutputDir', cached, ...EMPTY_CONFIGS[setupName]]); execSkillRaw(runtime, script, ['-Name', 'TestConfig', '-OutputDir', cached, ...EMPTY_CONFIGS[setupName]]);
writeFileSync(stamp, want, 'utf8');
} catch (e) { } catch (e) {
rmSync(cached, { recursive: true, force: true }); rmSync(cached, { recursive: true, force: true });
throw new Error(`Failed to create ${setupName} fixture: ${e.message}`); throw new Error(`Failed to create ${setupName} fixture: ${e.message}`);