Files
Claude-Code-Workflow/.claude/skills/ccw/specs/intent-classification.md
catlog22 e3dba87e08 feat(skills): add CCW orchestrator and refactor command-guide to ccw-help
CCW Skill (new):
- Stateless workflow orchestrator with intent classification
- 6 workflow combinations: rapid, full, coupled, bugfix, issue, ui
- External configuration: intent-rules.json, workflow-chains.json
- Implicit CLI tool injection (Gemini/Qwen/Codex)
- TODO tracking integration for workflow progress

CCW-Help Skill (refactored from command-guide):
- Renamed command-guide → ccw-help
- Removed reference folder duplication
- Source paths now relative from index/ (../../../commands/...)
- Added all-agents.json index
- Simplified SKILL.md following CCW pattern
2026-01-03 18:46:59 +08:00

337 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Intent Classification Specification
CCW 意图分类规范:定义如何从用户输入识别任务意图并选择最优工作流。
## Classification Hierarchy
```
Intent Classification
├── Priority 1: Explicit Commands
│ └── /workflow:*, /issue:*, /memory:*, /task:*
├── Priority 2: Bug Keywords
│ ├── Hotfix: urgent + bug keywords
│ └── Standard: bug keywords only
├── Priority 3: Issue Batch
│ └── Multiple + fix keywords
├── Priority 4: Exploration
│ └── Uncertainty keywords
├── Priority 5: UI/Design
│ └── Visual/component keywords
└── Priority 6: Complexity Fallback
├── High → Coupled
├── Medium → Rapid
└── Low → Rapid
```
## Keyword Patterns
### Bug Detection
```javascript
const BUG_PATTERNS = {
core: /\b(fix|bug|error|issue|crash|broken|fail|wrong|incorrect|修复|报错|错误|问题|异常|崩溃|失败)\b/i,
urgency: /\b(hotfix|urgent|production|critical|emergency|asap|immediately|紧急|生产|线上|马上|立即)\b/i,
symptoms: /\b(not working|doesn't work|can't|cannot|won't|stopped|stopped working|无法|不能|不工作)\b/i,
errors: /\b(\d{3}\s*error|exception|stack\s*trace|undefined|null\s*pointer|timeout)\b/i
}
function detectBug(text) {
const isBug = BUG_PATTERNS.core.test(text) || BUG_PATTERNS.symptoms.test(text)
const isUrgent = BUG_PATTERNS.urgency.test(text)
const hasError = BUG_PATTERNS.errors.test(text)
if (!isBug && !hasError) return null
return {
type: 'bugfix',
mode: isUrgent ? 'hotfix' : 'standard',
confidence: (isBug && hasError) ? 'high' : 'medium'
}
}
```
### Issue Batch Detection
```javascript
const ISSUE_PATTERNS = {
batch: /\b(issues?|batch|queue|multiple|several|all|多个|批量|一系列|所有|这些)\b/i,
action: /\b(fix|resolve|handle|process|处理|解决|修复)\b/i,
source: /\b(github|jira|linear|backlog|todo|待办)\b/i
}
function detectIssueBatch(text) {
const hasBatch = ISSUE_PATTERNS.batch.test(text)
const hasAction = ISSUE_PATTERNS.action.test(text)
const hasSource = ISSUE_PATTERNS.source.test(text)
if (hasBatch && hasAction) {
return {
type: 'issue',
confidence: hasSource ? 'high' : 'medium'
}
}
return null
}
```
### Exploration Detection
```javascript
const EXPLORATION_PATTERNS = {
uncertainty: /\b(不确定|不知道|not sure|unsure|how to|怎么|如何|what if|should i|could i|是否应该)\b/i,
exploration: /\b(explore|research|investigate|分析|研究|调研|评估|探索|了解)\b/i,
options: /\b(options|alternatives|approaches|方案|选择|方向|可能性)\b/i,
questions: /\b(what|which|how|why|什么|哪个|怎样|为什么)\b.*\?/i
}
function detectExploration(text) {
const hasUncertainty = EXPLORATION_PATTERNS.uncertainty.test(text)
const hasExploration = EXPLORATION_PATTERNS.exploration.test(text)
const hasOptions = EXPLORATION_PATTERNS.options.test(text)
const hasQuestion = EXPLORATION_PATTERNS.questions.test(text)
const score = [hasUncertainty, hasExploration, hasOptions, hasQuestion].filter(Boolean).length
if (score >= 2 || hasUncertainty) {
return {
type: 'exploration',
confidence: score >= 3 ? 'high' : 'medium'
}
}
return null
}
```
### UI/Design Detection
```javascript
const UI_PATTERNS = {
components: /\b(ui|界面|component|组件|button|按钮|form|表单|modal|弹窗|dialog|对话框)\b/i,
design: /\b(design|设计|style|样式|layout|布局|theme|主题|color|颜色)\b/i,
visual: /\b(visual|视觉|animation|动画|responsive|响应式|mobile|移动端)\b/i,
frontend: /\b(frontend|前端|react|vue|angular|css|html|page|页面)\b/i
}
function detectUI(text) {
const hasComponents = UI_PATTERNS.components.test(text)
const hasDesign = UI_PATTERNS.design.test(text)
const hasVisual = UI_PATTERNS.visual.test(text)
const hasFrontend = UI_PATTERNS.frontend.test(text)
const score = [hasComponents, hasDesign, hasVisual, hasFrontend].filter(Boolean).length
if (score >= 2) {
return {
type: 'ui',
hasReference: /参考|reference|based on|像|like|模仿|imitate/.test(text),
confidence: score >= 3 ? 'high' : 'medium'
}
}
return null
}
```
## Complexity Assessment
### Indicators
```javascript
const COMPLEXITY_INDICATORS = {
high: {
patterns: [
/\b(refactor|重构|restructure|重新组织)\b/i,
/\b(migrate|迁移|upgrade|升级|convert|转换)\b/i,
/\b(architect|架构|system|系统|infrastructure|基础设施)\b/i,
/\b(entire|整个|complete|完整|all\s+modules?|所有模块)\b/i,
/\b(security|安全|scale|扩展|performance\s+critical|性能关键)\b/i,
/\b(distributed|分布式|microservice|微服务|cluster|集群)\b/i
],
weight: 2
},
medium: {
patterns: [
/\b(integrate|集成|connect|连接|link|链接)\b/i,
/\b(api|database|数据库|service|服务|endpoint|接口)\b/i,
/\b(test|测试|validate|验证|coverage|覆盖)\b/i,
/\b(multiple\s+files?|多个文件|several\s+components?|几个组件)\b/i,
/\b(authentication|认证|authorization|授权)\b/i
],
weight: 1
},
low: {
patterns: [
/\b(add|添加|create|创建|simple|简单)\b/i,
/\b(update|更新|modify|修改|change|改变)\b/i,
/\b(single|单个|one|一个|small|小)\b/i,
/\b(comment|注释|log|日志|print|打印)\b/i
],
weight: -1
}
}
function assessComplexity(text) {
let score = 0
for (const [level, config] of Object.entries(COMPLEXITY_INDICATORS)) {
for (const pattern of config.patterns) {
if (pattern.test(text)) {
score += config.weight
}
}
}
// File count indicator
const fileMatches = text.match(/\b\d+\s*(files?|文件)/i)
if (fileMatches) {
const count = parseInt(fileMatches[0])
if (count > 10) score += 2
else if (count > 5) score += 1
}
// Module count indicator
const moduleMatches = text.match(/\b\d+\s*(modules?|模块)/i)
if (moduleMatches) {
const count = parseInt(moduleMatches[0])
if (count > 3) score += 2
else if (count > 1) score += 1
}
if (score >= 4) return 'high'
if (score >= 2) return 'medium'
return 'low'
}
```
## Workflow Selection Matrix
| Intent | Complexity | Workflow | Commands |
|--------|------------|----------|----------|
| bugfix (hotfix) | * | bugfix | `lite-fix --hotfix` |
| bugfix (standard) | * | bugfix | `lite-fix` |
| issue | * | issue | `issue:plan → queue → execute` |
| exploration | * | full | `brainstorm → plan → execute` |
| ui (reference) | * | ui | `ui-design:imitate-auto → plan` |
| ui (explore) | * | ui | `ui-design:explore-auto → plan` |
| feature | high | coupled | `plan → verify → execute` |
| feature | medium | rapid | `lite-plan → lite-execute` |
| feature | low | rapid | `lite-plan → lite-execute` |
## Confidence Levels
| Level | Description | Action |
|-------|-------------|--------|
| **high** | Multiple strong indicators match | Direct dispatch |
| **medium** | Some indicators match | Confirm with user |
| **low** | Fallback classification | Always confirm |
## Tool Preference Detection
```javascript
const TOOL_PREFERENCES = {
gemini: {
pattern: /用\s*gemini|gemini\s*(分析|理解|设计)|让\s*gemini/i,
capability: 'analysis'
},
qwen: {
pattern: /用\s*qwen|qwen\s*(分析|评估)|让\s*qwen/i,
capability: 'analysis'
},
codex: {
pattern: /用\s*codex|codex\s*(实现|重构|修复)|让\s*codex/i,
capability: 'implementation'
}
}
function detectToolPreference(text) {
for (const [tool, config] of Object.entries(TOOL_PREFERENCES)) {
if (config.pattern.test(text)) {
return { tool, capability: config.capability }
}
}
return null
}
```
## Multi-Tool Collaboration Detection
```javascript
const COLLABORATION_PATTERNS = {
sequential: /先.*(分析|理解).*然后.*(实现|重构)|分析.*后.*实现/i,
parallel: /(同时|并行).*(分析|实现)|一边.*一边/i,
hybrid: /(分析|设计).*和.*(实现|测试).*分开/i
}
function detectCollaboration(text) {
if (COLLABORATION_PATTERNS.sequential.test(text)) {
return { mode: 'sequential', description: 'Analysis first, then implementation' }
}
if (COLLABORATION_PATTERNS.parallel.test(text)) {
return { mode: 'parallel', description: 'Concurrent analysis and implementation' }
}
if (COLLABORATION_PATTERNS.hybrid.test(text)) {
return { mode: 'hybrid', description: 'Mixed parallel and sequential' }
}
return null
}
```
## Classification Pipeline
```javascript
function classify(userInput) {
const text = userInput.trim()
// Step 1: Check explicit commands
if (/^\/(?:workflow|issue|memory|task):/.test(text)) {
return { type: 'explicit', command: text }
}
// Step 2: Priority-based classification
const bugResult = detectBug(text)
if (bugResult) return bugResult
const issueResult = detectIssueBatch(text)
if (issueResult) return issueResult
const explorationResult = detectExploration(text)
if (explorationResult) return explorationResult
const uiResult = detectUI(text)
if (uiResult) return uiResult
// Step 3: Complexity-based fallback
const complexity = assessComplexity(text)
return {
type: 'feature',
complexity,
workflow: complexity === 'high' ? 'coupled' : 'rapid',
confidence: 'low'
}
}
```
## Examples
### Input → Classification
| Input | Classification | Workflow |
|-------|----------------|----------|
| "用户登录失败401错误" | bugfix/standard | lite-fix |
| "紧急:支付网关挂了" | bugfix/hotfix | lite-fix --hotfix |
| "批量处理这些 GitHub issues" | issue | issue:plan → queue |
| "不确定要怎么设计缓存系统" | exploration | brainstorm → plan |
| "添加一个深色模式切换按钮" | ui | ui-design → plan |
| "重构整个认证模块" | feature/high | plan → verify |
| "添加用户头像功能" | feature/low | lite-plan |