Skip to content

Commit 454aa9d

Browse files
committed
chore(env): rename optional-mcps -> optional_mcps and make enabled.json local-only
- 目录重命名 env/optional-mcps/ -> env/optional_mcps/,与 optional_mcps.sh 及 env 下其它子目录(无连字符)命名一致 - 修正 optional_mcps README 用法示例 playwright -> puppeteer(puppeteer 为默认 env/mcp/playwright.json 的可选替代) - enabled.json 不再提交:加入 .gitignore 并从索引移除(磁盘保留,脚本缺失时自动重建为 {}) - 同步更新脚本、schema 校验、env/README、sync/README、CHANGELOG 的引用
1 parent 65c6ea7 commit 454aa9d

11 files changed

Lines changed: 62 additions & 24 deletions

File tree

‎.gitignore‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ skills-engineering/scripts/config.local.sh
88
# User only needs to create env/secrets.json from env/secrets.json.example.
99
env/secrets.json
1010
env/backup.json
11+
# 可选 MCP 启用状态(本机本地状态,不提交;脚本缺失时自动重建为 {})
12+
env/optional_mcps/enabled.json
1113

1214
*__pycache__*/
1315
.analysis_output/
@@ -28,8 +30,9 @@ skills-engineering/ios-engineer/evolution/usage/*
2830
skills-engineering/ios-engineer/evolution/.auto_proposal_registry.json
2931
# skill_bundles.sh 导出的 agentskills.io bundle 产物
3032
skills-engineering/.bundles/
31-
# 用户个人画像(从 USER.md.example 复制,不提交)
32-
USER.md
33+
# 用户个人画像(从 env/user-profile.md.example 复制,不提交)
34+
env/user-profile.md
35+
env/user-profile.json
3336
# 技能完整性校验基线(由 validate-skill-integrity.sh 生成)
3437
skills-engineering/.integrity/
3538
templates/portability-ecosystem.md

‎CHANGELOG.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ All notable changes to ai-coding-kit will be documented in this file.
2626
- **P0-1 Skill 自我改进闭环**: 新增 `ios-engineer/scripts/suggest_skill_proposals.sh`,读取 `summarize_usage_ledger.sh --json` 的提案候选信号,自动生成 draft proposal(仅 draft,不自动晋升),并用 `evolution/.auto_proposal_registry.json` 去重。对齐 Hermes 学习循环,但落在既有受控演进闸门内(观测 → 建议 → 人工审批)
2727
- **P0-2 agentskills.io 兼容打包/导入/校验**: 新增 `scripts/skill_bundles.sh`(`export` / `validate` / `import` / `list`),把任一 skill 打包成 agentskills.io 兼容产物(`SKILL.md` + `references/` + `bundle.json` 含 sha256),支持从社区 Skills Hub / Hermes 兼容 bundle 导入。导出产物落在 `skills-engineering/.bundles/`(已 gitignore)
2828
- **P1-3 定时同步自动化**: 新增 `cron/`(launchd 默认、`--cron` 可选 crontab),`run-sync.sh` 复用 `sync.sh` + 技能同步 + preamble + 校验,日志滚动保留 30 份
29-
- **P1-4 可选 MCP 服务器目录**: 新增 `env/optional-mcps/`(playwright 改名 `puppeteer` 避免与默认 `env/mcp/playwright.json` 冲突;另含 `filesystem-extra`、`wechat-bridge` 示例)与 `sync/scripts/optional_mcps.sh`(`enable` / `disable` / `list` / `sync`)。`disable` 带护栏:只移除由本工具启用的服务器,绝不删除仓库默认 `env/mcp/*.json`
29+
- **P1-4 可选 MCP 服务器目录**: 新增 `env/optional_mcps/`(playwright 改名 `puppeteer` 避免与默认 `env/mcp/playwright.json` 冲突;另含 `filesystem-extra`、`wechat-bridge` 示例)与 `sync/scripts/optional_mcps.sh`(`enable` / `disable` / `list` / `sync`)。`disable` 带护栏:只移除由本工具启用的服务器,绝不删除仓库默认 `env/mcp/*.json`
3030
- **P1-5 跨会话用户画像**: 新增仓库根 `USER.md.example` 与 `scripts/sync-user-profile.sh`,把用户画像同步到 `~/.ai-coding-kit/USER.md` 并注入各端 preamble 的 `user-profile` 托管块(与 agent-preamble 块标记独立、互不干扰);个人 `USER.md` 已 gitignore。已接入 `sync-skill-full.sh` / `bootstrap.sh`(含 `SKIP_USER_PROFILE`)/ `cron/run-sync.sh`
31+
- **用户画像配置迁移**: `USER.md.example` 迁移并统一命名为 `env/user-profile.md.example`,新增 `env/user-profile.json.example` 管理 `auto/on/off` 开关与画像路径;`sync.sh` 现在会通过 `sync_all.sh` 执行可选用户画像同步。
3132
- **P1-5b 跨会话事件记忆**: 新增 `scripts/sync-memory.sh`,落 `~/.ai-coding-kit/MEMORY.md`(仓库外、跨端共享),提供 `remember "..." [--tag]` / `recall [关键词]` 子命令;向各端 preamble 注入独立的 `user-memory` 托管块,并把脚本自复制到 `~/.ai-coding-kit/sync-memory.sh` 作为 Agent 稳定调用入口。补齐 Hermes 持久记忆中「从交互自动累积」的那一层(user-profile 为静态手维护,memory 为事件级累积,二者互补)。同样接入 `sync-skill-full.sh` / `bootstrap.sh`(`SKIP_MEMORY`)/ `cron/run-sync.sh`
3233
- **P2-6 多平台模型路由抽象**: 新增 `sync/scripts/list_models.sh`(跨平台 model/provider 配置总览,密钥打码)与 `sync/model_routing.md`(统一 Provider 层设计说明)
3334
- **P2-7 子代理并行同步**: `scripts/sync-skills.sh` 支持 `PARALLEL=1`(默认 `MAX_PARALLEL=4`),把 (skill × target) 同步以子代理式后台并行执行

‎env/README.md‎

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ env/
1313
├── review.json.example ← review 配置模板(已提交)
1414
├── backup.json ← 配置备份保存路径(gitignored)
1515
├── backup.json.example ← backup 配置模板(已提交)
16+
├── user-profile.json ← 跨会话用户画像同步开关(gitignored)
17+
├── user-profile.json.example ← 用户画像同步配置模板(已提交)
18+
├── user-profile.md ← 跨会话用户画像内容(gitignored)
19+
├── user-profile.md.example ← 用户画像内容模板(已提交)
1620
│
1721
├── mcp/ ← 默认启用的 MCP 服务器定义
1822
│ ├── github.json
@@ -26,7 +30,7 @@ env/
2630
│ ├── postgres.json
2731
│ └── sqlite.json
2832
│
29-
├── optional-mcps/ ← 可选 MCP 服务器(需手动启用)
33+
├── optional_mcps/ ← 可选 MCP 服务器(需手动启用)
3034
│ ├── enabled.json ← 启用状态记录
3135
│ ├── filesystem-extra.json
3236
│ ├── puppeteer.json
@@ -102,16 +106,47 @@ env/
102106
- 相对路径会按仓库根目录解析。
103107
- `env/backup.json` 是本地用户配置,不提交。
104108

105-
## optional-mcps — 可选 MCP 服务器
109+
## user-profile.json + user-profile.md
110+
111+
跨会话用户画像用于让 Codex / Claude / Gemini 等 Agent 在不同会话中共享你的稳定偏好、角色和约束。
112+
113+
```bash
114+
cp env/user-profile.md.example env/user-profile.md
115+
cp env/user-profile.json.example env/user-profile.json
116+
bash sync.sh
117+
```
118+
119+
`env/user-profile.json`:
120+
121+
```json
122+
{
123+
"enabled": "auto",
124+
"source": "env/user-profile.md"
125+
}
126+
```
127+
128+
| 字段 | 说明 |
129+
|------|------|
130+
| `enabled` | `auto`:画像文件存在则同步,不存在则跳过;`on`:强制同步,不存在时报错;`off`:跳过同步 |
131+
| `source` | 用户画像 Markdown 路径,支持 `~`、环境变量和相对仓库根目录的路径 |
132+
133+
同步时会把画像复制到 `~/.ai-coding-kit/USER.md`,并向各端 Agent preamble 注入 `user-profile` 托管块。
134+
如需清理已注入托管块,运行:
135+
136+
```bash
137+
bash skills-engineering/scripts/sync-user-profile.sh --remove
138+
```
139+
140+
## optional_mcps — 可选 MCP 服务器
106141

107142
将**非默认、社区/高级**的 MCP 服务器与开箱即用的 `env/mcp/` 集合分开,避免污染默认配置,同时保留「一键启用」能力。
108143

109144
### 工作机制
110145

111-
- `env/optional-mcps/*.json`:可选的 MCP 服务器定义(**不**自动同步)
146+
- `env/optional_mcps/*.json`:可选的 MCP 服务器定义(**不**自动同步)
112147
- `sync/scripts/optional_mcps.sh enable <name>`:启用并同步到 `env/mcp/`
113148
- `sync/scripts/optional_mcps.sh disable <name>`:禁用并移除
114-
- 启用状态记录在 `env/optional-mcps/enabled.json`
149+
- 启用状态记录在 `env/optional_mcps/enabled.json`
115150

116151
### 用法
117152

@@ -134,7 +169,7 @@ bash sync/scripts/optional_mcps.sh disable puppeteer
134169
| `filesystem-extra` | 扩展文件系统访问 | 是(`filesystem_extra.root`) |
135170
| `wechat-bridge` | 微信桥接 | 是(`wechat.token`) |
136171

137-
详见 [optional-mcps/README.md](optional-mcps/README.md)。
172+
详见 [optional_mcps/README.md](optional_mcps/README.md)。
138173

139174
## 自定义安装路径(paths)
140175

‎env/optional-mcps/enabled.json‎

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
# optional-mcps — 可选 MCP 服务器目录
1+
# optional_mcps — 可选 MCP 服务器目录
22

3-
对齐 Hermes Agent 的 `optional-mcps/` 思路:把**非默认、社区/高级**的 MCP 服务器与开箱即用的 `env/mcp/` 集合分开,避免污染默认配置,同时保留「一键启用」能力。
3+
对齐 Hermes Agent 的 `optional_mcps/` 思路:把**非默认、社区/高级**的 MCP 服务器与开箱即用的 `env/mcp/` 集合分开,避免污染默认配置,同时保留「一键启用」能力。
44

55
## 工作机制
66

7-
- `env/optional-mcps/*.json`:可选的 MCP 服务器定义(**不**自动同步)。
7+
- `env/optional_mcps/*.json`:可选的 MCP 服务器定义(**不**自动同步)。
88
- `sync/scripts/optional_mcps.sh enable <name>`:把定义复制到 `env/mcp/<name>.json`,由于 `env/mcp/*.json` 会被 `sync.sh` 自动发现,下一次 `sync.sh` 即生效。
99
- `sync/scripts/optional_mcps.sh disable <name>`:从 `env/mcp/` 移除并停止同步。
10-
- 启用状态记录在 `env/optional-mcps/enabled.json`(git 提交,便于团队共享「已启用集合」)。
10+
- 启用状态记录在 `env/optional_mcps/enabled.json`(本地状态,**不提交**,已加入 `.gitignore`;脚本缺失时自动重建为 `{}`)。
1111

1212
## 用法
1313

@@ -16,18 +16,18 @@
1616
bash sync/scripts/optional_mcps.sh list
1717

1818
# 启用一个
19-
bash sync/scripts/optional_mcps.sh enable playwright
19+
bash sync/scripts/optional_mcps.sh enable puppeteer
2020

2121
# 禁用一个
22-
bash sync/scripts/optional_mcps.sh disable playwright
22+
bash sync/scripts/optional_mcps.sh disable puppeteer
2323

2424
# 启用后照常同步
2525
bash sync.sh
2626
```
2727

2828
## 新增一个可选服务器
2929

30-
1. 在 `env/optional-mcps/` 放 `<name>.json`(格式同 `env/mcp/*.json`,敏感值用 `${...}` 占位)。
30+
1. 在 `env/optional_mcps/` 放 `<name>.json`(格式同 `env/mcp/*.json`,敏感值用 `${...}` 占位)。
3131
2. 若需要 secret,在 `env/secrets.json.example` 增加对应字段说明,并提醒用户填写 `env/secrets.json`。
3232
3. 运行 `bash sync/scripts/optional_mcps.sh enable <name>`。
3333

‎sync/README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,15 @@ python3 sync/cli/main.py sync --target codex # single platform
194194

195195
## 可选 MCP 服务器
196196

197-
开箱即用的服务器在 `env/mcp/`。**非默认、社区/高级**服务器放在 `env/optional-mcps/`,用 `sync/scripts/optional_mcps.sh` 按需启用:
197+
开箱即用的服务器在 `env/mcp/`。**非默认、社区/高级**服务器放在 `env/optional_mcps/`,用 `sync/scripts/optional_mcps.sh` 按需启用:
198198

199199
```bash
200200
bash sync/scripts/optional_mcps.sh list # 查看可选服务器与启用状态
201201
bash sync/scripts/optional_mcps.sh enable puppeteer # 启用 -> 下次 sync.sh 生效
202202
bash sync/scripts/optional_mcps.sh disable puppeteer # 停用
203203
```
204204

205-
`disable` 带护栏:只移除由本工具启用的服务器,绝不删除仓库默认的 `env/mcp/*.json`。详见 `env/optional-mcps/README.md`。
205+
`disable` 带护栏:只移除由本工具启用的服务器,绝不删除仓库默认的 `env/mcp/*.json`。详见 `env/optional_mcps/README.md`。
206206

207207
## Design Principles
208208

‎sync/cli/validate_env_schema.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
REPO_ROOT = Path(__file__).resolve().parents[2]
1919
ENV_DIR = REPO_ROOT / "env"
2020
MCP_DIR = ENV_DIR / "mcp"
21-
OPTIONAL_MCP_DIR = ENV_DIR / "optional-mcps"
21+
OPTIONAL_MCP_DIR = ENV_DIR / "optional_mcps"
2222
PLATFORMS_DIR = ENV_DIR / "platforms"
2323

2424
# ── MCP server schema ────────────────────────────────────────────────────────
@@ -206,7 +206,7 @@ def main(argv: list[str] | None = None) -> int:
206206

207207
all_errors: list[str] = []
208208

209-
# Validate MCP files (env/mcp + env/optional-mcps)
209+
# Validate MCP files (env/mcp + env/optional_mcps)
210210
if not args.platforms_only:
211211
mcp_dirs = [MCP_DIR]
212212
if OPTIONAL_MCP_DIR.is_dir():
@@ -221,7 +221,7 @@ def main(argv: list[str] | None = None) -> int:
221221
continue # registry 文件,不是 MCP 定义
222222
all_errors.extend(validate_mcp_file(f))
223223
total_mcp += 1
224-
print(f"Checked {total_mcp} MCP file(s) (incl. optional-mcps).")
224+
print(f"Checked {total_mcp} MCP file(s) (incl. optional_mcps).")
225225

226226
# Validate platform files
227227
if not args.mcp_only and PLATFORMS_DIR.is_dir():

0 commit comments

Comments
 (0)