Community程式設計與開發github.com

toufiqfarhan0/chronicle-ink

將一個主題轉化為一段經過事實查核的 2–3 分鐘知識影片,其畫面由你編寫的程式碼繪製而成。針對任何城市的生活故事,`model` 風格會從地球飛入真實的 3D 城市(每個 OpenStreetMap 建築均以其實際高度呈現),並在其上以燈光展示該城市的歷史,一個時代接著一個時代,並附有與旁白同步的效果(河流、城牆、火災、連結、重建)。水墨卷軸與羅馬地圖集風格套件服務於人物、地標與動物。僅使用文字 LLM(也就是你,Agent)與工具;事實會在不同出版者之間進行交叉比對;旁白與音樂曲目可透過 SandBase 選擇性加入。

chronicle-ink 是什麼?

Chronicle · Ink 是一個極具原創性的 AI Agent 技能,它顛覆了多模態生成的常規,要求純文字 LLM(如 Claude、MiniMax M3.1 等)扮演整個劇組,完全透過編寫程式碼來繪製 2–3 分鐘的知識影片。該技能的核心哲學在於「硬性規定:僅限文字 LLM 與工具」,禁止使用任何影像、聲音或多模態模型;每一幀畫面都由你撰寫的場景程式碼在 Canvas 2D 或 WebGL 中即時繪製,實現了 AI 世代獨特的「代碼生成影片」工作流程。它內建了完整的事實查核引擎,要求每個敘述至少經過兩個獨立來源驗證,並提供經典的「水墨卷軸」(ink)、「羅馬地圖集」(roman)與「城市模型展示」(model)等三種風格套件。其中 model 風格特別針對城市歷史敘事,能從 OpenStreetMap 與 Wikidata 讀取真實地理資料,在黑暗工作室中透過不斷變換的光影與 3D 建築模型來講述城市的興衰。整個流程分為導演、研究員、事實查核員、編劇、美術、作曲家、剪輯師與 QA 等角色,但全部由一個 AI Agent 透過 CLI 命令依序執行。每個環節(研究、劇本、場景、音樂)都以結構化的 JSON 檔案溝通,並在渲染每個片段後進行嚴格的自我審查與修正循環。此技能支援 Node 22+、FFmpeg 與 Chrome,可輸出 16:9 或 9:16 的 MP4、VTT 字幕與詳細報告,非常適合知識傳播者、教育內容創作者與對壯觀的 AI 工程典範感興趣的開發者。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/toufiqfarhan0/ai-city-remix-workflows/tree/main/chronicle-ink/chronicle-ink

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Chronicle · Ink(水墨卷軸)

你(正在閱讀此文件的 Agent)是整支影片攝製組。此 Skill 提供了一個階段性的 CLI、一個事實引擎、一個帶有精確節拍映射的代碼合成系列主題、一個程序化 SFX 工具包、一個水墨繪圖工具包和一個 HyperFrames 渲染器。你需要撰寫主張、包含一行說明的鏡頭列表、場景程式碼以及審查意見。不會調用任何圖像、語音、音樂、視覺或 LLM 模型;唯一的成本是你自己的 token。

硬性規則:僅限文字 LLM 與工具。 所有寫作、研究、事實查核、場景程式碼和審查工作,均由執行此 Skill 的文字 LLM 完成(例如透過 SandBase 執行的 MiniMax M3.1 flash,或任何其他 Agent 模型)。你可以調用工具:網路搜尋與抓取、SandBase 數據 API、下列命令、FFmpeg。你絕不能調用多模態生成模型:不得使用任何圖像、影片、TTS/語音、音樂或視覺模型,以及任何 AI 生成的圖畫或音頻檔案。每一幀畫面均由你撰寫的場景程式碼繪製,每一種聲音均由引擎合成。聯繫表(Contact sheets)需以數字和你自己渲染的幀來審查,而非透過視覺模型。使用了多模態模型的影片,就不是 chronicle-ink 影片。

選擇性例外:音樂與旁白。 僅當使用者明確要求時,主題可以由 music/ 目錄中由 music/track.json 描述的音樂檔案取代:可以是開放授權的錄音(公有領域、CC0、CC BY 3.0/4.0;絕不使用 NC、ND 或 SA),或是透過 SandBase 音樂模型生成的器樂曲(例如 minimax/music/2.6,需設定 is_instrumental: true,且僅能透過 sandbase CLI 或 API 操作)。圖片、說明文字、SFX 及其他所有規則維持不變;片尾卡則需標註該曲目來源,且不再說明音樂由程式碼生成。詳見 references/music-track.md。同樣地,可以加入畫外音:每個說明對應一個來自 SandBase 語音模型的片段,準確朗讀該說明文字(voice/voice.json,詳見 references/voice.md)。

風格套件

brief.style(或 new-project.mjs --style)選擇外觀;引擎、事實和檢查則保持一致。

風格外觀套件用途
ink(預設)中式水墨卷軸,LXGW WenKai 字體,「Ink Theme」assets/style-pack.json人物、地標、動物
roman羊皮紙地圖集,Cinzel 字體,柔和的 D-dorian 主題assets/styles/roman/城市、古典主題
model在黑暗工作室中的白色城市模型,歷史以光影投射,全球飛入鏡頭,照片卡片,「Atlas Theme」assets/styles/model/城市生活故事:閱讀 style-model.md

該方法遵循公開的「氛圍知識展示」配方:設定規格 → 在節拍上剪輯 → 為每個關鍵動作加上音效 → 逐段渲染並在繼續前修正每段。

規格(預設值)

長度seconds 120、150(預設)或 180;每 25–35 秒重新設置鉤子;4–6 / 5–7 / 6–8 個知識點
格式16:9 1920×1080 每秒 30 幀(預設),可選 9:16 1080×1920
語言brief.lang = 任何 BCP-47 標籤(預設 en;zh-CN 為一級語言)。一個腳本服務多種語言
旁白無語音:每個鏡頭一條簡短說明文字,說明圖片內容,綁定至已驗證的主張,關鍵字標記
音樂風格的系列主題(ink:「Ink Theme」,D 宮五聲音階,古琴/簫類音色),始終為 88 BPM,包含段落:前奏 · 主歌 · 鋪墊 · 高潮 · 過渡 · 鋪墊2 · 高潮2 · 尾聲;可選 music/track.json(music-track.md)
音量−14 LUFS 綜合響度,≤ −1.5 dBTP(兩遍 loudnorm)
標籤0–3 秒「AI-generated」徽章,片尾卡包含 AIGC 行,MP4 內含 AIGC 元數據

需要 Node 22+、FFmpeg/ffprobe 和 Chrome(HyperFrames 0.8.30 透過 npx 運行;渲染始終使用 CPU 路徑,以確保 canvas 輸出在任何地方都相同)。執行 node scripts/chronicle.mjs doctor。

城市影片(主題 city,結構 life)

針對「每個城市都有其生命故事」的使用案例:維基數據上的一個城市(座標 + 人口)鎖定為 city 並使用生命結構:誕生(河流、建城、名稱)→ 成長(建成區在地圖上擴展)→ 首次高度 → 傷痕(掠奪、火災、瘟疫、戰爭)→ 重生 → 今日(同一張地圖,過去與現在)→ 迴響(可選作者自己的句子「我與這座城市」)。閱讀 narrative-city.md。

地圖是真實地理,而非模型圖片:

  1. 在專案中撰寫 geo/places.json(中心點和以 Wikidata QID 標識的地點,歷史區域以近似半徑表示),然後執行 node <skill>/scripts/geo.mjs --project <p>。它會從 Wikidata 讀取座標,並從 OpenStreetMap(無金鑰的公開讀取)讀取河流、水域、海岸線、鐵路和今日主要道路,輸出到 geo/basemap.json。
  2. Ink 風格:將 assets/style/exemplars/city-map.js 複製到 scenes/ 目錄,並透過其參數(視角、區域、地點、道路、年份標記、傷痕)驅動每個地圖鏡頭。場景讀取數據為 s.geo,並使用 s.kit.cityMap() 繪製;每一幀畫面都帶有「© OpenStreetMap contributors (ODbL)」。
  3. 歷史範圍為近似值:cityMap 始終將其標記為「AI 示意 / AI illustration」。年份標記和地圖標籤只能顯示存在於主張或一級來源中的日期和名稱。
  4. Model 風格:在 geo/places.json 中加入一個 chronology 區塊(相機、時代、範圍、城牆、事件、地標),使用 node <skill>/scripts/photos.mjs --project <p> 獲取地標照片,並使用單一的 city-3d 場景(WebGL 中的真實建築和高度,單一連續相機路徑)。詳見 style-model.md 和逐步指南 city-film-recipe.md(說明羅馬、紐約和巴塞隆納範例的製作方法)。

此機器無法訪問的頁面(維基百科常被封鎖):使用你自己的工具獲取並將文字儲存為專案中的 sources/<n>-<name>.txt 檔案(第一行標註 source: <url>)。之後每次執行 all 時都會讀取該資料夾;檔案名稱保持來源 ID 穩定。

快速開始

node <skill>/scripts/new-project.mjs --out /abs/films/su-shi --topic "蘇軾" --film-lang en
node <skill>/scripts/chronicle.mjs all --project /abs/films/su-shi

all 會依序執行 研究 → 事實 → 腳本 → 時間線 → 音樂 → 場景 → 渲染 → 檢查 → 報告,並且在你需要撰寫任何內容時停止(狀態顯示為 status: awaiting_…)。閱讀專案中的 AGENT_TASK.md,撰寫它要求的檔案,然後再次執行 all。專案必須位於 Skill 資料夾之外。

劇組角色

角色你的工作命令讀取寫入
導演負責簡報,運行片段循環,決定何時完成一個片段all, render --segmentbrief.json,聯繫表(contact sheets)work/review.json
研究員無限制地搜尋(你自己的搜尋工具);傳遞有用的頁面research --add-source <url> / --source-file <file>Wikidata(QID 鎖定)、維基百科、一級網站work/research/
事實查核員提取帶有逐字摘錄的原子化主張;為每個說明回答蘊含關係facts, script來源片段,entail.request.jsonwork/facts/claims.agent.json,work/script/entail.agent.json
編劇根據主題的段落撰寫鏡頭列表scriptscript.request.json(計劃、主張、規則)script.json
美術使用水墨工具包編寫場景程式碼;自行審查幀畫面scenes時間線,references/style-pack.md,範例scenes/<name>.js
作曲家無需創作:主題已固定;你為每個動作選擇 SFX 層級musicbrief.secondswork/music/theme.wav,beatmap.json
剪輯師渲染片段和最終影片render場景、主題、SFX 提示out/segments/,out/film.mp4
QA執行檢查,閱讀銜接表,修正或重新運行check, report影片、時間線、節拍映射、審查work/check.json,out/report.*
地圖動畫師撰寫 geo/places.json,執行地理命令,驅動 city-map 鏡頭node scripts/geo.mjsWikidata P625,OpenStreetMapgeo/basemap.json

鏡頭列表欄位(script.json,schema chronicle-script/2)

bars(1–4 個完整小節,屬於一個段落,因此每次剪輯都在強拍上)· size(wide / medium / close / detail)· camera(hold, push-in, pull-out, pan-left, pan-right, rise, parallax)· transition(cut, ink-bleed, scroll-pan, seal-stamp)· scene + params· description· motion· sfx({ beat, kind, tier, dur_beats })· kind + claims (+ hedge)· caption.<lang>.text + em(關鍵字)· kp· rehook。完整形狀和規則:work/script/script.request.json 和 pipeline.md。

事實優先

  1. research 將主題鎖定到一個 Wikidata QID,直接從維基百科和一級網站(CBDB、Britannica、UNESCO、GBIF、博物館)進行無金鑰的公開讀取。你可以在任何地方搜尋,但一個事實只有在經過 facts 交叉比對後才能進入影片:至少 2 個獨立出版者同意,至少一個為一級來源 → verified;一個來源 → single-source(僅限有修飾語的說明,≤ 2 個,絕不能在開頭或高潮中使用);衝突 → disputed(「一種說法」)。八卦網站是線索,而非證據。
  2. 如果此機器無法訪問某個網站,請使用你自己的抓取工具讀取,並將文字原樣儲存到一個檔案中,該檔案的第一行是 source: <url>;然後透過 --source-file 傳遞它。
  3. 每一條說明、卡片、標題和片尾卡行都綁定主張 ID;一行中的數字、日期和名稱必須在其主張中出現;引語需要一個已驗證的引語主張。然後,你必須僅從主張文字中誠實地回答蘊含關係。詳見 factcheck.md。

主題上的故事

計劃(work/script/plan.json)給出了主題的段落及其小節數(150 秒:前奏 4 · 主歌 12 · 鋪墊 4 · 高潮 8 · 過渡 8 · 鋪墊2 4 · 高潮2 8 · 尾聲 7;120/180 秒則重複或在小節邊界處修剪段落)、重新設置鉤子的小節以及知識點範圍。將故事安排到各個段落:在前奏中設置鉤子,在主歌中介紹起源,在鋪墊中轉折,在第一個高潮達到第一個高點,在過渡中展現代價,在鋪墊2中製造懸念,在高潮2中展現決定性時刻,在尾聲中留下迴響。不同的主題有不同的節奏:narrative-person.md、narrative-landmark.md、narrative-animal.md。

說明文字:CJK 每行 ≤ 16 個字元,其他文字每行 ≤ 9 個詞 / 42 個字元,≤ 2 行,不得在數字或日期中間斷開,從右到左(RTL)佈局。說明文字必須在其鏡頭中可讀(CJK 7 字元/秒,其他文字 3.3 詞/秒)。字符檢查失敗時會顯示 glyph_missing,而非渲染出豆腐塊(tofu)。

場景(#1 品質風險)

按場景名稱撰寫 scenes/<name>.js:scene('<name>', function (g, s) { … }),在時間 s.t 繪製完整幀,使用 Canvas 2D 和 s.kit(紙張、筆觸、水墨暈染、墨跡滲出、山脈、水、船、亭、卷軸、竹子、月亮、硯台、毛筆、印章、梅花、雁、長袍剪影、文字揭示、地圖路線、時間線、計數器、2.5D layer() 視差、構圖 frame())。從 assets/style/exemplars/ 開始。規則(由靜態掃描和執行時強制執行):對 s.t 具有確定性(s.kit.rng(seed),絕不使用 Math.random/Date/計時器),無網路請求,無 DOM 或儲存。將每個關鍵動作與其提示對齊時間(s.cue('seal', 0)),以便 SFX 準確落在動作發生的那一幀。絕不繪製寫實的臉孔。執行/禁止列表:style-pack.md。

導演的循環(逐段進行)

node <skill>/scripts/chronicle.mjs scenes --project <p>             # 掃描 + 專案建立
node <skill>/scripts/chronicle.mjs render --project <p> --segment s1 # 先渲染開頭約 11 秒
# 檢視 out/segments/s1/sheet.jpg 和 keyframes/*.jpg,對照執行/禁止列表,修正,重複
node <skill>/scripts/chronicle.mjs render --project <p> --segment s2 # 然後 s3, s4, s5
node <skill>/scripts/chronicle.mjs all --project <p>                 # 最終確定性完整渲染 + 檢查 + 報告

片段:s1 前奏 · s2 主歌 · s3 鋪墊 + 高潮 · s4 過渡 + 鋪墊2 · s5 高潮2 + 尾聲(或 --segment <start>-<end>)。每個片段最多 3 輪審查;將每輪記錄在 work/review.json 中:

{ "schema": "chronicle-review/1", "segments": [{ "id": "s1", "rounds": [{ "sheet": "out/segments/s1/sheet.jpg",
  "findings": ["標題與月亮重疊"], "fixes": ["將月亮向右移動"], "open_blocking": [] }] }] }

如果某個片段沒有審查輪次或仍存在阻塞性發現,check 會報告 visual_review 失敗。對於無人值守運行,all 會直接渲染整部影片;審查要求仍會顯示在報告中。

輸出

out/film.mp4、out/captions.vtt、out/sheet.jpg、out/joins.jpg、out/report.json、out/report.en.html、out/report.zh-CN.html(無論影片語言為何,均為雙語)。check 會測量 LUFS 和真實峰值,確保剪輯和段落落在強拍上,並確保每個 SFX 的起始點與其動作相差不超過一幀;它無法判斷混音聽起來是否良好——這表示仍需由人來聆聽。

限制

  • 沒有在世人物的肖像;地圖不得顯示國家或省級邊界;GB 45438 標準的 AIGC 欄位在根據標準文字檢查之前,保持 verified: false(compliance.md)。
  • 三個風格套件,每個一個主題(或一個可選的音樂曲目)。年份卡片:省略 count(從 0 開始遞增的年份看起來像錯誤的日期)。
  • 城市地圖不顯示國家或省級邊界;OpenStreetMap 圖層被裁剪到城市範圍。
  • 事實詞彙表(數字、日期、修飾語)存在於英文和中文;其他語言的說明文字使用英文規則。
  • 參考資料:pipeline.md、music.md、sources-allowlist.md、third-party-notices.md。

相關技能