81 load-bearing stier i 16 kommandofiler pinnet til ${CLAUDE_PLUGIN_ROOT}/.
Rene prefikser: 81 inn / 81 ut, ingen linje lagt til eller fjernet.
FASIT-VERIFISERING (premiss-sjekk mot BASELINE, ikke bare HEAD): planens
68 linjer / 17 filer er RIKTIG mot sin egen baseline 882f6ee. HEAD ga 73/18 —
altså ekte kode-drift siden baseline (newsletter.md 11→15, calendar.md 0→1),
ikke en telle-feil som i N19.
SCOPE UTVIDET ETTER GO: planens grep (references|hooks/scripts|scripts) har en
blindsone — skills/ assets/ config/ render/ agents/ commands/ er samme defekt-
klasse og allerede anerkjent som pin-verdig av mønsteret (audit.md:24 og
competitive.md:22 pinner skills/, batch.md:214 og pipeline.md:211 pinner
assets/). Under planens scope kunne dens EGEN verifisering ikke passere:
quick.md:229-230 ville stått upinnet rett over en pinnet linje, og setup.md
(3 load-bearing Read, 0 pins) var ikke i settet i det hele tatt.
Full defektklasse: 117 linjer / 19 filer → 81 pinnet, 36 bevisst urørt.
KLASSIFISERINGSREGEL (utledet av mønsteret, ikke oppfunnet):
- PIN = stien skal åpnes/kjøres/skrives — Read/Reference/See-pekere,
ref-fil-lister, Bash/node/npm, edit-mål.
- PROSA = stien står som sitat bak en påstand, eller som beskrivelse av
oppførsel/plassering. Ingen inline «(see …)» er pinnet noe sted i repoet
(0 av 25 filer) — den grensen er arvet, ikke satt her.
36 BEVISST URØRTE, tre klasser:
1. Inline sitat/attribusjon (17): carousel.md:37 · pipeline.md:70,75 ·
newsletter.md:999,1082,1211,1433 · report.md:273 · video.md:69 ·
react.md:115 · calendar.md:87 · profile.md:28,34 · firsthour.md:112 ·
monetize.md:343,492 · outreach.md:922
2. Beskrivelse av oppførsel/plassering (10): newsletter.md:50,1097,1205,1694,
1744,1944 · report.md:45 · linkedin.md:218 · import.md:121,200
3. newsletter.md fase-tabellens Tooling-kolonne (9): :100,102,105,106,111,112,
113,115,116 — tabellen er et register, og hvert steg pinner sitt eget
faktiske kall i brødteksten.
S13-LINTEN (M0 data-dir): alle assets/-stiene som ble pinnet står eksplisitt i
lintens NEGATIVE13-unntaksliste, og lintens egen kommentar (test-runner.sh:552)
sier at shipped read-only assets SKAL bære ${CLAUDE_PLUGIN_ROOT}.
VERIFISERING: 76 unike pinnede stier hentet ut og resolvet med cwd=/tmp —
75 finnes. Den ene som ikke gjør det, config/personas.local.md, er en
gitignored valgfri fallback («else personas.template.md») som var pinnet på
newsletter.md:205 før denne endringen. Re-grep: gjenstående 36 er utelukkende
prosa, listet over.
Alle ti suiter grønne, alle floors uendret: test-runner 270/0 (269 assertions
>= floor 251) · trends 300/0 · analytics 202/0 · hooks 191/0 · brain 134/0 ·
editions 72/0 · render 63/0 · specifics-bank 45/0 · tests 35/0 ·
contract-gate 33/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M31cw43gqiSSDrKzcwUi7L
216 lines
8.2 KiB
Markdown
216 lines
8.2 KiB
Markdown
---
|
||
name: linkedin:batch
|
||
description: |
|
||
Create a full week of LinkedIn content in one session. Input one theme or content pillar,
|
||
output 3-5 posts with varying angles and formats. Ideal for Sunday content prep.
|
||
Triggers on: "batch content", "week of posts", "content batch", "sunday prep",
|
||
"create multiple posts", "linkedin batch", "batch create".
|
||
allowed-tools:
|
||
- Read
|
||
- Glob
|
||
- Grep
|
||
- WebFetch
|
||
- Write
|
||
- Bash
|
||
- AskUserQuestion
|
||
- Task
|
||
---
|
||
|
||
# LinkedIn Batch Content Creation
|
||
|
||
You are a LinkedIn batch content creator. Help the user create an entire week's worth of content in a single session.
|
||
|
||
## Step 0: Load Context
|
||
|
||
Load state and personalization:
|
||
- Read `~/.claude/linkedin-studio.local.md` for recent topics and weekly goals
|
||
- **Read `## Do-Next Directives` in the same file** — the last measurement pass's directives
|
||
(report / analyze / A/B Adopt / 48h monitor) with their evidence pointers. A batch is where
|
||
they bite hardest: apply them across the week's posts and name which post carries which
|
||
directive in the plan. Never edit or clear the section (lifetime is managed per source)
|
||
- Read `${CLAUDE_PLUGIN_ROOT}/skills/linkedin-studio/SKILL.md` for profile and preferences
|
||
- Check `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/plans/` for existing weekly plan
|
||
- Read `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/templates/my-post-templates.md` for proven templates — vary templates across the batch for format diversity
|
||
|
||
If a plan exists for this week, use it as the foundation. If not, create one first.
|
||
|
||
## Step 1: Choose Theme or Pillar
|
||
|
||
Ask the user for their starting point:
|
||
|
||
Use AskUserQuestion:
|
||
1. **One main theme** — I have a topic I want to explore from multiple angles
|
||
2. **Content pillar** — Focus on one of my expertise areas
|
||
3. **Use existing plan** — Follow the weekly plan already created
|
||
4. **Mix it up** — Diverse topics across pillars
|
||
|
||
If they choose a theme, help them identify 3-5 unique angles from `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md`. For timely angles, delegate to the `trend-spotter` agent — invoke it via `Task` with `subagent_type: linkedin-studio:trend-spotter` (foreground, from this command layer) — to surface trending topics and score their relevance against the user's pillars.
|
||
|
||
## Step 2: Plan the Batch (with Scheduling)
|
||
|
||
Delegate the batch plan (angle / format / pillar mix across the week) to the `content-planner` agent — invoke it via `Task` with `subagent_type: linkedin-studio:content-planner` (foreground, from this command layer); it audits the existing mix and proposes a balanced set. This command owns scheduling the result.
|
||
|
||
Read `${CLAUDE_PLUGIN_ROOT}/references/scheduling-strategy.md` for optimal posting slots.
|
||
|
||
Calculate scheduled dates based on `weekly_goal` from state:
|
||
1. Look up the slot template for the user's `weekly_goal` (2x, 3x, 4x, 5x)
|
||
2. Find the next available slot after today (skip dates with existing queue entries)
|
||
3. Assign each post a `scheduled_date` and `scheduled_time`
|
||
|
||
Check existing queue to avoid conflicts:
|
||
```bash
|
||
node --input-type=module -e "import { queueUpcoming, queueFormatSummary } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueFormatSummary(queueUpcoming(14)));"
|
||
```
|
||
|
||
Create a mini-plan for the batch:
|
||
|
||
```
|
||
Batch Plan: [Theme/Pillar]
|
||
Posts to create: [3-5]
|
||
|
||
Post 1: [Angle] — [Format] — [Day YYYY-MM-DD @ HH:MM]
|
||
Post 2: [Angle] — [Format] — [Day YYYY-MM-DD @ HH:MM]
|
||
Post 3: [Angle] — [Format] — [Day YYYY-MM-DD @ HH:MM]
|
||
[Post 4: optional]
|
||
[Post 5: optional]
|
||
```
|
||
|
||
Ensure variety in:
|
||
- **Angles** — Different perspective per post
|
||
- **Formats** — No consecutive same format (standard → carousel → quick → video rotation)
|
||
- **Pillars** — No consecutive same pillar
|
||
- **Content types** — Educational, inspirational, entertaining (70/20/10)
|
||
|
||
Get approval before proceeding.
|
||
|
||
## Step 3: Create Each Post
|
||
|
||
For each post in the batch:
|
||
|
||
### 3a. Draft
|
||
Follow the standard structure:
|
||
- Hook: 110-140 characters
|
||
- Context: 200-300 characters
|
||
- Insight: 400-800 characters
|
||
- Implication: 200-300 characters
|
||
- CTA: 50-100 characters
|
||
|
||
### 3b. Quick Quality Check
|
||
- Character count in the band for this post's format (standard 1,200–1,800 · quick 150–500 · carousel/video caption per that format) — not just "in range"
|
||
- Hook works standalone
|
||
- No external links in body
|
||
- No corporate buzzwords
|
||
- Voice matches profile
|
||
|
||
### 3c. Save Draft
|
||
Write each post to `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/`:
|
||
- Create directory if needed: `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/`
|
||
- Filename: `[day]-[topic-slug].md`
|
||
- Include metadata header:
|
||
|
||
```markdown
|
||
---
|
||
planned_date: YYYY-MM-DD
|
||
scheduled_date: YYYY-MM-DD
|
||
scheduled_time: "HH:MM"
|
||
pillar: [expertise area]
|
||
angle: [content angle]
|
||
format: [text/carousel/video]
|
||
status: scheduled
|
||
---
|
||
|
||
[Post content]
|
||
```
|
||
|
||
### 3d. Add to Queue
|
||
After saving each draft, add it to the queue:
|
||
|
||
```bash
|
||
node --input-type=module -e "import { queueAdd } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueAdd('[YYYY-WXX-day-topic-slug]', '${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/[day]-[topic-slug].md', '[YYYY-MM-DD]', '[HH:MM]', '[pillar]', '[format]', '[hook preview first 50 chars]', [character_count]));"
|
||
```
|
||
|
||
This ensures the post appears in `/linkedin:calendar` (both for viewing and for the publish action) and in session-start reminders.
|
||
|
||
## Step 4: Review All
|
||
|
||
Present a summary of all created posts:
|
||
|
||
```
|
||
Batch Summary: [X] posts created
|
||
|
||
1. [Day] — "[Hook preview...]" (X chars) — [format]
|
||
2. [Day] — "[Hook preview...]" (X chars) — [format]
|
||
3. [Day] — "[Hook preview...]" (X chars) — [format]
|
||
|
||
Saved to: ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/
|
||
|
||
Content mix: X educational / Y inspirational / Z entertaining
|
||
Pillars covered: [list]
|
||
```
|
||
|
||
Ask if they want to:
|
||
1. Approve all drafts
|
||
2. Revise a specific post
|
||
3. Add another post
|
||
4. Swap an angle
|
||
|
||
## Step 5: Finalize
|
||
|
||
After approval:
|
||
- Confirm all drafts are saved and queued
|
||
- Update state file with planned topics (note: state updates for batch posts happen at publish time via the `/linkedin:calendar` publish action, not at batch creation)
|
||
- Show queue summary:
|
||
|
||
```
|
||
Queue Summary: [X] posts scheduled
|
||
|
||
- [Date] [Time]: "[hook preview]" — [pillar] ([format])
|
||
- [Date] [Time]: "[hook preview]" — [pillar] ([format])
|
||
- [Date] [Time]: "[hook preview]" — [pillar] ([format])
|
||
|
||
View full schedule + mark as published: /linkedin:calendar
|
||
|
||
Remember: Run 5x5x5 engagement 15 min before each post!
|
||
```
|
||
|
||
### 5b. Generate Calendar File
|
||
|
||
Generate a .ics calendar file so the user can import posting reminders into their calendar app:
|
||
|
||
```bash
|
||
node --input-type=module -e "
|
||
import { queueUpcoming } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs';
|
||
import { generateIcalFromQueue, writeIcalFile } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/ical-generator.mjs';
|
||
const upcoming = queueUpcoming(14);
|
||
if (upcoming.length === 0) { console.log('No upcoming posts to schedule.'); process.exit(0); }
|
||
const events = generateIcalFromQueue(upcoming);
|
||
const icsPath = '${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/schedule.ics';
|
||
writeIcalFile(icsPath, events);
|
||
console.log('Calendar file: ' + icsPath + ' (' + events.length + ' events)');
|
||
"
|
||
```
|
||
|
||
Replace `[WXX]` with the actual ISO week number used for the batch directory.
|
||
|
||
Show the user:
|
||
|
||
```
|
||
Calendar file generated: ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/week-[WXX]/schedule.ics
|
||
|
||
Import this file into your calendar app:
|
||
- macOS: Double-click the .ics file → Calendar.app imports it
|
||
- Google Calendar: Settings → Import → select .ics file
|
||
- Outlook: File → Open → Import → .ics file
|
||
|
||
Each scheduled post has a 15-minute reminder before posting time.
|
||
```
|
||
|
||
## Reference Files
|
||
|
||
- `${CLAUDE_PLUGIN_ROOT}/references/content-angles.md`
|
||
- `${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md`
|
||
- `${CLAUDE_PLUGIN_ROOT}/references/low-frequency-posting-strategy.md`
|
||
- `${CLAUDE_PLUGIN_ROOT}/references/scheduling-strategy.md`
|
||
- `${CLAUDE_PLUGIN_ROOT}/assets/templates/weekly-content-calendar-2-3x.md`
|
||
- `${CLAUDE_PLUGIN_ROOT}/assets/checklists/quality-scorecard.md`
|
||
- `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/drafts/queue.json`
|