refactor(linkedin)!: rename plugin linkedin-thought-leadership → linkedin-studio (v3.0.0)
BREAKING CHANGE: the marketplace slug, the agent namespace (linkedin-studio:<agent>), and the runtime state-file path (~/.claude/linkedin-studio.local.md) all change. Reinstall required; existing state migrated in place (post metrics, streak, history preserved). The /linkedin:* commands are unchanged — the command namespace is set per-command in frontmatter and was always independent of the plugin slug. Functionality is byte-identical to v2.4.0; this release is pure identity. - dir + manifests: plugins/linkedin-studio + plugin.json + root marketplace.json - agent namespace updated in commands/newsletter.md (only functional invoker) - state path updated in 4 hook scripts + topic-rotation prompt + state template - catch-all skill dir renamed skills/linkedin-studio (5 functional skills unchanged) - docs + version bump to 3.0.0 across README badge, CHANGELOG, root README/CLAUDE.md - historical records (CHANGELOG past entries, docs/ build artifacts, config-audit v5.0.0 snapshots) intentionally retain the old slug Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
9df3de795c
commit
b6bb61246b
196 changed files with 164 additions and 138 deletions
|
|
@ -0,0 +1,85 @@
|
|||
Before ending this LinkedIn content session, do two things:
|
||||
|
||||
**1. Update State File**
|
||||
If a post was created or finalized in this session, use the state-updater script:
|
||||
```bash
|
||||
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: 'First 60 chars of hook...',
|
||||
charCount: NNNN,
|
||||
format: 'post'
|
||||
}));
|
||||
"
|
||||
```
|
||||
Replace the placeholder values with actual post data from this session.
|
||||
|
||||
If the user mentioned or updated their follower count during this session:
|
||||
```bash
|
||||
node --input-type=module -e "
|
||||
import { writeState, updateFollowerCount } from '${CLAUDE_PLUGIN_ROOT}/hooks/scripts/state-updater.mjs';
|
||||
writeState(content => updateFollowerCount(content, {
|
||||
count: NNNN,
|
||||
month: 'YYYY-MM'
|
||||
}));
|
||||
"
|
||||
```
|
||||
|
||||
- Clear `next_planned_topic` if it was used, or set it to the next suggested topic
|
||||
- If analytics data was imported in this session, set `last_import_date` to today (YYYY-MM-DD) and `last_import_week` to current ISO week (YYYY-WXX)
|
||||
|
||||
**2. Pre-Publish Reminders** (only if a post was created)
|
||||
|
||||
- **Quality Check**: Has content been reviewed against quality scorecard? Hook 110-140 chars, 1,200-1,800 chars total, authentic tone, no external links.
|
||||
- **5x5x5 Engagement**: Before posting, complete 15-20 min pre-posting engagement — 5 people with overlapping audiences, find their recent posts, write 5 thoughtful comments (15+ words each).
|
||||
- **First-Hour Plan**: Respond within 5 minutes to first comments. Add value in responses. Target 15+ engagements in first hour.
|
||||
- **Posting Time**: Post when target audience is most active.
|
||||
|
||||
**3. Queue Status Check**
|
||||
|
||||
If posts were added to the queue during this session (`assets/drafts/queue.json` was modified):
|
||||
- Confirm how many posts were queued and their scheduled dates
|
||||
- Remind: "View your full schedule with /linkedin:calendar"
|
||||
|
||||
If a scheduled post was published during this session:
|
||||
- Verify it was marked as published in queue.json (status = "published")
|
||||
- If not, remind: "Run /linkedin:calendar to mark the post as published and update queue status"
|
||||
|
||||
Provide reminders naturally based on what was done in the session. If no LinkedIn content was created, skip the reminders and just ensure state is consistent.
|
||||
|
||||
**4. Voice Sample Collection** (if a post was created)
|
||||
|
||||
If a LinkedIn post was created or finalized in this session, save the full post text as a voice sample:
|
||||
|
||||
- Read the full post text from the draft that was just created
|
||||
- Check if `assets/voice-samples/authentic-voice-samples.md` exists
|
||||
- Append the full post to the `## Collected Post Samples` section:
|
||||
```
|
||||
### [YYYY-MM-DD] — [post type] ([char count] chars)
|
||||
[Full post text exactly as written]
|
||||
```
|
||||
- **Ask the user for confirmation** before writing: "I'll save this post as a voice sample for drift detection. OK?"
|
||||
- This builds the voice sample library that enables automatic drift scoring (needs 5+ samples for reliable scoring)
|
||||
- The more samples collected, the more accurate the voice-trainer's drift detection becomes
|
||||
|
||||
**5. Content History Log** (if a post was created)
|
||||
|
||||
If a LinkedIn post was created or finalized, append an entry to the content history log:
|
||||
|
||||
- If `assets/analytics/content-history.md` does not exist, initialize it from `config/content-history.template.md`
|
||||
- Append a new row to the "## Content Log" table:
|
||||
```
|
||||
| YYYY-MM-DD | "Hook text..." | topic_area | format | word_count | char_count | source |
|
||||
```
|
||||
Where:
|
||||
- `date`: Today's date
|
||||
- `hook`: First 60 characters of the hook line
|
||||
- `topic`: Matching expertise_area value (for pillar tracking)
|
||||
- `format`: post/quick/react/video/pipeline
|
||||
- `word_count`: Word count of the full post
|
||||
- `char_count`: Character count of the full post
|
||||
- `source`: original/url/curated (where the idea came from)
|
||||
- This is append-only — never edit or delete existing entries
|
||||
- This log enables `/linkedin:report` and `analytics-interpreter` to track content production over time without requiring LinkedIn CSV imports
|
||||
Loading…
Add table
Add a link
Reference in a new issue