給 AI agent 的 marsdawn 參考
給呼叫 marsdawn 命令列工具的 AI agent 與腳本參考。本頁每個範例都用目前原始碼建置的工具實際執行過。
要把 Markdown 檔轉成 PDF,執行 marsdawn export notes.md --json,再從 stdout 讀取一個 JSON 物件。Mermaid 圖表與程式碼上色的呈現方式和 MarsDawn app 相同。export 不需要 app,open 需要。
能做什麼
export:用和 MarsDawn app 相同的匯出程式,把一個 Markdown 檔輸出成分頁的 PDF,不會開啟任何視窗。open:在 MarsDawn app 中開啟一或多個 Markdown 檔,讓人審閱,也可以指定每個檔案要定位的行,或在視窗的側邊欄顯示一個資料夾。
不做什麼
- 不從 stdin 讀取 Markdown,請傳入檔案路徑。
- 不把 PDF 寫到 stdout。PDF 一律寫成檔案,stdout 只輸出結果。
- 檔案已存在時不會覆寫,除非加上
--force。 - 不載入網路圖片,除非加上
--allow-remote-images,而且只走 https。 - 沒有安裝 MarsDawn 時,
open無法使用,會以代碼 3 結束。export不需要 app。App 已在 Mac App Store 上架。 - MarsDawn 1.0 會跳到
open指定的行。 - 只能在 macOS 上執行。
export
marsdawn export notes.md --json
在 notes.md 旁寫出 notes.pdf。選項:
-o, --output <path>:PDF 的寫入位置。預設為輸入檔路徑,副檔名換成.pdf。--theme <dawn|classic|modern|vivid>:使用主題的淺色色盤。預設為$MARSDAWN_THEME,其次是dawn。--paper <a4|letter>:紙張大小。預設為a4。--allow-remote-images:算繪時載入網路上的 https 圖片。--force:輸出檔已存在時覆寫。--json:在 stdout 輸出一個 JSON 物件,而不是文字。
marsdawn export notes.md -o out.pdf --theme classic --paper letter --force --json
成功,離開代碼 0:
{"diagramErrors":[],"ok":true,"output":"/path/to/out.pdf","pages":1,"paper":"letter","theme":"classic"}
output:寫出的 PDF 的絕對路徑。pages:頁數。theme與paper:實際使用的值。diagramErrors:每個算繪失敗的 Mermaid 圖表各一則訊息。PDF 仍會寫出。
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:line指定要定位的行。後面再接欄位,例如notes.md:120:8,會被忽略。如果參數本身就是一個存在的檔名,就一律當成那個檔案,所以名為weird:12的檔案會照原名開啟。--line <n>為單一檔案指定行號,包括檔名本身以冒號加數字結尾的情況。只能搭配一個檔案。- 行號範圍是 1 到 999999999,超出範圍是用法錯誤。
- 行號從 marsdawn 0.3.0 開始提供。MarsDawn 1.0 會打開檔案,並跳到指定的行。
- 資料夾參數會在視窗的側邊欄開啟,而不是當成文件,所以
marsdawn open .會顯示目前的資料夾;--folder <path>可以在開啟檔案的同時做到一樣的事。一個視窗的側邊欄只顯示一個資料夾:指定兩個是用法錯誤,--folder用兩次也是(即使是同一個資料夾);同一個資料夾以參數再指定一次則算一個。資料夾沒有行號,所以--line搭配資料夾是用法錯誤。沒有-a:傳入它是用法錯誤,錯誤訊息會指向--folder。 --background開啟時不把 MarsDawn 帶到最前面,適合在使用者做別的事時開檔的 agent。兩種情況的 JSON 都一樣。- 資料夾與
--background從 marsdawn 0.5.1 開始提供。
成功,離開代碼 0:
{"app":"/Applications/MarsDawn.app","ok":true,"opened":[{"line":120,"path":"/path/to/notes.md"}]}
opened:每個檔案一個物件,順序與傳入時相同。path是檔案的絕對路徑;只有指定了行號時才有line。app:開啟它們的 MarsDawn app 路徑。
有資料夾時(marsdawn 0.5.1 以後),離開代碼 0:
{"app":"/Applications/MarsDawn.app","folder":{"path":"/path/to/project","requested":true},"ok":true,"opened":[{"path":"/path/to/project/notes.md"}]}
folder:只有指定了資料夾時才有。path是它的絕對路徑。requested一律是true:marsdawn 已請 MarsDawn 顯示這個資料夾,但無法得知側邊欄是否真的顯示了,因為 app 可能會先向使用者要求存取權限。請回報為「已要求」,而不是「已完成」。--wait大於 0、且 MarsDawn 為 1.0.2 以上時,等待結束後folder還會帶status:attached、needsUser、declined、failed、attachedDifferentFolder、full、unavailable或unknown。只有在needsUser時,才會再帶waitingFor:confirmation或folderChoice。沒有--wait,或 app 不會回報時,folder維持{"path": …, "requested": true}。--wait超出 0 到 30 時以代碼 64 結束,並帶error: "wait_out_of_range"。(marsdawn 0.5.3 以後。)- 只指定資料夾時,
opened是空的。
marsdawn 0.2.x 的 opened 是路徑字串的清單。如果需要同時處理兩種格式,請先查看 marsdawn --version。
在 Claude Code 編輯時開啟檔案
一個需要自行啟用的 Claude Code hook:Claude 寫入或編輯 Markdown 檔案之後,在背景用 MarsDawn 開啟那個檔案,每個 session 每個檔案只開一次。除非你加上它,否則不會啟用,而且要一個專案一個專案加,因為你沒要求就跳出來的視窗會打斷注意力。它執行的是 shell 指令,不花模型 token。
需要 marsdawn 0.5.1 或更新版本,才有 --background,以及 MarsDawn app。
把下面的內容存成專案裡的 .claude/hooks/marsdawn-open.sh,再用 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
然後把 hook 加到專案的 .claude/settings.json;如果只想自己用,改加到 .claude/settings.local.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/marsdawn-open.sh" }
]
}
]
}
}
- 它在 Claude 的 Write 和 Edit 工具之後執行。副檔名不是
.md或.markdown的檔案不會處理。 - 在同一個 Claude Code session 裡,每個檔案只開一次,不管 Claude 編輯幾次。清單存在
$TMPDIR/marsdawn-hook/,每個 session 一個檔案,所以開新的 session 會再開一次。 --background讓 MarsDawn 不會跳到最前面:你正在用的視窗會保持焦點。- 它不會擋到 Claude。每條路徑都以 0 結束;如果沒有安裝 marsdawn 或 MarsDawn app,就什麼都不做。
- 它用
/usr/bin/jq讀取 hook 的輸入。macOS 26 內建這個工具,而 MarsDawn app 也需要 macOS 26。 - 要關掉,從設定檔移除這一項即可。
失敗
加上 --json 時,失敗會在 stdout 輸出一個 JSON 物件,並以對應的代碼結束:
{"error":"output_exists","message":"/path/to/notes.pdf already exists. Pass --force to replace it.","ok":false}
2,input_not_found:輸入檔不存在、是資料夾,或不是 UTF-8 文字;或--folder的路徑不存在、不是資料夾。3,app_not_installed:沒有安裝 MarsDawn。只有open會回傳這個代碼。4,output_exists:輸出檔已存在,請加上--force。5,export_failed:匯出本身失敗。6,app_cannot_open_folders:這個版本的 MarsDawn 還不能顯示資料夾,所以沒有開啟任何東西。只有open會回傳這個代碼。64:用法錯誤,例如未知的選項、無效的值、行號超出範圍、--line搭配了多個檔案或資料夾、指定了多個資料夾,或使用了-a。這種錯誤一律以文字輸出到 stderr,即使加了--json也一樣。
JSON Schema
每種 --json 結果的 JSON Schema(draft 2020-12):
- export.v1.json: export 成功
- open.v4.json: open 成功,marsdawn 0.5.3 以後,資料夾多了
status和waitingFor - open.v3.json: open 成功,marsdawn 0.5.1 和 0.5.2,包括在側邊欄顯示的資料夾
- error.v3.json: 所有指令的失敗結果,marsdawn 0.7.1 以後,新增
input_too_large(代碼 5)和skill_install_failed(代碼 7) - error.v2.json: 兩個指令的失敗結果,marsdawn 0.5.2 到 0.7.0
- open.v2.json: open 成功,marsdawn 0.3.0 到 0.5.0
- open.v1.json: open 成功,marsdawn 0.2.x,當時
opened是路徑清單 - error.v1.json: 兩個指令的失敗結果,marsdawn 0.5.1 以前
環境變數
MARSDAWN_THEME:沒有傳入--theme時,export使用的主題。未知的值會直接改用dawn,不會報錯。
系統需求
- 這個工具需要 macOS 15 以上。在 Apple 晶片的 Mac 上,Homebrew 會安裝預先建置好的版本,不需要其他東西。自己建置時(在 Intel Mac 上,或從原始碼建置),需要 Swift 6.2 以上,也就是 Xcode 26 以上。
- MarsDawn app 需要 macOS 26 以上。
安裝
使用 Homebrew。在 Apple 晶片的 Mac 上,會直接安裝預先建置好的版本,幾秒就完成,不需要 Xcode。在 Intel Mac 上則會從原始碼編譯 marsdawn,需要幾分鐘,也需要 Xcode 26 以上。
brew tap redtear1115/tap && brew install marsdawn
marsdawn --version
也可以從原始碼建置。第一次建置會下載相依套件並編譯,同樣需要幾分鐘。
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 會印出版本號,例如 0.3.0,並以代碼 0 結束。
接下來
- 給讀指令檔而不是執行 shell 的 agent 用的一個檔案:marsdawn skill。
- 包住同一個
export的 MCP 伺服器:marsdawn-mcp。 - 這份 JSON 結果為什麼不花 agent 自己的 context:節省 token 的審閱方式。
- 和 agent 一起做 MarsDawn 主題:和 agent 一起做主題。