3f6bfebd6d
Three additions to the script editor commands. Each one closes a real gap surfaced by the round-trip-test against \$DelmiaReceiver.ProcessRecipe. 1. `object scripts set --field <name>` — explicit text-field selection. Previously `scripts set` always wrote to <Name>.ExecuteText (via ScriptAttributeName's default). To rewrite DeclarationsText / StartupText / ShutdownText / OnScanText / OffScanText / Expression, callers had to pass the full attribute name as `--script Foo.StartupText`, which is brittle. The new `--field` flag accepts any of the seven canonical ScriptTextSuffixes and composes <script>.<field> directly. Validates against the suffix list so an unrecognised --field surfaces a friendly error rather than a downstream FindAttributeForMutation failure. Default behavior (no --field) is unchanged: ExecuteText. 2. `object scripts settings set --lock-trigger-type` — parallel to the existing --lock-trigger-period. After writing TriggerType the new flag calls SetLocked(MxLockedInMe), matching the lock pattern on the period field. Without it, --trigger-type writes the value but leaves the attribute unlocked. 3. `object scripts delete` — script-named alias for the existing extension-delete subcommand. Wraps obj.DeleteExtensionPrimitive( "ScriptExtension", scriptName) inside AtomicObjectEdit (checkout / save / checkin). Removes the burden of remembering the generic `--extension-type ScriptExtension --primitive <Name>` form. Test count delta: 61 -> 63 (+2 command-shape assertions for the new ObjectScriptsSetCommand and ObjectScriptsDeleteCommand). Live round-trip-test against \$DelmiaReceiver.ProcessRecipe: - `--field DeclarationsText` write composed `ProcessRecipe.DeclarationsText`, CheckOut/Save/CheckIn all returned OK. - `--field ExecuteText` round-trip same. - A subsequent re-read shows the original body, suggesting that IAttribute.SetValue silently no-ops for ScriptExtension text fields on this GRAccess version (or the package-export reader pulls from a different snapshot than the just-saved revision). This is upstream of the editor surface — the new flags route correctly to the same SetValue path that scripts set already used. Diagnosing the SetValue ineffectiveness for script-text fields is a separate followup that should look at IScriptExtension-specific COM interfaces (per docs/script-parsing.md:8 "Object-level scripts are less direct"). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
graccesscli
A .NET Framework 4.8 / x86 CliFx-based CLI for automating AVEVA / Wonderware System Platform Galaxy configuration through the ArchestrA GRAccess COM interop library (ZB.MOM.WW.GRAccess.Cli).
Hard constraints
GRAccess is a 32-bit COM stack. Skipping any of these will fail at load or corrupt Galaxy state:
- Target framework / arch:
net48,x86,[STAThread]. No exceptions. - Cannot be loaded from a .NET 10 / x64 process — see
GRAccess-DLL-and-DotNet10-Notes.md. - AVEVA System Platform must be installed locally (or
ArchestrA.GRAccess.dllregistered in the GAC atC:\Windows\assembly\GAC\Archestra.GRAccess\1.7.0.0_23106a86e706d0ae\). The bundled copy inlib/is for build-time reference only. - In daemon mode, every COM call must be marshalled through
Session/StaComThread.cs; calling GRAccess from any other thread will deadlock or corrupt state. - Keep the root
GRAccessAppalive for the lifetime of any derivedIGalaxy/IgObjecthandle. - Mutation flow is fixed:
CheckOut → modify → Save → CheckIn(comment). SkippingCheckInleaves the object locked in the Galaxy repo. - Build requires Visual Studio / MSBuild with the
x86platform target.
Layout
graccesscli/
ZB.MOM.WW.GRAccess.Cli.slnx # solution
lib/ArchestrA.GRAccess.dll # bundled COM interop assembly (reference only)
src/ZB.MOM.WW.GRAccess.Cli/ # CLI project (net48, x86, CliFx)
tests/ZB.MOM.WW.GRAccess.Cli.Tests # test project
docs/ # CLI workflows, LLM contract, parsing/editing guides
AGENTS.md # coding-agent rules for this tool
CLAUDE.md # detailed agent guide
graccess_documentation.md # full GRAccess API reference
graccess_operations.md # GRAccess operations grouped by functional area
usage.md # compatibility copy of docs/usage.md
GRAccess-DLL-and-DotNet10-Notes.md # platform / 32-bit COM / .NET 10 incident notes
requirements-mutation-typelib-fix.md # active mutation-path defect tracker
Resource index
| Task | Go to |
|---|---|
| Coding-agent rules for working in this folder | AGENTS.md |
| General agent guide (project overview, references) | CLAUDE.md |
| Full GRAccess API surface (types, methods) | graccess_documentation.md |
| GRAccess operations grouped by functional area, with page refs | graccess_operations.md |
| CLI commands, options, session mode, IPC protocol | docs/usage.md |
| LLM-facing operating contract (envelopes, safety, batch) | docs/llm-integration.md |
| Add a new CLI command end-to-end | docs/adding-features.md |
| Inspect / read existing templates (read-only) | docs/template-parsing.md |
| Parse template attributes and setting families | docs/attribute-parsing.md |
| Parse script libraries and object-level scripts | docs/script-parsing.md |
| Edit existing templates safely | docs/template-editing.md |
| Create / edit template instances, areas, engine assignments, I/O | docs/template-instance-editing.md |
| Edit template attributes, UDAs, extensions, setting families | docs/attribute-editing.md |
| Edit script libraries and script-bearing template content | docs/script-editing.md |
Live ZB galaxy reference (read-only capture) |
docs/zb-galaxy.md |
Live ZB $TestMachine template family reference |
docs/zb-testmachine.md |
| CliFx framework reference (commands, options, DI, testing) | docs/clifx_reference.md |
| GRAccess DLL / 32-bit COM / .NET 10 platform notes | GRAccess-DLL-and-DotNet10-Notes.md |
| Active mutation-path COM lifecycle defects | requirements-mutation-typelib-fix.md |
Index for docs/ only |
docs/README.md |
Maintenance
Documentation rules live in ../DOCS-GUIDE.md; the root task → tool index lives in ../CLAUDE.md. When adding, renaming, or removing any doc in this folder, update the resource index above in the same change. When the user-facing CLI surface changes, update docs/usage.md (and keep usage.md aligned).