ansysem-agent-bridge 0.2.0a2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. ansysem_agent_bridge-0.2.0a2/.github/workflows/ci.yml +26 -0
  2. ansysem_agent_bridge-0.2.0a2/.github/workflows/publish.yml +98 -0
  3. ansysem_agent_bridge-0.2.0a2/.gitignore +17 -0
  4. ansysem_agent_bridge-0.2.0a2/CONTRIBUTING.md +17 -0
  5. ansysem_agent_bridge-0.2.0a2/LICENSE +21 -0
  6. ansysem_agent_bridge-0.2.0a2/PKG-INFO +353 -0
  7. ansysem_agent_bridge-0.2.0a2/README.md +305 -0
  8. ansysem_agent_bridge-0.2.0a2/SECURITY.md +12 -0
  9. ansysem_agent_bridge-0.2.0a2/docs/ARCHITECTURE.md +143 -0
  10. ansysem_agent_bridge-0.2.0a2/docs/CAPABILITY_MATRIX.md +26 -0
  11. ansysem_agent_bridge-0.2.0a2/docs/EXECUTION_CONTEXT_CONTRACT.md +85 -0
  12. ansysem_agent_bridge-0.2.0a2/docs/RELEASE_CONTRACT.md +38 -0
  13. ansysem_agent_bridge-0.2.0a2/docs/RUNTIME_AND_CONTEXT.md +58 -0
  14. ansysem_agent_bridge-0.2.0a2/docs/VALIDATION_AEDT_2026R1_LINUX.md +129 -0
  15. ansysem_agent_bridge-0.2.0a2/docs/WORKSPACE_LIFECYCLE.md +85 -0
  16. ansysem_agent_bridge-0.2.0a2/docs/assets/README.md +6 -0
  17. ansysem_agent_bridge-0.2.0a2/docs/assets/ansysem-agent-bridge-hero.png +0 -0
  18. ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-capability-descriptor-v1.schema.json +38 -0
  19. ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-operation-plan-v1.schema.json +171 -0
  20. ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-operation-result-v1.schema.json +19 -0
  21. ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-runtime-snapshot-v1.schema.json +23 -0
  22. ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-target-identity-v1.schema.json +23 -0
  23. ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-workspace-patch-v1.schema.json +235 -0
  24. ansysem_agent_bridge-0.2.0a2/pyproject.toml +50 -0
  25. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/__init__.py +12 -0
  26. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/__main__.py +4 -0
  27. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_addin_assets/agent_connection_status.py +3 -0
  28. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_addin_assets/copy_agent_context.py +3 -0
  29. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_addin_assets/use_current_design.py +3 -0
  30. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_context_tool.py +239 -0
  31. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/capabilities.py +340 -0
  32. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/cli.py +602 -0
  33. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/config.py +90 -0
  34. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/context_addin.py +186 -0
  35. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/discovery.py +103 -0
  36. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/docs_backend.py +252 -0
  37. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/hfss3dlayout_adapter.py +357 -0
  38. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/hfss3dlayout_pyedb_adapter.py +671 -0
  39. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/live_probe.py +179 -0
  40. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/models.py +92 -0
  41. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/operations.py +67 -0
  42. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/profiles.py +150 -0
  43. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/project_bundle.py +196 -0
  44. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/project_create.py +114 -0
  45. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/runtime.py +67 -0
  46. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/runtime_adapter.py +528 -0
  47. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-agent-bridge/SKILL.md +169 -0
  48. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-agent-bridge/agents/openai.yaml +10 -0
  49. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-kb-docs/SKILL.md +64 -0
  50. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-kb-docs/agents/openai.yaml +10 -0
  51. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_installer.py +259 -0
  52. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/transaction.py +550 -0
  53. ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/workspace.py +1336 -0
  54. ansysem_agent_bridge-0.2.0a2/tests/conftest.py +6 -0
  55. ansysem_agent_bridge-0.2.0a2/tests/test_capabilities.py +50 -0
  56. ansysem_agent_bridge-0.2.0a2/tests/test_cli.py +98 -0
  57. ansysem_agent_bridge-0.2.0a2/tests/test_context_addin.py +155 -0
  58. ansysem_agent_bridge-0.2.0a2/tests/test_discovery.py +16 -0
  59. ansysem_agent_bridge-0.2.0a2/tests/test_docs_backend.py +51 -0
  60. ansysem_agent_bridge-0.2.0a2/tests/test_hfss3dlayout_adapter.py +81 -0
  61. ansysem_agent_bridge-0.2.0a2/tests/test_hfss3dlayout_pyedb_adapter.py +124 -0
  62. ansysem_agent_bridge-0.2.0a2/tests/test_live_probe.py +15 -0
  63. ansysem_agent_bridge-0.2.0a2/tests/test_models.py +33 -0
  64. ansysem_agent_bridge-0.2.0a2/tests/test_operations.py +44 -0
  65. ansysem_agent_bridge-0.2.0a2/tests/test_profiles.py +124 -0
  66. ansysem_agent_bridge-0.2.0a2/tests/test_project_bundle.py +72 -0
  67. ansysem_agent_bridge-0.2.0a2/tests/test_project_create.py +109 -0
  68. ansysem_agent_bridge-0.2.0a2/tests/test_publication_boundary.py +50 -0
  69. ansysem_agent_bridge-0.2.0a2/tests/test_runtime.py +34 -0
  70. ansysem_agent_bridge-0.2.0a2/tests/test_runtime_adapter_service.py +314 -0
  71. ansysem_agent_bridge-0.2.0a2/tests/test_schemas.py +127 -0
  72. ansysem_agent_bridge-0.2.0a2/tests/test_skill_installer.py +46 -0
  73. ansysem_agent_bridge-0.2.0a2/tests/test_transaction.py +212 -0
  74. ansysem_agent_bridge-0.2.0a2/tests/test_workspace.py +508 -0
  75. ansysem_agent_bridge-0.2.0a2/uv.lock +504 -0
@@ -0,0 +1,26 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ test:
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.10", "3.12", "3.13"]
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
18
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
19
+ with:
20
+ python-version: ${{ matrix.python-version }}
21
+ - run: python -m pip install --upgrade pip
22
+ - run: python -m pip install -e ".[test]"
23
+ - run: ruff check .
24
+ - run: ruff format --check .
25
+ - run: python -m pytest
26
+ - run: python -m pip wheel --no-deps . --wheel-dir dist
@@ -0,0 +1,98 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+ inputs:
8
+ tag:
9
+ description: Existing release tag to publish
10
+ required: true
11
+ default: v0.2.0a2
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ build:
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
21
+ with:
22
+ ref: ${{ github.event.release.tag_name || inputs.tag }}
23
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
24
+ with:
25
+ python-version: "3.13"
26
+ - name: Verify tag matches package version
27
+ env:
28
+ RELEASE_TAG: ${{ github.event.release.tag_name || inputs.tag }}
29
+ run: |
30
+ PACKAGE_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
31
+ test "$RELEASE_TAG" = "v$PACKAGE_VERSION"
32
+ - run: python -m pip install --upgrade pip build twine
33
+ - run: python -m pip install -e ".[test]"
34
+ - run: python -m pytest
35
+ - run: ruff check .
36
+ - run: ruff format --check .
37
+ - run: python -m build
38
+ - run: python -m twine check dist/*
39
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.0
40
+ with:
41
+ name: python-package-distributions
42
+ path: dist/
43
+ if-no-files-found: error
44
+ retention-days: 7
45
+
46
+ publish_pypi:
47
+ needs: build
48
+ runs-on: ubuntu-latest
49
+ environment:
50
+ name: pypi
51
+ url: https://pypi.org/p/ansysem-agent-bridge
52
+ permissions:
53
+ id-token: write
54
+ steps:
55
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.0
56
+ with:
57
+ name: python-package-distributions
58
+ path: dist/
59
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
60
+
61
+ publish_github:
62
+ if: github.event_name == 'release'
63
+ needs: build
64
+ runs-on: ubuntu-latest
65
+ permissions:
66
+ contents: write
67
+ steps:
68
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.0
69
+ with:
70
+ name: python-package-distributions
71
+ path: dist/
72
+ - name: Upload the same distributions to the GitHub release
73
+ env:
74
+ GH_TOKEN: ${{ github.token }}
75
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
76
+ run: gh release upload "$RELEASE_TAG" dist/* --repo "$GITHUB_REPOSITORY"
77
+
78
+ verify_release:
79
+ needs: [build, publish_pypi]
80
+ runs-on: ubuntu-latest
81
+ steps:
82
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
83
+ with:
84
+ python-version: "3.13"
85
+ - name: Install the exact published version
86
+ env:
87
+ RELEASE_TAG: ${{ github.event.release.tag_name || inputs.tag }}
88
+ run: |
89
+ VERSION=${RELEASE_TAG#v}
90
+ for attempt in 1 2 3 4 5 6; do
91
+ if python -m pip install --no-cache-dir "ansysem-agent-bridge==$VERSION"; then
92
+ ansysem-agent --help >/dev/null
93
+ python -c "import ansysem_agent_bridge, eda_bridge_runtime; assert ansysem_agent_bridge.__version__ == '$VERSION'; assert eda_bridge_runtime.__version__ == '0.1.0a5'"
94
+ exit 0
95
+ fi
96
+ sleep 10
97
+ done
98
+ exit 1
@@ -0,0 +1,17 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .coverage
7
+ coverage.xml
8
+ dist/
9
+ build/
10
+ .venv/
11
+ .codex_tmp/
12
+ .ansysem-agent/
13
+ *.aedt
14
+ *.aedt.lock
15
+ *.aedb/
16
+ *.aedtz
17
+ *.log
@@ -0,0 +1,17 @@
1
+ # Contributing
2
+
3
+ Keep changes small, testable, and within the public product boundary. Do not
4
+ commit customer data, vendor documentation, private indexes, credentials,
5
+ private infrastructure paths, or generated AEDT projects.
6
+
7
+ Before opening a pull request, run:
8
+
9
+ ```text
10
+ python -m pytest
11
+ python -m build
12
+ ```
13
+
14
+ New runtime claims require a version-specific capability probe, a bounded
15
+ semantic operation, independent readback, and an update to the capability
16
+ matrix. A failed exploratory script is not evidence that an AEDT capability is
17
+ absent.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 AnsysEM Agent Bridge contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,353 @@
1
+ Metadata-Version: 2.5
2
+ Name: ansysem-agent-bridge
3
+ Version: 0.2.0a2
4
+ Summary: Unofficial local-first agent bridge for Ansys Electronics Desktop
5
+ Project-URL: Homepage, https://github.com/cottman99/ansysem-agent-bridge
6
+ Project-URL: Repository, https://github.com/cottman99/ansysem-agent-bridge
7
+ Project-URL: Issues, https://github.com/cottman99/ansysem-agent-bridge/issues
8
+ Author: AnsysEM Agent Bridge contributors
9
+ License: MIT License
10
+
11
+ Copyright (c) 2026 AnsysEM Agent Bridge contributors
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining a copy
14
+ of this software and associated documentation files (the "Software"), to deal
15
+ in the Software without restriction, including without limitation the rights
16
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the Software is
18
+ furnished to do so, subject to the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be included in all
21
+ copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
+ SOFTWARE.
30
+ License-File: LICENSE
31
+ Keywords: aedt,ansys,automation,eda,hfss,pyaedt,pyedb
32
+ Classifier: Development Status :: 3 - Alpha
33
+ Classifier: License :: OSI Approved :: MIT License
34
+ Classifier: Operating System :: Microsoft :: Windows
35
+ Classifier: Operating System :: POSIX :: Linux
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3.10
38
+ Classifier: Programming Language :: Python :: 3.11
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Classifier: Programming Language :: Python :: 3.13
41
+ Requires-Python: >=3.10
42
+ Requires-Dist: eda-bridge-runtime<0.2,>=0.1.0a5
43
+ Provides-Extra: test
44
+ Requires-Dist: jsonschema<5,>=4.23; extra == 'test'
45
+ Requires-Dist: pytest<10,>=8; extra == 'test'
46
+ Requires-Dist: ruff<1,>=0.12; extra == 'test'
47
+ Description-Content-Type: text/markdown
48
+
49
+ # AnsysEM Agent Bridge
50
+
51
+ [![PyPI](https://img.shields.io/pypi/v/ansysem-agent-bridge)](https://pypi.org/project/ansysem-agent-bridge/)
52
+ [![CI](https://github.com/cottman99/ansysem-agent-bridge/actions/workflows/ci.yml/badge.svg)](https://github.com/cottman99/ansysem-agent-bridge/actions/workflows/ci.yml)
53
+
54
+ AnsysEM Agent Bridge is an unofficial, local-first documentation and
55
+ automation bridge for Ansys Electronics Desktop (AEDT). It gives a
56
+ general-purpose Agent a stable CLI for exact target identity, capability
57
+ discovery, project-bundle checks, bounded live HFSS 3D Layout readback, typed
58
+ non-overwriting mutations, local documentation retrieval, and evidence-bearing
59
+ artifacts.
60
+
61
+ > Alpha software. It is not affiliated with or endorsed by Ansys, Inc. Ansys,
62
+ > AEDT, HFSS, Maxwell, Q3D, and related names are trademarks of their respective
63
+ > owners.
64
+
65
+ ![Abstract visualization of an Agent connected through a bounded local bridge to an electromagnetic design environment](docs/assets/ansysem-agent-bridge-hero.png)
66
+
67
+ ## Why a Bridge
68
+
69
+ EDA automation fails when an Agent must guess the active project, API version,
70
+ object-ID domain, execution lane, or whether a visible result reached the
71
+ solver. The Bridge turns those implicit assumptions into machine-readable
72
+ contracts:
73
+
74
+ ```text
75
+ User goal
76
+
77
+ Agent + one required Bridge Skill
78
+
79
+ target identity + capability state + bounded operation
80
+
81
+ PyAEDT / PyEDB / native AEDT adapter
82
+
83
+ readback + artifact hash + explicit evidence boundary
84
+ ```
85
+
86
+ The Bridge owns runtime facts and bounded tool access. A future Harness may
87
+ compose it with workflows, authorization, engineering memory, and promotion
88
+ policy without duplicating the Bridge transport or AEDT adapters.
89
+
90
+ ## Current alpha surface
91
+
92
+ - explicit AEDT installation configuration and discovery;
93
+ - `.aedt` plus `.aedb/edb.def` project-bundle verification;
94
+ - revision-aware compact runtime snapshots;
95
+ - capability descriptors separating declared, compatible, available, healthy,
96
+ and authorized state;
97
+ - bounded live HFSS 3D Layout identity readback through PyAEDT;
98
+ - native `ZoomToFit` plus `ExportImage` behind a checked image-export command;
99
+ - named runtime profiles for the exact Python, display, module paths, and
100
+ bounded environment changes;
101
+ - non-overwriting HFSS 3D Layout transactions with registered native and
102
+ PyEDB bondwire operations, save/close, fresh reopen, and assertions;
103
+ - resumable candidate workspaces with idempotent typed patches, internal
104
+ checkpoints, rollback, abort, and clean-replay promotion;
105
+ - detached durable jobs with reconnectable receipts, events, and unified
106
+ execution-ledger timing across local and persistent SSH transport;
107
+ - a lightweight AEDT Automation-tab Context Add-in using secret-free
108
+ `EDA_CONTEXT/v1` locators;
109
+ - private local documentation query/get commands;
110
+ - one required Bridge Skill and one optional documentation Skill;
111
+ - conflict-safe Skill install, status, and uninstall.
112
+
113
+ See the [capability matrix](docs/CAPABILITY_MATRIX.md) for exact claims and stop
114
+ rules.
115
+
116
+ ## Install
117
+
118
+ ```console
119
+ pipx install ansysem-agent-bridge
120
+ ansysem-agent --pretty doctor
121
+ ```
122
+
123
+ Installing `ansysem-agent-bridge` also installs the small
124
+ `eda-bridge-runtime` Python library automatically. This makes
125
+ `ansysem-agent runtime serve` and the Context Add-in available without asking
126
+ the user to choose an extra package. If the Agent runs on another machine,
127
+ install and enable the Runtime MCP/plugin on that Agent host as described by
128
+ the [EDA Bridge Runtime](https://github.com/cottman99/eda-bridge-runtime); the
129
+ AEDT-only host does not need the Agent-facing plugin.
130
+
131
+ Configure one explicit installation. Documentation is optional and remains on
132
+ the AEDT host:
133
+
134
+ ```console
135
+ ansysem-agent --pretty setup \
136
+ --aedt-root /path/to/AnsysEM/v261 \
137
+ --version 2026.1 \
138
+ --docs-root /path/to/private/local/docs
139
+ ```
140
+
141
+ `setup` installs one small Bridge Skill by default:
142
+
143
+ - `ansysem-agent-bridge` for setup, exact target identity, runtime state,
144
+ bounded operation, artifacts, and safe lifecycle;
145
+
146
+ The separately selectable `ansysem-kb-docs` Skill supports version-matched
147
+ local documentation without launching or mutating AEDT; it is not required for
148
+ runtime operation.
149
+
150
+ ## Pin one runtime profile
151
+
152
+ Do this once on the AEDT host. Before importing live AEDT libraries, the Bridge
153
+ re-executes only its own fixed CLI under the profile's exact Python and
154
+ pre-launch environment; it never accepts an arbitrary command:
155
+
156
+ ```console
157
+ ansysem-agent --pretty profiles set \
158
+ --profile-id aedt-2026r1-display4 \
159
+ --python /path/to/exact/python \
160
+ --display :4.0 \
161
+ --python-path /path/to/version-matched/modules \
162
+ --prepend-env LD_LIBRARY_PATH=/path/to/version-matched/libraries
163
+
164
+ ansysem-agent --pretty profiles show aedt-2026r1-display4
165
+ ```
166
+
167
+ ## Inspect before live work
168
+
169
+ ```console
170
+ ansysem-agent --pretty instances list
171
+ ansysem-agent --pretty project inspect --project /path/to/model.aedt
172
+ ansysem-agent --pretty capabilities --project /path/to/model.aedt
173
+ ansysem-agent --pretty runtime-snapshot \
174
+ --project /path/to/model.aedt --version 2026.1 --display :4.0
175
+ ```
176
+
177
+ Suppress unchanged bounded state with the returned revision:
178
+
179
+ ```console
180
+ ansysem-agent runtime-snapshot \
181
+ --project /path/to/model.aedt \
182
+ --since-revision <sha256>
183
+ ```
184
+
185
+ ## Live HFSS 3D Layout gate
186
+
187
+ Run the CLI on the AEDT host. A new session is closed only when the command
188
+ created it:
189
+
190
+ ```console
191
+ ansysem-agent --pretty --profile aedt-2026r1-display4 \
192
+ runtime-snapshot \
193
+ --live --project /path/to/model.aedt --version 2026.1
194
+ ```
195
+
196
+ Export a bounded visual artifact through the native editor API:
197
+
198
+ ```console
199
+ ansysem-agent --pretty --profile aedt-2026r1-display4 \
200
+ layout export-image \
201
+ --project /path/to/model.aedt \
202
+ --version 2026.1 \
203
+ --output /path/to/new-layout-view.png
204
+ ```
205
+
206
+ The image proves only that AEDT exported the named live editor state. It does
207
+ not prove electrical correctness, solver input, mesh, convergence, or results.
208
+
209
+ ## Typed mutation paths
210
+
211
+ Put task-specific names and values in project-local or streamed JSON, not in the
212
+ Bridge or its Skill. Use one-shot `model apply` when the complete mutation and
213
+ its final assertions are already known:
214
+
215
+ ```console
216
+ ansysem-agent --pretty --profile aedt-2026r1-display4 \
217
+ model apply --plan /path/to/operation-plan.json --redact-paths
218
+ ```
219
+
220
+ The v1 plan schema is
221
+ [`ansysem-operation-plan-v1`](docs/schemas/ansysem-operation-plan-v1.schema.json).
222
+ The Bridge refuses source/output identity, refuses an existing output, can pin
223
+ the source `.aedt` and `edb.def` hashes, and exposes no arbitrary command,
224
+ Python, or raw APD block field. The native adapter accepts registered property
225
+ and gap-port operations. The PyEDB-native adapter accepts only structured APD
226
+ profile definitions and exact-name bondwire changes. It commits the output
227
+ only after separate fresh AEDT and PyEDB reopens pass all typed assertions. It
228
+ never solves, packages, publishes, or creates a release as part of this
229
+ command.
230
+
231
+ For iterative work, begin one candidate workspace for the task instead of
232
+ creating a permanent model version for every attempt:
233
+
234
+ ```console
235
+ ansysem-agent --pretty --profile aedt-2026r1-display4 \
236
+ model workspace begin \
237
+ --source /path/to/frozen.aedt \
238
+ --workspace /path/to/task-candidate \
239
+ --adapter hfss3dlayout.pyedb-native/v1 \
240
+ --version 2026.1 --design Layout1
241
+
242
+ ansysem-agent --pretty --profile aedt-2026r1-display4 \
243
+ model workspace reconcile \
244
+ --workspace /path/to/task-candidate --plan - < patch.json
245
+ ```
246
+
247
+ Each `ansysem-workspace-patch/v1` carries a stable `patch_id`, the last returned
248
+ `expected_workspace_revision`, registered operations, and scoped assertions.
249
+ An identical retry is preserved without another EDA call. A passing reconcile
250
+ creates only an internal checkpoint. Use `status`, `rollback`, or `abort` on the
251
+ same workspace; none creates a customer-facing model revision.
252
+
253
+ Batch all compatible edits known from the same observation into one patch so a
254
+ single save/close/fresh-reopen gate validates the cycle. Promotion records its
255
+ intent before launching EDA: after interruption, the exact same request either
256
+ verifies an already-complete output or safely removes only its owned partial
257
+ output and staging directory before replaying.
258
+
259
+ Create one immutable output only at the explicit gate:
260
+
261
+ ```console
262
+ ansysem-agent --pretty --profile aedt-2026r1-display4 \
263
+ model workspace promote \
264
+ --workspace /path/to/task-candidate \
265
+ --expected-revision <workspace-revision> \
266
+ --promotion-id <stable-promotion-id> \
267
+ --output /path/to/revision.aedt
268
+ ```
269
+
270
+ Promotion ignores the mutable candidate as a delivery source. It replays the
271
+ typed journal from the frozen source, performs the final assertion registry in
272
+ fresh sessions, verifies full bundle digests, and only then commits the output.
273
+ An exact retry of a committed promotion returns `preserved` without another EDA
274
+ call; output or retention-policy drift is rejected.
275
+ See [candidate workspace lifecycle](docs/WORKSPACE_LIFECYCLE.md).
276
+
277
+ ## Documentation
278
+
279
+ ```console
280
+ ansysem-agent --pretty docs status
281
+ ansysem-agent --pretty docs query "AddRefPortUsingEdges" \
282
+ --module hfss_3d_layout --limit 6
283
+ ansysem-agent --pretty docs get <source-ref> \
284
+ --focus "AddRefPortUsingEdges" --max-chars 4000
285
+ ```
286
+
287
+ The package does not contain or redistribute Ansys documentation. Queries use
288
+ a corpus configured on the user's machine.
289
+
290
+ ## Remote topology
291
+
292
+ Run `ansysem-agent` on the AEDT machine through SSH. One-off administration can
293
+ still call the CLI directly. Repeated Agent operations use one persistent stdio
294
+ channel:
295
+
296
+ ```console
297
+ ansysem-agent runtime serve
298
+ ```
299
+
300
+ The service persists a job before starting the exact runtime-profile worker,
301
+ returns a receipt immediately, and detaches the worker from the SSH connection.
302
+ Use `runtime job-status` and `runtime job-events` after reconnecting. The generic
303
+ Runtime ledger records declared purpose, actual phases, timing, and normalized
304
+ result. Keep AEDT automation, projects, documentation, and artifacts on that
305
+ host unless the user explicitly exports a sanitized result.
306
+
307
+ ## Explicit AEDT context
308
+
309
+ Install the three small Automation-tab actions with the configured PyAEDT
310
+ profile:
311
+
312
+ ```console
313
+ ansysem-agent --profile <profile-id> context-addin install \
314
+ --version 2026.1 --port <grpc-port> --process-id <aedt-pid>
315
+ ansysem-agent context-addin status --personal-lib <live-personal-lib>
316
+ ansysem-agent --profile <profile-id> context-addin refresh \
317
+ --version <version> --port <grpc-port> --process-id <aedt-pid>
318
+ ```
319
+
320
+ The actions are **Use Current Design with Agent**, **Copy Agent Context**, and
321
+ **Agent Connection Status**. The clipboard token contains only a host-local
322
+ context ID, generation, display label, and capability hints. The exact project
323
+ path remains in the private registry on the AEDT host. A context selects a
324
+ target; it does not authorize mutation or solving.
325
+
326
+ ## Safety boundary
327
+
328
+ - no implicit newest-version selection;
329
+ - no foreground-window guessing;
330
+ - no `.aedt`-only claim for HFSS 3D Layout bundles;
331
+ - no arbitrary Python execution in the default public interface;
332
+ - no source overwrite and no successful mutation claim before fresh reopen;
333
+ - no permanent model version for a candidate attempt; only explicit promotion
334
+ creates a delivery output;
335
+ - no blind GUI coordinates or screenshot-only success;
336
+ - no force-kill or silent discard of modified work;
337
+ - no claim that documentation, a visible object, or an exported image proves a
338
+ successful solve.
339
+
340
+ See [the execution context contract](docs/EXECUTION_CONTEXT_CONTRACT.md),
341
+ [architecture](docs/ARCHITECTURE.md), [release contract](docs/RELEASE_CONTRACT.md),
342
+ [sanitized AEDT 2026 R1 Linux acceptance](docs/VALIDATION_AEDT_2026R1_LINUX.md),
343
+ and [security policy](SECURITY.md).
344
+
345
+ ## Development
346
+
347
+ ```console
348
+ python -m pip install -e ".[test]"
349
+ python -m pytest
350
+ ```
351
+
352
+ The public repository contains synthetic tests only. Customer projects and
353
+ vendor documentation are intentionally excluded.