--- reviewStatus: pending reviewedAt: null replacedBy: null --- # 多语言插件架构设计与实施方案 ## 1. 设计目标 本设计将 CraftKit 建设为可扩展的多语言插件体系。现有 `dev`、`knowledge` 和 `skill` 插件继续提供通用工作流,新增 Profile 工厂和技术能力插件,使初始化、规范检索、后端设计、实现、测试和审查能够按项目真实技术栈加载 Java、Python 或前端专项知识。 本文是多语言插件架构的唯一设计依据。[《多语言插件架构改造计划》](MULTI-LANGUAGE-PLUGIN-ARCHITECTURE-PLAN.md)只跟踪实施批次、依赖和验证状态,不重复定义架构。首期建立独立插件骨架并保留旧 Skill 入口,但只有经过安装组合验证后才声明插件可独立交付。 首期交付范围: - 建立统一的 Profile 能力契约。 - 新增 Profile 工厂插件。 - 新增 Java 和 Python 技术能力插件。 - 改造项目初始化和规范检索入口。 - 让 `design-backend`、`implement-backend`、`test-backend` 和专项审查接入 Profile。 - 使用 Spring Boot 与 FastAPI 项目验证完整路由。 首期不包含: - 自动安装 JDK、Python、Maven、uv 或项目依赖。 - 自动修改业务项目的依赖版本。 - 数据库、HTTP 和前端详细设计规则的全面重写。 - Go、Rust、C# 等后续语言能力包。 - 运行时插件下载、动态代码加载或远程配置中心。 ## 2. 现状与约束 ### 2.1 已有能力 | 能力 | 当前入口 | 可复用内容 | | --- | --- | --- | | 项目初始化 | `knowledge:init` | 构建文件探测、项目画像、保守合并和安全边界 | | 项目画像 | `.craftkit/project.json` | 技术栈、代码边界、命令和知识入口 | | 规范检索 | `skill:guidance` | 来源优先级、渐进加载和版本 Profile 路由 | | 后端设计 | `dev:design-backend` | 中性设计流程和统一设计输出 | | 后端实现 | `dev:implement-backend` | 基于项目证据实施和验证 | | 后端测试 | `dev:test-backend` | 按项目测试框架选择测试层级 | | Java 审查 | `dev:review-java` | Java 语言专项审查基线 | | 插件市场 | `.agents/plugins/marketplace.json` | 独立插件注册和安装入口 | ### 2.2 主要缺口 - `profile` 只有概念和路由原则,没有机器可检查的统一契约。 - 公共语言知识缺少独立插件边界,难以单独安装、发布和维护。 - 初始化 Skill 同时承担通用扫描和技术识别,继续扩展会形成语言条件分支集合。 - 核心 Skill 只能手工寻找资料,无法稳定判断能力是否安装、版本是否匹配。 - `.craftkit/project.json` 只能给框架记录单个 `profile` 字符串,不能表达模块级语言和多个能力提供方。 - 跨插件相对路径会受到安装位置和插件版本目录影响,不能作为稳定依赖接口。 ### 2.3 平台约束 - Skill 是由 Agent 按描述和指令选择的能力,不假设存在传统依赖注入容器。 - 插件可以独立安装,核心工作流必须在语言插件缺失时继续执行通用部分。 - 不依赖用户目录中的固定插件缓存路径。 - 公共插件不能直接写入业务项目;项目文件统一由当前获得授权的核心 Skill 修改。 - 未确认精确版本时不能默认最新版本,也不能跨主版本混用规则。 ### 2.4 已验证的平台能力 本设计基于本机 Codex CLI 0.130.0、内置 `plugin-creator` 和 `skill-creator` 规范进行验证,结论如下: - 插件清单可以暴露插件内的 Skill 目录。 - `agents/openai.yaml` 当前只支持声明 MCP 工具依赖,没有 Skill 依赖声明。 - 当前没有标准接口让一个 Skill 在运行时枚举其他已安装插件、读取其物理目录或像函数一样调用另一个 Skill。 - 当前会话可用 Skill 由 Codex 在会话开始时发现;新增或更新插件需要后续安装组合和新会话验证。 因此,本文中的“请求能力”是 Agent 协作语义,不是 RPC 或函数调用。消费者根据当前会话已发现的提供方 Skill 获取专项资料;提供方读取自身资料并返回标准能力上下文。Profile 插件维护契约、匹配规则和校验器,不承担运行时扫描插件缓存。 ### 2.5 待验证边界 - Repo marketplace 安装后,三个新插件能否在新会话中按名称稳定发现。 - 多个版本的同一提供方同时存在时,Codex 暴露哪个版本。 - 缺少提供方时,消费者对通用工作流的真实行为是否符合设计。 - 提供方 Skill 返回的标准能力上下文能否在真实设计、测试和审查请求中保持一致。 上述边界分别在插件安装组合和真实场景阶段验证;验证完成前不把静态清单通过等同于运行行为通过。 ## 3. 总体设计 Profile 工厂负责“识别需求并选择能力”,技术插件负责“提供能力”,核心 Skill 负责“执行业务工作流”。项目知识库提供当前项目的覆盖规则。 ```mermaid flowchart TB U[用户任务] --> C[核心 Skill] C --> PJ[读取 project.json] PJ --> R[profile:resolve] R --> M{目标模块技术栈} M -->|Java| J[java:profile] M -->|Python| P[python:profile] M -->|Frontend| F[frontend:profile] J --> B[标准能力上下文] P --> B F --> B K[项目 standards 与 knowledge] --> B B --> C C --> O[统一产物] ``` ### 3.1 插件职责 | 插件 | 类型 | 职责 | | --- | --- | --- | | `profile` | 工厂 | 技术栈基础探测、目标模块选择、能力匹配、冲突检查和回退决策 | | `java` | 提供方 | Java、JDK、Maven、Gradle、Spring、测试和审查知识 | | `python` | 提供方 | Python、包管理、FastAPI、Django、Flask、测试和审查知识 | | `frontend` | 提供方 | TypeScript、React、Vue、Next.js、Nuxt、构建和测试知识 | | `knowledge` | 核心消费者 | 初始化并维护项目画像和项目知识入口 | | `skill` | 核心消费者 | 按优先级检索项目规则和公共技术知识 | | `dev` | 核心消费者 | 执行通用设计、实现、测试和审查工作流 | `doc` 和 `git` 首期不接入语言 Profile。后续只有在命令、生成物或发布规则确实依赖技术栈时,才通过 `command-resolution` 能力读取 Profile。 ### 3.2 依赖方向 ```text dev ──────────┐ knowledge ────┼──> profile contract <── java skill ────────┘ <── python <── frontend 项目 standards/knowledge ──> 覆盖公共 Profile ``` 依赖必须保持单向: - 核心插件依赖 Profile 契约,不依赖技术插件内部目录。 - 技术插件实现契约,不反向调用 `dev` 或修改项目画像。 - Profile 工厂只做解析,不执行设计、编码、测试或审查任务。 - 技术插件之间不能相互引用内部资料;跨技术协作通过统一契约完成。 ## 4. 插件和目录设计 ### 4.1 Profile 工厂插件 ```text plugins/profile/ ├─ .codex-plugin/ │ └─ plugin.json └─ skills/ └─ resolve/ ├─ SKILL.md ├─ agents/openai.yaml ├─ references/ │ ├─ contract.md │ ├─ detection.md │ ├─ resolution.md │ └─ fallback.md └─ scripts/ └─ validate_profile.py ``` `profile:resolve` 是契约和解析规则入口。消费者可在该 Skill 已发现时使用其匹配规则,但不能假设它能枚举或调用其他插件。它承担以下职责: 1. 接收目标目录、任务所需能力和项目画像。 2. 确认目标属于哪个模块。 3. 从项目文件识别语言、框架、版本和工具证据。 4. 根据当前会话已经发现的能力提供方返回信息完成匹配。 5. 合并项目覆盖规则并输出标准能力上下文。 6. 在缺失、冲突或版本不匹配时返回明确的回退结果。 `validate_profile.py` 只校验确定性的契约结构、标识、版本范围格式和引用文件存在性,不负责执行 Agent 路由。 ### 4.2 Java 技术插件 ```text plugins/java/ ├─ .codex-plugin/ │ └─ plugin.json └─ skills/ └─ profile/ ├─ SKILL.md ├─ agents/openai.yaml └─ references/ ├─ manifest.json ├─ index.md ├─ language/ ├─ build/ ├─ frameworks/ │ └─ spring/ ├─ persistence/ ├─ testing/ └─ review/ ``` Java 插件首期吸收现有 `review-java` 的公共资料,但 `dev:review-java` 的入口暂时保留。它通过 `java:profile` 获取专项知识,避免首期同时引入用户入口迁移。 ### 4.3 Python 技术插件 ```text plugins/python/ ├─ .codex-plugin/ │ └─ plugin.json └─ skills/ ├─ profile/ │ ├─ SKILL.md │ ├─ agents/openai.yaml │ └─ references/ │ ├─ manifest.json │ ├─ index.md │ ├─ language/ │ ├─ packaging/ │ ├─ frameworks/ │ │ ├─ fastapi/ │ │ ├─ django/ │ │ └─ flask/ │ ├─ persistence/ │ ├─ testing/ │ └─ review/ └─ review-python/ ├─ SKILL.md └─ agents/openai.yaml ``` `python:profile` 提供公共知识和能力上下文,`python:review-python` 执行 Python 专项审查。专项审查保持独立,是因为语言问题、触发边界和输出证据与通用代码审查存在明确差异。 ### 4.4 Frontend 技术插件 Frontend 插件在 Java/Python 闭环稳定后实施。它遵循同一契约,不把前端框架内容放入 Java 或 Python 插件。 ```text plugins/frontend/ ├─ .codex-plugin/plugin.json └─ skills/ ├─ profile/ ├─ review-typescript/ └─ test-frontend/ ``` ## 5. Profile 契约设计 ### 5.1 提供方清单 每个技术插件以 `references/manifest.json` 作为能力清单的唯一权威来源。清单只记录路由元数据,详细规则通过相对路径指向同一插件内的 Markdown 资料。JSON 可由 Python 标准库直接校验,不为契约校验器增加第三方 YAML 解析依赖。 ```json { "schemaVersion": 1, "provider": { "id": "python", "kind": "language", "displayName": "Python" }, "profiles": [ { "id": "python/default", "versionRange": "*", "detect": { "manifests": ["pyproject.toml", "requirements.txt"], "lockFiles": ["uv.lock", "poetry.lock", "pdm.lock", "Pipfile.lock"] }, "capabilities": { "backend-design": "references/backend/design.md", "backend-implementation": "references/backend/implementation.md", "backend-testing": "references/testing/index.md", "language-review": "references/review/index.md", "command-resolution": "references/packaging/commands.md" }, "fallback": "references/fallback.md" } ] } ``` 清单规则: - `schemaVersion` 控制契约结构兼容性,与插件版本分开管理。 - `provider.id` 与插件标识一致,不能使用项目名或公司名。 - `profile.id` 使用 `/` 格式,并在发布后保持稳定。 - `versionRange` 必须显式声明;无法确定时只提供版本中性 Profile。 - `detect` 只声明非敏感、可验证的项目证据。 - `capabilities` 的键来自统一能力表,值只能引用当前插件内文件。 - 缺少某项能力表示“不提供”,不能用空文件占位。 ### 5.2 能力标识 | 能力标识 | 消费者 | 输出用途 | | --- | --- | --- | | `project-detection` | `knowledge:init` | 补充语言、框架和工具识别规则 | | `knowledge-routing` | `skill:guidance` | 提供公共知识索引入口 | | `backend-design` | `dev:design-backend` | 提供语言与框架设计约束 | | `backend-implementation` | `dev:implement-backend` | 提供实现结构和验证规则 | | `backend-testing` | `dev:test-backend` | 提供测试层级、工具和命令规则 | | `language-review` | 专项审查 Skill | 提供语言问题分类和证据要求 | | `framework-review` | 专项或通用审查 | 提供框架生命周期、事务等规则 | | `command-resolution` | 实现、测试及后续系统插件 | 提供项目工具命令选择规则 | 能力标识首期使用固定枚举。新增标识必须先更新契约,再由提供方实现,不能由单个技术插件私自扩展相近名称。 ### 5.3 标准能力请求 核心 Skill 向 Profile 工厂提供以下语义输入: ```yaml target: services/order capabilities: - backend-design task: 为订单服务设计幂等创建流程 projectProfile: .craftkit/project.json ``` 这不是外部 HTTP 接口。它定义 Skill 协作时必须具备的信息,实际内容由 Agent 从用户任务和项目文件构造。 ### 5.4 标准能力上下文 Profile 工厂返回的结果必须区分事实、选择结果、规则入口和缺口: ```yaml schemaVersion: 1 targetModule: order-service detected: language: name: python version: "3.12" evidence: pyproject.toml framework: name: fastapi version: "0.115.0" evidence: uv.lock resolvedProfiles: - id: python/default provider: python - id: python/fastapi-0 provider: python capabilities: backend-design: status: available references: - python:profile/references/backend/design.md - python:profile/references/frameworks/fastapi/design.md overrides: - .craftkit/standards/backend/index.md gaps: [] ``` 标准能力上下文默认只存在于当前任务上下文中,不写入项目文件。只有初始化或用户明确要求更新项目画像时,才持久化稳定的识别结果。 ### 5.5 路径标识 跨插件引用使用逻辑标识: ```text :/ ``` 例如: ```text python:profile/references/testing/index.md ``` 该标识只用于诊断和交接,不能作为可直接打开的物理路径。提供方 Skill 负责读取自身资料,消费者不拼接用户缓存目录或其他插件安装路径。 ### 5.6 能力发现协议 1. 消费者从当前会话公开的 Skill 清单判断提供方是否可用。 2. 已发现对应提供方时,由 Agent 使用其 Profile Skill 获取能力上下文。 3. 未发现提供方时返回 `missing`,继续执行核心通用流程。 4. 提供方只读取自身 `references/manifest.json` 和资料,不读取其他插件目录。 5. Profile 契约校验器在仓库开发和发布阶段校验提供方,不充当运行时注册中心。 6. 逻辑标识出现在诊断结果中时,同时携带提供方、Skill 和资料用途;消费者不得把它转换为本机绝对路径。 该协议避免核心插件依赖缓存目录,也避免把 Agent 的 Skill 选择描述成确定性代码调用。 ## 6. 项目画像设计 ### 6.1 Schema 版本 `.craftkit/project.json` 从 `schemaVersion: 1` 兼容演进至 `schemaVersion: 2`。版本 2 增加模块级技术栈和 Profile 绑定,保留版本 1 的顶层字段。 建议结构: ```json { "schemaVersion": 2, "initialization": { "mode": "existing", "references": [] }, "project": { "name": "sample", "description": "", "type": "multi-module" }, "technology": { "languages": ["Python"], "frameworks": [ { "name": "fastapi", "version": "0.115.0", "profile": "python/fastapi-0" } ], "buildTools": [], "databases": [] }, "modules": [ { "id": "api", "root": ".", "kind": "backend", "technology": { "languages": [ { "name": "python", "version": "3.12", "evidence": ["pyproject.toml"] } ], "frameworks": [ { "name": "fastapi", "version": "0.115.0", "evidence": ["uv.lock"] } ], "preferredProfiles": ["python/default", "python/fastapi-0"] } } ], "commands": { "build": [], "test": ["uv run pytest"], "check": ["uv run ruff check ."] } } ``` ### 6.2 字段规则 - 顶层 `technology` 保持 Schema 1 的字段类型,作为旧消费者可读取的仓库概要。 - `modules[].technology` 记录模块级语言、框架、精确版本、证据和 Profile 偏好。 - `modules` 描述多模块仓库中的技术边界;单模块项目仍生成一个根模块。 - `modules[].preferredProfiles` 记录项目确认的 Profile 偏好,不代表当前机器已经安装对应插件。 - `commands` 继续记录项目文件或用户确认的真实命令,不由公共 Profile 直接覆盖。 - 识别证据使用项目相对路径;运行时输出和用户机器绝对路径不进入共享画像。 ### 6.3 兼容读取 | 输入状态 | 读取行为 | | --- | --- | | `schemaVersion: 1` | 将顶层技术栈视为根模块候选,不自动改写文件 | | 语言仍是字符串 | 解析名称,版本和 Profile 保持未知 | | 没有 `modules` | 根据代码根和目标路径临时推导根模块 | | Profile 不存在 | 保留技术事实,将 Profile 标记为未解析 | | 新旧证据冲突 | 保留原值并展示差异,确认后更新 | Schema 升级只由 `knowledge:init` 或后续明确的迁移能力执行。普通设计、实现和审查 Skill 不修改项目画像。 ## 7. 核心流程设计 ### 7.1 初始化流程 ```mermaid sequenceDiagram participant U as 用户 participant I as knowledge:init participant R as profile:resolve participant P as 技术能力提供方 participant J as project.json I->>I: 通用扫描项目文件与模块 I->>R: 请求 project-detection R->>P: 按证据匹配已安装提供方 P-->>R: 返回探测规则与候选 Profile R-->>I: 返回已识别、冲突和待确认项 I-->>U: 展示证据与拟写入内容 U-->>I: 确认或修正 I->>J: 保守合并项目画像 I->>R: 验证持久化后的解析结果 R-->>I: 返回验证结果 ``` 状态变化: - 写入前:项目扫描结果只存在于任务上下文。 - 用户确认后:`knowledge:init` 单点写入或合并 `.craftkit/project.json`。 - 写入失败:保留原文件,不允许语言插件继续部分写入。 - 验证失败:报告已写入内容和失败原因,由初始化 Skill决定回滚或修正。 ### 7.2 后端设计流程 `dev:design-backend` 接入后执行以下步骤: 1. 读取需求、目标模块、项目画像和现有实现。 2. 请求 `backend-design` 能力。 3. Profile 工厂解析语言、框架、版本和项目覆盖规则。 4. 技术插件提供当前版本适用的设计资料入口。 5. `design-backend` 合并通用边界与专项约束。 6. 输出统一的模块、依赖、数据、事务、错误、权限和测试设计。 7. 输出中标明使用的 Profile、项目覆盖规则和未覆盖能力。 语言插件不生成最终设计文档。最终责任仍属于 `design-backend`,从而保证不同语言的设计产物结构一致。 ### 7.3 实现和测试流程 - `implement-backend` 请求 `backend-implementation` 和 `command-resolution`。 - `test-backend` 请求 `backend-testing` 和 `command-resolution`。 - Profile 提供命令选择规则,最终命令必须由项目文件或用户确认支持。 - 写代码和测试的权限、范围控制及 Git 边界继续由原核心 Skill 负责。 - 技术插件不能因提供某种工具规则而自动安装工具或新增项目依赖。 ### 7.4 知识检索流程 `skill:guidance` 保留现有来源优先级,并在公共基线之前增加 Profile 解析: 1. 用户要求与目标目录 `AGENTS.md`。 2. `.craftkit/project.json` 和目标模块。 3. 项目 `.craftkit/standards/` 与 `.craftkit/knowledge/`。 4. 已解析技术 Profile 的 `knowledge-routing` 入口。 5. CraftKit 中性公共基线。 6. 现有代码观察结果。 项目规则与 Profile 冲突时采用项目规则,并在输出中同时给出两者来源。 ## 8. 版本与冲突处理 ### 8.1 Profile 选择 Profile 选择按以下顺序执行: 1. 使用项目画像中已确认的 Profile 偏好,并检查当前会话是否发现对应提供方。 2. Profile 未记录时,根据精确版本匹配唯一候选。 3. 多个候选同时匹配时,优先选择范围更窄且框架证据更具体的候选。 4. 仍不能唯一确定时,不自动选择,返回候选和差异。 5. 没有版本匹配时,只加载版本中性资料。 ### 8.2 多模块仓库 - 先用目标路径匹配 `modules[].root`,最长路径匹配优先。 - 同一目标同时命中多个同长度模块时视为配置冲突。 - 跨模块任务分别解析各模块 Profile,不合并为单一技术栈。 - 前后端联调通过 API 契约协作,不将后端语言规则加载到前端实现。 ### 8.3 能力状态 | 状态 | 含义 | 消费者行为 | | --- | --- | --- | | `available` | 已安装、版本匹配且资料完整 | 正常加载 | | `generic` | 只有版本中性资料 | 使用通用规则并说明范围 | | `missing` | 提供方或能力不存在 | 核心流程继续,报告缺口 | | `incompatible` | Profile 与项目版本不匹配 | 禁止加载冲突资料 | | `ambiguous` | 多个候选无法唯一选择 | 请求最小必要确认 | | `invalid` | 清单或引用校验失败 | 隔离该提供方并报告错误 | ## 9. 可靠性、安全与可观测性 ### 9.1 一致性 - 只有 `knowledge:init` 可以在初始化流程中写项目画像,防止多个提供方并发覆盖。 - Profile 解析是只读、可重复执行的过程,相同项目事实和能力版本应得到相同结果。 - 写入项目画像前保留原内容,采用完整 JSON 校验后再替换目标文件。 - 数组按语义标识去重,不能因路径分隔符或大小写产生重复模块和证据。 ### 9.2 安全边界 - 探测器只读取依赖名称、版本、脚本和非敏感元数据。 - `.env`、凭据文件、令牌、私钥和完整仓库认证信息不作为 Profile 证据。 - 公共能力包不得保存内部包源码、公司规范或业务项目内容。 - Profile 提供的命令是选择规则,不构成执行授权。 - 实现、测试、提交和发布仍遵循对应核心 Skill 的权限规则。 ### 9.3 诊断输出 每次 Profile 解析至少能够报告: - 目标模块及匹配依据。 - 语言、框架、版本和证据路径。 - 命中的 Profile 与能力状态。 - 项目规则覆盖情况。 - 缺失、冲突、无效和版本不匹配项。 - 当前核心 Skill 可以继续执行的范围。 诊断信息默认在任务中输出,不在项目中生成运行日志。 ## 10. 迁移设计 ### 10.1 迁移原则 - 先增加契约和提供方,再改造消费者。 - 先逻辑分层,再迁移目录和用户入口。 - 每个消费者独立接入并验证,不一次修改所有 Skill。 - 旧项目画像只读兼容,新字段在明确初始化或迁移时写入。 - 旧 Skill 入口至少保留一个兼容发布周期,避免用户已保存的调用失效。 ### 10.2 存量内容迁移 | 存量内容 | 首期处理 | 后续处理 | | --- | --- | --- | | `dev:review-java` | 保留入口,改为读取 Java Profile | 稳定后评估迁入 Java 插件 | | `guidance` 公共后端规则 | 保留中性规则 | Java/Python 专项内容迁入对应插件 | | `guidance` 版本路由 | 按目标模块读取当前会话已发现的提供方 | 旧文档改为契约说明入口 | | `knowledge:init` 探测规则 | 保留通用扫描 | 技术专项识别由提供方补充 | | `project.json` 模板 | 保留 Schema 1 兼容读取 | 初始化确认后写 Schema 2 | | `dev` 后端 Skill | 逐个接入 Profile | 完成后移除重复专项资料 | ### 10.3 回滚 - 新插件尚未发布时,删除 marketplace 新增项即可恢复原安装集合。 - 消费者接入必须保留“未找到 Profile 时执行原通用流程”的分支。 - Schema 2 画像不能直接降级覆盖为 Schema 1;回滚核心插件时保留文件,并按已知顶层字段读取。 - 技术资料迁移前保留 Git 历史,完成所有消费者切换后才能删除原位置。 ## 11. 实施方案 ### 11.1 批次 A:Profile 契约和工厂骨架 **新增文件** ```text plugins/profile/.codex-plugin/plugin.json plugins/profile/skills/resolve/SKILL.md plugins/profile/skills/resolve/agents/openai.yaml plugins/profile/skills/resolve/references/contract.md plugins/profile/skills/resolve/references/detection.md plugins/profile/skills/resolve/references/resolution.md plugins/profile/skills/resolve/references/fallback.md plugins/profile/skills/resolve/scripts/validate_profile.py ``` **修改文件** ```text .agents/plugins/marketplace.json README.md CHANGELOG.md ``` **任务** 1. 定义提供方清单和标准能力上下文。 2. 实现契约静态校验器。 3. 编写模块匹配、版本选择、能力状态和回退规则。 4. 注册 `profile` 插件并补充安装说明。 **验收** - 有效、缺字段、重复标识、无效版本范围和失效引用五类样例均有确定结果。 - `profile` 单独安装时能够解释缺少技术提供方并返回 `missing`。 ### 11.2 批次 B:Java 基准提供方 **新增文件** ```text plugins/java/.codex-plugin/plugin.json plugins/java/skills/profile/SKILL.md plugins/java/skills/profile/agents/openai.yaml plugins/java/skills/profile/references/manifest.json plugins/java/skills/profile/references/index.md plugins/java/skills/profile/references/language/index.md plugins/java/skills/profile/references/build/index.md plugins/java/skills/profile/references/frameworks/spring/index.md plugins/java/skills/profile/references/testing/index.md plugins/java/skills/profile/references/review/index.md ``` **修改文件** ```text .agents/plugins/marketplace.json plugins/dev/skills/review-java/SKILL.md plugins/dev/skills/review-java/references/sources.md README.md CHANGELOG.md ``` **任务** 1. 将现有 Java 规则映射到能力清单。 2. 建立 JDK、Maven/Gradle 和 Spring 的渐进加载入口。 3. 让 `dev:review-java` 读取 Java Profile;未安装时使用现有最小基线。 4. 使用现有 Java 项目验证路由和回退。 **验收** - Java 版本和构建工具有项目证据。 - Spring 资料只在依赖和版本匹配时加载。 - `review-java` 的现有触发范围和审查输出不退化。 ### 11.3 批次 C:Python 最小提供方 **新增文件** ```text plugins/python/.codex-plugin/plugin.json plugins/python/skills/profile/SKILL.md plugins/python/skills/profile/agents/openai.yaml plugins/python/skills/profile/references/manifest.json plugins/python/skills/profile/references/index.md plugins/python/skills/profile/references/language/index.md plugins/python/skills/profile/references/packaging/index.md plugins/python/skills/profile/references/frameworks/fastapi/index.md plugins/python/skills/profile/references/persistence/index.md plugins/python/skills/profile/references/testing/index.md plugins/python/skills/profile/references/review/index.md plugins/python/skills/review-python/SKILL.md plugins/python/skills/review-python/agents/openai.yaml ``` **修改文件** ```text .agents/plugins/marketplace.json README.md CHANGELOG.md ``` **任务** 1. 支持 `pyproject.toml`、依赖文件、锁文件和 Python 版本证据。 2. 支持 pip、uv、Poetry、PDM 和 Pipenv 的项目内选择。 3. 建立 Python 通用、FastAPI、pytest、Ruff 和类型检查资料入口。 4. 新增 Python 专项审查 Skill。 5. 使用 FastAPI 项目验证语言、框架、测试和审查能力。 **验收** - 不配置 Ruff、mypy 或 pyright 的项目不会被假定具备对应命令。 - 同步与异步规则按真实代码和框架配置选择。 - Python 版本未知时不输出版本专属语法升级建议。 ### 11.4 批次 D:初始化和画像 Schema 2 **修改文件** ```text plugins/knowledge/skills/init/SKILL.md plugins/knowledge/skills/init/references/existing.md plugins/knowledge/skills/init/references/new.md plugins/knowledge/skills/init/references/project-config.md plugins/knowledge/skills/init/assets/project.json plugins/knowledge/skills/init/assets/AGENTS.md ``` **新增文件** ```text plugins/knowledge/skills/init/references/profile-resolution.md plugins/knowledge/skills/init/references/project-schema-v2.md ``` **任务** 1. 将通用扫描与技术提供方探测分离。 2. 增加模块级技术栈和识别证据。 3. 定义 Schema 1 到 Schema 2 的保守合并规则。 4. 初始化结束后调用 Profile 解析做一致性验证。 **验收** - Java、Python、前后端混合和旧版画像四类项目均能完成初始化。 - 未安装语言插件时仍能记录技术事实,但 Profile 保持未解析。 - 已有未知字段和用户章节不会被删除。 ### 11.5 批次 E:规范检索和核心后端消费者 **修改文件** ```text plugins/skill/skills/guidance/SKILL.md plugins/skill/skills/guidance/references/profile-routing.md plugins/dev/skills/design-backend/SKILL.md plugins/dev/skills/implement-backend/SKILL.md plugins/dev/skills/test-backend/SKILL.md ``` **任务** 1. `guidance` 将 Profile 知识入口纳入渐进加载顺序。 2. `design-backend` 请求 `backend-design` 能力。 3. `implement-backend` 请求 `backend-implementation` 和 `command-resolution`。 4. `test-backend` 请求 `backend-testing` 和 `command-resolution`。 5. 三个核心 Skill 统一报告命中 Profile、覆盖规则和能力缺口。 **验收** - 相同后端需求在 Spring Boot 和 FastAPI 项目中使用不同专项知识,但输出结构一致。 - 目标模块技术栈不明确时不会加载仓库中其他模块的 Profile。 - 语言插件缺失时核心 Skill 可按原中性流程完成可确认部分。 ### 11.6 批次 F:框架补全和前端接入 **任务** - 补充 Django、Flask、SQLAlchemy、Alembic 和 Django ORM。 - 建立 Frontend Profile、`review-typescript` 和 `test-frontend`。 - 通过 `design-api` 与 `prepare-api` 验证不同后端语言到前端的统一契约。 - 根据实际维护成本决定是否迁移 `review-java` 到 Java 插件。 **验收** - 框架 Profile 可以独立演进,不修改核心工作流步骤。 - 前端消费者只读取 API 契约和前端 Profile,不加载后端语言实现规则。 ## 12. 测试方案 ### 12.1 静态校验 - 校验插件目录、`plugin.json`、Skill frontmatter 和 `agents/openai.yaml`。 - 校验 Profile 清单 Schema、能力枚举、版本范围和引用路径。 - 扫描跨插件物理路径和用户缓存绝对路径。 - 检查空资料、占位符、重复 Profile 标识和失效链接。 ### 12.2 路由场景 | 编号 | 场景 | 预期能力状态 | | --- | --- | --- | | R1 | Java 17、Spring Boot 3、Maven Wrapper | Java 与 Spring `available` | | R2 | Python 3.12、FastAPI、uv | Python 与 FastAPI `available` | | R3 | Python 项目无质量工具 | 语言能力可用,未配置工具不进入命令 | | R4 | Python 版本未知 | Python `generic`,版本专属规则不加载 | | R5 | 项目版本超出 Profile 范围 | 对应能力 `incompatible` | | R6 | 未安装 Python 插件 | Python 专项能力 `missing`,核心流程继续 | | R7 | Java/Python 混合仓库 | 根据目标模块分别解析 | | R8 | 两个同长度模块同时匹配 | 解析结果 `ambiguous` | | R9 | Profile 引用文件缺失 | 提供方 `invalid` 并被隔离 | | R10 | 项目规范覆盖公共规则 | 返回覆盖来源并采用项目规则 | ### 12.3 端到端场景 分别准备一个最小 Spring Boot 项目和一个最小 FastAPI 项目,对两者执行相同任务: 1. 初始化项目画像。 2. 查询后端规范。 3. 设计一个包含事务和外部调用的后端功能。 4. 给出最小实现变更。 5. 生成并运行聚焦测试。 6. 执行语言专项审查。 验证重点: - 每一步使用了正确模块和 Profile。 - 项目已有命令优先于公共建议。 - 设计产物结构一致,语言实现规则不同。 - 缺失工具不会被隐式安装或写入项目。 - 失败结果能够区分项目缺陷、环境问题和 Profile 缺口。 ## 13. 发布方案 ### 13.1 发布顺序 1. 发布 `profile` 插件及契约。 2. 发布 Java 基准插件。 3. 发布 Python 最小插件。 4. 发布接入新版契约的 `knowledge` 和 `skill` 插件。 5. 发布接入新版契约的 `dev` 插件。 6. 完成一轮双语言端到端回归后,再补充 Frontend 插件。 ### 13.2 版本影响 - 新增独立插件使用 `0.1.0` 起始版本。 - 核心插件新增可回退的 Profile 增强时升级次版本。 - 删除或移动已有 Skill 入口属于不兼容变更,必须单独规划主版本。 - `.craftkit/project.json` Schema 2 在保留 Schema 1 读取能力时属于向后兼容能力;停止读取 Schema 1 才属于不兼容变化。 ### 13.3 安装组合 | 使用场景 | 建议安装 | | --- | --- | | 通用项目管理 | `knowledge`、`skill`、`profile` | | Java 后端 | 通用组合 + `dev` + `java` | | Python 后端 | 通用组合 + `dev` + `python` | | 前后端项目 | 对应后端组合 + `frontend` | | 仅使用通用开发流程 | `dev`,Profile 缺失时按中性流程回退 | ## 14. 实现交接清单 编码按以下已定口径执行: - Profile 清单采用 JSON,校验器仅依赖 Python 标准库。 - 插件之间不要求平台提供可选依赖声明,通过能力契约、安装说明和回退状态协作。 - `.craftkit/project.json` 采用兼容的 Schema 2,对 Schema 1 保持只读兼容。 - `dev:review-java` 首期保留一个兼容发布周期,只把公共知识来源切换到 Java Profile。 - Python 先提供版本中性 Profile;版本专项 Profile 必须依据纳入支持范围的真实项目和官方资料另行建立。 - 双语言验证优先使用仓库内无业务数据的最小夹具;引入外部项目时另行确认扫描范围和命令。 实施按 A 到 F 顺序进行。每个批次独立提交、独立验证;前一批次契约或回退未通过时,不进入下一个消费者改造批次。 ## 15. 设计自检结论 - 职责明确:工厂只解析,技术插件只提供能力,核心 Skill 负责最终工作流。 - 依赖单向:消费者依赖契约,不依赖技术插件物理目录。 - 数据所有权明确:项目画像由 `knowledge:init` 写入,技术插件只读。 - 失败状态明确:缺失、不兼容、歧义和无效清单均有独立状态和回退。 - 兼容策略明确:保留 Schema 1 读取、现有 Skill 入口和无 Profile 通用流程。 - 安全边界明确:Profile 探测不读取凭据,命令建议不构成执行授权。 - 验证完整:覆盖静态契约、路由组合和 Java/Python 端到端场景。 - 实施可拆分:六个批次均有文件范围、任务和验收标准。