AI Maestro Programmer Agent (AMPA)

August 22, 2026 · View on GitHub

A general-purpose, multi-language programmer agent for Claude Code that implements, tests, fixes, and documents code across Python, JavaScript/TypeScript, Rust, Go, and other toolchains — either standalone or orchestrated within the AI Maestro ecosystem. The current version is recorded in .claude-plugin/plugin.json (the single source of truth).

Overview

The AI Maestro Programmer Agent is a general-purpose programmer that executes implementation tasks assigned by the Orchestrator. It handles the actual coding work across multiple programming languages and toolchains.

Standalone or Orchestrated: This plugin works in two modes. In standalone mode, the agent receives tasks directly from the user and reports back in conversation. In orchestrated mode (within the AI Maestro ecosystem), it receives tasks from the Orchestrator (AMOA) via messaging. No additional setup is needed for standalone mode.

Implementer Agents

In the AI Maestro ecosystem, implementers are agents that produce artifacts. The Programmer Agent (AMPA) is one subtype of implementer — it produces code, tests, and pull requests. Other implementer subtypes include artists (visual assets), SFX experts (audio assets), and more. All implementers share the same role (implementer) in team registries but use subtype-specific plugins and naming (e.g., svgbbox-programmer-001).

Prefix: ampa- = AI Maestro Programmer Agent

Core Responsibilities

  1. Code Implementation: Write and modify source code according to specifications
  2. Test Writing: Create comprehensive test suites
  3. Code Fixing: Resolve bugs and linting/type errors
  4. Documentation: Write inline documentation and docstrings
  5. Multi-Language Support: Work across Python, JavaScript, Rust, Go, and compiled languages

Components

Agent (1)

AgentFileDescription
ai-maestro-programmer-agent-main-agentagents/ai-maestro-programmer-agent-main-agent.mdMain general-purpose programmer agent

Skills (6)

SkillDescription
ampa-task-executionExecute programming tasks per requirements
ampa-orchestrator-communicationCommunication with the Orchestrator (AMOA) agent
ampa-github-operationsGit and GitHub operations (clone, branch, commit, PR)
ampa-project-setupInitialize project configuration and install tooling
ampa-handoff-managementCreate and receive handoff documents and bug reports
ampa-prrd-trdd-kanbanThe MEMBER (programmer) role POLICY over the granular ama-* pillar skills — op-set, self-mandate rule, missing-derived-TRDD duty

Memory (global, janitor-hosted)

This plugin uses the global AI-Maestro markdown memory system — it ships no per-plugin memory skills or rules/ mirror. Recall / write / update go through the global janitor-memory-recall / -write / -update skills; the protocol + recall law live in ~/.claude/rules/markdown-memory-recall.md; the project's memory contract + scope routing live in CLAUDE.md. The git-tracked PROJECT-scope wiki is .claude/project/memory/ (stood up once via /janitor-memory-bootstrap). The memgrep binary (from ai-maestro-janitor) powers recall and degrades to grep when absent — recall degrades, never breaks.

Hooks

None. The hooks/hooks.json is empty -- AMPA uses globally installed hooks.

Scripts

The scripts/ directory contains 4 project utility scripts. Plugin validation runs through the CPV remote launcher (uvx … cpv-remote-validate), fetched on demand from Emasoft/claude-plugins-validation — the previously vendored CPV validator scripts were retired (CI and publish.py both call the remote validator, so local copies only drifted behind upstream).

ScriptDescription
publish.pyStrict release pipeline — test, lint, validate, bump, tag (v{version} + the {name}--v{version} dependency-resolution tag), atomic push
pre-push-hook.pyGit pre-push hook — runs cpv-remote-validate before each push
test_order_pipeline.pyManual integration test for the order-processing-pipeline example (companion to op-notify-completion.md)
smart_exec.pyCross-platform script executor with timeout support

Token-Efficient Reporting

Project scripts support file-based reporting to minimize terminal output:

ScriptFlagDescription
test_order_pipeline.py--report-file PATHWrite full test report to file; terminal gets concise summary
pre-push-hook.pyAMPA_REPORT_FILE=PATH (env var)Write validation output to file; terminal gets concise summary

Workflow

The Programmer Agent owns Steps 14, 15, 17, 19, 21, 22 from the master workflow (the implementer's slice; the intervening Steps 16, 18, 20, 23 are owned by AMOA/AMIA — see docs/FULL_PROJECT_WORKFLOW.md):

  1. Step 14: Request Clarification from Orchestrator
  2. Step 15: Receive Feedback and Design Updates
  3. Step 17: Task Execution (code, lint, test)
  4. Step 19: Pre-PR Gate + PR Creation (after AMOA's green-light)
  5. Step 21: Respond to PR Review Feedback
  6. Step 22: Handle Failed PR (fix and resubmit)

Installation (Production)

Role plugins are installed with --scope local inside the specific agent's working directory (~/agents/<agent-name>/). This ensures the plugin is only available to that agent. Use one of the install commands below, then restart Claude Code — plugin metadata is cached and only picked up on a fresh start.

Installation (from GitHub)

claude plugin install ai-maestro-programmer-agent --url https://github.com/Emasoft/ai-maestro-programmer-agent

Installation (from git subdirectory)

If this plugin lives inside a parent repository, use the git-subdir source type:

claude plugin install ai-maestro-programmer-agent --url https://github.com/Emasoft/EMASOFT-PROGRAMMER-AGENT --subdir ai-maestro-programmer-agent

Once installed, start a session with the main agent:

claude --agent ai-maestro-programmer-agent-main-agent
PluginPurposeInstall
llm-externalizerOffload file analysis, scanning, and comparison to cheaper local/remote LLMs — saves orchestrator context tokensclaude plugin install llm-externalizer

When llm-externalizer is installed alongside this plugin, the agent automatically uses it for code analysis (code_task), codebase scanning (scan_folder), per-file independent audits (code_task with answer_mode: 0 and max_retries: 3), and post-refactoring validation (check_references, check_imports).

Usage

  1. Install the plugin using the command from the Installation section above.
  2. Launch the agent in your project directory:
    cd your-project/
    claude --agent ai-maestro-programmer-agent-main-agent
    
  3. In standalone mode (no orchestrator), describe your task directly in the conversation. The agent will set up the project environment, implement the code, write tests, and commit the changes.
  4. In orchestrated mode (with AI Maestro running), the agent receives tasks automatically from the AMOA orchestrator via inter-agent messaging. See docs/FULL_PROJECT_WORKFLOW.md for the complete multi-agent workflow.

Development Only (--plugin-dir)

--plugin-dir loads a plugin directly from a local directory without marketplace installation. Use only during plugin development.

claude --plugin-dir .

After modifying plugin files, use /reload-plugins in your Claude Code session to activate changes without restarting.

A pre-push git hook (scripts/pre-push-hook.py) runs the validation suite before each push. Install it with:

cp scripts/pre-push-hook.py .git/hooks/pre-push && chmod +x .git/hooks/pre-push

Proxy / TLS Note

If you are behind a corporate proxy (MITM) and gh CLI fails with TLS errors, enable weaker network isolation in your Claude Code settings:

{ "sandbox": { "enableWeakerNetworkIsolation": true } }

Requirements

SERENA MCP (REQUIRED)

The Programmer Agent relies on SERENA MCP for code investigation:

  • Symbol search
  • Function/class lookup
  • Call graph analysis
  • Import/dependency tracking

SERENA must be available before starting work.

Supported Languages

LanguageToolchainLinterFormatterType Checker
Pythonuvruff checkruff formatmypy
JavaScript/TypeScriptbuneslintprettiertsc
RustcargoclippyrustfmtBuilt-in
GogostaticcheckgofmtBuilt-in
.NET (C#/F#)dotnetBuilt-inBuilt-inBuilt-in
C/C++gcc/clangclang-tidyclang-formatBuilt-in
Objective-Cclangclang-tidyclang-formatBuilt-in
Swiftswiftswiftlintswift-formatBuilt-in

Troubleshooting

Plugin Not Loading

Symptom: Commands/agents not available after installation

Cause: Claude Code caches plugin metadata

Solution: Restart Claude Code after installation/updates

SERENA MCP Not Available

Symptom: Code investigation fails with "SERENA not available"

Cause: SERENA MCP server not configured or not running

Solution:

  1. Verify SERENA MCP is configured in Claude Code settings
  2. Check MCP server is running: curl http://localhost:PORT/health
  3. Restart Claude Code to reconnect to MCP servers

Tests Not Running

Symptom: Tests fail with "command not found"

Cause: Language toolchain not installed or not in PATH

Solution:

  1. Install required toolchain (see Supported Languages table)
  2. Verify toolchain is in PATH: which uv / which bun / etc.
  3. Restart terminal/Claude Code to pick up PATH changes

Code Fixer Agent Failing

Symptom: Code fixer reports "Unable to fix errors"

Cause: Linter/formatter errors require manual intervention

Solution:

  1. Review the linter/formatter errors the fixer reported in its output
  2. Manual fix may be required for complex issues
  3. Report blocking issues to Orchestrator

Validation

Validation runs through the CPV remote launcher — the exact command CI's validate.yml uses:

uvx --from git+https://github.com/Emasoft/claude-plugins-validation \
    --with pyyaml \
    cpv-remote-validate plugin . --strict

Exit codes: 0 = PASS; 1-4 (CRITICAL/MAJOR/MINOR/NIT) all block in strict mode. uvx ships with uv.

CI/CD

  • validate.yml — Runs plugin validation on push to main and PRs
  • release.yml — Creates GitHub releases on version tags (v*)
  • notify-marketplace.yml — Dispatches a plugin-updated event to the marketplace repo when plugin files change on main

Compatibility with Recent Claude Code Releases

AMPA is verified against Claude Code v2.1.105–v2.1.240. Most items below describe new platform capabilities that AMPA users can opt into without changing the plugin — but four changes altered how AMPA executes and required fixes: two in the v2.1.184–v2.1.224 range, one in v2.1.232, and one in v2.1.239. Each is marked Breaking in its table.

Main-thread agent capabilities (v2.1.116 / v2.1.117 / v2.1.119)

When AMPA is launched with claude --agent ai-maestro-programmer-agent-main-agent, Claude Code now reads three additional fields from the agent frontmatter:

FieldEffectAdded in
mcpServersMCP servers are pre-loaded for the main-thread session — useful for declaring SERENA/LLM-Externalizer requirements at agent invocation timev2.1.117
hooks:Agent-level hooks fire on the main-thread session (previously subagent-only)v2.1.116
permissionMode--agent honors the agent's declared permission modev2.1.119

AMPA does not ship hard-coded mcpServers entries because SERENA MCP and LLM Externalizer are typically configured globally via the user's .mcp.json or via the llm-externalizer plugin's own server registration. Operators who want SERENA pre-loaded at --agent startup can extend the agent frontmatter in their own fork.

Hook authoring (v2.1.139)

When extending AMPA with hooks (project- or plugin-scope), prefer the exec-form args: string[] field over the shell-form command: string:

{
  "type": "command",
  "args": ["uv", "run", "scripts/pre-push-hook.py", "$CLAUDE_PROJECT_DIR"]
}

Exec form spawns the command directly without a shell, so path placeholders never need quoting and there is no shell-injection surface.

PreCompact hooks (v2.1.105) can block compaction — exit code 2 or {"decision":"block"} from a PreCompact hook keeps the current conversation intact. Useful for long task-execution flows where compaction mid-task would lose state.

Effort and caching (v2.1.108 / v2.1.120 / v2.1.133)

  • ENABLE_PROMPT_CACHING_1H=1 extends the prompt-cache TTL to 1 hour for API-key / Bedrock / Vertex / Foundry users. Recommended for long programmer sessions where AMPA re-reads the same project files turn after turn.
  • Skills and hooks now see the active effort level via ${CLAUDE_EFFORT} (skills) and $CLAUDE_EFFORT (Bash tool / hook env). AMPA skills can dial scan depth up/down based on this value when relevant.
  • xhigh effort level (v2.1.111) is available on the current Opus generation (introduced on Opus 4.7, carried forward to Opus 4.8) for the most thorough analyses; AMPA does not pin an effort level, so users control it via /effort.

New commands and OTel events worth knowing

SurfaceWhat it doesAdded in
/goalSet a completion condition; Claude keeps working across turnsv2.1.139
/ultrareview / claude ultrareviewParallel multi-agent code review; CI-friendly via the CLI subcommand. Deprecated in v2.1.223 — now an alias for /code-review ultrav2.1.111 / v2.1.120
/less-permission-promptsScans transcripts for read-only Bash/MCP calls and proposes an allowlistv2.1.111
claude project purgeWipe all Claude Code state for a projectv2.1.126
claude_code.skill_activatedOpenTelemetry event with invocation_trigger attributev2.1.126
worktree.bgIsolation: "none"Lets background sessions edit the working copy directlyv2.1.143

Plugin manifest changes (v2.1.129 / v2.1.143)

  • themes and monitors should now live under "experimental": { ... } in plugin.json. AMPA ships neither, so no migration is required.
  • claude plugin disable now refuses to disable a plugin that another enabled plugin depends on (with a copy-pasteable disable-chain hint). claude plugin enable force-enables transitive dependencies. AMPA declares one dependency (ai-maestro-plugin, the 3-pillars scripts), so claude plugin enable ai-maestro-programmer-agent force-enables it.

Newer releases (v2.1.144 – v2.1.183)

ChangeEffect on AMPAAdded in
Subagent nestingAMPA's spawned sub-agents may spawn their own; sub-agent disallowedTools MCP specs (mcp__server) are honored. The depth is no longer 5 — see the v2.1.217–v2.1.224 table below for the current capv2.1.172
disallowed-tools skill/command frontmatter + /reload-skillsA skill/command can drop tools while active; skill dirs re-scan without restartv2.1.152
Plugins declare .mcp.json + defaultEnabled: falseA plugin may ship MCP servers and ship disabled-by-default; AMPA ships neitherv2.1.154
Tool(param:value) permission rulese.g. Agent(model:opus) / WebFetch(domain:*.example.com) — finer allow/deny operators can apply to AMPA's tool usev2.1.176 / v2.1.178
Nested-skills loadingSkills under a nested .claude/skills/ load when working there; on a name clash they appear as <dir>:<name>v2.1.178
post-session hook + disableBundledSkillsNew end-of-session lifecycle hook; a setting to hide bundled skills from the modelv2.1.169
Dynamic-workflow keyword workflowultracodeThe word "workflow" no longer auto-triggers; AMPA prose is unaffected (it never relied on auto-trigger)v2.1.161
/simplify/code-review (--fix, --comment)If operators wire AMPA into a review step, use /code-reviewv2.1.147 / v2.1.152
Lean system prompt default; Opus 4.8AMPA pins no model/effort, so it inherits the session's — no change neededv2.1.154
Model-deprecation warning now covers agent frontmatterThe warning fires (on stderr, incl. -p) for a deprecated/auto-updated model pinned in an agent's frontmatter. AMPA's agent pins no model: (it inherits the session's), so nothing is flaggedv2.1.183
Auto-mode destructive-git guardsThe classifier blocks git reset --hard, checkout -- ., clean -fd, stash drop, non-agent commit --amend, and terraform/pulumi/cdk destroy unless asked. AMPA's publish.py git ops (commit/tag/push) are NOT in that set, so the publish pipeline is unaffectedv2.1.183
Scheduled-task / webhook deliveries are task notificationsIn auto mode they can no longer approve a pending action or set the session title — safe for orchestrated/headless AMPA runsv2.1.183
Foreground subagents respect the same nesting depth as background onesAMPA fan-out stays bounded whichever way a sub-agent is spawned. The depth is no longer 5 — see belowv2.1.181
/config key=value from the promptOperators can set any setting inline (e.g. /config effort=high); no AMPA change — AMPA pins nothing it would overridev2.1.181

None of the above required an AMPA code change. The next table did.

v2.1.184 – v2.1.224 — including two changes AMPA had to act on

ChangeEffect on AMPAAdded in
context: fork skills run in the BACKGROUND by defaultBreaking, and silent. All six ampa-* skills were context: fork with no background: key, so from v2.1.218 they returned an agent handle instead of their result — the invoking agent got nothing in the turn it asked, with no error. Fixed by removing context: fork entirely (not by pinning background: false): a forked subagent has no AMP identity, so it can neither answer a comprehension handshake nor report a completion. The skills now run inline. Note the reason, not only the rule — v2.1.232 gave forks the full conversation, retiring the "a fork cannot see the context" half of the original argument while leaving the AMP-identity half untouchedv2.1.218
disable-model-invocation: true excludes a skill from subagent preloadBreaking, and silent. The agent's skills: field listed all six skills, and all six set that key — so the preload was inert and the agent booted without its own procedures. The key was removed from all six; the preload now works
Nested subagents: off by default, then default depth 3CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH sets it. AMPA's own policy is stricter: single-layer delegation — the sub-agents AMPA spawns do not fan out furtherv2.1.217 / v2.1.219
Concurrent-subagent cap (default 20)CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS. AMPA's single-layer policy keeps it far below the capv2.1.217
Per-session 200-subagent spawn cap removedLong AMPA sessions no longer refuse new agents; depth and concurrency limits still applyv2.1.224 (added v2.1.212)
Agent names may not contain :Reserved for plugin namespacing. AMPA's agent name is compliant; a non-compliant file is not loaded and the error goes only to the debug logv2.1.218
/review is an alias of /code-review; /ultrareview is deprecatedUse /code-review <level> or /code-review ultra. With no level it reuses the last one you typedv2.1.223
Task tool's mode parameter deprecated (ignored)Subagents inherit the parent session's permission mode. AMPA never passed itv2.1.212
Native cross-session SendMessage + ListAgentsClaude Code sessions can message each other across machines. AMPA does not adopt it: it carries no AI Maestro AID, so a message has no verifiable author, no R6 routing, and no audit entry. AMP remains AMPA's governed channel. Not unsafe — relayed messages have carried no user authority since v2.1.166 and are classifier-evaluated since v2.1.222 — but ungoverned, and the transport choice is fleet governance, not a plugin's to makev2.1.224
DirectoryAdded hookFires on /add-dir. AMPA registers no hooks: adding a workspace root does not change cwd, and AMPA keys nothing on workspace roots. Deliberate, not an omissionv2.1.219
Frontmatter booleans accept yes/no/on/off/1/0Alongside true/false. AMPA uses true/falsev2.1.222
archive plugin source with optional SHA-256 pinningInstall from a zip over HTTPS, no git or npm. A marketplace-entry feature, not a plugin-manifest one — nothing for AMPA to declarev2.1.224
Plugins accept "." as a skills pathFor single-skill plugins whose SKILL.md sits at the root. AMPA uses the skills/ directory layoutv2.1.221

v2.1.225 – v2.1.232 — including one more change AMPA had to act on

ChangeEffect on AMPAAdded in
Non-teammate agent spawns run in the BACKGROUND by defaultBreaking, and silent — the v2.1.218 defect class, one layer up. An interactive spawn now returns a handle, not the subagent's output; the result arrives later as a task notification. The agent prompt had promised an in-turn return, so it was rewritten to collect before relaying: never relay a handle as a finding, never report a delegated task complete on the strength of having spawned it. Confirmed first-hand on v2.1.232v2.1.232
Subagent forking on by default; a fork inherits the full conversation and prompt cacheDoes not reopen context: fork for the ampa-* skills. Three reasons survive, each sufficient on its own: a fork still has no AMP identity; a fork is itself a background spawn; and a fork's state never merges back, while these procedures mutate the main agent's own state. The prompt now records all three, so the constraint cannot be discarded on a reason that has expiredv2.1.232
@ mentions another session in the prompt; SendMessage delivers to a bare nameMakes the native cross-session channel far easier to reach by accident. AMPA's non-adoption stance is unchanged (see the v2.1.224 row): AMP stays the governed channel because it carries an AI Maestro AID. The @ affordance is a user action in the operator's session, not something the plugin invokesv2.1.232
Interactive sessions keep unique names on one machineA session claiming a name another live session holds gets a name-word-word variant. AMPA keys nothing on session names — its identity is its AIDv2.1.232
Write tool: newer models may overwrite a file they have not read this sessionNow matches the Edit tool's rules; older models still require the read first. AMPA asserted no read-before-write rule, so nothing broke — and none was added, since overwriting unread files is not a habit worth teachingv2.1.228
/plugin install plugin@marketplace refreshes the marketplace firstA newly published AMPA version installs without a manual marketplace refresh. AMPA's documented install uses --url, so this reaches marketplace users onlyv2.1.232
/code-review at high, xhigh, and max runs in a background agentNow matches the other levels. Operators who wire AMPA into a review step get the result as a notification, not inlinev2.1.232
Marketplace command sources; GitLab marketplaces; additionalMarketplaces / allowedMarketplaces aliasesAll marketplace-entry features, not plugin-manifest ones — nothing for AMPA to declarev2.1.229 / v2.1.232

v2.1.233 – v2.1.240 — including one change AMPA had to act on

ChangeWhat it means for AMPAVersion
UTF-8 BOM in an agent/skill/command .md silently ignored (now fixed)Breaking. Same silent defect class as v2.1.218 and v2.1.232: no error, the artifact simply never loads. AMPA ships none today (verified by byte check over every tracked file, 2026-08-22) and a pytest guard now enforces thatv2.1.239
Todo/task tools (TaskCreate/TaskGet/TaskUpdate/TaskList, TodoWrite) removed on Opus 4.8, Sonnet 5, Fable 5, Mythos 5 and newerCLAUDE_CODE_ENABLE_TODO_TOOLS=1 restores them. AMPA's persona and skills reference none of them (verified by grep), so nothing broke and nothing was addedv2.1.233
Background task notifications between turns now arrive wrapped in <system-reminder> tagsMatching mid-turn delivery — this is how a delegated subagent's result reaches AMPA under the v2.1.232 collect-before-relay rule. The persona now records that the envelope is platform-generated context, never user input and never user approvalv2.1.234
"Default teammate model" setting removed; agent-team teammates use the leader's model unless the spawn names oneAMPA pins no model: in its frontmatter, so it inherits correctly by defaultv2.1.234
An omitted subagent_type now returns an error listing available agentsPreviously the Agent tool advertised a general-purpose default even where unavailable, so an omission failed silently into the wrong agent. Nothing in AMPA depends on that removed default: the persona's only subagent_type rule is the prohibition on "fork" for AMP-coupled steps (grep, 2026-08-22). The persona asserts no general naming rule, and none was invented here to make the row read betterv2.1.235
ANTHROPIC_DEFAULT_MODEL sets the model new sessions start onA /model pick still overrides it. An operator preference, not a plugin declarationv2.1.236
notify_when_idle on cross-session SendMessageOne-shot idle notice, no polling. AMPA's non-adoption stance for the native channel is unchanged (see the v2.1.224 row): AMP stays the governed channel because it carries an AI Maestro AIDv2.1.236
ListAgents reports a session its own name and lists live teammates; Windows gains cross-session messagingMakes the native channel easier to reach, which does not make it governed. Stance unchangedv2.1.239
Marketplace headersHelper; claude plugin install/update prompt [y/N] (or -y)The prompt appears only where a catalog entry declares a headersHelper. AMPA's documented install is --url with none, so scripted installs are unaffected; a marketplace that adds one will need -y in CIv2.1.238
claude plugin validate now checks a bare .claude/skills directory; marketplace metadata.pluginRoot fixedBoth marketplace/tooling-side. AMPA uses the skills/ layout and declares no pluginRootv2.1.233 / v2.1.239

See Also

Related Plugins: This agent works with the AI Maestro Orchestrator Agent (AMOA), AI Maestro Integrator Agent (AMIA), and AI Maestro Architect Agent (AMAA). Each agent plugin is installed independently. These plugins are part of the AI Maestro ecosystem and are not required for standalone use. AMPA is an implementer (artifact-producing agent). Future implementer subtypes (artist, sfx-expert, etc.) will follow the same patterns.