4. Apple Notes をもっと育てる

macOS ユーザー向け。Apple「メモ」を OKF バンドルへ育てる具体的な手順書。ターミナルで実際に動くコマンドと必須ガードつき(実験的)

Apple Notes をもっと育てる

macOS ユーザーなら誰でも、Apple「メモ」という苗箱を持っています。日々のアイデア、読書メモ、議事録、スクラップ — そこには「種」がたくさん眠っています。

このページは、その種を okf-seedling の苗箱へ移植して OKF バンドルとして育てる具体的な手順です。macOS のターミナルを使えること以外、前提知識は必要ありません。

まず最初に(重要)

  • 実験的な手法です。コア機能ではありません。「必ず自分専用の閉じた知識だけで行う」こと
  • このツールのテンプレートには importer は同梱していません。このページの手順は macOS 標準の仕組み(AppleScript/JXA)で行います
  • 手順の最後に必ず確認するガードがあります。先にそちらだけは読んでください(下記「やってはいけないこと」)

全体像

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 学習パイプラインへ"]

事前準備(約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.json

Step 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(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/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.mjs
  • quarto 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 を参照してください。