linkedin-studio/commands/batch.md
Kjell Tore Guttormsen af80150019 feat(linkedin-studio): N23 — positioning-brief-motor (generering + konsum) [skip-docs]
Persistert posisjonering som alle drafts bindes mot. Innplassert i
/linkedin:setup (Step 3g) etter operatør-friksjonskriteriet — setup eier
allerede ${DATA}/profile/ og har menyen; telling forblir 30.

- config/positioning-brief.template.md (NY): fire seksjoner (Who I am ·
  Who this is for · What I hold · How I differ), hver med _Evidence:_-linje.
- setup.md Step 3g: DELEGERER til linkedin-studio:strategy-advisor.
  Brain-konsum-blokken forblir i én kopi (N21-lærdommen), lint-håndhevet.
- strategy-advisor.md: distillasjonen, kildepresedens, anti-flatteri
  (What I hold må bære påstander en leser kan være UENIG i) og
  evidensgulv ([insufficient evidence] framfor plausibel oppfinnelse).
- Distillat, ikke andre profil: briefen REFERERER user-profile.md framfor
  å gjenta den. Operatørens deklarasjon og daterte anker slår maskinens
  inferens; motstrid rapporteres som spenning, aldri stille anvendt.
- Konsum: post/quick/batch + newsletter Step 1 + differentiation-checker
  (scorer originalitet mot How I differ, ikke generisk nyhet).
- Regenerering er operatør-gatet: explicit go + seksjonsvis diff + aldri
  stille overskriving av operatørens egne redigeringer.

Lint: Section 16y, 17 nye ubetingede sjekker (self-test 1 akseptert /
4 underspesifiserte avvist). Floor 251 → 268. Alle ti suiter grønne:
test-runner 270→287/0 · trends 300 · analytics 202 · hooks 191 · brain 134
· editions 72 · render 63 · specifics-bank 45 · tests 35 · contract-gate 33.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbwkH8phPsgv9xFd8Qbq7E
2026-07-31 21:01:55 +02:00

8.7 KiB
Raw Blame History

name description allowed-tools
linkedin:batch 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".
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
  • Read ${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/positioning-brief.md — the week's posts must add up to one position, not five unrelated takes. Use What I hold to keep the batch arguing from the same stance, and How I differ as the check on the plan as a whole: if the week could have been produced by any account in the niche, revise the plan before writing. Absent file: proceed silently

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:

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: 250-350 characters
  • Insight: 550-850 characters
  • Implication: 250-350 characters
  • CTA: 50-100 characters

Sum: 1,210-1,790 characters — inside the standard 1,2001,800 band checked in 3b.

3b. Quick Quality Check

  • Character count in the band for this post's format (standard 1,2001,800 · quick 150500 · 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:
---
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:

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:

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