このサイトも、世界時計アプリも、IT移行の道具も、AIと協働する開発で作っています。 その過程で「無いと困る」道具を小さなパッケージに切り出し、 GitHub (aiseed-dev) で公開しています。 どれも机上の作品ではなく、実際の製品の中で毎日動いているものです。
方針は一貫しています——大きなフレームワークに頼らず、 一つの問題を確実に解く小さな道具を作る。 AIと協働する開発では、依存が少なくシンプルな道具ほど正確に扱えるからです (この考え方は AI x Flutter Cookbook に詳しく書いています)。
静的サイトを Cloudflare Pages へ Direct Upload する公式手段は wrangler で、 Node.js のツールチェーン一式が必要になります。ビルドパイプラインが Python (あるいは「ただのフォルダ」)のとき、一度のHTTP会話のためには大掛かりすぎる—— それが出発点です。
cf-publish は同じアップロードプロトコルを約300行のPythonで実装しています
(依存は httpx と blake3 の2つだけ)。
pip install cf-publish
export CLOUDFLARE_API_TOKEN=... # 「Cloudflare Pages: Edit」権限のトークン
export CLOUDFLARE_ACCOUNT_ID=...
cf-publish ./public --project my-site
_headers / _redirects を wrangler と同じ方法でデプロイに添付
(静的ファイルとして上げると効かない、という罠を踏まない)この timej.net 自身も cf-publish で配信しています。
→ GitHub: aiseed-dev/cf-publish(PyPI公開は準備中)
CommonMark は空白で単語を区切る言語を前提に設計されているため、 日本語のMarkdownでは有名な問題が2つ起きます。
**「重要」**です と書くと
強調にならず、リテラルの ** がそのまま残るmdit-py-cjk-friendly は markdown-it-py のプラグインとして、この2つをパーサレベルで解決します。
from markdown_it import MarkdownIt
from mdit_py_cjk_friendly import cjk_friendly
md = MarkdownIt("commonmark").use(cjk_friendly)
md.render("これは**「重要」**です。")
# <p>これは<strong>「重要」</strong>です。</p>
強調の挙動は CommonMark CJK-friendly 仕様ドラフト
の考え方に従った markdown-it-py 向けの独立実装で、
.use() したパーサ以外の挙動は一切変えません。
→ GitHub: aiseed-dev/mdit-py-cjk-friendly(PyPI公開は準備中)
Markdown から、日本語らしく組版された文書をコマンド一つで作ります。 横書きのビジネス文書から、縦書きの小説、原稿用紙まで。
washi report.md # → report.html(組版済み・自己完結・1ファイル)
washi report.md --pdf # → report.pdf も出力(Chromeヘッドレス印刷)
--embed-fonts で BIZ UD を埋め込めば相手の環境でも同じ見た目に--vertical)と原稿用紙(--genko)→ GitHub: aiseed-dev/washi-md(PyPI公開は準備中)
flutter_svg は、CSSの font-family リスト
(font-family: 'BIZ UDGothic', 'Noto Sans CJK JP', sans-serif —
matplotlib はじめ多くのツールが出力する標準形)を、引用符もカンマも含めた
単一のフォント名として扱います。実在のフォントに一致しないため、
日本語テキストは豆腐(□)になります。
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_svg_cjk_friendly/flutter_svg_cjk_friendly.dart';
SvgPicture.string(cjkFriendlySvg(svg));
cjkFriendlySvg が全ての font-family をパースして正規化し、
アプリに同梱したフォントを優先させることもできます。
flutter_svg が無視してしまう縦書きテキスト(writing-mode)の展開にも対応。
実在の統計チャート(人口ピラミッド)で検証し、回帰テストで結果を固定しています。
→ GitHub: aiseed-dev/flutter_svg_cjk_friendly(pub.dev公開は準備中)
Microsoft 365・業務システム・CMS/スマートフォンという「三つの閉じた世界」から、
git・SQL・メール・静的公開という開いた土台へ移行するためのキットです。
amig コマンドが移行のパイプラインを段階ごとに支援します。
amig new sites/mysite # サイトの雛形を作る
amig ingest sites/mysite ~/data # 元データ(HTML等)を取り込む
amig classify sites/mysite # 記事/一覧に分類(結果は人が直せる)
amig convert sites/mysite # Markdownへ機械変換(下書き)
amig build sites/mysite # dist/ を生成
amig publish sites/mysite # Cloudflare Pages へ配信
convert は既存の .md を上書きしない(人が仕上げた原稿を守る)移行ツールとしての詳しい説明(三つの閉じた世界・AIによる接続・パイプライン・ 問い合わせ設計)は aiseed-migration-kit の詳しい説明 にあります。
→ GitHub: aiseed-dev/aiseed-migration-kit
5つはばらばらの作品ではなく、一つの開発スタイルの部品です。
そしてどれも、このサイト・統計チャート・移行案件という実際の現場で毎日動いています。 「AIに道具を作らせて、作った道具で仕事をする」—— 自宅AIサーバーや Cookbook で書いている開発スタイルの、 これが実物です。