
printing-press-reprint
熱門在目前的 Printing Press 機器架構下,從頭重新生成現有的 printed CLI。此流程會將先前的研究、先前的新特性(novel features)以及發布後的手動修補(patches)作為調和上下文帶入寫作管道(writing pipeline),而不是直接捨棄。若本地不存在該 CLI,會自動從公共庫拉取;根據時間新舊建議「複用」或「重作」先前研究,隨後攜帶正確的上下文交接給 /printing-press。適用於 Printing Press 系統升級對已發布 CLI 的提升效果大於手動潤飾的場景。 觸發句:"reprint <api>", "regenerate <api>", "redo the <api> CLI", "rebuild <api> from scratch", "this CLI would benefit from a reprint"。
在目前的 Printing Press 機器架構下,從頭重新生成現有的 printed CLI。此流程會將先前的研究、先前的新特性(novel features)以及發布後的手動修補(patches)作為調和上下文帶入寫作管道(writing pipeline),而不是直接捨棄。若本地不存在該 CLI,會自動從公共庫拉取;根據時間新舊建議「複用」或「重作」先前研究,隨後攜帶正確的上下文交接給 /printing-press。適用於 Printing Press 系統升級對已發布 CLI 的提升效果大於手動潤飾的場景。 觸發句:"reprint <api>", "regenerate <api>", "redo the <api> CLI", "rebuild <api> from scratch", "this CLI would benefit from a reprint"。
/printing-press-reprint
在目前的機器架構下重新生成現有的 printed CLI。使用者需提供 CLI 名稱以及(可選的)重印原因。本 Skill 可確保先前生成的 CLI 存在於本地,建議要複用還是重作先前的研究,並將 context 交接給 /printing-press,以便 novel-features 子 Agent 能夠針對目前機器架構比對整合先前功能 —— 決定保留、重構或移除,並附上理由,絕不上演默默丟棄的情形。
/printing-press-reprint notion
/printing-press-reprint cal.com the new MCP intent surface landed and the prior CLI ships endpoint-mirror only
/printing-press-reprint allrecipes
什麼時候執行
- 發生重大 Printing Press 升級(全新的 MCP intent 介面、新的驗證模式、新的傳輸層、評分標準變更),能給此 CLI 帶來的提升遠大於手動潤飾。
- 已發布的 CLI 存在已知系統性缺陷,透過重新印製(reprint)即可修復。
- 使用者希望根據目前的機器架構與角色模型(personas)重新評估先前的特有功能(novel features),而非原封不動照搬。
如果只是單純修復一次性的程式碼品質問題,請優先使用 /printing-press-polish —— 它不會重新進行研究或重構手稿(manuscript)。
環境設定
PRESS_HOME="${PRINTING_PRESS_HOME:-$HOME/printing-press}"
PRESS_LIBRARY="$PRESS_HOME/library"
PRESS_MANUSCRIPTS="$PRESS_HOME/manuscripts"
# 管道中途的呼叫者可能會在 args bundle 中傳遞 printing_press_bin: <絕對路徑>。
# 優先使用它,讓 reprint 繼續使用父級 skill 在預檢時選定的執行檔,而非重新透過 PATH 解析。
PRINTING_PRESS_BIN="${PRINTING_PRESS_BIN:-}"
if [ -z "$PRINTING_PRESS_BIN" ] && [ -n "${ARGUMENTS:-}" ]; then
PRINTING_PRESS_BIN="$(printf '%s\n' "$ARGUMENTS" | sed -nE 's/^[[:space:]]*printing_press_bin:[[:space:]]*(.+)$/\1/p' | head -1)"
fi
if [ -z "$PRINTING_PRESS_BIN" ]; then
PRINTING_PRESS_BIN="$(command -v cli-printing-press 2>/dev/null || true)"
fi
if [ -z "$PRINTING_PRESS_BIN" ]; then
echo "cli-printing-press binary not found."
echo "Install with: go install github.com/mvanhorn/cli-printing-press/v4/cmd/cli-printing-press@latest"
return 1 2>/dev/null || exit 1
fi
echo "PRINTING_PRESS_BIN=$PRINTING_PRESS_BIN"
階段 A — 解析與比對存在狀態
按照 /printing-press-import 的方式解析使用者的引數:先抓取一次公共庫的 registry.json,再依照「完全比對 → 標準化比對 → 模糊比對」的順序進行匹配。引數可以是 API slug(例如 notion)、品牌名稱(例如 cal.com)、舊版 <api>-pp-cli 形式,或是足夠接近的名稱。
從匹配到的 registry 條目中擷取:API_SLUG(來自 .name)與 LIB_PATH(來自 .path,例如 library/productivity/cal-com)。階段 B 在抓取公共修補包(patches)時會用到 $LIB_PATH。對於「present | absent」這類未曾發布的列,$LIB_PATH 保持空白 —— 階段 B 的抓取會直接跳過。
接著檢查本地存在的檔案,並讀取兩份出處清單(provenance manifests)中的 run_id 與 generated_at 以和公共庫進行整合比對:
| 本地狀態 | 公共庫 Registry | 處置動作 |
|---|---|---|
| absent | absent | 停止 — 沒有可重印的內容;建議使用 /printing-press <api> 重新進行全新印製 |
| absent | present | 叫用 /printing-press-import <api>,然後繼續 |
| present | absent | 繼續 — 屬於未發布的本地 CLI;跳過匯入步驟 |
present, 相同 run_id |
present | 繼續執行,不進行匯入 |
present, 公共庫的 generated_at 較新 |
present | 透過 AskUserQuestion 提供匯入選項;由使用者決定 |
present, 本地的 generated_at 較新 |
present | 停止 — 本地有未發布的工作;提示使用者先發布或丟棄變更 |
叫用 /printing-press-import 時,由它負責備份、覆寫、建置驗證與模組路徑改寫。請等待其乾淨返回後再繼續。
階段 B — 驗證可整合比對的先前上下文
定位寫作管道(writing pipeline)需要知悉的兩項產物(artifacts):研究資料(用於驅動 novel-features Pass 2(d))以及修補包(patches,即由 /printing-press-amend 記錄的發布後手動修復,例如規格未揭露但在實務中發現的 API 特殊行為)。
LIB_TARGET="$PRESS_LIBRARY/$API_SLUG"
LIB_RESEARCH="$LIB_TARGET/research.json"
MAN_RESEARCH=$(ls -1t "$PRESS_MANUSCRIPTS/$API_SLUG"/*/research.json 2>/dev/null | head -1)
研究資料不存在
若這兩個研究資料路徑皆不存在,說明已發布的 CLI 早於 research.json 出處機制的引進時間。子 Agent 將把此次執行視為首次印製,且 Pass 2(d) 的重印調和比對不會觸發 —— 因為沒有可供讀取的資料。請向使用者說明並詢問:
已發布的
<api>是在research.json出處機制推出前建置的。
在缺少它的情況下,novel-features 子 Agent 將把本次執行視為首次印製 —— 無法進行比對整合。
是否以降級重印(降級模式,本質上是保留執行檔名稱的全新印製)繼續?
若使用者拒絕,則退出。若繼續,請記錄缺乏研究資料的狀況,以便在交接 prompt 中註明這是一次降級重印。
探測修補包(Patches discovery)
若網路可達,先從公共庫重新整理本地的修補包索引,接著讀取本地索引以確保後續引用穩定耐久。即使 run_id 匹配,公共版本也可能已套用了修正(amends)而未觸發全量重新生成,導致本地版本落後;本步驟即可補齊此差距。
索引通常以下列兩種結構之一提供:按修補包獨立存放的目錄 .printing-press-patches/(現行格式),或是舊版的單一陣列檔案 .printing-press-patches.json(尚未標準化的較舊 CLI)。在可存取時請務必同時檢查這兩種結構。當目錄包含修補檔時優先使用目錄,但在讀取目錄備用方案之前,切勿因缺少舊版單檔索引就直接設定 PATCH_COUNT=0。
PATCHES_DIR="$LIB_TARGET/.printing-press-patches"
PATCHES_LEGACY="$LIB_TARGET/.printing-press-patches.json"
if [[ -n "$LIB_PATH" ]]; then
# 若舊版格式存在則進行抓取,但切勿將 404 視為不存在任何修補包的證明。
# 目前的庫條目可能僅包含下方按修補包獨立存放的目錄。
tmp=$(mktemp)
if gh api -H "Accept: application/vnd.github.v3.raw" \
"repos/mvanhorn/printing-press-library/contents/$LIB_PATH/.printing-press-patches.json" \
> "$tmp" 2>/dev/null; then
mv "$tmp" "$PATCHES_LEGACY"
else
rm -f "$tmp"
fi
# 獨立抓取現行的目錄結構。當 `.printing-press-patches.json` 不存在時,這是必要的備用方案。
listing=$(gh api "repos/mvanhorn/printing-press-library/contents/$LIB_PATH/.printing-press-patches" 2>/dev/null || true)
if jq -e 'type == "array"' <<<"$listing" >/dev/null 2>&1; then
mkdir -p "$PATCHES_DIR"
jq -r '.[] | select(.name | endswith(".json")) | "\(.name)\t\(.download_url)"' <<<"$listing" \
| while IFS=$'\t' read -r name url; do
tmp=$(mktemp)
if curl -fsSL "$url" -o "$tmp" 2>/dev/null; then
mv "$tmp" "$PATCHES_DIR/$name" # 原子操作:傳輸中斷絕不會留下損壞的 JSON
else
rm -f "$tmp"
fi
done
fi
fi
# 從本地第一個非空結構中計算數量;PATCHES_SOURCE 即為階段 D 讀取的來源。
if [[ -d "$PATCHES_DIR" ]]; then
DIR_PATCH_COUNT=$(find "$PATCHES_DIR" -maxdepth 1 -name '*.json' ! -name '_meta.json' | wc -l | tr -d ' ')
else
DIR_PATCH_COUNT=0
fi
if [[ "$DIR_PATCH_COUNT" != "0" ]]; then
PATCH_COUNT="$DIR_PATCH_COUNT"
PATCHES_SOURCE="$PATCHES_DIR"
elif [[ -f "$PATCHES_LEGACY" ]]; then
PATCH_COUNT=$(jq '(.patches // []) | length' "$PATCHES_LEGACY" 2>/dev/null || echo 0)
PATCHES_SOURCE="$PATCHES_LEGACY"
else
PATCH_COUNT=0
PATCHES_SOURCE="$PATCHES_DIR"
fi
若 $PATCH_COUNT == 0 或不存在任何索引(早於修補包協定的舊版 CLI),請跳過本小節的其餘內容 —— 交接時無需包含修補包區塊。
若 $PATCH_COUNT > 0,請在繼續之前向使用者提示一行摘要:
公共庫中的
<api>記錄有$PATCH_COUNT個針對先前印製 CLI 的修補包(patch(es))。
將作為觀察清單帶入簡報(僅供參考,非強制重新套用),以免新生成的程式碼無意中導致已於線上驗證過的修復發生退化(regress)。
保留 $PATCHES_SOURCE 與 $PATCH_COUNT 供階段 D 使用。
階段 C — 新舊程度(Recency)建議
從最新的先前 research.json 中提取 researched_at,並從 .printing-press.json 中提取 printing_press_version + generated_at:
RESEARCHED_AT=$(jq -r '.researched_at // empty' "$MAN_RESEARCH" 2>/dev/null)
PRESS_VERSION=$(jq -r '.printing_press_version // empty' "$LIB_TARGET/.printing-press.json" 2>/dev/null)
GENERATED_AT=$(jq -r '.generated_at // empty' "$LIB_TARGET/.printing-press.json" 2>/dev/null)
使用 python3 計算研究資料的日曆天數,使其在 macOS/Linux 間保持跨平台相容,並可容忍 generated_at 所包含的微秒精度(BSD date -f 會拒絕小數秒;python3 則預裝於所有支援的平台上):
AGE_DAYS=$(python3 -c "
from datetime import datetime, timezone
ts = '$RESEARCHED_AT'.replace('Z', '+00:00')
print(int((datetime.now(timezone.utc) - datetime.fromisoformat(ts)).total_seconds() // 86400))
" 2>/dev/null)
向使用者展現這兩項訊號 —— 研究資料的建立天數與先前機器架構的版本。天數門檻為經驗法則,非硬性限制:
- 小於 30 天 → 複用看起來很安全
- 30–120 天 → 複用合理;使用者應在重印原因中說明任何已知的 API 異動,以便子 Agent 的 Pass 2 能進行捕捉
- 超過 120 天 → 建議重新進行研究
切勿單憑建立時間預測 API 異動 —— 請向使用者說明這些訊號並允許其覆寫建議。在 /printing-press 中由 Phase 0 執行的執行檔版本升級重新驗證會獨立處理機器差異,請勿在此重複執行。
透過 AskUserQuestion 詢問:
- 複用先前研究 — 保留先前的簡報;子 Agent 會根據目前的角色模型(personas)重新為先前的新功能打分
- 重新進行研究 — 從頭重新執行階段 1;子 Agent 仍會將先前的新功能作為 Pass 2(d) 的輸入引入
- 先讓我看看 — 顯示先前簡報的大綱與新功能清單,隨後重新在選項 1 與選項 2 之間詢問
階段 D — 交接給 /printing-press
在叫用 /printing-press 之前,先利用先前 CLI 的計分卡(scorecard)與 Manifest 決定本次重印是否應提供首次印製時無法使用的規格豐富化(spec enrichment)。重印比起全新印製擁有更充分的依據:知道哪些結構維度較為薄弱、是由哪一個版本的 Printing Press 生成了先前的 CLI,以及使用者提出的重印理由是什麼。
尋找先前手稿執行中最新的計分卡 JSON。若不存在計分卡產物,則對本地庫副本執行全新的結構計分:
SCORECARD_SOURCE=$(ls -1t "$PRESS_MANUSCRIPTS/$API_SLUG"/*/proofs/scorecard.json 2>/dev/null | head -1)
SCORECARD_JSON=""
if [[ -n "$SCORECARD_SOURCE" ]]; then
SCORECARD_JSON=$(cat "$SCORECARD_SOURCE" 2>/dev/null || true)
elif [[ -d "$LIB_TARGET" ]]; then
SCORECARD_SOURCE=$(mktemp)
if "$PRINTING_PRESS_BIN" scorecard --dir "$LIB_TARGET" --json > "$SCORECARD_SOURCE" 2>/dev/null; then
SCORECARD_JSON=$(cat "$SCORECARD_SOURCE" 2>/dev/null || true)
fi
rm -f "$SCORECARD_SOURCE"
SCORECARD_SOURCE=""
fi
若 SCORECARD_JSON 為空,請在不提示豐富化的情況下繼續,並提示重印正在無先前分數依據的情況下進行。切勿僅憑重印理由就自行憑空捏造 Prompt。
當 `S



