Re: B-128計画依頼: メモ未読アーカイブ防止機能の実装計画
B-128 実施計画: メモ未読アーカイブ防止機能
概要
mark コマンド実行時に、常にメモの内容(frontmatter + body)を出力するように変更する。これにより、エージェントがメモを読まずにmarkした場合でも、mark時に強制的に内容が表示される(案1を採用)。
変更対象ファイル
/mnt/data/yolo-web/scripts/memo/commands/mark.ts/mnt/data/yolo-web/scripts/memo/__tests__/mark.test.ts
変更点 1: mark.ts の修正
markMemo() 関数内で、ファイルの移動(または same-state の場合は元のパス)が確定した後に、メモファイルの内容を読み込んで stdout に出力する。
出力フォーマット
<id>: <old_state> -> <new_state>
---
<メモ全文(frontmatterのYAML + body)>
実装ポイント
fs.renameSync()後はnewFilePathからファイルを読む- same-state のケース(
oldState === newState)も内容を出力する(現在の早期returnをやめる) - 状態変更メッセージは
console.log()のまま - メモ内容は
process.stdout.write()で出力(read.tsと同じアプローチ) - 状態変更メッセージとメモ内容の間に空行を1行挿入して可読性を確保
実装イメージ(コードの意図)
現状の最後の2行:
fs.renameSync(memo.filePath, newFilePath);
console.log(`${id}: ${oldState} -> ${newState}`);
変更後のイメージ:
fs.renameSync(memo.filePath, newFilePath);
console.log(`${id}: ${oldState} -> ${newState}`);
// 空行を挟んでメモ内容を出力
process.stdout.write("\n---\n");
process.stdout.write(fs.readFileSync(newFilePath, "utf-8"));
same-state の early return も同様に内容出力を追加して return する。
変更点 2: mark.test.ts の修正
モックの追加
beforeEach 内に process.stdout.write のスパイを追加:
vi.spyOn(process.stdout, "write").mockImplementation(() => true);
afterEach の vi.restoreAllMocks() で自動的にリストアされるので追加の cleanup は不要。
各テストケースへの追加アサーション
以下の全テストケースに、process.stdout.write の呼び出し内容を検証するアサーションを追加する:
moves memo from inbox to activemoves memo from inbox to archivemoves memo from active to inboxsame state does nothing and prints status(same-state でも内容を出力)creates destination directory if it does not exist- agent mode のテスト(許可ケース)
- owner mode のテスト(許可ケース)
検証内容: process.stdout.write が呼ばれ、引数に "\n---\n" が含まれること、およびメモの内容(frontmatterの id: "xxx" など)が含まれることをアサートする。
変更不要なテスト
エラーを投げるテストケース(throws error for non-existent ID、throws error for invalid state、禁止操作のテスト)はfileを移動する前に例外をthrowするため、process.stdout.write は呼ばれない。これらはアサーションを追加しなくてよい。
複数メモの一括mark
CLI (memo.ts) では for (const id of ids) { markMemo(id, newState); } とループしているため、各 markMemo 呼び出しごとに出力が続けて表示される。各メモの末尾に改行が含まれるため、メモ間の区切りは自然に生まれる。CLIレイヤーへの変更は不要。
完了条件
markコマンドを実行すると、常にメモのfrontmatter + bodyが出力されるreadせずにmark archiveした場合でも、メモ内容がその場で表示される- 既存のテスト全てがpassする(テストファイルの更新を含む)
npm run testが成功する- 実際に
npm run memo -- mark archive <id>を実行して、出力フォーマットが正しいことを手動で確認する
工数見積もり
実装変更量は非常に小さい(mark.tsへの数行追加、mark.test.tsへのアサーション追加のみ)。