diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e884fd5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,28 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: read + +jobs: + test: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: pip + cache-dependency-path: requirements-dev.txt + - run: python -m pip install -r requirements-dev.txt + - run: ruff check . + - run: ruff format --check . + - run: pytest -q diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f5ad355 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 RomeoRaven + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PROTO.md b/PROTO.md index 6ae0e7d..e50255e 100644 --- a/PROTO.md +++ b/PROTO.md @@ -15,7 +15,7 @@ Do not add fleet writes, config mutation, process control, consent execution, br ## Runtime shape - Python 3.11+ -- Host-provided `langchain-core` and `httpx` +- Host-provided `langchain-core`; manifest-declared host dependency `httpx` - External plugin entry: `register(registry)` in root `__init__.py` - Manifest/config owner: `protoagent.plugin.yaml`, section `operator_control` - Ships disabled; enablement is the operator's trust decision @@ -77,6 +77,7 @@ Run the suite standalone. For host integration, load the plugin through the curr - Use RED → GREEN → REFACTOR for behavior changes. - Keep host imports out of module top level except host-provided runtime libraries. +- Declare every non-host runtime dependency in `protoagent.plugin.yaml` with the interpreter scope where the plugin imports it. - Keep `pyproject.toml` and manifest versions in lockstep. - Prefer composing stable public protoAgent surfaces over importing core implementation modules. - Do not add target selection as a tool argument; changing the configured fleet is an operator decision. diff --git a/README.md b/README.md index 7338770..06a27b5 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,13 @@ pytest -q ``` See `PROTO.md` for architecture and safety boundaries. + +## Platform evidence + +GitHub Actions runs lint, formatting, and the standalone test suite on Linux, +native Windows, and macOS. This is source/CI evidence, not a tagged release or +installed-runtime acceptance claim. + +## License + +[MIT](LICENSE) diff --git a/protoagent.plugin.yaml b/protoagent.plugin.yaml index 5c26c46..3fb1095 100644 --- a/protoagent.plugin.yaml +++ b/protoagent.plugin.yaml @@ -6,7 +6,11 @@ description: >- performs GET-only health and runtime-status reads concurrently, isolates target failures, and returns deterministic secret-free evidence for target readiness, version skew, and incomplete plugin configuration. +repository: https://github.com/RomeoRaven/operator-plugin +homepage: https://agent.protolabs.studio enabled: false +requires_pip: + - { pkg: "httpx>=0.27,<1", scope: host } config_section: operator_control config: targets: [] diff --git a/tests/test_packaging.py b/tests/test_packaging.py index 2a57a7a..e898bd0 100644 --- a/tests/test_packaging.py +++ b/tests/test_packaging.py @@ -20,11 +20,27 @@ def test_manifest_and_project_are_safe_and_version_locked(): assert manifest["config"]["target_tokens"] == "" assert manifest["secrets"] == ["target_tokens"] assert manifest["capabilities"]["filesystem"] == "none" + assert manifest["repository"] == "https://github.com/RomeoRaven/operator-plugin" + assert manifest["homepage"] == "https://agent.protolabs.studio" + assert manifest["requires_pip"] == [{"pkg": "httpx>=0.27,<1", "scope": "host"}] settings = {field["key"]: field for field in manifest["settings"]} assert settings["targets"]["type"] == "string_list" assert settings["target_tokens"]["type"] == "secret" assert settings["timeout_seconds"]["type"] == "number" assert project["version"] == manifest["version"] == "0.5.0" + license_text = (ROOT / "LICENSE").read_text() + assert license_text.startswith("MIT License\n") + assert "Copyright (c) 2026 RomeoRaven" in license_text + + +def test_ci_covers_declared_platforms(): + workflow = (ROOT / ".github" / "workflows" / "ci.yml").read_text() + + for runner in ("ubuntu-latest", "windows-latest", "macos-latest"): + assert runner in workflow + assert "pytest -q" in workflow + assert "ruff check ." in workflow + assert "ruff format --check ." in workflow def test_entry_imports_with_protoagent_host_package_semantics(monkeypatch):