Files
wwtools/graccesscli/CLAUDE.md
Joseph Doherty 32f26272ae Initial commit: Wonderware / System Platform tools and reference
Five tools under one repo, all docs organized per DOCS-GUIDE.md:

- aalogcli: .NET 4.8 / x86 CliFx CLI for reading System Platform binary
  logs (*.aaLGX) for LLM debugging, built on aaOpenSource/aaLog. Commands:
  last, tail, range, unread, fields. Stable JSON envelope under --llm-json.
  Build template under lib/build/ for rebuilding aaLogReader.dll.

- aot: ArchestrA Object Toolkit 2014 v4.0 reference material. Dev guide
  (Markdown converted from CHM), API reference for the ArchestrA.Toolkit
  namespace, and the Monitor / Watchdog VS sample solutions.

- graccesscli: .NET 4.8 / x86 CliFx CLI that automates Galaxy
  configuration via the ArchestrA GRAccess COM interop. Includes session
  daemon, IPC protocol, and llm-json envelope contract.

- grdb: SQL/DDL exploration of the Galaxy Repository database. DDL
  captures, reusable queries, hierarchy / contained-name <-> tag-name
  translation notes.

- histdb: LLM-oriented reference for AVEVA Historian retrieval. INSQL
  linked-server, extension tables, every wwXxx time-domain extension,
  every retrieval mode, alarm/event SQL recipes, REST API. Distilled
  from the 243-page Historian Retrieval Guide.

Root contains:
- CLAUDE.md: thin index pointing into each tool's README.
- DOCS-GUIDE.md: doctrine for organizing docs for LLM consumption.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 18:22:20 -04:00

9.7 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

This is a .NET Framework 4.8 console application (CLI) for automating Aveva System Platform Galaxy configuration via the ArchestrA GRAccess COM/.NET library. The GRAccess API exposes a hierarchical object model rooted at GRAccessAppClass for programmatically managing Galaxies, templates, instances, attributes, users, roles, and security.

Key References

  • GRAccess documentation: graccess_documentation.md (full API reference, type definitions, code examples)
  • GRAccess DLL: lib/ArchestrA.GRAccess.dll — COM interop assembly, referenced by the CLI csproj
  • GRAccess operations: graccess_operations.md - all library operations organized by functional area with page references
  • CLI usage: docs/usage.md - all CLI commands, options, session mode, IPC protocol. Must be updated whenever commands are added or changed.
  • LLM integration: docs/llm-integration.md - implemented LLM-facing operating contract, stable envelope, safety rules, validation, batch plans, and IDE intent wrappers.
  • Adding features: docs/adding-features.md - checklist for adding commands, dispatcher handlers, capabilities metadata, LLM output, validation, tests, and documentation.
  • ZB galaxy documentation: docs/zb-galaxy.md - read-only documentation captured from the live ZB galaxy with graccess_cli.
  • ZB TestMachine documentation: docs/zb-testmachine.md - deep read-only documentation of the ZB $TestMachine template family and instances.
  • Template parsing: docs/template-parsing.md - read-only workflow for inspecting existing templates such as TestMachine.
  • Attribute parsing: docs/attribute-parsing.md - detailed workflow for parsing all template attributes and setting families.
  • Script parsing: docs/script-parsing.md - workflow for parsing script libraries and object-level scripts.
  • Template editing: docs/template-editing.md - end-to-end workflow for safely editing existing templates.
  • Template instance editing: docs/template-instance-editing.md - workflow for creating and editing template instances, areas, engine assignments, and I/O settings.
  • Attribute editing: docs/attribute-editing.md - detailed workflow for editing template attributes, UDAs, extensions, and setting families.
  • Script editing: docs/script-editing.md - workflow for editing script libraries and script-bearing template content.
  • CliFx reference: docs/clifx_reference.md - local copy of CliFx framework docs (commands, parameters, options, DI, testing)
  • The DLL's default GAC path is C:\Windows\assembly\GAC\Archestra.GRAccess\1.7.0.0_23106a86e706d0ae\Archestra.GRAccess.dll

Solution Layout

ZB.MOM.WW.GRAccess.Cli.slnx
├── lib/ArchestrA.GRAccess.dll
├── docs/usage.md
├── docs/llm-integration.md
├── docs/adding-features.md
├── docs/zb-galaxy.md
├── docs/zb-testmachine.md
├── docs/template-parsing.md
├── docs/attribute-parsing.md
├── docs/script-parsing.md
├── docs/template-editing.md
├── docs/template-instance-editing.md
├── docs/attribute-editing.md
├── docs/script-editing.md
├── docs/clifx_reference.md
├── graccess_documentation.md
├── graccess_operations.md
├── src/ZB.MOM.WW.GRAccess.Cli/        # CLI project (net48, x86, CliFx)
│   ├── Program.cs                      # Dual entry: CLI mode or --daemon mode
│   ├── IsExternalInit.cs               # Polyfill for init accessors on net48
│   ├── Commands/Session/               # session start|stop|status commands
│   ├── Session/                        # Daemon infrastructure
│   │   ├── StaComThread.cs             # STA thread + Win32 message pump
│   │   ├── SessionDaemon.cs            # Named pipe server, idle timeout
│   │   ├── SessionClient.cs            # Named pipe client
│   │   └── SessionInfo.cs              # Session state file (PID, pipe name)
│   ├── GRAccess/
│   │   ├── GRAccessConnection.cs       # Wraps connect/login/logout
│   │   └── PackageSnapshot.cs          # Read-only exported package parser for deep snapshots
│   ├── Protocol/                       # IPC message DTOs
│   │   ├── PipeRequest.cs
│   │   ├── PipeResponse.cs
│   │   └── PipeProtocol.cs
│   └── Infrastructure/
│       └── CommandRouter.cs            # Routes via session or one-shot
└── tests/ZB.MOM.WW.GRAccess.Cli.Tests/ # xunit + Shouldly

Build & Test Commands

# Build
dotnet build src/ZB.MOM.WW.GRAccess.Cli/ZB.MOM.WW.GRAccess.Cli.csproj -p:Platform=x86

# Run CLI
dotnet run --project src/ZB.MOM.WW.GRAccess.Cli/ZB.MOM.WW.GRAccess.Cli.csproj -- <args>

# Run all tests
dotnet test tests/ZB.MOM.WW.GRAccess.Cli.Tests/ZB.MOM.WW.GRAccess.Cli.Tests.csproj -p:Platform=x86

# Run a single test
dotnet test tests/ZB.MOM.WW.GRAccess.Cli.Tests/ --filter "FullyQualifiedName~TestName"

Target framework is .NET Framework 4.8 (SDK-style csproj). Must target x86 (both CLI and test projects) because GRAccess is a 32-bit COM component. Uses CliFx for CLI parsing — commands are classes implementing ICommand with [Command], [CommandParameter], and [CommandOption] attributes. C# 9.0 init accessors require the IsExternalInit.cs polyfill; required keyword is not available.

Session Architecture

The CLI supports two execution modes to avoid expensive repeated GRAccess connections:

One-shot mode (default)

Opens connection, runs command, closes. Simple but slow.

Session mode

graccess session start --galaxy MyGalaxy --node MyNode   # spawns daemon
graccess session status --galaxy MyGalaxy                 # check status
graccess <command> --galaxy MyGalaxy                       # routes via daemon
graccess session stop --galaxy MyGalaxy                   # tears down

How it works: Same binary, two codepaths. --daemon hidden flag (bypasses CliFx) launches the daemon which:

  1. Acquires a Mutex (Global\graccess-session-{galaxy}) for single-instance
  2. Starts a StaComThread (STA thread + Win32 message pump for COM interop)
  3. Connects to the galaxy on the STA thread
  4. Writes session info to %LOCALAPPDATA%\ZB.MOM.WW.GRAccess.Cli\sessions\{galaxy}.json
  5. Listens on named pipe graccess-session-{galaxy} for JSON requests
  6. Auto-exits after idle timeout (default 30 min)

IPC protocol: Newline-delimited JSON over named pipes. Request types: execute, shutdown, status.

CommandRouter detects active sessions via SessionClient.TryConnect() and routes commands through the pipe. Falls back to one-shot if no session is running.

Key constraint: All GRAccess COM calls must execute on the StaComThread. The daemon marshals work via RunAsync<T>(Func<T>) which posts to a ConcurrentQueue and wakes the message pump with PostThreadMessage(WM_APP).

For LLM/deep parsing, prefer object snapshot, object lineage, and object children with --llm-json. These commands use typed GRAccess reads first and can fall back to temporary GRAccess-exported package parsing for lineage, contained objects, scalar attribute values, and script bodies. Normal CLI behavior must not query the Galaxy Repository SQL database; SQL is only for development verification/debugging.

GRAccess API Patterns

All GRAccess code must follow these patterns:

  1. Entry point must use [STAThread] — GRAccess is a COM STA component
  2. GRAccessApp must stay in scope for the lifetime of any GRAccess objects — do not let it get garbage collected
  3. Error handling: Check CommandResult.Successful after every API call. Multi-object operations return CommandResults (plural). These work like GetLastError in C++.
  4. Workflow for modifying objects: CheckOut() → make changes → Save()CheckIn(comment)
  5. Collections are 1-based, not 0-based
  6. Namespace: using ArchestrA.GRAccess; — classes are GRAccessAppClass, MxValueClass, etc.

Typical connection flow

GRAccessApp grAccess = new GRAccessAppClass();
IGalaxies galaxies = grAccess.QueryGalaxies(Environment.MachineName);
IGalaxy galaxy = galaxies["GalaxyName"];
galaxy.Login("", "");
// ... work with galaxy ...
galaxy.Logout();

GRAccess Object Model Hierarchy

GRAccessApp (root)
├── IGalaxies → IGalaxy
│   ├── IGalaxySecurity → ISecurityGroups → ISecurityGroup
│   ├── IGalaxyRoles → IGalaxyRole → IGalaxyUsers → IGalaxyUser
│   └── IgObjects (QueryObjects/QueryObjectsByName)
│       ├── ITemplate → CreateInstance() → IInstance
│       └── IInstance (CheckOut/Save/CheckIn/Deploy/Undeploy)
│           └── IAttributes → IAttribute (Get/SetValue via MxValue)
├── IToolsets → IToolset
├── IScriptLibraries → IScriptLibrary
└── ICommandResults → ICommandResult

Important Type Definitions

  • EgObjectIsTemplateOrInstance: gObjectIsTemplate or gObjectIsInstance — used in query methods
  • MxDataType: MxString, MxInteger, MxFloat, MxBoolean, etc.
  • MxAttributeCategory: MxCategoryWriteable_USC_Lockable, etc.
  • EAuthenticationMode: galaxyAuthenticationMode, osAuthenticationMode
  • MxValue/MxValueClass: Universal value container (like Variant), handles type conversions automatically

Platform Requirements

  • Must run on a machine with Aveva System Platform (Application Server) installed, or have the GRAccess DLL registered
  • For remote machine access, the OSConfigUtility must have been run
  • On 64-bit OS, the import path must include (x86): C:\Program Files (x86)\ArchestrA\Framework\Bin\