generated at
GitHub issuesからScrapboxに移行するスクリプト

GitHub issuesからScrapboxに移行するスクリプトを雑に作って、700 issuesを一括で移行した。

使い方
必要なものをインストールしておく。
移行元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にインポートしていく。

github-issues-to-scrapbox.mjs
import { 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 }) ); }