GitHub issuesからScrapboxに移行するスクリプト
from タスクはScrapboxで管理できる
GitHub issuesからScrapboxに移行するスクリプトを雑に作って、700 issuesを一括で移行した。
使い方
必要なものをインストールしておく。
GitHub CLI
移行元GitHub issuesが書かれているGitリポジトリ内で、以下のコマンドを実行する。
$ node github-issues-to-scrapbox.mjs > scrapbox-page-data.json
300 issues区切りで、scrapbox-page-data-0.json, scrapbox-page-data-1.json...ファイルが生成される。
scrapbox-page-data.jsonをScrapboxにインポートしていく。
/help-jp/Import Pages / Export Pages
github-issues-to-scrapbox.mjsimport { writeFile } from "fs/promises";import { $ } from "zx";
$.verbose = false;
const issues = JSON.parse( await $`gh issue list --state all --limit 1000000 --json title,number,createdAt,updatedAt,body,comments,state`) // 古いissue順にScrapboxページ化させて、 // Scrapboxのページ一覧では新しいissueほど上に表示させる。 .reverse();
const pages = issues.map((issue) => { // issueをScrapboxのページ化するテンプレート const lines = `${issue.title}${[ `[${issue.state}]`, issue.body.trim() || "(No description provided. )", ...issue.comments.map((comment) => comment.body.trim()),].join("\n\n\n")}` .replaceAll("\r", "") .split("\n");
return { title: lines[0]?.slice(0, 100) || `#${issue.number}`, created: Math.floor(new Date(issue.createdAt).getTime() / 1000), updated: Math.floor(new Date(issue.updatedAt).getTime() / 1000), lines, };});
const chunkSize = 300;const chunks = Array.from( { length: Math.ceil(pages.length / chunkSize) }, (_, index) => pages.slice(index * chunkSize, (index + 1) * chunkSize));
for (const [index, chunk] of chunks.entries()) { await writeFile( `scrapbox-page-data-${index}.json`, JSON.stringify({ pages: chunk }) );}