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.
- ansysem_agent_bridge-0.2.0a2/.github/workflows/ci.yml +26 -0
- ansysem_agent_bridge-0.2.0a2/.github/workflows/publish.yml +98 -0
- ansysem_agent_bridge-0.2.0a2/.gitignore +17 -0
- ansysem_agent_bridge-0.2.0a2/CONTRIBUTING.md +17 -0
- ansysem_agent_bridge-0.2.0a2/LICENSE +21 -0
- ansysem_agent_bridge-0.2.0a2/PKG-INFO +353 -0
- ansysem_agent_bridge-0.2.0a2/README.md +305 -0
- ansysem_agent_bridge-0.2.0a2/SECURITY.md +12 -0
- ansysem_agent_bridge-0.2.0a2/docs/ARCHITECTURE.md +143 -0
- ansysem_agent_bridge-0.2.0a2/docs/CAPABILITY_MATRIX.md +26 -0
- ansysem_agent_bridge-0.2.0a2/docs/EXECUTION_CONTEXT_CONTRACT.md +85 -0
- ansysem_agent_bridge-0.2.0a2/docs/RELEASE_CONTRACT.md +38 -0
- ansysem_agent_bridge-0.2.0a2/docs/RUNTIME_AND_CONTEXT.md +58 -0
- ansysem_agent_bridge-0.2.0a2/docs/VALIDATION_AEDT_2026R1_LINUX.md +129 -0
- ansysem_agent_bridge-0.2.0a2/docs/WORKSPACE_LIFECYCLE.md +85 -0
- ansysem_agent_bridge-0.2.0a2/docs/assets/README.md +6 -0
- ansysem_agent_bridge-0.2.0a2/docs/assets/ansysem-agent-bridge-hero.png +0 -0
- ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-capability-descriptor-v1.schema.json +38 -0
- ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-operation-plan-v1.schema.json +171 -0
- ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-operation-result-v1.schema.json +19 -0
- ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-runtime-snapshot-v1.schema.json +23 -0
- ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-target-identity-v1.schema.json +23 -0
- ansysem_agent_bridge-0.2.0a2/docs/schemas/ansysem-workspace-patch-v1.schema.json +235 -0
- ansysem_agent_bridge-0.2.0a2/pyproject.toml +50 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/__init__.py +12 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/__main__.py +4 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_addin_assets/agent_connection_status.py +3 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_addin_assets/copy_agent_context.py +3 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_addin_assets/use_current_design.py +3 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/aedt_context_tool.py +239 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/capabilities.py +340 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/cli.py +602 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/config.py +90 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/context_addin.py +186 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/discovery.py +103 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/docs_backend.py +252 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/hfss3dlayout_adapter.py +357 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/hfss3dlayout_pyedb_adapter.py +671 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/live_probe.py +179 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/models.py +92 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/operations.py +67 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/profiles.py +150 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/project_bundle.py +196 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/project_create.py +114 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/runtime.py +67 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/runtime_adapter.py +528 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-agent-bridge/SKILL.md +169 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-agent-bridge/agents/openai.yaml +10 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-kb-docs/SKILL.md +64 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_assets/ansysem-kb-docs/agents/openai.yaml +10 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/skill_installer.py +259 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/transaction.py +550 -0
- ansysem_agent_bridge-0.2.0a2/src/ansysem_agent_bridge/workspace.py +1336 -0
- ansysem_agent_bridge-0.2.0a2/tests/conftest.py +6 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_capabilities.py +50 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_cli.py +98 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_context_addin.py +155 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_discovery.py +16 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_docs_backend.py +51 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_hfss3dlayout_adapter.py +81 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_hfss3dlayout_pyedb_adapter.py +124 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_live_probe.py +15 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_models.py +33 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_operations.py +44 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_profiles.py +124 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_project_bundle.py +72 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_project_create.py +109 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_publication_boundary.py +50 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_runtime.py +34 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_runtime_adapter_service.py +314 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_schemas.py +127 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_skill_installer.py +46 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_transaction.py +212 -0
- ansysem_agent_bridge-0.2.0a2/tests/test_workspace.py +508 -0
- 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
|
+
# 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
|
+
[](https://pypi.org/project/ansysem-agent-bridge/)
|
|
52
|
+
[](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
|
+

|
|
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.
|