用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/cwilliams5/Alt-Tabby --skill review-resource-leaks命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Audit all lint-ignore suppressions for appropriateness and overuse
基于 SOC 职业分类
正在显示 SKILL.md
| name | review-resource-leaks |
| description | Audit for memory leaks, handle leaks, GDI leaks, and CPU churn |
| user-invocable | true |
| disable-model-invocation | true |
Enter planning mode. Systematically audit the codebase for resource leaks and unnecessary CPU churn. Use maximum parallelism — spawn explore agents for independent areas.
GDI+ objects (brushes, pens, fonts, bitmaps, graphics) that are created but never deleted. Each leaked object consumes a GDI handle — Windows limits these per-process (~10,000). Over time, leaks cause rendering failures or crashes.
Known safe pattern: D2D_GetCachedBrush and gD2D_Res cache objects intentionally — these are NOT leaks. The rendering pipeline uses D2D now — look for D2D resource create/release patterns and any remaining GDI+ usage in src/lib/.
Look for:
static cached objects per ahk-patterns.md)Handles from DllCall that require explicit cleanup:
CreateFile / CloseHandle — named pipe handles, file handlesOpenProcess / CloseHandle — process handles for icon/info extractionDllCall("SetWinEventHook") / DllCall("UnhookWinEvent") — event hooksLoadImage / DestroyIcon — icon handles (HICON)CreateCompatibleDC / DeleteDC — device contextsLook for handles stored in variables that go out of scope without cleanup, and error paths that skip CloseHandle.
FileOpen() calls where the file object is never closed, or where an error path skips .Close(). Also check for FileAppend in tight loops (each call opens+closes — not a leak, but a performance concern that could be replaced with a single FileOpen + .Write()).
The IPC system uses named pipes (ipc_pipe.ahk). Check that:
SetTimer calls without corresponding SetTimer(callback, 0) to disable. A timer that fires after its context is gone can cause errors or unnecessary CPU work. Also check for one-shot timers (SetTimer(cb, -period)) that should be negative but aren't.
Unnecessary polling or computation when idle:
ahk-patterns.md caller-side log guards)Data structures that grow over time without pruning:
gD2D_Res brush/font cache — intentional lifetime cache, cleaned up on exitstatic buffers in hot-path functions — intentional reuse per ahk-patterns.md.bak sentinel files — intentional crash-safety patternSplit by resource type for independent parallel exploration:
src/gui/gui_paint.ahk, src/gui/gui_overlay.ahk, src/gui/gui_gdip.ahk, any file using D2D_* functions. Some Gdip_* may remain in src/lib/ but the paint pipeline is D2D nowsrc/core/ producers, src/shared/ipc_pipe.ahk, DllCall-heavy files. Use query_function_visibility.ps1 to trace cleanup call chains and query_callchain.ps1 -Reverse to find all callers that should reach cleanup — verify every Create/Open has a corresponding Close/Delete reachable from all callers. Use query_global_ownership.ps1 <resource> to determine who declares and writes resource handles (responsible for cleanup). Use query_impact.ps1 <cleanup_func> to assess the blast radius if a cleanup function is missing or broken.query_timers.ps1 to inventory all timers, then check each for proper cleanupsrc/shared/ipc_pipe.ahk, src/pump/ filessrc/shared/window_list.ahk (window store), icon/process cachesAfter explore agents report back, validate every finding yourself. Resource "leaks" are frequently false positives where cleanup happens in a different function, on a timer, or at process exit.
For each candidate:
file.ahk lines X–Y" with actual code quoted.Group by severity (per-paint > per-event > per-session > theoretical):
| File | Lines | Resource Type | Leak Description | Impact | Fix |
|---|---|---|---|---|---|
file.ahk | 42–58 | D2D Brush | D2D brush created in paint loop, never released | ~60 handles/sec | Use D2D_GetCachedBrush or static |
For CPU churn findings, use a separate table:
| File | Lines | Pattern | Frequency | Fix |
|---|---|---|---|---|
file.ahk | 100–120 | Timer polls every 100ms, no-ops 99% of the time | 10/sec idle | Adaptive interval or event-driven |
Ignore any existing plans — create a fresh one.