- Created error context snapshots for Firefox, WebKit, and Chromium to capture UI state during API error monitoring. - Implemented e2e tests for API error detection, including console errors, failed API requests, and proxy errors. - Added functionality to ignore specific API patterns in monitoring assertions. - Ensured tests validate the monitoring system's ability to detect and report errors effectively.
21 KiB
name, description, argument-hint, allowed-tools
| name | description | argument-hint | allowed-tools |
|---|---|---|---|
| analyze-with-file | Interactive collaborative analysis with documented discussions, CLI-assisted exploration, and evolving understanding | [-y|--yes] [-c|--continue] "topic or question" | TodoWrite(*), Task(*), AskUserQuestion(*), Read(*), Grep(*), Glob(*), Bash(*), Edit(*), Write(*) |
Auto Mode
When --yes or -y: Auto-confirm exploration decisions, use recommended analysis angles.
Workflow Analyze-With-File Command (/workflow:analyze-with-file)
Overview
Interactive collaborative analysis workflow with documented discussion process. Records understanding evolution, facilitates multi-round Q&A, and uses CLI tools (Gemini/Codex) for deep exploration.
Core workflow: Topic → Explore → Discuss → Document → Refine → Conclude
Key features:
- discussion.md: Timeline of discussions and understanding evolution
- Multi-round Q&A: Iterative clarification with user
- CLI-assisted exploration: Gemini/Codex for codebase and concept analysis
- Consolidated insights: Synthesizes discussions into actionable conclusions
- Flexible continuation: Resume analysis sessions to build on previous work
Usage
/workflow:analyze-with-file [FLAGS] <TOPIC_OR_QUESTION>
# Flags
-y, --yes Skip confirmations, use recommended settings
-c, --continue Continue existing session (auto-detected if exists)
# Arguments
<topic-or-question> Analysis topic, question, or concept to explore (required)
# Examples
/workflow:analyze-with-file "如何优化这个项目的认证架构"
/workflow:analyze-with-file --continue "认证架构" # Continue existing session
/workflow:analyze-with-file -y "性能瓶颈分析" # Auto mode
Execution Process
Session Detection:
├─ Check if analysis session exists for topic
├─ EXISTS + discussion.md exists → Continue mode
└─ NOT_FOUND → New session mode
Phase 1: Topic Understanding
├─ Parse topic/question
├─ Identify analysis dimensions (architecture, implementation, concept, etc.)
├─ Initial scoping with user (AskUserQuestion)
└─ Document initial understanding in discussion.md
Phase 2: CLI Exploration (Parallel)
├─ Launch cli-explore-agent for codebase context
├─ Use Gemini/Codex for deep analysis
└─ Aggregate findings into exploration summary
Phase 3: Interactive Discussion (Multi-Round)
├─ Present exploration findings
├─ Facilitate Q&A with user (AskUserQuestion)
├─ Capture user insights and requirements
├─ Update discussion.md with each round
└─ Repeat until user is satisfied or clarity achieved
Phase 4: Synthesis & Conclusion
├─ Consolidate all insights
├─ Update discussion.md with conclusions
├─ Generate actionable recommendations
└─ Optional: Create follow-up tasks or issues
Output:
├─ .workflow/.analysis/{slug}-{date}/discussion.md (evolving document)
├─ .workflow/.analysis/{slug}-{date}/explorations.json (CLI findings)
└─ .workflow/.analysis/{slug}-{date}/conclusions.json (final synthesis)
Implementation
Session Setup & Mode Detection
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
const topicSlug = topic_or_question.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-').substring(0, 40)
const dateStr = getUtc8ISOString().substring(0, 10)
const sessionId = `ANL-${topicSlug}-${dateStr}`
const sessionFolder = `.workflow/.analysis/${sessionId}`
const discussionPath = `${sessionFolder}/discussion.md`
const explorationsPath = `${sessionFolder}/explorations.json`
const conclusionsPath = `${sessionFolder}/conclusions.json`
// Auto-detect mode
const sessionExists = fs.existsSync(sessionFolder)
const hasDiscussion = sessionExists && fs.existsSync(discussionPath)
const forcesContinue = $ARGUMENTS.includes('--continue') || $ARGUMENTS.includes('-c')
const mode = (hasDiscussion || forcesContinue) ? 'continue' : 'new'
if (!sessionExists) {
bash(`mkdir -p ${sessionFolder}`)
}
Phase 1: Topic Understanding
Step 1.1: Parse Topic & Identify Dimensions
// Analyze topic to determine analysis dimensions
const ANALYSIS_DIMENSIONS = {
architecture: ['架构', 'architecture', 'design', 'structure', '设计'],
implementation: ['实现', 'implement', 'code', 'coding', '代码'],
performance: ['性能', 'performance', 'optimize', 'bottleneck', '优化'],
security: ['安全', 'security', 'auth', 'permission', '权限'],
concept: ['概念', 'concept', 'theory', 'principle', '原理'],
comparison: ['比较', 'compare', 'vs', 'difference', '区别'],
decision: ['决策', 'decision', 'choice', 'tradeoff', '选择']
}
function identifyDimensions(topic) {
const text = topic.toLowerCase()
const matched = []
for (const [dimension, keywords] of Object.entries(ANALYSIS_DIMENSIONS)) {
if (keywords.some(k => text.includes(k))) {
matched.push(dimension)
}
}
return matched.length > 0 ? matched : ['general']
}
const dimensions = identifyDimensions(topic_or_question)
Step 1.2: Initial Scoping (New Session Only)
const autoYes = $ARGUMENTS.includes('--yes') || $ARGUMENTS.includes('-y')
if (mode === 'new' && !autoYes) {
// Ask user to scope the analysis
AskUserQuestion({
questions: [
{
question: `分析范围: "${topic_or_question}"\n\n您想重点关注哪些方面?`,
header: "Focus",
multiSelect: true,
options: [
{ label: "代码实现", description: "分析现有代码实现" },
{ label: "架构设计", description: "架构层面的分析" },
{ label: "最佳实践", description: "行业最佳实践对比" },
{ label: "问题诊断", description: "识别潜在问题" }
]
},
{
question: "分析深度?",
header: "Depth",
multiSelect: false,
options: [
{ label: "Quick Overview", description: "快速概览 (10-15分钟)" },
{ label: "Standard Analysis", description: "标准分析 (30-60分钟)" },
{ label: "Deep Dive", description: "深度分析 (1-2小时)" }
]
}
]
})
}
Step 1.3: Create/Update discussion.md
For new session:
# Analysis Discussion
**Session ID**: ${sessionId}
**Topic**: ${topic_or_question}
**Started**: ${getUtc8ISOString()}
**Dimensions**: ${dimensions.join(', ')}
---
## User Context
**Focus Areas**: ${userFocusAreas.join(', ')}
**Analysis Depth**: ${analysisDepth}
---
## Discussion Timeline
### Round 1 - Initial Understanding (${timestamp})
#### Topic Analysis
Based on the topic "${topic_or_question}":
- **Primary dimensions**: ${dimensions.join(', ')}
- **Initial scope**: ${initialScope}
- **Key questions to explore**:
- ${question1}
- ${question2}
- ${question3}
#### Next Steps
- Launch CLI exploration for codebase context
- Gather external insights via Gemini
- Prepare discussion points for user
---
## Current Understanding
${initialUnderstanding}
For continue session, append:
### Round ${n} - Continuation (${timestamp})
#### Previous Context
Resuming analysis based on prior discussion.
#### New Focus
${newFocusFromUser}
Phase 2: CLI Exploration
⚠️ CRITICAL - CLI EXECUTION REQUIREMENT:
- MUST wait for ALL CLI executions to fully complete before proceeding
- After launching CLI with
run_in_background: true, STOP and wait for hook callback - DO NOT proceed to Phase 3 until all CLI results are received
- Minimize output: No processing until 100% results available
Step 2.1: Launch Parallel Explorations
const explorationPromises = []
// CLI Explore Agent for codebase
if (dimensions.includes('implementation') || dimensions.includes('architecture')) {
explorationPromises.push(
Task(
subagent_type="cli-explore-agent",
run_in_background=false,
description=`Explore codebase: ${topicSlug}`,
prompt=`
## Analysis Context
Topic: ${topic_or_question}
Dimensions: ${dimensions.join(', ')}
Session: ${sessionFolder}
## MANDATORY FIRST STEPS
1. Run: ccw tool exec get_modules_by_depth '{}'
2. Execute relevant searches based on topic keywords
3. Read: .workflow/project-tech.json (if exists)
## Exploration Focus
${dimensions.map(d => `- ${d}: Identify relevant code patterns and structures`).join('\n')}
## Output
Write findings to: ${sessionFolder}/exploration-codebase.json
Schema:
{
"relevant_files": [{path, relevance, rationale}],
"patterns": [],
"key_findings": [],
"questions_for_user": [],
"_metadata": { "exploration_type": "codebase", "timestamp": "..." }
}
`
)
)
}
// Gemini CLI for deep analysis
// ⚠️ CRITICAL: Must wait for CLI completion before aggregating
explorationPromises.push(
Bash({
command: `ccw cli -p "
PURPOSE: Analyze topic '${topic_or_question}' from ${dimensions.join(', ')} perspectives
Success criteria: Actionable insights with clear reasoning
TASK:
• Identify key considerations for this topic
• Analyze common patterns and anti-patterns
• Highlight potential issues or opportunities
• Generate discussion points for user clarification
MODE: analysis
CONTEXT: @**/* | Topic: ${topic_or_question}
EXPECTED:
- Structured analysis with clear sections
- Specific insights tied to evidence
- Questions to deepen understanding
- Recommendations with rationale
CONSTRAINTS: Focus on ${dimensions.join(', ')}
" --tool gemini --mode analysis`,
run_in_background: true
})
)
⚠️ STOP POINT: After launching CLI calls, stop output immediately. Wait for hook callback to receive results before continuing to Step 2.2.
Step 2.2: Aggregate Findings
// After explorations complete, aggregate into explorations.json
const explorations = {
session_id: sessionId,
timestamp: getUtc8ISOString(),
topic: topic_or_question,
dimensions: dimensions,
sources: [
{ type: "codebase", file: "exploration-codebase.json" },
{ type: "gemini", summary: geminiOutput }
],
key_findings: [...],
discussion_points: [...],
open_questions: [...]
}
Write(explorationsPath, JSON.stringify(explorations, null, 2))
Step 2.3: Update discussion.md
#### Exploration Results (${timestamp})
**Sources Analyzed**:
${sources.map(s => `- ${s.type}: ${s.summary}`).join('\n')}
**Key Findings**:
${keyFindings.map((f, i) => `${i+1}. ${f}`).join('\n')}
**Points for Discussion**:
${discussionPoints.map((p, i) => `${i+1}. ${p}`).join('\n')}
**Open Questions**:
${openQuestions.map((q, i) => `- ${q}`).join('\n')}
Phase 3: Interactive Discussion (Multi-Round)
Step 3.1: Present Findings & Gather Feedback
// Maximum discussion rounds
const MAX_ROUNDS = 5
let roundNumber = 1
let discussionComplete = false
while (!discussionComplete && roundNumber <= MAX_ROUNDS) {
// Display current findings
console.log(`
## Discussion Round ${roundNumber}
${currentFindings}
### Key Points for Your Input
${discussionPoints.map((p, i) => `${i+1}. ${p}`).join('\n')}
`)
// Gather user input
const userResponse = AskUserQuestion({
questions: [
{
question: "对以上分析有什么看法或补充?",
header: "Feedback",
multiSelect: false,
options: [
{ label: "同意,继续深入", description: "分析方向正确,继续探索" },
{ label: "需要调整方向", description: "我有不同的理解或重点" },
{ label: "分析完成", description: "已获得足够信息" },
{ label: "有具体问题", description: "我想问一些具体问题" }
]
}
]
})
// Process user response
switch (userResponse.feedback) {
case "同意,继续深入":
// Deepen analysis in current direction
await deepenAnalysis()
break
case "需要调整方向":
// Get user's adjusted focus
const adjustment = AskUserQuestion({
questions: [{
question: "请说明您希望调整的方向或重点:",
header: "Direction",
multiSelect: false,
options: [
{ label: "更多代码细节", description: "深入代码实现" },
{ label: "更多架构视角", description: "关注整体设计" },
{ label: "更多实践对比", description: "对比最佳实践" }
]
}]
})
await adjustAnalysisDirection(adjustment)
break
case "分析完成":
discussionComplete = true
break
case "有具体问题":
// Let user ask specific questions, then answer
await handleUserQuestions()
break
}
// Update discussion.md with this round
updateDiscussionDocument(roundNumber, userResponse, findings)
roundNumber++
}
Step 3.2: Document Each Round
Append to discussion.md:
### Round ${n} - Discussion (${timestamp})
#### User Input
${userInputSummary}
${userResponse === 'adjustment' ? `
**Direction Adjustment**: ${adjustmentDetails}
` : ''}
${userResponse === 'questions' ? `
**User Questions**:
${userQuestions.map((q, i) => `${i+1}. ${q}`).join('\n')}
**Answers**:
${answers.map((a, i) => `${i+1}. ${a}`).join('\n')}
` : ''}
#### Updated Understanding
Based on user feedback:
- ${insight1}
- ${insight2}
#### Corrected Assumptions
${corrections.length > 0 ? corrections.map(c => `
- ~~${c.wrong}~~ → ${c.corrected}
- Reason: ${c.reason}
`).join('\n') : 'None'}
#### New Insights
${newInsights.map(i => `- ${i}`).join('\n')}
Phase 4: Synthesis & Conclusion
Step 4.1: Consolidate Insights
const conclusions = {
session_id: sessionId,
topic: topic_or_question,
completed: getUtc8ISOString(),
total_rounds: roundNumber,
summary: "...",
key_conclusions: [
{ point: "...", evidence: "...", confidence: "high|medium|low" }
],
recommendations: [
{ action: "...", rationale: "...", priority: "high|medium|low" }
],
open_questions: [...],
follow_up_suggestions: [
{ type: "issue", summary: "..." },
{ type: "task", summary: "..." }
]
}
Write(conclusionsPath, JSON.stringify(conclusions, null, 2))
Step 4.2: Final discussion.md Update
---
## Conclusions (${timestamp})
### Summary
${summaryParagraph}
### Key Conclusions
${conclusions.key_conclusions.map((c, i) => `
${i+1}. **${c.point}** (Confidence: ${c.confidence})
- Evidence: ${c.evidence}
`).join('\n')}
### Recommendations
${conclusions.recommendations.map((r, i) => `
${i+1}. **${r.action}** (Priority: ${r.priority})
- Rationale: ${r.rationale}
`).join('\n')}
### Remaining Questions
${conclusions.open_questions.map(q => `- ${q}`).join('\n')}
---
## Current Understanding (Final)
### What We Established
${establishedPoints.map(p => `- ${p}`).join('\n')}
### What Was Clarified/Corrected
${corrections.map(c => `- ~~${c.original}~~ → ${c.corrected}`).join('\n')}
### Key Insights
${keyInsights.map(i => `- ${i}`).join('\n')}
---
## Session Statistics
- **Total Rounds**: ${totalRounds}
- **Duration**: ${duration}
- **Sources Used**: ${sources.join(', ')}
- **Artifacts Generated**: discussion.md, explorations.json, conclusions.json
Step 4.3: Post-Completion Options
AskUserQuestion({
questions: [{
question: "分析完成。是否需要后续操作?",
header: "Next Steps",
multiSelect: true,
options: [
{ label: "创建Issue", description: "将结论转为可执行的Issue" },
{ label: "生成任务", description: "创建实施任务" },
{ label: "导出报告", description: "生成独立的分析报告" },
{ label: "完成", description: "不需要后续操作" }
]
}]
})
// Handle selections
if (selection.includes("创建Issue")) {
SlashCommand("/issue:new", `${topic_or_question} - 分析结论实施`)
}
if (selection.includes("生成任务")) {
SlashCommand("/workflow:lite-plan", `实施分析结论: ${summary}`)
}
if (selection.includes("导出报告")) {
exportAnalysisReport(sessionFolder)
}
Session Folder Structure
.workflow/.analysis/ANL-{slug}-{date}/
├── discussion.md # Evolution of understanding & discussions
├── explorations.json # CLI exploration findings
├── conclusions.json # Final synthesis
└── exploration-*.json # Individual exploration results (optional)
Discussion Document Template
# Analysis Discussion
**Session ID**: ANL-xxx-2025-01-25
**Topic**: [topic or question]
**Started**: 2025-01-25T10:00:00+08:00
**Dimensions**: [architecture, implementation, ...]
---
## User Context
**Focus Areas**: [user-selected focus]
**Analysis Depth**: [quick|standard|deep]
---
## Discussion Timeline
### Round 1 - Initial Understanding (2025-01-25 10:00)
#### Topic Analysis
...
#### Exploration Results
...
### Round 2 - Discussion (2025-01-25 10:15)
#### User Input
...
#### Updated Understanding
...
#### Corrected Assumptions
- ~~[wrong]~~ → [corrected]
### Round 3 - Deep Dive (2025-01-25 10:30)
...
---
## Conclusions (2025-01-25 11:00)
### Summary
...
### Key Conclusions
...
### Recommendations
...
---
## Current Understanding (Final)
### What We Established
- [confirmed points]
### What Was Clarified/Corrected
- ~~[original assumption]~~ → [corrected understanding]
### Key Insights
- [insights gained]
---
## Session Statistics
- **Total Rounds**: 3
- **Duration**: 1 hour
- **Sources Used**: codebase exploration, Gemini analysis
- **Artifacts Generated**: discussion.md, explorations.json, conclusions.json
Iteration Flow
First Call (/workflow:analyze-with-file "topic"):
├─ No session exists → New mode
├─ Identify analysis dimensions
├─ Scope with user (unless --yes)
├─ Create discussion.md with initial understanding
├─ Launch CLI explorations
└─ Enter discussion loop
Continue Call (/workflow:analyze-with-file --continue "topic"):
├─ Session exists → Continue mode
├─ Load discussion.md
├─ Resume from last round
└─ Continue discussion loop
Discussion Loop:
├─ Present current findings
├─ Gather user feedback (AskUserQuestion)
├─ Process response:
│ ├─ Agree → Deepen analysis
│ ├─ Adjust → Change direction
│ ├─ Question → Answer then continue
│ └─ Complete → Exit loop
├─ Update discussion.md
└─ Repeat until complete or max rounds
Completion:
├─ Generate conclusions.json
├─ Update discussion.md with final synthesis
└─ Offer follow-up options (issue, task, report)
CLI Integration Points
1. Codebase Exploration (cli-explore-agent)
Purpose: Gather relevant code context
When: Topic involves implementation or architecture analysis
2. Gemini Deep Analysis
Purpose: Conceptual analysis, pattern identification, best practices
Prompt Pattern:
PURPOSE: Analyze topic + identify insights
TASK: Explore dimensions + generate discussion points
CONTEXT: Codebase + topic
EXPECTED: Structured analysis + questions
3. Follow-up CLI Calls
Purpose: Deepen specific areas based on user feedback
Dynamic invocation based on discussion direction
Consolidation Rules
When updating "Current Understanding":
- Promote confirmed insights: Move validated findings to "What We Established"
- Track corrections: Keep important wrong→right transformations
- Focus on current state: What do we know NOW
- Avoid timeline repetition: Don't copy discussion details
- Preserve key learnings: Keep insights valuable for future reference
Bad (cluttered):
## Current Understanding
In round 1 we discussed X, then in round 2 user said Y, and we explored Z...
Good (consolidated):
## Current Understanding
### What We Established
- The authentication flow uses JWT with refresh tokens
- Rate limiting is implemented at API gateway level
### What Was Clarified
- ~~Assumed Redis for sessions~~ → Actually uses database-backed sessions
### Key Insights
- Current architecture supports horizontal scaling
- Security audit recommended before production
Error Handling
| Situation | Action |
|---|---|
| CLI exploration fails | Continue with available context, note limitation |
| User timeout in discussion | Save state, show resume command |
| Max rounds reached | Force synthesis, offer continuation option |
| No relevant findings | Broaden search, ask user for clarification |
| Session folder conflict | Append timestamp suffix |
| Gemini unavailable | Fallback to Codex or manual analysis |
Usage Recommendations
Use /workflow:analyze-with-file when:
- Exploring a complex topic collaboratively
- Need documented discussion trail
- Decision-making requires multiple perspectives
- Want to iterate on understanding with user input
- Building shared understanding before implementation
Use /workflow:debug-with-file when:
- Diagnosing specific bugs
- Need hypothesis-driven investigation
- Focus on evidence and verification
Use /workflow:lite-plan when:
- Ready to implement (past analysis phase)
- Need structured task breakdown
- Focus on execution planning