marsdawn pour les agents
Une référence pour les agents IA et les scripts qui appellent l’outil en ligne de commande marsdawn. Chaque exemple de cette page a été exécuté avec l’outil compilé à partir des sources actuelles.
Pour convertir un fichier Markdown en PDF, lancez marsdawn export notes.md --json et lisez un objet JSON sur stdout. Les diagrammes Mermaid et le code coloré sont rendus de la même façon que dans l’app MarsDawn. export n’a pas besoin de l’app ; open, si.
Ce qu’il fait
exportfait le rendu d’un fichier Markdown en un PDF paginé, avec le même moteur d’export que l’app MarsDawn. Aucune fenêtre ne s’ouvre.openouvre un ou plusieurs fichiers Markdown dans l’app MarsDawn pour qu’une personne les relise ; il peut indiquer la ligne à laquelle chaque fichier doit s’ouvrir et afficher un dossier dans la barre latérale de la fenêtre.
Ce qu’il ne fait pas
- Il ne lit pas le Markdown depuis stdin. Passez un chemin de fichier.
- Il n’écrit pas le PDF sur stdout. Le PDF va toujours dans un fichier ; stdout ne contient que le résultat.
- Il ne remplace pas un fichier existant, sauf si vous passez
--force. - Il ne charge pas d’images depuis le web, sauf si vous passez
--allow-remote-images, et uniquement en https. openne fonctionne pas sans l’app MarsDawn installée ; il se termine avec le code 3.exportn’a pas besoin de l’app. L’app est sur le Mac App Store.- MarsDawn 1.0 ouvre le fichier à la ligne indiquée par
open. - Il ne fonctionne que sous macOS.
export
marsdawn export notes.md --json
Écrit notes.pdf à côté de notes.md. Options :
-o, --output <path>: où écrire le PDF. Par défaut, le chemin d’entrée avec l’extension.pdf.--theme <dawn|classic|modern|vivid>: la palette claire du thème. Par défaut$MARSDAWN_THEME, sinondawn.--paper <a4|letter>: format du papier. Par défauta4.--allow-remote-images: charge les images https du web pendant le rendu.--force: remplace le fichier de sortie s’il existe.--json: affiche un objet JSON sur stdout au lieu de texte.
marsdawn export notes.md -o out.pdf --theme classic --paper letter --force --json
Succès, code de sortie 0 :
{"diagramErrors":[],"ok":true,"output":"/path/to/out.pdf","pages":1,"paper":"letter","theme":"classic"}
output: chemin absolu du PDF écrit.pages: nombre de pages.themeetpaper: les valeurs utilisées.diagramErrors: un message par diagramme Mermaid dont le rendu a échoué. Le PDF est tout de même écrit.
open
marsdawn open notes.md --json
marsdawn open notes.md:120 --json
marsdawn open notes.md --line 120 --json
marsdawn open . --json
marsdawn open notes.md --folder . --background --json
path:lineindique la ligne à laquelle s’ouvrir. Une colonne après, comme dansnotes.md:120:8, est ignorée. Un argument qui désigne un fichier existant est toujours ce nom de fichier entier : un fichier nomméweird:12s’ouvre donc tel quel.--line <n>indique la ligne pour un seul fichier, y compris un chemin qui se termine lui-même par deux-points et des chiffres. Il faut exactement un fichier.- Les lignes vont de 1 à 999999999. Toute autre valeur est une erreur d’utilisation.
- Les lignes ont été ajoutées dans marsdawn 0.3.0. MarsDawn 1.0 ouvre le fichier à cette ligne.
- Un dossier passé en argument s’ouvre dans la barre latérale de la fenêtre et non comme document :
marsdawn open .affiche donc le dossier courant ;--folder <path>fait de même en plus des fichiers. La barre latérale d’une fenêtre affiche un seul dossier : en indiquer deux est une erreur d’utilisation, tout comme utiliser--folderdeux fois, même pour le même dossier ; le même dossier redonné en argument compte une seule fois.--lineavec un dossier est une erreur d’utilisation, puisqu’un dossier n’a pas de ligne. Il n’y a pas de-a: le passer est une erreur d’utilisation qui renvoie à--folder. --backgroundouvre sans faire passer MarsDawn au premier plan, pour un agent qui ouvre des fichiers pendant que la personne travaille ailleurs. Le JSON est le même dans les deux cas.- Les dossiers et
--backgroundont été ajoutés dans marsdawn 0.5.1.
Succès, code de sortie 0 :
{"app":"/Applications/MarsDawn.app","ok":true,"opened":[{"line":120,"path":"/path/to/notes.md"}]}
opened: un objet par fichier, dans l’ordre donné.pathest le chemin absolu du fichier ;linen’apparaît que si une ligne a été demandée.app: chemin de l’app MarsDawn qui les a ouverts.
Avec un dossier (marsdawn 0.5.1 et versions ultérieures), code de sortie 0 :
{"app":"/Applications/MarsDawn.app","folder":{"path":"/path/to/project","requested":true},"ok":true,"opened":[{"path":"/path/to/project/notes.md"}]}
folder: présent seulement si un dossier a été donné.pathest son chemin absolu.requestedvaut toujourstrue: marsdawn a demandé à MarsDawn d’afficher le dossier, mais ne peut pas savoir si la barre latérale l’affiche, car l’app peut d’abord demander l’accès à la personne. Signalez-le comme demandé, pas comme fait.- Avec un
--waitsupérieur à 0 et MarsDawn 1.0.2 ou version ultérieure,foldercontient aussistatusune fois l’attente terminée :attached,needsUser,declined,failed,attachedDifferentFolder,full,unavailableouunknown. Seulement avecneedsUser, il contientwaitingFor:confirmationoufolderChoice. Sans--wait, ou avec une app qui ne donne pas de réponse,folderreste{"path": …, "requested": true}. Un--waithors de 0 à 30 se termine avec le code 64 eterror: "wait_out_of_range". (marsdawn 0.5.3 et versions ultérieures.) openedest vide si seul un dossier a été donné.
marsdawn 0.2.x affichait opened sous forme de liste de chemins. Vérifiez marsdawn --version si vous devez gérer les deux.
Ouvrir les fichiers à mesure que Claude Code les modifie
Un hook Claude Code facultatif : après que Claude a écrit ou modifié un fichier Markdown, il ouvre ce fichier dans MarsDawn en arrière-plan, une fois par fichier et par session. Il est désactivé tant que vous ne l’ajoutez pas, projet par projet, car une fenêtre que vous n’avez pas demandée détourne l’attention. Il exécute une commande shell et ne coûte aucun token de modèle.
Il nécessite marsdawn 0.5.1 ou version ultérieure, pour --background, ainsi que l’app MarsDawn.
Enregistrez ceci sous .claude/hooks/marsdawn-open.sh dans votre projet, et rendez-le exécutable avec chmod +x :
#!/bin/sh
# Claude Code PostToolUse hook: open a Markdown file Claude just wrote or edited in MarsDawn,
# in the background, once per file per session. Never blocks Claude: every path exits 0.
input=$(cat)
file=$(printf '%s' "$input" | /usr/bin/jq -r '.tool_input.file_path // empty' 2>/dev/null)
session=$(printf '%s' "$input" | /usr/bin/jq -r '.session_id // "unknown"' 2>/dev/null)
case "$file" in
*.md|*.markdown) ;;
*) exit 0 ;;
esac
[ -f "$file" ] || exit 0
# A hook runs with Claude Code's PATH, which may not include Homebrew's.
marsdawn=$(command -v marsdawn || { [ -x /opt/homebrew/bin/marsdawn ] && echo /opt/homebrew/bin/marsdawn; }) || exit 0
[ -n "$marsdawn" ] || exit 0
# One list per session, so a file opens once however often Claude edits it.
seen="${TMPDIR:-/tmp}/marsdawn-hook/$session"
mkdir -p "$(dirname "$seen")"
grep -qxF "$file" "$seen" 2>/dev/null && exit 0
echo "$file" >> "$seen"
"$marsdawn" open --background "$file" >/dev/null 2>&1 || true
exit 0
Ajoutez ensuite le hook à .claude/settings.json dans le projet, ou à .claude/settings.local.json pour le garder pour vous :
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/marsdawn-open.sh" }
]
}
]
}
}
- Il s’exécute après les outils Write et Edit de Claude. Les fichiers qui ne se terminent pas par
.mdou.markdownsont ignorés. - Chaque fichier s’ouvre une fois par session Claude Code, quel que soit le nombre de modifications. La liste se trouve dans
$TMPDIR/marsdawn-hook/, un fichier par session : une nouvelle session rouvre donc le fichier. --backgroundempêche MarsDawn de passer au premier plan : la fenêtre dans laquelle vous travailliez garde le focus.- Il ne gêne jamais Claude. Chaque chemin se termine avec 0, et si marsdawn ou l’app MarsDawn n’est pas installé, rien ne se passe.
- Il lit l’entrée du hook avec
/usr/bin/jq, fourni avec macOS 26, la version dont l’app MarsDawn a besoin. - Pour le désactiver, supprimez l’entrée du fichier de réglages.
Échecs
Avec --json, un échec affiche un objet JSON sur stdout et se termine avec son code :
{"error":"output_exists","message":"/path/to/notes.pdf already exists. Pass --force to replace it.","ok":false}
2,input_not_found: l’entrée n’existe pas, est un dossier ou n’est pas du texte UTF-8 ; ou un chemin--foldern’existe pas ou n’est pas un dossier.3,app_not_installed: MarsDawn n’est pas installé. Seulopenrenvoie ce code.4,output_exists: le fichier de sortie existe. Passez--force.5,export_failed: l’export lui-même a échoué.6,app_cannot_open_folders: cette version de MarsDawn ne peut pas afficher de dossier, donc rien n’a été ouvert. Seulopenrenvoie ce code.64: erreur d’utilisation, comme une option inconnue, une valeur non valide, une ligne hors limites,--lineavec plus d’un fichier ou avec un dossier, plus d’un dossier, ou-a. Celle-ci s’affiche en texte sur stderr, même avec--json.
Schémas JSON
JSON Schema (draft 2020-12) pour chaque résultat --json :
- export.v1.json: succès de export
- open.v4.json: succès de open, marsdawn 0.5.3 et versions ultérieures, avec
statusetwaitingFordu dossier - open.v3.json: succès de open, marsdawn 0.5.1 et 0.5.2, y compris un dossier affiché dans la barre latérale
- error.v3.json: échec, pour toutes les commandes, marsdawn 0.7.1 et versions ultérieures, avec
input_too_large(code 5) etskill_install_failed(code 7) - error.v2.json: échec, pour les deux commandes, marsdawn 0.5.2 à 0.7.0
- open.v2.json: succès de open, marsdawn 0.3.0 à 0.5.0
- open.v1.json: succès de open, marsdawn 0.2.x, où
openedétait une liste de chemins - error.v1.json: échec, pour les deux commandes, marsdawn 0.5.1 et versions antérieures
Variables d’environnement
MARSDAWN_THEME: le thème qu’utiliseexportquand--themen’est pas passé. Une valeur inconnue revient àdawnsans erreur.
Configuration requise
- L’outil fonctionne sous macOS 15 ou version ultérieure. Sur puce Apple, Homebrew installe un bottle précompilé et rien d’autre n’est nécessaire. Le compiler vous-même, sur un Mac Intel ou à partir des sources, nécessite Swift 6.2 ou version ultérieure, fourni avec Xcode 26 ou version ultérieure.
- L’app MarsDawn nécessite macOS 26 ou version ultérieure.
Installation
Avec Homebrew. Sur puce Apple, il installe un bottle précompilé en quelques secondes, sans Xcode. Sur un Mac Intel, il compile marsdawn à partir des sources, ce qui prend quelques minutes et nécessite Xcode 26 ou version ultérieure.
brew tap redtear1115/tap && brew install marsdawn
marsdawn --version
Ou compilez-le à partir des sources. La première compilation récupère les dépendances et compile, ce qui prend aussi quelques minutes.
git clone https://github.com/redtear1115/mars-dawn-kit.git
cd mars-dawn-kit
swift build -c release --product marsdawn
.build/release/marsdawn export notes.md --json
marsdawn --version affiche le numéro de version, par exemple 0.3.0, et se termine avec le code 0.
Pour aller plus loin
- Une compétence en un seul fichier pour les agents qui lisent des instructions plutôt qu’un shell : la compétence marsdawn.
- Un serveur MCP qui enveloppe ce même
export: marsdawn-mcp. - Pourquoi ce résultat JSON reste économique pour le contexte de l’agent : une relecture économe en tokens.
- Créer un thème MarsDawn avec un agent : Créer un thème avec votre agent.