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.
Files changed (123) hide show
  1. devorch-0.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +60 -0
  2. devorch-0.5.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. devorch-0.5.0/.github/ISSUE_TEMPLATE/feature_request.yml +25 -0
  4. devorch-0.5.0/.github/PULL_REQUEST_TEMPLATE.md +18 -0
  5. devorch-0.5.0/.github/dependabot.yml +11 -0
  6. {devorch-0.4.0 → devorch-0.5.0}/.github/workflows/ci.yml +0 -2
  7. devorch-0.5.0/CHANGELOG.md +52 -0
  8. devorch-0.5.0/CODE_OF_CONDUCT.md +32 -0
  9. devorch-0.5.0/CONTRIBUTING.md +80 -0
  10. {devorch-0.4.0 → devorch-0.5.0}/PKG-INFO +220 -36
  11. {devorch-0.4.0 → devorch-0.5.0}/README.md +214 -34
  12. devorch-0.5.0/SECURITY.md +34 -0
  13. devorch-0.5.0/cli/commands/_output.py +151 -0
  14. {devorch-0.4.0 → devorch-0.5.0}/cli/commands/_shared.py +43 -5
  15. {devorch-0.4.0 → devorch-0.5.0}/cli/commands/ask.py +40 -13
  16. {devorch-0.4.0 → devorch-0.5.0}/cli/commands/edit.py +15 -3
  17. {devorch-0.4.0 → devorch-0.5.0}/cli/commands/run.py +37 -14
  18. {devorch-0.4.0 → devorch-0.5.0}/cli/constants.py +88 -32
  19. {devorch-0.4.0 → devorch-0.5.0}/cli/main.py +249 -113
  20. devorch-0.5.0/cli/prompt_ui.py +258 -0
  21. devorch-0.5.0/cli/repl_commands.py +259 -0
  22. {devorch-0.4.0 → devorch-0.5.0}/config/permissions.py +46 -4
  23. devorch-0.5.0/config/project_settings.py +235 -0
  24. {devorch-0.4.0 → devorch-0.5.0}/config/settings.py +61 -2
  25. {devorch-0.4.0 → devorch-0.5.0}/core/agent.py +99 -183
  26. devorch-0.5.0/core/checkpoints.py +103 -0
  27. {devorch-0.4.0 → devorch-0.5.0}/core/context.py +5 -0
  28. {devorch-0.4.0 → devorch-0.5.0}/core/executor.py +38 -2
  29. devorch-0.5.0/core/hooks.py +182 -0
  30. devorch-0.5.0/core/images.py +115 -0
  31. devorch-0.5.0/core/mentions.py +118 -0
  32. devorch-0.5.0/core/pricing.py +161 -0
  33. {devorch-0.4.0 → devorch-0.5.0}/core/skills.py +81 -1
  34. {devorch-0.4.0 → devorch-0.5.0}/providers/anthropic.py +83 -10
  35. devorch-0.5.0/providers/base.py +340 -0
  36. {devorch-0.4.0 → devorch-0.5.0}/providers/custom.py +15 -3
  37. {devorch-0.4.0 → devorch-0.5.0}/providers/deepseek.py +14 -3
  38. {devorch-0.4.0 → devorch-0.5.0}/providers/gemini.py +39 -9
  39. {devorch-0.4.0 → devorch-0.5.0}/providers/github_copilot.py +15 -3
  40. {devorch-0.4.0 → devorch-0.5.0}/providers/groq.py +14 -4
  41. {devorch-0.4.0 → devorch-0.5.0}/providers/kimi.py +15 -3
  42. {devorch-0.4.0 → devorch-0.5.0}/providers/lmstudio.py +14 -4
  43. {devorch-0.4.0 → devorch-0.5.0}/providers/local.py +19 -5
  44. {devorch-0.4.0 → devorch-0.5.0}/providers/mistral.py +14 -4
  45. {devorch-0.4.0 → devorch-0.5.0}/providers/openai.py +13 -4
  46. {devorch-0.4.0 → devorch-0.5.0}/providers/openrouter.py +50 -4
  47. {devorch-0.4.0 → devorch-0.5.0}/providers/together.py +14 -4
  48. {devorch-0.4.0 → devorch-0.5.0}/pyproject.toml +5 -2
  49. {devorch-0.4.0 → devorch-0.5.0}/schemas/message.py +15 -0
  50. devorch-0.5.0/tests/_screen.py +78 -0
  51. devorch-0.5.0/tests/conftest.py +43 -0
  52. devorch-0.5.0/tests/test_anthropic_caching.py +134 -0
  53. devorch-0.5.0/tests/test_boxed_input.py +209 -0
  54. devorch-0.5.0/tests/test_checkpoints.py +85 -0
  55. devorch-0.5.0/tests/test_custom_commands.py +68 -0
  56. devorch-0.5.0/tests/test_git_tool.py +87 -0
  57. devorch-0.5.0/tests/test_hooks.py +145 -0
  58. devorch-0.5.0/tests/test_images.py +209 -0
  59. devorch-0.5.0/tests/test_interrupt.py +195 -0
  60. devorch-0.5.0/tests/test_isolation.py +41 -0
  61. devorch-0.5.0/tests/test_json_output.py +90 -0
  62. devorch-0.5.0/tests/test_mentions.py +105 -0
  63. devorch-0.5.0/tests/test_openrouter_caching.py +85 -0
  64. devorch-0.5.0/tests/test_prefix_stability.py +55 -0
  65. devorch-0.5.0/tests/test_pricing.py +243 -0
  66. devorch-0.5.0/tests/test_proc.py +107 -0
  67. devorch-0.5.0/tests/test_project_settings.py +154 -0
  68. devorch-0.5.0/tests/test_prompt_ui.py +287 -0
  69. devorch-0.5.0/tests/test_repl_commands.py +307 -0
  70. devorch-0.5.0/tests/test_streaming.py +422 -0
  71. devorch-0.5.0/tests/test_tool_display.py +278 -0
  72. {devorch-0.4.0 → devorch-0.5.0}/tools/__init__.py +3 -0
  73. {devorch-0.4.0 → devorch-0.5.0}/tools/agent.py +11 -2
  74. devorch-0.5.0/tools/git.py +173 -0
  75. {devorch-0.4.0 → devorch-0.5.0}/tools/shell.py +2 -10
  76. {devorch-0.4.0 → devorch-0.5.0}/utils/logger.py +35 -14
  77. devorch-0.5.0/utils/proc.py +77 -0
  78. devorch-0.5.0/utils/streaming.py +78 -0
  79. devorch-0.5.0/utils/tool_display.py +210 -0
  80. devorch-0.4.0/providers/base.py +0 -141
  81. devorch-0.4.0/tools/git.py +0 -0
  82. {devorch-0.4.0 → devorch-0.5.0}/.github/workflows/publish.yml +0 -0
  83. {devorch-0.4.0 → devorch-0.5.0}/.gitignore +0 -0
  84. {devorch-0.4.0 → devorch-0.5.0}/DEVORCH.md +0 -0
  85. {devorch-0.4.0 → devorch-0.5.0}/LICENSE +0 -0
  86. {devorch-0.4.0 → devorch-0.5.0}/assets/chat.png +0 -0
  87. {devorch-0.4.0 → devorch-0.5.0}/assets/models.png +0 -0
  88. {devorch-0.4.0 → devorch-0.5.0}/assets/providers.png +0 -0
  89. {devorch-0.4.0 → devorch-0.5.0}/assets/startup.png +0 -0
  90. {devorch-0.4.0 → devorch-0.5.0}/assets/terminal.png +0 -0
  91. {devorch-0.4.0 → devorch-0.5.0}/assets/tools.png +0 -0
  92. {devorch-0.4.0 → devorch-0.5.0}/config/profiles.py +0 -0
  93. {devorch-0.4.0 → devorch-0.5.0}/core/loop_detector.py +0 -0
  94. {devorch-0.4.0 → devorch-0.5.0}/core/mcp.py +0 -0
  95. {devorch-0.4.0 → devorch-0.5.0}/core/memory.py +0 -0
  96. {devorch-0.4.0 → devorch-0.5.0}/core/modes.py +0 -0
  97. {devorch-0.4.0 → devorch-0.5.0}/core/planner.py +0 -0
  98. {devorch-0.4.0 → devorch-0.5.0}/core/project_context.py +0 -0
  99. {devorch-0.4.0 → devorch-0.5.0}/core/project_memory.py +0 -0
  100. {devorch-0.4.0 → devorch-0.5.0}/core/sessions.py +0 -0
  101. {devorch-0.4.0 → devorch-0.5.0}/core/tasks.py +0 -0
  102. {devorch-0.4.0 → devorch-0.5.0}/providers/__init__.py +0 -0
  103. {devorch-0.4.0 → devorch-0.5.0}/schemas/task.py +0 -0
  104. {devorch-0.4.0 → devorch-0.5.0}/schemas/tool.py +0 -0
  105. {devorch-0.4.0 → devorch-0.5.0}/tests/__init__.py +0 -0
  106. {devorch-0.4.0 → devorch-0.5.0}/tests/test_context.py +0 -0
  107. {devorch-0.4.0 → devorch-0.5.0}/tests/test_core.py +0 -0
  108. {devorch-0.4.0 → devorch-0.5.0}/tests/test_integration.py +0 -0
  109. {devorch-0.4.0 → devorch-0.5.0}/tests/test_loop_detector.py +0 -0
  110. {devorch-0.4.0 → devorch-0.5.0}/tests/test_permissions.py +0 -0
  111. {devorch-0.4.0 → devorch-0.5.0}/tests/test_project_context.py +0 -0
  112. {devorch-0.4.0 → devorch-0.5.0}/tests/test_project_memory.py +0 -0
  113. {devorch-0.4.0 → devorch-0.5.0}/tests/test_schemas.py +0 -0
  114. {devorch-0.4.0 → devorch-0.5.0}/tests/test_tools.py +0 -0
  115. {devorch-0.4.0 → devorch-0.5.0}/tools/base.py +0 -0
  116. {devorch-0.4.0 → devorch-0.5.0}/tools/edit.py +0 -0
  117. {devorch-0.4.0 → devorch-0.5.0}/tools/filesystem.py +0 -0
  118. {devorch-0.4.0 → devorch-0.5.0}/tools/grep.py +0 -0
  119. {devorch-0.4.0 → devorch-0.5.0}/tools/search.py +0 -0
  120. {devorch-0.4.0 → devorch-0.5.0}/tools/task.py +0 -0
  121. {devorch-0.4.0 → devorch-0.5.0}/tools/terminal_session.py +0 -0
  122. {devorch-0.4.0 → devorch-0.5.0}/tools/tests.py +0 -0
  123. {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,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Report a security vulnerability
4
+ url: https://github.com/Amanbig/DevOrch/security/advisories/new
5
+ about: Please report security issues privately, not as a public issue.
@@ -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,11 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "monthly"
7
+ open-pull-requests-limit: 5
8
+ - package-ecosystem: "github-actions"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "monthly"
@@ -1,8 +1,6 @@
1
1
  name: CI
2
2
 
3
3
  on:
4
- push:
5
- branches: [main]
6
4
  pull_request:
7
5
  branches: [main]
8
6
 
@@ -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.4.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.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
- | ![Startup](https://raw.githubusercontent.com/Amanbig/DevOrch/main/assets/startup.png) | ![Chat](https://raw.githubusercontent.com/Amanbig/DevOrch/main/assets/chat.png) |
66
-
67
- | Provider Selection | Model Selection |
68
- |--------------------|-----------------|
69
- | ![Providers](https://raw.githubusercontent.com/Amanbig/DevOrch/main/assets/providers.png) | ![Models](https://raw.githubusercontent.com/Amanbig/DevOrch/main/assets/models.png) |
70
-
71
- | Tool Execution | Terminal Session |
72
- |----------------|-----------------|
73
- | ![Tools](https://raw.githubusercontent.com/Amanbig/DevOrch/main/assets/tools.png) | ![Terminal](https://raw.githubusercontent.com/Amanbig/DevOrch/main/assets/terminal.png) |
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 (`git status`, `npm install`, etc.) |
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
- All non-interactive commands support `--provider`, `--model`, `--mode`, `--mcp`, and `--no-mcp`.
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 and manage tool permission settings |
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! Here's how to get started:
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
- # Run linting
429
- ruff check .
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
- ### Guidelines
437
-
438
- - Run `ruff check .` and `ruff format .` before submitting
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
- - [ ] Streaming responses
467
- - [ ] Multi-file context awareness
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