Tool Reference

changes

Code change proposals. Create structured diffs that can be reviewed, applied, or rejected — useful for agent-driven code modifications that need human approval.

Aliases

Old tool names propose_change and review_changes still work as aliases.


Actions

propose

Create a new change proposal with file path, old content, and new content.

Parameters

NameTypeRequiredDescription
actionstringYes"propose"
file_pathstringYesPath to the file being changed
old_contentstringYesThe original content to be replaced
new_contentstringYesThe replacement content
descriptionstringNoHuman-readable description of the change
domainstringNoTopic domain (e.g., "frontend", "api")
related_task_idstringNoID of a related task

Example request

{
  "name": "changes",
  "arguments": {
    "action": "propose",
    "file_path": "src/utils/format.ts",
    "old_content": "function formatDate(d: Date) {\n  return d.toISOString();\n}",
    "new_content": "function formatDate(d: Date, locale = 'en-US') {\n  return d.toLocaleDateString(locale, { year: 'numeric', month: 'short', day: 'numeric' });\n}",
    "description": "Add locale support to formatDate with human-readable default",
    "domain": "frontend"
  }
}

Example response

{
  "success": true,
  "proposal_id": "prop_m4k8n",
  "file_path": "src/utils/format.ts",
  "domain": "frontend",
  "status": "pending",
  "expires_at": "2026-03-21T10:30:00.000Z",
  "message": "Change proposal created."
}

list

List change proposals, optionally filtered by status, domain, or related task.

Parameters

NameTypeRequiredDescription
actionstringYes"list"
statusstringNoFilter by status: "pending", "applied", "rejected", "expired"
domainstringNoFilter by domain
related_task_idstringNoFilter by related task ID
limitnumberNoMaximum number of proposals to return

Example request

{
  "name": "changes",
  "arguments": {
    "action": "list",
    "status": "pending",
    "limit": 10
  }
}

Example response

{
  "proposals": [
    {
      "id": "prop_m4k8n",
      "file_path": "src/utils/format.ts",
      "domain": "frontend",
      "description": "Add locale support to formatDate with human-readable default",
      "status": "pending",
      "proposed_by": "agent",
      "related_task_id": null,
      "expires_at": "2026-03-21T10:30:00.000Z",
      "created_at": "2026-03-14T10:30:00.000Z",
      "old_content": "function formatDate(d: Date) {\n  return d.toISOString();\n}",
      "new_content": "function formatDate(d: Date, locale = 'en-US') {\n  return d.toLocaleDateString(locale, { year: 'numeric', month: 'short', day: 'numeric' });\n}"
    }
  ],
  "count": 1
}

apply

Mark a pending proposal as applied. The actual file change should be performed separately (e.g., with an editor tool).

Parameters

NameTypeRequiredDescription
actionstringYes"apply"
proposal_idstringYesID of the proposal to apply

Example request

{
  "name": "changes",
  "arguments": {
    "action": "apply",
    "proposal_id": "prop_m4k8n"
  }
}

Example response

{
  "success": true,
  "proposal_id": "prop_m4k8n",
  "file_path": "src/utils/format.ts",
  "status": "applied",
  "old_content": "function formatDate(d: Date) {\n  return d.toISOString();\n}",
  "new_content": "function formatDate(d: Date, locale = 'en-US') {\n  return d.toLocaleDateString(locale, { year: 'numeric', month: 'short', day: 'numeric' });\n}",
  "message": "Proposal marked as applied. Use the Edit tool to apply the actual change."
}

reject

Reject a pending proposal with an optional reason.

Parameters

NameTypeRequiredDescription
actionstringYes"reject"
proposal_idstringYesID of the proposal to reject
reasonstringNoExplanation for the rejection

Example request

{
  "name": "changes",
  "arguments": {
    "action": "reject",
    "proposal_id": "prop_m4k8n",
    "reason": "The locale parameter should use Intl.DateTimeFormat instead for better browser support"
  }
}

Example response

{
  "success": true,
  "proposal_id": "prop_m4k8n",
  "file_path": "src/utils/format.ts",
  "status": "rejected",
  "rejection_reason": "The locale parameter should use Intl.DateTimeFormat instead for better browser support",
  "message": "Proposal rejected."
}

Proposal lifecycle

Proposals follow a simple state machine:

pending → applied
pending → rejected
pending → expired (automatic, after 7 days)

Only proposals in pending status can be applied or rejected. Expired proposals remain in history and can be listed with status: "expired".

Previous
persona
Next
system