feat(linkedin-thought-leadership): v1.1.0 — Q2 2026 feature release
9 improvements across 3 tracks: Onboarding: /linkedin:onboarding wizard, README Quick Start rewrite Content Quality: voice drift scoring, industry angle variants, /linkedin:carousel, /linkedin:react multi-URL comparison Analytics: automated week-rollover, day-of-week heatmap, month-over-month reports 25→27 commands. All Q2 ROADMAP items completed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
abf7322200
commit
1a8cc1942c
33 changed files with 1726 additions and 236 deletions
|
|
@ -7,6 +7,7 @@ import { join, dirname } from 'node:path';
|
|||
import { fileURLToPath } from 'node:url';
|
||||
import { calculateScore } from './personalization-score.mjs';
|
||||
import { queueToday, queueOverdue, queueUpcoming } from './queue-manager.mjs';
|
||||
import { applyWeekRollover } from './week-rollover.mjs';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const PLUGIN_ROOT = join(__dirname, '..', '..');
|
||||
|
|
@ -135,11 +136,17 @@ if (existsSync(STATE_FILE)) {
|
|||
}
|
||||
}
|
||||
|
||||
// Week rollover check
|
||||
// Week rollover — auto-reset posts_this_week on week change
|
||||
const actualWeek = isoWeek();
|
||||
let weekResetNote = '';
|
||||
if (currentWeek && currentWeek !== actualWeek) {
|
||||
weekResetNote = `Note: Week has changed from ${currentWeek} to ${actualWeek}. posts_this_week should be reset to 0.`;
|
||||
try {
|
||||
const rollover = applyWeekRollover(stateContent, currentWeek, actualWeek);
|
||||
if (rollover) {
|
||||
writeFileSync(STATE_FILE, rollover.content, 'utf-8');
|
||||
weekResetNote = rollover.message;
|
||||
}
|
||||
} catch (err) {
|
||||
weekResetNote = `Warning: Week rollover failed (${err.message}). Manual reset may be needed.`;
|
||||
}
|
||||
|
||||
// Build status line
|
||||
|
|
@ -253,9 +260,7 @@ if (existsSync(STATE_FILE)) {
|
|||
}
|
||||
|
||||
// Personalization score check
|
||||
if (pScore !== null && pScore === 0) {
|
||||
context += '## Quick Win\\nPersonalization: 0%. Run /linkedin:setup (15 min) to unlock voice-matched, audience-specific content.\\n\\n';
|
||||
} else if (pScore !== null && pScore < 50) {
|
||||
if (pScore !== null && pScore < 50) {
|
||||
reminders += `- Personalization score is ${pScore}%. Run /linkedin:setup to improve content quality with your real voice, case studies, and audience data.\\n`;
|
||||
}
|
||||
|
||||
|
|
@ -369,13 +374,8 @@ if (existsSync(STATE_FILE)) {
|
|||
content = content.replace(/^current_week: .*/m, `current_week: "${actualWeek}"`);
|
||||
writeFileSync(STATE_FILE, content);
|
||||
context = `LinkedIn state file auto-initialized from template at ${STATE_FILE}.\\n`;
|
||||
context += `Current ISO week set to ${actualWeek}.\\n\\n`;
|
||||
context += '## Welcome to LinkedIn Thought Leadership\\n\\n';
|
||||
context += 'Your state file has been initialized. Here is how to get started:\\n\\n';
|
||||
context += '1. Run /linkedin:profile — Optimize your LinkedIn profile for 360Brew (critical before first post)\\n';
|
||||
context += '2. Run /linkedin:setup — Personalize with your voice, case studies, and audience data\\n';
|
||||
context += '3. Run /linkedin:first-post — Create your first post in under 10 minutes\\n\\n';
|
||||
context += 'Your personalization score is 0%. Content quality improves as you fill in your profile.\\n';
|
||||
context += `Current ISO week set to ${actualWeek}.\\n`;
|
||||
context += 'Edit the file to set your expertise_areas and weekly_goal.\\n';
|
||||
} else {
|
||||
context = `No LinkedIn state file found at ${STATE_FILE} and template missing.\\n`;
|
||||
context += `Expected template at: ${templateFile}\\n`;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue