@coreyuan/vector-mind 1.0.54 → 1.1.0
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/README.md +99 -72
- package/admin-panel/README.md +77 -0
- package/admin-panel/dist/client/assets/index-Bzyjdhh2.css +1 -0
- package/admin-panel/dist/client/assets/index-Ph73ewzt.js +9 -0
- package/admin-panel/dist/client/index.html +14 -0
- package/admin-panel/package.json +25 -0
- package/admin-panel/server/index.mjs +1424 -0
- package/admin-panel/server/security.mjs +117 -0
- package/admin-panel/server/security.test.mjs +113 -0
- package/admin-panel/server/storage.mjs +49 -0
- package/admin-panel/server/storage.test.mjs +36 -0
- package/dist/checkpoint-snapshot.d.ts +56 -0
- package/dist/checkpoint-snapshot.js +411 -0
- package/dist/checkpoint-snapshot.js.map +1 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/context-governance.d.ts +56 -0
- package/dist/context-governance.js +176 -0
- package/dist/context-governance.js.map +1 -0
- package/dist/database-runtime.d.ts +3 -1
- package/dist/database-runtime.js +232 -127
- package/dist/database-runtime.js.map +1 -1
- package/dist/development-warnings.d.ts +2 -1
- package/dist/development-warnings.js +90 -20
- package/dist/development-warnings.js.map +1 -1
- package/dist/file-indexing.d.ts +2 -1
- package/dist/file-indexing.js +127 -47
- package/dist/file-indexing.js.map +1 -1
- package/dist/grep.js +4 -0
- package/dist/grep.js.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/large-file-split.d.ts +52 -8
- package/dist/large-file-split.js +290 -76
- package/dist/large-file-split.js.map +1 -1
- package/dist/memory-maintenance/compaction.js +3 -2
- package/dist/memory-maintenance/compaction.js.map +1 -1
- package/dist/memory-maintenance/metrics.d.ts +1 -1
- package/dist/memory-maintenance/metrics.js +11 -3
- package/dist/memory-maintenance/metrics.js.map +1 -1
- package/dist/memory-maintenance/purge.js +1 -1
- package/dist/memory-maintenance/purge.js.map +1 -1
- package/dist/memory-maintenance/runner.d.ts +1 -0
- package/dist/memory-maintenance/runner.js +15 -3
- package/dist/memory-maintenance/runner.js.map +1 -1
- package/dist/memory-maintenance/types.d.ts +1 -0
- package/dist/memory-mutations.d.ts +3 -3
- package/dist/memory-mutations.js +109 -43
- package/dist/memory-mutations.js.map +1 -1
- package/dist/memory-recall.js +16 -1
- package/dist/memory-recall.js.map +1 -1
- package/dist/operation-scope.js +42 -12
- package/dist/operation-scope.js.map +1 -1
- package/dist/path-containment.d.ts +5 -0
- package/dist/path-containment.js +64 -0
- package/dist/path-containment.js.map +1 -0
- package/dist/path-filters.d.ts +1 -1
- package/dist/path-filters.js +7 -6
- package/dist/path-filters.js.map +1 -1
- package/dist/pending-changes.d.ts +5 -0
- package/dist/pending-changes.js +26 -16
- package/dist/pending-changes.js.map +1 -1
- package/dist/project-files.d.ts +1 -0
- package/dist/project-files.js +19 -10
- package/dist/project-files.js.map +1 -1
- package/dist/root.d.ts +4 -1
- package/dist/root.js +34 -4
- package/dist/root.js.map +1 -1
- package/dist/rtk-integrity.d.ts +5 -0
- package/dist/rtk-integrity.js +35 -0
- package/dist/rtk-integrity.js.map +1 -0
- package/dist/rtk-shim.js +22 -9
- package/dist/rtk-shim.js.map +1 -1
- package/dist/rtk-tools.d.ts +8 -0
- package/dist/rtk-tools.js +59 -42
- package/dist/rtk-tools.js.map +1 -1
- package/dist/server-instructions.js +8 -88
- package/dist/server-instructions.js.map +1 -1
- package/dist/tool-catalog.d.ts +2 -0
- package/dist/tool-catalog.js +76 -23
- package/dist/tool-catalog.js.map +1 -1
- package/dist/tool-handlers/context-recovery.js +79 -54
- package/dist/tool-handlers/context-recovery.js.map +1 -1
- package/dist/tool-handlers/large-files.js +600 -44
- package/dist/tool-handlers/large-files.js.map +1 -1
- package/dist/tool-handlers/memory-diagnostics.js +240 -45
- package/dist/tool-handlers/memory-diagnostics.js.map +1 -1
- package/dist/tool-handlers/memory.js +167 -22
- package/dist/tool-handlers/memory.js.map +1 -1
- package/dist/tool-handlers/operations.js +28 -8
- package/dist/tool-handlers/operations.js.map +1 -1
- package/dist/tool-handlers/requirement-status.d.ts +5 -0
- package/dist/tool-handlers/requirement-status.js +267 -0
- package/dist/tool-handlers/requirement-status.js.map +1 -0
- package/dist/tool-handlers/requirements.js +786 -97
- package/dist/tool-handlers/requirements.js.map +1 -1
- package/dist/tool-handlers.d.ts +4 -0
- package/dist/tool-handlers.js +183 -10
- package/dist/tool-handlers.js.map +1 -1
- package/dist/tool-output.d.ts +32 -1
- package/dist/tool-output.js +31 -12
- package/dist/tool-output.js.map +1 -1
- package/dist/tool-schemas.d.ts +235 -0
- package/dist/tool-schemas.js +98 -26
- package/dist/tool-schemas.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/docs/capability-matrix.md +23 -17
- package/package.json +19 -6
- package/skills/vector-mind-autopilot/SKILL.md +82 -23
- package/skills/vector-mind-autopilot/references/claude-project-instructions.md +14 -11
- package/skills/vector-mind-autopilot/references/universal-system-prompt.md +24 -16
package/README.md
CHANGED
|
@@ -1,56 +1,43 @@
|
|
|
1
1
|
# VectorMind MCP
|
|
2
2
|
|
|
3
|
-
VectorMind
|
|
3
|
+
VectorMind 是面向 AI 编程助手的本地项目记忆 MCP。它把需求、决策、改动原因、项目约定和文件状态保存在项目目录内,帮助长周期开发减少上下文丢失、跨项目串线和旧逻辑回退。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
当前版本:`1.1.0`
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 核心能力
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
- **恢复项目上下文**:按当前目标找回项目摘要、需求、决策、约定和相关记忆。
|
|
10
|
+
- **约束改动范围**:编辑前核对需求条目、计划文件和巨量文件治理要求。
|
|
11
|
+
- **记录改动意图**:把变更文件、实现原因、验证结果和遗留缺口归档到对应需求。
|
|
12
|
+
- **管理需求生命周期**:支持串行任务、显式并行任务、恢复已完成任务和更新验证结果。
|
|
13
|
+
- **更新权威决策**:新决策可以 supersede 旧需求或旧记忆,避免后续会话按过时规则实现。
|
|
14
|
+
- **隔离多个项目**:记忆、pending buffer、索引和数据库都按 `project_root` 隔离。
|
|
15
|
+
- **安全读取项目文件**:使用 canonical realpath 校验,拒绝通过符号链接或 junction 越过项目边界。
|
|
16
|
+
- **保存长期会话检查点**:创建有界、版本化 checkpoint,并只读恢复或比较上下文。
|
|
17
|
+
- **诊断记忆质量**:检查冲突、重复、过大 checkpoint、陈旧索引和孤立记忆。
|
|
18
|
+
- **控制上下文体积**:默认使用精简工具集和紧凑输出,大结果会保留关键 ID 与完成状态。
|
|
10
19
|
|
|
11
|
-
-
|
|
12
|
-
- **守住需求边界**:修改前先确认当前需求和计划文件,减少乱改无关模块。
|
|
13
|
-
- **逐条核对需求**:当需求有明确条目时,改动计划必须能对应到这些条目,避免 AI 自己扩展需求。
|
|
14
|
-
- **隔离多项目上下文**:同一会话切换项目时,会提示这是另一个项目的只读参考,减少串项目、串记忆。
|
|
15
|
-
- **记录改动原因**:改完后保存“改了什么、为什么改”,后续会话能接上。
|
|
16
|
-
- **让新决策覆盖旧记忆**:需求反转或规则更新后,可以标记旧记忆过时,避免 AI 按旧规则回退功能。
|
|
17
|
-
- **查看上下文时间线**:按需求、文件、记忆或关键词查看前后发生了什么,帮助判断新旧关系。
|
|
18
|
-
- **保存会话检查点**:长会话或交接前保存 waypoint,后续只读恢复上下文,不改变模型判断。
|
|
19
|
-
- **诊断记忆质量**:检查记忆冲突、重复记忆和 checkpoint 差异,只给证据,不自动修改。
|
|
20
|
-
- **沉淀项目知识**:保存架构说明、构建命令、命名规则、注意事项和 TODO。
|
|
21
|
-
- **定位代码和搜索文本**:帮 AI 找函数、类、配置、关键逻辑,不靠猜。
|
|
22
|
-
- **安全读取文件**:按目录、按行、按大小读取,避免一次塞入过多上下文。
|
|
23
|
-
- **治理巨量文件**:遇到几千行实现文件,会要求先做真实模块拆分,不继续往大文件里堆代码。
|
|
24
|
-
- **维护长期记忆**:压缩过时记忆、清理无效索引,减轻大项目越用越慢的问题。
|
|
25
|
-
- **减少输出占用**:默认返回简洁结果,并可配合 `rtk` 降低命令输出负担。
|
|
20
|
+
完整能力表见 [docs/capability-matrix.md](docs/capability-matrix.md)。
|
|
26
21
|
|
|
27
|
-
|
|
22
|
+
## 快速安装
|
|
28
23
|
|
|
29
|
-
|
|
24
|
+
推荐直接把项目地址发给你的 AI 编程助手,让它自动完成安装和配置:
|
|
30
25
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
VectorMind
|
|
34
|
-
|
|
35
|
-
## 巨量文件规则
|
|
36
|
-
|
|
37
|
-
当实现文件达到巨量阈值时,VectorMind 会提示:
|
|
38
|
-
|
|
39
|
-
- 不要继续往这个文件里加新功能。
|
|
40
|
-
- 先做机械搬迁式模块化拆分。
|
|
41
|
-
- 使用真实模块名和清晰目录。
|
|
42
|
-
- 禁止 `*.generated.*`、`.parts`、`*.rs.parts`、`part1/part2`、`1_xxx/2_xxx` 这类假拆分或排序式命名。
|
|
43
|
-
- 拆分计划和结果会被记录,后续会话知道这个文件正在或已经被治理。
|
|
26
|
+
```text
|
|
27
|
+
请安装并配置 VectorMind MCP:
|
|
28
|
+
https://github.com/yuanfeng-net/VectorMind
|
|
44
29
|
|
|
45
|
-
|
|
30
|
+
请自动识别我当前使用的 AI 编程客户端,完成安装、MCP 配置和可用性验证。
|
|
31
|
+
除非缺少必要权限,否则不需要让我手动执行命令。
|
|
32
|
+
```
|
|
46
33
|
|
|
47
|
-
|
|
34
|
+
通常只需要发送 GitHub 地址并说明“帮我安装”即可。AI 会根据仓库说明识别当前客户端、更新对应的 MCP 配置并验证是否可用,用户不需要记安装命令或手动编辑配置文件。
|
|
48
35
|
|
|
49
|
-
|
|
36
|
+
## 手动安装与配置(可选)
|
|
50
37
|
|
|
51
|
-
|
|
38
|
+
需要自己配置时,运行环境要求 Node.js `20.19.0` 或更高版本。
|
|
52
39
|
|
|
53
|
-
|
|
40
|
+
直接运行 MCP:
|
|
54
41
|
|
|
55
42
|
```bash
|
|
56
43
|
npx -y @coreyuan/vector-mind
|
|
@@ -62,14 +49,15 @@ npx -y @coreyuan/vector-mind
|
|
|
62
49
|
npm install -g @coreyuan/vector-mind
|
|
63
50
|
```
|
|
64
51
|
|
|
65
|
-
|
|
52
|
+
全局安装后提供三个命令:
|
|
66
53
|
|
|
67
54
|
```text
|
|
68
|
-
vector-mind
|
|
69
|
-
|
|
55
|
+
vector-mind # MCP stdio 服务
|
|
56
|
+
vector-mind-admin # 生产模式管理面板
|
|
57
|
+
rtk # RTK 兼容入口
|
|
70
58
|
```
|
|
71
59
|
|
|
72
|
-
|
|
60
|
+
### 手动配置 Codex
|
|
73
61
|
|
|
74
62
|
在 `~/.codex/config.toml` 添加:
|
|
75
63
|
|
|
@@ -80,9 +68,9 @@ command = "npx"
|
|
|
80
68
|
args = ["-y", "@coreyuan/vector-mind"]
|
|
81
69
|
```
|
|
82
70
|
|
|
83
|
-
配置后重启 Codex
|
|
71
|
+
配置后重启 Codex,并在新任务中使用。
|
|
84
72
|
|
|
85
|
-
|
|
73
|
+
### 手动配置 Claude Desktop
|
|
86
74
|
|
|
87
75
|
```json
|
|
88
76
|
{
|
|
@@ -95,48 +83,87 @@ args = ["-y", "@coreyuan/vector-mind"]
|
|
|
95
83
|
}
|
|
96
84
|
```
|
|
97
85
|
|
|
98
|
-
##
|
|
86
|
+
## 管理面板
|
|
99
87
|
|
|
100
|
-
|
|
88
|
+
全局安装后直接启动:
|
|
101
89
|
|
|
102
|
-
```
|
|
103
|
-
|
|
90
|
+
```bash
|
|
91
|
+
vector-mind-admin
|
|
104
92
|
```
|
|
105
93
|
|
|
106
|
-
|
|
94
|
+
默认地址为 [http://127.0.0.1:16860](http://127.0.0.1:16860)。默认只监听回环地址,并为回环请求建立当前页面会话,不需要手动输入令牌。
|
|
107
95
|
|
|
108
|
-
|
|
109
|
-
|
|
96
|
+
从源码运行:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm ci
|
|
100
|
+
npm run build
|
|
101
|
+
npm run admin:start
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
开发模式使用 Vite 中间件和 HMR:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm run admin:dev
|
|
110
108
|
```
|
|
111
109
|
|
|
112
|
-
|
|
110
|
+
可用环境变量:
|
|
113
111
|
|
|
114
|
-
|
|
112
|
+
| 变量 | 默认值 | 说明 |
|
|
113
|
+
| --- | --- | --- |
|
|
114
|
+
| `VECTORMIND_ADMIN_HOST` | `127.0.0.1` | 管理服务监听地址 |
|
|
115
|
+
| `VECTORMIND_ADMIN_PORT` | `16860` | 管理服务端口 |
|
|
116
|
+
| `VECTORMIND_ADMIN_TOKEN` | 无 | 非回环监听时必须显式设置 |
|
|
115
117
|
|
|
116
|
-
|
|
118
|
+
监听非回环地址时,服务会在启动阶段强制检查 `VECTORMIND_ADMIN_TOKEN`。令牌不会通过 `/api/config` 返回;浏览器输入的令牌只保存在当前标签页的 `sessionStorage`。受保护接口同时校验令牌和同源 `Origin`,缺失 `Origin` 不会绕过令牌验证。
|
|
117
119
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
120
|
+
管理面板的完整说明见 [admin-panel/README.md](admin-panel/README.md)。
|
|
121
|
+
|
|
122
|
+
## 使用方式
|
|
123
|
+
|
|
124
|
+
用户不需要记忆或手动输入任何 VectorMind 工具命令。像平常一样用自然语言说明任务目标、约束和期望结果即可,AI 客户端会在需要时自动恢复相关上下文、检查改动范围并记录变更原因。
|
|
125
|
+
|
|
126
|
+
如果同一会话需要同时处理多个互不相关的任务,只需向 AI 明确说明哪些任务需要并行保留,以及各自对应的项目和目标;内部需求标识和工具调用由客户端管理。
|
|
127
|
+
|
|
128
|
+
VectorMind 的质量信号只是上下文证据,不替模型或用户做决定。
|
|
129
|
+
|
|
130
|
+
## 巨量文件规则
|
|
131
|
+
|
|
132
|
+
当实现文件达到巨量阈值时,VectorMind 会要求先做机械搬迁式模块化拆分,再继续增加职责:
|
|
133
|
+
|
|
134
|
+
- 使用真实模块名和清晰目录。
|
|
135
|
+
- 保持对外行为不变,并验证拆分后的模块边界。
|
|
136
|
+
- 禁止 `*.generated.*`、`.parts`、`*.rs.parts`、`part1/part2`、`1_xxx/2_xxx` 等假拆分或排序式命名。
|
|
137
|
+
- 拆分计划和实际结果会持久化,后续会话可以继续同一计划。
|
|
138
|
+
|
|
139
|
+
## 它不做什么
|
|
140
|
+
|
|
141
|
+
VectorMind 只提供本地项目记忆、开发规范和质量证据。它不会:
|
|
142
|
+
|
|
143
|
+
- 接管 Codex、Claude 或其他客户端的运行控制。
|
|
144
|
+
- 替模型完成推理、设计和实现决策。
|
|
145
|
+
- 修改客户端权限、确认弹窗或执行策略。
|
|
146
|
+
- 把 checkpoint 当作文件、数据库或模型状态回滚。
|
|
147
|
+
|
|
148
|
+
当前用户指令和直接观察到的仓库事实始终高于历史记忆。
|
|
133
149
|
|
|
134
150
|
## 开发与发布
|
|
135
151
|
|
|
136
152
|
```bash
|
|
137
|
-
npm
|
|
153
|
+
npm ci
|
|
138
154
|
npm run build
|
|
139
|
-
npm run smoke
|
|
155
|
+
npm run smoke
|
|
156
|
+
npm run verify
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
- `npm run smoke` 会先重建核心产物,再运行 security、checkpoint、operation 和完整 MCP smoke。
|
|
160
|
+
- `npm run verify` 会运行核心构建、管理面板测试与生产构建,以及全部 smoke。
|
|
161
|
+
- `prepublishOnly` 强制执行完整 `verify`。
|
|
162
|
+
- 发布前可用 `npm pack --dry-run --ignore-scripts --json` 检查核心产物、管理服务和预构建客户端是否进入包。
|
|
163
|
+
|
|
164
|
+
发布:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
140
167
|
npm publish --access public
|
|
141
168
|
```
|
|
142
169
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# VectorMind 管理面板
|
|
2
|
+
|
|
3
|
+
本目录是 Node.js + React 管理后台,默认端口 `16860`。界面可独立启动,但数据库修复功能会加载主项目构建出的核心运行时。
|
|
4
|
+
|
|
5
|
+
要求 Node.js `^20.19.0` 或 `>=22.12.0`。
|
|
6
|
+
|
|
7
|
+
## 启动
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
cd ..
|
|
11
|
+
npm install
|
|
12
|
+
npm run build
|
|
13
|
+
cd admin-panel
|
|
14
|
+
npm install
|
|
15
|
+
npm run dev
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
根目录的 `npm run build` 是数据库修复功能的前置步骤;缺少 `dist/database-runtime.js` 时,面板仍可查看数据,但不能执行修复。
|
|
19
|
+
|
|
20
|
+
打开:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
http://localhost:16860
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
生产模式:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm run build
|
|
30
|
+
npm start
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 本机访问边界
|
|
34
|
+
|
|
35
|
+
管理面板默认只监听 `127.0.0.1`。回环模式会为回环连接自动建立当前页面会话,不需要手动输入令牌。
|
|
36
|
+
|
|
37
|
+
监听任何非回环地址时必须显式设置 `VECTORMIND_ADMIN_TOKEN`。服务端不会通过 `/api/config` 返回该令牌;在页面顶部输入后,令牌只保存在当前标签页的 `sessionStorage` 中。缺失 `Origin` 不会跳过令牌校验,带 `Origin` 的请求还必须与当前请求同源。
|
|
38
|
+
|
|
39
|
+
不要把管理面板直接暴露到公网。确需在受信任局域网访问时,使用高强度随机令牌并配合主机防火墙限制来源。
|
|
40
|
+
|
|
41
|
+
可选环境变量:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
VECTORMIND_ADMIN_HOST=127.0.0.1
|
|
45
|
+
VECTORMIND_ADMIN_PORT=16860
|
|
46
|
+
VECTORMIND_ADMIN_TOKEN=<固定的高强度随机令牌>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
例如监听局域网地址:
|
|
50
|
+
|
|
51
|
+
```powershell
|
|
52
|
+
$env:VECTORMIND_ADMIN_HOST = "0.0.0.0"
|
|
53
|
+
$env:VECTORMIND_ADMIN_TOKEN = (New-Guid).Guid + (New-Guid).Guid
|
|
54
|
+
npm start
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 本地索引文件
|
|
58
|
+
|
|
59
|
+
项目列表储存在当前 Windows 用户目录:
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
C:\Users\<user>\.vectormind-admin\projects.json
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
只保存项目路径、文件夹名称、展示名称和更新时间;每个项目自己的 MCP 记忆仍保存在该项目下:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
<project>\.vectormind\vectormind.db
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## UI 参考图
|
|
72
|
+
|
|
73
|
+
根据草图使用图像生成工具扩展出的参考图已保存到:
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
admin-panel/design/vector-mind-admin-ui-reference.png
|
|
77
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:oklch(97.8% .008 42);--surface:oklch(99% .006 42);--surface-raised:oklch(100% .005 42);--surface-warm:oklch(96% .022 30);--text:oklch(18% .02 32);--text-soft:oklch(45% .022 32);--text-muted:oklch(61% .018 42);--line:oklch(88% .018 36);--line-strong:oklch(78% .035 32);--red:oklch(56% .22 27);--red-deep:oklch(42% .19 27);--red-soft:oklch(95% .045 25);--green:oklch(58% .16 148);--green-soft:oklch(94% .045 148);--amber:oklch(73% .15 73);--amber-soft:oklch(96% .05 78);--blue:oklch(52% .12 248);--blue-soft:oklch(94% .035 248);--violet:oklch(55% .14 305);--shadow:0 18px 50px oklch(20% .04 32/.08);--shadow-tight:0 8px 22px oklch(20% .04 32/.08);--radius-lg:22px;--radius-md:14px;--radius-sm:10px;--ease-out:cubic-bezier(.16, 1, .3, 1);--ease-standard:cubic-bezier(.65, 0, .35, 1);font-family:Microsoft YaHei UI,PingFang SC,Source Han Sans SC,Segoe UI,system-ui,sans-serif}*{box-sizing:border-box}html{background:var(--bg);min-width:320px}body{min-height:100svh;color:var(--text);background:radial-gradient(circle at 2% 2%, oklch(94% .06 25/.55), transparent 34rem), linear-gradient(135deg, oklch(98% .014 35), var(--bg) 48%, oklch(96% .012 52));font-variant-numeric:tabular-nums;margin:0;font-size:16px;line-height:1.5}button,input{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.6}button:focus-visible,input:focus-visible,a:focus-visible{outline:3px solid color-mix(in oklch, var(--red) 70%, white);outline-offset:3px}.skip-link{z-index:20;border-radius:var(--radius-sm);background:var(--red);color:#fff;transition:translate .16s var(--ease-out);padding:10px 14px;text-decoration:none;position:fixed;inset-block-start:12px;inset-inline-start:12px;translate:0 -140%}.skip-link:focus{translate:0}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.app-shell{grid-template-rows:auto minmax(0,1fr) auto;gap:16px;min-height:100svh;padding:18px clamp(14px,2vw,28px);display:grid}.topbar,.sidebar,.workspace,.inspector,.bottom-bar,.log-panel{border:1px solid var(--line);background:color-mix(in oklch, var(--surface) 94%, transparent);box-shadow:var(--shadow-tight);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.topbar{border-radius:calc(var(--radius-lg) + 2px);min-height:74px;animation:slide-down .52s var(--ease-out) both;grid-template-columns:minmax(280px,1.2fr) minmax(360px,1.8fr) minmax(340px,1.2fr);align-items:center;gap:16px;padding:12px 16px;display:grid}.brand-lockup{align-items:center;gap:14px;min-width:0;display:flex}.brand-mark{color:#fff;background:linear-gradient(145deg, var(--red), var(--red-deep)), var(--red);letter-spacing:-.16em;border-radius:15px;place-items:center;width:48px;height:48px;font-size:1.75rem;font-weight:900;line-height:1;display:grid;box-shadow:0 12px 26px oklch(52% .2 27/.24)}.brand-lockup h1{letter-spacing:-.04em;margin:0;font-size:clamp(1.35rem,1.6vw,1.9rem);line-height:1.05}.brand-lockup p,.panel-title-row p,.log-heading p,.inspector-head p{color:var(--text-muted);margin:4px 0 0;font-size:.86rem}.topbar-meta{justify-content:center;align-items:center;gap:10px;min-width:0;display:flex}.status-pill,.path-pill{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-raised);min-height:42px;color:var(--text-soft);white-space:nowrap;align-items:center;gap:8px;padding:9px 12px;display:inline-flex}.status-ok{color:oklch(38% .13 148);border-color:color-mix(in oklch, var(--green) 24%, var(--line))}.status-dot{background:var(--green);width:10px;height:10px;box-shadow:0 0 0 4px color-mix(in oklch, var(--green) 16%, transparent);border-radius:999px}.path-pill{cursor:copy;border:0;max-width:min(100%,520px)}.path-pill strong{text-overflow:ellipsis;font-weight:500;overflow:hidden}.topbar-actions,.sidebar-actions,.form-actions,.quick-grid{align-items:center;gap:10px;display:flex}.topbar-actions{justify-content:flex-end}.token-access{grid-template-columns:minmax(150px,1fr) auto;gap:6px;min-width:260px;display:grid}.token-access label,.token-session{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-raised);min-height:42px;color:var(--text-muted);align-items:center;gap:8px;padding:0 10px;display:flex}.token-access input{width:100%;min-width:0;color:var(--text);background:0 0;border:0;outline:0}.token-access>button,.token-session button{border:1px solid color-mix(in oklch, var(--green) 34%, var(--line));border-radius:var(--radius-sm);background:var(--green-soft);color:oklch(38% .13 148);min-height:42px;padding:8px 12px;font-weight:700}.token-error{color:var(--red);grid-column:1/-1;font-size:.76rem;line-height:1.25}.token-session{white-space:nowrap;color:oklch(38% .13 148)}.token-session button{border-color:var(--line);min-height:30px;color:var(--text-soft);background:0 0;margin-left:2px;padding:4px 8px;font-size:.78rem}.ghost-button,.primary-button,.quick-grid button,.load-more{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-raised);min-height:42px;color:var(--text);white-space:nowrap;transition:transform .18s var(--ease-out), border-color .18s var(--ease-out), background .18s var(--ease-out), color .18s var(--ease-out);justify-content:center;align-items:center;gap:8px;padding:9px 14px;display:inline-flex}@media (hover:hover){.ghost-button:hover,.quick-grid button:hover,.load-more:hover{border-color:var(--line-strong);background:oklch(98.5% .016 38);transform:translateY(-1px)}}.primary-button{border-color:color-mix(in oklch, var(--red) 42%, var(--line));color:var(--red);background:var(--red-soft);font-weight:760}@media (hover:hover){.primary-button:hover{background:color-mix(in oklch, var(--red-soft) 78%, white);border-color:var(--red);transform:translateY(-1px)}}.search-box{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-raised);min-width:240px;min-height:44px;color:var(--text-muted);grid-template-columns:auto 1fr auto;align-items:center;gap:8px;padding:0 10px;display:grid}.topbar-actions .ghost-button{flex:none}.topbar-actions .search-box{min-width:210px}.search-box input{min-width:0;color:var(--text);background:0 0;border:0;outline:0}kbd{border:1px solid var(--line);color:var(--text-muted);background:oklch(96.5% .009 42);border-radius:7px;padding:2px 6px;font-size:.75rem}.main-grid{grid-template-columns:minmax(260px,320px) minmax(440px,1fr) minmax(300px,390px);gap:16px;min-height:0;display:grid}.sidebar,.inspector{border-radius:var(--radius-lg);min-height:0;overflow:hidden}.sidebar{animation:slide-in-left .56s var(--ease-out) both;flex-direction:column;gap:14px;padding:18px;display:flex}.workspace{box-shadow:none;background:0 0;border:0;grid-template-rows:minmax(250px,.86fr) minmax(330px,1.14fr);gap:16px;min-height:0;display:grid}.panel-title-row,.log-heading,.inspector-head{justify-content:space-between;align-items:flex-start;gap:14px;display:flex}h2,h3{letter-spacing:-.035em;margin:0}h2{font-size:1.25rem;line-height:1.2}h3{font-size:.95rem;line-height:1.2}.sidebar-actions{flex-wrap:wrap}.project-form{border:1px solid color-mix(in oklch, var(--red) 24%, var(--line));border-radius:var(--radius-md);background:var(--red-soft);animation:reveal .28s var(--ease-out) both;gap:10px;padding:12px;display:grid}.project-form label,.scan-root{color:var(--text-soft);gap:6px;font-size:.83rem;display:grid}.project-form input,.scan-root input{border:1px solid var(--line);background:var(--surface-raised);width:100%;color:var(--text);border-radius:10px;padding:10px 11px}.form-error{color:var(--red-deep);margin:0;font-size:.84rem}.project-list{align-content:start;gap:4px;min-height:0;padding-right:2px;display:grid;overflow:auto}.project-item{width:100%;color:var(--text);text-align:left;border:1px solid #0000;border-bottom-color:var(--line);transition:background .18s var(--ease-out), border-color .18s var(--ease-out), transform .18s var(--ease-out);animation:fade-up .38s var(--ease-out) both;background:0 0;border-radius:0;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:12px;padding:16px 12px;display:grid;position:relative}.project-item.active{border-radius:var(--radius-md);border-color:color-mix(in oklch, var(--red) 22%, var(--line));background:linear-gradient(90deg, var(--red) 0 4px, transparent 4px), var(--red-soft);box-shadow:0 14px 30px oklch(42% .16 27/.08)}@media (hover:hover){.project-item:hover{background:color-mix(in oklch, var(--red-soft) 38%, transparent);transform:translate(2px)}}.project-icon{color:var(--text-muted)}.project-copy{gap:3px;min-width:0;display:grid}.project-copy strong{text-overflow:ellipsis;white-space:nowrap;font-size:1rem;overflow:hidden}.project-copy small{text-overflow:ellipsis;white-space:nowrap;color:var(--text-muted);overflow:hidden}.project-count{border:1px solid var(--line);min-width:28px;height:28px;color:var(--text-soft);background:var(--surface-raised);border-radius:999px;place-items:center;display:grid}.project-item.active .project-count{border-color:var(--red);background:var(--red);color:#fff}.project-remove{width:24px;height:24px;color:var(--text-muted);opacity:0;transition:opacity .16s var(--ease-out), background .16s var(--ease-out);border-radius:999px;place-items:center;display:grid;position:absolute;inset-block-start:7px;inset-inline-end:8px}.project-item:hover .project-remove,.project-remove:focus{opacity:1}.project-remove:hover{background:var(--red);color:#fff}.log-panel{border-radius:var(--radius-lg);min-height:0;animation:fade-up .54s var(--ease-out) both;grid-template-rows:auto minmax(0,1fr) auto;padding:16px;display:grid;overflow:hidden}.log-heading{border-bottom:1px solid var(--line);padding:0 2px 12px}.filter-tabs{border:1px solid var(--line);background:var(--surface-raised);border-radius:12px;align-items:center;gap:2px;padding:3px;display:flex}.filter-tabs button{min-height:34px;color:var(--text-soft);background:0 0;border:0;border-radius:9px;padding:7px 14px}.filter-tabs button.active{background:var(--red-soft);color:var(--red);box-shadow:inset 0 0 0 1px color-mix(in oklch, var(--red) 20%, transparent);font-weight:760}.log-list{scrollbar-gutter:stable;min-height:0;margin:0;padding:8px 0 0;list-style:none;overflow:auto}.memory-log-panel .log-list{max-height:clamp(360px,52svh,620px);overflow-y:scroll}.log-row{border-bottom:1px solid var(--line);min-height:68px;animation:fade-up .36s var(--ease-out) both;animation-delay:calc(min(var(--i), 8) * 34ms);grid-template-columns:42px 168px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px 4px;display:grid}.log-row>.icon{width:32px;height:32px;color:var(--green);border:2px solid;border-radius:999px;padding:5px}.log-row time{color:var(--text-soft);white-space:nowrap}.log-main{gap:3px;min-width:0;display:grid}.log-main strong,.log-main small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.log-main small{color:var(--text-muted)}.status-badge{white-space:nowrap;border-radius:9px;padding:6px 10px;font-size:.84rem;font-weight:760}.badge-hit{color:oklch(40% .13 148);background:var(--green-soft)}.badge-info{color:var(--blue);background:var(--blue-soft)}.badge-warn{color:oklch(55% .16 68);background:var(--amber-soft)}.badge-muted{color:var(--text-soft);background:oklch(94% .008 42)}.timeline-list{padding-left:18px;position:relative}.timeline-list:before{content:"";background:color-mix(in oklch, var(--red) 58%, var(--line));width:2px;position:absolute;inset-block:22px 26px;inset-inline-start:15px}.timeline-row{grid-template-columns:36px 168px minmax(0,1fr) auto}.timeline-dot{z-index:1;background:var(--surface-raised);border:4px solid var(--red);border-radius:999px;justify-self:center;width:14px;height:14px;position:relative}.timeline-dot.hit{border-color:var(--green)}.timeline-dot.warn{border-color:var(--amber)}.timeline-dot.info{border-color:var(--blue)}.timeline-dot.muted{border-color:var(--line-strong)}.load-more{min-height:36px;color:var(--red);background:color-mix(in oklch, var(--red-soft) 72%, var(--surface-raised));border-color:#0000;justify-self:center;margin-top:8px;font-weight:760}.load-more:hover{border-color:color-mix(in oklch, var(--red) 24%, transparent);transform:translateY(-1px)}.load-complete,.inline-load-complete{color:var(--text-muted);justify-self:center;margin-top:8px;font-size:.84rem}.inline-load-more{width:100%;min-height:34px;color:var(--red);background:var(--red-soft);border-color:#0000;margin-top:8px;font-weight:760}.empty-log,.empty-state,.empty-mini{border:1px dashed var(--line-strong);border-radius:var(--radius-md);min-height:140px;color:var(--text-muted);text-align:center;place-items:center;gap:8px;padding:18px;display:grid}.empty-state strong{color:var(--text)}.empty-state.large{min-height:100%}.empty-workspace{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--surface)}.inspector{min-height:0;animation:slide-in-right .56s var(--ease-out) both;grid-template-rows:auto minmax(190px,auto) auto auto minmax(220px,1fr);display:grid;overflow:auto}.inspector-head,.applied-memory,.quick-actions,.memory-audit-panel,.category-stats,.health-panel{border-bottom:1px solid var(--line);padding:18px}.selected-chip{border:1px solid color-mix(in oklch, var(--red) 30%, var(--line));background:var(--red-soft);color:var(--red);text-overflow:ellipsis;white-space:nowrap;border-radius:10px;align-self:center;max-width:142px;padding:8px 12px;font-weight:760;overflow:hidden}.applied-memory h3,.quick-actions h3,.memory-audit-panel h3,.category-stats h3,.health-panel h3{margin-bottom:12px}.applied-memory ol{border:1px solid var(--line);border-radius:var(--radius-md);margin:0;padding:0;list-style:none;overflow:hidden}.applied-memory-list{scrollbar-gutter:stable;max-height:378px;overflow-y:auto!important}.applied-memory li{border-bottom:1px solid var(--line);grid-template-columns:28px minmax(0,1fr);gap:12px;padding:13px 14px;display:grid}.applied-memory li:last-child{border-bottom:0}.applied-memory li>span{color:#fff;background:var(--red);border-radius:999px;place-items:center;width:24px;height:24px;font-size:.78rem;font-weight:800;display:grid}.applied-memory li div{min-width:0}.applied-memory strong,.applied-memory small,.applied-memory p{text-overflow:ellipsis;display:block;overflow:hidden}.applied-memory small{color:var(--text-muted)}.applied-memory p{color:var(--text-soft);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:4px 0 0;font-size:.86rem;display:-webkit-box}.quick-grid{grid-template-columns:repeat(3,minmax(0,1fr));display:grid}.quick-grid button{min-height:48px}.quick-grid .danger{color:var(--red);background:var(--red-soft);border-color:color-mix(in oklch, var(--red) 32%, var(--line))}.memory-audit-panel{background:linear-gradient(135deg, color-mix(in oklch, var(--red-soft) 54%, transparent), transparent 58%), var(--surface);gap:12px;display:grid}.memory-audit-head{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.memory-audit-head h3{margin-bottom:4px}.memory-audit-head p{color:var(--text-soft);margin:0;font-size:.86rem;line-height:1.45}.audit-badge{border:1px solid var(--line);color:var(--text-soft);background:var(--surface-raised);border-radius:999px;flex:none;padding:5px 9px;font-size:.78rem;font-weight:760}.audit-warn .audit-badge,.audit-critical .audit-badge{color:var(--red);border-color:color-mix(in oklch, var(--red) 34%, var(--line));background:var(--red-soft)}.audit-ok .audit-badge{color:var(--green);background:var(--green-soft)}.audit-actions{grid-template-columns:1fr 1fr;gap:10px;display:grid}.audit-actions button{min-height:44px}.audit-actions .danger{color:var(--red);background:var(--red-soft);border-color:color-mix(in oklch, var(--red) 32%, var(--line))}.audit-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.audit-grid .stat-card{min-height:64px}.audit-details{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-raised);gap:8px;margin:0;padding:10px;display:grid}.audit-details div{justify-content:space-between;gap:10px;display:flex}.audit-details dt{color:var(--text-muted)}.audit-details dd{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:68%;color:var(--text);margin:0;overflow:hidden}.audit-top-groups{gap:8px;margin:0;padding:0;list-style:none;display:grid}.audit-top-groups li{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-raised);padding:10px}.audit-top-groups strong,.audit-top-groups span,.audit-top-groups small{text-overflow:ellipsis;display:block;overflow:hidden}.audit-top-groups strong{color:var(--red)}.audit-top-groups span{white-space:nowrap;margin-top:3px}.audit-top-groups small{color:var(--text-muted);white-space:nowrap;margin-top:3px}.stats-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;display:grid}.stat-card{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-raised);place-items:center;gap:4px;min-height:72px;display:grid}.stat-card span{color:var(--text-muted);font-size:.82rem}.stat-card strong{font-size:1.18rem}.stat-hit{background:var(--green-soft)}.stat-warn{background:var(--amber-soft)}.kind-strip{flex-wrap:wrap;gap:8px;margin-top:12px;display:flex}.kind-strip span{border:1px solid var(--line);color:var(--text-soft);background:var(--surface-raised);border-radius:999px;align-items:center;gap:6px;padding:6px 10px;font-size:.82rem;display:inline-flex}.kind-strip strong{color:var(--text)}.health-panel{border-bottom:0}.health-row,.health-panel dl div{justify-content:space-between;align-items:center;gap:16px;display:flex}.progress-bar{background:oklch(91% .015 42);border-radius:999px;height:7px;margin:10px 0 14px;overflow:hidden}.progress-bar span{border-radius:inherit;background:linear-gradient(90deg, var(--green), color-mix(in oklch, var(--green) 60%, var(--red)));height:100%;transition:width .42s var(--ease-out);display:block}.health-panel dl{gap:12px;margin:0;display:grid}.health-panel dt{color:var(--text-muted)}.health-panel dd{text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:65%;color:var(--text);margin:0;overflow:hidden}.bottom-bar{border-radius:var(--radius-md);min-height:58px;color:var(--text-soft);align-items:center;gap:clamp(16px,3vw,44px);padding:12px 16px;display:flex;overflow:hidden}.bottom-bar>div{white-space:nowrap;align-items:center;gap:8px;display:inline-flex}.safe-chip{color:oklch(38% .13 148);margin-left:auto;font-weight:760}.safe-chip span{color:var(--text-soft);font-weight:400}.bottom-path{text-overflow:ellipsis;max-width:320px;overflow:hidden}.toast{z-index:30;border:1px solid var(--line);border-radius:var(--radius-md);background:var(--surface-raised);max-width:min(420px,100vw - 32px);box-shadow:var(--shadow);animation:toast-in .28s var(--ease-out) both;padding:14px 16px;position:fixed;inset-block-end:24px;inset-inline-end:24px}.toast-success{border-color:color-mix(in oklch, var(--green) 35%, var(--line))}.toast-error{border-color:color-mix(in oklch, var(--red) 35%, var(--line));color:var(--red-deep)}.icon{flex:none;width:1.1em;height:1.1em}.spin{animation:.9s linear infinite spin}@keyframes slide-down{0%{opacity:0;transform:translateY(-14px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-in-left{0%{opacity:0;transform:translate(-18px)}to{opacity:1;transform:translate(0)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(18px)}to{opacity:1;transform:translate(0)}}@keyframes fade-up{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes reveal{0%{opacity:0;transform:scaleY(.96)}to{opacity:1;transform:scaleY(1)}}@keyframes toast-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@media (width<=1180px){.topbar{grid-template-columns:1fr}.topbar-meta,.topbar-actions{flex-wrap:wrap;justify-content:flex-start}.main-grid{grid-template-columns:minmax(250px,300px) minmax(420px,1fr)}.inspector{grid-column:1/-1;grid-template-rows:auto;grid-template-columns:minmax(280px,.9fr) minmax(320px,1fr) minmax(280px,.9fr)}.inspector-head,.applied-memory,.quick-actions,.category-stats,.health-panel{border-bottom:0;border-right:1px solid var(--line)}.health-panel{border-right:0}.quick-actions{display:none}}@media (width<=980px){.app-shell{padding:12px}.main-grid{grid-template-columns:1fr}.sidebar{max-height:460px}.workspace{grid-template-rows:auto auto}.log-panel{min-height:420px}.inspector{grid-template-columns:1fr}.inspector-head,.applied-memory,.quick-actions,.category-stats,.health-panel{border-right:0;border-bottom:1px solid var(--line)}.quick-actions{display:block}}@media (width<=720px){.topbar-actions,.topbar-meta,.sidebar-actions,.bottom-bar{flex-direction:column;align-items:stretch}.search-box,.path-pill,.token-access,.token-session{width:100%;min-width:0}.token-access{grid-template-columns:minmax(0,1fr) auto}.log-heading{display:grid}.filter-tabs{overflow-x:auto}.log-row,.timeline-row{grid-template-columns:30px minmax(0,1fr) auto;gap:9px}.log-row time{display:none}.stats-grid,.quick-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.bottom-bar{gap:10px}.safe-chip{margin-left:0}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
|