Skip to content

Add Lyrebird content skill#1

Open
angusbezzina wants to merge 8 commits into
mainfrom
angus/content-strategist
Open

Add Lyrebird content skill#1
angusbezzina wants to merge 8 commits into
mainfrom
angus/content-strategist

Conversation

@angusbezzina

@angusbezzina angusbezzina commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Completes Lyrebird publication readiness with Apache-2.0 metadata, bundled LICENSE, agents/openai.yaml, and README path documentation.
  • Hardens /lyrebird write and modify validation for metadata, platform body shape, X replies, source evidence with access dates, image-source separation, image preservation, and editorial hard bans.
  • Updates Lyrebird references for steelman brainstorm flow, image.md schema, structured post sources, and modify validation input handling.
  • Fixes VOICE.md lookup so differently cased VOICE files are found correctly.

Validation

  • node --check skills/lyrebird/scripts/load-voice.mjs
  • node --check skills/lyrebird/scripts/validate-social-output.mjs
  • git diff --check
  • Focused fixture suite for valid write/modify outputs and negative cases: empty bodies, missing metadata, placeholder metadata, source entries without accessed dates, image/CDN URLs in post sources, invalid image licenses, X character limits, X Markdown links, X trailing ## Sources, changed modify images, and modify outputs without sources.
  • Subagent validation loop completed; final scoped review found no blocking/material issues.
  • Beads epic skills-bqx is closed locally and exported to the beads-backup branch.

Note: native bd dolt push still fails with DoltHub PermissionDenied for https://doltremoteapi.dolthub.com/gpu-cli/skills, so Beads was published through the git backup branch fallback.

@angusbezzina angusbezzina changed the title Add Lyrebird skill planning docs Add Lyrebird content skill Jun 13, 2026
angusbezzina and others added 5 commits June 15, 2026 09:22
The {{scripts_path}} placeholder was never substituted by the skills.sh
CLI, so the literal string shipped and every script invocation failed
after install. Point invocations at the installed Claude Code location
(.claude/skills/lyrebird/scripts/...), matching the tmux-cli-test
convention, and update the skill-path note to the same.

Verified end-to-end: load-voice.mjs runs from a project root with the
skill installed under .claude/skills/lyrebird/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Tag backlinks to the user's own destinations with UTM parameters, driven
entirely by VOICE.md so it only happens where the user has opted in.

- voice: interview question + a structured "Link Tracking (UTM)" block in
  the VOICE.md template (owned domains, per-platform source tokens, medium,
  campaign, required params).
- load-voice.mjs: parses that block into a structured `utm` object so write
  and modify pass exact values instead of guessing.
- platform-contracts.md: per-platform utm_source tokens, query-merge rules,
  and the owned-only / never-tag-citations rule.
- write: applies UTM tags to owned backlinks using the platform's source token.
- modify: rewrites utm_source to the target platform on conversion (e.g.
  linkedin -> x) instead of carrying the stale source.
- validate-social-output.mjs: opt-in checks (via --owned-domains) that owned
  backlinks carry the required params and the correct per-platform source;
  third-party and citation/source links are excluded. No --owned-domains means
  no UTM checks, so existing calls are unaffected.

Verified end-to-end: block parsing, backward-compat pass, correct-tag pass
with third-party/Sources links excluded, and failures for wrong utm_source
and missing params.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The skills.sh CLI installs the canonical skill to .agents/skills/<name> and
symlinks per-agent dirs (e.g. .claude/skills/<name>) to it. Two bugs surfaced
under a real symlinked install:

1. The entry-point guard (import.meta.url === file://process.argv[1]) never
   matched when invoked through the symlink, because import.meta.url is the
   realpath (.agents/...) while argv[1] is the symlink path (.claude/...). Both
   scripts silently did nothing — load-voice produced no JSON, and the validator
   exited 0 without validating anything. Replaced with a realpath comparison so
   they run via either path.

2. The docs hardcoded .claude/skills/lyrebird, which only exists for Claude Code.
   The canonical location present for every agent is .agents/skills/lyrebird, so
   switched all script invocations and the skill-path note to that.

Verified under a symlinked layout: load-voice prints JSON via both the canonical
and symlink paths, and the validator now fails (exit 1) on bad input and passes
(exit 0) on valid input when invoked through the symlink.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant