feat(toolchain): 增加项目级运行时能力包 #11

Merged
lanrtop merged 3 commits from feat/toolchain-capability-pack into master 2026-09-22 00:46:39 +08:00
3 changed files with 10 additions and 10 deletions
Showing only changes of commit ccbd2b0e23 - Show all commits

View File

@ -473,7 +473,7 @@ modules:
name: 项目工具链能力包 name: 项目工具链能力包
area: infra area: infra
status: in_progress status: in_progress
progress: 71 progress: 86
note: "以项目标准声明为版本事实,mise 负责本地解析;炼境提供诊断、受控准备和 Agent 投影,不追随 Codex bundled runtime。v1 聚焦 Windows 项目的 Node + pnpm,明确不支持 WSL。" note: "以项目标准声明为版本事实,mise 负责本地解析;炼境提供诊断、受控准备和 Agent 投影,不追随 Codex bundled runtime。v1 聚焦 Windows 项目的 Node + pnpm,明确不支持 WSL。"
position: [2500, 950] position: [2500, 950]
edges: edges:

View File

@ -2,7 +2,7 @@
id: toolchain-capability-pack id: toolchain-capability-pack
name: 项目工具链能力包 name: 项目工具链能力包
status: in_progress status: in_progress
progress: 71 progress: 86
--- ---
## 设计决策:项目工具链契约、解析与 Agent 执行闭环 v1 ## 设计决策:项目工具链契约、解析与 Agent 执行闭环 v1
@ -108,13 +108,13 @@ Enterprise System 已精确声明 Node `24.19.0` 与 pnpm `9.15.0`,而 Codex b
- acceptance: "[Tauri command] prepare_toolchain(project_id, confirmed) → confirmed=false、未知项目、根路径越界或 contract=conflict 时零执行;confirmed=true 时只执行参数化 `mise install`,不运行项目 task/hook,不修改 package.json/pnpm-lock.yaml,并返回 before/after 状态与命令证据。" - acceptance: "[Tauri command] prepare_toolchain(project_id, confirmed) → confirmed=false、未知项目、根路径越界或 contract=conflict 时零执行;confirmed=true 时只执行参数化 `mise install`,不运行项目 task/hook,不修改 package.json/pnpm-lock.yaml,并返回 before/after 状态与命令证据。"
- done_note: "2026-09-22:新增 Tauri/MCP 受控 prepare_toolchain;resolver 就绪后通过 mise exec 探测项目版本,拒绝未确认、冲突、缺版本、缺 mise 和含自定义 task/hook/plugin 的配置;返回 verified 区分命令成功与二次诊断 ready_managed,定向测试全绿,未实际下载安装。复盘待炼境 MCP 在本会话可用后回填。" - done_note: "2026-09-22:新增 Tauri/MCP 受控 prepare_toolchain;resolver 就绪后通过 mise exec 探测项目版本,拒绝未确认、冲突、缺版本、缺 mise 和含自定义 task/hook/plugin 的配置;返回 verified 区分命令成功与二次诊断 ready_managed,定向测试全绿,未实际下载安装。复盘待炼境 MCP 在本会话可用后回填。"
### 🔴 T5. 项目环境 UI 工具链契约卡 ### ✅ T5. 项目环境 UI 工具链契约卡
- status: blocked - status: done
- complexity: M - complexity: M
- depends: T2. 只读工具链状态 Tauri command, T4. 受控 mise 工具链准备能力 - depends: T2. 只读工具链状态 Tauri command, T4. 受控 mise 工具链准备能力
- files: src/components/dashboard/ProjectEnvModal.tsx, src/lib/commands.ts - files: src/components/dashboard/ProjectEnvModal.tsx, src/lib/commands.ts
- acceptance: "agent_verify: [pnpm typecheck] ProjectEnvModal 消费 ToolchainStatus 类型且无类型错误;[Tauri command mock/fixture] ready_managed、compliant_unmanaged、mismatch、conflict 分别渲染准确状态与可用动作,prepare 必须经过确认;human_verify: 环境工具弹窗能看懂期望/实际版本、来源路径和准备结果。" - acceptance: "agent_verify: [pnpm typecheck] ProjectEnvModal 消费 ToolchainStatus 类型且无类型错误;[Tauri command mock/fixture] ready_managed、compliant_unmanaged、mismatch、conflict 分别渲染准确状态与可用动作,prepare 必须经过确认;human_verify: 环境工具弹窗能看懂期望/实际版本、来源路径和准备结果。"
- blocked_reason: "代码接线与 pnpm typecheck 已通过;隔离分支已启动,运行态 MCP 对 Enterprise 返回 Node 24.19.0、pnpm 9.15.0 且均为 compliant_unmanaged,并由此发现并修复 Windows `.cmd` wrapper 版本探测;当前 Computer Use 未暴露 Tauri 原生窗口,本项目也不为 React 组件临时引入测试框架,仍缺 human_verify。需在环境工具弹窗终验状态卡与确认按钮。" - done_note: "2026-09-22:运行态 MCP 对 Enterprise 返回 Node 24.19.0、pnpm 9.15.0 且均为 compliant_unmanaged,由此发现并修复 Windows `.cmd` wrapper 版本探测;pnpm typecheck 通过。用户截图完成 human_verify,并要求将模态框扩大到 92vw/max-w-5xl、88vh/max-h-900px,确认信息密度与滚动体验符合预期。复盘待炼境 MCP 在本会话可用后回填。"
### ✅ T6. Onboarding 与 Codex Skill 条件式工具链指引 ### ✅ T6. Onboarding 与 Codex Skill 条件式工具链指引
- status: done - status: done

View File

@ -139,10 +139,10 @@ export function ProjectEnvModal({ project, onClose }: Props) {
}, {}); }, {});
return ( return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40"> <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4 sm:p-6">
<div className="bg-white rounded-xl shadow-xl w-[560px] max-h-[80vh] flex flex-col overflow-hidden"> <div className="flex h-[88vh] max-h-[900px] w-[92vw] max-w-5xl flex-col overflow-hidden rounded-xl bg-white shadow-xl">
{/* Header */} {/* Header */}
<div className="flex items-center justify-between px-6 py-4 border-b border-gray-100"> <div className="flex items-center justify-between border-b border-gray-100 px-8 py-5">
<div> <div>
<h2 className="font-semibold text-gray-800">环境工具</h2> <h2 className="font-semibold text-gray-800">环境工具</h2>
<p className="text-xs text-gray-400 mt-0.5">{project.name}</p> <p className="text-xs text-gray-400 mt-0.5">{project.name}</p>
@ -151,7 +151,7 @@ export function ProjectEnvModal({ project, onClose }: Props) {
</div> </div>
{/* Scan buttons */} {/* Scan buttons */}
<div className="flex gap-2 px-6 py-3 border-b border-gray-50 bg-gray-50"> <div className="flex gap-2 border-b border-gray-50 bg-gray-50 px-8 py-4">
<span className="text-xs text-gray-500 self-center mr-1">扫描目录:</span> <span className="text-xs text-gray-500 self-center mr-1">扫描目录:</span>
{project.win_path && ( {project.win_path && (
<button <button
@ -177,7 +177,7 @@ export function ProjectEnvModal({ project, onClose }: Props) {
</div> </div>
{/* Content */} {/* Content */}
<div className="flex-1 overflow-y-auto px-6 py-4"> <div className="flex-1 overflow-y-auto px-8 py-6">
<ToolchainCard <ToolchainCard
status={toolchain} status={toolchain}
loading={toolchainLoading} loading={toolchainLoading}