開発から生まれたOSSパッケージ

このサイトも、世界時計アプリも、IT移行の道具も、AIと協働する開発で作っています。 その過程で「無いと困る」道具を小さなパッケージに切り出し、 GitHub (aiseed-dev) で公開しています。 どれも机上の作品ではなく、実際の製品の中で毎日動いているものです。

方針は一貫しています——大きなフレームワークに頼らず、 一つの問題を確実に解く小さな道具を作る。 AIと協働する開発では、依存が少なくシンプルな道具ほど正確に扱えるからです (この考え方は AI x Flutter Cookbook に詳しく書いています)。


cf-publish — PythonだけでCloudflare Pagesへ配信

静的サイトを Cloudflare Pages へ Direct Upload する公式手段は wrangler で、 Node.js のツールチェーン一式が必要になります。ビルドパイプラインが Python (あるいは「ただのフォルダ」)のとき、一度のHTTP会話のためには大掛かりすぎる—— それが出発点です。

cf-publish は同じアップロードプロトコルを約300行のPythonで実装しています (依存は httpxblake3 の2つだけ)。

pip install cf-publish
export CLOUDFLARE_API_TOKEN=...    # 「Cloudflare Pages: Edit」権限のトークン
export CLOUDFLARE_ACCOUNT_ID=...
cf-publish ./public --project my-site

この timej.net 自身も cf-publish で配信しています。

GitHub: aiseed-dev/cf-publish(PyPI公開は準備中)


mdit-py-cjk-friendly — Markdownを日本語フレンドリーに

CommonMark は空白で単語を区切る言語を前提に設計されているため、 日本語のMarkdownでは有名な問題が2つ起きます。

  1. 文中改行が半角スペースになる — 長い文を途中で改行すると、 描画後の文中に不要な空白が入る
  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公開は準備中)


washi-md — Markdownから美しい日本語文書(HTML / PDF)

Markdown から、日本語らしく組版された文書をコマンド一つで作ります。 横書きのビジネス文書から、縦書きの小説、原稿用紙まで。

washi report.md          # → report.html(組版済み・自己完結・1ファイル)
washi report.md --pdf    # → report.pdf も出力(Chromeヘッドレス印刷)

GitHub: aiseed-dev/washi-md(PyPI公開は準備中)


flutter_svg_cjk_friendly — FlutterのSVGで日本語が豆腐になる問題を直す

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公開は準備中)


aiseed-migration-kit — 組織のITを開いた土台へ移すツール一式

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 へ配信

移行ツールとしての詳しい説明(三つの閉じた世界・AIによる接続・パイプライン・ 問い合わせ設計)は aiseed-migration-kit の詳しい説明 にあります。

GitHub: aiseed-dev/aiseed-migration-kit


パッケージ同士の関係

5つはばらばらの作品ではなく、一つの開発スタイルの部品です。

そしてどれも、このサイト・統計チャート・移行案件という実際の現場で毎日動いています。 「AIに道具を作らせて、作った道具で仕事をする」—— 自宅AIサーバーCookbook で書いている開発スタイルの、 これが実物です。