Repository navigation
4.0.0-beta.3
Pre-release
Pre-release
Fixes and additions since 4.0.0-beta.2, many of them found by running cts against real projects and by an AI agent using cts for the first time. Install or update with the same PowerShell line as before (L, the main branch). The full list is in CHANGELOG.md.
Upgrading: what changes
- An entry's
Pathin a native.xmlfile holds its ancestors' object names, not the labels the IDE shows (Plc Logic, notPLC Logic), so a file reads the same from every PC. The firstcts exportafter the update rewritesPathin the native files of a repository exported where the two differ: a one-time diff to commit, with no change to the objects.cts compareleavesPathout of a native file's content, so a file another PC wrote with other labels is unchanged, not a modified one an import replaces or refuses. - A project's files never carry its id:
Project Information.xmlleavescts-project-idout as it doescts-source, so the first export after the update drops that entry from it. Importing a copied folder no longer gives the copy the original's id, andcts set-sync-folder --new-idtakes a copied folder whosecds-text-sync.jsonstill names the project. cts plc-log,cts plc getandcts testtake the file to save as--out PATH, ascts docsdoes;--outputis only the answer's format.
Sync and merge
- Objects whose edits on disk and in the IDE overlap open a conflict window from the quick window's
1and2: it lists them, shows one side by side with the differing lines marked, and takes Disk wins, IDE wins or Merge by hand for each, or Force for all.cts import,cts syncandcts exporttake--take [KEY=]disk|ide, repeatable, for one object's side or every one's. - A text list or an
.xmlobject both sides changed is merged; an overlap is a conflict carrying both texts, which--takesettles and the conflict window shows. - A removed and an added object whose texts are alike are one rename: the object keeps its GUID, and its members move with it (one at its old place keeps its GUID and takes the new text, one it lost is deleted, a new one is made below it).
- The IDE's tree is keyed by the names its files carry, so an object named
A/Bis found underA_B, not refused as not in the IDE; a changed native object whose file has a__<guid>suffix is found by its GUID when a sibling has its name. - A new native object at the view's top, or a project-level one in
POUs/, goes to the project root. A plain folder whose directory left the disk with its objects is deleted, and one whose directory a move left empty goes with its objects. - An import or sync gives the sync base every file the disk and the IDE already agree on, so
cts buildno longer names such a file as not imported after every sync; a file only moved since the base is not named either.cts import --dry-runlists the folders the import would delete. - A project file older than the folder (saved before the last import, or a pull came since) is brought up to date, not taken for IDE edits, and
cts statussays how many commits it is behind. - A view read that fails is tried once more, then named as
read_failedwith its file, not refused. - A task call whose ObjectTypeGuid is empty (V3.5 SP20 Patch 1) is known by its class: the view leaves it out, and the calls a load adds are no IDE edit.
PLC and tests
cts download --online-changechanges the running application, logging in unchanged first; a change only a download can carry is refused.cts testends its wait on an exception, a stop or reads that stop answering, and quotes the exception; it names a boot application made on download.--repeat Ncounts every run inpassed=andfailed=(per_run=is one run's tests).cts plc-loghints at known runtime lines.cts readexpands a name deep in a path (fb.array) by its own type, anARRAY OF STRING(n)to its elements.cts rawsends a value like a GUID that starts as an out-of-range number as a string; a create into a folder names the folder (folder_guid).
Libraries, build and analysis
cts lib addtakes the library's own namespace and--placeholderreferences it through a placeholder (a project with no Library Manager gets one at its root);cts lib redirectfixes a placeholder's version; a reference to version*names the newest version installed on this PC.cts buildandcts docs --showname the installed library that holds an unknown name, including libraries installed after the IDE started.cts docssays of a library with no pages whether its comments are plain text or its pages are not written yet.- New
cts project newmakes an empty project or library from the installation's template, with no IDE. cts analyzereports fewer false findings (CTS0015, CTS0035, CTS0047, CTS0050, CTS0051, CTS0091) and takes--severity danger|suspicious|styleto keep only findings that severe or worse; new CTS0101: a///comment after a declaration documents the one below it.
Answers
cts verify --jsoncarries every problem of a stage (the text answer still shows the first 20 and names the rest);cts newandcts verifyname their next commands asNext:lines, as the other commands do, andcts newprints its note.cts statusno longer promises an import whencts comparefinds nothing to bring in;cts comparewithout a sync base says its counts cannot tell which side changed.- A command run inside another sync folder than the IDE project's warns and names the folder it works on.
cts agent listnames thects dialog answerline for an IDE a dialog blocks.
Install
cts installupdates and checks every ScriptDir that holds an install, held files included; the warning about an agent of another build names the IDE's ScriptDir.- The setup archive leaves out the tests, whose paths passed Windows' 260-character limit when setup unpacked a commit from
main.