Empirical failure: rename_object Application/ST_Sample -> ST_SampleRenamed updated the struct's own TYPE header but Application/PLC_PRG kept 's : ST_Sample;' -- the old name -- breaking the project. Root cause: scriptengine.ScriptObject.rename()/set_name() is a node-local rename only; the IDE's project-wide Rename refactor lives above the scripting layer (no documented find_references() / refactor variant). Fix: after the local rename succeeds, walk every text-bearing object (textual_declaration / textual_implementation), word-boundary regex-replace \bOldName\b -> NewName via a callback (so backslashes in NewName don't get interpreted as backrefs), set_text the changed nodes, save once. New optional updateReferences param defaults to true; pass false for the legacy minimal-rename behaviour. Docs: https://content.helpme-codesys.com/en/ScriptingEngine/ScriptObject.html Risk: false positives in comments / string literals are theoretically possible but rare for IEC identifiers. Documented in the tool description. The target node itself is skipped during the references walk (matched by get_id()) so the rename's already-updated TYPE/FUNCTION_BLOCK/PROGRAM header isn't double-rewritten. Two new vitest e2e checks added: assert UPDATE_REFERENCES=1 renders the re.escape + word-boundary regex, and UPDATE_REFERENCES=0 still produces a fully-substituted script with no leftover placeholders. ### Manual smoke test 1. Open a project with: a DUT 'ST_Sample', a POU 'PLC_PRG' with 'VAR s : ST_Sample; END_VAR', and a third POU referencing 'ST_Sample.foo'. 2. mcp__codesys__rename_object objectPath=Application/ST_Sample newName=ST_SampleRenamed. 3. Expect SCRIPT_SUCCESS with 'References Updated In: 2 node(s)'. 4. mcp__codesys__compile_project should succeed (no unresolved-symbol errors for ST_Sample). 5. With updateReferences=false, the same rename should leave PLC_PRG stale and compile_project should fail -- validates the opt-out. 6. Word-boundary check: rename 'Foo' -> 'Bar' must NOT touch 'FooBar' or 'BarFoo' anywhere. |
||
|---|---|---|
| .. | ||
| e2e.test.ts | ||
| README.md | ||
Manual CODESYS Integration Tests
These tests require a real CODESYS installation and cannot run in CI.
Prerequisites
- CODESYS 3.5 SP19 or SP21 installed
- No other CODESYS instances running
- Node.js 18+
Steps
1. Build the package
npm run build
2. Test persistent mode
node dist/bin.js \
--codesys-path "C:\path\to\CODESYS.exe" \
--codesys-profile "CODESYS V3.5 SP21 Patch 3" \
--mode persistent \
--verbose
Verify:
- CODESYS UI opens
- Console shows "CODESYS watcher is ready"
- The MCP server accepts connections
3. Test headless fallback
node dist/bin.js \
--codesys-path "C:\path\to\CODESYS.exe" \
--codesys-profile "CODESYS V3.5 SP21 Patch 3" \
--mode headless
4. Test --detect flag
node dist/bin.js --detect
Verify: Lists installed CODESYS versions.
5. Ctrl+C shutdown
- Press Ctrl+C during persistent mode
- Verify CODESYS shuts down cleanly