Files
ccg-workflow/codeagent-wrapper/filter.go
T
li 6d5628977b feat: CCG 多模型协作系统 v1.0
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)
- 一键安装脚本
2026-01-05 01:28:10 +08:00

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()
}
}