diff --git a/plugins/compound-engineering/README.md b/plugins/compound-engineering/README.md index cb6060b..bae4198 100644 --- a/plugins/compound-engineering/README.md +++ b/plugins/compound-engineering/README.md @@ -89,6 +89,8 @@ For `/ce-optimize`, see [`skills/ce-optimize/README.md`](./skills/ce-optimize/RE | Skill | Description | |-------|-------------| | `every-style-editor` | Review copy for Every's style guide compliance | +| `hugo-blog-publisher` | Publish posts to a Hugo blog via SSH — supports `links` (pull-quote + commentary) and `blog` (original essays) post types | +| `john-voice` | Write content in John Lamb's voice — applies core voice, venue guides, signature moves, and a revision checklist | | `proof` | Create, edit, and share documents via Proof collaborative editor | | `todo-create` | File-based todo tracking system | diff --git a/plugins/compound-engineering/skills/hugo-blog-publisher/SKILL.md b/plugins/compound-engineering/skills/hugo-blog-publisher/SKILL.md new file mode 100644 index 0000000..5bcabb3 --- /dev/null +++ b/plugins/compound-engineering/skills/hugo-blog-publisher/SKILL.md @@ -0,0 +1,112 @@ +--- +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 (1–3 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"]`. diff --git a/plugins/compound-engineering/skills/john-voice/SKILL.md b/plugins/compound-engineering/skills/john-voice/SKILL.md index 66867e4..503eadd 100644 --- a/plugins/compound-engineering/skills/john-voice/SKILL.md +++ b/plugins/compound-engineering/skills/john-voice/SKILL.md @@ -18,8 +18,9 @@ This skill captures John Lamb's authentic writing voice for use across all writt - **Technical docs, Jira tickets, PRs, code reviews** → `references/professional-technical.md` - **Cover letters, LinkedIn, formal professional** → `references/formal-professional.md` - **Personal reflection, journal, notes** → `references/personal-reflection.md` -4. Apply both the core voice and the venue-specific guide when drafting content -5. Review the output against the core voice principles — if it sounds like an AI wrote it, rewrite it +4. For prose and essays, also load `references/signature-moves.md` — these are the techniques that make the writing move +5. Apply both the core voice and the venue-specific guide when drafting content +6. Before finishing, run `references/revision-checklist.md` — if any item flags, rewrite before delivering ## Key Principle diff --git a/plugins/compound-engineering/skills/john-voice/references/core-voice.md b/plugins/compound-engineering/skills/john-voice/references/core-voice.md index e9eca68..4c7367a 100644 --- a/plugins/compound-engineering/skills/john-voice/references/core-voice.md +++ b/plugins/compound-engineering/skills/john-voice/references/core-voice.md @@ -2,6 +2,10 @@ These patterns apply to ALL writing regardless of venue or audience. They are the non-negotiable foundation of John's voice. +## Voice in One Line + +Plainspoken but precise. Funny but never jokey. Direct but warm. Curious but not credulous. Committed but not preachy. + ## Philosophy John writes to be understood, not to impress. He believes complexity in writing is a failure of the writer, not a sign of intelligence. He actively resists language that props up ego or obscures meaning. He'd rather sound like a person talking at a dinner table than a thought leader publishing a manifesto. diff --git a/plugins/compound-engineering/skills/john-voice/references/revision-checklist.md b/plugins/compound-engineering/skills/john-voice/references/revision-checklist.md new file mode 100644 index 0000000..3b581e8 --- /dev/null +++ b/plugins/compound-engineering/skills/john-voice/references/revision-checklist.md @@ -0,0 +1,19 @@ +# Revision Checklist + +Run before finishing any piece. Each "yes" requires a rewrite. + +## Voice +- [ ] Does any sentence use an em-dash? → Use parentheses or split the sentence. +- [ ] Does any abstract noun carry a sentence? ("value," "conviction," "impact," "transformation") → Make it concrete or cut it. +- [ ] Does any claim dissolve when drilled into? → Add the logic or cut the claim. +- [ ] Does any hedge weaken without adding nuance? ("somewhat," "in some ways," "it's worth noting") → Cut it. + +## Structure +- [ ] Does the opening start with an abstract thesis or definition? → Rewrite to open on a concrete scene. +- [ ] Does the conclusion restate or summarize? → Replace with a question, quiet observation, or callback. +- [ ] Do any paragraphs merely follow each other rather than cause each other? → Reorder or cut. + +## Momentum +- [ ] Does any paragraph feel like it's trudging? → Rewrite until it moves. +- [ ] Are there runs of similarly-structured sentences? → Break the pattern. +- [ ] Does the last sentence of each paragraph land or pull forward? → Rewrite if it just stops. diff --git a/plugins/compound-engineering/skills/john-voice/references/signature-moves.md b/plugins/compound-engineering/skills/john-voice/references/signature-moves.md new file mode 100644 index 0000000..d588add --- /dev/null +++ b/plugins/compound-engineering/skills/john-voice/references/signature-moves.md @@ -0,0 +1,57 @@ +# John's Signature Moves + +## The "Not What You Think" Correction + +Sets up a received wisdom, then reveals what's actually underneath. The inversion is the essay. + +> "Many believe buildings in DC cannot be taller than the White House. The rule is actually based on the road the building adjoins." + +> "The birth rate isn't falling because married women stopped having children. It's falling because fewer women are getting married in the first place." + +> "The appliances didn't free time; they redefined our standards of what 'clean enough' meant." + +--- + +## The Lateral Analogy + +Builds through parallel examples from unrelated domains until a shared principle becomes undeniable. Two examples is a comparison. Three is a pattern. + +> Crosscut saws → mechanical watches → mechanical keyboards → *therefore* manual cars will thrive as a niche. + +> Vacuum cleaner → washing machine → dishwasher → *therefore* AI won't free your time either. + +--- + +## The Parenthetical Aside + +A secondary observation tucked in parentheses — a dry qualifier, a confession, or the best joke in the paragraph. It rewards close readers without slowing anyone else down. + +> *(dodged the extraterrestrial lifeforms)* + +> *(and will probably never go)* + +> *(which are likely closer to 200 miles in reality)* + +Use parentheses, never em-dashes. The parenthetical slips in; the em-dash announces itself. + +--- + +## The Rhetorical Pivot + +A question that advances the argument rather than decorating it. Often used as a structural bookend — asked at the start, answered by the end. + +> "What makes a city beautiful?" — opens the essay and recurs mid-piece. + +> "Does owning an EV keep you from embarking on long road trips?" + +> "Why is this memory the one that's faded the least?" + +--- + +## The Sensory Stack + +When the reader needs to be *there*, enumerate specific sensory channels in sequence. Not impressionistic atmosphere — each detail is unique to the exact scene. + +> "I hear the engine increase in its frothy fury, I feel the seat press back against me, I see the landscape start to blur slowly and then suddenly quickly, I stamp the clutch in, feel a sense of weightlessness..." + +> "The greenness of the vegetation and the blueness of the sky. I remember how the flowering jasmine smells. The vibrations of the small, but mighty, engine chattering through the steering wheel."