# Editing Template Attributes

This guide describes how to edit template attributes for an existing GRAccess template such as `TestMachine`.

Read `attribute-parsing.md` first so you know the exact attribute names and current settings before changing anything.

Run commands from `graccess_cli`. Examples assume an active session:

```powershell
graccess session start --galaxy ZB --node .
```

Without a session, add `--node .` to each command.

For LLM-driven edits, use `--llm-json` and validate first:

```powershell
graccess object snapshot --galaxy ZB --name TestMachine --type template --llm-json
graccess object attribute value set --galaxy ZB --name TestMachine --type template --attribute Description --value Updated --data-type string --confirm --confirm-target TestMachine --dry-run --llm-json
```

## Edit Flow

Wrap attribute edits in the standard GRAccess object edit flow:

```powershell
graccess object checkout --galaxy ZB --name TestMachine --type template --confirm --confirm-target TestMachine

# Attribute mutation commands.

graccess object save --galaxy ZB --name TestMachine --type template --confirm --confirm-target TestMachine
graccess object checkin --galaxy ZB --name TestMachine --type template --comment 'Edit template attributes' --confirm --confirm-target TestMachine
```

If any mutation fails, do not continue with more changes until the failure is understood. Use `object undo-checkout` when the edit should be discarded.

## Confirm The Target Attribute

Before editing a specific attribute:

```powershell
graccess object attribute get --galaxy ZB --name TestMachine --type template --attribute Description --json
```

For setting-family edits, find candidate names first:

```powershell
graccess object attributes --galaxy ZB --name TestMachine --type template --json
graccess object attributes --galaxy ZB --name TestMachine --type template --configurable --json
graccess object extended-attributes --galaxy ZB --name TestMachine --type template --json
```

## Set Attribute Values

Use `object attribute set`:

```powershell
graccess object attribute set --galaxy ZB --name TestMachine --type template --attribute Description --value 'Updated description' --data-type string --confirm --confirm-target TestMachine
```

Supported `--data-type` values:

| Data type | Conversion |
|---|---|
| `string` | `MxValue.PutString(...)` |
| `bool`, `boolean`, `mxboolean` | `MxValue.PutBoolean(...)` |
| `int`, `integer`, `mxinteger` | `MxValue.PutInteger(...)` |
| `float`, `mxfloat` | `MxValue.PutFloat(...)` |
| `double`, `mxdouble` | `MxValue.PutDouble(...)` |

Examples:

```powershell
graccess object attribute set --galaxy ZB --name TestMachine --type template --attribute EnableFeature --value true --data-type bool --confirm --confirm-target TestMachine

graccess object attribute set --galaxy ZB --name TestMachine --type template --attribute ScanPeriod --value 1000 --data-type int --confirm --confirm-target TestMachine

graccess object attribute set --galaxy ZB --name TestMachine --type template --attribute Gain --value 1.25 --data-type double --confirm --confirm-target TestMachine
```

The current CLI does not support array values, time values, references, or complex `MxValue` payloads. Use export/import or extend `CreateMxValue(...)` when those are needed.

## Lock Or Unlock Attributes

Use `object attribute lock`:

```powershell
graccess object attribute lock --galaxy ZB --name TestMachine --type template --attribute Description --locked MxPropertyUnlocked --confirm --confirm-target TestMachine
```

The `--locked` value must match a local `MxPropertyLockedEnum` member. The enum parser is case-insensitive and also accepts values with or without a `galaxy_` prefix when such a prefix exists.

## Change Attribute Security

Use `object attribute security`:

```powershell
graccess object attribute security --galaxy ZB --name TestMachine --type template --attribute Description --security MxSecurityOperate --confirm --confirm-target TestMachine
```

The `--security` value must match a local `MxSecurityClassification` member.

## Change Attribute Buffer Flag

Use `object attribute buffer`:

```powershell
graccess object attribute buffer --galaxy ZB --name TestMachine --type template --attribute Description --has-buffer --confirm --confirm-target TestMachine
```

To clear the flag, omit `--has-buffer`:

```powershell
graccess object attribute buffer --galaxy ZB --name TestMachine --type template --attribute Description --confirm --confirm-target TestMachine
```

## Add A UDA

Use `object uda add`:

```powershell
graccess object uda add --galaxy ZB --name TestMachine --type template --uda CustomCode --data-type MxString --category MxCategoryWriteable_USC --security MxSecurityUndefined --confirm --confirm-target TestMachine
```

Array UDA:

```powershell
graccess object uda add --galaxy ZB --name TestMachine --type template --uda CustomArray --data-type MxString --category MxCategoryWriteable_USC --security MxSecurityUndefined --is-array --array-count 10 --confirm --confirm-target TestMachine
```

## Rename, Update, Or Delete A UDA

Rename:

```powershell
graccess object uda rename --galaxy ZB --name TestMachine --type template --uda CustomCode --new-name CustomCode2 --confirm --confirm-target TestMachine
```

Update metadata:

```powershell
graccess object uda update --galaxy ZB --name TestMachine --type template --uda CustomCode2 --data-type MxString --category MxCategoryWriteable_USC --security MxSecurityUndefined --confirm --confirm-target TestMachine
```

Delete:

```powershell
graccess object uda delete --galaxy ZB --name TestMachine --type template --uda CustomCode2 --confirm --confirm-target TestMachine
```

## Edit Extensions

Use extension commands only when you know the supported extension type and primitive name for the template.

```powershell
graccess object extension add --galaxy ZB --name TestMachine --type template --extension-type ScriptExtension --primitive OnScan --object-extension --confirm --confirm-target TestMachine
```

```powershell
graccess object extension rename --galaxy ZB --name TestMachine --type template --extension-type ScriptExtension --primitive OnScan --new-name OnScan2 --object-extension --confirm --confirm-target TestMachine
```

```powershell
graccess object extension delete --galaxy ZB --name TestMachine --type template --extension-type ScriptExtension --primitive OnScan2 --object-extension --confirm --confirm-target TestMachine
```

## Edit History Settings

History settings are usually stored as attributes or extension attributes. First identify candidate names:

```powershell
$attrs = graccess object attributes --galaxy ZB --name TestMachine --type template --json | ConvertFrom-Json
$extended = graccess object extended-attributes --galaxy ZB --name TestMachine --type template --json | ConvertFrom-Json
$history = (@($attrs) + @($extended)) | Where-Object {
  $_.Name -match '(?i)hist|history|historian|storage|trend'
} | Sort-Object Name -Unique

$history | Select-Object Name, DataType, Category, Locked
```

Then edit a known setting with `object attribute set`, lock, security, or buffer commands. Example:

```powershell
graccess object attribute set --galaxy ZB --name TestMachine --type template --attribute HistoryEnabled --value true --data-type bool --confirm --confirm-target TestMachine
```

If the setting value is not a simple string/bool/int/float/double, use export/import or extend CLI value serialization first.

## Edit I/O Settings

I/O settings may be attributes, object-reference assignments, or extension payloads.

Find likely attributes:

```powershell
$io = (@($attrs) + @($extended)) | Where-Object {
  $_.Name -match '(?i)\bio\b|input|output|source|destination|scan|topic|device|address|reference'
} | Sort-Object Name -Unique

$io | Select-Object Name, DataType, Category, RuntimeSetHandler, ConfigSetHandler
```

Edit simple attribute-backed settings:

```powershell
graccess object attribute set --galaxy ZB --name TestMachine --type template --attribute ScanPeriod --value 1000 --data-type int --confirm --confirm-target TestMachine
```

Edit object-level assignment properties with `object set` when applicable:

```powershell
graccess object set --galaxy ZB --name TestMachine --type template --property host --value AppEngine_001 --confirm --confirm-target TestMachine
```

If the COM setter requires an object reference instead of a string, extend the CLI to resolve the named object and assign that object.

## Edit Alarm Settings

Alarm settings are commonly attribute-backed.

Find likely alarm attributes:

```powershell
$alarm = (@($attrs) + @($extended)) | Where-Object {
  $_.Name -match '(?i)alarm|alert|limit|priority|severity|deadband|deviation|rate|roc|hihi|lolo|(^|[._])hi($|[._])|(^|[._])lo($|[._])|ack'
} | Sort-Object Name -Unique

$alarm | Select-Object Name, DataType, Category, SecurityClassification, Locked
```

Edit simple value-backed settings:

```powershell
graccess object attribute set --galaxy ZB --name TestMachine --type template --attribute AlarmPriority --value 500 --data-type int --confirm --confirm-target TestMachine
```

Security and lock changes use the same attribute commands:

```powershell
graccess object attribute security --galaxy ZB --name TestMachine --type template --attribute AlarmPriority --security MxSecurityOperate --confirm --confirm-target TestMachine
graccess object attribute lock --galaxy ZB --name TestMachine --type template --attribute AlarmPriority --locked MxPropertyLocked --confirm --confirm-target TestMachine
```

## Verify Attribute Edits

After checkin, re-read the edited metadata:

```powershell
graccess object attribute get --galaxy ZB --name TestMachine --type template --attribute Description --json
graccess object attributes --galaxy ZB --name TestMachine --type template --configurable --json
```

The current CLI does not read back attribute values, so value verification requires one of:

| Need | Path |
|---|---|
| Confirm metadata changed | `object attribute get` or `object attributes` |
| Confirm simple value changed | Add value readback support |
| Confirm full vendor configuration | Export object and compare package content with vendor tooling |

## Recommended CLI Extension For Full Attribute Editing

To fully support history, I/O, alarm, and script-related settings as first-class CLI operations, add:

```text
graccess object attribute value get --galaxy ZB --name TestMachine --type template --attribute AttrName --json
graccess object attribute value set --galaxy ZB --name TestMachine --type template --attribute AttrName --value-json file.json --confirm --confirm-target TestMachine
```

The implementation should serialize `IAttribute.Value` defensively and support complex `MxValue` shapes beyond the current scalar `string`, `bool`, `int`, `float`, and `double` conversions.
