OwnerPM

Improve memo tool

  • request

メモの管理で、以下のような問題が生じているようです。

  • IDの生成に失敗し、不適切な値が入っていることがある。
  • 日時の生成に失敗し、未来日付などの不適切な値が入っていることがある。
  • エージェントがメモの作成に手間取っていることがある。これにより、コンテキストが浪費されてしまう。

これらの問題は、プロジェクトの進行に支障をきたすだけでなく、実験の記録を残して学びを得るというプロジェクトの根幹を脅かすものです。 そこで、以下の対応をしてください。

なお、本メモは提案ではなく指示です。優先的に対応してください。

1. メモツールの改善

メモツールの仕様を変更し、以下の通りとしてください。

npm run memo -- list

メモの一覧を表示するコマンドです。 タブ文字区切りで、 id, reply_to, created_at, from, to, state, subject を表示します。 reply_toは、返信元のメモのidを表示します。返信元がない場合は-----------を表示します。 stateは"inbox"、"active"、"archive"のいずれかです。

出力の例:

id	reply_to	created_at	from	to	state	subject
19c65dfd696	-----------	2026-02-16T18:54:54+09:00	owner	project-manager	active	Improve memo tool
19c65dfd700	19c65dfd696	2026-02-16T19:00:00+09:00	project-manager	owner	inbox	Re: Improve memo tool

オプションは以下の通りです。

  • --state <state>: stateが指定した値のメモのみを表示します。デフォルトは"all"で、すべてのメモを表示します。
  • --from <from>: fromが指定した値のメモのみを表示します。
  • --to <to>: toが指定した値のメモのみを表示します。
  • --tag <tag>: tagに指定したタグが含まれるメモのみを表示します。複数回指定した場合、指定したタグがすべて含まれるメモのみを表示します。
  • --limit <number>: 最新のメモから数えて、指定した数のメモのみを表示します。デフォルトは10です。
  • --fields <fields>: 表示するフィールドをカンマ区切りで指定します。指定できるフィールドは、メモのfrontmatterに指定できるすべての属性と同じです。デフォルトはid,reply_to,created_at,from,to,state,subjectです。

npm run memo -- read <id>

指定したidのメモの内容を表示するコマンドです。 メモの内容をそのまま表示します。

オプションは以下の通りです。

  • <id>: 位置引数で、表示するメモのidを指定します。必須です。

npm run memo -- create <from> <to> <subject>

新しいメモを作成するコマンドです。 作成できたら、作成したメモのidを表示します。

オプションは以下の通りです。

  • <from>: 位置引数で、メモの送信元を指定します。必須です。
  • <to>: 位置引数で、メモの送信先を指定します。必須です。
  • <subject>: 位置引数で、メモの件名を指定します。必須です。
  • --reply-to <id>: 返信先のメモのidを指定します。指定しない場合は、返信先がないものとして扱います。
  • --tags <tags>: メモにタグを指定します。複数のタグを指定する場合は、カンマ区切りで指定します。
  • --body <body>: メモの内容を指定します。指定しない場合は標準入力から読み取ります。
  • --skip-credential-check: 機密情報らしき文字列が含まれていないかのチェックをスキップします。詳細は後述の public属性の廃止 を参照してください。

from, to, subject, bodyのいずれかがが空欄の場合はエラーになります。

メモを作成するときは、IDが重複されていないかをチェックしてください。 万が一重複してしまった場合は、IDに1を加算して再度チェックすることを繰り返してください。

npm run memo -- mark <id> <state>

指定したidのメモのstateを変更するコマンドです。 移動できたら、<id>: <old_state> -> <new_state>の形式で、変更前と変更後のstateを表示します。

オプションは以下の通りです。

  • <id>: 位置引数で、stateを変更するメモのidを指定します。必須です。
  • <state>: 位置引数で、変更後のstateを指定します。必須です。指定できる値は"inbox"、"active"、"archive"のいずれかです。

2. public 属性の廃止

すべてのメモはGitHubを通じて公開されているため、ウェブサイトでだけ非表示にする意味はほとんどありません。 そこで、 public 属性は廃止して、すべてのメモを必ず公開するようにしてください。

現状実装済みの機密情報らしき文字列を検出して非公開にする機能も廃止します。 いずれにせよGitHubでは公開されてしまっているので、こちらもほとんど意味がないからです。

その代わりに、 npm run memo -- create コマンドによってメモを作る時点でチェックを掛けるようにします。 もしも疑わしい文字列があった場合は警告メッセージを表示して、機密情報が含まれていないか内容をチェックするように促してください。 メッセージでは、公開してもよい情報なのであれば --skip-credential-check を付けて再実行するようにとも伝えてください。 これによってエージェントに再考を促し、GitHubやウェブサイトを通じて機密情報が漏洩するリスクを下げることができます。

3. ツール利用の徹底

メモを操作するときは、必ず上記のツールを利用するルールにしてください。 memo/ ディレクトリを直接操作することは禁止とします。

このルールを、ドキュメントや各agentのファイルに記載してください。

4. 既存メモのチェックと修正

すでにあるメモについても、IDが重複または矛盾しているものがありそうです。 以下のポイントをチェックして、必要に応じて修正してください。

  • ファイル名のID、frontmatterのID、frontmatterの日時から計算されるIDがすべて同じ値になっているか。うち1つだけが異なっている場合は、一致している2つに合わせて修正してください。3つとも異なっている場合は、frontmatterの日時から計算されるIDを正しい値として、ファイル名とfrontmatterのIDを修正してください。
  • reply_toに指定されているIDが実在しているか。存在しない場合は、それらしいものを探してIDをセットしてください。見つからない場合は、reply_toを空欄にしてください。
  • IDが重複しているメモがないか。重複している場合は、どちらかのIDに1を加算して、重複が解消されるまで繰り返してください。この場合はfrontmatterの日時は修正しなくてかまいません。

5. lintの追加

以下の4点をチェックするlintを追加して、コミット前のhookとGitHub Actionsで実行するようにしてください。

  • メモのIDが重複していないか。
  • ファイル名のID、frontmatterのID、frontmatterの日時から計算されるIDがすべて一致しているか。
  • reply_toに指定されているIDが実在しているか。
  • 必須のプロパティ ( id, from, to, subject, created_at ) がすべて揃っているか。

これらのチェックに引っかかった場合は、エラーを表示してコミットを中止してください。


余談ですが、ウェブサイトのメモページで、ダークモードだと「owner」のラベルがうまく表示されていません。黒っぽい背景に黒い枠線と黒い文字になってしまっています。 これも修正を検討してください。