コンテンツにスキップ

Memo コマンド

タスクに紐づくメモの CRUD / 検索を提供します。内容を省略すると対話入力になります。

主なコマンド

コマンド例 説明
poe cli memo create --task <TASK_ID> -c "text" メモ作成
poe cli memo update <MEMO_ID> -c "new content" メモ内容更新
poe cli memo delete <MEMO_ID> メモ削除 (確認プロンプト)
poe cli memo delete <MEMO_ID> --force メモ削除 (確認なし)
poe cli memo get <MEMO_ID> 単一取得
poe cli memo list 全件一覧
poe cli memo list --task <TASK_ID> タスク ID フィルタ
poe cli memo search <QUERY> 部分一致検索

# 作成 (内容は対話入力)
poe cli memo create --task 11111111-1111-1111-1111-111111111111

# 更新 (内容指定)
poe cli memo update 33333333-3333-3333-3333-333333333333 -c "Fix wording"

# 検索
poe cli memo search meeting

内部ヘルパー対応表

ヘルパー 説明 Service メソッド
_create_memo 作成 create_memo
_update_memo 更新 update_memo
_delete_memo 削除 delete_memo
_get_memo 単一取得 get_memo_by_id
_list_all 全件一覧 get_all_memos
_list_by_task タスク別取得 get_memos_by_task_id
_search_memos 部分一致検索 search_memos

API リファレンス

Memo CLI commands.

メモ CRUD / 検索用コマンド。

app = typer.Typer(help='メモ CRUD / 検索') module-attribute

console = Console() module-attribute

MAX_PREVIEW_LEN = 43 module-attribute

DETAIL_PREVIEW_LEN = 40 module-attribute

create(task_id=typer.Option(..., '--task', help='対象タスクID'), content=typer.Option(None, '--content', '-c', help='メモ内容'))

新しいメモを作成するコマンド [AI GENERATED]

引数:

名前 タイプ デスクリプション デフォルト
task_id str

紐づけるタスク UUID

Option(..., '--task', help='対象タスクID')
content str | None

メモ本文 (未指定で対話入力)

Option(None, '--content', '-c', help='メモ内容')
ソースコード位置: src/cli/commands/memo.py
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
@app.command("create", help="メモ作成")
@handle_cli_errors()
def create(
    task_id: str = typer.Option(..., "--task", help="対象タスクID"),
    content: str | None = typer.Option(None, "--content", "-c", help="メモ内容"),
) -> None:  # [AI GENERATED]
    """新しいメモを作成するコマンド [AI GENERATED]

    Args:
        task_id: 紐づけるタスク UUID
        content: メモ本文 (未指定で対話入力)
    """
    from logic.commands.memo_commands import CreateMemoCommand

    t_uuid = uuid.UUID(task_id)
    if content is None:
        content = questionary.text("Memo content?").ask()
    if not content:
        console.print("[red]content 必須[/red]")
        raise typer.Exit(code=1)
    created = _create_memo(CreateMemoCommand(content=content, task_id=t_uuid))
    console.print(
        f"[green]Created:[/green] {created.result.id} (task={created.result.task_id}) Elapsed: {created.elapsed:.2f}s"
    )

update(memo_id=typer.Argument(...), content=typer.Option(None, '--content', '-c', help='新しい内容'))

既存メモの内容を更新するコマンド [AI GENERATED]

引数:

名前 タイプ デスクリプション デフォルト
memo_id str

対象メモ UUID

Argument(...)
content str | None

新しい本文 (未指定で対話入力)

Option(None, '--content', '-c', help='新しい内容')
ソースコード位置: src/cli/commands/memo.py
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
@app.command("update", help="メモ更新")
@handle_cli_errors()
def update(
    memo_id: str = typer.Argument(...),
    content: str | None = typer.Option(None, "--content", "-c", help="新しい内容"),
) -> None:  # [AI GENERATED]
    """既存メモの内容を更新するコマンド [AI GENERATED]

    Args:
        memo_id: 対象メモ UUID
        content: 新しい本文 (未指定で対話入力)
    """
    from logic.commands.memo_commands import UpdateMemoCommand

    m_uuid = uuid.UUID(memo_id)
    if content is None:
        content = questionary.text("New content?").ask()
    if not content:
        console.print("[yellow]Cancelled[/yellow]")
        raise typer.Exit(code=1)
    updated = _update_memo(UpdateMemoCommand(memo_id=m_uuid, content=content))
    console.print(f"[green]Updated:[/green] {updated.result.id} Elapsed: {updated.elapsed:.2f}s")

delete(memo_id, force=typer.Option(default=False, help='確認なし', rich_help_panel='Danger'))

メモを削除するコマンド [AI GENERATED]

引数:

名前 タイプ デスクリプション デフォルト
memo_id str

対象メモ UUID

必須
force bool

確認を省略するか

Option(default=False, help='確認なし', rich_help_panel='Danger')
ソースコード位置: src/cli/commands/memo.py
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
@app.command("delete", help="メモ削除")
@handle_cli_errors()
def delete(
    memo_id: str,
    force: bool = typer.Option(
        default=False,
        help="確認なし",
        rich_help_panel="Danger",
    ),
) -> None:  # [AI GENERATED]
    """メモを削除するコマンド [AI GENERATED]

    Args:
        memo_id: 対象メモ UUID
        force: 確認を省略するか
    """
    from logic.commands.memo_commands import DeleteMemoCommand

    m_uuid = uuid.UUID(memo_id)
    if (not force) and not questionary.confirm("Delete this memo?").ask():
        console.print("[yellow]Cancelled[/yellow]")
        raise typer.Exit(code=1)
    deleted = _delete_memo(DeleteMemoCommand(memo_id=m_uuid))
    console.print(f"[red]Deleted:[/red] {m_uuid} ({'OK' if deleted.result else 'NG'}) Elapsed: {deleted.elapsed:.2f}s")

get_memo(memo_id)

ID 指定でメモ詳細 (Markdown レンダリング含む) を取得するコマンド [AI GENERATED]

引数:

名前 タイプ デスクリプション デフォルト
memo_id str

メモ UUID

必須
ソースコード位置: src/cli/commands/memo.py
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
@app.command("get", help="IDで取得")
@handle_cli_errors()
def get_memo(memo_id: str) -> None:  # [AI GENERATED]
    """ID 指定でメモ詳細 (Markdown レンダリング含む) を取得するコマンド [AI GENERATED]

    Args:
        memo_id: メモ UUID
    """
    from logic.queries.memo_queries import GetMemoByIdQuery

    m_uuid = uuid.UUID(memo_id)
    memo = _get_memo(GetMemoByIdQuery(memo_id=m_uuid))
    if memo.result is None:
        console.print("[yellow]Not found[/yellow]")
        raise typer.Exit(code=1)
    table = Table(title="Memo Detail", box=box.MINIMAL_DOUBLE_HEAD, caption=f"Elapsed: {memo.elapsed:.2f}s")
    table.add_column("Field")
    table.add_column("Value")
    table.add_row("ID", str(memo.result.id))
    table.add_row("Task ID", str(memo.result.task_id))
    # 本文は Markdown として別レンダリング (テーブル内は省略)  # [AI GENERATED]
    snippet = memo.result.content.splitlines()[0][:DETAIL_PREVIEW_LEN] + (
        "..." if len(memo.result.content) > DETAIL_PREVIEW_LEN else ""
    )
    table.add_row("Content (preview)", snippet)
    console.print(table)
    console.print(Markdown(memo.result.content))

list_memos(task=typer.Option(None, '--task', help='特定タスクIDで絞り込み'))

メモ一覧を表示 (タスクIDフィルタ対応) するコマンド [AI GENERATED]

引数:

名前 タイプ デスクリプション デフォルト
task str | None

タスク UUID フィルタ

Option(None, '--task', help='特定タスクIDで絞り込み')
ソースコード位置: src/cli/commands/memo.py
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
@app.command("list", help="メモ一覧 (フィルタ対応)")
@handle_cli_errors()
def list_memos(
    task: str | None = typer.Option(None, "--task", help="特定タスクIDで絞り込み"),
) -> None:  # [AI GENERATED]
    """メモ一覧を表示 (タスクIDフィルタ対応) するコマンド [AI GENERATED]

    Args:
        task: タスク UUID フィルタ
    """
    from logic.queries.memo_queries import GetAllMemosQuery, GetMemosByTaskIdQuery

    if task:
        rows = _list_by_task(GetMemosByTaskIdQuery(task_id=uuid.UUID(task)))
        _print_memos(rows.result, f"task={task}", rows.elapsed)
        return
    rows = _list_all(GetAllMemosQuery())
    _print_memos(rows.result, "all", rows.elapsed)

search(query)

メモ本文の部分一致検索を行うコマンド [AI GENERATED]

引数:

名前 タイプ デスクリプション デフォルト
query str

検索語

必須
ソースコード位置: src/cli/commands/memo.py
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
@app.command("search", help="メモ全文検索 (部分一致)")
@handle_cli_errors()
def search(query: str) -> None:  # [AI GENERATED]
    """メモ本文の部分一致検索を行うコマンド [AI GENERATED]

    Args:
        query: 検索語
    """
    from logic.queries.memo_queries import SearchMemosQuery

    results = _search_memos(SearchMemosQuery(query=query))
    if not results.result:
        console.print("[yellow]No results[/yellow]")
        raise typer.Exit(code=0)
    _print_memos(results.result, f"search='{query}'", results.elapsed)