Skip to content

feat(executors): add Aider adapter - #55

Closed
adity982 wants to merge 1 commit into
Signetry:mainfrom
adity982:feat/aider-executor
Closed

feat(executors): add Aider adapter#55
adity982 wants to merge 1 commit into
Signetry:mainfrom
adity982:feat/aider-executor

Conversation

@adity982

Copy link
Copy Markdown

Summary

  • add an opt-in Aider executor behind the existing Executor protocol
  • keep execution fail-closed and disabled unless UMBRA_ENABLE_AIDER is set
  • use no-commit, no-shell-suggestion, and dry-run safeguards where applicable
  • derive results from the repository diff and redact prompts from replay commands
  • register and document the adapter with focused tests

Validation

  • uv run ruff check . ? passed
  • uv run pytest tests/test_executors.py -q ? 24 passed
  • uv run pytest tests/test_cli_and_mcp.py -q with the end-to-end test excluded ? 10 passed

The full suite otherwise ran successfully except for nine pre-existing Windows-specific failures: checks that invoke the Unix true command and tests requiring unprivileged symlink creation.

Closes #53

@bkd-dotcom

Copy link
Copy Markdown
Member

Thanks for this, @adity982 — this is a solid implementation of #53. I reviewed it end to end:

  • ✅ Correct Executor protocol implementation; registered as aider and fail-closed on UMBRA_ENABLE_AIDER.
  • ✅ Withholds commit/push authority (--no-auto-commits, --no-dirty-commits, --no-suggest-shell-commands), --dry-run for read-only, prompt redacted from command replay — matches the security model.
  • ✅ Tests + ruff pass; full suite green locally.

Two small housekeeping items before merge:

  1. The branch is behind main — please update/rebase (main moved, including a licensing change; see below).
  2. Note the README example uses UMBRA_ENABLE_AIDER while the model env is UMBRA_AIDER_MODEL — just confirm both are documented consistently.

⚠️ Please read — licensing / ownership (this repo is no longer open source).

This project is now © 2026 Binay Dalai — All Rights Reserved (the MIT license was removed). By opening this PR you agree to the Contribution Agreement: you assign and transfer all copyright and ownership of your contributed code to the repository owner.

Concretely, that means:

  • The owner is the sole proprietor of the entire codebase, including this contribution once merged.
  • You (and anyone else) may not use this code for your own personal or commercial purposes, may not sell or monetize it, and may not copy, modify, or redistribute it for your own projects without the owner's explicit written permission.
  • Only the original author retains the right to use and monetize this project.

Contributions are genuinely appreciated and credited — but they are made under these proprietary terms, not as open source. If you're good with that, please rebase and I'll merge. If not, no worries and no hard feelings — just let me know.

@bkd-dotcom

Copy link
Copy Markdown
Member

recheck

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

Thanks for your contribution! Before it can be merged, please read the Contributor License Agreement — Umbra is All Rights Reserved, and by signing you assign copyright/ownership of your contribution to the Owner (you may not use, sell, or commercialize it yourself). To agree, reply with exactly:


I have read the CLA Document and I hereby sign the CLA


You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot.

@bkd-dotcom

Copy link
Copy Markdown
Member

Thanks for this — the Aider adapter is well done and follows the existing executor security model closely (opt-in + fail-closed via UMBRA_ENABLE_AIDER, withholds commit/push authority with --no-auto-commits/--no-dirty-commits/--no-suggest-shell-commands, --dry-run for read-only, bounded no-push prompt, list-based args with no shell, prompt redacted from the command replay). Nice tests too.

Before this can be merged, a few things are needed:

  1. Sign the CLA. This PR is currently blocked by the CLA gate. Please read the Contributor License Agreement and reply on this PR with exactly:
    I have read the CLA Document and I hereby sign the CLA
    
  2. Rebase onto main. The branch is ~14 commits behind and needs a green CI run against current main (the platform recently moved to source-available installs and updated CI).

One optional consistency nit (not a blocker): unlike CodexExecutor, the Aider --model value isn't validated against an allowlist/regex. It isn't injectable (list args, no shell), but for parity with the platform's strict model posture consider applying the same [A-Za-z0-9._-]{1,64} validation.

Once the CLA is signed, the branch is rebased, and CI is green, this is good to go.

bkd-dotcom added a commit that referenced this pull request Aug 18, 2026
Closes #53.

Ports @adity982's implementation from PR #55. That PR could not be
rebased: it predates the umbra_core -> signetry_core rename (#90), so
every file it touched had moved. The adapter design is theirs — the flag
set, deriving the result from the repository diff rather than from Aider's
own claim, and redacting the prompt from the replay command. This port
updates the package path, the env-var prefix (UMBRA_ -> SIGNETRY_), and
adds the safety tests.

Registered as `aider`. Fail-closed on two independent conditions:
SIGNETRY_ENABLE_AIDER=true AND the CLI actually responding to --version.

Commit authority stays with the pipeline: --no-auto-commits and
--no-dirty-commits mean Aider edits the working tree but never creates a
commit, so the change stays governable by admission.
--no-suggest-shell-commands keeps it from proposing shell execution, and
--dry-run is used for read-only (reason) runs.

model_identity reports model_resolved as "unavailable" rather than
back-filling the requested model, because Aider does not echo the
provider model it resolved — claiming otherwise would put an unverified
value on a receipt.

13 tests: fail-closed gating (flag missing, CLI missing), protocol +
registry membership, diff capture, the safety-flag contract (asserting no
commit is created in a real temp repo), --dry-run on read_only, prompt
redaction, honest "unavailable" on a failed run, the disabled result,
model pass-through, and that registration does not let aider be
auto-selected ahead of a configured preference.

Also updates the pre-existing registry test, which pinned the exact
executor set, and tidies a line wrap left in README by the Kotlin change.

Co-authored-by: Binay <bkd-dotcom@users.noreply.github.com>
bkd-dotcom added a commit that referenced this pull request Aug 18, 2026
@adity982 never signed the CLA. Verified against the authoritative store —
signatures/cla.json on the cla-signatures branch lists exactly one signed
contributor (AdvaitVarhade, from #73). The two "I have read the CLA"
strings on #55 are the bot's own instruction text and a quote of it in a
maintainer comment, not a signature.

CONTRIBUTORS.md states that the people listed are acknowledged "for
contributions accepted under the Contributor License Agreement", so an
unsigned contribution does not belong in that list.

NOTE — this leaves an open provenance question, not resolved here. The
Aider adapter merged in #96 is a port of their #55, and aider.py still
records that derivation in its module docstring. Without a signed CLA the
copyright assignment never happened, so the repo now contains code derived
from an unassigned contribution. That needs a decision (reimplement from
the sibling adapters, or obtain a signature) — flagged rather than settled
by this commit.
bkd-dotcom added a commit that referenced this pull request Aug 18, 2026
@adity982 never signed the CLA. Verified against the authoritative store —
signatures/cla.json on the cla-signatures branch lists exactly one signed
contributor (AdvaitVarhade, from #73). The two "I have read the CLA"
strings on #55 are the bot's own instruction text and a quote of it in a
maintainer comment, not a signature.

CONTRIBUTORS.md states that the people listed are acknowledged "for
contributions accepted under the Contributor License Agreement", so an
unsigned contribution does not belong in that list.

NOTE — this leaves an open provenance question, not resolved here. The
Aider adapter merged in #96 is a port of their #55, and aider.py still
records that derivation in its module docstring. Without a signed CLA the
copyright assignment never happened, so the repo now contains code derived
from an unassigned contribution. That needs a decision (reimplement from
the sibling adapters, or obtain a signature) — flagged rather than settled
by this commit.

Co-authored-by: Binay <bkd-dotcom@users.noreply.github.com>
bkd-dotcom added a commit that referenced this pull request Aug 18, 2026
Resolves the provenance question flagged in #99.

The version merged in #96 was a port of an unsigned contribution (#55).
Without a signed CLA the copyright assignment never happened, so keeping
derived code — especially after removing the attribution — was the least
defensible combination. This rewrites the adapter from the sibling
adapters (codex.py / claude_code.py, both owner-authored) so nothing in
the tree derives from an unassigned contribution, and drops the
attribution from the module docstring and the v0.7.0 changelog entry.

Behaviour is unchanged: all 33 executor tests written against the previous
implementation pass without modification, because they assert behaviour
rather than structure.

Two things the rewrite adds, both from house patterns the port lacked:

  * --model is validated before use, like the Codex adapter's -m value, so
    a caller-supplied string cannot smuggle shell metacharacters or extra
    arguments into the command. The first character must be alphanumeric —
    my own test caught that a naive character class accepts
    "--dangerously-x", since "-" is legal inside a model name, and an
    argument parser may read a leading dash as a new option rather than as
    --model's value.
  * The withheld-authority flags are a named constant, so removing one
    shows up in review instead of disappearing into the command
    construction. A test asserts the set, not just individual flags.

Also logs a non-zero exit like claude_code.py does, which the port did not.

Co-authored-by: Binay <bkd-dotcom@users.noreply.github.com>
@bkd-dotcom

Copy link
Copy Markdown
Member

Closing this. #53 is implemented and shipped in v0.7.0, but not from this branch, and I want to be straight with you about why.

The CLA was never signed. The bot asked on 2026-08-03 and there's no signature. I checked the authoritative store rather than going by the thread — signatures/cla.json on the cla-signatures branch lists one signed contributor, and it isn't this account. (Worth noting for anyone reading: grepping this thread for "I have read the CLA" returns hits, but they're the bot's own instruction text and my quote of it.)

Without a signature, the copyright assignment in the CLA never happened, so the code can't be merged or credited — that's the term the project runs on, not a judgement about the work.

Separately, this branch had become unmergeable. It predates the umbra_coresignetry_core rename (#90), so every file it touches has moved. Git sees the package as deleted-and-re-added; there's no rebase path.

The adapter that shipped (#102) was written from the existing codex.py / claude_code.py adapters rather than from this diff.

On the implementation itself: it was good. The security posture in particular — withholding commit authority via --no-auto-commits/--no-dirty-commits, deriving the result from the repo diff rather than the agent's own claim, redacting the prompt from the replay command, and honestly reporting model_resolved as unavailable because Aider doesn't echo it — read the codebase's model correctly. That's the hard part of an executor adapter and you got it right.

If you'd like to contribute again: sign the CLA on your next PR (reply to the bot with the exact phrase it gives you) and it can be merged and credited normally. Happy to point you at something scoped — the board is at Signetry/signetry#10. Genuinely sorry this one ends here after the work you put in.

@bkd-dotcom bkd-dotcom closed this Aug 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Executor: add an Aider adapter behind the Executor protocol

2 participants