@easynet/agent-runtime 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +9 -24
- package/.github/workflows/release.yml +14 -35
- package/agent-runtime/.github/workflows/ci.yml +68 -0
- package/agent-runtime/.github/workflows/release.yml +95 -0
- package/agent-runtime/.releaserc.cjs +26 -0
- package/agent-runtime/config/agent.deep.yaml +25 -0
- package/agent-runtime/config/agent.react.yaml +24 -0
- package/agent-runtime/example/basic-usage.ts +49 -0
- package/agent-runtime/package-lock.json +7740 -0
- package/agent-runtime/package.json +49 -0
- package/agent-runtime/pnpm-lock.yaml +3712 -0
- package/agent-runtime/scripts/resolve-deps.js +54 -0
- package/agent-runtime/src/agents/deep-agent.ts +165 -0
- package/agent-runtime/src/agents/react-agent.helpers.ts +227 -0
- package/agent-runtime/src/agents/react-agent.ts +584 -0
- package/{src → agent-runtime/src/agents}/sub-agent.ts +2 -2
- package/agent-runtime/src/cli/args.ts +15 -0
- package/agent-runtime/src/cli/event-listener.ts +162 -0
- package/agent-runtime/src/cli/interactive.ts +144 -0
- package/agent-runtime/src/cli/runtime.ts +31 -0
- package/agent-runtime/src/cli/spinner.ts +23 -0
- package/agent-runtime/src/cli/terminal-render.ts +322 -0
- package/agent-runtime/src/cli/types.ts +33 -0
- package/agent-runtime/src/cli.ts +134 -0
- package/agent-runtime/src/config/helpers.ts +179 -0
- package/agent-runtime/src/config/index.ts +245 -0
- package/agent-runtime/src/config/types.ts +62 -0
- package/agent-runtime/src/core/context.ts +266 -0
- package/agent-runtime/src/index.ts +55 -0
- package/agent-runtime/tsconfig.json +18 -0
- package/apps/imessagebot/README.md +38 -0
- package/apps/imessagebot/config/.agent/cache/easynet/agent-tool-buildin/0.0.45/README.md +33 -0
- package/apps/imessagebot/config/.agent/cache/easynet/agent-tool-buildin/0.0.45/package-lock.json +15257 -0
- package/apps/imessagebot/config/.agent/cache/easynet/agent-tool-buildin/0.0.45/package.json +55 -0
- package/apps/imessagebot/config/agents/deep/agent.yaml +31 -0
- package/apps/imessagebot/config/agents/react/agent.yaml +58 -0
- package/apps/imessagebot/config/agents/shared/.agent/cache/easynet/agent-tool-buildin/0.0.43/README.md +33 -0
- package/apps/imessagebot/config/agents/shared/.agent/cache/easynet/agent-tool-buildin/0.0.43/package-lock.json +15457 -0
- package/apps/imessagebot/config/agents/shared/.agent/cache/easynet/agent-tool-buildin/0.0.43/package.json +55 -0
- package/apps/imessagebot/config/agents/shared/.agent/cache/easynet/agent-tool-buildin/0.0.46/README.md +33 -0
- package/apps/imessagebot/config/agents/shared/.agent/cache/easynet/agent-tool-buildin/0.0.46/package-lock.json +15257 -0
- package/apps/imessagebot/config/agents/shared/.agent/cache/easynet/agent-tool-buildin/0.0.46/package.json +62 -0
- package/apps/imessagebot/config/agents/shared/memory.yaml +31 -0
- package/apps/imessagebot/config/agents/shared/model.yaml +23 -0
- package/apps/imessagebot/config/agents/shared/tool.yaml +13 -0
- package/apps/imessagebot/config/app.yaml +14 -0
- package/apps/imessagebot/package-lock.json +53695 -0
- package/apps/imessagebot/package.json +41 -0
- package/apps/imessagebot/pnpm-lock.yaml +1589 -0
- package/apps/imessagebot/scripts/resolve-deps.js +41 -0
- package/apps/imessagebot/scripts/test-llm.mjs +27 -0
- package/apps/imessagebot/scripts/validate-tools-config.mjs +174 -0
- package/apps/imessagebot/src/app/config.ts +76 -0
- package/apps/imessagebot/src/app/context.ts +39 -0
- package/apps/imessagebot/src/config.ts +76 -0
- package/apps/imessagebot/src/context.ts +35 -0
- package/apps/imessagebot/src/index.ts +17 -0
- package/apps/imessagebot/tsconfig.json +18 -0
- package/apps/itermbot/.github/workflows/ci.yml +61 -0
- package/apps/itermbot/.github/workflows/release.yml +80 -0
- package/apps/itermbot/.releaserc.cjs +26 -0
- package/apps/itermbot/README.md +82 -0
- package/apps/itermbot/config/app.yaml +29 -0
- package/apps/itermbot/config/tool.yaml +19 -0
- package/apps/itermbot/config/tsconfig.json +18 -0
- package/apps/itermbot/macos_disk_usage_agent_plan.md +244 -0
- package/apps/itermbot/package-lock.json +53697 -0
- package/apps/itermbot/package.json +57 -0
- package/apps/itermbot/pnpm-lock.yaml +3966 -0
- package/apps/itermbot/scripts/patch-buildin-cache.sh +25 -0
- package/apps/itermbot/scripts/resolve-deps.js +41 -0
- package/apps/itermbot/scripts/test-llm.mjs +32 -0
- package/apps/itermbot/skills/command-explain-and-guard/SKILL.md +39 -0
- package/apps/itermbot/skills/command-explain-and-guard/handler.js +86 -0
- package/apps/itermbot/skills/disk-usage-investigate/SKILL.md +44 -0
- package/apps/itermbot/skills/disk-usage-investigate/handler.js +12 -0
- package/apps/itermbot/skills/gpu-ssh-monitor/SKILL.md +64 -0
- package/apps/itermbot/skills/repo-triage/SKILL.md +40 -0
- package/apps/itermbot/skills/repo-triage/handler.js +56 -0
- package/apps/itermbot/skills/test-failure-diagnose/SKILL.md +43 -0
- package/apps/itermbot/skills/test-failure-diagnose/handler.js +107 -0
- package/apps/itermbot/src/app/config.ts +117 -0
- package/apps/itermbot/src/app/context.ts +39 -0
- package/apps/itermbot/src/config.ts +95 -0
- package/apps/itermbot/src/context.ts +35 -0
- package/apps/itermbot/src/index.ts +223 -0
- package/apps/itermbot/src/iterm/session-hint.ts +40 -0
- package/apps/itermbot/src/iterm/target-panel-policy.ts +220 -0
- package/apps/itermbot/src/iterm/target-routing.ts +419 -0
- package/apps/itermbot/src/startup/colors.ts +317 -0
- package/apps/itermbot/src/startup/diagnostics.ts +97 -0
- package/apps/itermbot/src/startup/ui.ts +141 -0
- package/apps/itermbot/test/target-panel-policy.test.mjs +60 -0
- package/config/agent.deep.yaml +25 -0
- package/config/agent.react.yaml +24 -0
- package/dist/agents/deep-agent.d.ts +37 -0
- package/dist/agents/deep-agent.d.ts.map +1 -0
- package/dist/agents/deep-agent.js +115 -0
- package/dist/agents/deep-agent.js.map +1 -0
- package/dist/agents/react-agent.d.ts +40 -0
- package/dist/agents/react-agent.d.ts.map +1 -0
- package/dist/agents/react-agent.helpers.d.ts +40 -0
- package/dist/agents/react-agent.helpers.d.ts.map +1 -0
- package/dist/agents/react-agent.helpers.js +196 -0
- package/dist/agents/react-agent.helpers.js.map +1 -0
- package/dist/agents/react-agent.js +400 -0
- package/dist/agents/react-agent.js.map +1 -0
- package/dist/agents/sub-agent.d.ts +34 -0
- package/dist/agents/sub-agent.d.ts.map +1 -0
- package/dist/agents/sub-agent.js +53 -0
- package/dist/agents/sub-agent.js.map +1 -0
- package/dist/cli/args.d.ts +8 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +9 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/event-listener.d.ts +3 -0
- package/dist/cli/event-listener.d.ts.map +1 -0
- package/dist/cli/event-listener.js +131 -0
- package/dist/cli/event-listener.js.map +1 -0
- package/dist/cli/interactive.d.ts +4 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +118 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/runtime.d.ts +8 -0
- package/dist/cli/runtime.d.ts.map +1 -0
- package/dist/cli/runtime.js +27 -0
- package/dist/cli/runtime.js.map +1 -0
- package/dist/cli/spinner.d.ts +2 -0
- package/dist/cli/spinner.d.ts.map +1 -0
- package/dist/cli/spinner.js +22 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/terminal-render.d.ts +7 -0
- package/dist/cli/terminal-render.d.ts.map +1 -0
- package/dist/cli/terminal-render.js +282 -0
- package/dist/cli/terminal-render.js.map +1 -0
- package/dist/cli/types.d.ts +29 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +3 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli.d.ts +4 -41
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +84 -588
- package/dist/cli.js.map +1 -1
- package/dist/config/helpers.d.ts +6 -0
- package/dist/config/helpers.d.ts.map +1 -0
- package/dist/config/helpers.js +164 -0
- package/dist/config/helpers.js.map +1 -0
- package/dist/config/index.d.ts +15 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +160 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +57 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context.d.ts +8 -69
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +44 -24
- package/dist/context.js.map +1 -1
- package/dist/core/context.d.ts +66 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +149 -0
- package/dist/core/context.js.map +1 -0
- package/dist/deep-agent.d.ts +5 -2
- package/dist/deep-agent.d.ts.map +1 -1
- package/dist/deep-agent.js +44 -11
- package/dist/deep-agent.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/middleware/malformed-tool-call-middleware.d.ts +8 -0
- package/dist/middleware/malformed-tool-call-middleware.d.ts.map +1 -0
- package/dist/middleware/malformed-tool-call-middleware.js +191 -0
- package/dist/middleware/malformed-tool-call-middleware.js.map +1 -0
- package/dist/react-agent.d.ts +2 -2
- package/dist/react-agent.d.ts.map +1 -1
- package/dist/react-agent.js +28 -9
- package/dist/react-agent.js.map +1 -1
- package/package.json +1 -1
- package/scripts/resolve-deps.js +54 -0
- package/src/agents/deep-agent.ts +165 -0
- package/src/agents/react-agent.helpers.ts +227 -0
- package/src/agents/react-agent.ts +584 -0
- package/src/agents/sub-agent.ts +82 -0
- package/src/cli/args.ts +15 -0
- package/src/cli/event-listener.ts +162 -0
- package/src/cli/interactive.ts +144 -0
- package/src/cli/runtime.ts +31 -0
- package/src/cli/spinner.ts +23 -0
- package/src/cli/terminal-render.ts +322 -0
- package/src/cli/types.ts +33 -0
- package/src/cli.ts +91 -702
- package/src/config/helpers.ts +179 -0
- package/src/config/index.ts +245 -0
- package/src/config/types.ts +62 -0
- package/src/core/context.ts +266 -0
- package/src/index.ts +13 -11
- package/src/middleware/malformed-tool-call-middleware.ts +239 -0
- package/src/types/markdown-it-terminal.d.ts +4 -0
- package/src/types/marked-terminal.d.ts +16 -0
- package/dist/config.d.ts +0 -86
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -84
- package/dist/config.js.map +0 -1
- package/src/config.ts +0 -177
- package/src/context.ts +0 -247
- package/src/deep-agent.ts +0 -104
- package/src/react-agent.ts +0 -576
- /package/{src → agent-runtime/src/middleware}/malformed-tool-call-middleware.ts +0 -0
- /package/{src → agent-runtime/src/types}/markdown-it-terminal.d.ts +0 -0
- /package/{src → agent-runtime/src/types}/marked-terminal.d.ts +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# iTermBot
|
|
2
|
+
|
|
3
|
+
iTermBot is an application built on the **@easynet** agent framework. It runs two agents:
|
|
4
|
+
|
|
5
|
+
1. **ReAct agent** — LangChain `createAgent` (ReAct pattern) with tools and memory.
|
|
6
|
+
2. **Deep agent** — DeepAgents `createDeepAgent` with a persistent store backed by agent-memory.
|
|
7
|
+
|
|
8
|
+
Both agents share:
|
|
9
|
+
|
|
10
|
+
- **@easynet/agent-common** — YAML config (app, paths).
|
|
11
|
+
- **@easynet/agent-model** — LLM and embedding models (falls back to module default config).
|
|
12
|
+
- **@easynet/agent-memory** — Agent memory (recall/inject for ReAct; store adapter for Deep).
|
|
13
|
+
- **@easynet/agent-tool** + **@easynet/agent-tool-buildin** — Tools (FS, HTTP, util, exec, etc.).
|
|
14
|
+
|
|
15
|
+
## Prerequisites
|
|
16
|
+
|
|
17
|
+
- Node.js >= 18
|
|
18
|
+
- Ollama (or another OpenAI-compatible endpoint) for the LLM. Default config uses `http://localhost:11434/v1` and `qwen3:0.6b`.
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
Build from source workspace:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cd apps/itermbot
|
|
26
|
+
npm install
|
|
27
|
+
npm run build
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Tool support uses agent-tool’s `@easynet/agent-tool` and `@easynet/agent-tool-buildin` from the npm registry.
|
|
31
|
+
|
|
32
|
+
## Config
|
|
33
|
+
|
|
34
|
+
| File | Purpose |
|
|
35
|
+
|------|--------|
|
|
36
|
+
| `config/app.yaml` | App-level settings (`agent`, `printSteps`, prompt templates). |
|
|
37
|
+
|
|
38
|
+
Agent profile defaults (model/memory/tool/skills) are resolved by `@easynet/agent-runtime`.
|
|
39
|
+
Top-level app config only overrides runtime defaults.
|
|
40
|
+
|
|
41
|
+
Tool config now falls back to `@easynet/agent-tool` module defaults when app-level tool config is not provided.
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
- **Interactive (ReAct agent):**
|
|
46
|
+
```bash
|
|
47
|
+
npm start
|
|
48
|
+
# or
|
|
49
|
+
npm run react
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- **Interactive (Deep agent):**
|
|
53
|
+
```bash
|
|
54
|
+
npm run deep
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- **One-shot query:**
|
|
58
|
+
```bash
|
|
59
|
+
node dist/index.js react "What time is it?"
|
|
60
|
+
node dist/index.js deep "Remember I prefer short answers."
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Scripts
|
|
64
|
+
|
|
65
|
+
| Script | Description |
|
|
66
|
+
|--------|-------------|
|
|
67
|
+
| `npm run build` | Compile TypeScript to `dist/`. |
|
|
68
|
+
| `npm start` | Run interactive with ReAct agent. |
|
|
69
|
+
| `npm run react` | Same as start (ReAct). |
|
|
70
|
+
| `npm run deep` | Interactive with Deep agent. |
|
|
71
|
+
| `npm run typecheck` | Type-check only. |
|
|
72
|
+
| `npm run test:llm` | Test LLM config (scripts/test-llm.mjs). |
|
|
73
|
+
|
|
74
|
+
## Architecture
|
|
75
|
+
|
|
76
|
+
- **src/index.ts** — CLI startup and orchestration.
|
|
77
|
+
- **src/context.ts** — Shared `BotContext` builders (LLM/memory/tools/skills).
|
|
78
|
+
- **src/config.ts** — App-level override adapter on top of runtime config.
|
|
79
|
+
- **src/startup/** — startup UI, diagnostics, and panel color bootstrapping.
|
|
80
|
+
- **src/iterm/** — iTerm session routing and target session prompt injection.
|
|
81
|
+
|
|
82
|
+
Both agents use the same LLM, memory backend, and tool set; only the orchestration (ReAct vs Deep) differs.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
apiVersion: easynet.world/v1
|
|
2
|
+
kind: AppConfig
|
|
3
|
+
metadata:
|
|
4
|
+
name: itermbot
|
|
5
|
+
spec:
|
|
6
|
+
agent: react
|
|
7
|
+
|
|
8
|
+
printSteps: false
|
|
9
|
+
|
|
10
|
+
promptTemplates:
|
|
11
|
+
itermPolicy: |
|
|
12
|
+
## iTerm Operating Policy
|
|
13
|
+
- Target panel output is the remote source of truth.
|
|
14
|
+
- Never use local machine commands for system/project data collection.
|
|
15
|
+
- For remote operations/investigation, use `itermRunCommandInSession` in target panel.
|
|
16
|
+
- For current screen/panel analysis, never ask user to paste text; capture via no-op `:`.
|
|
17
|
+
- For full coverage, paginate with `outputOffsetLines + maxOutputLines`, summarize by chunk, then merge.
|
|
18
|
+
- If output is long, use bounded chunk analysis with interim summaries and one final conclusion.
|
|
19
|
+
- Prefer fast/low-cost commands; avoid heavy full scans/builds/tests unless required.
|
|
20
|
+
- Host may auto-update target panel when focus moves to a non-chat panel.
|
|
21
|
+
- Final response must be valid Markdown with stable formatting.
|
|
22
|
+
- Host may auto-recover target routing (reuse non-chat pane or auto-split); if still failing, ask user.
|
|
23
|
+
targetSession: |
|
|
24
|
+
## Target Panel Session
|
|
25
|
+
Routed target panel (may change at runtime):
|
|
26
|
+
- sessionId: "{{sessionId}}"
|
|
27
|
+
- windowId: {{windowId}}
|
|
28
|
+
- tabIndex: {{tabIndex}}
|
|
29
|
+
Never use `windowId: 0` and never guess IDs.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
apiVersion: easynet.world/v1
|
|
2
|
+
kind: ToolConfig
|
|
3
|
+
metadata:
|
|
4
|
+
name: itermbot-local-tool-config
|
|
5
|
+
spec:
|
|
6
|
+
tools:
|
|
7
|
+
list:
|
|
8
|
+
- file:../../../agent-tool-buildin#itermCreateWindow
|
|
9
|
+
- file:../../../agent-tool-buildin#itermCreateTab
|
|
10
|
+
- file:../../../agent-tool-buildin#itermSplitPane
|
|
11
|
+
- file:../../../agent-tool-buildin#itermResizeWindow
|
|
12
|
+
- file:../../../agent-tool-buildin#itermRename
|
|
13
|
+
- file:../../../agent-tool-buildin#itermSetBackgroundColor
|
|
14
|
+
- file:../../../agent-tool-buildin#itermSetSessionColors
|
|
15
|
+
- file:../../../agent-tool-buildin#itermSendText
|
|
16
|
+
- file:../../../agent-tool-buildin#itermRunCommandInSession
|
|
17
|
+
- file:../../../agent-tool-buildin#itermListCurrentWindowSessions
|
|
18
|
+
- file:../../../agent-tool-buildin#itermGetSessionInfo
|
|
19
|
+
- file:../../../agent-tool-buildin#itermListWindows
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"outDir": "../dist",
|
|
7
|
+
"rootDir": "../src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"declaration": true,
|
|
12
|
+
"declarationMap": true,
|
|
13
|
+
"sourceMap": true,
|
|
14
|
+
"resolveJsonModule": true
|
|
15
|
+
},
|
|
16
|
+
"include": ["../src/**/*"],
|
|
17
|
+
"exclude": ["../node_modules", "../dist"]
|
|
18
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# macOS 硬盘占用调查 AI Agent 方案(快速定位大户)
|
|
2
|
+
|
|
3
|
+
> 目标:让 Agent 用**最少的命令**在 macOS 上快速定位“占空间最大的目录/文件类别”,并输出结构化报告。
|
|
4
|
+
> 默认原则:**只读调查**(不删除、不改系统状态),除非你明确授权。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0) 核心思路:分层探测 + 剪枝 + 并行
|
|
9
|
+
|
|
10
|
+
- **分层探测**:先看 `/System/Volumes/Data`(数据卷)一级目录,再对“大户”逐层下钻。
|
|
11
|
+
- **剪枝**:小于阈值就停止下钻;耗时过长就跳过并记录。
|
|
12
|
+
- **并行**:同时扫 2~4 个路径即可(避免把机器打爆)。
|
|
13
|
+
- **专项黑洞检查**:Time Machine 本地快照、iOS 备份、Xcode、Docker、Homebrew、Caches 等。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1) 全局画像(最快判断是不是快照/卷层面问题)
|
|
18
|
+
|
|
19
|
+
### 1.1 盘与卷的占用
|
|
20
|
+
```bash
|
|
21
|
+
df -h
|
|
22
|
+
diskutil list
|
|
23
|
+
diskutil apfs list
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**判断点**
|
|
27
|
+
- `df -h`:哪个挂载点 `%Used` 最高(常见 `/`、`/System/Volumes/Data`)。
|
|
28
|
+
- `diskutil apfs list`:看 APFS Container 空间分配/可用空间是否异常。
|
|
29
|
+
|
|
30
|
+
### 1.2 Time Machine 本地快照是否吞空间(常见)
|
|
31
|
+
```bash
|
|
32
|
+
tmutil listlocalsnapshots /
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
> ⚠️ 注意:下面命令可能会释放空间(会改变系统状态),默认**不要**让 Agent 自动执行。
|
|
36
|
+
> 只在你明确授权时执行:
|
|
37
|
+
```bash
|
|
38
|
+
tmutil thinlocalsnapshots / 10000000000 4
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2) 快速定位“大目录”:两层 du 下钻(只扫 Data)
|
|
44
|
+
|
|
45
|
+
> macOS 系统/数据分卷;真正长胖的通常在 **Data**:
|
|
46
|
+
> `/System/Volumes/Data`
|
|
47
|
+
|
|
48
|
+
### 2.1 扫 Data 一级目录(速度非常快)
|
|
49
|
+
```bash
|
|
50
|
+
sudo du -xhd 1 /System/Volumes/Data 2>/dev/null | sort -h
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
常见大户:
|
|
54
|
+
- `/System/Volumes/Data/Users`
|
|
55
|
+
- `/System/Volumes/Data/Library`
|
|
56
|
+
- `/System/Volumes/Data/private/var`
|
|
57
|
+
|
|
58
|
+
### 2.2 对大户再下钻一级
|
|
59
|
+
例如 `Users` 很大:
|
|
60
|
+
```bash
|
|
61
|
+
sudo du -xhd 1 /System/Volumes/Data/Users 2>/dev/null | sort -h
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
再对你的 home 下钻:
|
|
65
|
+
```bash
|
|
66
|
+
sudo du -xhd 1 /System/Volumes/Data/Users/<you> 2>/dev/null | sort -h
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 3) 常见“容量黑洞”专项检查清单(优先级从高到低)
|
|
72
|
+
|
|
73
|
+
> 建议:Agent 在定位到用户目录后,先跑这些固定路径,能极大提升命中率。
|
|
74
|
+
|
|
75
|
+
### 3.1 用户目录常见大头
|
|
76
|
+
|
|
77
|
+
#### Downloads / Desktop
|
|
78
|
+
```bash
|
|
79
|
+
du -hd 1 ~/Downloads | sort -h | tail -n 30
|
|
80
|
+
du -hd 1 ~/Desktop | sort -h | tail -n 30
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### iPhone / iPad 备份(极常见)
|
|
84
|
+
```bash
|
|
85
|
+
du -hd 1 ~/Library/Application\ Support/MobileSync/Backup 2>/dev/null | sort -h
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
#### Mail / Messages / Photos
|
|
89
|
+
```bash
|
|
90
|
+
du -hd 1 ~/Library/Mail 2>/dev/null | sort -h
|
|
91
|
+
du -hd 1 ~/Library/Messages 2>/dev/null | sort -h
|
|
92
|
+
du -hd 1 ~/Pictures 2>/dev/null | sort -h
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### Caches / Containers
|
|
96
|
+
```bash
|
|
97
|
+
du -hd 1 ~/Library/Caches 2>/dev/null | sort -h | tail -n 50
|
|
98
|
+
du -hd 1 ~/Library/Containers 2>/dev/null | sort -h | tail -n 50
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### 3.2 开发者机器常见大头
|
|
104
|
+
|
|
105
|
+
#### Xcode / iOS 模拟器 / DerivedData
|
|
106
|
+
```bash
|
|
107
|
+
du -hd 1 ~/Library/Developer/Xcode 2>/dev/null | sort -h
|
|
108
|
+
du -hd 1 ~/Library/Developer/CoreSimulator 2>/dev/null | sort -h
|
|
109
|
+
du -hd 1 ~/Library/Developer/Xcode/DerivedData 2>/dev/null | sort -h
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
#### Docker(常见爆仓)
|
|
113
|
+
```bash
|
|
114
|
+
du -sh ~/Library/Containers/com.docker.docker 2>/dev/null
|
|
115
|
+
du -sh ~/Library/Group\ Containers/group.com.docker 2>/dev/null
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### Homebrew(Cellar / Cache)
|
|
119
|
+
```bash
|
|
120
|
+
du -sh /opt/homebrew/Cellar 2>/dev/null
|
|
121
|
+
du -sh /opt/homebrew/Caskroom 2>/dev/null
|
|
122
|
+
du -sh ~/Library/Caches/Homebrew 2>/dev/null
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 4) 更深层“兜底扫描”(可选,但很管用)
|
|
128
|
+
|
|
129
|
+
> 这个会更慢一些,但能找出 `node_modules`、`venv`、`build`、大型缓存目录等。
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
sudo du -xhd 4 /System/Volumes/Data/Users/<you> 2>/dev/null | sort -h | tail -n 50
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 5) 并行扫描模板(控制并发 2~4)
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
printf "%s\n" "/System/Volumes/Data/Users" "/System/Volumes/Data/Library" "/System/Volumes/Data/private/var" | xargs -I{} -P 3 sh -c 'sudo du -xhd 1 "{}" 2>/dev/null | sort -h | tail -n 20; echo "---- {} ----"'
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
建议参数:
|
|
144
|
+
- `-P 2` 或 `-P 3`:更稳
|
|
145
|
+
- 扫描深度先从 `-d 1` 起步
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 6) Agent 速度关键:剪枝规则(强烈建议写进策略)
|
|
150
|
+
|
|
151
|
+
### 6.1 仅扫描目标范围
|
|
152
|
+
- 只扫 `/System/Volumes/Data`(避免系统目录与无意义扫描)
|
|
153
|
+
- `du` 使用 `-x` 不跨文件系统,避免扫到外接盘/其它挂载点
|
|
154
|
+
|
|
155
|
+
### 6.2 下钻与停止条件(推荐默认值)
|
|
156
|
+
- **深度阶梯**:`1 → 2 → 3`(很少需要 > 4)
|
|
157
|
+
- **继续下钻阈值**:
|
|
158
|
+
- 目录大小 **> 20GB** 或
|
|
159
|
+
- 占本层总量 **> 25%**
|
|
160
|
+
- **停止条件**:
|
|
161
|
+
- 本层最大目录 **< 5GB**:停止下钻,换下一个路径
|
|
162
|
+
- 扫描某目录超过 **20s**:记录为“耗时过长”,跳过(后面专项处理)
|
|
163
|
+
|
|
164
|
+
### 6.3 安全策略(默认只读)
|
|
165
|
+
- 默认禁止执行会改变系统状态的命令(例如:
|
|
166
|
+
- `tmutil thinlocalsnapshots ...`
|
|
167
|
+
- `rm -rf ...`
|
|
168
|
+
- `docker system prune ...`
|
|
169
|
+
- 清理 Xcode DerivedData 等)
|
|
170
|
+
- 这些动作仅在你明确授权后执行(Agent 在报告中列出候选与影响范围)。
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 7) 报告输出格式(建议 Agent 统一输出)
|
|
175
|
+
|
|
176
|
+
1. **磁盘概览**
|
|
177
|
+
- `df -h`(只保留关键行:`/` 与 `/System/Volumes/Data`)
|
|
178
|
+
2. **Top 大目录(分层)**
|
|
179
|
+
- Data 一级 top 10
|
|
180
|
+
- `Users` 一级 top 10
|
|
181
|
+
- 你的 home 一级 top 10(或进一步下钻结果)
|
|
182
|
+
3. **专项黑洞检查结果**
|
|
183
|
+
- Time Machine 本地快照数量与日期范围
|
|
184
|
+
- iOS Backup 大小
|
|
185
|
+
- Xcode / Docker / Homebrew / Caches / Containers 大小
|
|
186
|
+
4. **清理候选清单(仅建议,不执行)**
|
|
187
|
+
- `路径` + `大小` + `风险说明`(例如“仅缓存,可重建”、“可能包含重要备份”等)
|
|
188
|
+
5. **需要你确认后才能执行的释放空间动作**
|
|
189
|
+
- 列出命令与预期效果、潜在影响、回滚/恢复建议
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 8) 最小可用 Agent 逻辑(伪代码)
|
|
194
|
+
|
|
195
|
+
```text
|
|
196
|
+
root = "/System/Volumes/Data"
|
|
197
|
+
|
|
198
|
+
run df -h, diskutil apfs list
|
|
199
|
+
run tmutil listlocalsnapshots /
|
|
200
|
+
|
|
201
|
+
top1 = du(depth=1, path=root)
|
|
202
|
+
candidates = pick(top1, size>20GB or share>25%)
|
|
203
|
+
|
|
204
|
+
for c in candidates:
|
|
205
|
+
top2 = du(depth=1, path=c)
|
|
206
|
+
if max(top2) < 5GB: continue
|
|
207
|
+
subc = pick(top2, size>20GB or share>25%)
|
|
208
|
+
repeat until depth_limit=3 or stop_condition
|
|
209
|
+
|
|
210
|
+
run blackhole_checks (iOS backup, caches, xcode, docker, brew...)
|
|
211
|
+
compile report
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 9) 你可以直接复用的“命令清单”(按执行顺序)
|
|
217
|
+
|
|
218
|
+
### 9.1 全局
|
|
219
|
+
```bash
|
|
220
|
+
df -h
|
|
221
|
+
diskutil apfs list
|
|
222
|
+
tmutil listlocalsnapshots /
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 9.2 分层定位
|
|
226
|
+
```bash
|
|
227
|
+
sudo du -xhd 1 /System/Volumes/Data 2>/dev/null | sort -h
|
|
228
|
+
sudo du -xhd 1 /System/Volumes/Data/Users 2>/dev/null | sort -h
|
|
229
|
+
sudo du -xhd 1 /System/Volumes/Data/Users/<you> 2>/dev/null | sort -h
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 9.3 黑洞专项
|
|
233
|
+
```bash
|
|
234
|
+
du -hd 1 ~/Library/Application\ Support/MobileSync/Backup 2>/dev/null | sort -h
|
|
235
|
+
du -hd 1 ~/Library/Caches 2>/dev/null | sort -h | tail -n 50
|
|
236
|
+
du -hd 1 ~/Library/Developer/Xcode 2>/dev/null | sort -h
|
|
237
|
+
du -sh ~/Library/Containers/com.docker.docker 2>/dev/null
|
|
238
|
+
du -sh /opt/homebrew/Cellar 2>/dev/null
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 总结
|
|
244
|
+
这套方案用 **Data 卷优先 + du 分层下钻 + 剪枝/超时/并行 + 黑洞路径专项检查**,让 Agent 在很少命令内迅速锁定“谁在吃空间”;默认只输出报告与建议,释放空间动作等你授权后再执行。
|