fix: replace any types with proper TypeScript types

Replace all `any` types with properly defined TypeScript interfaces and types throughout the codebase to improve type safety and eliminate type-related code quality issues.

Changes:
- Define ElectronSafeStorage interface for Electron's safeStorage API
- Create LegacySettings interface for settings migration in main.ts
- Define JSONValue, JSONRPCParams types for JSON-RPC protocol
- Define JSONSchemaProperty for tool input schemas
- Create YAMLValue type for frontmatter values
- Define FrontmatterValue type for adapter interfaces
- Update middleware to use proper Express NextFunction and JSONRPCResponse types
- Fix tool registry to handle args with proper typing (with eslint-disable for dynamic dispatch)
- Fix notifications to use proper types with eslint-disable where dynamic access is needed
- Add proper null safety assertions where appropriate
- Fix TFolder stat access with proper type extension

All type errors resolved. TypeScript compilation passes with --skipLibCheck.
This commit is contained in:
2025-11-07 11:10:52 -05:00
parent b0fc0be629
commit 2a7fce45af
13 changed files with 127 additions and 50 deletions

View File

@@ -474,6 +474,7 @@ export class ToolRegistry {
];
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async callTool(name: string, args: any): Promise<CallToolResult> {
const startTime = Date.now();

View File

@@ -13,7 +13,7 @@ import {
} from '../types/mcp-types';
import { PathUtils } from '../utils/path-utils';
import { ErrorMessages } from '../utils/error-messages';
import { FrontmatterUtils } from '../utils/frontmatter-utils';
import { FrontmatterUtils, YAMLValue } from '../utils/frontmatter-utils';
import { WaypointUtils } from '../utils/waypoint-utils';
import { VersionUtils } from '../utils/version-utils';
import { ContentUtils } from '../utils/content-utils';
@@ -364,16 +364,28 @@ export class NoteTools {
await this.vault.modify(file, content);
// Build response with word count and link validation
const result: any = {
interface UpdateNoteResult {
success: boolean;
path: string;
versionId: string;
modified: number;
wordCount?: number;
linkValidation?: {
valid: string[];
brokenNotes: Array<{ link: string; line: number; context: string }>;
brokenHeadings: Array<{ link: string; line: number; context: string; note: string }>;
summary: string;
};
}
const result: UpdateNoteResult = {
success: true,
path: file.path,
versionId: VersionUtils.generateVersionId(file),
modified: file.stat.mtime
modified: file.stat.mtime,
wordCount: ContentUtils.countWords(content)
};
// Add word count
result.wordCount = ContentUtils.countWords(content);
// Add link validation if requested
if (validateLinks) {
result.linkValidation = await LinkUtils.validateLinks(
@@ -731,7 +743,7 @@ export class NoteTools {
*/
async updateFrontmatter(
path: string,
patch?: Record<string, any>,
patch?: Record<string, YAMLValue>,
remove: string[] = [],
ifMatch?: string
): Promise<CallToolResult> {

View File

@@ -385,8 +385,10 @@ export class VaultTools {
// In most cases, this will be 0 for directories
let modified = 0;
try {
if ((folder as any).stat && typeof (folder as any).stat.mtime === 'number') {
modified = (folder as any).stat.mtime;
// TFolder doesn't officially have stat, but it may exist in practice
const folderWithStat = folder as TFolder & { stat?: { mtime?: number } };
if (folderWithStat.stat && typeof folderWithStat.stat.mtime === 'number') {
modified = folderWithStat.stat.mtime;
}
} catch (error) {
// Silently fail - modified will remain 0