AIR Assets / Smart Assets Sync
TL;DR
一句话:扩展会把远程资产仓库 clone 到本地共享 cache,再把工作区里的映射路径创建为 symlink;所有状态、暂存、冲突都以 cache 仓库里的 Git 状态为准。 当前代码事实
核心架构
主要模块:
快速开始1. 配置
可选配置:
2. 配置映射视图
视图内支持:
说明:
3. 安装
安装前会统一执行两类检查:
如果 cache 仍为旧结构,安装会被阻断,并提示先执行“迁移到新同步架构”。 4. 日常操作
5. 启动期 Release Note 提示从
这个能力的目标是让用户在打开 IDE 时就能看到最新资产说明,同时尽量降低对主分支的读取成本。 6. Rules 模板占位符共享 rules 模板正文现在支持官方占位符:
例如:
分发到不同 IDE 时会自动渲染为对应 IDE key 和 当 待归档(一键 AI 归档)
归档一个 change在 change 目录节点上右键:
默认模板:
占位符 说明:
ITCM 集成(工单信息 + 附件下载)取代原先的 入口:
|
| 操作 | 说明 |
|---|---|
| 获取 ITCM 信息… | 输入纯数字 instanceId → 取票面信息 → 拉附件清单 → 有附件才下载(无附件直接停在信息态;autoDownload 关掉则只列清单) |
| 下载附件 | 对当前工单重跑下载,或先问工单号 |
| 打开下载目录 | 在系统文件管理器中定位 {工作区}/openspec/docs/ITCM_documents/{instanceId} |
| 复制工单信息 | 一键复制完整工单信息 + 附件相对路径(如果有),按钮在「获取 ITCM 信息」旁边 |
| 刷新信息视图 | 重置为初始态(清空当前工单信息),不是重新获取 |
视图里每个附件节点会显示大小 / 失败原因;已成功落盘的附件可直接点开。
两条链路(端点不同,必须分别配置)
| 用途 | 端点 | 配置项 |
|---|---|---|
取票面信息(instance_info) |
MCP:{serverUrl}(JSON-RPC,先 initialize → tools/list → tools/call) |
smartAssets.itcm.serverUrl |
| 取附件清单 + 下载 | REST:{apiBaseUrl} + getFileinfo / getFileStream |
smartAssets.itcm.apiBaseUrl |
两个端点不能互相推导(一个是 /vivid/mcp/itcm-server,一个是 /vivid/api/mcp/),所以必须分别填写。每次拉附件清单时,日志会记录实际使用的 REST 基础地址,配错时一眼可见。
工具名与参数名都不硬编码:先 tools/list 拿 inputSchema,再从中挑工具、推导参数名(必要时用 smartAssets.itcm.infoToolName 指定)。服务端改名后插件不用重新发包。
信息展示模板(字段变化不用发包)
smartAssets.itcm.infoTemplate 是一个字符串模板,占位符写服务端 instance_info 的字段名:
标题:{Title}
描述:{Description}
UAT 日期:{UATDate}
每行渲染成一个树节点;找不到的字段会原样保留 {OldField},一眼就能看出模板该更新了。
模板没覆盖到的字段不会丢:它们被收进一个可折叠的「其它字段(N)」分组(键:值,含嵌套对象的 JSON),展开就能看到全貌。不想看这个分组时把 smartAssets.itcm.showAllFields 关掉。
附件落盘
固定 openspec/docs/ITCM_documents/{instanceId} —— 不提供配置项,避免改到同步面(copyMappings 的目标目录)里被覆盖,也避免每个人的位置不一致。
- 工单没有附件时不会创建目录、不会发下载请求(空目录会让「下载过没有」无从判断)
- 文件名清洗(去掉路径分隔符与非法字符,杜绝路径穿越)
- 可选的下载域名白名单(
allowedDownloadHosts) - 单文件 200MB / 单次 200 个上限
- 逐文件容错:单个失败不中断,结束后汇总提示
令牌与 MCP
- access/refresh token 存 SecretStorage(OS 凭据库),元数据存
globalState;令牌不会落到任何明文文件 - 后台定时保活:按
smartAssets.itcm.tokenKeepAliveIntervalSeconds(默认 60 秒)巡检,令牌进入提前刷新窗口就静默换一次。用户点按钮时拿到的是现成令牌,不用等刷新;两次真正发起的刷新之间有 3 分钟冷却,避免把 Keycloak 打成定时器 smartAssets.itcm.registerMcpServer默认关闭:插件自己已经能取信息 + 下附件,注册 MCP 只是给「在聊天里让 AI 调 ITCM 工具」留的口子。需要时打开即可,与令牌保活无关
配置项
| 配置项 | 默认值 | 说明 |
|---|---|---|
smartAssets.remoteUrl |
"" |
远程 Git 仓库地址 |
smartAssets.branch |
main |
远程分支 |
smartAssets.releaseNoteBranch |
release-note-meta |
启动期 release note 检查优先使用的轻量分支;失败时回退到 smartAssets.branch |
smartAssets.workspaceRoot |
"" |
多根工作区时可显式指定根目录 |
smartAssets.projectType |
"" |
项目类型;用于 {projectType} 模板、skills 业务目录选择,以及 GitHub Agents 的 View / Mobility / Workflow 远端目录选择 |
smartAssets.mappings |
{} |
symlink 映射:远程路径 -> 工作区本地路径 |
smartAssets.rulesIdeMapping |
{} |
IDE -> rules 文件路径;共享 rules 模板正文支持 {ide} / {skillsPath} 占位符 |
smartAssets.copyMappings |
{} |
远程路径 -> 本地 copy 目标;内置 GitHub Agents 默认会按 projectType 从 UniSync/agents/View、UniSync/agents/Mobility 或 UniSync/agents/Workflow 复制到 .github/agents |
smartAssets.cacheDir |
系统默认缓存目录 | 自定义 cache 路径 |
smartAssets.defaultIgnorePatterns |
内置默认列表 | 写入 .git/info/exclude 的默认模式 |
smartAssets.skillsSync.autoSync |
true |
激活时每会话自动执行一次分发维护;实际执行前仍会经过工作区启用状态与目标存在性判断 |
smartAssets.skillsSync.mappings |
内置 IDE 映射 | IDE -> skills 目录 |
smartAssets.statusPollingInterval |
60 |
轮询更新徽章的间隔(秒) |
smartAssets.pendingArchive.copyTemplate |
请帮忙使用 openspec-archive-change 技能,归档 {relativePath} |
「待归档」视图的归档提示词模板,{dirName} / {relativePath} 实时替换;「一键 AI 归档」与「一键复制归档提示词」共用 |
smartAssets.itcm.keycloakBaseUrl |
https://keycloak.com |
Keycloak 基础地址(据此派生 /auth 与 /token) |
smartAssets.itcm.clientId |
user-service |
Keycloak public client(PKCE,无 client_secret) |
smartAssets.itcm.serverUrl |
https://domain.com/vivid/mcp/itcm-server |
ITCM 的 MCP 端点(取工单信息用) |
smartAssets.itcm.apiBaseUrl |
https://domain.com/vivid/api/mcp/ |
ITCM 的 REST 基础地址(附件清单与下载用),与 MCP 端点不是同一路径 |
smartAssets.itcm.infoTemplate |
内置 8 行模板 | 工单信息展示模板,占位符 {字段名};字段变化改这里即可 |
smartAssets.itcm.infoToolName |
"" |
显式指定取信息的 MCP 工具名;留空则自动挑选 |
smartAssets.itcm.showAllFields |
true |
是否在信息行下方加一个可折叠的「其它字段(N)」分组,展示模板未覆盖的字段 |
smartAssets.itcm.allowedDownloadHosts |
[] |
附件下载域名白名单;留空表示不限制 |
smartAssets.itcm.autoDownload |
true |
获取信息后是否自动下载全部附件 |
smartAssets.itcm.registerMcpServer |
false |
是否把 ITCM 注册为 VS Code 的 MCP 服务器供其它 agent 调用 |
smartAssets.itcm.tokenKeepAliveIntervalSeconds |
60 |
令牌后台保活巡检间隔(秒),最小 15 |
smartAssets.itcm.allowInsecureTls |
true |
是否跳过 TLS 证书校验(内网自签证书场景) |
当前命令面
以 package.json 和 src/extension.ts 为准,当前高频入口包括:
smartAssets.installsmartAssets.refreshsmartAssets.updatesmartAssets.stageChangessmartAssets.unstageChangessmartAssets.commitStagedChangessmartAssets.discardChangessmartAssets.syncSkillsToIDEsmartAssets.installAllsmartAssets.migrateToNewArchitecturesmartAssets.uninstallsmartAssets.pendingArchive.archiveWithCopilot/copyFromTemplate/refresh(视图右键入口,命令面板中隐藏)smartAssets.itcm.signIn/signOut/refreshToken/showStatussmartAssets.itcm.fetchInfo/downloadAttachments/openDownloadDir/refreshInfoViewsmartAssets.itcm.openFile/copyInfo
说明:
- rebase 恢复相关的代码注册名是
smartAssets.continueRefresh/smartAssets.abortRefresh package.json中仍保留smartAssets.continue/smartAssets.abort的贡献项- 遇到这类不一致时,以代码实现为准
开发
npm run watch
npm run compile
npm run lint
npm run test:unit
npm run test:integration
文档说明
AGENTS.md:AI 路由页docs/README.md:文档索引,标记哪些是当前可参考文档、哪些是历史遗留docs/new-sync-architecture.md:新同步架构需求收敛稿- 仓库里仍保留不少 V1 / 迁移期文档;使用前请先核对代码
许可证
MIT License - 详见 LICENSE