blog-delete
Delete a blog post or review from blog.carter2099.com. Soft-deletes the markdown file (moved to deleted/ directory) and destroys the database record.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Delete a blog post or review from blog.carter2099.com. Soft-deletes the markdown file (moved to deleted/ directory) and destroys the database record.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Check health of the homelab-backup service — last run status, next scheduled run, R2 bucket contents, and local archive state. Quick mobile-friendly summary.
Edit an existing blog post or review on blog.carter2099.com. Find by title/ID, show current content, collaboratively revise, preview changes, then update.
Create a new blog post on blog.carter2099.com. Collaboratively draft and polish markdown content, preview it, then publish — triggering subscriber email notifications via the Rails app.
Create a new review on blog.carter2099.com (Book, Movie, Show, Product, or Video Game). Collaboratively draft content, preview it, then publish — triggering subscriber email notifications via the Rails app.
Audit the homelab for outdated software and report findings. Use when user says "check for updates", "what's outdated", "audit the homelab", "run update check", or wants a system health report.
Create a new scheduled agent that runs on a systemd timer — recurring maintenance, checks, reports, or any task you want automated. Use when user says "set up a scheduled agent", "automate this to run daily", "I want a cron job for X".
| name | blog-delete |
| description | Delete a blog post or review from blog.carter2099.com. Soft-deletes the markdown file (moved to deleted/ directory) and destroys the database record. |
Delete a blog post or review. Files are soft-deleted (moved to a deleted/ subdirectory) so they can be recovered if needed. The database record is permanently destroyed.
The user may refer to content by title, partial title, topic, or ID. Use these to locate it:
docker exec blog-web-1 bin/rails runner "Post.order(created_at: :desc).limit(10).each { |p| puts \"#{p.id}: #{p.title} (#{p.created_at.strftime('%Y-%m-%d')})\" }"
docker exec blog-web-1 bin/rails runner "Review.order(created_at: :desc).limit(10).each { |r| puts \"#{r.id}: #{r.title} [#{r.review_type.name}, #{r.formatted_rating}] (#{r.created_at.strftime('%Y-%m-%d')})\" }"
docker exec blog-web-1 bin/rails runner "Post.where('title LIKE ?', '%<query>%').each { |p| puts \"#{p.id}: #{p.title}\" }"
docker exec blog-web-1 bin/rails runner "Review.where('title LIKE ?', '%<query>%').each { |r| puts \"#{r.id}: #{r.title}\" }"
If the match is ambiguous, show the candidates and ask which one.
Once the target is identified, display it fully so the user knows exactly what they're removing:
For a post:
/home/carter/blog/blog/app/posts/<filename>.md**Post #<id>:** <title>
**Created:** <date>
**File:** <filename>.md
**URL:** https://blog.carter2099.com/posts/<id>
---
<full markdown content>
---
For a review:
**Review #<id>:** <title>
**Type:** <review_type> | **Rating:** <rating>/5
**Author:** <author, if book>
**Created:** <date>
**File:** <filename>.md (or "No body text")
**URL:** https://blog.carter2099.com/reviews/<id>
---
<full markdown content, or "(no body text)">
---
Ask: "Delete this? The markdown file will be moved to the deleted/ folder (recoverable), but the database record will be permanently removed and the page will go offline."
Do not proceed without explicit confirmation.
Move the file to the deleted/ subdirectory on the host:
For a post:
mkdir -p /home/carter/blog/blog/app/posts/deleted
mv /home/carter/blog/blog/app/posts/<filename>.md /home/carter/blog/blog/app/posts/deleted/
For a review (only if it has a path):
mkdir -p /home/carter/blog/blog/app/reviews/deleted
mv /home/carter/blog/blog/app/reviews/<filename>.md /home/carter/blog/blog/app/reviews/deleted/
For a post:
docker exec blog-web-1 bin/rails runner "Post.find(<id>).destroy!"
For a review:
docker exec blog-web-1 bin/rails runner "Review.find(<id>).destroy!"
docker exec blog-web-1 bin/rails runner "puts Post.exists?(<id>)"
# Should print "false"
Report: record destroyed, file moved to deleted/<filename>.md, page is now offline.
after_destroy callback for notifications.app/assets/images/ are left in place (they may be shared across posts).Post.where(path: @post.path).size > 1), do NOT move the file — only destroy the record. Check this before moving.deleted/ directories are not bind-mounted into the container, so soft-deleted files only exist on the host.