Redmine Plugin
Gives the agent Redmine issue tools — search, read, list time entries, download attachments, create, update, comment, plus a generic API escape hatch — that authenticate as the calling user. Each tool reads the user's personal Redmine API key from User Secrets at call time. There is no shared instance key.
Load user_secrets alongside this plugin.
Tools
| Tool | Approval | Purpose |
|---|---|---|
redmine_search_issues | none (read) | List/filter issues (project_id, status, assigned_to, query, limit). |
redmine_get_issue | none (read) | Fetch one issue with journals/attachments. |
redmine_list_projects | none (read) | List visible projects. |
redmine_list_time_entries | none (read) | Sum/list logged hours by user, project, issue, and date range. |
redmine_get_attachment | none (read) | Download one attachment into the staging area and return the path the agent can copy from. |
redmine_api_request | redmine.api_request (writes only) | Generic escape hatch for any endpoint without a dedicated tool. |
redmine_create_issue | redmine.create_issue | Create an issue. |
redmine_update_issue | redmine.update_issue | Update issue fields. |
redmine_add_note | redmine.add_note | Add a note/comment to an issue. |
Write tools ask for approval (Allow once / Allow for this conversation / Create a rule / Deny) before they land in Redmine.
Who gets which half
Two gates, not one. target_agents (default all) decides whether the family is offered at all; write_target_agents (default main) then decides who gets the four write tools — the three typed ones plus redmine_api_request (its HTTP method is chosen per call, so it travels with the writes).
By default a subagent can look a ticket up but cannot create, update, or comment on one. Set write_target_agents: all if subagents should also write.
Logged-hours questions
Issue-level spent_hours are lifetime totals and cannot be filtered by date, so they can't answer "how many hours did I log this month". redmine_list_time_entries hits Redmine's time-entries API (defaulting user_id to me), accepts a from/to spent_on range, and returns total_hours alongside the individual entries.
Downloading attachments
redmine_get_issue lists an issue's attachments but never their bytes. redmine_get_attachment fetches one into the instance attachment staging area, so the agent gets a read-only path it can copy into a repo — the file's contents never enter the conversation. Size is checked against agent.attachment_staging.max_file_bytes before download; the download (including any redirect) stays on the configured Redmine url.
Generic API escape hatch
redmine_api_request covers endpoints with no dedicated tool (e.g. enumerations, custom queries). GET runs unattended; POST/PUT/DELETE are gated through redmine.api_request. Prefer a dedicated tool when one exists.
Configuration
plugins:
- module: codumentor.plugins.redmine
class: RedminePlugin
args:
enabled: true
url: https://redmine.example.com # required when enabled
api_key_secret: redmine_api_key # per-user secret name (default)
default_project: "" # optional fallback project id
target_agents: all # main | subagent | all — the whole family
write_target_agents: main # same values, write tools only
url is required when enabled is true. A disabled entry can omit it.
Per-user setup
Each user adds their personal Redmine API key as a secret:
- In Redmine: My account → API access key → Show.
- In Codumentor: Settings → Extensions → User Secrets → Add, name it
redmine_api_key(or whateverapi_key_secretis set to), paste the key.
The User Secrets pane shows "Redmine API key — needed by Redmine" with set/unset state and a one-click prefill. When a tool runs without the secret set, it returns a clear, non-retryable message telling the user to add it — no network call is made.
Notes
- Redmine validation errors (HTTP 422 — e.g. a required custom field) are surfaced verbatim so the agent can correct the call.
redmine_update_issueonly forwardssubject,description,status_id,tracker_id,priority_id,assigned_to_id,done_ratio,custom_fields; unknown keys are dropped.- The instance-keyed
bug_reportRedmine backend is a separate, submission-only path and is unaffected by this plugin.