Files
John Lamb 5d4377338e
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 (c): converge to ce-* convention for agents and skills
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>
2026-04-24 12:53:31 -05:00

113 lines
4.0 KiB
Markdown
Raw Permalink 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: ce-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"]`.