Modus Operandi 🤌
Automate spec-driven "planner -> executor" workflows in LLM clients (opencode and cursor): task planning, task implementing and code review.
Quick start
pip install modus-operandi
modus-operandi task "<task-description>"
No configuration needed: the defaults use the free OpenCode Zen models
(opencode/big-pickle for planning and review, opencode/deepseek-v4-flash-free
for implementation), which work out of the box. To switch models or backends,
run modus-operandi edit.
Install
modus-operandi works right after install: the first run renders the pipeline
files (agents, scripts, workflows, prompts) into ~/.config/modus-operandi/ and
~/.config/opencode/, and creates ~/.config/modus-operandi/config.yml from the
example. Updates arrive through PyPI (pip install -U modus-operandi); the render
is re-applied automatically on the next run.
Requirements: Python >= 3.12, and one backend CLI on PATH — opencode
(default) or cursor-agent (see --backend cursor below).
The dev flow (python3 install.py from a checkout) additionally installs a
checkout-based modus-operandi command into ~/.local/bin and keeps that
directory on PATH in your existing shell rc files (~/.bashrc, ~/.zshrc,
~/.profile), so the command is available in every newly opened terminal.
Usage
Task
If you have a workflow like this
1. Studying the motivation of the task with a planner-agent
2. Creating an ADR
3. Writing an implementation plan for the executor
4. The executor-agent asking clarifying questions about the task
5. The planner-agent answering these questions
6. Implementing the task
7. Reviewing for SRP violations
8. Reviewing for bugs
9. General review (correctness and quality)
10. Comment review (readability)
11. Fixing the issues found
The ADR records the decision (what and why) and is published to the
architecture/ directory at the end of the run in its final version; the
implementation plan stays internal to the executor.
then you can use this command
modus-operandi task "<task-description>"
Review
If you have a workflow like this
1. Reviewing the whole project for SRP violations
2. Reviewing the whole project for bugs
3. Comment review (readability)
4. Fixing the issues found
then you can use this command
modus-operandi review
To review only the changes between the current branch and the default branch:
modus-operandi review --branch-diff
Backend
By default, opencode is used. If you need the cursor backend, use the
--backend cursor flag:
modus-operandi --backend cursor task "<task-description>"
Config
modus-operandi edit
opens ~/.config/modus-operandi/config.yml in your terminal editor. On save and
close it validates the file: a valid config is applied, an invalid one is
rolled back and the error is reported with its line number; a config left
unchanged is not re-applied.
Uninstall
modus-operandi uninstall
pip uninstall modus-operandi
removes the rendered pipeline files (~/.config/modus-operandi and the modus-operandi
files under ~/.config/opencode) — run pip uninstall modus-operandi afterwards
to remove the package itself.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file modus_operandi-0.1.0.tar.gz.
File metadata
- Download URL: modus_operandi-0.1.0.tar.gz
- Upload date:
- Size: 474.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1c37587ba6732cf3229694b66e692a1ad689f8e41885826e32e06b989e94257
|
|
| MD5 |
7853b7fc484141db95a62aad8545327b
|
|
| BLAKE2b-256 |
bae606a744d71d7e57895340edc9885b657f6522b53eb969e5be11019b2c912e
|
Provenance
The following attestation bundles were made for modus_operandi-0.1.0.tar.gz:
Publisher:
publish.yml on DenisRyazantsev/modus-operandi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
modus_operandi-0.1.0.tar.gz -
Subject digest:
e1c37587ba6732cf3229694b66e692a1ad689f8e41885826e32e06b989e94257 - Sigstore transparency entry: 2568149604
- Sigstore integration time:
-
Permalink:
DenisRyazantsev/modus-operandi@695f93fbf5c26e7e7f468b105fd62f56961c2e56 -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/DenisRyazantsev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@695f93fbf5c26e7e7f468b105fd62f56961c2e56 -
Trigger Event:
push
-
Statement type:
File details
Details for the file modus_operandi-0.1.0-py3-none-any.whl.
File metadata
- Download URL: modus_operandi-0.1.0-py3-none-any.whl
- Upload date:
- Size: 523.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c5019beda5b826854bfa4e68d07668ab6a2e692a77ce303739a2fd74376ef6b6
|
|
| MD5 |
486edc0c1353ccc09f57ee11513af833
|
|
| BLAKE2b-256 |
612b32ef04f94accc899b15c8d288022f9a6a5d9ed6536bdf56bffae75f3898f
|
Provenance
The following attestation bundles were made for modus_operandi-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on DenisRyazantsev/modus-operandi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
modus_operandi-0.1.0-py3-none-any.whl -
Subject digest:
c5019beda5b826854bfa4e68d07668ab6a2e692a77ce303739a2fd74376ef6b6 - Sigstore transparency entry: 2568149606
- Sigstore integration time:
-
Permalink:
DenisRyazantsev/modus-operandi@695f93fbf5c26e7e7f468b105fd62f56961c2e56 -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/DenisRyazantsev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@695f93fbf5c26e7e7f468b105fd62f56961c2e56 -
Trigger Event:
push
-
Statement type: