Step 17 of voyage-build (S16 in plan). publish.md absorbed into calendar.md as an inline action (Mark as Published flow: queue update, state update, first-hour battle plan) reusing the same queue-manager.mjs + state-updater.mjs primitives that publish.md called. calendar.md frontmatter triggers extended with the publish trigger words; quick-routing block jumps straight to the publish action when the user prompt names it. All 21 route-refs reconciled across the 9 expected files, with the 9 hook-script refs (5 in session-start.mjs, 2 in posting-reminder.mjs, 1 in user-prompt-context.mjs, 1 in hooks/prompts/state-update-reminder.md) rewritten to call /linkedin:calendar so the runtime guidance no longer points at a dead command. compile-hooks.py --check reports clean (no type: prompt hook changes touched hooks.json). Verify (intent: zero stray refs, file gone): exit 0. Literal Verify in plan.md:727 logged exit 1 (same exit-inverted && pattern as S15 plan.md:635 — logged for plan-pass at Step 21). Manifest audit: PASS (expected_paths=calendar.md present; must_contain [Pp]ublish: 17 matches in calendar.md). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
6.3 KiB
| name | description | allowed-tools | |||||
|---|---|---|---|---|---|---|---|
| linkedin:calendar | View and manage your post scheduling queue. Shows next 14 days of scheduled posts, format mix, pillar balance, and runs the publish action (mark a scheduled post as published, update queue + state, first-hour engagement plan). Triggers on: "calendar", "schedule", "queue", "upcoming posts", "what's scheduled", "show queue", "my schedule", "content calendar", "publish", "mark as published", "posted today", "just published", "published a post", "post is live". |
|
LinkedIn Content Calendar
You are a LinkedIn content calendar manager. Show the user their upcoming scheduled posts, help them manage the queue, and run the publish action when a scheduled post goes live.
Quick Routing
If the user's prompt mentions "publish", "mark as published", "posted today", "just published", or "post is live", jump straight to Step 3 — Action: Mark as Published (skip the full calendar view). Otherwise start at Step 1.
Step 1: Load Queue
Read the queue file and check for scheduled/overdue entries:
node --input-type=module -e "
import { queueToday, queueUpcoming, queueOverdue, queueCount, queueFormatSummary } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs';
console.log('=== TODAY ===');
console.log(queueFormatSummary(queueToday()));
console.log('=== UPCOMING 14 DAYS ===');
console.log(queueFormatSummary(queueUpcoming(14)));
console.log('=== OVERDUE ===');
console.log(queueFormatSummary(queueOverdue()));
console.log('=== COUNTS ===');
console.log(JSON.stringify(queueCount(), null, 2));
"
Also read state for context:
~/.claude/linkedin-thought-leadership.local.mdfor weekly goal and current progress
Step 2: Display Calendar View
Present a 14-day calendar view:
Content Calendar: [YYYY-MM-DD] to [YYYY-MM-DD]
Weekly goal: X posts/week
Week [YYYY-WXX]:
Mon [date]: —
Tue [date]: "[hook preview]" — [pillar] ([format]) [SCHEDULED]
Wed [date]: —
Thu [date]: "[hook preview]" — [pillar] ([format]) [SCHEDULED]
Fri [date]: —
Sat [date]: "[hook preview]" — [pillar] ([format]) [SCHEDULED]
Sun [date]: —
Week [YYYY-WXX+1]:
[same format]
Queue stats: X scheduled | Y published | Z overdue
Format mix: X standard, Y carousel, Z quick
Pillars: [pillar counts]
If there are overdue posts (past scheduled date, still "scheduled"), highlight them:
OVERDUE:
[date]: "[hook preview]" — Should have been posted [N days ago]
Step 3: Offer Actions
Use AskUserQuestion:
- Mark as published — A scheduled post is live; update queue + state + show first-hour plan
- Reschedule a post — Move a post to a different date/time
- Cancel a post — Remove from queue (set status to "cancelled")
- View a draft — Read the full draft content
- Looks good — No changes needed
Action: Mark as Published
This is the publish flow (no separate command — runs inline here).
3a. Show publishable posts. Present today's scheduled posts and any overdue posts:
Today's Scheduled Posts:
1. "[hook preview]" — [pillar] ([format]) — Scheduled for [time]
2. "[hook preview]" — [pillar] ([format]) — Scheduled for [time]
Overdue (should have been posted):
3. "[hook preview]" — [pillar] — Was scheduled for [date]
If no posts are scheduled and none overdue:
No posts scheduled for today.
- Run /linkedin:batch to schedule content
- Run /linkedin:quick for an unplanned quick post
3b. Pick a post. Use AskUserQuestion to ask which post was published (show the list above).
3c. Update queue status:
node --input-type=module -e "import { queueUpdateStatus } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueUpdateStatus('[post-id]', 'published'));"
3d. Update state file deterministically:
node --input-type=module -e "
import { writeState, updatePostTracking } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/state-updater.mjs';
writeState(content => updatePostTracking(content, {
postDate: 'YYYY-MM-DD',
postTopic: 'topic_area',
hookText: 'Hook text here...',
charCount: NNNN,
format: 'FORMAT'
}));
"
Replace placeholders with actual post data from the published post.
3e. First-hour battle plan. Show after marking:
Post marked as published! Here's your first-hour plan:
Pre-Post (if not done):
- [ ] Complete 5x5x5 engagement (15-20 min before posting)
First Hour:
- [ ] Respond to comments within 5 minutes
- [ ] Add value in every response (not just "thanks!")
- [ ] Ask follow-up questions to deepen conversation
- [ ] Target: 15+ engagements in first 60 minutes
- [ ] Check back at 30-min and 60-min marks
48-Hour Check-In:
- Run /linkedin:analyze after 48 hours to review performance
- Or use post-feedback-monitor agent for real-time tracking
3f. Ask about more. Use AskUserQuestion:
- Mark another post — I published more than one (loop back to 3a)
- View calendar — Show remaining schedule (loop back to Step 2)
- Done — All set for now
Action: Reschedule
If they choose to reschedule:
- Ask which post (by number or hook preview)
- Ask for new date and time
- Update queue.json via queue_update_status + queue_add with new date
- Show updated calendar
Action: Cancel
If they choose to cancel:
- Ask which post
- Confirm cancellation
- Update status to "cancelled":
node --input-type=module -e "import { queueUpdateStatus } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/queue-manager.mjs'; console.log(queueUpdateStatus('[post-id]', 'cancelled'));"
Action: View Draft
If they want to see a draft:
- Ask which post
- Read the draft file from the
draft_path - Display full content
Step 4: Balance Analysis
After showing the calendar (or after a publish action loops back), provide brief analysis:
- Format diversity: Are formats varied enough? Flag if >2 consecutive same format.
- Pillar balance: Are pillars well-distributed? Flag if any pillar >50%.
- Gap detection: Are there multi-day gaps that could hurt momentum?
- Weekly goal alignment: Will the schedule meet the weekly goal?
Reference Files
${CLAUDE_PLUGIN_ROOT}/references/scheduling-strategy.md${CLAUDE_PLUGIN_ROOT}/references/engagement-frameworks.md${CLAUDE_PLUGIN_ROOT}/assets/drafts/queue.json