Claude Code + Codex + Gemini 多模型协作工作流系统 ## 核心功能 - 6阶段开发工作流 (/ccg:dev) - 智能路由:前端→Gemini,后端→Codex - Prompt 增强 (Auggie MCP prompt-enhancer) - 双模型代码审查和技术分析 ## 命令列表 - /ccg:dev - 完整开发工作流 - /ccg:frontend - 前端任务 - /ccg:backend - 后端任务 - /ccg:review - 代码审查 - /ccg:analyze - 技术分析 - /ccg:enhance - Prompt 增强 - /ccg:commit - 智能提交 - /ccg:rollback - 交互式回滚 - /ccg:clean-branches - 清理分支 - /ccg:worktree - Worktree 管理 - /ccg:init - 项目初始化 ## 特性 - 预编译二进制(无需 Go 环境) - 专家系统提示词(Codex/Gemini) - 一键安装脚本
67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// geminiNoisePatterns contains stderr patterns to filter for gemini backend
|
|
var geminiNoisePatterns = []string{
|
|
"[STARTUP]",
|
|
"Session cleanup disabled",
|
|
"Warning:",
|
|
"(node:",
|
|
"(Use `node --trace-warnings",
|
|
"Loaded cached credentials",
|
|
"Loading extension:",
|
|
"YOLO mode is enabled",
|
|
}
|
|
|
|
// filteringWriter wraps an io.Writer and filters out lines matching patterns
|
|
type filteringWriter struct {
|
|
w io.Writer
|
|
patterns []string
|
|
buf bytes.Buffer
|
|
}
|
|
|
|
func newFilteringWriter(w io.Writer, patterns []string) *filteringWriter {
|
|
return &filteringWriter{w: w, patterns: patterns}
|
|
}
|
|
|
|
func (f *filteringWriter) Write(p []byte) (n int, err error) {
|
|
f.buf.Write(p)
|
|
for {
|
|
line, err := f.buf.ReadString('\n')
|
|
if err != nil {
|
|
// incomplete line, put it back
|
|
f.buf.WriteString(line)
|
|
break
|
|
}
|
|
if !f.shouldFilter(line) {
|
|
f.w.Write([]byte(line))
|
|
}
|
|
}
|
|
return len(p), nil
|
|
}
|
|
|
|
func (f *filteringWriter) shouldFilter(line string) bool {
|
|
for _, pattern := range f.patterns {
|
|
if strings.Contains(line, pattern) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Flush writes any remaining buffered content
|
|
func (f *filteringWriter) Flush() {
|
|
if f.buf.Len() > 0 {
|
|
remaining := f.buf.String()
|
|
if !f.shouldFilter(remaining) {
|
|
f.w.Write([]byte(remaining))
|
|
}
|
|
f.buf.Reset()
|
|
}
|
|
}
|