CriticMarkup-aware markdown viewer for the terminal
Project description
██████ ██ ████████ ████████ ██ ██ ▄█████ ████████ ██████
██ ██ ██ ██ ██ ██ ██ ▀▀▀▄▄▄ ██ ██ ██
██ ██ ██ ██████ ██████ ██ ██ █████▀ ██████ ██████
██ ██ ██ ██ ██ ██ ██ █ ██ ██ ██
██████ ██ ██ ██ ██████ ██████▀ ████████ ██ ██
CriticMarkup-aware markdown viewer for the terminal.
Getting Started
Installation
pip install diffuser-cli
Or with uv:
uv tool install diffuser-cli
Quick Example
Given a markdown file with CriticMarkup annotations:
The system processed the data and {~~returned results to~>delivered results
back to~~} the user.{>>"Delivered back" is more active and specific.<<}
Render it in the terminal with color-coded annotations:
diffuser view my-document.md
Background & Rationale
When AI agents suggest changes to writing, they typically rewrite the whole file. The original is gone. If you disagree with one sentence, tough luck -- you're diffing walls of prose in a terminal.
CriticMarkup solves this. It's a plain-text syntax for editorial annotations
that sits inside the document without destroying what was already there.
{++add this++}, {--remove this--}, {~~old~>new~~} -- five simple
marks that let an agent suggest changes while preserving every word of the
original.
What was missing was a way to view these annotations clearly from the command line. Rich terminal rendering, color-coded by change type, without leaving the shell. That's what diffuser does.
How It Works
diffuser preprocesses CriticMarkup syntax into Rich markup, then delegates
all markdown rendering to the rich library. No custom HTML parser, no
browser -- just your terminal.
CriticMarkup Syntax
| Syntax | Meaning |
|---|---|
{++text++} |
Insertion |
{--text--} |
Deletion |
{~~old~>new~~} |
Substitution |
{==text==} |
Highlight |
{>>text<<} |
Comment |
Full specification: http://criticmarkup.com/spec.php
Agent Skill
diffuser ships with a skill that teaches AI agents how to use CriticMarkup when editing your writing. Install it with the skills CLI:
npx skills add shakedlokits/diffuser
Or view the skill content directly:
diffuser skill
The skill instructs the agent to annotate files in-place using CriticMarkup syntax, never deleting or replacing original text directly.
Development
Setup
git clone https://github.com/shakedlokits/diffuser.git
cd diffuser
uv sync
Running
uv run diffuser view my-document.md
Running Tests
uv run pytest
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file diffuser_cli-0.1.0.tar.gz.
File metadata
- Download URL: diffuser_cli-0.1.0.tar.gz
- Upload date:
- Size: 23.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
508e51e8fb8f20f57f94066b83edf53a176c84acbc4be773714a9de8e17c3c58
|
|
| MD5 |
f6054721a7b17b6f470c82ddcfbd0b11
|
|
| BLAKE2b-256 |
e75d1da5cb563296e2c02c4e983a7a0e772a4a968aaec0b19a28c1e82fd0ff75
|
Provenance
The following attestation bundles were made for diffuser_cli-0.1.0.tar.gz:
Publisher:
release.yml on shakedlokits/diffuser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
diffuser_cli-0.1.0.tar.gz -
Subject digest:
508e51e8fb8f20f57f94066b83edf53a176c84acbc4be773714a9de8e17c3c58 - Sigstore transparency entry: 1199738664
- Sigstore integration time:
-
Permalink:
shakedlokits/diffuser@615efee1f61d6a35c7b8272862e0e7159c98752a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/shakedlokits
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@615efee1f61d6a35c7b8272862e0e7159c98752a -
Trigger Event:
push
-
Statement type:
File details
Details for the file diffuser_cli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: diffuser_cli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 19.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20c337ea3c2adc9f73f82cdd57b578448508dce7a36108c01f40bb5cdc3b7465
|
|
| MD5 |
a8fa457cf0d4aed7a34ece2d5855642d
|
|
| BLAKE2b-256 |
3faff53ab590ac3dae413c6c7bbfc6e10498bb6d0902b877d5bfe23d3a5ae31a
|
Provenance
The following attestation bundles were made for diffuser_cli-0.1.0-py3-none-any.whl:
Publisher:
release.yml on shakedlokits/diffuser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
diffuser_cli-0.1.0-py3-none-any.whl -
Subject digest:
20c337ea3c2adc9f73f82cdd57b578448508dce7a36108c01f40bb5cdc3b7465 - Sigstore transparency entry: 1199738677
- Sigstore integration time:
-
Permalink:
shakedlokits/diffuser@615efee1f61d6a35c7b8272862e0e7159c98752a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/shakedlokits
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@615efee1f61d6a35c7b8272862e0e7159c98752a -
Trigger Event:
push
-
Statement type: