@riotprompt/riotdoc 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/schema.ts","../src/voice/prompt-builder.ts","../src/style/validator.ts","../src/style/reporter.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const DocumentConfigSchema = z.object({\n id: z.string(),\n title: z.string(),\n type: z.enum([\"blog-post\", \"podcast-script\", \"technical-doc\", \"newsletter\", \"custom\"]),\n status: z.enum([\"idea\", \"outlined\", \"drafting\", \"revising\", \"final\", \"exported\"]),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n targetWordCount: z.number().optional(),\n audience: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const VoiceConfigSchema = z.object({\n tone: z.string(),\n pointOfView: z.enum([\"first\", \"second\", \"third\"]),\n styleNotes: z.array(z.string()),\n avoid: z.array(z.string()),\n examplePhrases: z.array(z.string()).optional(),\n});\n\nexport const DocumentObjectivesSchema = z.object({\n primaryGoal: z.string(),\n secondaryGoals: z.array(z.string()),\n callToAction: z.string().optional(),\n keyTakeaways: z.array(z.string()),\n emotionalArc: z.string().optional(),\n});\n","import type { VoiceConfig } from \"../types.js\";\n\n/**\n * Build a prompt section describing the voice/tone\n */\nexport function buildVoicePrompt(voice: VoiceConfig): string {\n const sections: string[] = [];\n \n sections.push(`## Writing Voice\\n`);\n sections.push(`Tone: ${voice.tone}`);\n sections.push(`Point of view: ${formatPointOfView(voice.pointOfView)}`);\n \n if (voice.styleNotes.length > 0) {\n sections.push(`\\n### Style Guidelines\\n`);\n sections.push(`Do:\\n${voice.styleNotes.map(n => `- ${n}`).join(\"\\n\")}`);\n }\n \n if (voice.avoid.length > 0) {\n sections.push(`\\nAvoid:\\n${voice.avoid.map(a => `- ${a}`).join(\"\\n\")}`);\n }\n \n if (voice.examplePhrases && voice.examplePhrases.length > 0) {\n sections.push(`\\n### Example Phrases\\n`);\n sections.push(voice.examplePhrases.map(p => `\"${p}\"`).join(\"\\n\"));\n }\n \n return sections.join(\"\\n\");\n}\n\nfunction formatPointOfView(pov: \"first\" | \"second\" | \"third\"): string {\n switch (pov) {\n case \"first\": return \"First person (I, we)\";\n case \"second\": return \"Second person (you)\";\n case \"third\": return \"Third person (they, it)\";\n }\n}\n","export interface StyleViolation {\n rule: string;\n message: string;\n line?: number;\n severity: \"error\" | \"warning\" | \"info\";\n}\n\nexport interface StyleValidationResult {\n valid: boolean;\n violations: StyleViolation[];\n stats: DocumentStats;\n}\n\nexport interface DocumentStats {\n wordCount: number;\n sentenceCount: number;\n paragraphCount: number;\n avgWordsPerSentence: number;\n avgSentencesPerParagraph: number;\n}\n\n/**\n * Validate document content against style rules\n */\nexport function validateStyle(\n content: string,\n rules: StyleRules\n): StyleValidationResult {\n const violations: StyleViolation[] = [];\n const stats = calculateStats(content);\n \n // Check word count\n if (rules.maxWordCount && stats.wordCount > rules.maxWordCount) {\n violations.push({\n rule: \"max-word-count\",\n message: `Document has ${stats.wordCount} words, exceeds max of ${rules.maxWordCount}`,\n severity: \"warning\",\n });\n }\n \n if (rules.minWordCount && stats.wordCount < rules.minWordCount) {\n violations.push({\n rule: \"min-word-count\",\n message: `Document has ${stats.wordCount} words, below min of ${rules.minWordCount}`,\n severity: \"warning\",\n });\n }\n \n // Check sentence length\n if (rules.maxSentenceLength) {\n const longSentences = findLongSentences(content, rules.maxSentenceLength);\n for (const sentence of longSentences) {\n violations.push({\n rule: \"sentence-length\",\n message: `Sentence has ${sentence.wordCount} words: \"${sentence.preview}...\"`,\n line: sentence.line,\n severity: \"info\",\n });\n }\n }\n \n // Check passive voice\n if (rules.checkPassiveVoice) {\n const passiveInstances = findPassiveVoice(content);\n for (const instance of passiveInstances) {\n violations.push({\n rule: \"passive-voice\",\n message: `Possible passive voice: \"${instance.text}\"`,\n line: instance.line,\n severity: \"info\",\n });\n }\n }\n \n // Check for avoid patterns\n if (rules.avoidPatterns) {\n for (const pattern of rules.avoidPatterns) {\n const regex = new RegExp(pattern, \"gi\");\n const matches = content.matchAll(regex);\n for (const match of matches) {\n violations.push({\n rule: \"avoid-pattern\",\n message: `Found \"${match[0]}\" which should be avoided`,\n severity: \"warning\",\n });\n }\n }\n }\n \n return {\n valid: violations.filter(v => v.severity === \"error\").length === 0,\n violations,\n stats,\n };\n}\n\nexport interface StyleRules {\n maxWordCount?: number;\n minWordCount?: number;\n maxSentenceLength?: number;\n checkPassiveVoice?: boolean;\n avoidPatterns?: string[];\n}\n\n/**\n * Calculate document statistics\n */\nfunction calculateStats(content: string): DocumentStats {\n const words = content.split(/\\s+/).filter(w => w.length > 0);\n const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 0);\n const paragraphs = content.split(/\\n\\n+/).filter(p => p.trim().length > 0);\n \n return {\n wordCount: words.length,\n sentenceCount: sentences.length,\n paragraphCount: paragraphs.length,\n avgWordsPerSentence: sentences.length > 0 \n ? Math.round(words.length / sentences.length) \n : 0,\n avgSentencesPerParagraph: paragraphs.length > 0 \n ? Math.round(sentences.length / paragraphs.length) \n : 0,\n };\n}\n\n/**\n * Find sentences exceeding word limit\n */\nfunction findLongSentences(\n content: string, \n maxWords: number\n): Array<{ wordCount: number; preview: string; line: number }> {\n const results: Array<{ wordCount: number; preview: string; line: number }> = [];\n const lines = content.split(\"\\n\");\n \n let lineNum = 0;\n for (const line of lines) {\n lineNum++;\n const sentences = line.split(/[.!?]+/);\n for (const sentence of sentences) {\n const words = sentence.trim().split(/\\s+/).filter(w => w.length > 0);\n if (words.length > maxWords) {\n results.push({\n wordCount: words.length,\n preview: sentence.trim().slice(0, 50),\n line: lineNum,\n });\n }\n }\n }\n \n return results;\n}\n\n/**\n * Simple passive voice detection\n */\nfunction findPassiveVoice(content: string): Array<{ text: string; line: number }> {\n const results: Array<{ text: string; line: number }> = [];\n const lines = content.split(\"\\n\");\n \n // Common passive voice patterns\n const passivePatterns = [\n /\\b(was|were|been|being|is|are|am)\\s+\\w+ed\\b/gi,\n /\\b(was|were|been|being|is|are|am)\\s+\\w+en\\b/gi,\n ];\n \n let lineNum = 0;\n for (const line of lines) {\n lineNum++;\n for (const pattern of passivePatterns) {\n const matches = line.matchAll(pattern);\n for (const match of matches) {\n results.push({\n text: match[0],\n line: lineNum,\n });\n }\n }\n }\n \n return results;\n}\n","import chalk from \"chalk\";\nimport type { StyleValidationResult, StyleViolation } from \"./validator.js\";\n\n/**\n * Format style validation result for terminal\n */\nexport function formatStyleReport(result: StyleValidationResult): string {\n const lines: string[] = [];\n \n lines.push(chalk.cyan(\"\\n📊 Document Statistics\"));\n lines.push(chalk.gray(` Words: ${result.stats.wordCount}`));\n lines.push(chalk.gray(` Sentences: ${result.stats.sentenceCount}`));\n lines.push(chalk.gray(` Paragraphs: ${result.stats.paragraphCount}`));\n lines.push(chalk.gray(` Avg words/sentence: ${result.stats.avgWordsPerSentence}`));\n \n if (result.violations.length === 0) {\n lines.push(chalk.green(\"\\n✅ No style violations found.\"));\n return lines.join(\"\\n\");\n }\n \n lines.push(chalk.yellow(`\\n⚠️ Style Issues (${result.violations.length}):`));\n \n const grouped = groupViolations(result.violations);\n \n for (const [severity, violations] of Object.entries(grouped)) {\n if (violations.length === 0) continue;\n \n const icon = severity === \"error\" ? \"❌\" : severity === \"warning\" ? \"⚠️\" : \"ℹ️\";\n const color = severity === \"error\" ? chalk.red : severity === \"warning\" ? chalk.yellow : chalk.gray;\n \n lines.push(color(`\\n${icon} ${severity.toUpperCase()} (${violations.length}):`));\n for (const v of violations.slice(0, 5)) {\n const lineInfo = v.line ? ` (line ${v.line})` : \"\";\n lines.push(color(` - ${v.message}${lineInfo}`));\n }\n if (violations.length > 5) {\n lines.push(color(` ... and ${violations.length - 5} more`));\n }\n }\n \n return lines.join(\"\\n\");\n}\n\nfunction groupViolations(violations: StyleViolation[]): Record<string, StyleViolation[]> {\n return {\n error: violations.filter(v => v.severity === \"error\"),\n warning: violations.filter(v => v.severity === \"warning\"),\n info: violations.filter(v => v.severity === \"info\"),\n };\n}\n"],"names":["a","p"],"mappings":"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"}