chore: gitignore Python build artifacts and untrack accidentally-committed caches
The previous commit (87a4cfc) used `git add -A` and pulled in __pycache__/
and *.egg-info/ files because .gitignore didn't exclude them. Untrack
those, and extend .gitignore so future `git add -A` is safe.
This is a no-op for production code; only repo hygiene.
This commit is contained in:
parent
87a4cfcc55
commit
71efea125c
9
.gitignore
vendored
9
.gitignore
vendored
@ -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/
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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/<plugin>/<runtime>.py`
|
||||
(curated; set by the Molecule AI team for quality-assured plugins).
|
||||
2. **Plugin-shipped** — `<plugin_root>/adapters/<runtime>.py` (what this SDK helps you build).
|
||||
3. **Raw-drop fallback** — copies plugin files into `/configs/plugins/<name>/`
|
||||
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
|
||||
```
|
||||
@ -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
|
||||
@ -1 +0,0 @@
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
pyyaml>=6.0
|
||||
requests>=2.31
|
||||
|
||||
[test]
|
||||
pytest-asyncio>=0.24
|
||||
@ -1,2 +0,0 @@
|
||||
molecule_agent
|
||||
molecule_plugin
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user