diff --git a/README.md b/README.md index 2df5652..f9ad7f3 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ CraftKit 是一组面向 Codex 插件市场的中性 Skill 工具。项目从通 | 插件 | 用途 | 当前状态 | | --- | --- | --- | -| `dev` | 软件设计、编码、审查与测试 | 已迁移 `component`、`style`、`form`、`plan-change`、`design-backend`、`design-frontend`、`prepare-api` | -| `doc` | 文档转换、整理与写作 | 已迁移 `format-md`、`docx-to-md`、`md-to-docx`、`xlsx-to-md`、`archive` | -| `git` | 分支、提交、变更提取与集成 | 已迁移 `commit-msg`、`branch`、`identity`、`export`、`integrate` | +| `dev` | 软件设计、实现、审查、测试、升级与估算 | 已迁移 22 个 Skill,覆盖完整通用开发流程 | +| `doc` | 文档转换、整理与写作 | 已迁移 8 个 Skill,新增报告、消息与需求整理 | +| `git` | 分支、提交、变更提取、集成与发布 | 已迁移 6 个 Skill,发布操作按阶段分别授权 | | `knowledge` | 项目初始化、交接、复盘与经验 | 已迁移 `handoff`、`init`、`trace`、`distill`、`lessons`、`worklog` | | `skill` | 项目规范及 Skill 创建、迁移与维护 | 已迁移 `guidance`、`guidance-edit` | diff --git a/migration/source-lock.json b/migration/source-lock.json index 1e1c97f..724f1ed 100644 --- a/migration/source-lock.json +++ b/migration/source-lock.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "updatedAt": "2026-08-25", + "updatedAt": "2026-08-26", "sources": { "source-a": { "commit": "31883f7e81c2bdb19505e591ba9db8a3d9fd4352", @@ -15,7 +15,10 @@ "source-a:2c317f4ba8859f5e": { "sourcePathHash": "2c317f4ba8859f5e210c18e69e99e8e472d38d97e193c5f213508d4afb672c11", "sourceSha256": "ed08a64bf0f5004d43a9c09a40087aebec8f52323c5a47d8fc73f9f9aca9be0e", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/review-code", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-a:1b7843684955ce5a": { "sourcePathHash": "1b7843684955ce5a0beb3ef16c6e751c5e9eb5a17409084fed806b74ec0c522f", @@ -28,7 +31,10 @@ "source-a:5d76364c580248a5": { "sourcePathHash": "5d76364c580248a54449e5ec7ede0079f19df21fef95922d3538fb82c095b181", "sourceSha256": "9a664d17f276b01311f661aa6e8fd40063708550c97cc3340246922194d8390b", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/implement-backend", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-a:a0b791b6dac96b81": { "sourcePathHash": "a0b791b6dac96b8180df558278b5c7ef643b4806cc4e534ffe6395b9236666d3", @@ -49,7 +55,10 @@ "source-a:b80c5913e146321c": { "sourcePathHash": "b80c5913e146321ca5efef5e45f11172e79c542855c2ae65478fe253414e66ea", "sourceSha256": "5e33d979bb08fdcc47b2dee2e0d5cb39c24825b391f8bbf5606e57cbd4c2ef2c", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/implement-frontend", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-a:cd36505dd718e889": { "sourcePathHash": "cd36505dd718e88966ad74421c65e6c7cccd71a1436f2843eb8cfa7a4f1534c5", @@ -62,7 +71,10 @@ "source-a:e14c1a3cd3b041f6": { "sourcePathHash": "e14c1a3cd3b041f650d71eb5701c71c0de76cb7a909e9a419f1d277159cd763a", "sourceSha256": "7780de4d979a6bafd1f5f503f08261858907f110acddb630dfab36d32e54c6a8", - "status": "pending" + "status": "superseded", + "target": "official:skill-creator", + "reason": "Codex 官方 skill-creator 已覆盖通用 Skill 创建与更新能力", + "reviewedAt": "2026-08-26" }, "source-a:fdde0da43c1ec4c7": { "sourcePathHash": "fdde0da43c1ec4c7fddad96b9172435af6be96ceafa2cc824f70e04a3cf11085", @@ -90,17 +102,26 @@ "source-a:bc91b57fa2a50049": { "sourcePathHash": "bc91b57fa2a500498b31b0f1a87dfa8ab83c32e4b361b4ea1614ea6721234b7c", "sourceSha256": "1436c7e25325c927d55d1dfc2a3117ec8e30845d66e06d2e6d7cc75abe4e0792", - "status": "pending" + "status": "excluded", + "reason": "CraftKit 仅面向 Codex,不增加 Cursor 平台转换能力", + "reviewedAt": "2026-08-26" }, "source-b:3fb4282b0b034d52": { "sourcePathHash": "3fb4282b0b034d5286bccd9924c37bedbe857c4673798aa844f540fe0ee5186a", "sourceSha256": "196cd701c67d06fce4ee3b9894cbed95e6bc9101cc2089f83ae8f35b61a11332", - "status": "pending" + "status": "migrated", + "target": "plugins/git/skills/release", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:0dedfcd01cd89e28": { "sourcePathHash": "0dedfcd01cd89e28e83d841f78c270b1210399cc867fd3e1865c14acf1ea865a", "sourceSha256": "be6a694d4de9b8a792e19e1ed116e2fdd54d91731d9efcadfca1b0055a4a3145", - "status": "pending" + "status": "superseded", + "target": "plugins/dev/skills/implement-backend", + "targetVersion": "0.1.0", + "reason": "后端实现能力已与另一来源合并并按项目证据中性重建", + "reviewedAt": "2026-08-26" }, "source-b:3f05784a0a86ba5f": { "sourcePathHash": "3f05784a0a86ba5fb8f268797ca1ceabe8ca237b3c9d3c4396e622c1ef421cc6", @@ -114,12 +135,19 @@ "source-b:41934e94a1922a1b": { "sourcePathHash": "41934e94a1922a1bbccec4377246e67bd84f1ffbd2b9d1bf4027c1ed15d12260", "sourceSha256": "a0db48d88dab0537e061146edf6dbdeb4b7f8a935febd1556f798ef234b29e5b", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/test-backend", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:0cfb12fd60357a34": { "sourcePathHash": "0cfb12fd60357a346c8e0079536540fba81e406d58205098f1a5162c6ce7e9d1", "sourceSha256": "aa722e0dbcb613748b75bc2f5c81b8a97cbff07905b1fcee6d58cb176135fc08", - "status": "pending" + "status": "superseded", + "target": "plugins/dev/skills/review-code", + "targetVersion": "0.1.0", + "reason": "代码检查能力已合并到统一代码审查入口", + "reviewedAt": "2026-08-26" }, "source-b:f171b05e239c2e2c": { "sourcePathHash": "f171b05e239c2e2c5f2a0c636dfac0c2456b9d3b5215fdaa7fb86a33be1ee188", @@ -133,7 +161,11 @@ "source-b:3b29e4441f642e65": { "sourcePathHash": "3b29e4441f642e65d442fd284f37a45364cebb7a6c53446c354d15c70e532410", "sourceSha256": "d2689d3ac45070389473cb8cc414df44e82ad267915d8cd7c53c023f5b8f3696", - "status": "pending" + "status": "superseded", + "target": "plugins/dev/skills/implement-frontend", + "targetVersion": "0.1.0", + "reason": "前端实现能力已与另一来源合并并按项目证据中性重建", + "reviewedAt": "2026-08-26" }, "source-b:f6ec7bd5501e6ea5": { "sourcePathHash": "f6ec7bd5501e6ea5f6e907a586a8d7cbe5fbbeebd3e5c8efead9b250742a148e", @@ -179,7 +211,10 @@ "source-b:742ba3611bee4e34": { "sourcePathHash": "742ba3611bee4e34dfee6dadbe192dd8be677c4b9f49108e2f04d9e22dc8801f", "sourceSha256": "7582e333966b45ee2d145601831449d75c4f3159670c31df25e5d18e6a357bbe", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/test-ui", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:d6d4166800584a61": { "sourcePathHash": "d6d4166800584a61ad6cbf96af57bb8ee269a16babba753f267b48efd66f6d2d", @@ -208,17 +243,27 @@ "source-b:34ab291ce3cfed2e": { "sourcePathHash": "34ab291ce3cfed2e69cc6f08309b1a41142be91235b9a573daf98639b4a001cc", "sourceSha256": "239d7efb1f9a53fc1b40f367954a6f6eaaf9d7a56cdf712128dcf393dc5a5067", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/design-api", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:3c8596a5d95de214": { "sourcePathHash": "3c8596a5d95de214d381b2f04898dd7042a266aa7889569981a97a1cf50045d1", "sourceSha256": "cc19258fcf63018ce2dac4d7253e23fbfb71596ee27235871ad78aae743b57e6", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/design-db", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:a388287911bc39cb": { "sourcePathHash": "a388287911bc39cb3f88824044426782df3c3e6450c4db9e4948c28a47dbf9f1", "sourceSha256": "20e13c3458f6af8d0b131f650f573eb824978438b52475a2f480a67c2f846cd6", - "status": "pending" + "status": "superseded", + "target": "plugins/skill/skills/guidance", + "targetVersion": "0.1.0", + "reason": "框架约定改由通用规范检索结合项目真实依赖解析", + "reviewedAt": "2026-08-26" }, "source-b:ca08ee8839bccc15": { "sourcePathHash": "ca08ee8839bccc1504c253cdb9bfc09803ddf77f948605f8563d04e0466a2ce7", @@ -232,12 +277,18 @@ "source-b:1b4cee54060ef399": { "sourcePathHash": "1b4cee54060ef3995d6c98e99dee3c3200ab2e90dd62136cef07b9b09e31364d", "sourceSha256": "24df169fbb18f39be5ec4046cc8d33535b1b86d2114673ee35d1a2a0324c1b25", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/review-frontend", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:7b7552c8c6e1b5f5": { "sourcePathHash": "7b7552c8c6e1b5f56a283db304272da8cd63210aaf7327231a7b26f3cf903082", "sourceSha256": "9c373fe6bb955d4431e92bba66239cb707a6179082a624b74bc77fa36663fc61", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/design-frontend-data", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:5f525e6aeda55dd8": { "sourcePathHash": "5f525e6aeda55dd81c26d38cf59097cb52abbcfc5b05e35fe7e8101a1a3353b5", @@ -250,22 +301,35 @@ "source-b:f2079362cf82e719": { "sourcePathHash": "f2079362cf82e719e2dde6098c55ce984709a97446a7f66113f8b5f317f1f55b", "sourceSha256": "f57f3c0d5175c3c1700b74e8489d820eed4ef36d10e79ab14e096cb2a20a0cec", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/review-java", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:b78122ad4813e9ba": { "sourcePathHash": "b78122ad4813e9baef0ee5281bddb910b01fd89bdbbd2753011ac3deb52a8ce5", "sourceSha256": "c06d7eb2674dcbb4bad01a8c65c6d372dffd95c585a16ab2c3f1bba19df199e0", - "status": "pending" + "status": "superseded", + "target": "plugins/skill/skills/guidance", + "targetVersion": "0.1.0", + "reason": "框架知识查询改由通用规范检索与项目源码证据完成", + "reviewedAt": "2026-08-26" }, "source-b:7fd143975b0071c3": { "sourcePathHash": "7fd143975b0071c3efa271a9ad19c3d7e422f64d3e23aa08d7a091c805cb9467", "sourceSha256": "33582dcda068247a5c56238134dad308d1f66b03abbfdc7bc282a9ac9ff918a2", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/review-mybatis", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:affd0805467646c1": { "sourcePathHash": "affd0805467646c1fcb4c196776e9cb610fcec721e1a44df3bc02f5c08b84aeb", "sourceSha256": "c7f565da3a1f412d3f15642fc9ad44733adee73c4d13cdebffaff1de4ca5652c", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/design-workflow", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:2a64acb63e8b2030": { "sourcePathHash": "2a64acb63e8b203031c4ef292f957c0fe0d3722e079dc9a299730015b9e3359c", @@ -368,22 +432,35 @@ "source-b:258ee10299925494": { "sourcePathHash": "258ee1029992549420c8465c8de2d63c1bfaf9334b812d6b79a07a9823b49733", "sourceSha256": "b4958d4aee3c06b778273d87a07dd423cf15fc8fbfdde27e00552ff60138795e", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/analyze-bugs", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:52592d4a59314c74": { "sourcePathHash": "52592d4a59314c74de9b58cfb4cda6e9f5d9514bb05c9b586044c12754982d52", "sourceSha256": "e8be1b2c17ab3aaccbb5559a07b64da8a7c718293e83cb8dd685c87708c7cbdc", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/upgrade", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:f478193705d1d02d": { "sourcePathHash": "f478193705d1d02d6bb6375728dc10d34487e3f67ab8d164a80104f6a71fccdc", "sourceSha256": "218eb591d1944b2280853bbf39cb028f9a41e55dee01218838b14f87755fad72", - "status": "pending" + "status": "superseded", + "target": "official:browser-computer-use", + "reason": "Codex 浏览器与计算机操作能力已覆盖宿主浏览器代理配置", + "reviewedAt": "2026-08-26" }, "source-b:e4b14f4b2719e28b": { "sourcePathHash": "e4b14f4b2719e28b409bc66980b3698588684dde81a0c627e862262e76c34b2f", "sourceSha256": "de185022a0cf8bfce340709f47052578ec761664c96723172c48bdd4f10e71f1", - "status": "pending" + "status": "superseded", + "target": "plugins/dev/skills/review-code", + "targetVersion": "0.1.0", + "reason": "分支、提交与目录审查已合并到统一代码审查入口", + "reviewedAt": "2026-08-26" }, "source-b:aa42f7c1a045bb49": { "sourcePathHash": "aa42f7c1a045bb496bbc9e62beb7a7b74544153ed9551492f5b801ca4c9df098", @@ -404,12 +481,19 @@ "source-b:9e3e75840a46af96": { "sourcePathHash": "9e3e75840a46af96c33a1885f192813239b511eb972a4962b30b76de7392c88c", "sourceSha256": "379c41e41d833880653ce065a63380e9cf29d2b7663f7ee91a3d77594202d042", - "status": "pending" + "status": "superseded", + "target": "plugins/dev/skills/upgrade", + "targetVersion": "0.1.0", + "reason": "前后端升级合并为按真实版本与官方迁移资料执行的统一能力", + "reviewedAt": "2026-08-26" }, "source-b:766516f82e8e9be3": { "sourcePathHash": "766516f82e8e9be32e1ff3f29123202b6bad85bf9a88e36f87f256446ea31eaf", "sourceSha256": "c66ca1651923b20cd62395ba2cc6b8532093d5df10f420c1673a103a88dbf5aa", - "status": "pending" + "status": "migrated", + "target": "plugins/doc/skills/message", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:31dec2fa162b06d3": { "sourcePathHash": "31dec2fa162b06d379aa676d426d2de01c3b082061ff15adb7a8c721cd5635af", @@ -429,17 +513,26 @@ "source-b:8a7cdf719d8f8a3e": { "sourcePathHash": "8a7cdf719d8f8a3e0200781a82062cc5a839e4d2c2fd400982771968245d62dd", "sourceSha256": "3461485ba35dceffc5fc0e9266793003a0355d412aa8a609c93709745226d00a", - "status": "pending" + "status": "migrated", + "target": "plugins/dev/skills/estimate", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:6e5eb2b9ab9273cf": { "sourcePathHash": "6e5eb2b9ab9273cf889bd908ff446eda59cc3e121ee7a1861fb2664d7fa049e9", "sourceSha256": "31eef261e6e3e930cd88b18c938176c3ef1d3e8d039986712ee6c3191481872d", - "status": "pending" + "status": "migrated", + "target": "plugins/doc/skills/report", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" }, "source-b:a985b2c0fb927117": { "sourcePathHash": "a985b2c0fb9271174d9d46425eb6792d2483ebcd6da89ecc1cbfb61407259499", "sourceSha256": "e2f92df8dc489e79bfdd74de8817abf742f425422765c76c4a46263d1fbd7a9e", - "status": "pending" + "status": "migrated", + "target": "plugins/doc/skills/requirements", + "targetVersion": "0.1.0", + "reviewedAt": "2026-08-26" } } } diff --git a/migration/tests/test_remaining_wave.py b/migration/tests/test_remaining_wave.py new file mode 100644 index 0000000..50f4e06 --- /dev/null +++ b/migration/tests/test_remaining_wave.py @@ -0,0 +1,87 @@ +"""剩余来源连续迁移波次验收测试。""" + +from pathlib import Path +import json +import unittest + + +ROOT = Path(__file__).resolve().parents[2] +DEV = ROOT / "plugins" / "dev" / "skills" +DOC = ROOT / "plugins" / "doc" / "skills" +GIT = ROOT / "plugins" / "git" / "skills" + +TARGETS = { + DEV: ( + "design-api", "design-db", "review-java", "review-frontend", + "design-frontend-data", "review-mybatis", "design-workflow", + "implement-backend", "implement-frontend", "review-code", + "test-backend", "test-ui", "analyze-bugs", "upgrade", "estimate", + ), + DOC: ("report", "message", "requirements"), + GIT: ("release",), +} + + +class RemainingWaveTest(unittest.TestCase): + """验证目标完整性、操作边界和来源状态闭合。""" + + def read_skill(self, root: Path, name: str) -> str: + return (root / name / "SKILL.md").read_text(encoding="utf-8") + + def test_all_targets_have_skill_and_ui_metadata(self) -> None: + names = [] + for root, targets in TARGETS.items(): + for name in targets: + names.append(name) + self.assertTrue((root / name / "SKILL.md").is_file(), name) + self.assertTrue((root / name / "agents" / "openai.yaml").is_file(), name) + self.assertEqual(19, len(names)) + self.assertEqual(len(names), len(set(names))) + + def test_implementation_preserves_workspace_and_authorization(self) -> None: + content = "\n".join( + self.read_skill(DEV, name) + for name in ("implement-backend", "implement-frontend") + ) + self.assertIn("保留用户已有改动", content) + self.assertIn("精确版本", content) + self.assertIn("不自动暂存", content) + self.assertIn("环境配置", content) + + def test_review_and_test_results_are_separated(self) -> None: + review = self.read_skill(DEV, "review-code") + backend = self.read_skill(DEV, "test-backend") + ui = self.read_skill(DEV, "test-ui") + self.assertIn("只读", review) + self.assertIn("不启动完整应用", backend) + self.assertIn("授权后", ui) + self.assertIn("不能替代浏览器结果", ui) + + def test_delivery_actions_are_independently_authorized(self) -> None: + upgrade = self.read_skill(DEV, "upgrade") + estimate = self.read_skill(DEV, "estimate") + release = self.read_skill(GIT, "release") + self.assertIn("源版本", upgrade) + self.assertIn("目标版本", upgrade) + self.assertIn("区间", estimate) + self.assertIn("假设", estimate) + self.assertIn("分阶段授权", release) + + def test_writing_skills_do_not_send_or_invent(self) -> None: + content = "\n".join(self.read_skill(DOC, name) for name in TARGETS[DOC]) + self.assertIn("不得虚构", content) + self.assertIn("默认只生成草稿", content) + + def test_source_lock_has_no_pending_items(self) -> None: + data = json.loads((ROOT / "migration" / "source-lock.json").read_text(encoding="utf-8")) + skills = data["skills"] + self.assertEqual(64, len(skills)) + self.assertNotIn("pending", {item["status"] for item in skills.values()}) + self.assertEqual( + {"migrated", "superseded", "excluded"}, + {item["status"] for item in skills.values()}, + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/plugins/dev/.codex-plugin/plugin.json b/plugins/dev/.codex-plugin/plugin.json index 718bd9c..b760d2f 100644 --- a/plugins/dev/.codex-plugin/plugin.json +++ b/plugins/dev/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "dev", - "version": "0.3.0", + "version": "0.4.0", "description": "通用软件设计、编码、审查与测试工作流。", "author": { "name": "CraftKit" @@ -9,7 +9,7 @@ "interface": { "displayName": "Dev", "shortDescription": "软件设计、编码、审查与测试工具", - "longDescription": "提供不绑定公司框架的组件选型、样式设计、表单设计及软件开发工作流。", + "longDescription": "提供不绑定公司框架的设计、实现、审查、测试、升级与估算工作流。", "developerName": "CraftKit", "category": "Productivity", "capabilities": ["Read", "Write"], diff --git a/plugins/doc/.codex-plugin/plugin.json b/plugins/doc/.codex-plugin/plugin.json index 7302a7e..981afd6 100644 --- a/plugins/doc/.codex-plugin/plugin.json +++ b/plugins/doc/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "doc", - "version": "0.2.0", + "version": "0.3.0", "description": "通用文档转换、表格提取、规则化归档与写作工具。", "author": { "name": "CraftKit" @@ -9,7 +9,7 @@ "interface": { "displayName": "Doc", "shortDescription": "文档转换、整理与写作工具", - "longDescription": "提供 Markdown、Word、Excel、规则化归档及结构化写作相关的通用工作流。", + "longDescription": "提供 Markdown、Word、Excel、规则化归档、报告、消息及需求整理工作流。", "developerName": "CraftKit", "category": "Productivity", "capabilities": ["Read", "Write"], diff --git a/plugins/git/.codex-plugin/plugin.json b/plugins/git/.codex-plugin/plugin.json index b78f3ec..6299abb 100644 --- a/plugins/git/.codex-plugin/plugin.json +++ b/plugins/git/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "git", - "version": "0.3.0", + "version": "0.4.0", "description": "安全、可复核的通用 Git 工作流。", "author": { "name": "CraftKit" @@ -9,7 +9,7 @@ "interface": { "displayName": "Git", "shortDescription": "安全、可复核的 Git 工具", - "longDescription": "提供分支创建、提交信息、身份配置、变更导出和隔离集成相关的安全 Git 工作流。", + "longDescription": "提供分支、提交信息、身份配置、变更导出、隔离集成和分阶段授权发布工作流。", "developerName": "CraftKit", "category": "Productivity", "capabilities": ["Read", "Write"],