@nullproof-studio/en-scribe
v0.3.0
Published
Reliable plain-text editing for agent systems. A sibling MCP to en-quire: literal range + anchor ops, no structural interpretation.
Downloads
229
Maintainers
Readme
@nullproof-studio/en-scribe
Reliable plain-text editing for agent systems. A sibling MCP to en-quire: shares en-quire's reliability layer (etag optimistic locking, proposals, diffs) but operates on lines, ranges, and anchors rather than sections.
Positioning — literal: reads and edits without structural interpretation. For section-aware editing of markdown or YAML, use en-quire.
Install
npm install -g @nullproof-studio/en-scribeProvides the enscribe binary.
Tools
Two primitives — text_find, text_replace_range — can express any edit. The sugar tools are ergonomic shortcuts for the common unique-match case; they error with a clear hint when matches are ambiguous, so agents can fall back to the primitives without getting stuck.
| Layer | Tool |
|---|---|
| Read | text_read, text_find, text_head, text_tail, text_list |
| Write primitives | text_replace_range, text_create, text_append |
| Sugar | text_edit, text_insert_at_anchor |
| Lifecycle | text_rename, text_delete |
| Governance | text_status, text_proposals_list, text_proposal_diff, text_proposal_approve, text_proposal_reject |
No regex. The positioning is predictable, no hidden semantics; agents wanting pattern power reach for grep or en-quire.
Governance workflow
Proposals can become real pull requests on GitHub/GitLab. Configure the remote, the push flag, and a pr_hook on a root:
document_roots:
notes:
path: /data/notes
git:
remote: origin
push_proposals: true
pr_hook: "gh pr create --head {branch} --title 'Proposal: {file}' --base main"Every mode: "propose" write then runs the full pipeline:
- Commits to a
propose/<caller>/<path>/<timestamp>branch locally - Pushes to the remote
- Fires
pr_hookwith{branch}/{file}/{caller}substitution (viaexecFile— no shell)
Approvals happen via text_proposal_approve (merges locally after verifying the remote branch still exists — fails closed if it was merged upstream already) or via the PR UI on your host. Server startup runs git fetch --prune per git-enabled root so text_proposals_list stays current across sessions.
See the repo README for configuration and the full spec.
