Files
claude-engineering-plugin/plugins/compound-engineering/skills/hugo-blog-publisher/SKILL.md
John Lamb a7b15298e0
Some checks failed
CI / pr-title (push) Has been cancelled
CI / test (push) Has been cancelled
Release PR / release-pr (push) Has been cancelled
Release PR / publish-cli (push) Has been cancelled
Merge step (b): carry in local-only files at original paths
Brings 47 local-only files from backup-local-main into the merge-upstream
branch at their pre-rename paths. Subsequent steps will rename these to
the ce-* convention and port shared-file merges.

Includes:
- Custom skills: 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
- Custom agents: design-conformance-reviewer, tiangolo-fastapi-reviewer,
  zip-agent-validator, python-package-readme-writer, lint
- Custom commands: essay-edit, essay-outline, pr-comments-to-todos,
  resolve_todo_parallel, workflows/{plan,review,work}
- Local mods to ce-review/SKILL.md + review-output-template.md (will be
  ported to ce-code-review in a later step)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 12:40:27 -05:00

4.0 KiB
Raw Blame History

name, description
name description
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

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 article
  • source_name — Publication name (e.g. "Every", "Strange Loop Canon")
  • source_title — Full title of the source article
  • source_author — Author(s) of the source article
  • source_published — Date the source was published (YYYY-MM-DD)
  • tags — Relevant tags as a list
  • quote — The excerpt to pull-quote
  • quote_attribution — Who said the quote (usually same as source_author)
  • commentary — John's own thoughts (13 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 title
  • date — 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 links posts, the body after the frontmatter is John's commentary only — do not repeat the quote there.
  • For blog posts, use single quotes around the title in frontmatter (not double quotes).
  • If source_published is not known for a links post, omit the field entirely rather than guessing.
  • Tags for links posts are lowercase strings in a JSON array: ["ai", "writing"].