Index
axm_edit
axm-edit — Atomic batch file editing for AI agents.
Replace, create, and delete files in a single atomic operation.
Operation = Annotated[ReplaceOp | CreateOp | DeleteOp, Field(discriminator='op')]
module-attribute
Discriminated union of all operation types.
BatchResult
Bases: BaseModel
Result of a batch edit operation.
Atomicity contract (see :func:axm_edit.core.engine.batch_apply):
atomicity is guaranteed at validation (all-or-nothing — a validation
error rejects the whole batch before any write); the apply phase is
best-effort with automatic rollback-to-checkpoint, so on any mid-apply
exception success is False, error is populated, checkpoint
holds the targeted snapshot, and every touched path has been restored to
its pre-batch state.
Attributes:
| Name | Type | Description |
|---|---|---|
success |
bool
|
Whether all operations were applied ( |
checkpoint |
str | None
|
Targeted-path snapshot captured before apply, usable for rollback; present whenever the apply phase was entered. |
applied |
int
|
Total number of individual edits applied. |
summary |
dict[str, int]
|
Counts of modified, created, and deleted files. |
error |
str | None
|
Human-readable error message on failure. |
details |
list[ValidationError]
|
Detailed validation errors on failure. |
Source code in packages/axm-edit/src/axm_edit/models/operations.py
CreateOp
Bases: BaseModel
Create a new file.
Fails if the file already exists unless overwrite is True.
Source code in packages/axm-edit/src/axm_edit/models/operations.py
DeleteOp
Bases: BaseModel
Delete an existing file.
Fails if the file does not exist.
Source code in packages/axm-edit/src/axm_edit/models/operations.py
Edit
Bases: BaseModel
A single line-level edit within a replace operation.
Attributes:
| Name | Type | Description |
|---|---|---|
line |
int | None
|
Optional 1-indexed line hint in the original file.
If provided, used as a starting point for searching |
old |
str
|
Expected content to find and replace (validation anchor).
May contain |
new |
str
|
Replacement content. |
Source code in packages/axm-edit/src/axm_edit/models/operations.py
ReplaceOp
Bases: BaseModel
Modify lines in an existing file.
All line numbers reference the file as originally read, before any edits are applied. The engine sorts edits bottom-to-top to avoid line-shift problems.
Source code in packages/axm-edit/src/axm_edit/models/operations.py
RollbackResult
Bases: BaseModel
Outcome of a best-effort rollback.
Rollback is a strict inverse: it only undoes what the batch did. It is
also best-effort — every captured path is attempted even if an earlier one
fails, so a partial rollback is fully observable instead of aborting
mid-loop. ok is True only when the snapshot was well-formed and
every captured path was restored.
Attributes:
| Name | Type | Description |
|---|---|---|
restored |
list[str]
|
Relative paths successfully restored to their pre-batch state. |
unrestored |
list[str]
|
Relative paths that could not be restored (a filesystem error was raised while undoing them). |
valid |
bool
|
Whether the snapshot was well-formed and parseable. |
Source code in packages/axm-edit/src/axm_edit/models/operations.py
ok
property
True iff the snapshot was valid and nothing failed to restore.
ValidationError
Bases: BaseModel
A single validation failure.
Source code in packages/axm-edit/src/axm_edit/models/operations.py
| Python | |
|---|---|
batch_apply(root, operations)
Validate and apply a batch of file operations.
Atomicity contract:
- Validation is the gate. All operations are validated first; if any
fails the batch is rejected wholesale (
success=False) before a single byte is written — a true all-or-nothing guarantee. - Apply is best-effort with automatic rollback. Once validation
passes, a targeted checkpoint of every touched path is captured and the
operations are applied. If any exception occurs mid-apply (anchor
drift, a
write_text/unlink/mkdirfailure, a permission error, …) the partial work is rolled back to that checkpoint — touched files are restored to their pre-batch bytes and batch-created files (and the empty directories created for them) are removed — and a failingBatchResultis returned. The filesystem is not made transactional at the OS level; the rollback restores only the snapshotted paths.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
root
|
Path
|
Project root directory (all paths are relative to this). |
required |
operations
|
Sequence[Operation]
|
List of replace, create, and delete operations. |
required |
Returns:
| Type | Description |
|---|---|
BatchResult
|
BatchResult with success status, a targeted-path snapshot |
BatchResult
|
( |
Source code in packages/axm-edit/src/axm_edit/core/engine.py
rollback(root, checkpoint)
Restore exactly the paths captured by checkpoint to their prior state.
Rollback is a strict inverse of the batch and best-effort: for each snapshotted path a file that existed is rewritten with its original bytes, a file that did not exist before is removed, and only the directories the batch itself created (recorded in the snapshot) are pruned — a pre-existing directory is never removed. Every captured path is attempted even if an earlier one fails, so a partial rollback is fully reported. No git command is run.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
root
|
Path
|
Project root directory. |
required |
checkpoint
|
str
|
The JSON snapshot returned by :func: |
required |
Returns:
| Name | Type | Description |
|---|---|---|
A |
RollbackResult
|
class: |
RollbackResult
|
paths restored and those that could not be restored. |
|
RollbackResult
|
is |
|
RollbackResult
|
a malformed snapshot yields |