flowchart LR
N["Apple メモ<br>(専用フォルダに絞る)"] --> E["JXA で抽出<br>ターミナル実行"]
E --> C["本文を Markdown に整形"]
C --> F["OKF frontmatter を付与"]
F --> S["okf/concepts/ に配置"]
S --> V["validate-okf で検証"]
V --> P["公開 or 学習パイプラインへ"]
4. Apple Notes をもっと育てる
Apple Notes をもっと育てる
macOS ユーザーなら誰でも、Apple「メモ」という苗箱を持っています。日々のアイデア、読書メモ、議事録、スクラップ — そこには「種」がたくさん眠っています。
このページは、その種を okf-seedling の苗箱へ移植して OKF バンドルとして育てる具体的な手順です。macOS のターミナルを使えること以外、前提知識は必要ありません。
まず最初に(重要)
- 実験的な手法です。コア機能ではありません。「必ず自分専用の閉じた知識だけで行う」こと
- このツールのテンプレートには importer は同梱していません。このページの手順は macOS 標準の仕組み(AppleScript/JXA)で行います
- 手順の最後に必ず確認するガードがあります。先にそちらだけは読んでください(下記「やってはいけないこと」)
全体像
事前準備(約5分)
1. 専用フォルダを作る
Apple「メモ」アプリを開き、「OKF 苗箱」という名前の新規フォルダを作ります(フォルダ名は何でもよいですが、ここではこれで通します)。
このフォルダだけを対象にするのは、秘密情報の流出を防ぐ最重要ガードです。Apple メモ全体には API トークンやパスワードが混ざり得ます(実際に確認済み)。
2. 必要なツールを確認
macOS には標準で入っています。ターミナルで確認:
osascript --version # AppleScript の実行環境。入っていれば version が表示される
node --version # Node.js。okf-seedling の検証に必要(なければ brew install node)
quarto --version # Quarto。okf-seedling の実行基盤(なければ brew install quarto)実際の手順
Step 1: JXA スクリプトでメモを抽出する
JXA(JavaScript for Automation) とは、macOS が備える「JavaScript で Mac のアプリを操作する仕組み」です。Apple メモは JXA から 権限の追加設定なしで読むことができます(初回だけアクセス許可のダイアログが出ます)。
まず、抽出用スクリプトを保存します。エディタで extract-notes.js というファイルを作り、次の内容を貼り付けてください:
// extract-notes.js — 専用フォルダ内のメモを JSON に出力する
function run(argv) {
const target = argv[0] || "OKF 苗箱";
const Notes = Application("Notes");
// 指定フォルダを探す(見つからなければ終了)
const folder = Notes.folders.byName(target);
if (!folder) {
return JSON.stringify({ error: "フォルダが見つかりません: " + target });
}
// そのフォルダ内のノートだけを列挙(name / HTML本文 / 更新日)
const items = folder.notes().map((n) => ({
name: n.name(),
html: n.body(), // body は HTML タグ混じり
modified: n.modificationDate(), // 更新日
}));
return JSON.stringify(items, null, 2);
}ターミナルで実行:
osascript -l JavaScript extract-notes.js "OKF 苗箱" > notes.json注意(初回): 実行すると「ターミナルがメモにアクセスしようとしています」というダイアログが出ます。「許可」を押してください。拒否すると空の結果になります。
出力 notes.json には、OKF 苗箱 フォルダの中身が JSON で入ります。まだシークレットは渡していません。この時点で中身を確認:
cat notes.jsonStep 2: 本文(HTML)を Markdown に整形する
body は <div>…</div> のような HTML で返ってきます。そのままでは .qmd に入れられないので、プレーンテキスト(Markdown)に変換します。
簡易的な変換例。html-to-md.mjs を作り、貼り付け:
// html-to-md.mjs — HTML のメモ本文をシンプルな Markdown へ変換(ヒューリスティック)
import { readFileSync, writeFileSync } from "node:fs";
const notes = JSON.parse(readFileSync("notes.json", "utf8"));
const out = [];
for (const note of notes) {
// 1. <br> を改行へ
let md = note.html.replace(/<br\s*\/?>/gi, "\n");
// 2. <div> や <p> の終端を改行へ
md = md.replace(/<\/(div|p|li|h[1-6])>/gi, "\n");
// 3. <li> を箇条書きに
md = md.replace(/<li[^>]*>/gi, "- ");
// 4. 残った HTML タグを除去
md = md.replace(/<[^>]+>/g, "");
// 5. HTML 実体参照を簡単に置換
md = md.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
// 6. 空行の連続を整理
md = md.replace(/\n{3,}/g, "\n\n").trim();
out.push({ name: note.name, modified: note.modified, md });
}
writeFileSync("notes-md.json", JSON.stringify(out, null, 2));
console.log("整形完了:", out.length, "件");実行:
node html-to-md.mjsこれは簡易変換です。箇条書き・見出し・コードの混ざった複雑なメモは手動で整える前提です。macOS バージョンにより HTML の形は少し変わります。
Step 3: OKF frontmatter を付与して概念ファイルにする
整形したメモを、okf-seedling の concepts/ に入る .qmd にします。notes-md.json を開き、1 件ずつ次の形に書き起こします:
---
type: Playbook
title: "サンプルメモのタイトル"
description: このメモが何を扱っているかの一言
tags: [notes]
status: draft
generated: { by: human:me, at: 2026-08-13T00:00:00Z }
verified: { by: human:me, at: 2026-08-13T00:00:00Z }
stale_after: 2026-12-31
---
# Trigger
このメモを開くきっかけ(例: 何かを調べていて思いついた)
# Steps
- (整形したメモ本文をここに)
- 項目に分けられるなら分けるフィールドの意味(2. Concept Types の詳細へ):
| フィールド | 意味 | 例 |
|---|---|---|
type |
概念の種別(必須) | Playbook |
title / description |
表示名 / 一言要約 | メモタイトル / 概要 |
tags |
検索用のタグ | [notes] |
status |
状態 | draft から始める |
generated / verified |
誰が・いつ作った/確認したか | { by: human:me, at: … } |
stale_after |
見直し期限(ここまでに更新しよう) | 3〜6ヶ月先 |
このファイルを concepts/ に保存します(例: concepts/my-note-001.qmd)。
なぜ
type: Playbook? OKF の 6 型は API や指標など用途が決まっています。汎用のメモに無理に当てはめると不自然です。手順や考え方のメモはPlaybook、思いつきの走り書きはtype: Playbookのままstatus: draftにする、という折り合いで始めると楽です。
Step 4: バンドルを生成して検証する
okf-seedling の雛形があるディレクトリで:
quarto render
node tools/validate-okf.mjsquarto render… 人間用 HTML と機械用 OKF バンドル(okf/)を同時に生成node tools/validate-okf.mjs… 準拠チェック + 品質警告(鮮度・欠落)
validation PASSED と出れば、あなたのメモは OKF バンドルの正式な概念として育ったことになります。
やってはいけないこと(必須ガード)
Apple メモには秘密情報(API トークン、パスワード、アクセスキー等)が普通に混ざっています。実際に確認済みの事実です。バンドルをコミットすると、それが git の履歴に永遠に残ります。
| # | ガード | なぜ |
|---|---|---|
| 1 | 専用フォルダのみ抽出(全ノートを絶対に抽出しない) | 全メモの中にトークンが混在するため。OKF 苗箱 フォルダだけに絞る |
| 2 | 抽出結果を必ず目視確認(cat notes.json) | シークレットが混ざっていたら、そこで止める |
| 3 | コミット前に機密スキャン | rg などで token/key/password/api を検索。引っかかったらスキップ |
| 4 | 公開しない(ローカル専用で) | この手法は「自分専用の閉じた知識」向け。公開するなら一つずつ自分で再確認 |
| 5 | 差分ノイズに注意 | メモは頻繁に変わります。バンドルの hash が毎回変わり、Playwright 学習パイプラインの差分が更新だらけになりがち。対象は絞って |
コミット前の機密チェックコマンド例:
# concepts/ に混ざったシークレットらしき文字列を検索
rg -ni "api[_-]?key|token|password|secret|BEGIN .*PRIVATE" concepts/ okf/ || echo "検出なし"この手法の限界
- 秘密情報リスクが最大の課題です。ガードを厳格にしても、人間のミスはゼロにできません。「育てる」のは自分専用の閉じた知識にとどめてください
- 本文の HTML→Markdown 整形は簡易的なヒューリスティックです。複雑なレイアウトのメモは手動修正が必要
- macOS バージョンが上がると JXA の返す HTML 構造が変わることがあります
- OKF 6 型は汎用メモ向けに設計されていないため、
typeの明示指定で折り合いをつけます
まとめ
Apple メモ = あなたの苗箱。okf-seedling = それを育てるもう一つの苗箱。
- 専用フォルダに絞る
- 抽出 → 整形 → frontmatter 付与 → 検証
- コミット前は必ず機密チェック
この 3 点を守れば、散らかったメモが検証済みの知識バンドルとして育ちます。
続きは 1. Create a Bundle から始めてください。概念の書き方の詳細は 2. Concept Types を参照してください。