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:
@@ -1,6 +1,6 @@
|
||||
import { App } from 'obsidian';
|
||||
import { NoteTools } from '../src/tools/note-tools';
|
||||
import { createMockVaultAdapter, createMockFileManagerAdapter, createMockTFile, createMockTFolder } from './__mocks__/adapters';
|
||||
import { createMockVaultAdapter, createMockFileManagerAdapter, createMockMetadataCacheAdapter, createMockTFile, createMockTFolder } from './__mocks__/adapters';
|
||||
|
||||
// Mock Obsidian API
|
||||
jest.mock('obsidian');
|
||||
@@ -9,11 +9,13 @@ describe('Enhanced Parent Folder Detection', () => {
|
||||
let noteTools: NoteTools;
|
||||
let mockVault: ReturnType<typeof createMockVaultAdapter>;
|
||||
let mockFileManager: ReturnType<typeof createMockFileManagerAdapter>;
|
||||
let mockMetadata: ReturnType<typeof createMockMetadataCacheAdapter>;
|
||||
let mockApp: App;
|
||||
|
||||
beforeEach(() => {
|
||||
mockVault = createMockVaultAdapter();
|
||||
mockFileManager = createMockFileManagerAdapter();
|
||||
mockMetadata = createMockMetadataCacheAdapter();
|
||||
|
||||
// Create a minimal mock App that supports PathUtils
|
||||
// Use a getter to ensure it always uses the current mock
|
||||
@@ -25,7 +27,7 @@ describe('Enhanced Parent Folder Detection', () => {
|
||||
}
|
||||
} as any;
|
||||
|
||||
noteTools = new NoteTools(mockVault, mockFileManager, mockApp);
|
||||
noteTools = new NoteTools(mockVault, mockFileManager, mockMetadata, mockApp);
|
||||
});
|
||||
|
||||
describe('Explicit parent folder detection', () => {
|
||||
|
||||
Reference in New Issue
Block a user