From academic-writer
First-time setup for Academic Writer — creates researcher profile, detects integrations, analyzes writing style from past articles
npx claudepluginhub yodem/academic-writer --plugin academic-writerThis skill uses the workspace's default tool permissions.
Quick onboarding wizard. Creates the researcher profile, detects integrations, and optionally fingerprints writing style. For deeper initialization (full 25-dimension style analysis, source indexing), run `/academic-writer:init`.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Quick onboarding wizard. Creates the researcher profile, detects integrations, and optionally fingerprints writing style. For deeper initialization (full 25-dimension style analysis, source indexing), run /academic-writer:init.
Run silently before anything else:
mkdir -p past-articles .academic-helper .cognetivy/runs .cognetivy/events
If cognetivy is available, start a setup run:
echo '{"phase": "setup"}' > /tmp/aw-setup-input.json
cognetivy run start --input /tmp/aw-setup-input.json --name "Academic Writer Setup"
Capture the run_id for logging at each step.
Migrate any legacy profile from .academic-writer/profile.json → .academic-helper/profile.md:
python3 << 'PYTHON'
import os, json, re
from datetime import datetime
old_path = '.academic-writer/profile.json'
new_path = '.academic-helper/profile.md'
if os.path.exists(old_path) and not os.path.exists(new_path):
with open(old_path) as f:
p = json.load(f)
scalar_keys = ['fieldOfStudy', 'citationStyle', 'targetLanguage', 'updatedAt', 'createdAt']
list_keys = ['abstractLanguages', 'analyzedArticles']
json_sections = [
('tools', 'Tools'), ('outputFormatPreferences', 'Output Format Preferences'),
('styleFingerprint', 'Style Fingerprint'), ('articleStructure', 'Article Structure'),
('sources', 'Sources'),
]
lines = ['# Academic Writer Profile', '', '---']
for k in scalar_keys:
if k in p and p[k] is not None:
lines.append(f'{k}: {p[k]}')
for k in list_keys:
v = p.get(k) or []
if not v:
lines.append(f'{k}: []')
else:
lines.append(f'{k}:')
for item in v:
lines.append(f' - {item}')
lines.append('---')
lines.append('')
for k, heading in json_sections:
if k in p and p[k] is not None:
lines.extend([f'## {heading}', '', '```json',
json.dumps(p[k], indent=2, ensure_ascii=False), '```', ''])
os.makedirs('.academic-helper', exist_ok=True)
with open(new_path, 'w') as f:
f.write('\n'.join(lines))
print(f"Migrated profile to {new_path}")
PYTHON
Check for existing profile:
cat .academic-helper/profile.md 2>/dev/null && echo "EXISTS" || echo "NOT_FOUND"
If EXISTS, load and show current settings, then:
AskUserQuestion(questions=[{
"question": "A profile already exists. What would you like to do?",
"header": "Existing profile detected",
"options": [
{
"label": "Update existing profile",
"description": "Keep existing data, modify only selected fields.",
"markdown": "```\nUpdate Mode\n───────────\n✓ Existing settings preserved\n→ Only re-run steps you choose\n```"
},
{
"label": "Start fresh",
"description": "Delete and recreate from scratch.",
"markdown": "```\nFresh Start\n───────────\n⚠ Current profile will be replaced\n→ Walk through all steps again\n```"
}
],
"multiSelect": false
}])
Run ALL detection commands in one parallel batch:
# PARALLEL
Bash(command="command -v ck >/dev/null 2>&1 && echo 'ck: DETECTED' || echo 'ck: NOT_FOUND'")
Bash(command="curl -s --max-time 3 http://localhost:8000/health 2>/dev/null && echo 'vectorless: RUNNING' || echo 'vectorless: NOT_RUNNING'")
Bash(command="command -v cognetivy >/dev/null 2>&1 && echo 'cognetivy: DETECTED' || echo 'cognetivy: NOT_FOUND'")
Bash(command="command -v nlm >/dev/null 2>&1 && nlm login --check 2>/dev/null && echo 'notebooklm: DETECTED' || echo 'notebooklm: NOT_FOUND'")
If vectorless NOT_RUNNING on port 8000:
AskUserQuestion(questions=[{
"question": "Agentic-Search-Vectorless didn't respond on port 8000. What port is it running on?",
"header": "Vectorless port",
"options": [
{"label": "Skip — not running right now", "description": "You can enable it later with /academic-writer:update-tools."}
],
"multiSelect": false
}])
Retry with the provided port; save to tools.agentic-search-vectorless.port.
MongoDB Agent Skills is auto-configured silently — do not show it to the user.
AskUserQuestion(questions=[{
"question": "What is your field of study and area of specialization?",
"header": "Step 1 — Field of Study",
"options": []
}])
"The more specific, the better. Examples: Early Modern Jewish Philosophy, Talmudic Literature, Biblical Studies — Pentateuch"
AskUserQuestion(questions=[{
"question": "What language will you write your articles in?",
"header": "Step 2 — Article Language",
"options": [
{
"label": "Hebrew",
"description": "RTL, David font, inline-parenthetical citations.",
"markdown": "```\nHebrew Mode\n───────────\nDirection: RTL\nFont: David 11pt\nCitations: (מחבר, כותרת, עמ' N)\n```"
},
{
"label": "English",
"description": "LTR, Times New Roman, Chicago/MLA/APA.",
"markdown": "```\nEnglish Mode\n────────────\nDirection: LTR\nFont: Times New Roman 12pt\n```"
},
{
"label": "Other",
"description": "You'll type the language name in the next prompt.",
"markdown": "```\nOther\n─────\n→ Type the language name\n→ RTL/LTR auto-detected\n```"
}
],
"multiSelect": false
}])
AskUserQuestion(questions=[{
"question": "Which citation style do you use?",
"header": "Step 3 — Citation Style",
"options": [
{
"label": "Inline Parenthetical (Recommended for Hebrew)",
"description": "(Author, Title, Page) in running text.",
"markdown": "```\nExample: (לוי, משנת הנפש, עמ' 42)\n```"
},
{
"label": "Chicago / Turabian",
"description": "Footnotes with full bibliography.",
"markdown": "```\nExample footnote: ¹ Levy, Soul's Teaching, 42.\n```"
},
{
"label": "MLA",
"description": "Parenthetical with Works Cited.",
"markdown": "```\nExample: (Levy 42)\n```"
},
{
"label": "APA",
"description": "(Author, Year) — more common in social sciences.",
"markdown": "```\nExample: (Levy, 2019, p. 42)\n```"
}
],
"multiSelect": false
}])
AskUserQuestion(questions=[{
"question": "Which integrations would you like to enable?",
"header": "Step 4 — Tools",
"options": [
{
"label": "Candlekeep",
"description": "✓ Detected / ✗ Not found",
"markdown": "```\nCandlekeep\n──────────\nType: CLI (ck)\nWhat: Cloud document library\n```"
},
{
"label": "Agentic-Search-Vectorless",
"description": "✓ Running / ✗ Not running",
"markdown": "```\nAgentic-Search-Vectorless\n─────────────────────────\nType: Local HTTP service\nWhat: Fast semantic citation search\n```"
},
{
"label": "Cognetivy",
"description": "✓ Detected / ✗ Not found",
"markdown": "```\nCognetivy\n─────────\nType: CLI\nWhat: Workflow audit trail\n\nInstall: npm install -g cognetivy\nInit: timeout 5 cognetivy init --workspace-only\n```"
},
{
"label": "NotebookLM",
"description": "✓ Detected / ✗ Not found",
"markdown": "```\nNotebookLM\n──────────\nType: MCP server (nlm CLI)\nWhat: AI-powered source Q&A,\n audio overviews, study guides\n\nInstall: npm install -g notebooklm-mcp-cli\nAuth: nlm login\n```"
}
],
"multiSelect": true
}])
Pre-check tools that were detected. MongoDB Agent Skills is silently included always.
Check for past articles:
ls past-articles/ 2>/dev/null | wc -l
AskUserQuestion(questions=[{
"question": "Found N papers in past-articles/. Analyze them for style fingerprinting?",
"header": "Writing style (optional)",
"options": [
{
"label": "Yes, analyze my writing style (Recommended)",
"description": "Extracts your voice across 25 dimensions so articles sound like you.",
"markdown": "```\nStyle Analysis\n──────────────\n→ Reads PDF and DOCX in past-articles/\n→ Analyzes 25 dimensions:\n sentence patterns, vocabulary,\n paragraph structure, transitions,\n citation density, rhetorical moves\n→ Shows fingerprint before saving\n→ You can correct anything\n```"
},
{
"label": "Skip for now",
"description": "Articles will use generic academic style until you run this.",
"markdown": "```\nSkip\n────\n⚠ No style fingerprint yet\n→ Add papers to past-articles/ anytime\n→ Re-run: /academic-writer:init\n```"
}
],
"multiSelect": false
}])
If no files found, show only the "Skip" option with instructions to add papers.
If "Yes": analyze across all 25 dimensions (sentence level, vocabulary, paragraph structure, tone, transitions, citation style, rhetorical patterns, representative excerpts, article structure). Show fingerprint summary and confirm before saving.
Use the Write tool to create .academic-helper/profile.md:
# Academic Writer Profile
---
fieldOfStudy: FIELD
citationStyle: inline-parenthetical
targetLanguage: Hebrew
abstractLanguages:
- Hebrew
analyzedArticles: []
createdAt: ISO_TIMESTAMP
updatedAt: ISO_TIMESTAMP
---
## Tools
```json
{
"candlekeep": { "enabled": true },
"agentic-search-vectorless": { "enabled": true, "port": 8000 },
"cognetivy": { "enabled": true },
"notebooklm": { "enabled": false }
}
` ` `
## Output Format Preferences
```json
{
"font": "David",
"bodySize": 11,
"titleSize": 16,
"headingSize": 13,
"lineSpacing": 1.5,
"marginInches": 1.0,
"alignment": "justify",
"rtl": true
}
` ` `
## Style Fingerprint
```json
null
` ` `
## Sources
```json
[]
` ` `
(Replace backtick triplets with actual ``` when writing the file.)
If Cognetivy is enabled, register workflows:
# Resolve plugin directory from Claude plugin cache
AW_PLUGIN_DIR=$(find ~/.claude/plugins/cache -name "wf_write_article.json" -path "*/workflows/*" 2>/dev/null | head -1 | xargs dirname 2>/dev/null)
if [ -z "$AW_PLUGIN_DIR" ]; then
echo "Warning: Could not find academic-writer workflows in plugin cache. Skipping workflow registration."
else
cognetivy workflow set --file "$AW_PLUGIN_DIR/wf_write_article.json"
cognetivy workflow set --file "$AW_PLUGIN_DIR/wf_edit_article.json"
cognetivy workflow set --file "$AW_PLUGIN_DIR/wf_edit_section.json"
cognetivy workflow set --file "$AW_PLUGIN_DIR/wf_research.json"
cognetivy workflow set --file "$AW_PLUGIN_DIR/wf_setup.json"
cognetivy collection-schema set --file "$AW_PLUGIN_DIR/collection-schemas.json"
fi
Complete the Cognetivy run:
cognetivy run complete --run <run_id>
AskUserQuestion(questions=[{
"question": "Setup complete. What would you like to do next?",
"header": "You're all set!",
"options": [
{
"label": "Write my first article → /academic-writer:write",
"description": "Start the writing pipeline now.",
"markdown": "```\n/academic-writer:write\n────────────────\nConversational pipeline:\nsubject → sources → thesis\n→ outline → write → .docx\n```"
},
{
"label": "Run deeper initialization → /academic-writer:init",
"description": "Full style analysis (25 dimensions) and source indexing.",
"markdown": "```\n/academic-writer:init\n─────────────────────\n→ Deep 25-dimension fingerprint\n→ Article structure analysis\n→ Candlekeep source indexing\n```"
},
{
"label": "Done for now",
"description": "Profile saved. Run /academic-writer:write anytime.",
"markdown": "```\nKey commands:\n /academic-writer:write ← write\n /academic-writer:health ← check\n /academic-writer:update-tools ← change tools\n```"
}
],
"multiSelect": false
}])
Show summary table:
Setting Value Field [field] Language [language] Citation style [style] Tools enabled [list] Style fingerprint ✓ Analyzed / — Skipped