AI Agent Integration in Your Dev Workspace

Learn AI agent integration for developer workspaces: register CLIs, build skills, chain steps, share state over MCP, and debug locally.

&&#&&01&&//<>AI AGENT INTEGRATIONAuricIDE · Blog

You have one coding agent working in a terminal. It edits files, runs tests, and gives you a result you can inspect. Add a second agent and the workflow gets harder: each process has its own prompt, output, assumptions, and idea of what should happen next. You now need explicit rules for launching processes, handing work to the next agent, and recording shared state.

AI agent integration in a developer workspace means giving each CLI a launch contract, a permission mode, the previous step's terminal context, and access to shared project state. A coding-agent fleet has to coordinate several of these local processes at once.

What Integration Actually Means for Coding Agents

With one agent, you can compensate manually: provide the task, watch the terminal, and inspect the result. Two agents expose the gaps. The second agent may not know what the first changed, which tests failed, or whether the first process is waiting for input.

A practical integration design answers three questions:

  • How does the orchestrator describe the agent CLI?
  • How does each step receive the previous step's relevant output?
  • How do all agents read and update the same project state?

AuricIDE offers one concrete local-first design for these questions. It runs external coding agents as PTY child processes, rather than treating them as abstract chat sessions. The orchestrator can read terminal output and find out whether the process ended in success or failure. A fleet view can then replace the need to watch several terminal tabs at once.

That architecture has a clear limit. A process can report success while leaving an incomplete change, and a failed process can still produce useful diagnostics. The success-or-failure result helps route the work, but it cannot tell AuricIDE whether the code change is correct.

AuricIDE brings all of that into one workspace: how each step starts, receives context, reports success or failure, and updates shared work.

Enterprise adoption points in the same direction. A 2025 enterprise survey from Cloudera found that 96% of enterprises are expanding their use of AI agents. The same survey found that 66% build agents on enterprise AI infrastructure platforms, and 60% use agentic capabilities embedded in existing core applications.

Describing an Agent CLI as a Dynamic Provider

An orchestrator needs more than a command name. It must know the executable to run and how to build the right arguments for a given model and permission mode. A harness, the general term for that wrapper, records it in JSON.

AuricIDE's own mechanism for this is the dynamic provider: one JSON config per external agent CLI, checked against a strict schema when it loads. The design avoids a plugin API and avoids recompiling the desktop application for every new CLI.

A small provider config might describe fields like these:

{
  "id": "agent-cli",
  "name": "Agent CLI",
  "executable": "agent-cli",
  "arguments": [
    { "type": "task", "quote": true },
    { "type": "model", "flag": "--model", "ignoreIfAuto": true }
  ],
  "info": {
    "models": [{ "value": "auto", "label": "Auto" }],
    "permissionModes": [{ "value": "default", "label": "Interactive", "description": "Ask for permission" }],
    "defaultModel": "auto",
    "defaultPermissionMode": "default"
  },
  "versionCheck": { "command": "agent-cli", "args": ["--version"] },
  "promptTemplate": "agent-cli \""
}

The exact values depend on the CLI. The executable and ordered arguments form the boundary: AuricIDE builds the command from the provider config instead of inferring CLI flags at runtime. After launch, AuricIDE reads the PTY stream and maps the process result to success or failure. Provider configs don't define output parsers or per-provider success rules; that part works the same way for every provider.

Validation should fail before execution

A malformed provider config is skipped, not the whole set. AuricIDE reports the reason to stderr and keeps loading the rest, rather than letting a partial configuration load and fail later in a confusing way. CLI contracts differ: one CLI's flags are foreign to another's parser, and one writes progress to standard output while another reserves that for diagnostics on standard error.

A provider config can't make those tools identical. It gives the orchestrator a declared contract for each one. The integration work sits in describing the process accurately.

AuricIDE scans the dynamic-providers directory for provider configs on startup. Importing one from Settings validates and registers it immediately, without a restart; a file dropped straight into the directory takes effect the next time the app starts.

Adding a provider config
Config
registeredimmediately, no restart

Validates and registers on the spot. The provider is available in the picker as soon as the import dialog closes.

The trade-off is maintenance. If the CLI changes its flags or output behavior, its provider config needs an update.

Defining Reusable Skills and Ordered Chains

A provider config describes how to run an agent. A skill describes what work the agent should perform. In this design, a skill combines a prompt with a provider, model, and permission mode.

A skill can be saved to one project, or saved once to a library any project can reuse. A project's own copy keeps its own name and prompt even if the shared version changes later.

A skill might ask an agent to inspect a failing test, review a patch, or update a requirement. The prompt defines the work. The provider and model select the execution path. The permission mode limits what that skill may do.

Chains pass terminal context

A chain, called a combo, runs skills in order. Each step selects its own agent, model, and permission. If a step fails, the chain stops instead of pretending that later work is valid.

The next step receives its own prompt followed by the previous step's raw terminal tail. The system doesn't convert every CLI's output into a vendor-specific structured format. That choice preserves what the earlier process printed, including warnings and awkward formatting.

For example, a review chain might work like this:

  1. A first skill inspects the change and runs tests.
  2. A second skill receives the first skill's terminal tail and checks the reported failure.
  3. A third skill receives the second skill's terminal tail and applies a permitted correction.

Raw handoff has a cost. The next agent must understand whatever the previous CLI produced. A normalized payload would be cleaner, but normalization also requires assumptions about every tool's output. Those assumptions can discard details or misread a result.

Each combo step selects its own permission mode. A review step can remain read-only even when a later step may edit files.

A skill library can become cluttered if nobody removes obsolete prompts. Treat the prompt, selected model, and permission mode as one unit. Review them together when the underlying CLI or repository workflow changes.

Sharing Project State Over MCP

Terminal output gives the next agent a record of what the previous process printed. It does not preserve goals, tickets, requirements, dependencies, or decisions. Project state needs a durable store that every step can query without copying another prompt by hand.

The Model Context Protocol, or MCP, defines a standard connection between AI systems, external tools, and data sources. That makes MCP a practical boundary for project records that several agents must read and update.

AuricIDE exposes shared project state through an MCP server named auric-pm. Its tools include goals, tickets, requirements, test cases, dependencies, and history, among others. Project data lives in .auric/project.db inside the repository, which the agents and the UI use as their shared store.

A shared read should be boring

A connected agent should query the current ticket list instead of trusting an old prompt:

list_tickets({
  "status": "open"
})

The call reads the current open tickets from .auric/project.db. After one step updates a ticket, a later step can query the same database. This reduces stale handoffs, but it cannot stop an agent from making a wrong state transition.

MCP also keeps the boundary independent of one desktop application. Anthropic open-sourced the protocol in late 2024, and other AI companies and tool makers have since built support for it.

Shared state still requires ownership rules. If every step rewrites requirements or changes ticket status, the database becomes a coordination bottleneck. Define which skill may perform each transition. A review step can record a finding, while an approval or implementation step changes status. Observations should remain reads unless they produce a clear, intentional state transition.

Running Agents Locally and Reading What Comes Back

AuricIDE launches each agent locally as a PTY child process and reads the terminal stream. When the process ends, the orchestrator finds out whether it succeeded or failed.

The fleet view receives the PTY stream plus a success-or-failure result. A process may exit successfully after printing a warning. Another may stop because it needs input. The UI sorts attention states in this order: error, needs-input, then stalled.

Suppose a chain reaches step two and stops. The second prompt includes the previous terminal tail, so the orchestrator can inspect what the first step handed over. If the second process is waiting for input, the attention metric can flag that state rather than treating it as a crash.

PTY visibility has boundaries

Provider configs describe command construction, not output parsing. AuricIDE reads the PTY stream, so activity outside that stream is invisible to the workspace. A running process with no recorded PTY activity for 120 seconds is classified as stalled.

Test the provider in both interactive and headless modes, and check that useful diagnostics reach the PTY stream.

AuricIDE's Rust code owns that lifecycle directly: it holds the PTY child process, can stop it on request, and maps the wait result to success or failure. That code, not a generic plugin, is what turns a process ending into a signal the fleet view can act on. It still can't tell the orchestrator whether the agent made a good code change.

Debugging a Failing Chain Step by Step

A stopped chain needs a narrow diagnosis. Start with the boundary where the failure appears, then change one variable per run.

What are you seeing?
Diagnosis

The agent never starts.

Provider config

A schema error rejects the file and prints its reason to standard error.

Fix the missing or invalid field before changing the prompt.

Check the provider config first

If the agent never starts, validate its provider config. A schema error should reject the file and print its reason to standard error. Fix the missing or invalid field before changing the prompt.

Check the previous process result

If the next step never begins, check whether the previous process ended in failure. A failed step stops the combo by design and produces a toast naming that step. Fix the command, permission, or underlying task before rerunning it.

Check for needs-input

If the process remains active but produces no useful progress, inspect the terminal tail. A prompt waiting for confirmation is different from a crashed process. Change the permission mode or provide the expected input, then run the same step again.

Check the handoff size

AuricIDE caps the previous terminal tail at 2,000 characters. If the next step lacks a needed detail, check whether that detail fell outside the retained tail. Narrow the first skill or have it print a concise final diagnosis before changing the rest of the combo.

Check shared state

An agent may report that a ticket is complete while the project database still marks it open. Read the shared ticket and requirement records before editing prompts. Correct the state or the agent's assumption, then rerun one step.

Log the terminal tail verbatim and trust the process result over a general impression that the chain “seems stuck.”

Keeping an Agent Fleet Maintainable

Record the CLI version tested with each provider config, and review its arguments after upgrading the CLI.

Scope permission modes per skill. A review step should not inherit write access because a later step edits files. Keep shared project state as the source of truth, but avoid making every step write records. Each write should represent a real change in project status.

The maintenance cost is real. Provider configs need updates when CLIs change. Permission scopes need review as new skills appear. Shared state can slow coordination if every agent tries to rewrite it. For a small project, this structure may not justify itself. With several agents on one codebase, these contracts put launch configuration, handoff, and project state in one place, instead of scattered across unrelated terminal sessions.


AuricIDE is an open-source desktop IDE for running local CLI coding agents as a fleet. It uses dynamic providers to launch them, skills and combos to order the work, raw terminal handoffs between steps, and MCP-backed project state they all read and write. Visit AuricIDE to look at the workspace yourself.

AuricIDE is open source

AGPL v3, alpha, and built in the open. If the loop above sounds like the way you want to work, the code is the fastest way to judge it.

★ Star on GitHub