diff --git a/.gitignore b/.gitignore index 2af45b5..8a0fcf1 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,12 @@ # Workspace auth tokens .auth-token .auth_token + +# Python build artifacts — never commit; regenerated by interpreter / pip. +__pycache__/ +*.py[cod] +*.egg-info/ +.pytest_cache/ +.ruff_cache/ +build/ +dist/ diff --git a/molecule_agent/__pycache__/__init__.cpython-313.pyc b/molecule_agent/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 3ddc6c2..0000000 Binary files a/molecule_agent/__pycache__/__init__.cpython-313.pyc and /dev/null differ diff --git a/molecule_agent/__pycache__/__main__.cpython-313.pyc b/molecule_agent/__pycache__/__main__.cpython-313.pyc deleted file mode 100644 index 2f95813..0000000 Binary files a/molecule_agent/__pycache__/__main__.cpython-313.pyc and /dev/null differ diff --git a/molecule_agent/__pycache__/a2a_server.cpython-313.pyc b/molecule_agent/__pycache__/a2a_server.cpython-313.pyc deleted file mode 100644 index 7505483..0000000 Binary files a/molecule_agent/__pycache__/a2a_server.cpython-313.pyc and /dev/null differ diff --git a/molecule_agent/__pycache__/client.cpython-313.pyc b/molecule_agent/__pycache__/client.cpython-313.pyc deleted file mode 100644 index 2622dad..0000000 Binary files a/molecule_agent/__pycache__/client.cpython-313.pyc and /dev/null differ diff --git a/molecule_agent/__pycache__/inbound.cpython-313.pyc b/molecule_agent/__pycache__/inbound.cpython-313.pyc deleted file mode 100644 index a236c10..0000000 Binary files a/molecule_agent/__pycache__/inbound.cpython-313.pyc and /dev/null differ diff --git a/molecule_ai_sdk.egg-info/PKG-INFO b/molecule_ai_sdk.egg-info/PKG-INFO deleted file mode 100644 index 55501cb..0000000 --- a/molecule_ai_sdk.egg-info/PKG-INFO +++ /dev/null @@ -1,159 +0,0 @@ -Metadata-Version: 2.4 -Name: molecule-ai-sdk -Version: 0.2.0 -Summary: Molecule AI SDK — build plugins (molecule_plugin) AND remote agents that join a Molecule AI org from another machine (molecule_agent). -Author: Molecule AI -License: MIT -Project-URL: Homepage, https://github.com/Molecule-AI/molecule-sdk-python -Project-URL: Repository, https://github.com/Molecule-AI/molecule-sdk-python -Project-URL: Documentation, https://github.com/Molecule-AI/molecule-sdk-python#readme -Keywords: agents,ai,multi-agent,a2a,plugins,saas,remote-agent -Classifier: Development Status :: 4 - Beta -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Requires-Python: >=3.11 -Description-Content-Type: text/markdown -Requires-Dist: pyyaml>=6.0 -Requires-Dist: requests>=2.31 -Provides-Extra: test -Requires-Dist: pytest-asyncio>=0.24; extra == "test" - -# molecule_plugin — Python SDK for building Molecule AI plugins - -A Molecule AI plugin is a directory that bundles rules, skills, and per-runtime -install adaptors. Any plugin that conforms to this contract is installable -on any Molecule AI workspace whose runtime the plugin supports. - -## Quick start - -Copy `template/` to a new directory and edit: - -``` -my-plugin/ -├── plugin.yaml # name, version, runtimes, description -├── rules/my-rule.md # optional — appended to CLAUDE.md at install -├── skills/my-skill/ -│ ├── SKILL.md # instructions injected into the system prompt -│ └── tools/do_thing.py # optional LangChain @tool functions -└── adapters/ - ├── claude_code.py # one-liner: `from molecule_plugin import AgentskillsAdaptor as Adaptor` - └── deepagents.py # same -``` - -Validate: - -```python -from molecule_plugin import validate_manifest -errors = validate_manifest("my-plugin/plugin.yaml") -assert not errors, errors -``` - -## CLI - -The SDK ships a CLI for validating Molecule AI artifacts before publishing: - -```bash -python -m molecule_plugin validate plugin my-plugin/ -python -m molecule_plugin validate workspace workspace-configs-templates/claude-code-default/ -python -m molecule_plugin validate org org-templates/molecule-dev/ -python -m molecule_plugin validate channel channels.yaml -python -m molecule_plugin validate my-plugin/ # kind defaults to 'plugin' -``` - -Exit code is 0 when valid, 1 when any errors are found — suitable for CI. -Add `-q` / `--quiet` to suppress success lines and emit only errors. - -Programmatic equivalents: - -```python -from molecule_plugin import ( - validate_plugin, - validate_workspace_template, - validate_org_template, - validate_channel_file, - validate_channel_config, -) -``` - -## Per-runtime adaptors — when to write a custom one - -The default `AgentskillsAdaptor` handles the common shape: rules go into -the runtime's memory file (CLAUDE.md), skill dirs go into `/configs/skills/`. -That covers most plugins. - -Write a custom adaptor when you need to: - -- **Register runtime tools dynamically** — call `ctx.register_tool(name, fn)`. -- **Register DeepAgents sub-agents** — call `ctx.register_subagent(name, spec)`. -- **Write to a non-standard memory file** — call `ctx.append_to_memory(filename, content)`. - -Minimum custom adaptor: - -```python -# adapters/deepagents.py -from molecule_plugin import InstallContext, InstallResult - -class Adaptor: - def __init__(self, plugin_name: str, runtime: str): - self.plugin_name, self.runtime = plugin_name, runtime - - async def install(self, ctx: InstallContext) -> InstallResult: - ctx.register_subagent("my-agent", {"prompt": "...", "tools": [...]}) - return InstallResult(plugin_name=self.plugin_name, runtime=self.runtime, source="plugin") - - async def uninstall(self, ctx: InstallContext) -> None: - pass -``` - -## Resolution order (understood by the platform) - -For `(plugin_name, runtime)`: - -1. **Platform registry** — `workspace-template/plugins_registry//.py` - (curated; set by the Molecule AI team for quality-assured plugins). -2. **Plugin-shipped** — `/adapters/.py` (what this SDK helps you build). -3. **Raw-drop fallback** — copies plugin files into `/configs/plugins//` - and surfaces a warning; no tools are wired. - -You generally ship for path #2. If your plugin becomes popular enough to be -promoted to "default," the Molecule AI team PRs a copy of your adaptor into -the platform registry (path #1) so it survives upstream breakage. - -## Testing locally - -The SDK ships `AgentskillsAdaptor` as a standalone, unit-testable class: - -```python -import asyncio -from pathlib import Path -from molecule_plugin import AgentskillsAdaptor, InstallContext - -ctx = InstallContext( - configs_dir=Path("/tmp/configs"), - workspace_id="local", - runtime="claude_code", - plugin_root=Path("./my-plugin"), -) -asyncio.run(AgentskillsAdaptor("my-plugin", "claude_code").install(ctx)) -# check /tmp/configs/CLAUDE.md, /tmp/configs/skills/ -``` - -## Publishing - -A plugin is just a directory. Push it to any Git host. Installation via -`POST /plugins/install {git_url}` is on the roadmap — see the platform's -`PLAN.md` under "Install-from-GitHub-URL flow." Until then, plugins are -bundled into the platform by dropping them into `plugins/` at deploy time. - -## Supported runtimes - -As of 2026-Q2: `claude_code`, `deepagents`, `langgraph`, `crewai`, `autogen`, -`openclaw`. See the live list with: - -```bash -curl $PLATFORM_URL/plugins -``` diff --git a/molecule_ai_sdk.egg-info/SOURCES.txt b/molecule_ai_sdk.egg-info/SOURCES.txt deleted file mode 100644 index 1960a58..0000000 --- a/molecule_ai_sdk.egg-info/SOURCES.txt +++ /dev/null @@ -1,30 +0,0 @@ -README.md -pyproject.toml -molecule_agent/__init__.py -molecule_agent/__main__.py -molecule_agent/a2a_server.py -molecule_agent/client.py -molecule_agent/inbound.py -molecule_ai_sdk.egg-info/PKG-INFO -molecule_ai_sdk.egg-info/SOURCES.txt -molecule_ai_sdk.egg-info/dependency_links.txt -molecule_ai_sdk.egg-info/requires.txt -molecule_ai_sdk.egg-info/top_level.txt -molecule_plugin/__init__.py -molecule_plugin/__main__.py -molecule_plugin/builtins.py -molecule_plugin/channel.py -molecule_plugin/manifest.py -molecule_plugin/org.py -molecule_plugin/protocol.py -molecule_plugin/workspace.py -tests/test_a2a_server.py -tests/test_call_peer_errors.py -tests/test_cli_connect.py -tests/test_inbound.py -tests/test_remote_agent.py -tests/test_retry_backoff.py -tests/test_safe_extract.py -tests/test_sdk.py -tests/test_sha256_verification.py -tests/test_validators.py \ No newline at end of file diff --git a/molecule_ai_sdk.egg-info/dependency_links.txt b/molecule_ai_sdk.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/molecule_ai_sdk.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/molecule_ai_sdk.egg-info/requires.txt b/molecule_ai_sdk.egg-info/requires.txt deleted file mode 100644 index 2bace8a..0000000 --- a/molecule_ai_sdk.egg-info/requires.txt +++ /dev/null @@ -1,5 +0,0 @@ -pyyaml>=6.0 -requests>=2.31 - -[test] -pytest-asyncio>=0.24 diff --git a/molecule_ai_sdk.egg-info/top_level.txt b/molecule_ai_sdk.egg-info/top_level.txt deleted file mode 100644 index a1a75a3..0000000 --- a/molecule_ai_sdk.egg-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -molecule_agent -molecule_plugin diff --git a/molecule_plugin/__pycache__/__init__.cpython-313.pyc b/molecule_plugin/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 68f12ca..0000000 Binary files a/molecule_plugin/__pycache__/__init__.cpython-313.pyc and /dev/null differ diff --git a/molecule_plugin/__pycache__/__main__.cpython-313.pyc b/molecule_plugin/__pycache__/__main__.cpython-313.pyc deleted file mode 100644 index b077327..0000000 Binary files a/molecule_plugin/__pycache__/__main__.cpython-313.pyc and /dev/null differ diff --git a/molecule_plugin/__pycache__/builtins.cpython-313.pyc b/molecule_plugin/__pycache__/builtins.cpython-313.pyc deleted file mode 100644 index 4a2be62..0000000 Binary files a/molecule_plugin/__pycache__/builtins.cpython-313.pyc and /dev/null differ diff --git a/molecule_plugin/__pycache__/channel.cpython-313.pyc b/molecule_plugin/__pycache__/channel.cpython-313.pyc deleted file mode 100644 index d5905e4..0000000 Binary files a/molecule_plugin/__pycache__/channel.cpython-313.pyc and /dev/null differ diff --git a/molecule_plugin/__pycache__/manifest.cpython-313.pyc b/molecule_plugin/__pycache__/manifest.cpython-313.pyc deleted file mode 100644 index 79f2dc9..0000000 Binary files a/molecule_plugin/__pycache__/manifest.cpython-313.pyc and /dev/null differ diff --git a/molecule_plugin/__pycache__/org.cpython-313.pyc b/molecule_plugin/__pycache__/org.cpython-313.pyc deleted file mode 100644 index 0772217..0000000 Binary files a/molecule_plugin/__pycache__/org.cpython-313.pyc and /dev/null differ diff --git a/molecule_plugin/__pycache__/protocol.cpython-313.pyc b/molecule_plugin/__pycache__/protocol.cpython-313.pyc deleted file mode 100644 index b1ce560..0000000 Binary files a/molecule_plugin/__pycache__/protocol.cpython-313.pyc and /dev/null differ diff --git a/molecule_plugin/__pycache__/workspace.cpython-313.pyc b/molecule_plugin/__pycache__/workspace.cpython-313.pyc deleted file mode 100644 index 8ff4ce1..0000000 Binary files a/molecule_plugin/__pycache__/workspace.cpython-313.pyc and /dev/null differ diff --git a/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index b82b238..0000000 Binary files a/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_a2a_server.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_a2a_server.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 0d31601..0000000 Binary files a/tests/__pycache__/test_a2a_server.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_call_peer_errors.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_call_peer_errors.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 50d9b84..0000000 Binary files a/tests/__pycache__/test_call_peer_errors.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_cli_connect.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_cli_connect.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 23f9da1..0000000 Binary files a/tests/__pycache__/test_cli_connect.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_inbound.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_inbound.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 0d7d77a..0000000 Binary files a/tests/__pycache__/test_inbound.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_remote_agent.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_remote_agent.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 451d7bb..0000000 Binary files a/tests/__pycache__/test_remote_agent.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_retry_backoff.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_retry_backoff.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index adbfd03..0000000 Binary files a/tests/__pycache__/test_retry_backoff.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_safe_extract.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_safe_extract.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index afac67f..0000000 Binary files a/tests/__pycache__/test_safe_extract.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_sdk.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_sdk.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index ee540f7..0000000 Binary files a/tests/__pycache__/test_sdk.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_sha256_verification.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_sha256_verification.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 43ffc1a..0000000 Binary files a/tests/__pycache__/test_sha256_verification.cpython-313-pytest-9.0.2.pyc and /dev/null differ diff --git a/tests/__pycache__/test_validators.cpython-313-pytest-9.0.2.pyc b/tests/__pycache__/test_validators.cpython-313-pytest-9.0.2.pyc deleted file mode 100644 index 881bed0..0000000 Binary files a/tests/__pycache__/test_validators.cpython-313-pytest-9.0.2.pyc and /dev/null differ