Codumentor logo Codumentor

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

ToolApprovalPurpose
redmine_search_issuesnone (read)List/filter issues (project_id, status, assigned_to, query, limit).
redmine_get_issuenone (read)Fetch one issue with journals/attachments.
redmine_list_projectsnone (read)List visible projects.
redmine_list_time_entriesnone (read)Sum/list logged hours by user, project, issue, and date range.
redmine_get_attachmentnone (read)Download one attachment into the staging area and return the path the agent can copy from.
redmine_api_requestredmine.api_request (writes only)Generic escape hatch for any endpoint without a dedicated tool.
redmine_create_issueredmine.create_issueCreate an issue.
redmine_update_issueredmine.update_issueUpdate issue fields.
redmine_add_noteredmine.add_noteAdd 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:

  1. In Redmine: My account → API access key → Show.
  2. In Codumentor: Settings → Extensions → User Secrets → Add, name it redmine_api_key (or whatever api_key_secret is 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