Aligns local custom agents, skills, and modified shared agents with upstream's
flat ce-<name>.agent.md + ce-<skill>/ convention introduced in upstream v3.x.
Changes:
- Delete 9 upstream-renamed agents for locally-dropped agents (design/*, rails
reviewers, ankane-readme-writer, data-migration-expert, performance-oracle,
security-sentinel)
- Delete ce-dhh-rails-style skill (local dropped dhh-rails-style entirely)
- Move 5 custom agents to flat ce-<name>.agent.md paths:
* python-package-readme-writer, design-conformance-reviewer,
tiangolo-fastapi-reviewer, zip-agent-validator, lint
- Rename 12 custom skill directories with ce- prefix:
* john-voice, jira-ticket-writer, hugo-blog-publisher, weekly-shipped,
proof-push, ship-it, story-lens, sync-confluence, excalidraw-png-export,
python-package-writer, fastapi-style, upstream-merge
- Port local Python/FastAPI edits into upstream's flat ce-best-practices-
researcher.agent.md and ce-kieran-python-reviewer.agent.md
- Update frontmatter name: fields in all 17 renamed files to match new paths
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.0 KiB
name, description
| name | description |
|---|---|
| ce-hugo-blog-publisher | This skill should be used when publishing a new post to John's Hugo blog on lambwire. It handles both post types — "links" (reposting something interesting with a quote and commentary) and "blog" (original essays) — creates the correctly formatted markdown file, and commits and pushes it to the remote repository. Triggers on "publish to my blog", "add a link post", "post to lambwire", "new blog post", or any request to create content on the Hugo blog. |
Hugo Blog Publisher
Publish new content to John's Hugo blog at lambwire (/home/john/mine/scripts/hugo). Two post types are supported: links and blog. All posts are committed directly to main and pushed.
Post Types
links
A "link post" reposts something interesting — a pull-quote from an article, the source metadata, and John's brief commentary.
Required fields:
title— John's own title for the post (not necessarily the article title)external_url— Full URL of the source articlesource_name— Publication name (e.g. "Every", "Strange Loop Canon")source_title— Full title of the source articlesource_author— Author(s) of the source articlesource_published— Date the source was published (YYYY-MM-DD)tags— Relevant tags as a listquote— The excerpt to pull-quotequote_attribution— Who said the quote (usually same assource_author)commentary— John's own thoughts (1–3 paragraphs of prose, placed after the frontmatter)
Exact format:
---
title: "{{ title }}"
date: {{ YYYY-MM-DDTHH:MM:SS-06:00 }}
draft: false
type: link
external_url: "{{ external_url }}"
source_name: "{{ source_name }}"
source_title: "{{ source_title }}"
source_author: "{{ source_author }}"
source_published: {{ YYYY-MM-DD }}
link_type: article
tags: ["tag1", "tag2"]
quote: |
"{{ quote }}"
quote_attribution: "{{ quote_attribution }}"
---
{{ commentary }}
Date: Current datetime in Central time with offset -06:00 (e.g. 2026-03-15T14:30:00-06:00).
Filename: Slugify the title — lowercase, hyphens for spaces, strip punctuation. E.g. is-ai-about-craft-not-speed.md.
blog
An original essay. Content is freeform markdown after the frontmatter.
Required fields:
title— Post titledate— Today's date (YYYY-MM-DD)content— The full essay body in markdown
Exact format:
---
title: '{{ title }}'
date: {{ YYYY-MM-DD }}
draft: false
aliases:
- /blog/{{ slug }}/
---
{{ content }}
Filename: Slugify the title. E.g. keeping-it-simple.md.
Workflow
Step 1 — Gather inputs. Ask for all required fields for the chosen post type before writing anything. Don't proceed until everything is provided.
Step 2 — Generate slug. Lowercase the title, replace spaces with hyphens, strip punctuation. This becomes both the filename (without .md) and the /blog/slug/ alias for blog posts.
Step 3 — Compose the markdown. Build the full file content using the exact format above.
Step 4 — Write the file to the remote. Use an SSH heredoc to write the file directly:
ssh lambwire "cat > /home/john/mine/scripts/hugo/content/{{ links|blog }}/{{ slug }}.md" << 'EOF'
{{ file_content }}
EOF
Step 5 — Commit and push on the remote.
ssh lambwire "cd /home/john/mine/scripts/hugo && git add content/ && git commit -m 'Add {{ links|blog }}: {{ title }}' && git push origin main"
Step 6 — Confirm. Report the remote path, the commit message, and that the push succeeded.
Notes
- Never set
draft: true— all posts go live immediately. - For
linksposts, the body after the frontmatter is John's commentary only — do not repeat the quote there. - For
blogposts, use single quotes around the title in frontmatter (not double quotes). - If
source_publishedis not known for a links post, omit the field entirely rather than guessing. - Tags for
linksposts are lowercase strings in a JSON array:["ai", "writing"].