Use an XML definition instead of JSON to define your custom steps. The file must be named steptypes.xml and placed in a custom cartridge in the root folder. The XML file is parsed and reloaded whenever the active code version is changed. Each cartridge supports only one steptypes.json or steptypes.xml file.
my_cartridge/steptypes.xml
<?xml version="1.0" encoding="UTF-8" ?>
<step-types>
<script-module-step type-id="custom.DownloadFromFTP">
<description>Downloads files from a FTP server</description>
<module>jf_example_cartridge/cartridge/scripts/steps/FTPTransfer.ds</module>
<function>download</function>
<transactional>false</transactional>
<parameters>
<parameter name="DeleteFile" type="boolean" required="false" trim="false">
<default-value>false</default-value>
</parameter>
<parameter name="FileNamePattern" type="string" required="true" trim="false"/>
<parameter name="HostURL" type="string" required="true" trim="false"/>
<parameter name="SourceFolder" type="string" required="true" trim="false"/>
<parameter name="TargetFolder" type="string" required="true" trim="false"/>
<parameter name="_SimulateExitStatus" type="string" required="false" trim="false">
<enum-values>
<value>ERROR</value>
<value>NO_FILE_FOUND</value>
<value>OK</value>
</enum-values>
</parameter>
</parameters>
<status-codes>
<status code="ERROR">
<description>Used when an error occurred during FTP download.</description>
</status>
<status code="NO_FILE_FOUND">
<description>Used when no file could be found on the FTP.</description>
</status>
<status code="OK">
<description>Used when FTP download was successful.</description>
</status>
</status-codes>
</script-module-step>
<script-module-step type-id="custom.UploadToFTP">
<description>Uploads files to a FTP server</description>
<module>jf_example_cartridge/cartridge/scripts/steps/FTPTransfer.ds</module>
<function>upload</function>
<transactional>false</transactional>
<parameters>
<parameter name="DeleteFile" type="boolean" required="false" trim="false">
<default-value>false</default-value>
</parameter>
<parameter name="FileNamePattern" type="string" required="true" trim="false"/>
<parameter name="HostURL" type="string" required="true" trim="false"/>
<parameter name="SourceFolder" type="string" required="true" trim="false"/>
<parameter name="TargetFolder" type="string" required="true" trim="false"/>
<parameter name="_SimulateExitStatus" type="string" required="false" trim="false">
<enum-values>
<value>ERROR</value>
<value>NO_FILE_FOUND</value>
<value>OK</value>
</enum-values>
</parameter>
</parameters>
<status-codes>
<status code="ERROR">
<description>Used when an error occurred during FTP upload.</description>
</status>
<status code="NO_FILE_FOUND">
<description>Used when no file could be found for upload to the FTP.</description>
</status>
<status code="OK">
<description>Used when FTP upload was successful.</description>
</status>
</status-codes>
</script-module-step>
<script-module-step type-id="custom.RebuildIndexes">
<module>jf_example_cartridge/cartridge/scripts/steps/RebuildIndexes.ds</module>
<function>execute</function>
<transactional>false</transactional>
<parameters>
<parameter name="RebuildContentIndexes" type="boolean" required="false" trim="false">
<default-value>false</default-value>
</parameter>
<parameter name="RebuildProductIndexes" type="boolean" required="false" trim="false">
<default-value>false</default-value>
</parameter>
<parameter name="_SimulateExitStatus" type="string" required="false" trim="false">
<enum-values>
<value>ERROR</value>
<value>OK</value>
</enum-values>
</parameter>
</parameters>
<status-codes>
<status code="ERROR">
<description>Used when index rebuild failed.</description>
</status>
<status code="OK">
<description>Used when index rebuild was successful.</description>
</status>
</status-codes>
</script-module-step>
<pipeline-step type-id="custom.Import">
<pipeline>Import-Start</pipeline>
<parameters>
<parameter name="FileNamePattern" type="string" required="true" trim="false"/>
<parameter name="ImportMode" type="string" required="true" trim="false">
<enum-values>
<value>DELETE</value>
<value>MERGE</value>
<value>REPLACE</value>
<value>UPDATE</value>
</enum-values>
</parameter>
<parameter name="ObjectType" type="string" required="true" trim="false">
<enum-values>
<value>catalog</value>
<value>inventory</value>
<value>pricebook</value>
<value>promotion</value>
</enum-values>
</parameter>
<parameter name="_SimulateExitStatus" type="string" required="false" trim="false">
<enum-values>
<value>ERROR</value>
<value>NO_FILE_FOUND</value>
<value>OK</value>
</enum-values>
</parameter>
</parameters>
<status-codes>
<status code="ERROR">
<description>Used when the import failed.</description>
</status>
<status code="NO_FILE_FOUND">
<description>Used when no file to import was found.</description>
</status>
<status code="OK">
<description>Used when the import was successful.</description>
</status>
</status-codes>
</pipeline-step>
<pipeline-step type-id="custom.ExportOrders">
<pipeline>ExportOrders-Start</pipeline>
<parameters>
<parameter name="FileName" type="string" required="true" trim="false"/>
<parameter name="OrderStatus" type="string" required="false" trim="false">
<enum-values>
<value>All</value>
<value>ConfirmedAndPaid</value>
</enum-values>
<default-value>All</default-value>
</parameter>
<parameter name="_SimulateExitStatus" type="string" required="false" trim="false">
<enum-values>
<value>ERROR</value>
<value>NO_ORDERS_FOUND</value>
<value>OK</value>
</enum-values>
</parameter>
</parameters>
<status-codes>
<status code="ERROR">
<description>Used when the order export failed.</description>
</status>
<status code="NO_ORDERS_FOUND">
<description>Used when no order to export were found.</description>
</status>
<status code="OK">
<description>Used when the order export was successful.</description>
</status>
</status-codes>
</pipeline-step>
<chunk-script-module-step type-id="custom.MyCustomChunkScriptModuleStep">
<description>My custom chunk script step type/description>
<module>my_cartridge/cartridge/scripts/steps/myModule.ds</module>
<before-step-function>beforeStep</before-step-function>
<total-count-function>beforeChunk</total-count-function>
<before-chunk-function>beforeChunk</before-chunk-function>
<read-function>read</read-function>
<process-function>process</process-function>
<write-function>write</write-function>
<after-chunk-function>afterChunk</after-chunk-function>
<after-step-function>afterStep</after-step-function>
<chunk-size>10</chunk-size>
<transactional>true</transactional>
<parameters>
<parameter name="MyParameter" type="boolean" required="false" trim="false">
</parameter>
</parameters>
<status-codes>
<status code="ERROR">
<description>Used when an error occurred.</description>
</status>
<status code="OK">
<description>Used when no error occured.</description>
</status>
</status-codes>
</script-module-step>
</step-types>