●2.1.283 — 週末の Claude Code リリースはなく、最新は 9月25日の 2.1.283 のまま。権限モード未設定時の既定が auto に変わった点は、許可ルールとの照合が要ります●PLANS — Pro と Team Standard の既定モデルが Sonnet から Opus へ。Claude Code 2.1.280 の変更で、プラン選びの前提が変わっています●10/07 — Claude Desktop / Cowork の管理構成キー旧綴りの受付終了まで残り9日。締切後は読み込みが fail-closed になります●AUTO — 「許可ルールに書いたコマンドが auto モードで拒否される」という問いが出ています。呼ぶ形を許可ルールに揃える話題です●NEW — 既定の Opus が 5.5 に変わった週、別名のまま残していた3箇所の確認●CURSOR — Cursor 経由で Claude を使うとクレジットがモデル原価に比例して減る構造。1日50件を超えるなら定額の Claude Code Pro が安定という整理が出ています●2.1.283 — 週末の Claude Code リリースはなく、最新は 9月25日の 2.1.283 のまま。権限モード未設定時の既定が auto に変わった点は、許可ルールとの照合が要ります●PLANS — Pro と Team Standard の既定モデルが Sonnet から Opus へ。Claude Code 2.1.280 の変更で、プラン選びの前提が変わっています●10/07 — Claude Desktop / Cowork の管理構成キー旧綴りの受付終了まで残り9日。締切後は読み込みが fail-closed になります●AUTO — 「許可ルールに書いたコマンドが auto モードで拒否される」という問いが出ています。呼ぶ形を許可ルールに揃える話題です●NEW — 既定の Opus が 5.5 に変わった週、別名のまま残していた3箇所の確認●CURSOR — Cursor 経由で Claude を使うとクレジットがモデル原価に比例して減る構造。1日50件を超えるなら定額の Claude Code Pro が安定という整理が出ています
# After(保護あり): canonical 解決後に /memories 配下か検証するfrom pathlib import PathROOT = Path("./memories").resolve()def _safe(path: str) -> Path: # 先頭の /memories を実ディレクトリへ写像し、正規化して配下チェック rel = path.replace("/memories", "", 1).lstrip("/") target = (ROOT / rel).resolve() try: target.relative_to(ROOT) # 配下でなければ ValueError except ValueError: raise PermissionError(f"パスが /memories の外を指しています: {path}") return targetdef handle_memory(cmd: dict) -> str: c = cmd["command"] if c == "view": p = _safe(cmd["path"]) if p.is_dir(): items = "\n".join(f"{f.stat().st_size}\t/memories/{f.relative_to(ROOT)}" for f in sorted(p.rglob("*")) if f.is_file()) return f"Files under /memories:\n{items}" lines = p.read_text(encoding="utf-8").splitlines() return "\n".join(f"{i+1:>6}\t{ln}" for i, ln in enumerate(lines)) if c == "create": p = _safe(cmd["path"]) if p.exists(): return f"Error: File {cmd['path']} already exists" p.parent.mkdir(parents=True, exist_ok=True) p.write_text(cmd["file_text"], encoding="utf-8") return f"File created successfully at: {cmd['path']}" if c == "str_replace": p = _safe(cmd["path"]) body = p.read_text(encoding="utf-8") if body.count(cmd["old_str"]) != 1: return "No replacement was performed; old_str must appear exactly once." p.write_text(body.replace(cmd["old_str"], cmd["new_str"]), encoding="utf-8") return "The memory file has been edited." if c == "delete": p = _safe(cmd["path"]) p.unlink(missing_ok=True) return f"Successfully deleted {cmd['path']}" return f"Error: unsupported command {c}"