feat: add automatic word count and link validation to write operations
Add automatic word count and link validation to create_note, update_note, and update_sections operations to provide immediate feedback on note content quality and link integrity. Features: - Word counting excludes frontmatter and Obsidian comments, includes all other content (code blocks, inline code, headings, lists, etc.) - Link validation checks wikilinks, heading links, and embeds - Results categorized as: valid links, broken notes (note doesn't exist), and broken headings (note exists but heading missing) - Detailed broken link info includes line number and context snippet - Human-readable summary (e.g., "15 links: 12 valid, 2 broken notes, 1 broken heading") - Opt-out capability via validateLinks parameter (default: true) for performance-critical operations Implementation: - New ContentUtils.countWords() for word counting logic - Enhanced LinkUtils.validateLinks() for comprehensive link validation - Updated create_note, update_note, update_sections to return wordCount and linkValidation fields - Updated MCP tool descriptions to document new features and parameters - update_note now returns structured JSON instead of simple success message Response format changes: - create_note: added wordCount and linkValidation fields - update_note: changed to structured response with wordCount and linkValidation - update_sections: added wordCount and linkValidation fields Breaking changes: - update_note response format changed from simple message to structured JSON
This commit is contained in:
@@ -248,6 +248,8 @@ export interface UpdateSectionsResult {
|
||||
versionId: string;
|
||||
modified: number;
|
||||
sectionsUpdated: number;
|
||||
wordCount?: number;
|
||||
linkValidation?: LinkValidationResult;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -260,6 +262,8 @@ export interface CreateNoteResult {
|
||||
created: number;
|
||||
renamed?: boolean;
|
||||
originalPath?: string;
|
||||
wordCount?: number;
|
||||
linkValidation?: LinkValidationResult;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -305,6 +309,35 @@ export interface UnresolvedLink {
|
||||
suggestions: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Broken link information (note doesn't exist)
|
||||
*/
|
||||
export interface BrokenNoteLink {
|
||||
link: string;
|
||||
line: number;
|
||||
context: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Broken heading link information (note exists but heading doesn't)
|
||||
*/
|
||||
export interface BrokenHeadingLink {
|
||||
link: string;
|
||||
line: number;
|
||||
context: string;
|
||||
note: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Link validation result for write operations
|
||||
*/
|
||||
export interface LinkValidationResult {
|
||||
valid: string[];
|
||||
brokenNotes: BrokenNoteLink[];
|
||||
brokenHeadings: BrokenHeadingLink[];
|
||||
summary: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Result from validate_wikilinks operation
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user