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-writer# Auto-generated from skills/setup/SKILL.md
# Academic Writer Setup
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`.
## Phase 0: Preflight
Run silently before anything else:
If cognetivy is available, start a setup run:
Capture the `run_id` for logging at each step.
Migrate any legacy profile from `.academic-writer/profile.json` → `.academic-helper/profile.md`:
json',
json.dum.../setupInitializes or resumes project setup via interactive Q&A, creating conductor/ artifacts for product definition, guidelines, tech stack, workflow, and style guides.
/setupDetects ghost or inconsistent claude-hud plugin installations (orphaned cache, stale registry, temp files) and offers cleanup on user confirmation for macOS/Linux/Windows.
/setupChecks local Codex CLI readiness, prompts to install if unavailable via npm, and optionally toggles stop-time review gate.
/setupGuides enterprise admins through Claude Office add-in setup for Vertex AI, Bedrock, or custom gateway; provisions credentials and generates deployable manifest.xml.
/setupRuns interactive setup wizard: detects AI providers (Codex, Gemini, Ollama, etc.), installs missing ones via Bash, configures auth, and sets up RTK token optimization.
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