devorch 0.4.0__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- devorch-0.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +60 -0
- devorch-0.5.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- devorch-0.5.0/.github/ISSUE_TEMPLATE/feature_request.yml +25 -0
- devorch-0.5.0/.github/PULL_REQUEST_TEMPLATE.md +18 -0
- devorch-0.5.0/.github/dependabot.yml +11 -0
- {devorch-0.4.0 → devorch-0.5.0}/.github/workflows/ci.yml +0 -2
- devorch-0.5.0/CHANGELOG.md +52 -0
- devorch-0.5.0/CODE_OF_CONDUCT.md +32 -0
- devorch-0.5.0/CONTRIBUTING.md +80 -0
- {devorch-0.4.0 → devorch-0.5.0}/PKG-INFO +220 -36
- {devorch-0.4.0 → devorch-0.5.0}/README.md +214 -34
- devorch-0.5.0/SECURITY.md +34 -0
- devorch-0.5.0/cli/commands/_output.py +151 -0
- {devorch-0.4.0 → devorch-0.5.0}/cli/commands/_shared.py +43 -5
- {devorch-0.4.0 → devorch-0.5.0}/cli/commands/ask.py +40 -13
- {devorch-0.4.0 → devorch-0.5.0}/cli/commands/edit.py +15 -3
- {devorch-0.4.0 → devorch-0.5.0}/cli/commands/run.py +37 -14
- {devorch-0.4.0 → devorch-0.5.0}/cli/constants.py +88 -32
- {devorch-0.4.0 → devorch-0.5.0}/cli/main.py +249 -113
- devorch-0.5.0/cli/prompt_ui.py +258 -0
- devorch-0.5.0/cli/repl_commands.py +259 -0
- {devorch-0.4.0 → devorch-0.5.0}/config/permissions.py +46 -4
- devorch-0.5.0/config/project_settings.py +235 -0
- {devorch-0.4.0 → devorch-0.5.0}/config/settings.py +61 -2
- {devorch-0.4.0 → devorch-0.5.0}/core/agent.py +99 -183
- devorch-0.5.0/core/checkpoints.py +103 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/context.py +5 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/executor.py +38 -2
- devorch-0.5.0/core/hooks.py +182 -0
- devorch-0.5.0/core/images.py +115 -0
- devorch-0.5.0/core/mentions.py +118 -0
- devorch-0.5.0/core/pricing.py +161 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/skills.py +81 -1
- {devorch-0.4.0 → devorch-0.5.0}/providers/anthropic.py +83 -10
- devorch-0.5.0/providers/base.py +340 -0
- {devorch-0.4.0 → devorch-0.5.0}/providers/custom.py +15 -3
- {devorch-0.4.0 → devorch-0.5.0}/providers/deepseek.py +14 -3
- {devorch-0.4.0 → devorch-0.5.0}/providers/gemini.py +39 -9
- {devorch-0.4.0 → devorch-0.5.0}/providers/github_copilot.py +15 -3
- {devorch-0.4.0 → devorch-0.5.0}/providers/groq.py +14 -4
- {devorch-0.4.0 → devorch-0.5.0}/providers/kimi.py +15 -3
- {devorch-0.4.0 → devorch-0.5.0}/providers/lmstudio.py +14 -4
- {devorch-0.4.0 → devorch-0.5.0}/providers/local.py +19 -5
- {devorch-0.4.0 → devorch-0.5.0}/providers/mistral.py +14 -4
- {devorch-0.4.0 → devorch-0.5.0}/providers/openai.py +13 -4
- {devorch-0.4.0 → devorch-0.5.0}/providers/openrouter.py +50 -4
- {devorch-0.4.0 → devorch-0.5.0}/providers/together.py +14 -4
- {devorch-0.4.0 → devorch-0.5.0}/pyproject.toml +5 -2
- {devorch-0.4.0 → devorch-0.5.0}/schemas/message.py +15 -0
- devorch-0.5.0/tests/_screen.py +78 -0
- devorch-0.5.0/tests/conftest.py +43 -0
- devorch-0.5.0/tests/test_anthropic_caching.py +134 -0
- devorch-0.5.0/tests/test_boxed_input.py +209 -0
- devorch-0.5.0/tests/test_checkpoints.py +85 -0
- devorch-0.5.0/tests/test_custom_commands.py +68 -0
- devorch-0.5.0/tests/test_git_tool.py +87 -0
- devorch-0.5.0/tests/test_hooks.py +145 -0
- devorch-0.5.0/tests/test_images.py +209 -0
- devorch-0.5.0/tests/test_interrupt.py +195 -0
- devorch-0.5.0/tests/test_isolation.py +41 -0
- devorch-0.5.0/tests/test_json_output.py +90 -0
- devorch-0.5.0/tests/test_mentions.py +105 -0
- devorch-0.5.0/tests/test_openrouter_caching.py +85 -0
- devorch-0.5.0/tests/test_prefix_stability.py +55 -0
- devorch-0.5.0/tests/test_pricing.py +243 -0
- devorch-0.5.0/tests/test_proc.py +107 -0
- devorch-0.5.0/tests/test_project_settings.py +154 -0
- devorch-0.5.0/tests/test_prompt_ui.py +287 -0
- devorch-0.5.0/tests/test_repl_commands.py +307 -0
- devorch-0.5.0/tests/test_streaming.py +422 -0
- devorch-0.5.0/tests/test_tool_display.py +278 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/__init__.py +3 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/agent.py +11 -2
- devorch-0.5.0/tools/git.py +173 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/shell.py +2 -10
- {devorch-0.4.0 → devorch-0.5.0}/utils/logger.py +35 -14
- devorch-0.5.0/utils/proc.py +77 -0
- devorch-0.5.0/utils/streaming.py +78 -0
- devorch-0.5.0/utils/tool_display.py +210 -0
- devorch-0.4.0/providers/base.py +0 -141
- devorch-0.4.0/tools/git.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/.github/workflows/publish.yml +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/.gitignore +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/DEVORCH.md +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/LICENSE +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/assets/chat.png +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/assets/models.png +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/assets/providers.png +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/assets/startup.png +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/assets/terminal.png +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/assets/tools.png +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/config/profiles.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/loop_detector.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/mcp.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/memory.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/modes.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/planner.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/project_context.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/project_memory.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/sessions.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/core/tasks.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/providers/__init__.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/schemas/task.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/schemas/tool.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/__init__.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_context.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_core.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_integration.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_loop_detector.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_permissions.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_project_context.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_project_memory.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_schemas.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tests/test_tools.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/base.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/edit.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/filesystem.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/grep.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/search.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/task.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/terminal_session.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/tests.py +0 -0
- {devorch-0.4.0 → devorch-0.5.0}/tools/websearch.py +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Something is broken or behaves unexpectedly
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Thanks for reporting! **Remove API keys and other secrets** from anything you paste.
|
|
9
|
+
For security problems, do not open an issue: see SECURITY.md.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: what-happened
|
|
12
|
+
attributes:
|
|
13
|
+
label: What happened?
|
|
14
|
+
description: What did you do, what did you expect, and what happened instead?
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: textarea
|
|
18
|
+
id: repro
|
|
19
|
+
attributes:
|
|
20
|
+
label: Steps to reproduce
|
|
21
|
+
placeholder: |
|
|
22
|
+
1. Run `devorch -p openai`
|
|
23
|
+
2. Type ...
|
|
24
|
+
3. See ...
|
|
25
|
+
validations:
|
|
26
|
+
required: true
|
|
27
|
+
- type: input
|
|
28
|
+
id: version
|
|
29
|
+
attributes:
|
|
30
|
+
label: DevOrch version
|
|
31
|
+
description: Output of `devorch --version` (or `pip show devorch`)
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
- type: input
|
|
35
|
+
id: provider
|
|
36
|
+
attributes:
|
|
37
|
+
label: Provider and model
|
|
38
|
+
placeholder: openai / gpt-4o
|
|
39
|
+
- type: dropdown
|
|
40
|
+
id: os
|
|
41
|
+
attributes:
|
|
42
|
+
label: Operating system
|
|
43
|
+
options: [Linux, macOS, Windows, Other]
|
|
44
|
+
validations:
|
|
45
|
+
required: true
|
|
46
|
+
- type: input
|
|
47
|
+
id: python
|
|
48
|
+
attributes:
|
|
49
|
+
label: Python version
|
|
50
|
+
placeholder: "3.12"
|
|
51
|
+
- type: input
|
|
52
|
+
id: terminal
|
|
53
|
+
attributes:
|
|
54
|
+
label: Terminal
|
|
55
|
+
description: For display or input problems (e.g. iTerm2, Windows Terminal, GNOME Terminal, tmux)
|
|
56
|
+
- type: textarea
|
|
57
|
+
id: logs
|
|
58
|
+
attributes:
|
|
59
|
+
label: Output / logs
|
|
60
|
+
render: shell
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest an idea or improvement
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: What problem would this solve?
|
|
9
|
+
description: Describe the use case, not just the solution.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: proposal
|
|
14
|
+
attributes:
|
|
15
|
+
label: Proposed solution
|
|
16
|
+
- type: textarea
|
|
17
|
+
id: alternatives
|
|
18
|
+
attributes:
|
|
19
|
+
label: Alternatives you considered
|
|
20
|
+
- type: checkboxes
|
|
21
|
+
id: contribute
|
|
22
|
+
attributes:
|
|
23
|
+
label: Contribution
|
|
24
|
+
options:
|
|
25
|
+
- label: I'd be willing to open a pull request for this
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this change and why? Link the issue it closes (Fixes #123). -->
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
-
|
|
8
|
+
|
|
9
|
+
## How it was tested
|
|
10
|
+
|
|
11
|
+
<!-- Tests added/updated, and anything you ran manually. Be explicit about what you did NOT test. -->
|
|
12
|
+
|
|
13
|
+
## Checklist
|
|
14
|
+
|
|
15
|
+
- [ ] `ruff check .` and `ruff format --check .` pass
|
|
16
|
+
- [ ] `pytest` passes, with tests for new behaviour (a bug fix has a test that fails without it)
|
|
17
|
+
- [ ] README / `CHANGELOG.md` updated for user-facing changes
|
|
18
|
+
- [ ] No secrets, personal paths or API keys in code, tests, or logs
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.5.0
|
|
4
|
+
|
|
5
|
+
A large feature release: hooks, checkpoints, project settings, image input, streaming, prompt caching,
|
|
6
|
+
cost estimates, and a much more robust terminal UI.
|
|
7
|
+
|
|
8
|
+
### Upgrade notes
|
|
9
|
+
- **Project hooks and some project settings now need `devorch trust`.** `.devorch/hooks.yaml`, a project's
|
|
10
|
+
`mcp_servers`, permission `allow` rules and `default_mode: auto` are ignored (with a warning) until you review the
|
|
11
|
+
files and run `devorch trust`. Editing either file revokes trust.
|
|
12
|
+
- **Ctrl+C no longer quits.** It cancels the current turn; press it twice at an idle prompt (or type `exit`) to quit.
|
|
13
|
+
- **`/undo` now also restores files** the agent changed with `edit` / `filesystem write` (not shell commands).
|
|
14
|
+
- **The REPL clears the visible screen on start** (scrollback is kept). Set `DEVORCH_NO_CLEAR=1` to disable.
|
|
15
|
+
- `devorch run --mode` now defaults to the project setting, falling back to `auto`.
|
|
16
|
+
- Requires `prompt_toolkit>=3.0.28`.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- **Hooks**: `PreToolUse` / `PostToolUse` shell hooks (`~/.devorch/hooks.yaml`, `.devorch/hooks.yaml`).
|
|
20
|
+
- **Checkpoints**: file snapshots per turn, restored by `/undo`; `/checkpoints` lists them.
|
|
21
|
+
- **Custom slash commands** from Markdown files (`~/.devorch/commands`, `.devorch/commands`) with `$ARGUMENTS`.
|
|
22
|
+
- **`@file` mentions** with line ranges, directories and tab completion.
|
|
23
|
+
- **Image input**: `@screenshot.png` for vision models across providers; large images are downscaled
|
|
24
|
+
(optional `devorch[images]`) and old images are pruned from context to save tokens.
|
|
25
|
+
- **`--output json` / `stream-json`** for `ask` and `run`, with usage, tool calls and cost.
|
|
26
|
+
- **Structured `git` tool** (status, diff, log, show, branch, switch, add, commit); no push/reset/force.
|
|
27
|
+
- **Per-project settings** (`.devorch/settings.yaml`) with a trust model.
|
|
28
|
+
- **Streaming** replies for every provider.
|
|
29
|
+
- **Prompt caching** for Anthropic (and `anthropic/*` via OpenRouter); tests guard prompt-prefix stability so
|
|
30
|
+
OpenAI/DeepSeek/Kimi/Gemini automatic caches keep hitting.
|
|
31
|
+
- **`/cost`** and cost estimates in the per-turn line, `/tokens`, the bottom bar and JSON output; prices are
|
|
32
|
+
approximate and overridable under `pricing:` in `config.yaml`.
|
|
33
|
+
- **More slash commands**, matching the CLI: `/permissions allow|deny|set|reset`, `/sessions`, `/hooks`, `/trust`,
|
|
34
|
+
`/untrust`, `/exit`.
|
|
35
|
+
- **`--mode` for `devorch` / `devorch chat`, and `--dangerously-skip-permissions`** on every entry point (same as
|
|
36
|
+
`--mode auto`: no prompts; dangerous-command blocks and deny rules still apply).
|
|
37
|
+
- **Input surface**: open input box with a coloured mode label, `Shift+Tab` mode cycling, `Ctrl+J` newline, a
|
|
38
|
+
width-aware placeholder and bottom bar, context-usage gauge.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
- **Anthropic: the base system prompt was overwritten** by plan-mode / loop-advisory system messages.
|
|
42
|
+
- **Tool output crashed the turn** (`MarkupError`) when a command, path, result or diff contained text like `[/x]`,
|
|
43
|
+
and silently lost brackets (`app/[id]/page.tsx`, `List[int]`). Message helpers now escape their text.
|
|
44
|
+
- Reading a file that merely contained `Error:` was shown as a red failure.
|
|
45
|
+
- Ctrl+C inside a sub-agent was swallowed and the parent kept running.
|
|
46
|
+
- The bottom toolbar re-ran `git` on every keystroke; it is now cached.
|
|
47
|
+
- The bottom toolbar rendered as a bright reversed bar, and was clipped on narrow terminals, hiding the mode.
|
|
48
|
+
- Saving config no longer drops a `pricing:` section.
|
|
49
|
+
- The slash-command dropdown vanished when a command was fully typed (`/cost`, `/models`).
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
- CI runs on pull requests only.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
We want DevOrch to be a friendly, welcoming project for everyone, whatever their background or experience.
|
|
4
|
+
|
|
5
|
+
## Our standards
|
|
6
|
+
|
|
7
|
+
Expected:
|
|
8
|
+
|
|
9
|
+
- Be respectful and patient, especially with people who are new.
|
|
10
|
+
- Give and accept constructive feedback; critique the work, not the person.
|
|
11
|
+
- Assume good faith, and ask when something is unclear.
|
|
12
|
+
- Keep discussion on topic and credit other people's work.
|
|
13
|
+
|
|
14
|
+
Not acceptable:
|
|
15
|
+
|
|
16
|
+
- Harassment, insults, personal attacks, or discriminatory language or jokes.
|
|
17
|
+
- Trolling, deliberately derailing threads, or spamming.
|
|
18
|
+
- Publishing someone else's private information.
|
|
19
|
+
- Any other conduct that would reasonably be considered inappropriate in a professional setting.
|
|
20
|
+
|
|
21
|
+
## Scope
|
|
22
|
+
|
|
23
|
+
This applies in all project spaces (issues, pull requests, discussions, commits) and when someone is
|
|
24
|
+
representing the project in public.
|
|
25
|
+
|
|
26
|
+
## Enforcement
|
|
27
|
+
|
|
28
|
+
Maintainers may edit or remove comments, close or lock threads, and ban people who do not follow these
|
|
29
|
+
standards. To report a problem privately, contact the maintainer at the address listed in the `authors`
|
|
30
|
+
field of `pyproject.toml`. Reports are treated confidentially.
|
|
31
|
+
|
|
32
|
+
This policy is inspired by the [Contributor Covenant](https://www.contributor-covenant.org).
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Contributing to DevOrch
|
|
2
|
+
|
|
3
|
+
Thanks for helping out! DevOrch is a multi-provider AI coding assistant CLI, and contributions of all sizes
|
|
4
|
+
are welcome: bug reports, docs, tests, new providers, tools and features.
|
|
5
|
+
|
|
6
|
+
By participating you agree to follow the [Code of Conduct](CODE_OF_CONDUCT.md). To report a security problem,
|
|
7
|
+
see [SECURITY.md](SECURITY.md) instead of opening a public issue.
|
|
8
|
+
|
|
9
|
+
## Getting set up
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
git clone https://github.com/Amanbig/DevOrch.git
|
|
13
|
+
cd DevOrch
|
|
14
|
+
python -m venv .venv && source .venv/bin/activate # or: uv venv && source .venv/bin/activate
|
|
15
|
+
pip install -e ".[dev]" # or: uv pip install -e ".[dev]"
|
|
16
|
+
|
|
17
|
+
pytest # the whole suite; no network or API keys needed
|
|
18
|
+
ruff check . # lint
|
|
19
|
+
ruff format . # format (CI runs `ruff format --check .`)
|
|
20
|
+
devorch # run your working copy
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Python 3.10+ is required; CI runs the tests on Linux, macOS and Windows for 3.10-3.13, so avoid
|
|
24
|
+
platform-specific assumptions (paths, shells, terminal behaviour) and keep type hints 3.10-compatible.
|
|
25
|
+
|
|
26
|
+
## Workflow
|
|
27
|
+
|
|
28
|
+
1. Open an issue first for anything large, so we can agree on the approach.
|
|
29
|
+
2. Create a branch per change (`feat/...`, `fix/...`, `docs/...`, `chore/...`).
|
|
30
|
+
3. Keep PRs focused: one feature or fix per PR.
|
|
31
|
+
4. Use clear, conventional-style commit messages (`feat(hooks): ...`, `fix(ui): ...`).
|
|
32
|
+
5. Open a PR against `main`. CI must pass (lint + tests on all platforms).
|
|
33
|
+
|
|
34
|
+
A good PR includes:
|
|
35
|
+
|
|
36
|
+
- **Tests** for new behaviour and for the bug it fixes. A regression test should fail without your fix.
|
|
37
|
+
- **Docs**: update the README for user-facing changes and add a line to `CHANGELOG.md`.
|
|
38
|
+
- An honest description: what changed, why, what you did **not** test.
|
|
39
|
+
|
|
40
|
+
## Where things live
|
|
41
|
+
|
|
42
|
+
See [`DEVORCH.md`](DEVORCH.md) and the project structure in the README. In short: `cli/` (commands, REPL, UI),
|
|
43
|
+
`core/` (agent loop, executor, hooks, memory, sessions), `providers/` (one file per LLM provider), `tools/`
|
|
44
|
+
(built-in tools), `config/` (settings, permissions, project settings), `tests/`.
|
|
45
|
+
|
|
46
|
+
### Adding a provider
|
|
47
|
+
|
|
48
|
+
Subclass `LLMProvider` in `providers/<name>.py`, implement `generate()`, and register it in
|
|
49
|
+
`providers/__init__.py`. Set the capability flags honestly: `supports_images` and `supports_streaming`
|
|
50
|
+
(`generate()` then accepts `on_text` and streams deltas). OpenAI-compatible APIs can reuse `chat_create` /
|
|
51
|
+
`post_chat` and `openai_user_content` from `providers/base.py`. Add tests with a mocked client.
|
|
52
|
+
|
|
53
|
+
### Adding a tool
|
|
54
|
+
|
|
55
|
+
Subclass `Tool` in `tools/`, give it a pydantic `args_schema`, register it in `build_tools` /
|
|
56
|
+
`start_repl`, and describe what the user sees in `utils/tool_display.py`. If it changes files, make sure
|
|
57
|
+
checkpoints can snapshot it (`core/checkpoints.py`). Tools that can do damage need permission handling in
|
|
58
|
+
`config/permissions.py`.
|
|
59
|
+
|
|
60
|
+
### Adding a slash command
|
|
61
|
+
|
|
62
|
+
Add it to `SLASH_COMMANDS` in `cli/constants.py` (that feeds the dropdown and `/help`) and handle it in the
|
|
63
|
+
REPL in `cli/main.py`; put non-trivial logic in `cli/repl_commands.py` so it can be tested. A test fails if a
|
|
64
|
+
command appears in the dropdown without a handler.
|
|
65
|
+
|
|
66
|
+
## Testing notes
|
|
67
|
+
|
|
68
|
+
- Tests must not touch your real `~/.devorch`: monkeypatch `Path.home()` and the config paths (see
|
|
69
|
+
`tests/test_repl_commands.py` for a fixture).
|
|
70
|
+
- Do not assert on `--help` text; it is colourised and wrapped differently per terminal. Inspect the
|
|
71
|
+
registered options instead.
|
|
72
|
+
- Terminal UI behaviour (layout, colours, key bindings) is tested on a virtual terminal with
|
|
73
|
+
`tests/_screen.py` (uses `pyte`), so it can be verified without a real terminal.
|
|
74
|
+
- Mock the model: provider tests use fake clients, never live APIs.
|
|
75
|
+
|
|
76
|
+
## Releasing (maintainers)
|
|
77
|
+
|
|
78
|
+
1. Bump the version in `pyproject.toml` **and** `cli/constants.py`, and add the `CHANGELOG.md` entry.
|
|
79
|
+
2. Merge to `main`, then push a `vX.Y.Z` tag. The publish workflow builds, uploads to PyPI and creates the
|
|
80
|
+
GitHub release. Published versions cannot be reused, so double-check before tagging.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: devorch
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Multi-provider AI coding assistant CLI with 13+ providers
|
|
5
5
|
Project-URL: Homepage, https://github.com/Amanbig/DevOrch
|
|
6
6
|
Project-URL: Repository, https://github.com/Amanbig/DevOrch
|
|
@@ -26,7 +26,7 @@ Requires-Dist: google-genai>=1.0.0
|
|
|
26
26
|
Requires-Dist: httpx>=0.27.0
|
|
27
27
|
Requires-Dist: keyring>=25.0.0
|
|
28
28
|
Requires-Dist: openai>=1.28.0
|
|
29
|
-
Requires-Dist: prompt-toolkit>=3.0.
|
|
29
|
+
Requires-Dist: prompt-toolkit>=3.0.28
|
|
30
30
|
Requires-Dist: pydantic>=2.7.1
|
|
31
31
|
Requires-Dist: pyyaml>=6.0
|
|
32
32
|
Requires-Dist: questionary>=2.0.0
|
|
@@ -34,10 +34,14 @@ Requires-Dist: rich>=13.7.1
|
|
|
34
34
|
Requires-Dist: typer>=0.12.3
|
|
35
35
|
Provides-Extra: dev
|
|
36
36
|
Requires-Dist: mypy>=1.10.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: pillow>=10.0.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: pyte>=0.8.2; extra == 'dev'
|
|
37
39
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
38
40
|
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
39
41
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
40
42
|
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
43
|
+
Provides-Extra: images
|
|
44
|
+
Requires-Dist: pillow>=10.0.0; extra == 'images'
|
|
41
45
|
Description-Content-Type: text/markdown
|
|
42
46
|
|
|
43
47
|
<p align="center">
|
|
@@ -58,20 +62,6 @@ Description-Content-Type: text/markdown
|
|
|
58
62
|
|
|
59
63
|
DevOrch gives you a coding assistant in your terminal that can execute shell commands, edit files, search your codebase, manage terminal sessions, and remember context across conversations — powered by any of 13+ AI providers or your own local models.
|
|
60
64
|
|
|
61
|
-
## Screenshots
|
|
62
|
-
|
|
63
|
-
| Startup | Chat |
|
|
64
|
-
|---------|------|
|
|
65
|
-
|  |  |
|
|
66
|
-
|
|
67
|
-
| Provider Selection | Model Selection |
|
|
68
|
-
|--------------------|-----------------|
|
|
69
|
-
|  |  |
|
|
70
|
-
|
|
71
|
-
| Tool Execution | Terminal Session |
|
|
72
|
-
|----------------|-----------------|
|
|
73
|
-
|  |  |
|
|
74
|
-
|
|
75
65
|
## Why DevOrch?
|
|
76
66
|
|
|
77
67
|
- **Provider freedom** — Switch between OpenAI, Anthropic, Gemini, Mistral, Groq, and 8 more providers (including local models) with a single command. No vendor lock-in.
|
|
@@ -135,7 +125,8 @@ DevOrch can act on your system, not just talk about it:
|
|
|
135
125
|
|
|
136
126
|
| Tool | What it does |
|
|
137
127
|
|------|-------------|
|
|
138
|
-
| `shell` | Execute commands (`
|
|
128
|
+
| `shell` | Execute commands (`npm install`, `pytest`, etc.) |
|
|
129
|
+
| `git` | Structured, safe git: status, diff, log, show, branch, switch, add, commit |
|
|
139
130
|
| `terminal_session` | Managed background processes with optional GUI window |
|
|
140
131
|
| `filesystem` | Read, write, list files |
|
|
141
132
|
| `search` / `grep` | Find files and search contents |
|
|
@@ -144,6 +135,21 @@ DevOrch can act on your system, not just talk about it:
|
|
|
144
135
|
| `memory` | Persistent memory across conversations |
|
|
145
136
|
| `websearch` / `webfetch` | Search the web, fetch URLs |
|
|
146
137
|
|
|
138
|
+
### Streaming
|
|
139
|
+
|
|
140
|
+
Replies render live as the model generates them (a spinner shows until the first token). Every provider
|
|
141
|
+
streams. Streaming is only used in the interactive REPL; `ask`, `run` and `--output json` are unchanged.
|
|
142
|
+
|
|
143
|
+
### Prompt Caching (Anthropic)
|
|
144
|
+
|
|
145
|
+
With the Anthropic provider, DevOrch marks the tool definitions + system prompt and the conversation so far
|
|
146
|
+
as cacheable. Within a multi-step task each model call re-reads that prefix from Anthropic's cache at roughly
|
|
147
|
+
a tenth of the normal input price instead of paying for it again, and `/tokens` shows the cached portion.
|
|
148
|
+
Prompts below the model's minimum cacheable size (1024–2048 tokens) are simply not cached. The same markers
|
|
149
|
+
are sent for `anthropic/*` models via OpenRouter. OpenAI, DeepSeek, Kimi and Gemini 2.5 cache repeated
|
|
150
|
+
prefixes automatically on their side; DevOrch keeps the start of every request byte-identical (stable system
|
|
151
|
+
prompt, no timestamps, volatile notes last) so those caches hit, and a test guards that.
|
|
152
|
+
|
|
147
153
|
### Memory & Project Context
|
|
148
154
|
|
|
149
155
|
DevOrch maintains persistent memory so you never have to repeat context:
|
|
@@ -198,6 +204,22 @@ prompt: |
|
|
|
198
204
|
Check the deploy logs for any errors.
|
|
199
205
|
```
|
|
200
206
|
|
|
207
|
+
### Custom Slash Commands (Markdown)
|
|
208
|
+
|
|
209
|
+
Drop a Markdown file in `~/.devorch/commands/` (global) or `<project>/.devorch/commands/` (project;
|
|
210
|
+
overrides global and built-ins). The file name becomes the command:
|
|
211
|
+
|
|
212
|
+
```markdown
|
|
213
|
+
<!-- .devorch/commands/pr.md → /pr 123 -->
|
|
214
|
+
---
|
|
215
|
+
description: Review a pull request
|
|
216
|
+
---
|
|
217
|
+
Review PR $ARGUMENTS: summarize the change, then list bugs and risks.
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
`$ARGUMENTS` is replaced with whatever follows the command; without the placeholder, arguments are
|
|
221
|
+
appended to the prompt. Works in chat (`/pr 123`) and from the CLI (`devorch run pr 123`).
|
|
222
|
+
|
|
201
223
|
### Terminal Sessions
|
|
202
224
|
|
|
203
225
|
Background processes that persist across DevOrch restarts:
|
|
@@ -217,6 +239,111 @@ Background processes that persist across DevOrch restarts:
|
|
|
217
239
|
> terminal_session stop session_id="swift-fox-a3f2"
|
|
218
240
|
```
|
|
219
241
|
|
|
242
|
+
### Hooks
|
|
243
|
+
|
|
244
|
+
Run your own shell commands before and after any tool call — block risky actions, auto-format, run linters.
|
|
245
|
+
Configure in `~/.devorch/hooks.yaml` (global) or `<project>/.devorch/hooks.yaml` (project hooks only run after `devorch trust`, since they execute shell commands):
|
|
246
|
+
|
|
247
|
+
```yaml
|
|
248
|
+
hooks:
|
|
249
|
+
PreToolUse:
|
|
250
|
+
- matcher: "shell" # regex on tool name; omit to match all tools
|
|
251
|
+
command: "./scripts/guard.sh"
|
|
252
|
+
PostToolUse:
|
|
253
|
+
- matcher: "edit|filesystem"
|
|
254
|
+
command: "ruff format ."
|
|
255
|
+
timeout: 20 # seconds, default 30
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
The hook gets a JSON payload on stdin (`event`, `tool_name`, `tool_input`, `tool_output` for post hooks, `cwd`).
|
|
259
|
+
Exit `0` to continue; exit `2` to block a `PreToolUse` call (stderr is sent back to the model) or to feed
|
|
260
|
+
stderr back after a `PostToolUse`; any other exit code is a non-blocking warning.
|
|
261
|
+
|
|
262
|
+
### @file Mentions
|
|
263
|
+
|
|
264
|
+
Reference files or folders inline and DevOrch attaches their contents to the prompt:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
> explain @core/agent.py
|
|
268
|
+
> why does @core/agent.py:100-140 loop?
|
|
269
|
+
> summarize @tools/
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Mention an image (`.png`, `.jpg`, `.gif`, `.webp`; up to 5 MB) to send it to the model:
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
> why does the layout in @screenshots/bug.png look broken?
|
|
276
|
+
> devorch ask "describe @diagram.png"
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Images work with OpenAI, Anthropic, Gemini, OpenRouter, Mistral, Groq, Together, GitHub Copilot, Kimi, and
|
|
280
|
+
local/LM Studio/custom endpoints — provided the *model* is vision-capable (otherwise the provider returns an
|
|
281
|
+
error). DeepSeek has no image support here, so images are dropped with a warning. Images stay in the
|
|
282
|
+
current session's context but are not saved to the session database.
|
|
283
|
+
|
|
284
|
+
**Token savings:** only the 2 most recent image messages are re-sent on each call; older ones become a
|
|
285
|
+
short text note (stored history is untouched). With Pillow installed (`pip install "devorch[images]"`),
|
|
286
|
+
images larger than 1568px on the long side are downscaled before sending — typically several MB down to a
|
|
287
|
+
few hundred KB, with no visible loss for the model.
|
|
288
|
+
|
|
289
|
+
Tab completes paths after `@`. Mentions only expand when the path exists (emails and handles are left
|
|
290
|
+
alone); binary files are skipped, and large files are truncated.
|
|
291
|
+
|
|
292
|
+
### Cost Estimates
|
|
293
|
+
|
|
294
|
+
`/cost` shows the estimated cost of the session per model; the per-turn line, `/tokens`, and the bottom bar show
|
|
295
|
+
it too, and `--output json` adds `usage.cost_usd`. Each call is priced at the model that served it, so switching
|
|
296
|
+
models mid-session stays correct, cached/cache-write tokens use their own rates, and sub-agent calls are included.
|
|
297
|
+
|
|
298
|
+
Prices are **approximate list prices** and go stale. Models not in the built-in table are never guessed: they show
|
|
299
|
+
`no price` and are left out of the total (local Ollama / LM Studio are free). Add or override prices in
|
|
300
|
+
`~/.devorch/config.yaml` (USD per 1M tokens; the key is matched as a prefix of the model id):
|
|
301
|
+
|
|
302
|
+
```yaml
|
|
303
|
+
pricing:
|
|
304
|
+
claude-sonnet-4:
|
|
305
|
+
input: 3.0
|
|
306
|
+
output: 15.0
|
|
307
|
+
cache_read: 0.30 # optional, defaults to the input price
|
|
308
|
+
cache_write: 3.75 # optional, defaults to the input price
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Prompt Shortcuts
|
|
312
|
+
|
|
313
|
+
| Key | Action |
|
|
314
|
+
|-----|--------|
|
|
315
|
+
| `Enter` | Send |
|
|
316
|
+
| `Alt+Enter` / `Ctrl+J` | New line (Ctrl+J works in every terminal) |
|
|
317
|
+
| `Shift+Tab` | Cycle mode: ASK → AUTO → PLAN |
|
|
318
|
+
| `Tab` / `/` / `@` | Complete commands, skills and file paths |
|
|
319
|
+
| `↑` / `Ctrl+R` | Previous prompts / search history |
|
|
320
|
+
| `Ctrl+C` | Cancel the running turn (twice at an idle prompt to exit) |
|
|
321
|
+
|
|
322
|
+
The input sits in an open box with a quiet grey border and gutter; only the mode label is coloured (blue ASK,
|
|
323
|
+
amber AUTO, yellow PLAN), so the mode that decides whether tools run unasked is always visible without a loud frame.
|
|
324
|
+
The gutter follows multi-line and wrapped input, and the placeholder and bottom bar fit your terminal width (the
|
|
325
|
+
mode, model and token count are never clipped; the path, branch and key hints are dropped first on narrow terminals).
|
|
326
|
+
|
|
327
|
+
DevOrch clears the visible screen when the interactive REPL starts (your scrollback is kept). Set
|
|
328
|
+
`DEVORCH_NO_CLEAR=1` to turn that off.
|
|
329
|
+
|
|
330
|
+
The bottom bar shows the directory, git branch, model, mode, session tokens and how full the context window is
|
|
331
|
+
(`ctx 42%` — compaction starts at 100%).
|
|
332
|
+
|
|
333
|
+
### Cancelling a turn
|
|
334
|
+
|
|
335
|
+
**Ctrl+C** while DevOrch is working cancels just that turn (a running shell command is killed) and keeps
|
|
336
|
+
your session; any tool call that was cut short is recorded as cancelled so the conversation stays valid.
|
|
337
|
+
`/undo` reverts the turn's file changes. At an idle prompt, press **Ctrl+C twice** (or type `exit`) to
|
|
338
|
+
quit. In `ask` / `run`, Ctrl+C exits with status 130 (`--output json` reports `"error": "interrupted"`).
|
|
339
|
+
|
|
340
|
+
### Checkpoints & Undo
|
|
341
|
+
|
|
342
|
+
Before the agent modifies a file with `edit` or `filesystem write`, DevOrch snapshots the original.
|
|
343
|
+
`/undo` removes the last turn from the conversation **and restores those files** (files the agent
|
|
344
|
+
created are deleted). `/checkpoints` lists what changed per turn. Changes made through `shell`
|
|
345
|
+
commands are not tracked.
|
|
346
|
+
|
|
220
347
|
### MCP (Model Context Protocol)
|
|
221
348
|
|
|
222
349
|
Extend DevOrch with external tool servers:
|
|
@@ -253,6 +380,35 @@ devorch ask --mcp github --mcp filesystem "..." # Use specific servers
|
|
|
253
380
|
devorch run commit --no-mcp # Skip MCP entirely
|
|
254
381
|
```
|
|
255
382
|
|
|
383
|
+
### Project Settings
|
|
384
|
+
|
|
385
|
+
Commit shared defaults to your repo in `<project>/.devorch/settings.yaml`:
|
|
386
|
+
|
|
387
|
+
```yaml
|
|
388
|
+
default_mode: ask # ask | auto | plan
|
|
389
|
+
default_provider: anthropic
|
|
390
|
+
providers:
|
|
391
|
+
anthropic:
|
|
392
|
+
default_model: claude-sonnet-4-20250514
|
|
393
|
+
mcp_servers: # merged over ~/.devorch/config.yaml
|
|
394
|
+
github:
|
|
395
|
+
command: npx
|
|
396
|
+
args: ["-y", "@modelcontextprotocol/server-github"]
|
|
397
|
+
permissions:
|
|
398
|
+
shell:
|
|
399
|
+
allow: ["pytest*", "ruff *"]
|
|
400
|
+
deny: ["git push*"]
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
Precedence: CLI flags > project settings > `~/.devorch/config.yaml`. The file is found from the current
|
|
404
|
+
directory upward. API keys are never read from it, and project values are never written back to your
|
|
405
|
+
global config.
|
|
406
|
+
|
|
407
|
+
**Trust:** a cloned repo must not be able to grant itself power. Project `hooks.yaml` is covered too and is ignored until trusted. Without trust, `deny` rules, provider/model
|
|
408
|
+
and `default_mode: ask|plan` apply, but `mcp_servers`, `allow` rules, `default_mode: auto` and project hooks are ignored
|
|
409
|
+
(you get a warning). Review the files and run `devorch trust` to enable them; trust is tied to a hash of
|
|
410
|
+
`settings.yaml` + `hooks.yaml`, so any change to either needs `devorch trust` again. `devorch untrust` revokes it.
|
|
411
|
+
|
|
256
412
|
### Modes
|
|
257
413
|
|
|
258
414
|
| Mode | Behavior |
|
|
@@ -311,7 +467,35 @@ devorch memory clear # Clear project memory
|
|
|
311
467
|
devorch init # Generate or update DEVORCH.md repository instructions
|
|
312
468
|
```
|
|
313
469
|
|
|
314
|
-
|
|
470
|
+
### Machine-readable output
|
|
471
|
+
|
|
472
|
+
```bash
|
|
473
|
+
devorch ask --output json "list the TODOs in this repo" | jq .result
|
|
474
|
+
devorch run review --output stream-json # NDJSON: one event per tool call, then the result
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
With `--output json` stdout contains a single JSON object (`result`, `is_error`, `error`, `provider`,
|
|
478
|
+
`model`, `duration_ms`, `usage`, `tool_calls`); UI output goes to stderr and the exit code is non-zero
|
|
479
|
+
on failure, so it is safe to use in scripts and CI. `stream-json` emits `tool_call` events as they happen
|
|
480
|
+
followed by a final `result` event. Available on `ask` and `run`.
|
|
481
|
+
|
|
482
|
+
All non-interactive commands support `--provider`, `--model`, `--mode`, `--mcp`, `--no-mcp` and
|
|
483
|
+
`--dangerously-skip-permissions`. `devorch` / `devorch chat` take `--mode` and `--dangerously-skip-permissions`
|
|
484
|
+
too, so you can start the REPL in a given mode.
|
|
485
|
+
|
|
486
|
+
### Skipping permission prompts
|
|
487
|
+
|
|
488
|
+
```bash
|
|
489
|
+
devorch --dangerously-skip-permissions # start the REPL in AUTO mode
|
|
490
|
+
devorch ask --dangerously-skip-permissions "run the tests and fix failures"
|
|
491
|
+
devorch --mode plan # or start in plan / ask mode
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
`--dangerously-skip-permissions` is the same as `--mode auto`: **no prompts at all**, so the agent can edit files
|
|
495
|
+
and run commands unasked. It is not a full bypass: the built-in dangerous-command blocks (`rm -rf *`, `sudo`, ...)
|
|
496
|
+
and your own `deny` rules still apply, and project hooks still run. It conflicts with `--mode ask|plan`, and it
|
|
497
|
+
overrides a project's `default_mode`. In the REPL, `/auto` and `/ask` switch the same behaviour on and off, and
|
|
498
|
+
`/permissions allow --session shell pytest*` skips prompts for just one kind of command.
|
|
315
499
|
|
|
316
500
|
## All Slash Commands
|
|
317
501
|
|
|
@@ -341,13 +525,19 @@ All non-interactive commands support `--provider`, `--model`, `--mode`, `--mcp`,
|
|
|
341
525
|
| `/clear` | Clear history (saves accomplishments to project memory) |
|
|
342
526
|
| `/compact` | Summarize and compact conversation history to save tokens |
|
|
343
527
|
| `/save` | Save conversation history to a file |
|
|
344
|
-
| `/undo` | Undo last message and agent turn |
|
|
528
|
+
| `/undo` | Undo last message and agent turn, restoring any files it edited |
|
|
529
|
+
| `/checkpoints` | List files changed by the agent this session, per turn |
|
|
345
530
|
| `/mcp` | Show MCP server status |
|
|
346
531
|
| `/mcp add <name> <cmd> [args]` | Connect a new MCP server mid-session |
|
|
347
532
|
| `/mcp start <name>` | Reconnect a server from config |
|
|
348
533
|
| `/mcp stop <name>` | Disconnect a server and remove its tools |
|
|
349
534
|
| `/config` | Show configuration settings |
|
|
350
|
-
| `/permissions` | Show
|
|
535
|
+
| `/permissions` | Show permissions; change them with `/permissions allow\|deny [--session] <tool> <pattern>`, `set <tool> <allow\|deny\|ask>`, `reset` |
|
|
536
|
+
| `/sessions` | `list [n]`, `show <id>`, `delete <id>` (resume with `devorch --resume <id>`) |
|
|
537
|
+
| `/hooks` | Show active hooks and whether project hooks are trusted |
|
|
538
|
+
| `/trust` / `/untrust` | Trust (or stop trusting) this project's `.devorch` settings and hooks |
|
|
539
|
+
| `/cost` | Estimated session cost per model |
|
|
540
|
+
| `/exit` | Exit DevOrch (also `exit`, `quit`, or Ctrl+C twice) |
|
|
351
541
|
| `/tasks` | Show multi-step task list and execution progress |
|
|
352
542
|
|
|
353
543
|
## Configuration
|
|
@@ -417,28 +607,21 @@ mcp_servers:
|
|
|
417
607
|
|
|
418
608
|
## Contributing
|
|
419
609
|
|
|
420
|
-
Contributions are welcome!
|
|
610
|
+
Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide (setup, workflow, how to add a
|
|
611
|
+
provider, tool or slash command, testing notes). The short version:
|
|
421
612
|
|
|
422
613
|
```bash
|
|
423
|
-
# Clone and install in development mode
|
|
424
614
|
git clone https://github.com/Amanbig/DevOrch.git
|
|
425
615
|
cd DevOrch
|
|
426
616
|
pip install -e ".[dev]"
|
|
427
617
|
|
|
428
|
-
#
|
|
429
|
-
|
|
430
|
-
ruff format .
|
|
431
|
-
|
|
432
|
-
# Run tests
|
|
433
|
-
pytest
|
|
618
|
+
ruff check . && ruff format . # lint and format
|
|
619
|
+
pytest # tests (no network or API keys needed)
|
|
434
620
|
```
|
|
435
621
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
-
|
|
439
|
-
- Add tests for new features
|
|
440
|
-
- Keep PRs focused — one feature or fix per PR
|
|
441
|
-
- Update the README if adding user-facing features
|
|
622
|
+
- Keep PRs focused: one feature or fix per PR, with tests, and update the README/CHANGELOG for user-facing changes
|
|
623
|
+
- Please follow the [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
624
|
+
- Security issues: report them privately, see [SECURITY.md](SECURITY.md)
|
|
442
625
|
|
|
443
626
|
### Project Structure
|
|
444
627
|
|
|
@@ -463,8 +646,9 @@ DevOrch/
|
|
|
463
646
|
|
|
464
647
|
## Roadmap
|
|
465
648
|
|
|
466
|
-
- [
|
|
467
|
-
- [
|
|
649
|
+
- [x] Streaming responses
|
|
650
|
+
- [x] Image input
|
|
651
|
+
- [x] `@file` mentions (multi-file context)
|
|
468
652
|
- [ ] Plugin marketplace
|
|
469
653
|
- [ ] VS Code extension
|
|
470
654
|
- [ ] Agent-to-agent delegation
|