omnigent-rovo 0.1.0__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 (29) hide show
  1. omnigent_rovo-0.1.0/.github/workflows/ci.yml +35 -0
  2. omnigent_rovo-0.1.0/.github/workflows/publish.yml +23 -0
  3. omnigent_rovo-0.1.0/.gitignore +13 -0
  4. omnigent_rovo-0.1.0/.idea/.gitignore +10 -0
  5. omnigent_rovo-0.1.0/.idea/inspectionProfiles/Project_Default.xml +6 -0
  6. omnigent_rovo-0.1.0/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  7. omnigent_rovo-0.1.0/.idea/modules.xml +8 -0
  8. omnigent_rovo-0.1.0/.idea/omnigent-rovo.iml +8 -0
  9. omnigent_rovo-0.1.0/.idea/vcs.xml +6 -0
  10. omnigent_rovo-0.1.0/.idea/workspace.xml +10 -0
  11. omnigent_rovo-0.1.0/LICENSE +21 -0
  12. omnigent_rovo-0.1.0/PKG-INFO +231 -0
  13. omnigent_rovo-0.1.0/README.md +207 -0
  14. omnigent_rovo-0.1.0/omnigent/__init__.py +4 -0
  15. omnigent_rovo-0.1.0/omnigent/community/__init__.py +1 -0
  16. omnigent_rovo-0.1.0/omnigent/community/harness/__init__.py +1 -0
  17. omnigent_rovo-0.1.0/omnigent/community/harness/rovo/__init__.py +1 -0
  18. omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/__init__.py +1 -0
  19. omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/rovo_acp.py +384 -0
  20. omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/rovo_executor.py +383 -0
  21. omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/rovo_harness.py +69 -0
  22. omnigent_rovo-0.1.0/omnigent/community/harness/rovo/plugin.py +60 -0
  23. omnigent_rovo-0.1.0/pyproject.toml +57 -0
  24. omnigent_rovo-0.1.0/tests/__init__.py +0 -0
  25. omnigent_rovo-0.1.0/tests/conftest.py +228 -0
  26. omnigent_rovo-0.1.0/tests/test_acp_client.py +341 -0
  27. omnigent_rovo-0.1.0/tests/test_plugin.py +57 -0
  28. omnigent_rovo-0.1.0/tests/test_rovo_executor.py +509 -0
  29. omnigent_rovo-0.1.0/tests/test_rovo_harness.py +58 -0
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: actions/setup-python@v5
15
+ with:
16
+ python-version: "3.13"
17
+ - run: pip install ruff
18
+ - run: ruff check .
19
+ - run: ruff format --check .
20
+
21
+ test:
22
+ runs-on: ubuntu-latest
23
+ strategy:
24
+ matrix:
25
+ python-version: ["3.11", "3.12", "3.13"]
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-python@v5
29
+ with:
30
+ python-version: ${{ matrix.python-version }}
31
+ - name: Install dependencies
32
+ run: |
33
+ pip install -e ".[dev]"
34
+ - name: Run tests
35
+ run: pytest -v
@@ -0,0 +1,23 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ publish:
9
+ runs-on: ubuntu-latest
10
+ environment: pypi
11
+ permissions:
12
+ id-token: write
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.13"
18
+ - name: Install build tools
19
+ run: pip install build
20
+ - name: Build package
21
+ run: python -m build
22
+ - name: Publish to PyPI
23
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,13 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .eggs/
7
+ *.egg
8
+ .venv/
9
+ .env
10
+ *.so
11
+ .pytest_cache/
12
+ .mypy_cache/
13
+ .ruff_cache/
@@ -0,0 +1,10 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Ignored default folder with query files
7
+ /queries/
8
+ # Datasource local storage ignored files
9
+ /dataSources/
10
+ /dataSources.local.xml
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ </profile>
6
+ </component>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/omnigent-rovo.iml" filepath="$PROJECT_DIR$/.idea/omnigent-rovo.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="inheritedJdk" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ </module>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectViewState">
4
+ <option name="autoscrollFromSource" value="true" />
5
+ <option name="autoscrollToSource" value="true" />
6
+ <option name="hideEmptyMiddlePackages" value="true" />
7
+ <option name="showLibraryContents" value="true" />
8
+ </component>
9
+ <component name="PropertiesComponent">{}</component>
10
+ </project>
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Shubham Raizada
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,231 @@
1
+ Metadata-Version: 2.4
2
+ Name: omnigent-rovo
3
+ Version: 0.1.0
4
+ Summary: Rovo Dev harness plugin for Omnigent — drives Atlassian Rovo Dev via its ACP server.
5
+ Project-URL: Homepage, https://github.com/shbhmrzd/omnigent-rovo
6
+ Project-URL: Repository, https://github.com/shbhmrzd/omnigent-rovo
7
+ Author: Shubham Raizada
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: acp,atlassian,harness,omnigent,rovo
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: omnigent>=0.4.0
19
+ Provides-Extra: dev
20
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
21
+ Requires-Dist: pytest>=8.0; extra == 'dev'
22
+ Requires-Dist: ruff>=0.9; extra == 'dev'
23
+ Description-Content-Type: text/markdown
24
+
25
+ # omnigent-rovo
26
+
27
+ Community harness plugin that brings [Atlassian Rovo Dev](https://support.atlassian.com/rovo/docs/use-rovo-dev-cli/) to [Omnigent](https://github.com/omnigent-ai/omnigent) as a first-class harness.
28
+
29
+ Rovo Dev is an AI-powered development agent that runs in your terminal via the [Atlassian CLI (`acli`)](https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/). It can generate, review, and refactor code, analyze codebases, write documentation, debug issues, create tests, and integrates with Jira and Confluence — all from the command line.
30
+
31
+ This plugin drives Rovo Dev via its **ACP (Agent Client Protocol)** server mode (`acli rovodev acp`) over stdio — no tmux terminal needed.
32
+
33
+ ## Quick start
34
+
35
+ ```bash
36
+ # Install both packages
37
+ uv pip install omnigent omnigent-rovo
38
+
39
+ # Or with pip
40
+ pip install omnigent omnigent-rovo
41
+ ```
42
+
43
+ Once installed, Omnigent automatically discovers the plugin and makes `rovo` available as a harness:
44
+
45
+ ```yaml
46
+ # agent.yaml
47
+ harness: rovo
48
+ ```
49
+
50
+ ## Verifying the installation
51
+
52
+ After installing both packages, confirm the plugin is detected:
53
+
54
+ ```bash
55
+ python -c "
56
+ from omnigent.harness_plugins import plugin_state, harness_aliases, harness_labels
57
+ state = plugin_state()
58
+ print('Contributions:', [c.name for c in state.contributions])
59
+ print('rovo alias:', harness_aliases().get('rovo'))
60
+ print('Label:', harness_labels().get('rovo-cli'))
61
+ "
62
+ ```
63
+
64
+ Expected output:
65
+
66
+ ```
67
+ Contributions: ['omnigent', 'omnigent-rovo']
68
+ rovo alias: rovo-cli
69
+ Label: Rovo Dev
70
+ ```
71
+
72
+ If `omnigent-rovo` does not appear in the list, make sure both packages are installed in the same Python environment.
73
+
74
+ ## Prerequisites
75
+
76
+ 1. **Rovo Dev subscription** — Rovo Dev CLI requires a paid [Rovo Dev Standard](https://www.atlassian.com/software/rovo-dev) subscription (not available during trial)
77
+ 2. **Atlassian CLI (`acli`)** — install or update to the latest version following the [official setup guide](https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/) for your OS (macOS, Linux, or Windows)
78
+ 3. **Authenticate** — run `acli rovodev auth login` and complete the browser flow (or use a [scoped API token](https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/))
79
+ 4. **Verify** — run `acli rovodev auth status` to confirm you're logged in
80
+
81
+ > 📖 For full usage documentation, see [Use Rovo Dev CLI](https://support.atlassian.com/rovo/docs/use-rovo-dev-cli/) and [Rovo Dev CLI commands](https://support.atlassian.com/rovo/docs/rovo-dev-cli-commands/).
82
+
83
+ ## Configuration
84
+
85
+ The harness reads configuration from environment variables (set automatically by the Omnigent runner, or manually for standalone use):
86
+
87
+ | Variable | Description | Default |
88
+ |---|---|---|
89
+ | `HARNESS_ROVO_MODEL` | Model display name, e.g. `"Claude Sonnet 4.6"` | Rovo's default |
90
+ | `HARNESS_ROVO_CWD` | Working directory for the Rovo Dev subprocess | Current directory |
91
+ | `HARNESS_ROVO_ACLI_PATH` | Absolute path to the `acli` binary | `acli` from `PATH` |
92
+ | `HARNESS_ROVO_CONFIG_FILE` | Rovo Dev `--config-file` path | `~/.rovodev/config.yml` |
93
+ | `HARNESS_ROVO_SITE_URL` | Rovo Dev `--site-url` value | None |
94
+
95
+ > See [Manage Rovo Dev CLI settings](https://support.atlassian.com/rovo/docs/manage-rovo-dev-cli-settings/) for details on the configuration file format.
96
+
97
+ ## How it works
98
+
99
+ This plugin registers itself via Python's [entry points](https://packaging.python.org/en/latest/specifications/entry-points/) mechanism:
100
+
101
+ ```toml
102
+ # pyproject.toml
103
+ [project.entry-points."omnigent.community.harness"]
104
+ rovo = "omnigent.community.harness.rovo.plugin:get_contribution"
105
+ ```
106
+
107
+ At startup, Omnigent's plugin registry discovers all packages in the `omnigent.community.harness` entry point group and merges their contributions into the harness registry. This means:
108
+
109
+ - `rovo` and `rovo-cli` become valid harness names
110
+ - The Rovo executor and ACP client are loaded on demand
111
+ - Model overrides via `/model` work seamlessly
112
+
113
+ ## Development
114
+
115
+ ```bash
116
+ # Clone the repo
117
+ git clone https://github.com/shbhmrzd/omnigent-rovo.git
118
+ cd omnigent-rovo
119
+
120
+ # Create a virtual environment
121
+ uv venv
122
+ source .venv/bin/activate
123
+
124
+ # Install in editable mode (with omnigent as a dependency)
125
+ uv pip install -e .
126
+
127
+ # Run the test suite
128
+ uv run pytest
129
+
130
+ # Run with verbose output
131
+ uv run pytest -v
132
+ ```
133
+
134
+ ### Test structure
135
+
136
+ | Path | Covers |
137
+ |---|---|
138
+ | `tests/conftest.py` | Lightweight stubs for `omnigent` core types so tests run without the full core installed |
139
+ | `tests/test_plugin.py` | Plugin registration (`get_contribution`) |
140
+ | `tests/test_acp_client.py` | ACP client — command building, JSON-RPC dispatch, permission auto-allow |
141
+ | `tests/test_rovo_executor.py` | Executor — message parsing, update translation, session lifecycle, `run_turn` |
142
+ | `tests/test_rovo_harness.py` | Harness entry point — env var config, `create_app()` |
143
+
144
+ ## Publishing to PyPI
145
+
146
+ ### First-time setup
147
+
148
+ 1. **Create a PyPI account** at https://pypi.org/account/register/
149
+ 2. **Create an API token** at https://pypi.org/manage/account/token/
150
+ - Scope: "Entire account" (for the first upload), or project-specific after the first release
151
+ 3. **Configure your token** — create/edit `~/.pypirc`:
152
+ ```ini
153
+ [pypi]
154
+ username = __token__
155
+ password = pypi-YOUR_TOKEN_HERE
156
+ ```
157
+
158
+ ### Building and publishing
159
+
160
+ ```bash
161
+ # Install build tools
162
+ uv pip install build twine
163
+
164
+ # Build the package
165
+ python -m build
166
+
167
+ # This creates:
168
+ # dist/omnigent_rovo-0.1.0-py3-none-any.whl
169
+ # dist/omnigent_rovo-0.1.0.tar.gz
170
+
171
+ # Upload to Test PyPI first (recommended for first release)
172
+ twine upload --repository testpypi dist/*
173
+
174
+ # Verify the test release works
175
+ uv pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ omnigent-rovo
176
+
177
+ # Upload to production PyPI
178
+ twine upload dist/*
179
+ ```
180
+
181
+ ### Using a Trusted Publisher (recommended for GitHub repos)
182
+
183
+ Instead of API tokens, you can set up [Trusted Publishing](https://docs.pypi.org/trusted-publishers/) with GitHub Actions:
184
+
185
+ 1. Go to https://pypi.org/manage/account/publishing/
186
+ 2. Add a new pending publisher:
187
+ - **PyPI project name**: `omnigent-rovo`
188
+ - **Owner**: `shbhmrzd`
189
+ - **Repository**: `omnigent-rovo`
190
+ - **Workflow name**: `publish.yml`
191
+ - **Environment**: `pypi`
192
+
193
+ 3. Create `.github/workflows/publish.yml` in your repo:
194
+ ```yaml
195
+ name: Publish to PyPI
196
+
197
+ on:
198
+ release:
199
+ types: [published]
200
+
201
+ jobs:
202
+ publish:
203
+ runs-on: ubuntu-latest
204
+ environment: pypi
205
+ permissions:
206
+ id-token: write
207
+ steps:
208
+ - uses: actions/checkout@v4
209
+ - uses: actions/setup-python@v5
210
+ with:
211
+ python-version: "3.12"
212
+ - run: pip install build
213
+ - run: python -m build
214
+ - uses: pypa/gh-action-pypi-publish@release/v1
215
+ ```
216
+
217
+ 4. Create a GitHub release → the workflow auto-publishes to PyPI.
218
+
219
+ ### Version bumps
220
+
221
+ Update the version in `pyproject.toml`:
222
+ ```toml
223
+ [project]
224
+ version = "0.2.0"
225
+ ```
226
+
227
+ Then build and publish as above.
228
+
229
+ ## License
230
+
231
+ MIT
@@ -0,0 +1,207 @@
1
+ # omnigent-rovo
2
+
3
+ Community harness plugin that brings [Atlassian Rovo Dev](https://support.atlassian.com/rovo/docs/use-rovo-dev-cli/) to [Omnigent](https://github.com/omnigent-ai/omnigent) as a first-class harness.
4
+
5
+ Rovo Dev is an AI-powered development agent that runs in your terminal via the [Atlassian CLI (`acli`)](https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/). It can generate, review, and refactor code, analyze codebases, write documentation, debug issues, create tests, and integrates with Jira and Confluence — all from the command line.
6
+
7
+ This plugin drives Rovo Dev via its **ACP (Agent Client Protocol)** server mode (`acli rovodev acp`) over stdio — no tmux terminal needed.
8
+
9
+ ## Quick start
10
+
11
+ ```bash
12
+ # Install both packages
13
+ uv pip install omnigent omnigent-rovo
14
+
15
+ # Or with pip
16
+ pip install omnigent omnigent-rovo
17
+ ```
18
+
19
+ Once installed, Omnigent automatically discovers the plugin and makes `rovo` available as a harness:
20
+
21
+ ```yaml
22
+ # agent.yaml
23
+ harness: rovo
24
+ ```
25
+
26
+ ## Verifying the installation
27
+
28
+ After installing both packages, confirm the plugin is detected:
29
+
30
+ ```bash
31
+ python -c "
32
+ from omnigent.harness_plugins import plugin_state, harness_aliases, harness_labels
33
+ state = plugin_state()
34
+ print('Contributions:', [c.name for c in state.contributions])
35
+ print('rovo alias:', harness_aliases().get('rovo'))
36
+ print('Label:', harness_labels().get('rovo-cli'))
37
+ "
38
+ ```
39
+
40
+ Expected output:
41
+
42
+ ```
43
+ Contributions: ['omnigent', 'omnigent-rovo']
44
+ rovo alias: rovo-cli
45
+ Label: Rovo Dev
46
+ ```
47
+
48
+ If `omnigent-rovo` does not appear in the list, make sure both packages are installed in the same Python environment.
49
+
50
+ ## Prerequisites
51
+
52
+ 1. **Rovo Dev subscription** — Rovo Dev CLI requires a paid [Rovo Dev Standard](https://www.atlassian.com/software/rovo-dev) subscription (not available during trial)
53
+ 2. **Atlassian CLI (`acli`)** — install or update to the latest version following the [official setup guide](https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/) for your OS (macOS, Linux, or Windows)
54
+ 3. **Authenticate** — run `acli rovodev auth login` and complete the browser flow (or use a [scoped API token](https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/))
55
+ 4. **Verify** — run `acli rovodev auth status` to confirm you're logged in
56
+
57
+ > 📖 For full usage documentation, see [Use Rovo Dev CLI](https://support.atlassian.com/rovo/docs/use-rovo-dev-cli/) and [Rovo Dev CLI commands](https://support.atlassian.com/rovo/docs/rovo-dev-cli-commands/).
58
+
59
+ ## Configuration
60
+
61
+ The harness reads configuration from environment variables (set automatically by the Omnigent runner, or manually for standalone use):
62
+
63
+ | Variable | Description | Default |
64
+ |---|---|---|
65
+ | `HARNESS_ROVO_MODEL` | Model display name, e.g. `"Claude Sonnet 4.6"` | Rovo's default |
66
+ | `HARNESS_ROVO_CWD` | Working directory for the Rovo Dev subprocess | Current directory |
67
+ | `HARNESS_ROVO_ACLI_PATH` | Absolute path to the `acli` binary | `acli` from `PATH` |
68
+ | `HARNESS_ROVO_CONFIG_FILE` | Rovo Dev `--config-file` path | `~/.rovodev/config.yml` |
69
+ | `HARNESS_ROVO_SITE_URL` | Rovo Dev `--site-url` value | None |
70
+
71
+ > See [Manage Rovo Dev CLI settings](https://support.atlassian.com/rovo/docs/manage-rovo-dev-cli-settings/) for details on the configuration file format.
72
+
73
+ ## How it works
74
+
75
+ This plugin registers itself via Python's [entry points](https://packaging.python.org/en/latest/specifications/entry-points/) mechanism:
76
+
77
+ ```toml
78
+ # pyproject.toml
79
+ [project.entry-points."omnigent.community.harness"]
80
+ rovo = "omnigent.community.harness.rovo.plugin:get_contribution"
81
+ ```
82
+
83
+ At startup, Omnigent's plugin registry discovers all packages in the `omnigent.community.harness` entry point group and merges their contributions into the harness registry. This means:
84
+
85
+ - `rovo` and `rovo-cli` become valid harness names
86
+ - The Rovo executor and ACP client are loaded on demand
87
+ - Model overrides via `/model` work seamlessly
88
+
89
+ ## Development
90
+
91
+ ```bash
92
+ # Clone the repo
93
+ git clone https://github.com/shbhmrzd/omnigent-rovo.git
94
+ cd omnigent-rovo
95
+
96
+ # Create a virtual environment
97
+ uv venv
98
+ source .venv/bin/activate
99
+
100
+ # Install in editable mode (with omnigent as a dependency)
101
+ uv pip install -e .
102
+
103
+ # Run the test suite
104
+ uv run pytest
105
+
106
+ # Run with verbose output
107
+ uv run pytest -v
108
+ ```
109
+
110
+ ### Test structure
111
+
112
+ | Path | Covers |
113
+ |---|---|
114
+ | `tests/conftest.py` | Lightweight stubs for `omnigent` core types so tests run without the full core installed |
115
+ | `tests/test_plugin.py` | Plugin registration (`get_contribution`) |
116
+ | `tests/test_acp_client.py` | ACP client — command building, JSON-RPC dispatch, permission auto-allow |
117
+ | `tests/test_rovo_executor.py` | Executor — message parsing, update translation, session lifecycle, `run_turn` |
118
+ | `tests/test_rovo_harness.py` | Harness entry point — env var config, `create_app()` |
119
+
120
+ ## Publishing to PyPI
121
+
122
+ ### First-time setup
123
+
124
+ 1. **Create a PyPI account** at https://pypi.org/account/register/
125
+ 2. **Create an API token** at https://pypi.org/manage/account/token/
126
+ - Scope: "Entire account" (for the first upload), or project-specific after the first release
127
+ 3. **Configure your token** — create/edit `~/.pypirc`:
128
+ ```ini
129
+ [pypi]
130
+ username = __token__
131
+ password = pypi-YOUR_TOKEN_HERE
132
+ ```
133
+
134
+ ### Building and publishing
135
+
136
+ ```bash
137
+ # Install build tools
138
+ uv pip install build twine
139
+
140
+ # Build the package
141
+ python -m build
142
+
143
+ # This creates:
144
+ # dist/omnigent_rovo-0.1.0-py3-none-any.whl
145
+ # dist/omnigent_rovo-0.1.0.tar.gz
146
+
147
+ # Upload to Test PyPI first (recommended for first release)
148
+ twine upload --repository testpypi dist/*
149
+
150
+ # Verify the test release works
151
+ uv pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ omnigent-rovo
152
+
153
+ # Upload to production PyPI
154
+ twine upload dist/*
155
+ ```
156
+
157
+ ### Using a Trusted Publisher (recommended for GitHub repos)
158
+
159
+ Instead of API tokens, you can set up [Trusted Publishing](https://docs.pypi.org/trusted-publishers/) with GitHub Actions:
160
+
161
+ 1. Go to https://pypi.org/manage/account/publishing/
162
+ 2. Add a new pending publisher:
163
+ - **PyPI project name**: `omnigent-rovo`
164
+ - **Owner**: `shbhmrzd`
165
+ - **Repository**: `omnigent-rovo`
166
+ - **Workflow name**: `publish.yml`
167
+ - **Environment**: `pypi`
168
+
169
+ 3. Create `.github/workflows/publish.yml` in your repo:
170
+ ```yaml
171
+ name: Publish to PyPI
172
+
173
+ on:
174
+ release:
175
+ types: [published]
176
+
177
+ jobs:
178
+ publish:
179
+ runs-on: ubuntu-latest
180
+ environment: pypi
181
+ permissions:
182
+ id-token: write
183
+ steps:
184
+ - uses: actions/checkout@v4
185
+ - uses: actions/setup-python@v5
186
+ with:
187
+ python-version: "3.12"
188
+ - run: pip install build
189
+ - run: python -m build
190
+ - uses: pypa/gh-action-pypi-publish@release/v1
191
+ ```
192
+
193
+ 4. Create a GitHub release → the workflow auto-publishes to PyPI.
194
+
195
+ ### Version bumps
196
+
197
+ Update the version in `pyproject.toml`:
198
+ ```toml
199
+ [project]
200
+ version = "0.2.0"
201
+ ```
202
+
203
+ Then build and publish as above.
204
+
205
+ ## License
206
+
207
+ MIT
@@ -0,0 +1,4 @@
1
+ # Namespace package — do not add code here.
2
+ # This file makes ``omnigent`` a regular package within the plugin so that
3
+ # ``omnigent.community.harness.rovo`` resolves correctly when both
4
+ # ``omnigent`` (core) and ``omnigent-rovo`` (this plugin) are installed.
@@ -0,0 +1 @@
1
+ # Namespace anchor — community harness plugins live under this package.
@@ -0,0 +1 @@
1
+ # Namespace anchor — each community harness is a sub-package here.
@@ -0,0 +1 @@
1
+ # omnigent-rovo: Rovo Dev harness plugin for Omnigent.
@@ -0,0 +1 @@
1
+ # Inner harness modules for the Rovo Dev community plugin.