Agent

Last updated:

Use camber agent commands to manage Camber agents from your terminal.

This page covers common agent operations:

  • camber agent pull
  • camber agent update
  • camber agent push

Agent pull

Use camber agent pull when you want to bring a mirrored Camber agent back to your local machine.

The command restores the agent’s Context Mirror into a local project folder and installs the agent and skills for a supported agentic coding tool.

camber agent pull @owner.alias

By default, this uses the Claude Code integration and writes into the current directory.

You can choose the agentic coding tool integration:

camber agent pull @owner.alias --integrate claude-code
camber agent pull @owner.alias --integrate cursor

You can also choose the parent destination:

camber agent pull @owner.alias --dest /path/to/local/folder

Pull output

The command creates one project folder under the destination:

project_<owner>_<alias>/
├── .camber/
│   └── sync.yaml
├── .claude/ or .cursor/
├── README.md
├── chat/
├── knowledge-base/
├── project/
├── requirements/
├── schema/
└── instruction.md

For example:

camber agent pull @camberuser.context-mirror-agent

creates:

project_camberuser_context-mirror-agent/

The pulled mirror files are copied from:

stash://<owner>/.camber/agent-context/<agent-alias>/

Camber restores all files and folders stored in that mirror root. The folders shown above are the standard Context Mirror layout, but extra folders added to the mirror are pulled too.

Pull integrations

With --integrate claude-code, Camber writes the local agent file to:

project_<owner>_<alias>/.claude/agents/<owner>.<agent-alias>.md

Skills are restored to:

project_<owner>_<alias>/.claude/skills/<skill-name>/

With --integrate cursor, Camber writes the local Cursor rule to:

project_<owner>_<alias>/.cursor/rules/camber-agent-<owner>.<agent-alias>.mdc

Skills are restored to:

project_<owner>_<alias>/.cursor/skills/<skill-name>/

Cloud skill folders are not restored as a root skills/ folder. Camber remaps each skill into the selected agentic coding tool’s skill folder.

Each skill folder keeps its SKILL.md, scripts, references, assets, and nested files.

Pull replace behavior

camber agent pull replaces the generated project_<owner>_<alias>/ folder each time it runs.

Use this when you want the local copy to match the latest state held by the Camber agent.

⚠️
Do not make local-only edits inside project_<owner>_<alias>/ unless you have saved them elsewhere. Running camber agent pull again replaces that folder.

Pull JSON output

Use --output json when scripting:

camber agent pull @owner.alias --integrate claude-code --output json

Example response:

{
  "agent": "@owner.alias",
  "integration": "claude-code",
  "dest": "/path/to/project_owner_alias",
  "agent_file": "/path/to/project_owner_alias/.claude/agents/owner.alias.md",
  "mirror": ["README.md", "chat", "project", "requirements"],
  "skills": ["api-endpoint-auditor", "test-case-generator"]
}

If the agent does not have a Context Mirror folder in Stash, the command still creates the local Claude Code agent or Cursor rule from the Camber agent metadata.

Agent update

Use camber agent update when you want to update an existing Camber agent by tag.

The command resolves the agent from @owner.alias, so you do not need to know the agent UUID.

camber agent update @owner.alias \
  --name "New agent name" \
  --description "New description" \
  --instructions-file ./instruction.md

You can update one field or several fields in the same command.

Supported fields:

  • --name
  • --description
  • --instructions
  • --instructions-file
  • --structured-output
  • --output json

--instructions and --instructions-file are mutually exclusive.

The CLI does not update an agent alias. If the alias needs to change, create a new agent or use an admin-supported workflow. Context Mirror paths depend on the alias, so changing it casually can break existing mirror references.

Update instructions from a file

Use --instructions-file when your agent instructions are stored in Markdown:

camber agent update @owner.alias --instructions-file ./instruction.md

This replaces the agent instructions with the file content.

Update instructions inline

For short edits, use --instructions:

camber agent update @owner.alias --instructions "Answer concisely and use the project context when needed."

Structured output

Enable structured output:

camber agent update @owner.alias --structured-output=true

Disable structured output:

camber agent update @owner.alias --structured-output=false

Update JSON output

Use --output json when scripting:

camber agent update @owner.alias \
  --instructions-file ./instruction.md \
  --output json

Example response:

{
  "id": "agent-uuid",
  "name": "New agent name",
  "alias": "alias",
  "owner_name": "owner",
  "tag": "@owner.alias",
  "description": "New description",
  "status": "ACTIVE"
}

Agent push

Use camber agent push after pulling a mirrored agent locally, editing the pulled files, and wanting those local changes to become the new Camber agent mirror state.

This command is intentionally similar to a force push: the enabled local mirror sections become the desired cloud state for that agent.

Run the command from the pulled mirror root, the folder that contains .camber/sync.yaml:

cd project_owner_alias
camber agent push

Use JSON output when scripting:

camber agent push --output json

There is no --dry-run, no confirmation prompt, and no agent override flag. The target agent comes from .camber/sync.yaml.

Push local layout

camber agent pull creates the expected local layout:

project_<owner>_<alias>/
├── .camber/
│   └── sync.yaml
├── .claude/ or .cursor/
├── README.md
├── chat/
├── knowledge-base/
├── project/
├── requirements/
├── schema/
└── instruction.md

Run camber agent push from project_<owner>_<alias>/, not from the original repository root unless that root contains .camber/sync.yaml.

sync.yaml

.camber/sync.yaml tells the CLI which agent to update and which local sections to sync.

Example:

agent: "agent-uuid"
owner: "owner"
alias: "alias"
exclude:
  - ".git/**"
  - ".env*"
  - ".venv/**"
  - "__pycache__/**"
  - "**/__pycache__/**"

instruction:
  enabled: true
  path: instruction.md

readme:
  enabled: true
  path: README.md

project:
  enabled: true
  path: project

knowledge_base:
  enabled: true
  path: knowledge-base
  exclude: []

chat:
  enabled: true
  path: chat
  exclude: []

requirements:
  enabled: true
  path: requirements

schema:
  enabled: true
  path: schema

skills:
  enabled: true
  path: .claude/skills
  managed: "*"
  exclude: []

By default, sections are enabled. Set enabled: false on a section when you do not want camber agent push to change that cloud section.

Push behavior

Enabled sections are uploaded to a staging area first, then Camber commits them to the agent mirror:

  • README.md
  • instruction.md
  • project/
  • requirements/
  • schema/
  • knowledge-base/
  • chat/
  • configured skills folder

instruction.md is special: after the mirror commit succeeds, Camber updates the agent instructions from this file. If instruction.md is missing, the mirror file is removed, but the agent instructions are not updated.

Files in these sections are indexed for agent retrieval:

  • knowledge-base/
  • chat/
  • skill references/ folders

Unsupported files in indexed sections are skipped with a warning. They are not uploaded and are not indexed.

Project files under project/, plus README.md, instruction.md, requirements/, and schema/, are mirror files. They are not added to Knowledge Base by camber agent push.

Push skills

Skills are read from the configured skills.path.

With:

skills:
  enabled: true
  path: .claude/skills
  managed: "*"

all skill folders under .claude/skills are treated as the desired managed skill set for the Camber agent.

To manage only selected skills:

skills:
  enabled: true
  path: .claude/skills
  managed:
    - api-endpoint-auditor
    - test-case-generator

Managed skills that are deleted locally are deleted from the Camber agent. Local skills that are not in the managed list are ignored.

Use skills.exclude to ignore selected skill folders:

skills:
  exclude:
    - old-skill

Push excludes

Global excludes apply across sections. Section excludes apply only within that section.

Example:

project:
  enabled: true
  path: project
  exclude:
    - "experiments/**"
    - "AGENTS.md"

Excluded files and folders are not uploaded. They are also not deleted from the cloud mirror, because they are outside the managed push set.

Push failure behavior

The CLI validates local config before uploading:

  • .camber/sync.yaml must exist
  • the agent UUID must match the remote agent
  • paths must stay inside the mirror root
  • symlinks are rejected
  • managed skill folders must contain valid SKILL.md

Files are uploaded to staging first. If upload fails, Camber does not commit the staged state.

If the backend commit fails, the staging folder is left in place for debugging and the command prints the staging path.

After a successful commit, staging is removed.

Push JSON output

camber agent push --output json

Example response:

{
  "agent": "@owner.alias",
  "staging_prefix": "stash://owner/.camber/staging/alias/username/",
  "final_prefix": "stash://owner/.camber/agent-context/alias/",
  "warnings": [],
  "sections": {
    "project": {
      "copied": 12,
      "created": 0,
      "updated": 0,
      "deleted": 1,
      "queued": 0,
      "skipped": 0
    }
  }
}

Typical Context Mirror flow

camber agent pull @owner.alias
cd project_owner_alias

# edit files, skills, chat, or instruction.md

camber agent push