From 1e4d4268406c68cdda643bc6a14274e7adeff372 Mon Sep 17 00:00:00 2001 From: tangjian Date: Fri, 3 Apr 2026 20:43:33 +0800 Subject: [PATCH 1/2] =?UTF-8?q?log:=E5=A2=9E=E5=8A=A0log=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 ++- src/services/api/claude.ts | 28 +++++++++++++++++ src/tools/AgentTool/AgentTool.tsx | 51 +++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ca25ed5eb..53745d7ef 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,9 @@ { "name": "claude-code-best", - "version": "1.0.3", + "version": "2026.4.3-restored", + "private": true, "description": "Reverse-engineered Anthropic Claude Code CLI — interactive AI coding assistant in the terminal", + "license": "SEE LICENSE IN LICENSE.md", "type": "module", "author": "claude-code-best ", "repository": { @@ -39,6 +41,7 @@ "scripts": { "build": "bun run build.ts", "dev": "bun run scripts/dev.ts", + "dev-debug": "FEATURE_BUDDY=1 bun run scripts/dev.ts --debug", "dev:inspect": "bun run scripts/dev-debug.ts", "prepublishOnly": "bun run build", "lint": "biome lint src/", diff --git a/src/services/api/claude.ts b/src/services/api/claude.ts index fd4f25110..8cd0cbdb2 100644 --- a/src/services/api/claude.ts +++ b/src/services/api/claude.ts @@ -1784,6 +1784,27 @@ async function* queryModel( const params = paramsFromContext(context) captureAPIRequest(params, options.querySource) // Capture for bug reports + // Log the full API request to debug log file + logForDebugging(`[API_REQUEST] model=${params.model} max_tokens=${params.max_tokens}`) + // Set CLAUDE_CODE_LOG_FULL_PROMPT=1 to log full system prompt and messages + if (isEnvTruthy(process.env.CLAUDE_CODE_LOG_FULL_PROMPT)) { + logForDebugging(`[API_REQUEST_SYSTEM_FULL] ${jsonStringify(params.system)}`) + logForDebugging(`[API_REQUEST_MESSAGES_FULL] ${jsonStringify(params.messages)}`) + } else { + logForDebugging(`[API_REQUEST_SYSTEM] ${jsonStringify(params.system).slice(0, 5000)}...`) + logForDebugging(`[API_REQUEST_MESSAGES] count=${params.messages.length}`) + } + logForDebugging(`[API_REQUEST_TOOLS] count=${params.tools?.length ?? 0}`) + if (params.tools && params.tools.length > 0) { + for (const tool of params.tools) { + if ('name' in tool) { + logForDebugging(`[API_REQUEST_TOOL] name=${tool.name}`) + } else if ('type' in tool) { + logForDebugging(`[API_REQUEST_TOOL] type=${tool.type}`) + } + } + } + maxOutputTokens = params.max_tokens // Fire immediately before the fetch is dispatched. .withResponse() below @@ -1986,12 +2007,14 @@ async function* queryModel( ...part.content_block, input: '', } + logForDebugging(`[TOOL_USE] name=${part.content_block.name} id=${part.content_block.id}`) break case 'server_tool_use': contentBlocks[part.index] = { ...part.content_block, input: '' as unknown as { [key: string]: unknown }, } + logForDebugging(`[MCP_TOOL_USE] name=${part.content_block.name} id=${part.content_block.id}`) if ((part.content_block.name as string) === 'advisor') { isAdvisorInProgress = true logForDebugging(`[AdvisorTool] Advisor tool called`) @@ -2234,6 +2257,11 @@ async function* queryModel( lastMsg.message.stop_reason = stopReason } + // Log the API response summary + logForDebugging(`[API_RESPONSE] stop_reason=${stopReason} usage=${jsonStringify(usage)}`) + logForDebugging(`[API_RESPONSE_MESSAGES] count=${newMessages.length}`) + logForDebugging(`[API_RESPONSE_CONTENT] ${jsonStringify(newMessages)}`) + // Update cost const costUSDForPart = calculateUSDCost(resolvedModel, usage as unknown as BetaUsage) costUSD += addToTotalSessionCost( diff --git a/src/tools/AgentTool/AgentTool.tsx b/src/tools/AgentTool/AgentTool.tsx index 709f31e66..53387f174 100644 --- a/src/tools/AgentTool/AgentTool.tsx +++ b/src/tools/AgentTool/AgentTool.tsx @@ -251,6 +251,19 @@ export const AgentTool = buildTool({ const startTime = Date.now(); const model = isCoordinatorMode() ? undefined : modelParam; + // Log Agent tool invocation details + logForDebugging(`[AGENT_TOOL] Invoking Agent with parameters:`); + logForDebugging(`[AGENT_TOOL] description: ${description}`); + logForDebugging(`[AGENT_TOOL] subagent_type: ${subagent_type ?? '(auto-select)'}`); + logForDebugging(`[AGENT_TOOL] model: ${model ?? '(default)'}`); + logForDebugging(`[AGENT_TOOL] run_in_background: ${run_in_background ?? false}`); + logForDebugging(`[AGENT_TOOL] prompt length: ${prompt.length} chars`); + if (name) logForDebugging(`[AGENT_TOOL] name: ${name}`); + if (team_name) logForDebugging(`[AGENT_TOOL] team_name: ${team_name}`); + if (spawnMode) logForDebugging(`[AGENT_TOOL] mode: ${spawnMode}`); + if (isolation) logForDebugging(`[AGENT_TOOL] isolation: ${isolation}`); + if (cwd) logForDebugging(`[AGENT_TOOL] cwd: ${cwd}`); + // Get app state for permission mode and agent filtering const appState = toolUseContext.getAppState(); const permissionMode = appState.toolPermissionContext.mode; @@ -299,6 +312,12 @@ export const AgentTool = buildTool({ invokingRequestId: assistantMessage?.requestId as string | undefined }, toolUseContext); + // Log teammate spawn + logForDebugging(`[AGENT_TOOL] Teammate spawned: ${name}`); + logForDebugging(`[AGENT_TOOL] team_name: ${teamName}`); + logForDebugging(`[AGENT_TOOL] agent_type: ${subagent_type ?? '(default)'}`); + logForDebugging(`[AGENT_TOOL] model: ${model ?? agentDef?.model ?? '(default)'}`); + // Type assertion uses TeammateSpawnedOutput (defined above) instead of any. // This type is excluded from the exported outputSchema for dead code elimination. // Cast through unknown because TeammateSpawnedOutput is intentionally @@ -355,6 +374,16 @@ export const AgentTool = buildTool({ selectedAgent = found; } + // Log selected agent definition details + logForDebugging(`[AGENT_TOOL] Selected agent: ${selectedAgent.agentType}`); + logForDebugging(`[AGENT_TOOL] source: ${selectedAgent.source}`); + if (selectedAgent.model) logForDebugging(`[AGENT_TOOL] agent model: ${selectedAgent.model}`); + if (selectedAgent.permissionMode) logForDebugging(`[AGENT_TOOL] permissionMode: ${selectedAgent.permissionMode}`); + if (selectedAgent.maxTurns) logForDebugging(`[AGENT_TOOL] maxTurns: ${selectedAgent.maxTurns}`); + if (selectedAgent.background) logForDebugging(`[AGENT_TOOL] background: ${selectedAgent.background}`); + if (selectedAgent.effort !== undefined) logForDebugging(`[AGENT_TOOL] effort: ${selectedAgent.effort}`); + if (selectedAgent.requiredMcpServers?.length) logForDebugging(`[AGENT_TOOL] requiredMcpServers: ${selectedAgent.requiredMcpServers.join(', ')}`); + // Same lifecycle constraint as the run_in_background guard above, but for // agent definitions that force background via `background: true`. Checked // here because selectedAgent is only now resolved. @@ -466,6 +495,12 @@ export const AgentTool = buildTool({ logEvent('tengu_agent_tool_remote_launched', { agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS }); + + // Log remote agent launch + logForDebugging(`[AGENT_TOOL] Remote agent launched: ${selectedAgent.agentType}`); + logForDebugging(`[AGENT_TOOL] taskId: ${taskId}`); + logForDebugging(`[AGENT_TOOL] sessionUrl: ${getRemoteTaskSessionUrl(sessionId)}`); + const remoteResult: RemoteLaunchedOutput = { status: 'remote_launched', taskId, @@ -751,6 +786,12 @@ export const AgentTool = buildTool({ getWorktreeResult: cleanupWorktreeIfNeeded }))); const canReadOutputFile = toolUseContext.options.tools.some(t => toolMatchesName(t, FILE_READ_TOOL_NAME) || toolMatchesName(t, BASH_TOOL_NAME)); + + // Log async agent launch + logForDebugging(`[AGENT_TOOL] Async agent launched: ${selectedAgent.agentType}`); + logForDebugging(`[AGENT_TOOL] agentId: ${agentBackgroundTask.agentId}`); + logForDebugging(`[AGENT_TOOL] outputFile: ${getTaskOutputPath(agentBackgroundTask.agentId)}`); + return { data: { isAsync: true as const, @@ -1233,6 +1274,16 @@ export const AgentTool = buildTool({ logForDebugging(`Sync agent recovering from error with ${agentMessages.length} messages`); } const agentResult = finalizeAgentTool(agentMessages, syncAgentId, metadata); + + // Log Agent completion with usage statistics + const duration = Date.now() - startTime; + logForDebugging(`[AGENT_TOOL] Agent completed: ${selectedAgent.agentType}`); + logForDebugging(`[AGENT_TOOL] agentId: ${syncAgentId}`); + logForDebugging(`[AGENT_TOOL] totalTokens: ${agentResult.totalTokens}`); + logForDebugging(`[AGENT_TOOL] totalToolUseCount: ${agentResult.totalToolUseCount}`); + logForDebugging(`[AGENT_TOOL] duration_ms: ${duration}`); + logForDebugging(`[AGENT_TOOL] content items: ${agentResult.content.length}`); + if (feature('TRANSCRIPT_CLASSIFIER')) { const currentAppState = toolUseContext.getAppState(); const handoffWarning = await classifyHandoffIfNeeded({ From 5d5f3dc188b71803771ffa852323436d7339373b Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Fri, 3 Apr 2026 20:23:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 84 +++++++++++++++++++++++++------------ docs/projects-collection.md | 35 ++++++++++++++++ 2 files changed, 93 insertions(+), 26 deletions(-) create mode 100644 docs/projects-collection.md diff --git a/CLAUDE.md b/CLAUDE.md index 055bc9a23..6dfdb4cb1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,6 +15,9 @@ bun install # Dev mode (runs cli.tsx with MACRO defines injected via -d flags) bun run dev +# Dev mode with debugger (set BUN_INSPECT=9229 to pick port) +bun run dev:inspect + # Pipe mode echo "say hello" | bun run src/entrypoints/cli.tsx -p @@ -30,6 +33,15 @@ bun test --coverage # with coverage report bun run lint # check only bun run lint:fix # auto-fix bun run format # format all src/ + +# Health check +bun run health + +# Check unused exports +bun run check:unused + +# Docs dev server (Mintlify) +bun run docs:dev ``` 详细的测试规范、覆盖状态和改进计划见 `docs/testing-spec.md`。 @@ -39,20 +51,27 @@ bun run format # format all src/ ### Runtime & Build - **Runtime**: Bun (not Node.js). All imports, builds, and execution use Bun APIs. -- **Build**: `build.ts` 执行 `Bun.build()` with `splitting: true`,入口 `src/entrypoints/cli.tsx`,输出 `dist/cli.js` + ~450 chunk files。构建后自动替换 `import.meta.require` 为 Node.js 兼容版本(产物 bun/node 都可运行)。 -- **Dev mode**: `scripts/dev.ts` 通过 Bun `-d` flag 注入 `MACRO.*` defines,运行 `src/entrypoints/cli.tsx`。`scripts/defines.ts` 集中管理 define map。 +- **Build**: `build.ts` 执行 `Bun.build()` with `splitting: true`,入口 `src/entrypoints/cli.tsx`,输出 `dist/cli.js` + chunk files。默认启用 `AGENT_TRIGGERS_REMOTE` feature。构建后自动替换 `import.meta.require` 为 Node.js 兼容版本(产物 bun/node 都可运行)。 +- **Dev mode**: `scripts/dev.ts` 通过 Bun `-d` flag 注入 `MACRO.*` defines,运行 `src/entrypoints/cli.tsx`。默认启用 `BUDDY`、`TRANSCRIPT_CLASSIFIER`、`BRIDGE_MODE`、`AGENT_TRIGGERS_REMOTE` 四个 feature。 - **Module system**: ESM (`"type": "module"`), TSX with `react-jsx` transform. - **Monorepo**: Bun workspaces — internal packages live in `packages/` resolved via `workspace:*`. - **Lint/Format**: Biome (`biome.json`)。`bun run lint` / `bun run lint:fix` / `bun run format`。 +- **Defines**: 集中管理在 `scripts/defines.ts`。当前版本 `2.1.888`。 ### Entry & Bootstrap -1. **`src/entrypoints/cli.tsx`** — True entrypoint. Sets up runtime globals: - - `globalThis.MACRO` — build-time macro values (VERSION, BUILD_TIME, etc.),通过 `scripts/dev.ts` 的 `-d` flags 注入。 - - `BUILD_TARGET`, `BUILD_ENV`, `INTERFACE_TYPE` globals。 - - `feature()` 由 `bun:bundle` 内置模块提供,不需要在此 polyfill。 -2. **`src/main.tsx`** — Commander.js CLI definition. Parses args, initializes services (auth, analytics, policy), then launches the REPL or runs in pipe mode. -3. **`src/entrypoints/init.ts`** — One-time initialization (telemetry, config, trust dialog). +1. **`src/entrypoints/cli.tsx`** — True entrypoint。`main()` 函数按优先级处理多条快速路径: + - `--version` / `-v` — 零模块加载 + - `--dump-system-prompt` — feature-gated (DUMP_SYSTEM_PROMPT) + - `--claude-in-chrome-mcp` / `--chrome-native-host` + - `--daemon-worker=` — feature-gated (DAEMON) + - `remote-control` / `rc` / `bridge` — feature-gated (BRIDGE_MODE) + - `daemon` — feature-gated (DAEMON) + - `ps` / `logs` / `attach` / `kill` / `--bg` — feature-gated (BG_SESSIONS) + - `--tmux` + `--worktree` 组合 + - 默认路径:加载 `main.tsx` 启动完整 CLI +2. **`src/main.tsx`** (~4680 行) — Commander.js CLI definition。注册大量 subcommands:`mcp` (serve/add/remove/list...)、`server`、`ssh`、`open`、`auth`、`plugin`、`agents`、`auto-mode`、`doctor`、`update` 等。主 `.action()` 处理器负责权限、MCP、会话恢复、REPL/Headless 模式分发。 +3. **`src/entrypoints/init.ts`** — One-time initialization (telemetry, config, trust dialog)。 ### Core Loop @@ -70,25 +89,37 @@ bun run format # format all src/ - **`src/Tool.ts`** — Tool interface definition (`Tool` type) and utilities (`findToolByName`, `toolMatchesName`). - **`src/tools.ts`** — Tool registry. Assembles the tool list; some tools are conditionally loaded via `feature()` flags or `process.env.USER_TYPE`. -- **`src/tools//`** — Each tool in its own directory (e.g., `BashTool`, `FileEditTool`, `GrepTool`, `AgentTool`). -- Tools define: `name`, `description`, `inputSchema` (JSON Schema), `call()` (execution), and optionally a React component for rendering results. +- **`src/tools//`** — 61 个 tool 目录(如 BashTool, FileEditTool, GrepTool, AgentTool, WebFetchTool, LSPTool, MCPTool 等)。每个 tool 包含 `name`、`description`、`inputSchema`、`call()` 及可选的 React 渲染组件。 +- **`src/tools/shared/`** — Tool 共享工具函数。 ### UI Layer (Ink) - **`src/ink.ts`** — Ink render wrapper with ThemeProvider injection. - **`src/ink/`** — Custom Ink framework (forked/internal): custom reconciler, hooks (`useInput`, `useTerminalSize`, `useSearchHighlight`), virtual list rendering. -- **`src/components/`** — React components rendered in terminal via Ink. Key ones: - - `App.tsx` — Root provider (AppState, Stats, FpsMetrics). - - `Messages.tsx` / `MessageRow.tsx` — Conversation message rendering. - - `PromptInput/` — User input handling. - - `permissions/` — Tool permission approval UI. +- **`src/components/`** — 大量 React 组件(170+ 项),渲染于终端 Ink 环境中。关键组件: + - `App.tsx` — Root provider (AppState, Stats, FpsMetrics) + - `Messages.tsx` / `MessageRow.tsx` — Conversation message rendering + - `PromptInput/` — User input handling + - `permissions/` — Tool permission approval UI + - `design-system/` — 复用 UI 组件(Dialog, FuzzyPicker, ProgressBar, ThemeProvider 等) - Components use React Compiler runtime (`react/compiler-runtime`) — decompiled output has `_c()` memoization calls throughout. ### State Management - **`src/state/AppState.tsx`** — Central app state type and context provider. Contains messages, tools, permissions, MCP connections, etc. -- **`src/state/store.ts`** — Zustand-style store for AppState. -- **`src/bootstrap/state.ts`** — Module-level singletons for session-global state (session ID, CWD, project root, token counts). +- **`src/state/AppStateStore.ts`** — Default state and store factory. +- **`src/state/store.ts`** — Zustand-style store for AppState (`createStore`). +- **`src/state/selectors.ts`** — State selectors. +- **`src/bootstrap/state.ts`** — Module-level singletons for session-global state (session ID, CWD, project root, token counts, model overrides, client type, permission mode). + +### Bridge / Remote Control + +- **`src/bridge/`** (~35 files) — Remote Control / Bridge 模式。feature-gated by `BRIDGE_MODE`。包含 bridge API、会话管理、JWT 认证、消息传输、权限回调等。Entry: `bridgeMain.ts`。 +- CLI 快速路径: `claude remote-control` / `claude rc` / `claude bridge`。 + +### Daemon Mode + +- **`src/daemon/`** — Daemon 模式(长驻 supervisor)。feature-gated by `DAEMON`。包含 `main.ts`(entry)和 `workerRegistry.ts`(worker 管理)。 ### Context & System Prompt @@ -97,17 +128,16 @@ bun run format # format all src/ ### Feature Flag System -Feature flags control which functionality is enabled at runtime. The system works as follows: +Feature flags control which functionality is enabled at runtime: - **在代码中使用**: 统一通过 `import { feature } from 'bun:bundle'` 导入,调用 `feature('FLAG_NAME')` 返回 `boolean`。**不要**在 `cli.tsx` 或其他文件里自己定义 `feature` 函数或覆盖这个 import。 - **启用方式**: 通过环境变量 `FEATURE_=1`。例如 `FEATURE_BUDDY=1 bun run dev` 启用 BUDDY 功能。 -- **Dev 模式**: `scripts/dev.ts` 自动扫描所有 `FEATURE_*` 环境变量,转换为 Bun 的 `--feature` 参数传递给运行时。 -- **Build 模式**: `build.ts` 同样读取 `FEATURE_*` 环境变量,传入 `Bun.build({ features })` 数组。 -- **默认行为**: 不设置任何 `FEATURE_*` 环境变量时,所有 `feature()` 调用返回 `false`,即所有 feature-gated 代码不执行。 -- **常见 flag 名称**: `BUDDY`、`FORK_SUBAGENT`、`PROACTIVE`、`KAIROS`、`VOICE_MODE`、`DAEMON` 等(见 `src/commands.ts` 中的使用)。 +- **Dev 默认 features**: `BUDDY`、`TRANSCRIPT_CLASSIFIER`、`BRIDGE_MODE`、`AGENT_TRIGGERS_REMOTE`(见 `scripts/dev.ts`)。 +- **Build 默认 features**: `AGENT_TRIGGERS_REMOTE`(见 `build.ts`)。 +- **常见 flag**: `BUDDY`, `DAEMON`, `BRIDGE_MODE`, `BG_SESSIONS`, `PROACTIVE`, `KAIROS`, `VOICE_MODE`, `FORK_SUBAGENT`, `SSH_REMOTE`, `DIRECT_CONNECT`, `TEMPLATES`, `CHICAGO_MCP`, `BYOC_ENVIRONMENT_RUNNER`, `SELF_HOSTED_RUNNER`, `COORDINATOR_MODE`, `UDS_INBOX`, `LODESTONE`, `ABLATION_BASELINE` 等。 - **类型声明**: `src/types/internal-modules.d.ts` 中声明了 `bun:bundle` 模块的 `feature` 函数签名。 -**新增功能的正确做法**: 如果要让某个 feature-gated 模块(如 buddy)永久启用,应保留代码中 `import { feature } from 'bun:bundle'` + `feature('FLAG_NAME')` 的标准模式,在运行时通过环境变量或配置控制,而不是绕过 feature flag 直接 import。 +**新增功能的正确做法**: 保留 `import { feature } from 'bun:bundle'` + `feature('FLAG_NAME')` 的标准模式,在运行时通过环境变量或配置控制,不要绕过 feature flag 直接 import。 ### Stubbed/Deleted Modules @@ -131,17 +161,19 @@ Feature flags control which functionality is enabled at runtime. The system work - **框架**: `bun:test`(内置断言 + mock) - **单元测试**: 就近放置于 `src/**/__tests__/`,文件名 `.test.ts` -- **集成测试**: `tests/integration/`,共享 mock/fixture 在 `tests/mocks/` +- **集成测试**: `tests/integration/` — 4 个文件(cli-arguments, context-build, message-pipeline, tool-chain) +- **共享 mock/fixture**: `tests/mocks/`(api-responses, file-system, fixtures/) - **命名**: `describe("functionName")` + `test("behavior description")`,英文 - **Mock 模式**: 对重依赖模块使用 `mock.module()` + `await import()` 解锁(必须内联在测试文件中,不能从共享 helper 导入) -- **当前状态**: 1286 tests / 67 files / 0 fail(详见 `docs/testing-spec.md` 的覆盖状态表和评分) +- **当前状态**: ~1623 tests / 114 files (110 unit + 4 integration) / 0 fail(详见 `docs/testing-spec.md`) ## Working with This Codebase - **Don't try to fix all tsc errors** — they're from decompilation and don't affect runtime. -- **Feature flags** — 默认全部关闭(`feature()` 返回 `false`)。启用方式见上方 Feature Flag System 章节。不要在 `cli.tsx` 中重定义 `feature` 函数。 +- **Feature flags** — 默认全部关闭(`feature()` 返回 `false`)。Dev/build 各有自己的默认启用列表。不要在 `cli.tsx` 中重定义 `feature` 函数。 - **React Compiler output** — Components have decompiled memoization boilerplate (`const $ = _c(N)`). This is normal. - **`bun:bundle` import** — `import { feature } from 'bun:bundle'` 是 Bun 内置模块,由运行时/构建器解析。不要用自定义函数替代它。 - **`src/` path alias** — tsconfig maps `src/*` to `./src/*`. Imports like `import { ... } from 'src/utils/...'` are valid. - **MACRO defines** — 集中管理在 `scripts/defines.ts`。Dev mode 通过 `bun -d` 注入,build 通过 `Bun.build({ define })` 注入。修改版本号等常量只改这个文件。 - **构建产物兼容 Node.js** — `build.ts` 会自动后处理 `import.meta.require`,产物可直接用 `node dist/cli.js` 运行。 +- **Biome 配置** — 大量 lint 规则被关闭(decompiled 代码不适合严格 lint)。`.tsx` 文件用 120 行宽 + 强制分号;其他文件 80 行宽 + 按需分号。 diff --git a/docs/projects-collection.md b/docs/projects-collection.md new file mode 100644 index 000000000..861b84773 --- /dev/null +++ b/docs/projects-collection.md @@ -0,0 +1,35 @@ +# 社区项目 & Blog 合集 + +> 每日更新,欢迎自荐! + +## 工具 & 应用 + +| 项目 | 描述 | 作者 | +|------|------|------| +| [4qtask.vercel.app](https://4qtask.vercel.app/) | 免费四象限时间管理工具 | @kevinhuky | +| [kaying.studio](https://kaying.studio/) | 个人 AI 工具箱 | @kayingai | +| [supsub.ai](https://supsub.ai/) | 高效阅读工具 | @hidumou | +| [x-video-download.net](https://x-video-download.net/) | 视频下载工具 | @syakadou | +| [1openapi.com](https://1openapi.com/) | API 中转站 | @thinker007 | +| [claw-z.com](https://claw-z.com/) | 一键部署 OpenClaw AI Agent(场景驱动、全面管理) | @uhhc | +| [gemini-watermark-remover.net](https://gemini-watermark-remover.net/) | Gemini 水印移除工具 | @syakadou | + +## GitHub 开源项目 + +| 项目 | 描述 | 作者 | +|------|------|------| +| [VersperClaw](https://github.com/versperai/VersperClaw) | 全自动科研流 | @versperai | +| [claude-reviews-claude](https://github.com/openedclaude/claude-reviews-claude) | 原汤化原食——Claude 如何看待眼中的老己 | @openedclaude | +| [agentica](https://github.com/shibing624/agentica) | 自研 Agent 框架,借鉴 claude-code 多 Agent 处理 | @shibing624 | +| [macman](https://github.com/tonngw/macman) | Mac 从 0 到 1 保姆级配置教程 | @tonngw | +| [SuperSpec](https://github.com/asasugar/SuperSpec) | SDD / Spec-Driven Development | @asasugar | +| [adnify](https://github.com/adnaan-worker/adnify) | 高颜值高定制化 AI 编辑器 | @adnaan-worker | +| [another-rule-engine](https://github.com/eatmoreduck/another-rule-engine) | 基于 Groovy 的开源多功能决策引擎 | @eatmoreduck | +| [creative_master](https://github.com/chatabc/creative_master) | AI 驱动的创意灵感管理工具 | @chatabc | +| [RapidDoc](https://github.com/RapidAI/RapidDoc) | Office 文件解析工具转 Markdown(支持 PDF/Image/Word/PPT/Excel) | @hzkitt | + +## Blog + +| 链接 | 作者 | +|------|------| +| [blog.xiaohuangyu.space](https://blog.xiaohuangyu.space/) | @eatmoreduck |