Metadata-Version: 2.4
Name: composez-aider-fork
Version: 0.86.2
Summary: Composez aider fork to support pluggability and novel editing
Project-URL: Homepage, https://github.com/kmewhort/composez-aider-fork
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development
Requires-Python: <3.13,>=3.10
Description-Content-Type: text/markdown
License-File: LICENSE.txt
Requires-Dist: aiohappyeyeballs==2.6.1
Requires-Dist: aiohttp==3.13.3
Requires-Dist: aiosignal==1.4.0
Requires-Dist: annotated-doc==0.0.4
Requires-Dist: annotated-types==0.7.0
Requires-Dist: anyio==4.12.1
Requires-Dist: asgiref==3.11.1
Requires-Dist: attrs==25.4.0
Requires-Dist: backoff==2.2.1
Requires-Dist: beautifulsoup4==4.14.3
Requires-Dist: certifi==2026.1.4
Requires-Dist: cffi==2.0.0
Requires-Dist: charset-normalizer==3.4.4
Requires-Dist: click==8.3.1
Requires-Dist: configargparse==1.7.1
Requires-Dist: diff-match-patch==20241021
Requires-Dist: diskcache==5.6.3
Requires-Dist: distro==1.9.0
Requires-Dist: fastapi==0.128.8
Requires-Dist: fastuuid==0.14.0
Requires-Dist: filelock==3.20.3
Requires-Dist: flake8==7.3.0
Requires-Dist: frozenlist==1.8.0
Requires-Dist: fsspec==2026.2.0
Requires-Dist: gitdb==4.0.12
Requires-Dist: gitpython==3.1.46
Requires-Dist: grep-ast==0.9.0
Requires-Dist: h11==0.16.0
Requires-Dist: hf-xet==1.2.0
Requires-Dist: httpcore==1.0.9
Requires-Dist: httpx==0.28.1
Requires-Dist: huggingface-hub==1.4.1
Requires-Dist: idna==3.11
Requires-Dist: importlib-metadata==7.2.1
Requires-Dist: importlib-resources==6.5.2
Requires-Dist: jinja2==3.1.6
Requires-Dist: jiter==0.13.0
Requires-Dist: json5==0.13.0
Requires-Dist: jsonschema==4.26.0
Requires-Dist: jsonschema-specifications==2025.9.1
Requires-Dist: litellm==1.81.10
Requires-Dist: markdown-it-py==4.0.0
Requires-Dist: markupsafe==3.0.3
Requires-Dist: mccabe==0.7.0
Requires-Dist: mdurl==0.1.2
Requires-Dist: mixpanel==5.0.0
Requires-Dist: mslex==1.3.0
Requires-Dist: multidict==6.7.1
Requires-Dist: networkx==3.4.2
Requires-Dist: numpy==1.26.4
Requires-Dist: openai==2.20.0
Requires-Dist: orjson==3.11.7
Requires-Dist: oslex==0.1.3
Requires-Dist: packaging==26.0
Requires-Dist: pathspec==1.0.4
Requires-Dist: pexpect==4.9.0
Requires-Dist: pillow==12.1.1
Requires-Dist: posthog==7.8.6
Requires-Dist: prompt-toolkit==3.0.52
Requires-Dist: propcache==0.4.1
Requires-Dist: psutil==7.2.2
Requires-Dist: ptyprocess==0.7.0
Requires-Dist: pycodestyle==2.14.0
Requires-Dist: pycparser==3.0
Requires-Dist: pydantic==2.12.5
Requires-Dist: pydantic-core==2.41.5
Requires-Dist: pydub==0.25.1
Requires-Dist: pyflakes==3.4.0
Requires-Dist: pygments==2.19.2
Requires-Dist: pypandoc==1.16.2
Requires-Dist: pyperclip==1.11.0
Requires-Dist: python-dateutil==2.9.0.post0
Requires-Dist: python-dotenv==1.2.1
Requires-Dist: pyyaml==6.0.3
Requires-Dist: referencing==0.37.0
Requires-Dist: regex==2026.1.15
Requires-Dist: requests==2.32.5
Requires-Dist: rich==14.3.2
Requires-Dist: rpds-py==0.30.0
Requires-Dist: scipy==1.15.3
Requires-Dist: shellingham==1.5.4
Requires-Dist: shtab==1.8.0
Requires-Dist: six==1.17.0
Requires-Dist: smmap==5.0.2
Requires-Dist: sniffio==1.3.1
Requires-Dist: socksio==1.0.0
Requires-Dist: sounddevice==0.5.5
Requires-Dist: soundfile==0.13.1
Requires-Dist: soupsieve==2.8.3
Requires-Dist: starlette==0.52.1
Requires-Dist: tiktoken==0.12.0
Requires-Dist: tokenizers==0.22.2
Requires-Dist: tqdm==4.67.3
Requires-Dist: tree-sitter-c-sharp==0.23.1
Requires-Dist: tree-sitter-embedded-template==0.25.0
Requires-Dist: tree-sitter-language-pack==0.13.0
Requires-Dist: tree-sitter-yaml==0.7.2
Requires-Dist: typer==0.23.0
Requires-Dist: typer-slim==0.23.0
Requires-Dist: typing-extensions==4.15.0
Requires-Dist: typing-inspection==0.4.2
Requires-Dist: urllib3==2.6.3
Requires-Dist: watchfiles==1.1.1
Requires-Dist: wcwidth==0.6.0
Requires-Dist: yarl==1.22.0
Requires-Dist: zipp==3.23.0
Requires-Dist: tree-sitter==0.23.2; python_version < "3.10"
Requires-Dist: tree-sitter==0.25.2; python_version >= "3.10"
Provides-Extra: dev
Requires-Dist: annotated-doc==0.0.4; extra == "dev"
Requires-Dist: build==1.4.0; extra == "dev"
Requires-Dist: certifi==2026.1.4; extra == "dev"
Requires-Dist: cffi==2.0.0; extra == "dev"
Requires-Dist: cfgv==3.5.0; extra == "dev"
Requires-Dist: charset-normalizer==3.4.4; extra == "dev"
Requires-Dist: click==8.3.1; extra == "dev"
Requires-Dist: codespell==2.4.1; extra == "dev"
Requires-Dist: cogapp==3.6.0; extra == "dev"
Requires-Dist: contourpy==1.3.3; extra == "dev"
Requires-Dist: coverage[toml]==7.13.4; extra == "dev"
Requires-Dist: cryptography==46.0.5; extra == "dev"
Requires-Dist: cycler==0.12.1; extra == "dev"
Requires-Dist: distlib==0.4.0; extra == "dev"
Requires-Dist: filelock==3.20.3; extra == "dev"
Requires-Dist: fonttools==4.61.1; extra == "dev"
Requires-Dist: google-api-core[grpc]==2.29.0; extra == "dev"
Requires-Dist: google-auth==2.48.0; extra == "dev"
Requires-Dist: google-cloud-bigquery==3.40.0; extra == "dev"
Requires-Dist: google-cloud-core==2.5.0; extra == "dev"
Requires-Dist: google-crc32c==1.8.0; extra == "dev"
Requires-Dist: google-resumable-media==2.8.0; extra == "dev"
Requires-Dist: googleapis-common-protos==1.72.0; extra == "dev"
Requires-Dist: grpcio==1.78.0; extra == "dev"
Requires-Dist: grpcio-status==1.78.0; extra == "dev"
Requires-Dist: identify==2.6.16; extra == "dev"
Requires-Dist: idna==3.11; extra == "dev"
Requires-Dist: imgcat==0.6.0; extra == "dev"
Requires-Dist: iniconfig==2.3.0; extra == "dev"
Requires-Dist: kiwisolver==1.4.9; extra == "dev"
Requires-Dist: lox==1.0.0; extra == "dev"
Requires-Dist: markdown-it-py==4.0.0; extra == "dev"
Requires-Dist: matplotlib==3.10.8; extra == "dev"
Requires-Dist: mdurl==0.1.2; extra == "dev"
Requires-Dist: nodeenv==1.10.0; extra == "dev"
Requires-Dist: numpy==1.26.4; extra == "dev"
Requires-Dist: packaging==26.0; extra == "dev"
Requires-Dist: pandas==2.3.3; extra == "dev"
Requires-Dist: pillow==12.1.1; extra == "dev"
Requires-Dist: pip==26.0.1; extra == "dev"
Requires-Dist: pip-tools==7.5.2; extra == "dev"
Requires-Dist: platformdirs==4.5.1; extra == "dev"
Requires-Dist: pluggy==1.6.0; extra == "dev"
Requires-Dist: pre-commit==4.5.1; extra == "dev"
Requires-Dist: proto-plus==1.27.1; extra == "dev"
Requires-Dist: protobuf==6.33.5; extra == "dev"
Requires-Dist: pyasn1==0.6.2; extra == "dev"
Requires-Dist: pyasn1-modules==0.4.2; extra == "dev"
Requires-Dist: pycparser==3.0; extra == "dev"
Requires-Dist: pygments==2.19.2; extra == "dev"
Requires-Dist: pyparsing==3.3.2; extra == "dev"
Requires-Dist: pyproject-hooks==1.2.0; extra == "dev"
Requires-Dist: pytest==9.0.2; extra == "dev"
Requires-Dist: pytest-cov==7.0.0; extra == "dev"
Requires-Dist: pytest-env==1.2.0; extra == "dev"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "dev"
Requires-Dist: pytz==2025.2; extra == "dev"
Requires-Dist: pyyaml==6.0.3; extra == "dev"
Requires-Dist: requests==2.32.5; extra == "dev"
Requires-Dist: rich==14.3.2; extra == "dev"
Requires-Dist: rsa==4.9.1; extra == "dev"
Requires-Dist: semver==3.0.4; extra == "dev"
Requires-Dist: setuptools==82.0.0; extra == "dev"
Requires-Dist: shellingham==1.5.4; extra == "dev"
Requires-Dist: six==1.17.0; extra == "dev"
Requires-Dist: typer==0.23.0; extra == "dev"
Requires-Dist: typing-extensions==4.15.0; extra == "dev"
Requires-Dist: tzdata==2025.3; extra == "dev"
Requires-Dist: urllib3==2.6.3; extra == "dev"
Requires-Dist: uv==0.10.2; extra == "dev"
Requires-Dist: virtualenv==20.36.1; extra == "dev"
Requires-Dist: wheel==0.46.3; extra == "dev"
Provides-Extra: help
Requires-Dist: aiohappyeyeballs==2.6.1; extra == "help"
Requires-Dist: aiohttp==3.13.3; extra == "help"
Requires-Dist: aiosignal==1.4.0; extra == "help"
Requires-Dist: aiosqlite==0.22.1; extra == "help"
Requires-Dist: annotated-doc==0.0.4; extra == "help"
Requires-Dist: annotated-types==0.7.0; extra == "help"
Requires-Dist: anyio==4.12.1; extra == "help"
Requires-Dist: attrs==25.4.0; extra == "help"
Requires-Dist: banks==2.4.0; extra == "help"
Requires-Dist: certifi==2026.1.4; extra == "help"
Requires-Dist: charset-normalizer==3.4.4; extra == "help"
Requires-Dist: click==8.3.1; extra == "help"
Requires-Dist: colorama==0.4.6; extra == "help"
Requires-Dist: dataclasses-json==0.6.7; extra == "help"
Requires-Dist: deprecated==1.3.1; extra == "help"
Requires-Dist: dirtyjson==1.0.8; extra == "help"
Requires-Dist: filelock==3.20.3; extra == "help"
Requires-Dist: filetype==1.2.0; extra == "help"
Requires-Dist: frozenlist==1.8.0; extra == "help"
Requires-Dist: fsspec==2026.2.0; extra == "help"
Requires-Dist: greenlet==3.3.1; extra == "help"
Requires-Dist: griffe==2.0.0; extra == "help"
Requires-Dist: griffecli==2.0.0; extra == "help"
Requires-Dist: griffelib==2.0.0; extra == "help"
Requires-Dist: h11==0.16.0; extra == "help"
Requires-Dist: hf-xet==1.2.0; extra == "help"
Requires-Dist: httpcore==1.0.9; extra == "help"
Requires-Dist: httpx==0.28.1; extra == "help"
Requires-Dist: huggingface-hub[inference]==1.4.1; extra == "help"
Requires-Dist: idna==3.11; extra == "help"
Requires-Dist: jinja2==3.1.6; extra == "help"
Requires-Dist: joblib==1.5.3; extra == "help"
Requires-Dist: llama-index-core==0.14.14; extra == "help"
Requires-Dist: llama-index-embeddings-huggingface==0.6.1; extra == "help"
Requires-Dist: llama-index-instrumentation==0.4.2; extra == "help"
Requires-Dist: llama-index-workflows==2.14.1; extra == "help"
Requires-Dist: markdown-it-py==4.0.0; extra == "help"
Requires-Dist: markupsafe==3.0.3; extra == "help"
Requires-Dist: marshmallow==3.26.2; extra == "help"
Requires-Dist: mdurl==0.1.2; extra == "help"
Requires-Dist: mpmath==1.3.0; extra == "help"
Requires-Dist: multidict==6.7.1; extra == "help"
Requires-Dist: mypy-extensions==1.1.0; extra == "help"
Requires-Dist: nest-asyncio==1.6.0; extra == "help"
Requires-Dist: networkx==3.4.2; extra == "help"
Requires-Dist: nltk==3.9.2; extra == "help"
Requires-Dist: numpy==1.26.4; extra == "help"
Requires-Dist: packaging==26.0; extra == "help"
Requires-Dist: pillow==12.1.1; extra == "help"
Requires-Dist: platformdirs==4.5.1; extra == "help"
Requires-Dist: propcache==0.4.1; extra == "help"
Requires-Dist: pydantic==2.12.5; extra == "help"
Requires-Dist: pydantic-core==2.41.5; extra == "help"
Requires-Dist: pygments==2.19.2; extra == "help"
Requires-Dist: pyyaml==6.0.3; extra == "help"
Requires-Dist: regex==2026.1.15; extra == "help"
Requires-Dist: requests==2.32.5; extra == "help"
Requires-Dist: rich==14.3.2; extra == "help"
Requires-Dist: safetensors==0.7.0; extra == "help"
Requires-Dist: scikit-learn==1.8.0; extra == "help"
Requires-Dist: scipy==1.15.3; extra == "help"
Requires-Dist: sentence-transformers==5.2.2; extra == "help"
Requires-Dist: setuptools==82.0.0; extra == "help"
Requires-Dist: shellingham==1.5.4; extra == "help"
Requires-Dist: sqlalchemy[asyncio]==2.0.46; extra == "help"
Requires-Dist: sympy==1.14.0; extra == "help"
Requires-Dist: tenacity==9.1.4; extra == "help"
Requires-Dist: threadpoolctl==3.6.0; extra == "help"
Requires-Dist: tiktoken==0.12.0; extra == "help"
Requires-Dist: tokenizers==0.22.2; extra == "help"
Requires-Dist: torch==2.10.0; extra == "help"
Requires-Dist: tqdm==4.67.3; extra == "help"
Requires-Dist: transformers==5.1.0; extra == "help"
Requires-Dist: typer==0.23.0; extra == "help"
Requires-Dist: typer-slim==0.23.0; extra == "help"
Requires-Dist: typing-extensions==4.15.0; extra == "help"
Requires-Dist: typing-inspect==0.9.0; extra == "help"
Requires-Dist: typing-inspection==0.4.2; extra == "help"
Requires-Dist: urllib3==2.6.3; extra == "help"
Requires-Dist: wrapt==2.1.1; extra == "help"
Requires-Dist: yarl==1.22.0; extra == "help"
Provides-Extra: browser
Requires-Dist: altair==6.0.0; extra == "browser"
Requires-Dist: attrs==25.4.0; extra == "browser"
Requires-Dist: blinker==1.9.0; extra == "browser"
Requires-Dist: cachetools==6.2.6; extra == "browser"
Requires-Dist: certifi==2026.1.4; extra == "browser"
Requires-Dist: charset-normalizer==3.4.4; extra == "browser"
Requires-Dist: click==8.3.1; extra == "browser"
Requires-Dist: gitdb==4.0.12; extra == "browser"
Requires-Dist: gitpython==3.1.46; extra == "browser"
Requires-Dist: idna==3.11; extra == "browser"
Requires-Dist: jinja2==3.1.6; extra == "browser"
Requires-Dist: jsonschema==4.26.0; extra == "browser"
Requires-Dist: jsonschema-specifications==2025.9.1; extra == "browser"
Requires-Dist: markupsafe==3.0.3; extra == "browser"
Requires-Dist: narwhals==2.16.0; extra == "browser"
Requires-Dist: numpy==1.26.4; extra == "browser"
Requires-Dist: packaging==26.0; extra == "browser"
Requires-Dist: pandas==2.3.3; extra == "browser"
Requires-Dist: pillow==12.1.1; extra == "browser"
Requires-Dist: protobuf==6.33.5; extra == "browser"
Requires-Dist: pyarrow==23.0.0; extra == "browser"
Requires-Dist: pydeck==0.9.1; extra == "browser"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "browser"
Requires-Dist: pytz==2025.2; extra == "browser"
Requires-Dist: referencing==0.37.0; extra == "browser"
Requires-Dist: requests==2.32.5; extra == "browser"
Requires-Dist: rpds-py==0.30.0; extra == "browser"
Requires-Dist: six==1.17.0; extra == "browser"
Requires-Dist: smmap==5.0.2; extra == "browser"
Requires-Dist: streamlit==1.54.0; extra == "browser"
Requires-Dist: tenacity==9.1.4; extra == "browser"
Requires-Dist: toml==0.10.2; extra == "browser"
Requires-Dist: tornado==6.5.4; extra == "browser"
Requires-Dist: typing-extensions==4.15.0; extra == "browser"
Requires-Dist: tzdata==2025.3; extra == "browser"
Requires-Dist: urllib3==2.6.3; extra == "browser"
Provides-Extra: playwright
Requires-Dist: greenlet==3.3.1; extra == "playwright"
Requires-Dist: playwright==1.58.0; extra == "playwright"
Requires-Dist: pyee==13.0.0; extra == "playwright"
Requires-Dist: typing-extensions==4.15.0; extra == "playwright"
Dynamic: license-file

# Aider (Composez Fork)

This is fork of https://github.com/Aider-AI/aider, modified to allow changing the command set and to add new features in support of the `composez` novel editing features.

You can find the `composez` repo at https://github.com/kmewhort/composez.

## Modifications to aider

### Autonomy system

The fork replaces the old `architect` and `agent` edit formats with a new
**autonomy** layer (`aider/coders/autonomy.py`) that is orthogonal to the edit
mode. Three autonomy levels are available:

| Level | Description |
|-------|-------------|
| **direct** | Single-turn — one prompt, one response, edits applied. |
| **compose** | Two-phase — an LLM plans changes, then a separate editor coder implements them (replaces the old `architect` mode). |
| **agent** | Multi-step — the LLM produces a YAML plan that is executed via slash commands (requires `composez_core.agent_runner`). |

Autonomy is selected via `/chat compose`, `/chat agent`, or `/chat direct` and
is tracked on each coder instance via `coder.autonomy_strategy`.

### New coders

- **SelectionCoder** (`aider/coders/selection_coder.py`) — operates on a
  user-highlighted text range using LSP-style `Range` coordinates. The LLM
  receives context lines around the selection and responds with a replacement
  block delimited by `--[REPLACEMENT TEXT START]-->` / `<--[REPLACEMENT TEXT END]--`.
- **AgentCoder** (`aider/coders/agent_coder.py`) — produces structured YAML plans
  for multi-step orchestration (used by the `agent` autonomy strategy).
- **QueryCoder** (`aider/coders/query_coder.py`) — replaces `AskCoder`. Read-only
  queries against the project; renamed to better fit the novel-editing workflow.

### Composez integration hooks

The coder creation path (`Coder.create()`) includes soft-dependency hooks into
`composez_core`:

- **Novel mode activation** — calls `composez_core.novel_coder` to apply
  novel-specific prompts and constraints based on the coder type.
- **Role-based model resolution** — reads a `.composez` config file to map
  (edit_format, autonomy) combinations to six named model roles:
  `admin_model`, `query_model`, `edit_model`, `selection_model`,
  `compose_model`, `agent_model`.
- **Pluggable path validator** — `coder.edit_path_validator` callback to
  enforce file-editing constraints (e.g. narrative file rules).
- **Novel commands** — `Commands.novel_commands` lazily loads
  `composez_core.NovelCommands`, which can add, override, or hide slash commands.

All `composez_core` imports are guarded by `try/except ImportError` so the fork
runs standalone as a regular aider instance when `composez_core` is not installed.

### Command and branding changes

- All user-facing strings rebrand "aider" to "composez" (`args.py`, `commands.py`,
  `repo.py`, etc.).
- `/ask` renamed to `/query`; `/code` aliased as `/edit`.
- `/chat` now shows edit modes (help, query, edit, selection) and autonomy levels
  (direct, compose, agent) as separate categories.
- `/help` simplified to show the command list (removed the interactive RAG-based
  help system).
- `/report` command removed.
- New `--auto-context` CLI flags.

### Other changes

- **Auto-context** — when enabled, mentioned files are added to the chat
  automatically without prompting.
- **Auto-create files** — files in `coder.auto_create_fnames` are created
  without confirmation (e.g. `SUMMARY.md`, `PROSE.md`).
- **ConfirmGroup for multi-file edits** — `apply_edits` and `allowed_to_edit`
  now use `ConfirmGroup` so users can approve/skip all files at once.
- **Lint skipped for query/selection** — auto-lint is bypassed when the edit
  format is `query` or `selection`.

## License

Licensed under Apache Version 2.0.  See `license.txt' for details.
