Skip to main content

python-cordis

A plugin-driven framework kernel for Python, inspired by the cordis framework: everything is a plugin.

This package is a meta-framework: it ships only the engine that makes an application composable from plugins — hooks, a reflective service container, plugin lifecycle, config assembly, and hot reload. It knows nothing about agents, LLMs, filesystems, persistence, or transports.

Concrete business modules (agent loop, session logs, persistence backends, capability seams, web transport) live in the companion package python-cordis-agent as plain, replaceable plugins on top of this kernel.

What the kernel provides

  • HookRegistry (python_cordis.core.hook): plugin registration/discovery and the four hook invocation modes (emit / parallel / bail / waterfall) built on pluggy.
  • Context (python_cordis.core.context): a reflective service container (ctx.fs resolves to a registered service), with extend() / isolate() scopes, reversible register() / set(), reversible on() listeners, and use() which instantiates a component (declaring inject + apply) on a child context restricted to its declared dependencies (proxy enforcement — undeclared access raises ServiceNotFound).
  • Fiber (python_cordis.core.fiber): plugin instance lifecycle — start() / stop() with effects torn down in reverse registration order. refresh() is the reactive reconciliation: it activates when declared dependencies appear and deactivates when they disappear, converging to quiescence with an epoch version guard. When constructed with a HookRegistry that has the lifecycle specs registered, it emits fiber_started / fiber_stopped.
  • Loader (python_cordis.core.loader): a declarative component loader — entry tables (module / component + config) reconciled incrementally (reconcile applies the minimal destructive ops) and hot-reloaded transactionally (hot_reload re-executes the module in place and rolls back on failure).
  • Config assembly (python_cordis.core.config): OmegaConf-based loading, overlay patching, dumping, and interpolation (no arbitrary code execution).
  • HMR (python_cordis.core.hmr): hot module reload without restarting. Reloader swaps a unit ("stop old, then start new") and rolls back on any failure; PluginReloader re-executes an already-imported plugin module in place and re-registers its hooks; FileWatcher (optional watchdog) fires on_change on any watched file.
  • Lifecycle observability (python_cordis.observability): setup_lifecycle_logging registers the lifecycle hookspecs plus a LifecycleLogger plugin that writes structured records (event, fiber) via the standard logging module. It returns a disposer, so the observability is fully reversible.

The kernel declares no entry-point plugins of its own; applications register their own plugins under the python_cordis.plugins group and load them with HookRegistry.load_entry_points().

Quick start

pip install -e .
pytest

Architecture

flowchart TD
    subgraph Core["内核 python-cordis(无关具体业务)"]
        Hooks["HookRegistry<br/>pluggy 四种调用模式"]
        Ctx["Context 服务容器<br/>__getattr__ 反射 / 作用域链 / use 代理"]
        Fiber["Fiber 生命周期<br/>start/stop + refresh 反应式状态机"]
        Loader["Loader 声明式加载器<br/>reconcile + hot_reload"]
        Config["配置装配<br/>OmegaConf overlay / dump / 插值"]
    end

    subgraph Enhance["可选增强(kernel 内)"]
        HMR["HMR 热重载<br/>Reloader / PluginReloader / FileWatcher"]
        Obs["LifecycleLogger<br/>结构化日志(observability)"]
    end

    subgraph App["应用层 python-cordis-agent(独立包)"]
        Biz["业务插件:注册服务、挂载 hook<br/>组装出具体产品能力"]
    end

    Fiber --> Ctx
    Loader --> Fiber
    Hooks --> Ctx
    Fiber --> HMR
    Fiber --> Obs
    App -- "依赖内核扩展点" --> Hooks
    App -- "注册服务" --> Ctx

Key ideas:

  • Hooks are the seams between kernel and plugins — the kernel declares what can be extended (@hookspec), plugins provide it (@hookimpl). Nothing in the kernel hard-codes a specific plugin.
  • Revertible effects — every ctx.effect(), register / set, and on returns an idempotent disposer; teardown runs the inverses in reverse order, so removing a component fully undoes its side effects (paper §3.1).
  • Reactive coeffects — a component declares its dependencies (inject); use() mounts it and refresh() reconciles to the target state, activating when dependencies appear and deactivating when they disappear (paper §3.2).
  • Fiber emits, plugins observe — the kernel only emits lifecycle events; logging is a plain, reversible plugin (LifecycleLogger).
  • Everything is replaceable — the kernel owns no concrete provider; every business service is registered by an application-layer plugin, so swapping implementations needs zero kernel changes.

Development

pip install -e ".[dev,hmr]"
python -m mypy        # strict type checking
python -m pytest      # test suite
python -m build       # sdist + wheel

The full feature specification (kernel + application layer, with package ownership per feature) is maintained in the deepseek-harness repository at docs/python-cordis-feature-spec.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python_cordis-0.1.1.tar.gz (34.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_cordis-0.1.1-py3-none-any.whl (24.0 kB view details)

Uploaded Python 3

File details

Details for the file python_cordis-0.1.1.tar.gz.

File metadata

  • Download URL: python_cordis-0.1.1.tar.gz
  • Upload date:
  • Size: 34.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for python_cordis-0.1.1.tar.gz
Algorithm Hash digest
SHA256 7ea97983cba2785bbfa54307aab859001b246e6274484e5c7bf57bfbf32f2bad
MD5 16094f06fb89e4c66a4624430fda65bc
BLAKE2b-256 a6692a3904596f0bcce0c68aeceff0597597cd96860a3b78298770595a298f77

See more details on using hashes here.

File details

Details for the file python_cordis-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: python_cordis-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 24.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for python_cordis-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d53df5afe963a5a90ae93d555081a1dfe57d8c3aa6ce3358aa049d163f8c5dad
MD5 14d51960e6a524cd3490c5f346588bee
BLAKE2b-256 9a1f85c5ec0b17da29f980cb2c80a2b039abcd683da24b8ca7be132c226f2959

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page