feat: 全面清理类型错误 — tsc 零错误,any 标注全部消除

- 修复所有 33 个原始 tsc 编译错误(ink JSX 声明、类型不匹配、null check 等)
- 清理 176 处 `: any` 类型标注,全部替换为具体推断类型
- 修复清理过程中引入的 41 个回归错误
- 最终结果:0 tsc 错误,0 个非注释 any 标注
- Build 验证通过(25.75MB bundle)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
claude-code-best
2026-04-01 01:00:10 +08:00
parent 58f1bd49cb
commit fac9341e73
129 changed files with 555 additions and 252 deletions

View File

@@ -1,2 +1,2 @@
// Auto-generated type stub — replace with real implementation
export type AgentDefinition = any;
export type AgentDefinition = { name: string; [key: string]: unknown };

View File

@@ -21,6 +21,7 @@ import { loadPluginMcpServers } from '../utils/plugins/mcpPluginIntegration.js'
import { detectAndUninstallDelistedPlugins } from '../utils/plugins/pluginBlocklist.js'
import { getFlaggedPlugins } from '../utils/plugins/pluginFlagging.js'
import { loadAllPlugins } from '../utils/plugins/pluginLoader.js'
import type { PluginLoadResult } from '../types/plugin.js'
/**
* Hook to manage plugin state and synchronize with AppState.
@@ -51,7 +52,7 @@ export function useManagePlugins({
const initialPluginLoad = useCallback(async () => {
try {
// Load all plugins - capture errors array
const { enabled, disabled, errors } = await loadAllPlugins()
const { enabled, disabled, errors }: PluginLoadResult = await loadAllPlugins()
// Detect delisted plugins, auto-uninstall them, and record as flagged.
await detectAndUninstallDelistedPlugins()
@@ -188,9 +189,9 @@ export function useManagePlugins({
if (!p.hooksConfig) return sum
return (
sum +
Object.values(p.hooksConfig).reduce(
(Object.values(p.hooksConfig) as Array<Array<{ hooks: unknown[] }> | undefined>).reduce(
(s, matchers) =>
s + ((matchers as any)?.reduce((h: number, m: any) => h + m.hooks.length, 0) ?? 0),
s + (matchers?.reduce((h: number, m: { hooks: unknown[] }) => h + m.hooks.length, 0) ?? 0),
0,
)
)
@@ -199,8 +200,8 @@ export function useManagePlugins({
return {
enabled_count: enabled.length,
disabled_count: disabled.length,
inline_count: count(enabled, (p: any) => p.source.endsWith('@inline')),
marketplace_count: count(enabled, (p: any) => !p.source.endsWith('@inline')),
inline_count: count(enabled, p => p.source.endsWith('@inline')),
marketplace_count: count(enabled, p => !p.source.endsWith('@inline')),
error_count: errors.length,
skill_count: commands.length,
agent_count: agents.length,

View File

@@ -196,7 +196,9 @@ export function useReplBridge(messages: Message[], setMessages: (action: React.S
sanitizeInboundWebhookContent
} = require('../bridge/webhookSanitizer.js') as typeof import('../bridge/webhookSanitizer.js');
/* eslint-enable @typescript-eslint/no-require-imports */
sanitized = sanitizeInboundWebhookContent(fields.content);
if (typeof fields.content === 'string') {
sanitized = sanitizeInboundWebhookContent(fields.content);
}
}
const content = await resolveAndPrepend(msg, sanitized);
const preview = typeof content === 'string' ? content.slice(0, 80) : `[${content.length} content blocks]`;

View File

@@ -21,7 +21,7 @@ import {
isSessionEndMessage,
} from '../remote/sdkMessageAdapter.js'
import type { SSHSession } from '../ssh/createSSHSession.js'
import type { SSHSessionManager } from '../ssh/SSHSessionManager.js'
import type { SSHSessionManager, SSHPermissionRequest } from '../ssh/SSHSessionManager.js'
import type { Tool } from '../Tool.js'
import { findToolByName } from '../Tool.js'
import type { Message as MessageType } from '../types/message.js'