validate_structure
Check heading hierarchy and section balance in markdown manuscripts to identify structural issues and improve document organization.
Instructions
Check heading hierarchy and section balance
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | No | Path to manuscript directory (defaults to current directory) | |
| file_path | No | Specific file to validate | |
| checks | No | Checks to run (heading-levels, duplicates, balance, deep-nesting) |
Implementation Reference
- src/tools/WriterToolHandlers.ts:185-190 (handler)MCP tool handler for 'validate_structure' that extracts arguments and delegates to WritersAid.validateStructureprivate async validateStructure(args: Record<string, unknown>) { const filePath = args.file_path as string | undefined; const checks = args.checks as string[] | undefined; return this.writersAid.validateStructure({ filePath, checks }); }
- Tool schema definition including input schema for validate_structure{ name: "validate_structure", description: "Check heading hierarchy and section balance", inputSchema: { type: "object", properties: { project_path: { type: "string", description: "Path to manuscript directory (defaults to current directory)" }, file_path: { type: "string", description: "Specific file to validate" }, checks: { type: "array", items: { type: "string" }, description: "Checks to run (heading-levels, duplicates, balance, deep-nesting)", }, }, }, },
- Core implementation of structure validation with checks for heading levels, duplicates, balance, and nestingasync validateStructure(options: { filePath?: string; checks?: string[]; }): Promise<StructureReport> { const { filePath, checks } = options; const enabledChecks = checks || [ "heading-levels", "duplicate-headings", "section-balance", "deep-nesting", ]; const issues: StructureIssue[] = []; const files = filePath ? [await this.storage.getFile(filePath)] : await this.storage.getAllFiles(); const validFiles = files.filter((f) => f !== null); for (const file of validFiles) { if (enabledChecks.includes("heading-levels")) { issues.push(...(await this.checkHeadingLevels(file.file_path))); } if (enabledChecks.includes("duplicate-headings")) { issues.push(...(await this.checkDuplicateHeadings(file.file_path))); } if (enabledChecks.includes("section-balance")) { issues.push(...(await this.checkSectionBalance(file.file_path))); } if (enabledChecks.includes("deep-nesting")) { issues.push(...(await this.checkDeepNesting(file.file_path))); } } const errors = issues.filter((i) => i.severity === "error").length; const warnings = issues.filter((i) => i.severity === "warning").length; const info = issues.filter((i) => i.severity === "info").length; return { issues, filesChecked: validFiles.length, errors, warnings, info, }; }
- src/WritersAid.ts:211-213 (helper)Delegation method in WritersAid that calls StructureValidatorasync validateStructure(options?: { filePath?: string; checks?: string[] }) { return this.structureValidator.validateStructure(options || {}); }
- src/tools/WriterToolHandlers.ts:32-33 (registration)Registration of validate_structure in the tool dispatcher switch statementcase "validate_structure": return this.validateStructure(args);