ai-engineering-init 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/code-reviewer.md +139 -0
- package/.claude/agents/project-manager.md +159 -0
- package/.claude/audio/completed.wav +0 -0
- package/.claude/commands/add-todo.md +255 -0
- package/.claude/commands/check.md +210 -0
- package/.claude/commands/crud.md +454 -0
- package/.claude/commands/dev.md +503 -0
- package/.claude/commands/init-docs.md +681 -0
- package/.claude/commands/next.md +251 -0
- package/.claude/commands/progress.md +242 -0
- package/.claude/commands/start.md +199 -0
- package/.claude/commands/sync.md +307 -0
- package/.claude/commands/update-status.md +428 -0
- package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
- package/.claude/docs/README.md +167 -0
- package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
- package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
- package/.claude/docs//345/267/245/344/275/234/346/265/201/345/274/200/345/217/221/346/214/207/345/215/227.md +714 -0
- package/.claude/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +463 -0
- package/.claude/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +390 -0
- package/.claude/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213/350/247/204/350/214/203.md +688 -0
- package/.claude/docs//346/226/260/351/241/271/347/233/256/345/274/200/345/217/221/346/265/201/347/250/213.md +365 -0
- package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
- package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
- package/.claude/framework-config.json +73 -0
- package/.claude/hooks/pre-tool-use.js +117 -0
- package/.claude/hooks/skill-forced-eval.js +167 -0
- package/.claude/hooks/stop.js +58 -0
- package/.claude/settings.json +41 -0
- package/.claude/skills/add-skill/SKILL.md +352 -0
- package/.claude/skills/api-development/SKILL.md +560 -0
- package/.claude/skills/architecture-design/SKILL.md +756 -0
- package/.claude/skills/backend-annotations/SKILL.md +674 -0
- package/.claude/skills/banana-image/CHANGELOG.md +37 -0
- package/.claude/skills/banana-image/README.md +146 -0
- package/.claude/skills/banana-image/SKILL.md +164 -0
- package/.claude/skills/banana-image/assets/logo.png +0 -0
- package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
- package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
- package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.claude/skills/banana-image/scripts/package.json +18 -0
- package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
- package/.claude/skills/banana-image/templates/poster.json +22 -0
- package/.claude/skills/banana-image/templates/product.json +17 -0
- package/.claude/skills/banana-image/templates/social.json +22 -0
- package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
- package/.claude/skills/brainstorm/SKILL.md +648 -0
- package/.claude/skills/bug-detective/SKILL.md +1206 -0
- package/.claude/skills/code-patterns/SKILL.md +590 -0
- package/.claude/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.claude/skills/crud-development/SKILL.md +649 -0
- package/.claude/skills/data-permission/SKILL.md +599 -0
- package/.claude/skills/database-ops/SKILL.md +407 -0
- package/.claude/skills/error-handler/SKILL.md +371 -0
- package/.claude/skills/file-oss-management/SKILL.md +863 -0
- package/.claude/skills/git-workflow/SKILL.md +375 -0
- package/.claude/skills/json-serialization/SKILL.md +357 -0
- package/.claude/skills/leniu-api-development/SKILL.md +803 -0
- package/.claude/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.claude/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.claude/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.claude/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.claude/skills/leniu-data-permission/SKILL.md +256 -0
- package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
- package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
- package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.claude/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.claude/skills/leniu-java-entity/SKILL.md +751 -0
- package/.claude/skills/leniu-java-export/SKILL.md +560 -0
- package/.claude/skills/leniu-java-logging/SKILL.md +832 -0
- package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
- package/.claude/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.claude/skills/leniu-java-task/SKILL.md +367 -0
- package/.claude/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
- package/.claude/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.claude/skills/leniu-security-guard/SKILL.md +520 -0
- package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
- package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
- package/.claude/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.claude/skills/openspec-continue-change/SKILL.md +118 -0
- package/.claude/skills/openspec-explore/SKILL.md +290 -0
- package/.claude/skills/openspec-ff-change/SKILL.md +101 -0
- package/.claude/skills/openspec-new-change/SKILL.md +74 -0
- package/.claude/skills/openspec-onboard/SKILL.md +529 -0
- package/.claude/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.claude/skills/openspec-verify-change/SKILL.md +168 -0
- package/.claude/skills/performance-doctor/SKILL.md +627 -0
- package/.claude/skills/project-navigator/SKILL.md +305 -0
- package/.claude/skills/redis-cache/SKILL.md +839 -0
- package/.claude/skills/scheduled-jobs/SKILL.md +633 -0
- package/.claude/skills/security-guard/SKILL.md +748 -0
- package/.claude/skills/sms-mail/SKILL.md +766 -0
- package/.claude/skills/social-login/SKILL.md +668 -0
- package/.claude/skills/store-pc/SKILL.md +366 -0
- package/.claude/skills/task-tracker/SKILL.md +307 -0
- package/.claude/skills/tech-decision/SKILL.md +393 -0
- package/.claude/skills/tenant-management/SKILL.md +603 -0
- package/.claude/skills/test-development/SKILL.md +755 -0
- package/.claude/skills/ui-pc/SKILL.md +438 -0
- package/.claude/skills/utils-toolkit/SKILL.md +615 -0
- package/.claude/skills/websocket-sse/SKILL.md +716 -0
- package/.claude/skills/workflow-engine/SKILL.md +676 -0
- package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
- package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
- package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
- package/.codex/skills/add-skill/SKILL.md +352 -0
- package/.codex/skills/add-todo/SKILL.md +269 -0
- package/.codex/skills/api-development/SKILL.md +693 -0
- package/.codex/skills/architecture-design/SKILL.md +628 -0
- package/.codex/skills/backend-annotations/SKILL.md +664 -0
- package/.codex/skills/banana-image/CHANGELOG.md +37 -0
- package/.codex/skills/banana-image/README.md +146 -0
- package/.codex/skills/banana-image/SKILL.md +164 -0
- package/.codex/skills/banana-image/assets/logo.png +0 -0
- package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
- package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
- package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.codex/skills/banana-image/scripts/package.json +18 -0
- package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
- package/.codex/skills/banana-image/templates/poster.json +22 -0
- package/.codex/skills/banana-image/templates/product.json +17 -0
- package/.codex/skills/banana-image/templates/social.json +22 -0
- package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
- package/.codex/skills/brainstorm/SKILL.md +648 -0
- package/.codex/skills/bug-detective/SKILL.md +1206 -0
- package/.codex/skills/check/SKILL.md +367 -0
- package/.codex/skills/code-patterns/SKILL.md +442 -0
- package/.codex/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.codex/skills/crud/SKILL.md +265 -0
- package/.codex/skills/crud-development/SKILL.md +637 -0
- package/.codex/skills/data-permission/SKILL.md +591 -0
- package/.codex/skills/database-ops/SKILL.md +553 -0
- package/.codex/skills/dev/SKILL.md +187 -0
- package/.codex/skills/error-handler/SKILL.md +361 -0
- package/.codex/skills/file-oss-management/SKILL.md +863 -0
- package/.codex/skills/git-workflow/SKILL.md +375 -0
- package/.codex/skills/init-docs/SKILL.md +194 -0
- package/.codex/skills/json-serialization/SKILL.md +357 -0
- package/.codex/skills/leniu-api-development/SKILL.md +803 -0
- package/.codex/skills/leniu-architecture-design/SKILL.md +594 -0
- package/.codex/skills/leniu-backend-annotations/SKILL.md +662 -0
- package/.codex/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.codex/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.codex/skills/leniu-data-permission/SKILL.md +256 -0
- package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
- package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
- package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.codex/skills/leniu-java-entity/SKILL.md +751 -0
- package/.codex/skills/leniu-java-export/SKILL.md +560 -0
- package/.codex/skills/leniu-java-logging/SKILL.md +832 -0
- package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
- package/.codex/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.codex/skills/leniu-java-task/SKILL.md +367 -0
- package/.codex/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
- package/.codex/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.codex/skills/leniu-security-guard/SKILL.md +520 -0
- package/.codex/skills/leniu-utils-toolkit/SKILL.md +378 -0
- package/.codex/skills/next/SKILL.md +137 -0
- package/.codex/skills/openspec-apply-change/SKILL.md +156 -0
- package/.codex/skills/openspec-archive-change/SKILL.md +114 -0
- package/.codex/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.codex/skills/openspec-continue-change/SKILL.md +118 -0
- package/.codex/skills/openspec-explore/SKILL.md +290 -0
- package/.codex/skills/openspec-ff-change/SKILL.md +101 -0
- package/.codex/skills/openspec-new-change/SKILL.md +74 -0
- package/.codex/skills/openspec-onboard/SKILL.md +529 -0
- package/.codex/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.codex/skills/openspec-verify-change/SKILL.md +168 -0
- package/.codex/skills/performance-doctor/SKILL.md +627 -0
- package/.codex/skills/progress/SKILL.md +193 -0
- package/.codex/skills/project-navigator/SKILL.md +286 -0
- package/.codex/skills/redis-cache/SKILL.md +829 -0
- package/.codex/skills/scheduled-jobs/SKILL.md +633 -0
- package/.codex/skills/security-guard/SKILL.md +739 -0
- package/.codex/skills/sms-mail/SKILL.md +766 -0
- package/.codex/skills/social-login/SKILL.md +668 -0
- package/.codex/skills/start/SKILL.md +154 -0
- package/.codex/skills/store-pc/SKILL.md +491 -0
- package/.codex/skills/sync/SKILL.md +149 -0
- package/.codex/skills/task-tracker/SKILL.md +307 -0
- package/.codex/skills/tech-decision/SKILL.md +393 -0
- package/.codex/skills/tenant-management/SKILL.md +603 -0
- package/.codex/skills/test-development/SKILL.md +755 -0
- package/.codex/skills/ui-pc/SKILL.md +475 -0
- package/.codex/skills/update-status/SKILL.md +159 -0
- package/.codex/skills/utils-toolkit/SKILL.md +593 -0
- package/.codex/skills/websocket-sse/SKILL.md +716 -0
- package/.codex/skills/workflow-engine/SKILL.md +676 -0
- package/.cursor/agents/code-reviewer.md +139 -0
- package/.cursor/agents/project-manager.md +159 -0
- package/.cursor/commands/opsx-apply.md +152 -0
- package/.cursor/commands/opsx-archive.md +157 -0
- package/.cursor/commands/opsx-bulk-archive.md +242 -0
- package/.cursor/commands/opsx-continue.md +114 -0
- package/.cursor/commands/opsx-explore.md +174 -0
- package/.cursor/commands/opsx-ff.md +94 -0
- package/.cursor/commands/opsx-new.md +69 -0
- package/.cursor/commands/opsx-onboard.md +525 -0
- package/.cursor/commands/opsx-sync.md +134 -0
- package/.cursor/commands/opsx-verify.md +164 -0
- package/.cursor/mcp.json +22 -0
- package/.cursor/skills/add-skill/SKILL.md +352 -0
- package/.cursor/skills/api-development/SKILL.md +560 -0
- package/.cursor/skills/architecture-design/SKILL.md +756 -0
- package/.cursor/skills/backend-annotations/SKILL.md +674 -0
- package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
- package/.cursor/skills/banana-image/README.md +146 -0
- package/.cursor/skills/banana-image/SKILL.md +164 -0
- package/.cursor/skills/banana-image/assets/logo.png +0 -0
- package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
- package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
- package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.cursor/skills/banana-image/scripts/package.json +18 -0
- package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
- package/.cursor/skills/banana-image/templates/poster.json +22 -0
- package/.cursor/skills/banana-image/templates/product.json +17 -0
- package/.cursor/skills/banana-image/templates/social.json +22 -0
- package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
- package/.cursor/skills/brainstorm/SKILL.md +648 -0
- package/.cursor/skills/bug-detective/SKILL.md +1206 -0
- package/.cursor/skills/code-patterns/SKILL.md +590 -0
- package/.cursor/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.cursor/skills/crud-development/SKILL.md +649 -0
- package/.cursor/skills/data-permission/SKILL.md +599 -0
- package/.cursor/skills/database-ops/SKILL.md +407 -0
- package/.cursor/skills/error-handler/SKILL.md +371 -0
- package/.cursor/skills/file-oss-management/SKILL.md +863 -0
- package/.cursor/skills/git-workflow/SKILL.md +375 -0
- package/.cursor/skills/json-serialization/SKILL.md +357 -0
- package/.cursor/skills/leniu-api-development/SKILL.md +803 -0
- package/.cursor/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.cursor/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.cursor/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.cursor/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.cursor/skills/leniu-data-permission/SKILL.md +256 -0
- package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
- package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
- package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.cursor/skills/leniu-java-entity/SKILL.md +751 -0
- package/.cursor/skills/leniu-java-export/SKILL.md +560 -0
- package/.cursor/skills/leniu-java-logging/SKILL.md +832 -0
- package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
- package/.cursor/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
- package/.cursor/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
- package/.cursor/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.cursor/skills/leniu-security-guard/SKILL.md +520 -0
- package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.cursor/skills/openspec-apply-change/SKILL.md +156 -0
- package/.cursor/skills/openspec-archive-change/SKILL.md +114 -0
- package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.cursor/skills/openspec-continue-change/SKILL.md +118 -0
- package/.cursor/skills/openspec-explore/SKILL.md +290 -0
- package/.cursor/skills/openspec-ff-change/SKILL.md +101 -0
- package/.cursor/skills/openspec-new-change/SKILL.md +74 -0
- package/.cursor/skills/openspec-onboard/SKILL.md +529 -0
- package/.cursor/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.cursor/skills/openspec-verify-change/SKILL.md +168 -0
- package/.cursor/skills/performance-doctor/SKILL.md +627 -0
- package/.cursor/skills/project-navigator/SKILL.md +305 -0
- package/.cursor/skills/redis-cache/SKILL.md +839 -0
- package/.cursor/skills/scheduled-jobs/SKILL.md +633 -0
- package/.cursor/skills/security-guard/SKILL.md +748 -0
- package/.cursor/skills/sms-mail/SKILL.md +766 -0
- package/.cursor/skills/social-login/SKILL.md +668 -0
- package/.cursor/skills/store-pc/SKILL.md +366 -0
- package/.cursor/skills/task-tracker/SKILL.md +307 -0
- package/.cursor/skills/tech-decision/SKILL.md +393 -0
- package/.cursor/skills/tenant-management/SKILL.md +603 -0
- package/.cursor/skills/test-development/SKILL.md +755 -0
- package/.cursor/skills/ui-pc/SKILL.md +438 -0
- package/.cursor/skills/utils-toolkit/SKILL.md +615 -0
- package/.cursor/skills/websocket-sse/SKILL.md +716 -0
- package/.cursor/skills/workflow-engine/SKILL.md +676 -0
- package/AGENTS.md +669 -0
- package/CLAUDE.md +205 -0
- package/README.md +205 -0
- package/bin/index.js +179 -0
- package/init.sh +178 -0
- package/package.json +27 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: collaborating-with-codex
|
|
3
|
+
description: |
|
|
4
|
+
与 OpenAI Codex CLI 协同开发。将编码任务委托给 Codex 进行原型开发、调试分析和代码审查。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 需要算法实现或复杂逻辑分析
|
|
8
|
+
- 需要代码审查和 Bug 分析
|
|
9
|
+
- 需要生成 Unified Diff 补丁
|
|
10
|
+
- 用户明确要求使用 Codex 协作
|
|
11
|
+
- 复杂后端逻辑的原型设计
|
|
12
|
+
|
|
13
|
+
触发词:Codex、协作、多模型、原型、Diff、算法分析、代码审查、codex协同
|
|
14
|
+
|
|
15
|
+
前置要求:
|
|
16
|
+
- 已安装 Codex CLI (npm install -g @openai/codex)
|
|
17
|
+
- 已配置 OpenAI API Key
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# 与 Codex CLI 协同开发
|
|
21
|
+
|
|
22
|
+
> 通过 Python 桥接脚本调用 Codex CLI,获取算法实现和代码审查建议。
|
|
23
|
+
|
|
24
|
+
## 快速开始
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 相对路径(推荐,在项目根目录执行)
|
|
28
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py --cd . --PROMPT "Your task"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**输出**: JSON 格式,包含 `success`、`SESSION_ID`、`agent_messages` 和可选的 `error`。
|
|
32
|
+
|
|
33
|
+
## 参数说明
|
|
34
|
+
|
|
35
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
36
|
+
|------|------|------|--------|------|
|
|
37
|
+
| `--PROMPT` | str | ✅ | - | 发送给 Codex 的任务指令(使用英语) |
|
|
38
|
+
| `--cd` | Path | ✅ | - | 工作目录根路径 |
|
|
39
|
+
| `--sandbox` | Literal | ❌ | `read-only` | 沙箱策略:`read-only`/`workspace-write`/`danger-full-access` |
|
|
40
|
+
| `--SESSION_ID` | UUID | ❌ | `None` | 会话 ID(继续之前的对话) |
|
|
41
|
+
| `--skip-git-repo-check` | bool | ❌ | `True` | 允许在非 Git 仓库运行 |
|
|
42
|
+
| `--return-all-messages` | bool | ❌ | `False` | 返回完整推理信息 |
|
|
43
|
+
| `--image` | List[Path] | ❌ | `None` | 附加图片文件到提示词 |
|
|
44
|
+
| `--model` | str | ❌ | `None` | 指定模型(仅用户明确要求时使用) |
|
|
45
|
+
| `--yolo` | bool | ❌ | `False` | 跳过所有审批与沙箱限制(危险) |
|
|
46
|
+
|
|
47
|
+
## 使用模式
|
|
48
|
+
|
|
49
|
+
### 1. 基础调用(只读模式)
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py \
|
|
53
|
+
--cd . \
|
|
54
|
+
--PROMPT "Analyze the authentication flow in the login module"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 2. 多轮会话
|
|
58
|
+
|
|
59
|
+
**始终保存 SESSION_ID** 用于后续对话:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 第一轮:分析代码
|
|
63
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py \
|
|
64
|
+
--cd "/project" \
|
|
65
|
+
--PROMPT "Analyze the AdServiceImpl class"
|
|
66
|
+
|
|
67
|
+
# 后续轮次:使用 SESSION_ID 继续
|
|
68
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py \
|
|
69
|
+
--cd "/project" \
|
|
70
|
+
--SESSION_ID "uuid-from-previous-response" \
|
|
71
|
+
--PROMPT "Now write unit tests for the add method"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3. 获取 Unified Diff 补丁
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py \
|
|
78
|
+
--cd "/project" \
|
|
79
|
+
--PROMPT "Generate a unified diff to add logging to AdServiceImpl. OUTPUT: Unified Diff Patch ONLY."
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 4. 调试模式(返回完整信息)
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py \
|
|
86
|
+
--cd "/project" \
|
|
87
|
+
--PROMPT "Debug this error: NullPointerException in line 42" \
|
|
88
|
+
--return-all-messages
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 返回值结构
|
|
92
|
+
|
|
93
|
+
**成功时:**
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"success": true,
|
|
97
|
+
"SESSION_ID": "550e8400-e29b-41d4-a716-446655440000",
|
|
98
|
+
"agent_messages": "模型回复内容..."
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**失败时:**
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"success": false,
|
|
106
|
+
"error": "错误信息描述"
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 协作工作流
|
|
111
|
+
|
|
112
|
+
### 推荐场景
|
|
113
|
+
|
|
114
|
+
| 场景 | 说明 |
|
|
115
|
+
|------|------|
|
|
116
|
+
| **后端逻辑分析** | Codex 擅长复杂算法和后端逻辑 |
|
|
117
|
+
| **代码审查** | 获取代码质量和潜在问题的反馈 |
|
|
118
|
+
| **Debug 分析** | 利用其强大的调试能力定位问题 |
|
|
119
|
+
| **原型设计** | 快速获取实现思路(返回 Diff 而非直接修改) |
|
|
120
|
+
|
|
121
|
+
### 重要约束
|
|
122
|
+
|
|
123
|
+
1. **只读模式**: 始终使用 `--sandbox read-only`,禁止 Codex 直接修改文件
|
|
124
|
+
2. **英语交互**: 与 Codex 交互时使用英语,获得更好效果
|
|
125
|
+
3. **中文输出强制**: Codex 倾向于输出英文,必须在每次 PROMPT 末尾追加以下约束:
|
|
126
|
+
```
|
|
127
|
+
IMPORTANT LANGUAGE RULES:
|
|
128
|
+
- All SQL COMMENT values MUST be in Chinese (e.g., COMMENT '用户名' NOT COMMENT 'username')
|
|
129
|
+
- All Java/code comments (Javadoc, inline //, block /* */) MUST be in Chinese
|
|
130
|
+
- All field descriptions, table descriptions MUST be in Chinese
|
|
131
|
+
- Variable names and class names remain in English (camelCase/PascalCase)
|
|
132
|
+
```
|
|
133
|
+
4. **Diff 输出**: 在 PROMPT 中明确要求 `OUTPUT: Unified Diff Patch ONLY`
|
|
134
|
+
5. **重构代码**: 将 Codex 的输出视为"脏原型",由 Claude 重构为生产代码(**特别检查注释和 COMMENT 是否为中文,不是则修正**)
|
|
135
|
+
6. **后台运行**: 对于长时间任务,使用 `Run in the background`
|
|
136
|
+
|
|
137
|
+
## 与本项目的集成
|
|
138
|
+
|
|
139
|
+
### 典型用例:后端模块分析
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# 分析 Service 层实现
|
|
143
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py \
|
|
144
|
+
--cd . \
|
|
145
|
+
--PROMPT "Analyze the three-layer architecture (Controller -> Service -> Mapper) in ruoyi-modules/ruoyi-system. Focus on how buildQueryWrapper is implemented in Service layer."
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 典型用例:代码审查
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# 审查新增的业务模块
|
|
152
|
+
python .claude/skills/collaborating-with-codex/scripts/codex_bridge.py \
|
|
153
|
+
--cd "/project" \
|
|
154
|
+
--PROMPT "Review the XxxServiceImpl.java for potential bugs, security issues, and adherence to the project's three-layer architecture pattern (Controller -> Service -> Mapper, NO DAO layer). OUTPUT: Review comments with specific line numbers."
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 安装前置
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# 安装 Codex CLI
|
|
161
|
+
npm install -g @openai/codex
|
|
162
|
+
|
|
163
|
+
# 配置 API Key(可选,如果未设置环境变量)
|
|
164
|
+
codex auth login
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## 故障排除
|
|
168
|
+
|
|
169
|
+
| 问题 | 解决方案 |
|
|
170
|
+
|------|---------|
|
|
171
|
+
| `codex: command not found` | 确保已安装并添加到 PATH |
|
|
172
|
+
| `SESSION_ID` 获取失败 | 检查网络连接和 API Key |
|
|
173
|
+
| 输出被截断 | 使用 `--return-all-messages` 获取完整信息 |
|
|
174
|
+
| Windows 路径问题 | 使用正斜杠 `/` 或双反斜杠 `\\` |
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Codex Bridge Script for Claude Agent Skills.
|
|
3
|
+
Wraps the Codex CLI to provide a JSON-based interface for Claude.
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
import queue
|
|
12
|
+
import subprocess
|
|
13
|
+
import threading
|
|
14
|
+
import time
|
|
15
|
+
import shutil
|
|
16
|
+
import argparse
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Generator, List, Optional
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _get_windows_npm_paths() -> List[Path]:
|
|
22
|
+
"""Return candidate directories for npm global installs on Windows."""
|
|
23
|
+
if os.name != "nt":
|
|
24
|
+
return []
|
|
25
|
+
paths: List[Path] = []
|
|
26
|
+
env = os.environ
|
|
27
|
+
if prefix := env.get("NPM_CONFIG_PREFIX") or env.get("npm_config_prefix"):
|
|
28
|
+
paths.append(Path(prefix))
|
|
29
|
+
if appdata := env.get("APPDATA"):
|
|
30
|
+
paths.append(Path(appdata) / "npm")
|
|
31
|
+
if localappdata := env.get("LOCALAPPDATA"):
|
|
32
|
+
paths.append(Path(localappdata) / "npm")
|
|
33
|
+
if programfiles := env.get("ProgramFiles"):
|
|
34
|
+
paths.append(Path(programfiles) / "nodejs")
|
|
35
|
+
return paths
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _augment_path_env(env: dict) -> None:
|
|
39
|
+
"""Prepend npm global directories to PATH if missing."""
|
|
40
|
+
if os.name != "nt":
|
|
41
|
+
return
|
|
42
|
+
path_key = next((k for k in env if k.upper() == "PATH"), "PATH")
|
|
43
|
+
path_entries = [p for p in env.get(path_key, "").split(os.pathsep) if p]
|
|
44
|
+
lower_set = {p.lower() for p in path_entries}
|
|
45
|
+
for candidate in _get_windows_npm_paths():
|
|
46
|
+
if candidate.is_dir() and str(candidate).lower() not in lower_set:
|
|
47
|
+
path_entries.insert(0, str(candidate))
|
|
48
|
+
lower_set.add(str(candidate).lower())
|
|
49
|
+
env[path_key] = os.pathsep.join(path_entries)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _resolve_executable(name: str, env: dict) -> str:
|
|
53
|
+
"""Resolve executable path, checking npm directories for .cmd/.bat on Windows."""
|
|
54
|
+
if os.path.isabs(name) or os.sep in name or (os.altsep and os.altsep in name):
|
|
55
|
+
return name
|
|
56
|
+
path_key = next((k for k in env if k.upper() == "PATH"), "PATH")
|
|
57
|
+
if resolved := shutil.which(name, path=env.get(path_key)):
|
|
58
|
+
return resolved
|
|
59
|
+
if os.name == "nt":
|
|
60
|
+
for base in _get_windows_npm_paths():
|
|
61
|
+
for ext in (".cmd", ".bat", ".exe"):
|
|
62
|
+
candidate = base / f"{name}{ext}"
|
|
63
|
+
if candidate.is_file():
|
|
64
|
+
return str(candidate)
|
|
65
|
+
return name
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def run_shell_command(cmd: List[str], stdin_data: Optional[str] = None) -> Generator[str, None, None]:
|
|
69
|
+
"""Execute a command and stream its output line-by-line.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
cmd: Command and arguments as a list
|
|
73
|
+
stdin_data: Optional string to pass to the process via stdin
|
|
74
|
+
"""
|
|
75
|
+
env = os.environ.copy()
|
|
76
|
+
_augment_path_env(env)
|
|
77
|
+
|
|
78
|
+
popen_cmd = cmd.copy()
|
|
79
|
+
exe_path = _resolve_executable(cmd[0], env)
|
|
80
|
+
popen_cmd[0] = exe_path
|
|
81
|
+
|
|
82
|
+
process = subprocess.Popen(
|
|
83
|
+
popen_cmd,
|
|
84
|
+
shell=False,
|
|
85
|
+
stdin=subprocess.PIPE if stdin_data else subprocess.DEVNULL,
|
|
86
|
+
stdout=subprocess.PIPE,
|
|
87
|
+
stderr=subprocess.STDOUT,
|
|
88
|
+
universal_newlines=True,
|
|
89
|
+
encoding='utf-8',
|
|
90
|
+
errors='replace',
|
|
91
|
+
env=env,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Write stdin data if provided, then close stdin
|
|
95
|
+
if stdin_data and process.stdin:
|
|
96
|
+
try:
|
|
97
|
+
process.stdin.write(stdin_data)
|
|
98
|
+
process.stdin.close()
|
|
99
|
+
except (BrokenPipeError, OSError):
|
|
100
|
+
pass
|
|
101
|
+
|
|
102
|
+
output_queue: queue.Queue[Optional[str]] = queue.Queue()
|
|
103
|
+
GRACEFUL_SHUTDOWN_DELAY = 0.3
|
|
104
|
+
|
|
105
|
+
def is_turn_completed(line: str) -> bool:
|
|
106
|
+
try:
|
|
107
|
+
data = json.loads(line)
|
|
108
|
+
return data.get("type") == "turn.completed"
|
|
109
|
+
except (json.JSONDecodeError, AttributeError, TypeError):
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
def read_output() -> None:
|
|
113
|
+
if process.stdout:
|
|
114
|
+
for line in iter(process.stdout.readline, ""):
|
|
115
|
+
stripped = line.strip()
|
|
116
|
+
output_queue.put(stripped)
|
|
117
|
+
if is_turn_completed(stripped):
|
|
118
|
+
time.sleep(GRACEFUL_SHUTDOWN_DELAY)
|
|
119
|
+
process.terminate()
|
|
120
|
+
break
|
|
121
|
+
process.stdout.close()
|
|
122
|
+
output_queue.put(None)
|
|
123
|
+
|
|
124
|
+
thread = threading.Thread(target=read_output)
|
|
125
|
+
thread.start()
|
|
126
|
+
|
|
127
|
+
while True:
|
|
128
|
+
try:
|
|
129
|
+
line = output_queue.get(timeout=0.5)
|
|
130
|
+
if line is None:
|
|
131
|
+
break
|
|
132
|
+
yield line
|
|
133
|
+
except queue.Empty:
|
|
134
|
+
if process.poll() is not None and not thread.is_alive():
|
|
135
|
+
break
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
process.wait(timeout=5)
|
|
139
|
+
except subprocess.TimeoutExpired:
|
|
140
|
+
process.kill()
|
|
141
|
+
process.wait()
|
|
142
|
+
thread.join(timeout=5)
|
|
143
|
+
|
|
144
|
+
while not output_queue.empty():
|
|
145
|
+
try:
|
|
146
|
+
line = output_queue.get_nowait()
|
|
147
|
+
if line is not None:
|
|
148
|
+
yield line
|
|
149
|
+
except queue.Empty:
|
|
150
|
+
break
|
|
151
|
+
|
|
152
|
+
def windows_escape(prompt):
|
|
153
|
+
"""Windows style string escaping for newlines and special chars in prompt text."""
|
|
154
|
+
result = prompt.replace('\n', '\\n')
|
|
155
|
+
result = result.replace('\r', '\\r')
|
|
156
|
+
result = result.replace('\t', '\\t')
|
|
157
|
+
return result
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def configure_windows_stdio() -> None:
|
|
161
|
+
"""Configure stdout/stderr to use UTF-8 encoding on Windows."""
|
|
162
|
+
if os.name != "nt":
|
|
163
|
+
return
|
|
164
|
+
for stream in (sys.stdout, sys.stderr):
|
|
165
|
+
reconfigure = getattr(stream, "reconfigure", None)
|
|
166
|
+
if callable(reconfigure):
|
|
167
|
+
try:
|
|
168
|
+
reconfigure(encoding="utf-8")
|
|
169
|
+
except (ValueError, OSError):
|
|
170
|
+
pass
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def main():
|
|
174
|
+
configure_windows_stdio()
|
|
175
|
+
parser = argparse.ArgumentParser(description="Codex Bridge")
|
|
176
|
+
parser.add_argument("--PROMPT", required=True, help="Instruction for the task to send to codex.")
|
|
177
|
+
parser.add_argument("--cd", required=True, help="Set the workspace root for codex before executing the task.")
|
|
178
|
+
parser.add_argument("--sandbox", default="read-only", choices=["read-only", "workspace-write", "danger-full-access"], help="Sandbox policy for model-generated commands. Defaults to `read-only`.")
|
|
179
|
+
parser.add_argument("--SESSION_ID", default="", help="Resume the specified session of the codex. Defaults to `None`, start a new session.")
|
|
180
|
+
parser.add_argument("--skip-git-repo-check", action="store_true", default=True, help="Allow codex running outside a Git repository (useful for one-off directories).")
|
|
181
|
+
parser.add_argument("--return-all-messages", action="store_true", help="Return all messages (e.g. reasoning, tool calls, etc.) from the codex session. Set to `False` by default, only the agent's final reply message is returned.")
|
|
182
|
+
parser.add_argument("--image", action="append", default=[], help="Attach one or more image files to the initial prompt. Separate multiple paths with commas or repeat the flag.")
|
|
183
|
+
parser.add_argument("--model", default="", help="The model to use for the codex session. This parameter is strictly prohibited unless explicitly specified by the user.")
|
|
184
|
+
parser.add_argument("--yolo", action="store_true", help="Run every command without approvals or sandboxing. Only use when `sandbox` couldn't be applied.")
|
|
185
|
+
parser.add_argument("--profile", default="", help="Configuration profile name to load from `~/.codex/config.toml`. This parameter is strictly prohibited unless explicitly specified by the user.")
|
|
186
|
+
|
|
187
|
+
args = parser.parse_args()
|
|
188
|
+
|
|
189
|
+
cmd = ["codex", "exec", "--sandbox", args.sandbox, "--cd", args.cd, "--json"]
|
|
190
|
+
|
|
191
|
+
if args.image:
|
|
192
|
+
cmd.extend(["--image", ",".join(args.image)])
|
|
193
|
+
|
|
194
|
+
if args.model:
|
|
195
|
+
cmd.extend(["--model", args.model])
|
|
196
|
+
|
|
197
|
+
if args.profile:
|
|
198
|
+
cmd.extend(["--profile", args.profile])
|
|
199
|
+
|
|
200
|
+
if args.yolo:
|
|
201
|
+
cmd.append("--yolo")
|
|
202
|
+
|
|
203
|
+
if args.skip_git_repo_check:
|
|
204
|
+
cmd.append("--skip-git-repo-check")
|
|
205
|
+
|
|
206
|
+
if args.SESSION_ID:
|
|
207
|
+
cmd.extend(["resume", args.SESSION_ID])
|
|
208
|
+
|
|
209
|
+
PROMPT = args.PROMPT
|
|
210
|
+
|
|
211
|
+
# Use stdin to pass PROMPT (use '-' as placeholder) to avoid shell argument parsing issues
|
|
212
|
+
cmd.append('-')
|
|
213
|
+
|
|
214
|
+
# Execution Logic
|
|
215
|
+
all_messages = []
|
|
216
|
+
agent_messages = ""
|
|
217
|
+
success = True
|
|
218
|
+
err_message = ""
|
|
219
|
+
thread_id = None
|
|
220
|
+
|
|
221
|
+
for line in run_shell_command(cmd, stdin_data=PROMPT):
|
|
222
|
+
try:
|
|
223
|
+
line_dict = json.loads(line.strip())
|
|
224
|
+
all_messages.append(line_dict)
|
|
225
|
+
item = line_dict.get("item", {})
|
|
226
|
+
item_type = item.get("type", "")
|
|
227
|
+
if item_type == "agent_message":
|
|
228
|
+
agent_messages = agent_messages + item.get("text", "")
|
|
229
|
+
if line_dict.get("thread_id") is not None:
|
|
230
|
+
thread_id = line_dict.get("thread_id")
|
|
231
|
+
if "fail" in line_dict.get("type", ""):
|
|
232
|
+
success = False if len(agent_messages) == 0 else success
|
|
233
|
+
err_message += "\n\n[codex error] " + line_dict.get("error", {}).get("message", "")
|
|
234
|
+
if "error" in line_dict.get("type", ""):
|
|
235
|
+
error_msg = line_dict.get("message", "")
|
|
236
|
+
is_reconnecting = bool(re.match(r'^Reconnecting\.\.\.\s+\d+/\d+$', error_msg))
|
|
237
|
+
|
|
238
|
+
if not is_reconnecting:
|
|
239
|
+
success = False if len(agent_messages) == 0 else success
|
|
240
|
+
err_message += "\n\n[codex error] " + error_msg
|
|
241
|
+
|
|
242
|
+
except json.JSONDecodeError:
|
|
243
|
+
err_message += "\n\n[json decode error] " + line
|
|
244
|
+
continue
|
|
245
|
+
|
|
246
|
+
except Exception as error:
|
|
247
|
+
err_message += "\n\n[unexpected error] " + f"Unexpected error: {error}. Line: {line!r}"
|
|
248
|
+
success = False
|
|
249
|
+
break
|
|
250
|
+
|
|
251
|
+
if thread_id is None:
|
|
252
|
+
success = False
|
|
253
|
+
err_message = "Failed to get `SESSION_ID` from the codex session. \n\n" + err_message
|
|
254
|
+
|
|
255
|
+
if len(agent_messages) == 0:
|
|
256
|
+
success = False
|
|
257
|
+
err_message = "Failed to get `agent_messages` from the codex session. \n\n You can try to set `return_all_messages` to `True` to get the full reasoning information. " + err_message
|
|
258
|
+
|
|
259
|
+
if success:
|
|
260
|
+
result = {
|
|
261
|
+
"success": True,
|
|
262
|
+
"SESSION_ID": thread_id,
|
|
263
|
+
"agent_messages": agent_messages,
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
else:
|
|
267
|
+
result = {"success": False, "error": err_message}
|
|
268
|
+
|
|
269
|
+
if args.return_all_messages:
|
|
270
|
+
result["all_messages"] = all_messages
|
|
271
|
+
|
|
272
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
273
|
+
|
|
274
|
+
if __name__ == "__main__":
|
|
275
|
+
main()
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: collaborating-with-gemini
|
|
3
|
+
description: |
|
|
4
|
+
与 Google Gemini CLI 协同开发。将编码任务委托给 Gemini 进行前端原型、UI设计和代码审查。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 需要前端/UI/样式原型设计
|
|
8
|
+
- 需要 CSS/React/Vue 组件设计
|
|
9
|
+
- 需要代码审查和 Bug 分析
|
|
10
|
+
- 用户明确要求使用 Gemini 协作
|
|
11
|
+
- 复杂前端逻辑的原型设计
|
|
12
|
+
|
|
13
|
+
触发词:Gemini、协作、多模型、前端原型、UI设计、CSS、样式、gemini协同
|
|
14
|
+
|
|
15
|
+
前置要求:
|
|
16
|
+
- 已安装 Gemini CLI (npm install -g @google/gemini-cli)
|
|
17
|
+
- 已配置 Google API Key
|
|
18
|
+
|
|
19
|
+
注意:Gemini 对后端逻辑理解有缺陷,后端任务优先使用 Codex。
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# 与 Gemini CLI 协同开发
|
|
23
|
+
|
|
24
|
+
> 通过 Python 桥接脚本调用 Gemini CLI,获取前端原型和 UI 设计建议。
|
|
25
|
+
|
|
26
|
+
## 快速开始
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 相对路径(推荐,在项目根目录执行)
|
|
30
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py --cd . --PROMPT "Your task"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**输出**: JSON 格式,包含 `success`、`SESSION_ID`、`agent_messages` 和可选的 `error`。
|
|
34
|
+
|
|
35
|
+
## 参数说明
|
|
36
|
+
|
|
37
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
38
|
+
|------|------|------|--------|------|
|
|
39
|
+
| `--PROMPT` | str | ✅ | - | 发送给 Gemini 的任务指令(使用英语) |
|
|
40
|
+
| `--cd` | Path | ✅ | - | 工作目录根路径 |
|
|
41
|
+
| `--sandbox` | bool | ❌ | `False` | 是否启用沙箱模式 |
|
|
42
|
+
| `--SESSION_ID` | str | ❌ | `""` | 会话 ID(继续之前的对话) |
|
|
43
|
+
| `--return-all-messages` | bool | ❌ | `False` | 返回完整推理信息 |
|
|
44
|
+
| `--model` | str | ❌ | `None` | 指定模型(仅用户明确要求时使用) |
|
|
45
|
+
|
|
46
|
+
## 使用模式
|
|
47
|
+
|
|
48
|
+
### 1. 基础调用
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
52
|
+
--cd . \
|
|
53
|
+
--PROMPT "Design a responsive card component for product display"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 2. 多轮会话
|
|
57
|
+
|
|
58
|
+
**始终保存 SESSION_ID** 用于后续对话:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# 第一轮:设计 UI
|
|
62
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
63
|
+
--cd "/project" \
|
|
64
|
+
--PROMPT "Design a mobile-first login page with form validation"
|
|
65
|
+
|
|
66
|
+
# 后续轮次:使用 SESSION_ID 继续
|
|
67
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
68
|
+
--cd "/project" \
|
|
69
|
+
--SESSION_ID "uuid-from-previous-response" \
|
|
70
|
+
--PROMPT "Add dark mode support to the login page design"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3. 获取 Unified Diff 补丁
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
77
|
+
--cd "/project" \
|
|
78
|
+
--PROMPT "Generate a unified diff to improve the CSS layout of Home.vue. OUTPUT: Unified Diff Patch ONLY."
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 4. 调试模式(返回完整信息)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
85
|
+
--cd "/project" \
|
|
86
|
+
--PROMPT "Debug this styling issue: elements overflow on mobile" \
|
|
87
|
+
--return-all-messages
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 返回值结构
|
|
91
|
+
|
|
92
|
+
**成功时:**
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"success": true,
|
|
96
|
+
"SESSION_ID": "550e8400-e29b-41d4-a716-446655440000",
|
|
97
|
+
"agent_messages": "模型回复内容..."
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**失败时:**
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"success": false,
|
|
105
|
+
"error": "错误信息描述"
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 协作工作流
|
|
110
|
+
|
|
111
|
+
### 推荐场景
|
|
112
|
+
|
|
113
|
+
| 场景 | 说明 |
|
|
114
|
+
|------|------|
|
|
115
|
+
| **前端/UI/UX** | Gemini 擅长 CSS、样式和视觉设计 |
|
|
116
|
+
| **组件设计** | React/Vue 组件的原型设计 |
|
|
117
|
+
| **响应式布局** | 移动端适配和布局优化 |
|
|
118
|
+
| **样式审查** | CSS 代码质量和最佳实践 |
|
|
119
|
+
|
|
120
|
+
### 重要约束
|
|
121
|
+
|
|
122
|
+
1. **上下文限制**: Gemini 上下文 < 32k tokens,避免过长输入
|
|
123
|
+
2. **英语交互**: 与 Gemini 交互时使用英语,获得更好效果
|
|
124
|
+
3. **中文输出强制**: Gemini 倾向于输出英文,必须在每次 PROMPT 末尾追加以下约束:
|
|
125
|
+
```
|
|
126
|
+
IMPORTANT LANGUAGE RULES:
|
|
127
|
+
- All SQL COMMENT values MUST be in Chinese (e.g., COMMENT '用户名' NOT COMMENT 'username')
|
|
128
|
+
- All Java/code comments (Javadoc, inline //, block /* */) MUST be in Chinese
|
|
129
|
+
- All field descriptions, table descriptions MUST be in Chinese
|
|
130
|
+
- Variable names and class names remain in English (camelCase/PascalCase)
|
|
131
|
+
```
|
|
132
|
+
4. **Diff 输出**: 在 PROMPT 中明确要求 `OUTPUT: Unified Diff Patch ONLY`
|
|
133
|
+
5. **后端逻辑**: Gemini 对后端逻辑理解有缺陷,后端任务优先使用 Codex
|
|
134
|
+
6. **重构代码**: 将 Gemini 的输出视为"脏原型",由 Claude 重构为生产代码(**特别检查注释和 COMMENT 是否为中文,不是则修正**)
|
|
135
|
+
7. **后台运行**: 对于长时间任务,使用 `Run in the background`
|
|
136
|
+
|
|
137
|
+
## 与本项目的集成
|
|
138
|
+
|
|
139
|
+
### 典型用例:后端代码审查
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# 审查后端 Controller 代码
|
|
143
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
144
|
+
--cd . \
|
|
145
|
+
--PROMPT "Review the RESTful API design in ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/. Focus on path conventions (/list, /{id}) and proper use of @SaCheckPermission."
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 典型用例:Service 层代码审查
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# 审查 Service 实现
|
|
152
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
153
|
+
--cd "/project" \
|
|
154
|
+
--PROMPT "Review the XxxServiceImpl.java for buildQueryWrapper implementation, MapstructUtils usage, and adherence to three-layer architecture (no DAO layer). OUTPUT: Review comments."
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 典型用例:Entity 设计审查
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# 审查 Entity 设计
|
|
161
|
+
python .claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py \
|
|
162
|
+
--cd "/project" \
|
|
163
|
+
--PROMPT "Review the Entity classes in ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ for proper TenantEntity inheritance, @TableLogic usage, and field naming conventions."
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## 安装前置
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# 安装 Gemini CLI
|
|
170
|
+
npm install -g @google/gemini-cli
|
|
171
|
+
|
|
172
|
+
# 配置 API Key
|
|
173
|
+
gemini auth login
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## 故障排除
|
|
177
|
+
|
|
178
|
+
| 问题 | 解决方案 |
|
|
179
|
+
|------|---------|
|
|
180
|
+
| `gemini: command not found` | 确保已安装并添加到 PATH |
|
|
181
|
+
| `SESSION_ID` 获取失败 | 检查网络连接和 API Key |
|
|
182
|
+
| 输出被截断 | 使用 `--return-all-messages` 获取完整信息 |
|
|
183
|
+
| 上下文过长 | 减少输入内容,分批处理 |
|
|
184
|
+
| Windows 路径问题 | 使用正斜杠 `/` 或双反斜杠 `\\` |
|
|
185
|
+
|
|
186
|
+
## Gemini vs Codex 选择指南
|
|
187
|
+
|
|
188
|
+
| 任务类型 | 推荐模型 | 原因 |
|
|
189
|
+
|---------|---------|------|
|
|
190
|
+
| 前端 UI/CSS | Gemini | 视觉设计能力强 |
|
|
191
|
+
| 后端逻辑 | Codex | 算法和逻辑分析强 |
|
|
192
|
+
| 组件样式 | Gemini | CSS 和布局专长 |
|
|
193
|
+
| API 设计 | Codex | 接口设计和架构 |
|
|
194
|
+
| 代码审查 | 两者皆可 | 双模型交叉验证更好 |
|