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.
- omnigent_rovo-0.1.0/.github/workflows/ci.yml +35 -0
- omnigent_rovo-0.1.0/.github/workflows/publish.yml +23 -0
- omnigent_rovo-0.1.0/.gitignore +13 -0
- omnigent_rovo-0.1.0/.idea/.gitignore +10 -0
- omnigent_rovo-0.1.0/.idea/inspectionProfiles/Project_Default.xml +6 -0
- omnigent_rovo-0.1.0/.idea/inspectionProfiles/profiles_settings.xml +6 -0
- omnigent_rovo-0.1.0/.idea/modules.xml +8 -0
- omnigent_rovo-0.1.0/.idea/omnigent-rovo.iml +8 -0
- omnigent_rovo-0.1.0/.idea/vcs.xml +6 -0
- omnigent_rovo-0.1.0/.idea/workspace.xml +10 -0
- omnigent_rovo-0.1.0/LICENSE +21 -0
- omnigent_rovo-0.1.0/PKG-INFO +231 -0
- omnigent_rovo-0.1.0/README.md +207 -0
- omnigent_rovo-0.1.0/omnigent/__init__.py +4 -0
- omnigent_rovo-0.1.0/omnigent/community/__init__.py +1 -0
- omnigent_rovo-0.1.0/omnigent/community/harness/__init__.py +1 -0
- omnigent_rovo-0.1.0/omnigent/community/harness/rovo/__init__.py +1 -0
- omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/__init__.py +1 -0
- omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/rovo_acp.py +384 -0
- omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/rovo_executor.py +383 -0
- omnigent_rovo-0.1.0/omnigent/community/harness/rovo/inner/rovo_harness.py +69 -0
- omnigent_rovo-0.1.0/omnigent/community/harness/rovo/plugin.py +60 -0
- omnigent_rovo-0.1.0/pyproject.toml +57 -0
- omnigent_rovo-0.1.0/tests/__init__.py +0 -0
- omnigent_rovo-0.1.0/tests/conftest.py +228 -0
- omnigent_rovo-0.1.0/tests/test_acp_client.py +341 -0
- omnigent_rovo-0.1.0/tests/test_plugin.py +57 -0
- omnigent_rovo-0.1.0/tests/test_rovo_executor.py +509 -0
- 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,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,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 @@
|
|
|
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.
|