プロジェクトメモリ

プロジェクトメモリは、Claude Code・Codex・Gemini CLI などのエージェントが作業中に覚えた事実・決定・好みを、Nolto に保存する機能です。次のセッションや、同じプロジェクトで働くチームのエージェントに引き継げます。

CLAUDE.md / AGENTS.md に書くほどではない情報を、エージェントがエントリ単位で書き足していきます。リポジトリや Git の履歴、CLAUDE.md / AGENTS.md にすでにある情報は重ねて残しません。メモリは背景情報であり、ユーザーの指示より優先されるものではありません。

CLI 0.18.0 以降で利用できます。

しくみ

メモリの正本は Nolto のサーバーにあります。ローカルの ~/.config/nolto/projects/<id>/memory/ は読み取り専用のキャッシュで、索引の MEMORY.md とエントリごとのファイルが入ります。キャッシュを直接編集せず、書き込みには nolto memory put <file> を使います。

セッションの開始時に hook がメモリを取得し、名前と説明の索引をエージェントに渡します。エージェントは索引から必要なものを選び、nolto memory show <name> で本文を読みます。手動で最新のメモリを取得するには nolto memory pull、取得済みの索引を見るには nolto memory context を実行します。

スコープで共有する範囲を決める

スコープ残すもの・読む人書ける人
projectチームの決定や制約。プロジェクトの全員が読めます。課題を書けるメンバー以上
user本人の好みや役割。本人だけが読めます。課題を書けるメンバー以上の本人
branchリポジトリ・ブランチごとの作業中の事実。プロジェクトの全員が読めますが、索引に載るのはそのブランチで作業しているときだけです。課題を書けるメンバー以上

機能を制限したメンバー(外部メンバー)には、どのスコープも見えません。branch は作業ブランチで使い、merge 後にチームへ残すものを project に昇格するか、不要なものを破棄します。

導入する

  1. CLI ガイドに沿って CLI 0.19.0 以降をインストールします。
  2. リポジトリ内で nolto init を実行し、認証とプロジェクトを設定します。メモリの管理に Nolto を使うと答えると、hook の設定・既存メモリの取り込み・Claude Code の自動メモリの停止まで済みます。メモリの読み書きの手順を持つ project-memory スキルも入ります。
  3. init を使わない場合や、後から設定する場合は、同じリポジトリで nolto memory hook install を実行します。SessionStart の hook が設定され、セッション開始時に索引を読み込むようになります。
  4. Codex では、信頼済みのリポジトリで対話セッションを開き、/hooks からリポジトリの hook を承認します。初回だけ必要です。
  5. 次のセッションを開始すると、索引がエージェントに渡されます。
エージェント設定ファイル注意
Claude Code.claude/settings.jsonSessionStart で索引を読み込みます。
Codex.codex/hooks.json/hooks での承認が必要です。Codex 0.157.0 では hooks は既定で有効です。
Gemini CLI.gemini/settings.jsonSessionStart で索引を読み込みます。

nolto init --memory はメモリを管理するかの最初の質問を省略し、nolto init --no-memory はメモリの設定を省略します。nolto memory hook install で --agent を省略すると、リポジトリ内の .claude / .codex / .gemini から対象を判定します。どれもなければ Claude Code を選びます。対象を明示する場合は --agent claude、--agent codex、--agent gemini を付けます。--agent all は省略時と同じ動きです。

nolto memory hook install --agent codex
nolto memory hook install --write-agents-md

--write-agents-md は、既存の AGENTS.md に nolto memory instructions の手順を追加します。AGENTS.md がなければ追加を省略します。Codex で hooks を無効にしている場合は、config.toml の [features] に hooks = true を設定してください。

既存のメモリを移行する

init を使わない場合や、後から取り込む場合は、既存のメモリが入ったディレクトリを import に渡します。チームで共有する内容には --scope project、自分だけの内容には --scope user を指定します。

nolto memory import ./memory --scope project
nolto memory import ./personal-memory --scope user

ディレクトリ直下の Markdown ファイルを取り込みます。索引の MEMORY.md は対象外です。同名のエントリは上書きせずにスキップします。統合したい場合は nolto memory show <name> --fresh で最新の内容を確認し、下書きにまとめて nolto memory put <file> で保存してください。更新では、取得した revision を残します。

import は既定では AI 整理をしません。Pro+ で AI 整理を使う場合だけ、--ai を付けます。

nolto memory import ./memory --scope project --ai

画面で確かめる・直す

プロジェクトの「AI メモリ」タブで、エントリの確認・編集・削除、版の戻し、ブランチのメモリの昇格・破棄ができます。画面の使い方は AI メモリをご覧ください。画面からの保存では AI 整理をしません。

CLI では、nolto memory log <name> で履歴を確認し、nolto memory revert <name> <revision> で以前の版に戻します。ブランチのメモリは、まず候補を確認してから、名前か --all を指定して昇格します。

nolto memory promote --branch task/example
nolto memory promote --branch task/example ci-runs-on

不要なエントリを破棄する場合は nolto memory promote --branch task/example --discard ci-runs-on を実行します。

重複と AI 整理

AI 整理を使わないとき(Pro+ 以外、設定が OFF、--no-ai を指定、AI 整理ができなかったとき)は、新規作成時に説明が似たエントリを見つけると、書き込みを止めて候補を示します。同じ話なら既存のエントリにまとめ、別の話として残す場合だけ nolto memory put <file> --new で保存します。

Pro+ で AI 整理が有効な場合は、似たエントリがあるとき、AI が統合・置き換え・別に残すのどれにするかを判断します。プロジェクトの「設定」→「一般」にある「使う機能」カードの「メモリの AI 整理」で ON / OFF を切り替えられます。既定は ON です。1 回だけ整理を避けたい場合は nolto memory put <file> --no-ai を使います。

整理した内容も版として残ります。画面の「AI 整理の履歴」で理由と変更を確認し、エントリごとに戻せます(AI メモリ)。CLI では AI が整理: の出力と、表示された 戻す: のコマンドを確認してください。

ℹ️

AI 整理の結果が意図と違う場合は、変更を確認してください。まとめて戻す操作はありません。影響したエントリを 1 件ずつ戻します。

寿命と整理候補

CLI 0.22.0 以降では、下書きの frontmatter に寿命を書けます。進捗・経緯・再開ポイントには寿命を付け、決定・制約・規約は永続のまま残します。

書き方有効な期間整理候補になるとき
指定なし永続寿命では候補になりません。
expires: 2026-10-18指定した日まで日本時間でその日を過ぎたとき。
ttl: 7d保存する日から 7 日後までput 時にローカルの日付 + 日数の expires に直し、日本時間でその日を過ぎたとき。1〜365 日を指定できます。
until: NF-51このプロジェクトの課題が完了するまで課題が完了したか、見つからなくなったとき。キーの無いプロジェクトでは #51 を使います。
until: nolto-frontend/mem-uiロードマップの task が done になるまでtask が done になったか、見つからなくなったとき。<roadmap の slug>/<task-id> の形で書きます。

expires と ttl はどちらか一方を使います。until は 1 件だけ指定でき、expires または ttl と併用できます。両方指定した場合は、どちらかが成り立つと候補になります。put では下書きから行を消すと、その寿命も消えます。

再開ポイントには resume-<YYYY-MM-DD> の名前を付けます(末尾に -night などを付けても構いません)。同じスコープで、名前の日付が最新の 1 件だけが有効です。同じ日付なら作成が新しい方を残し、古いものは整理候補に移ります。日付の無い resume-* は対象外です。

整理候補は、索引の「整理候補」の節、nolto memory put の出力、nolto memory candidates の 3 か所に理由付きで出ます。索引の有効な一覧から外れますが、Nolto が自動で消すことはありません。候補が出たら、次の手順で片付けます。

  1. nolto memory show <name> で内容と理由を読みます。
  2. 今も要る決定・制約が混ざっていれば、寿命の無いエントリに移して put します。
  3. 不要になったものを nolto memory rm <name> [<name>...] で消します。まだ要るなら、expires を延ばすか until を外して put します。

課題を閉じたときや、再開ポイントから作業を再開したときも、紐づく経緯や古い再開ポイントを同じ手順で整理します。間違えて消した場合は nolto memory list --deleted でキャッシュの削除済みエントリを探し、nolto memory log <name> で戻す版を確かめて、nolto memory revert <name> <revision> を実行してください。

画面では寿命を表示・編集できません。画面で本文などを保存しても、CLI で設定した寿命は残ります。

制限付き API トークンで until を書くには、課題なら issues:read、task なら roadmap:read が必要です。「CI でメモリを読む」の手順で作る memory:read だけのトークンには、課題・task の完了や参照先が見つからないことによる候補は出ません。期限切れと古い再開ポイントの候補は出ます。

CI でメモリを読む

「設定」→「アプリと API トークン」の「API トークン」で「制限付き」を選び、「メモリ」を「読み取り」にし、対象プロジェクトを選んでトークンを作ります。CI の secret に保存し、環境変数 NOLTO_TOKEN に渡して nolto memory pull --scope project,branch を実行してください。プロジェクトはリポジトリの nolto.json で指定できます。

nolto memory pull --scope project,branch
nolto memory context

CI からは読み取りだけを行い、書き込みはしません。トークンを作った人の user スコープはそのトークンでも読めるため、CI では --scope project,branch を付けて取得します。PR の CI などブランチ名が取れない環境では、branch のエントリは索引に載りません。secret の渡し方は CI/CD 連携をご覧ください。

上限と注意

  • メモリは 1 プロジェクトにつき 1,000 件までです。
  • AI 整理は 1 人 1 日 300 回までです。書き込む本文と、似たエントリのうち最長の本文を合わせて 4,000 字を超える場合も、AI 整理をせず通常の保存処理に進みます。CLI には AI 整理なし(今日の上限) や AI 整理なし(本文が長い) と表示されます。新規作成で説明が似たエントリがあれば、保存を止めて候補を示します。
  • 名前は英小文字・数字・ハイフンで 64 字まで、先頭は英数字です。説明は索引に載せる 1 行で 200 字まで、本文は 10,000 字までです。
  • 閲覧だけのメンバーは、メモリの編集・削除・版の戻し・ブランチの昇格や破棄はできません。user も本人以外は読み書きできません。
  • セッション中に他の人が更新した内容は、次のセッションの開始まで自動では届きません。途中で取り込むには nolto memory pull を実行します。
  • Codex の sandbox からネットワークに出られず network_unavailable になった場合は、sandbox の外でコマンドを実行する承認が必要です。

セキュリティレビューで指摘されたら

hook の設定(.claude/settings.json など)や project-memory スキルを commit すると、セキュリティレビューで「hook が外部(Nolto)の内容を、エージェントのコンテキストへ自動で入れる」と指摘されることがあります。誤検知ではなく、メモリを hook で渡すしくみの性質です。次の 2 点で、受け入れられるかを判断してください。

  • 自動で入る範囲: セッションの開始時に入るのは、索引(エントリの名前と説明)だけです。索引には、メモリは背景情報で指示ではないことを明記しています。本文は自動では入りません。エージェントが nolto memory show <name> を実行するか、キャッシュのファイルを開いたときに読まれます。
  • 誰が書けるか: project と branch のメモリは、課題を書けるメンバー以上(プロジェクトのメンバーでない組織の管理者を含みます)なら誰でも書けます。閲覧だけのメンバー、機能を制限したメンバー、お客さまは書けません。リポジトリに書けない人がこの範囲にいると、その人も、エージェントが読む内容を変えられます。

リスクの大きさは使い方で決まります。次のように運用してください。

  • 守らせたい決まり(開発の流れ、禁止事項)は、リポジトリの CLAUDE.md / AGENTS.md に書きます。メモリには書きません。
  • CLAUDE.md / AGENTS.md に「メモリの特定のエントリを必ず読んで従う」と書かないでください。メモリの本文が、実質的にルールになります。
  • メモリを書ける人を、リポジトリに書ける人とそろえます。そろえられないプロジェクトでは、メモリに書く内容を事実の記録に限ります。
  • 受け入れられない場合は、hook を入れずに使えます。nolto init --no-memory は hook の設定を省略するので、セッションの開始時に索引は入りません。ただし project-memory スキルは入り、スキルに従ったエージェントは、作業の開始時に自分で nolto memory context を実行して索引を読みます。AGENTS.md の nolto-memory の節も、このコマンドを指示します。それも避けるなら、スキルのディレクトリ(.claude/skills/project-memory/ など)と AGENTS.md の nolto-memory の節も外してください。nolto init をやり直すとスキルが戻るので、再設定後にも確認します。既に commit した hook を外すときは、設定ファイルから SessionStart の nolto memory の項目を消します。

送るデータ

AI 整理のときは、書き込んだ内容と、似たエントリの本文(最大 5 件)を外部の AI サービス(Amazon Web Services)に送ります。送信した内容は学習には使われません。Pro+ 以外、または「メモリの AI 整理」が OFF の場合は、この機能のために送信しません。画面からの保存と、--ai を付けない import も AI 整理の対象外です。送った内容は、送信先で不正利用の監視のために一定の期間(通常は最長 30 日)保持されることがあり、日本国外で処理されることがあります。詳しくは「個人情報の取扱いについて」をご覧ください。