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

113 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: hugo-blog-publisher
description: 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 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:**
```markdown
---
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:**
```markdown
---
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:
```bash
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.**
```bash
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"]`.