mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-03-10 17:11:04 +08:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71485b89e6 | ||
|
|
2fc792a3b7 | ||
|
|
0af4ca040f | ||
|
|
7af258f43d | ||
|
|
8ad283086b | ||
|
|
b36a46d59d | ||
|
|
899a92f2eb | ||
|
|
d0ac3a5cd2 | ||
|
|
0939510e0d | ||
|
|
deea92581b |
@@ -30,7 +30,7 @@ Interactive orchestration tool: analyze task → discover commands → recommend
|
||||
| `workflow:roadmap-with-file` | strategic requirement roadmap → issue creation → execution-plan.json |
|
||||
| `workflow:integration-test-cycle` | explore → test dev → test-fix cycle → reflection |
|
||||
| `workflow:refactor-cycle` | tech debt discovery → prioritize → execute → validate |
|
||||
| `team-planex` | planner + executor wave pipeline(适合大量零散 issue 或 roadmap 产出的清晰 issue,实现 0→1 开发)|
|
||||
| `team-planex` | planner + executor wave pipeline(适合大量零散 issue 或 roadmap 产出的清晰 issue)|
|
||||
|
||||
## Core Concept: Minimum Execution Units (最小执行单元)
|
||||
|
||||
@@ -85,7 +85,7 @@ Interactive orchestration tool: analyze task → discover commands → recommend
|
||||
| Unit Name | Commands | Purpose | Output |
|
||||
|-----------|----------|---------|--------|
|
||||
| **Analyze to Plan** | analyze-with-file → lite-plan | Collaborative analysis → auto chain to lite-plan | discussion.md + code |
|
||||
| **Brainstorm to Plan** | brainstorm-with-file → lite-plan | Multi-perspective ideation → auto chain to lite-plan | brainstorm.md + code |
|
||||
| **Brainstorm to Plan** | brainstorm-with-file → plan → execute | Multi-perspective ideation → formal planning | brainstorm.md + code |
|
||||
| **Debug With File** | debug-with-file | Hypothesis-driven debugging with documentation | understanding.md |
|
||||
| **Collaborative Plan** | collaborative-plan-with-file → unified-execute-with-file | Multi-agent collaborative planning and execution | plan-note.md + code |
|
||||
| **Roadmap Plan** | roadmap-with-file → team-planex | Requirement decomposition and wave execution | execution-plan.json + code |
|
||||
@@ -118,7 +118,7 @@ Interactive orchestration tool: analyze task → discover commands → recommend
|
||||
| issue:queue | issue:execute | Issue Workflow, Rapid-to-Issue, Brainstorm-to-Issue |
|
||||
| issue:from-brainstorm | issue:queue | Brainstorm-to-Issue |
|
||||
| analyze-with-file | lite-plan (auto) | Analyze to Plan |
|
||||
| brainstorm-with-file | lite-plan (auto), issue:from-brainstorm | Brainstorm to Plan, Brainstorm-to-Issue |
|
||||
| brainstorm-with-file | plan (auto), issue:from-brainstorm | Brainstorm to Plan, Brainstorm-to-Issue |
|
||||
| collaborative-plan-with-file | unified-execute-with-file | Collaborative Plan |
|
||||
| roadmap-with-file | team-planex | Roadmap Plan |
|
||||
| unified-execute-with-file | (terminal) | Collaborative Plan |
|
||||
@@ -165,11 +165,13 @@ function detectTaskType(text) {
|
||||
if (/urgent|production|critical/.test(text) && /fix|bug/.test(text)) return 'bugfix-hotfix';
|
||||
// With-File workflow patterns (specific keywords - must come before generic bugfix)
|
||||
if (/brainstorm.*issue|头脑风暴.*issue|idea.*issue|想法.*issue|从.*头脑风暴|convert.*brainstorm/.test(text)) return 'brainstorm-to-issue';
|
||||
// 0→1 Greenfield detection (priority over brainstorm/roadmap)
|
||||
if (/从零开始|from scratch|0.*to.*1|greenfield|全新.*开发|新项目|new project|build.*from.*ground/.test(text)) return 'greenfield';
|
||||
if (/brainstorm|ideation|头脑风暴|创意|发散思维|creative thinking/.test(text)) return 'brainstorm-file';
|
||||
if (/debug.*document|hypothesis.*debug|深度调试|假设.*验证|systematic debug/.test(text)) return 'debug-file';
|
||||
if (/analyze.*document|collaborative analysis|协作分析|深度.*理解/.test(text)) return 'analyze-file';
|
||||
if (/collaborative.*plan|协作.*规划|多人.*规划|multi.*agent.*plan|Plan Note|分工.*规划/.test(text)) return 'collaborative-plan';
|
||||
if (/roadmap|需求.*规划|需求.*拆解|requirement.*plan|progressive.*plan|路线.*图/.test(text)) return 'roadmap';
|
||||
if (/roadmap|路线.*图/.test(text)) return 'roadmap'; // Narrowed: only explicit roadmap keywords
|
||||
if (/spec.*gen|specification|PRD|产品需求|产品文档|产品规格/.test(text)) return 'spec-driven';
|
||||
// Cycle workflow patterns
|
||||
if (/integration.*test|集成测试|端到端.*测试|e2e.*test|integration.*cycle/.test(text)) return 'integration-test';
|
||||
@@ -407,7 +409,7 @@ const commandPorts = {
|
||||
output: ['brainstorm-document'],
|
||||
tags: ['brainstorm', 'with-file'],
|
||||
atomic_group: 'brainstorm-to-plan',
|
||||
note: 'Auto chains to lite-plan with brainstorm artifacts'
|
||||
note: 'Auto chains to workflow-plan with brainstorm artifacts'
|
||||
},
|
||||
'issue:from-brainstorm': {
|
||||
name: 'issue:from-brainstorm',
|
||||
@@ -515,8 +517,10 @@ function determinePortFlow(taskType, constraints) {
|
||||
// Issue workflow types
|
||||
'issue-batch': { inputPort: 'codebase', outputPort: 'completed-issues' },
|
||||
'issue-transition': { inputPort: 'requirement', outputPort: 'completed-issues' },
|
||||
// With-File workflow types (auto chain to lite-plan)
|
||||
'brainstorm-file': { inputPort: 'exploration-topic', outputPort: 'code' },
|
||||
// 0→1 Greenfield (exploration → formal planning → execution)
|
||||
'greenfield': { inputPort: 'exploration-topic', outputPort: 'test-passed' },
|
||||
// With-File workflow types (auto chain to plan)
|
||||
'brainstorm-file': { inputPort: 'exploration-topic', outputPort: 'test-passed' },
|
||||
'brainstorm-to-issue': { inputPort: 'brainstorm-document', outputPort: 'completed-issues' },
|
||||
'debug-file': { inputPort: 'bug-report', outputPort: 'understanding-document' },
|
||||
'analyze-file': { inputPort: 'analysis-topic', outputPort: 'code' },
|
||||
@@ -957,7 +961,8 @@ Task: <description>
|
||||
| **issue-batch** | 代码库 →【discover → plan → queue → execute】→ 完成 issues | Issue Workflow |
|
||||
| **issue-transition** | 需求 →【lite-plan → convert-to-plan → queue → execute】→ 完成 issues | Rapid-to-Issue |
|
||||
| **analyze-file** | 分析主题 →【analyze-with-file → lite-plan → lite-execute】→ 代码 | Analyze to Plan |
|
||||
| **brainstorm-file** | 主题 →【brainstorm-with-file → lite-plan → lite-execute】→ 代码 | Brainstorm to Plan |
|
||||
| **greenfield** | 需求 →【brainstorm-with-file → plan → execute】→ 代码 → test | Greenfield (0→1) |
|
||||
| **brainstorm-file** | 主题 →【brainstorm-with-file → plan → execute】→ 代码 → test | Brainstorm to Plan |
|
||||
| **brainstorm-to-issue** | brainstorm.md →【from-brainstorm → queue → execute】→ 完成 issues | Brainstorm to Issue |
|
||||
| **debug-file** | Bug报告 → debug-with-file → understanding.md (自包含) | Debug With File |
|
||||
| **collaborative-plan** | 需求 →【collaborative-plan-with-file → unified-execute-with-file】→ 代码 | Collaborative Plan |
|
||||
|
||||
@@ -28,7 +28,7 @@ Main process orchestrator: intent analysis → workflow selection → command ch
|
||||
| `workflow:roadmap-with-file` | strategic requirement roadmap → issue creation → execution-plan.json |
|
||||
| `workflow:integration-test-cycle` | explore → test dev → test-fix cycle → reflection |
|
||||
| `workflow:refactor-cycle` | tech debt discovery → prioritize → execute → validate |
|
||||
| `team-planex` | planner + executor wave pipeline(适合大量零散 issue 或 roadmap 产出的清晰 issue,实现 0→1 开发)|
|
||||
| `team-planex` | planner + executor wave pipeline(适合大量零散 issue 或 roadmap 产出的清晰 issue)|
|
||||
|
||||
## Core Concept: Self-Contained Skills (自包含 Skill)
|
||||
|
||||
@@ -51,9 +51,11 @@ Main process orchestrator: intent analysis → workflow selection → command ch
|
||||
| 代码审查 | `review-cycle` | 内部完成 review→fix |
|
||||
| 多CLI协作 | `workflow-multi-cli-plan` | ACE context → CLI discussion → plan → execute |
|
||||
| 分析→规划 | `workflow:analyze-with-file` → `workflow-lite-plan` | 协作分析产物自动传递给 lite-plan |
|
||||
| 头脑风暴→规划 | `workflow:brainstorm-with-file` → `workflow-lite-plan` | 头脑风暴产物自动传递给 lite-plan |
|
||||
| 头脑风暴→规划 | `workflow:brainstorm-with-file` → `workflow-plan` → `workflow-execute` | 头脑风暴产物自动传递给正式规划 |
|
||||
| 0→1 开发(小) | `workflow:brainstorm-with-file` → `workflow-plan` → `workflow-execute` | 小规模从零开始,探索+正式规划+实现 |
|
||||
| 0→1 开发(中/大) | `workflow:brainstorm-with-file` → `workflow-plan` → `workflow-execute` | 探索后正式规划+执行 |
|
||||
| 协作规划 | `workflow:collaborative-plan-with-file` → `workflow:unified-execute-with-file` | 多 agent 协作规划→通用执行 |
|
||||
| 需求路线图 | `workflow:roadmap-with-file` → `team-planex` | 需求拆解→issue 创建→wave pipeline 执行 |
|
||||
| 需求路线图 | `workflow:roadmap-with-file` → `team-planex` | 需求拆解→issue 创建→wave pipeline 执行(需明确 roadmap 关键词)|
|
||||
| 集成测试循环 | `workflow:integration-test-cycle` | 自迭代集成测试闭环 |
|
||||
| 重构循环 | `workflow:refactor-cycle` | 技术债务发现→重构→验证 |
|
||||
|
||||
@@ -124,12 +126,14 @@ function detectTaskType(text) {
|
||||
const patterns = {
|
||||
'bugfix-hotfix': /urgent|production|critical/ && /fix|bug/,
|
||||
// With-File workflows (documented exploration → auto chain to lite-plan)
|
||||
// 0→1 Greenfield detection (priority over brainstorm/roadmap)
|
||||
'greenfield': /从零开始|from scratch|0.*to.*1|greenfield|全新.*开发|新项目|new project|build.*from.*ground/,
|
||||
'brainstorm': /brainstorm|ideation|头脑风暴|创意|发散思维|creative thinking|multi-perspective.*think|compare perspectives|探索.*可能/,
|
||||
'brainstorm-to-issue': /brainstorm.*issue|头脑风暴.*issue|idea.*issue|想法.*issue|从.*头脑风暴|convert.*brainstorm/,
|
||||
'debug-file': /debug.*document|hypothesis.*debug|troubleshoot.*track|investigate.*log|调试.*记录|假设.*验证|systematic debug|深度调试/,
|
||||
'analyze-file': /analyze.*document|explore.*concept|understand.*architecture|investigate.*discuss|collaborative analysis|分析.*讨论|深度.*理解|协作.*分析/,
|
||||
'collaborative-plan': /collaborative.*plan|协作.*规划|多人.*规划|multi.*agent.*plan|Plan Note|分工.*规划/,
|
||||
'roadmap': /roadmap|需求.*规划|需求.*拆解|requirement.*plan|progressive.*plan|路线.*图/,
|
||||
'roadmap': /roadmap|路线.*图/, // Narrowed: only explicit roadmap keywords (需求规划/需求拆解 moved to greenfield routing)
|
||||
'spec-driven': /spec.*gen|specification|PRD|产品需求|产品文档|产品规格/,
|
||||
// Cycle workflows (self-iterating with reflection)
|
||||
'integration-test': /integration.*test|集成测试|端到端.*测试|e2e.*test|integration.*cycle/,
|
||||
@@ -184,13 +188,18 @@ async function clarifyRequirements(analysis) {
|
||||
function selectWorkflow(analysis) {
|
||||
const levelMap = {
|
||||
'bugfix-hotfix': { level: 2, flow: 'bugfix.hotfix' },
|
||||
// 0→1 Greenfield (complexity-adaptive routing)
|
||||
'greenfield': { level: analysis.complexity === 'high' ? 4 : 3,
|
||||
flow: analysis.complexity === 'high' ? 'greenfield-phased' // large: brainstorm → workflow-plan → execute
|
||||
: analysis.complexity === 'medium' ? 'greenfield-plan' // medium: brainstorm → workflow-plan → execute
|
||||
: 'brainstorm-to-plan' }, // small: brainstorm → workflow-plan
|
||||
// With-File workflows → auto chain to lite-plan
|
||||
'brainstorm': { level: 4, flow: 'brainstorm-to-plan' }, // brainstorm-with-file → lite-plan
|
||||
'brainstorm': { level: 4, flow: 'brainstorm-to-plan' }, // brainstorm-with-file → workflow-plan
|
||||
'brainstorm-to-issue': { level: 4, flow: 'brainstorm-to-issue' }, // Brainstorm → Issue workflow
|
||||
'debug-file': { level: 3, flow: 'debug-with-file' }, // Hypothesis-driven debugging (standalone)
|
||||
'analyze-file': { level: 3, flow: 'analyze-to-plan' }, // analyze-with-file → lite-plan
|
||||
'collaborative-plan': { level: 3, flow: 'collaborative-plan' }, // Multi-agent collaborative planning
|
||||
'roadmap': { level: 4, flow: 'roadmap' }, // roadmap → team-planex
|
||||
'roadmap': { level: 4, flow: 'roadmap' }, // roadmap → team-planex (explicit roadmap only)
|
||||
'spec-driven': { level: 4, flow: 'spec-driven' }, // spec-generator → plan → execute
|
||||
// Cycle workflows (self-iterating with reflection)
|
||||
'integration-test': { level: 3, flow: 'integration-test-cycle' },
|
||||
@@ -266,7 +275,11 @@ function buildCommandChain(workflow, analysis) {
|
||||
|
||||
'brainstorm-to-plan': [
|
||||
{ cmd: 'workflow:brainstorm-with-file', args: `"${analysis.goal}"` },
|
||||
{ cmd: 'workflow-lite-plan', args: '' } // auto receives brainstorm artifacts (brainstorm.md)
|
||||
{ cmd: 'workflow-plan', args: '' }, // formal planning with brainstorm artifacts
|
||||
{ cmd: 'workflow-execute', args: '' },
|
||||
...(analysis.constraints?.includes('skip-tests') ? [] : [
|
||||
{ cmd: 'workflow-test-fix', args: '' }
|
||||
])
|
||||
],
|
||||
|
||||
'debug-with-file': [
|
||||
@@ -281,6 +294,26 @@ function buildCommandChain(workflow, analysis) {
|
||||
{ cmd: 'issue:execute', args: '--queue auto' }
|
||||
],
|
||||
|
||||
// 0→1 Greenfield (complexity-adaptive)
|
||||
'greenfield-plan': [
|
||||
{ cmd: 'workflow:brainstorm-with-file', args: `"${analysis.goal}"` },
|
||||
{ cmd: 'workflow-plan', args: '' }, // formal planning after exploration
|
||||
{ cmd: 'workflow-execute', args: '' },
|
||||
...(analysis.constraints?.includes('skip-tests') ? [] : [
|
||||
{ cmd: 'workflow-test-fix', args: '' }
|
||||
])
|
||||
],
|
||||
|
||||
'greenfield-phased': [
|
||||
{ cmd: 'workflow:brainstorm-with-file', args: `"${analysis.goal}"` },
|
||||
{ cmd: 'workflow-plan', args: '' }, // formal planning after exploration
|
||||
{ cmd: 'workflow-execute', args: '' },
|
||||
{ cmd: 'review-cycle', args: '' },
|
||||
...(analysis.constraints?.includes('skip-tests') ? [] : [
|
||||
{ cmd: 'workflow-test-fix', args: '' }
|
||||
])
|
||||
],
|
||||
|
||||
// Universal Plan+Execute
|
||||
'collaborative-plan': [
|
||||
{ cmd: 'workflow:collaborative-plan-with-file', args: `"${analysis.goal}"` },
|
||||
@@ -338,7 +371,7 @@ function buildCommandChain(workflow, analysis) {
|
||||
{ cmd: 'workflow-execute', args: '' }
|
||||
],
|
||||
|
||||
// Level 4 - Full Exploration
|
||||
// Level 4 - Full Exploration (brainstorm → formal planning → execute)
|
||||
'full': [
|
||||
{ cmd: 'brainstorm', args: `"${analysis.goal}"` },
|
||||
{ cmd: 'workflow-plan', args: '' },
|
||||
@@ -600,10 +633,12 @@ Phase 5: Execute Command Chain
|
||||
| "Use issue workflow" | issue-transition | 2.5 | workflow-lite-plan(plan-only) → convert-to-plan → queue → execute |
|
||||
| "协作分析: 认证架构" | analyze-file | 3 | analyze-with-file → workflow-lite-plan |
|
||||
| "深度调试 WebSocket" | debug-file | 3 | workflow:debug-with-file |
|
||||
| "头脑风暴: 通知系统" | brainstorm | 4 | brainstorm-with-file → workflow-lite-plan |
|
||||
| "从零开始: 用户系统" | greenfield (medium) | 3 | brainstorm-with-file → workflow-plan → workflow-execute → workflow-test-fix |
|
||||
| "greenfield: 大型平台" | greenfield (high) | 4 | brainstorm-with-file → workflow-plan → workflow-execute → review-cycle → workflow-test-fix |
|
||||
| "头脑风暴: 通知系统" | brainstorm | 4 | brainstorm-with-file → workflow-plan → workflow-execute → workflow-test-fix |
|
||||
| "从头脑风暴创建 issue" | brainstorm-to-issue | 4 | issue:from-brainstorm → issue:queue → issue:execute |
|
||||
| "协作规划: 实时通知系统" | collaborative-plan | 3 | collaborative-plan-with-file → unified-execute-with-file |
|
||||
| "需求路线图: OAuth + 2FA" | roadmap | 4 | roadmap-with-file → team-planex |
|
||||
| "roadmap: OAuth + 2FA" | roadmap | 4 | roadmap-with-file → team-planex |
|
||||
| "specification: 用户系统" | spec-driven | 4 | spec-generator → workflow-plan → workflow-execute → workflow-test-fix |
|
||||
| "集成测试: 支付流程" | integration-test | 3 | workflow:integration-test-cycle |
|
||||
| "重构 auth 模块" | refactor | 3 | workflow:refactor-cycle |
|
||||
@@ -687,13 +722,13 @@ todos = [
|
||||
|
||||
| Workflow | Purpose | Auto Chain | Output Folder |
|
||||
|----------|---------|------------|---------------|
|
||||
| **brainstorm-with-file** | Multi-perspective ideation | → workflow-lite-plan (auto) | `.workflow/.brainstorm/` |
|
||||
| **brainstorm-with-file** | Multi-perspective ideation | → workflow-plan → workflow-execute (auto) | `.workflow/.brainstorm/` |
|
||||
| **debug-with-file** | Hypothesis-driven debugging | Standalone (self-contained) | `.workflow/.debug/` |
|
||||
| **analyze-with-file** | Collaborative analysis | → workflow-lite-plan (auto) | `.workflow/.analysis/` |
|
||||
| **collaborative-plan-with-file** | Multi-agent collaborative planning | → unified-execute-with-file | `.workflow/.planning/` |
|
||||
| **roadmap-with-file** | Strategic requirement roadmap | → team-planex | `.workflow/.planning/` |
|
||||
|
||||
**Auto Chain Mechanism**: When `analyze-with-file` or `brainstorm-with-file` completes, its artifacts (discussion.md / brainstorm.md) are automatically passed to `workflow-lite-plan` as context input. No user intervention needed.
|
||||
**Auto Chain Mechanism**: When `analyze-with-file` completes, its artifacts (discussion.md) are automatically passed to `workflow-lite-plan`. When `brainstorm-with-file` completes, its artifacts (brainstorm.md) are passed to `workflow-plan` for formal planning. No user intervention needed.
|
||||
|
||||
**Detection Keywords**:
|
||||
- **brainstorm**: 头脑风暴, 创意, 发散思维, multi-perspective, compare perspectives
|
||||
@@ -752,9 +787,14 @@ todos = [
|
||||
# Multi-CLI collaborative planning
|
||||
/ccw "multi-cli plan: 支付网关API设计" # → workflow-multi-cli-plan → workflow-test-fix
|
||||
|
||||
# With-File workflows → auto chain to lite-plan
|
||||
# 0→1 Greenfield development (exploration-first)
|
||||
/ccw "从零开始: 用户认证系统" # → brainstorm-with-file → workflow-plan → workflow-execute → workflow-test-fix
|
||||
/ccw "new project: 数据导出模块" # → brainstorm-with-file → workflow-plan → workflow-execute → workflow-test-fix
|
||||
/ccw "全新开发: 实时通知系统" # → brainstorm-with-file → workflow-plan → workflow-execute → review-cycle → workflow-test-fix
|
||||
|
||||
# With-File workflows → auto chain
|
||||
/ccw "协作分析: 理解现有认证架构的设计决策" # → analyze-with-file → workflow-lite-plan
|
||||
/ccw "头脑风暴: 用户通知系统重新设计" # → brainstorm-with-file → workflow-lite-plan
|
||||
/ccw "头脑风暴: 用户通知系统重新设计" # → brainstorm-with-file → workflow-plan → workflow-execute → workflow-test-fix
|
||||
/ccw "深度调试: 系统随机崩溃问题" # → debug-with-file (standalone)
|
||||
/ccw "从头脑风暴 BS-通知系统-2025-01-28 创建 issue" # → brainstorm-to-issue (bridge)
|
||||
|
||||
@@ -763,8 +803,8 @@ todos = [
|
||||
|
||||
# Collaborative planning & requirement workflows
|
||||
/ccw "协作规划: 实时通知系统架构" # → collaborative-plan-with-file → unified-execute
|
||||
/ccw "需求路线图: 用户认证 OAuth + 2FA" # → roadmap-with-file → team-planex
|
||||
/ccw "roadmap: 数据导出功能路线图" # → roadmap-with-file → team-planex
|
||||
/ccw "roadmap: 用户认证 OAuth + 2FA 路线图" # → roadmap-with-file → team-planex (explicit roadmap only)
|
||||
/ccw "roadmap: 数据导出功能路线图" # → roadmap-with-file → team-planex (explicit roadmap only)
|
||||
|
||||
# Team workflows (kept: team-planex)
|
||||
/ccw "team planex: 用户认证系统" # → team-planex (planner + executor wave pipeline)
|
||||
|
||||
@@ -542,7 +542,11 @@ CONSTRAINTS: ${perspective.constraints}
|
||||
- **Trade-offs Made**: Key trade-offs and why certain paths were chosen over others
|
||||
- Add session statistics: rounds, duration, sources, artifacts, **decision count**
|
||||
|
||||
3. **Post-Completion Options**
|
||||
3. **Post-Completion Options** (⚠️ TERMINAL — analyze-with-file ends after user selection)
|
||||
|
||||
> **WORKFLOW BOUNDARY**: After user selects any option below, the analyze-with-file workflow is **COMPLETE**.
|
||||
> If "生成任务" is selected, workflow-lite-plan takes over exclusively — do NOT return to any analyze-with-file phase.
|
||||
> The "Phase" numbers in workflow-lite-plan (Phase 1-5) are SEPARATE from analyze-with-file phases.
|
||||
|
||||
```javascript
|
||||
const hasActionableRecs = conclusions.recommendations?.some(r => r.priority === 'high' || r.priority === 'medium')
|
||||
@@ -562,7 +566,7 @@ CONSTRAINTS: ${perspective.constraints}
|
||||
})
|
||||
```
|
||||
|
||||
**Handle "生成任务"**:
|
||||
**Handle "生成任务"** (⚠️ TERMINAL — analyze-with-file ends here, lite-plan takes over exclusively):
|
||||
```javascript
|
||||
if (nextStep.includes("生成任务")) {
|
||||
// 1. Build task description from high/medium priority recommendations
|
||||
@@ -585,8 +589,9 @@ CONSTRAINTS: ${perspective.constraints}
|
||||
if (findings.length) contextLines.push(`**Key Findings**:\n${findings.map(f => `- ${f}`).join('\n')}`)
|
||||
}
|
||||
|
||||
// 3. Call lite-plan with enriched task description (no special flags)
|
||||
// 3. Hand off to lite-plan — analyze-with-file COMPLETE, do NOT return to any analyze phase
|
||||
Skill(skill="workflow-lite-plan", args=`"${taskDescription}\n\n${contextLines.join('\n')}"`)
|
||||
return // ⛔ analyze-with-file terminates here
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -529,15 +529,17 @@ ${task_description}
|
||||
|
||||
## Multi-Angle Exploration Context
|
||||
|
||||
${manifest.explorations.map(exp => `### Exploration: ${exp.angle} (${exp.file})
|
||||
${manifest.explorations.length > 0
|
||||
? manifest.explorations.map(exp => `### Exploration: ${exp.angle} (${exp.file})
|
||||
Path: ${exp.path}
|
||||
|
||||
Read this file for detailed ${exp.angle} analysis.`).join('\n\n')}
|
||||
Read this file for detailed ${exp.angle} analysis.`).join('\n\n') + `
|
||||
|
||||
Total explorations: ${manifest.exploration_count}
|
||||
Angles covered: ${manifest.explorations.map(e => e.angle).join(', ')}
|
||||
|
||||
Manifest: ${sessionFolder}/explorations-manifest.json
|
||||
Manifest: ${sessionFolder}/explorations-manifest.json`
|
||||
: `No exploration files. Task Description above contains "## Prior Analysis" with analysis summary, key files, and findings — use it as primary planning context.`}
|
||||
|
||||
## User Clarifications
|
||||
${JSON.stringify(clarificationContext) || "None"}
|
||||
|
||||
@@ -687,7 +687,8 @@ ${selectedMode === 'progressive' ? `**Progressive Mode**:
|
||||
if (feedback.feedback === 'approve') {
|
||||
approved = true
|
||||
} else {
|
||||
// Handle feedback type
|
||||
// CONSTRAINT: All modifications below ONLY touch roadmap.md and issues.jsonl
|
||||
// NEVER modify source code or project files during interactive rounds
|
||||
switch (feedback.feedback) {
|
||||
case 'scope':
|
||||
// Collect scope adjustments
|
||||
@@ -695,8 +696,9 @@ ${selectedMode === 'progressive' ? `**Progressive Mode**:
|
||||
{ id: "adjustments", type: "text", prompt: "Describe scope adjustments needed:" }
|
||||
]) // BLOCKS
|
||||
|
||||
// Update roadmap.md and issues
|
||||
// ... implementation ...
|
||||
// Update ONLY roadmap.md Roadmap table + Convergence sections
|
||||
Edit({ path: `${sessionFolder}/roadmap.md`, /* scope changes */ })
|
||||
// Update ONLY issues.jsonl entries (scope/context fields)
|
||||
|
||||
break
|
||||
|
||||
@@ -706,8 +708,8 @@ ${selectedMode === 'progressive' ? `**Progressive Mode**:
|
||||
{ id: "refinements", type: "text", prompt: "Describe convergence refinements needed:" }
|
||||
]) // BLOCKS
|
||||
|
||||
// Update roadmap.md
|
||||
// ... implementation ...
|
||||
// Update ONLY roadmap.md Convergence Criteria section
|
||||
Edit({ path: `${sessionFolder}/roadmap.md`, /* convergence changes */ })
|
||||
|
||||
break
|
||||
|
||||
@@ -726,8 +728,7 @@ ${selectedMode === 'progressive' ? `**Progressive Mode**:
|
||||
]) // BLOCKS
|
||||
|
||||
selectedMode = newStrategy.strategy
|
||||
// Re-execute Phase 2
|
||||
// ... goto Phase 2 ...
|
||||
// Re-execute Phase 2 (updates roadmap.md + issues.jsonl only)
|
||||
break
|
||||
}
|
||||
|
||||
@@ -871,6 +872,7 @@ To execute later:
|
||||
4. **Testable Convergence**: criteria = assertions, DoD = business language
|
||||
5. **Explicit Lifecycle**: Always close_agent after wait completes to free resources
|
||||
6. **DO NOT STOP**: Continuous workflow until handoff complete
|
||||
7. **Plan-Only Modifications**: Interactive feedback (Phase 3) MUST only update `roadmap.md` and `issues.jsonl`. NEVER modify source code, configuration files, or any project files during interactive rounds. Code changes happen only after handoff (Phase 4) via team-planex or other execution skills
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -41,6 +41,43 @@ describe('CcwToolsMcpCard', () => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it('disables all tools when clicking "Disable All" button', async () => {
|
||||
const { CcwToolsMcpCard } = await import('./CcwToolsMcpCard');
|
||||
const onUpdateConfigMock = vi.fn();
|
||||
|
||||
render(
|
||||
<CcwToolsMcpCard
|
||||
target="codex"
|
||||
isInstalled={true}
|
||||
enabledTools={['write_file', 'read_file', 'edit_file']}
|
||||
onToggleTool={vi.fn()}
|
||||
onUpdateConfig={onUpdateConfigMock}
|
||||
onInstall={vi.fn()}
|
||||
/>,
|
||||
{ locale: 'en' }
|
||||
);
|
||||
|
||||
const user = userEvent.setup();
|
||||
// Expand the card
|
||||
await act(async () => {
|
||||
await user.click(screen.getByText(/CCW MCP Server|mcp\.ccw\.title/i));
|
||||
});
|
||||
|
||||
// Find and click "Disable All" button
|
||||
const disableAllButton = screen.getByRole('button', {
|
||||
name: /Disable All|mcp\.ccw\.actions\.disableAll/i,
|
||||
});
|
||||
expect(disableAllButton).toBeEnabled();
|
||||
await act(async () => {
|
||||
await user.click(disableAllButton);
|
||||
});
|
||||
|
||||
// Verify onUpdateConfig was called with empty enabledTools array
|
||||
await waitFor(() => {
|
||||
expect(onUpdateConfigMock).toHaveBeenCalledWith({ enabledTools: [] });
|
||||
});
|
||||
});
|
||||
|
||||
it('preserves enabledTools when saving config (Codex)', async () => {
|
||||
const { CcwToolsMcpCard } = await import('./CcwToolsMcpCard');
|
||||
const updateCodexMock = vi.mocked(apiMock.updateCcwConfigForCodex);
|
||||
|
||||
@@ -13,7 +13,7 @@ const CollapsibleContent = React.forwardRef<
|
||||
<CollapsiblePrimitive.Content
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"overflow-hidden transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
|
||||
"transition-all data-[state=closed]:overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
|
||||
@@ -4371,10 +4371,15 @@ function buildCcwMcpServerConfig(config: {
|
||||
}): { command: string; args: string[]; env: Record<string, string> } {
|
||||
const env: Record<string, string> = {};
|
||||
|
||||
if (config.enabledTools && config.enabledTools.length > 0) {
|
||||
// Only use default when enabledTools is undefined (not provided)
|
||||
// When enabledTools is an empty array, set to empty string to disable all tools
|
||||
console.log('[buildCcwMcpServerConfig] config.enabledTools:', config.enabledTools);
|
||||
if (config.enabledTools !== undefined) {
|
||||
env.CCW_ENABLED_TOOLS = config.enabledTools.join(',');
|
||||
console.log('[buildCcwMcpServerConfig] Set CCW_ENABLED_TOOLS to:', env.CCW_ENABLED_TOOLS);
|
||||
} else {
|
||||
env.CCW_ENABLED_TOOLS = 'write_file,edit_file,read_file,core_memory,ask_question,smart_search';
|
||||
console.log('[buildCcwMcpServerConfig] Using default CCW_ENABLED_TOOLS');
|
||||
}
|
||||
|
||||
if (config.projectRoot) {
|
||||
@@ -4455,11 +4460,20 @@ export async function fetchCcwMcpConfig(currentProjectPath?: string): Promise<Cc
|
||||
}
|
||||
|
||||
// Parse enabled tools from env
|
||||
// Note: CCW_ENABLED_TOOLS can be empty string (all tools disabled), 'all' (default set), or comma-separated list
|
||||
const env = ccwServer.env || {};
|
||||
const enabledToolsStr = env.CCW_ENABLED_TOOLS || 'all';
|
||||
const enabledTools = enabledToolsStr === 'all'
|
||||
? ['write_file', 'edit_file', 'read_file', 'core_memory', 'ask_question']
|
||||
: enabledToolsStr.split(',').map((t: string) => t.trim());
|
||||
const enabledToolsStr = env.CCW_ENABLED_TOOLS;
|
||||
let enabledTools: string[];
|
||||
if (enabledToolsStr === undefined || enabledToolsStr === null) {
|
||||
// No setting = use default tools
|
||||
enabledTools = ['write_file', 'edit_file', 'read_file', 'core_memory', 'ask_question', 'smart_search'];
|
||||
} else if (enabledToolsStr === '' || enabledToolsStr === 'all') {
|
||||
// Empty string = all tools disabled, 'all' = default set (for backward compatibility)
|
||||
enabledTools = enabledToolsStr === '' ? [] : ['write_file', 'edit_file', 'read_file', 'core_memory', 'ask_question', 'smart_search'];
|
||||
} else {
|
||||
// Comma-separated list
|
||||
enabledTools = enabledToolsStr.split(',').map((t: string) => t.trim()).filter(Boolean);
|
||||
}
|
||||
|
||||
return {
|
||||
isInstalled: true,
|
||||
@@ -4601,10 +4615,19 @@ export async function fetchCcwMcpConfigForCodex(): Promise<CcwMcpConfig> {
|
||||
}
|
||||
|
||||
const env = ccwServer.env || {};
|
||||
const enabledToolsStr = env.CCW_ENABLED_TOOLS || 'all';
|
||||
const enabledTools = enabledToolsStr === 'all'
|
||||
? ['write_file', 'edit_file', 'read_file', 'core_memory', 'ask_question', 'smart_search']
|
||||
: enabledToolsStr.split(',').map((t: string) => t.trim());
|
||||
// Note: CCW_ENABLED_TOOLS can be empty string (all tools disabled), 'all' (default set), or comma-separated list
|
||||
const enabledToolsStr = env.CCW_ENABLED_TOOLS;
|
||||
let enabledTools: string[];
|
||||
if (enabledToolsStr === undefined || enabledToolsStr === null) {
|
||||
// No setting = use default tools
|
||||
enabledTools = ['write_file', 'edit_file', 'read_file', 'core_memory', 'ask_question', 'smart_search'];
|
||||
} else if (enabledToolsStr === '' || enabledToolsStr === 'all') {
|
||||
// Empty string = all tools disabled, 'all' = default set (for backward compatibility)
|
||||
enabledTools = enabledToolsStr === '' ? [] : ['write_file', 'edit_file', 'read_file', 'core_memory', 'ask_question', 'smart_search'];
|
||||
} else {
|
||||
// Comma-separated list
|
||||
enabledTools = enabledToolsStr.split(',').map((t: string) => t.trim()).filter(Boolean);
|
||||
}
|
||||
|
||||
return {
|
||||
isInstalled: true,
|
||||
@@ -4630,7 +4653,9 @@ function buildCcwMcpServerConfigForCodex(config: {
|
||||
}): { command: string; args: string[]; env: Record<string, string> } {
|
||||
const env: Record<string, string> = {};
|
||||
|
||||
if (config.enabledTools && config.enabledTools.length > 0) {
|
||||
// Only use default when enabledTools is undefined (not provided)
|
||||
// When enabledTools is an empty array, set to empty string to disable all tools
|
||||
if (config.enabledTools !== undefined) {
|
||||
env.CCW_ENABLED_TOOLS = config.enabledTools.join(',');
|
||||
} else {
|
||||
env.CCW_ENABLED_TOOLS = 'write_file,edit_file,read_file,core_memory,ask_question,smart_search';
|
||||
|
||||
@@ -412,8 +412,7 @@ export function McpManagerPage() {
|
||||
};
|
||||
|
||||
const handleUpdateCcwConfig = async (config: Partial<CcwMcpConfig>) => {
|
||||
// Read BEFORE optimistic update to capture actual server state
|
||||
const currentConfig = queryClient.getQueryData<CcwMcpConfig>(ccwMcpQueryKey) ?? ccwConfig;
|
||||
// Read BEFORE optimistic update to capture previous state for rollback
|
||||
const previousConfig = queryClient.getQueryData<CcwMcpConfig>(ccwMcpQueryKey);
|
||||
|
||||
// Optimistic cache update for immediate UI response
|
||||
@@ -422,8 +421,17 @@ export function McpManagerPage() {
|
||||
return { ...old, ...config };
|
||||
});
|
||||
|
||||
// Read AFTER optimistic update to get the latest merged state
|
||||
const currentConfig = queryClient.getQueryData<CcwMcpConfig>(ccwMcpQueryKey) ?? ccwConfig;
|
||||
|
||||
try {
|
||||
await updateCcwConfig({ ...currentConfig, ...config });
|
||||
// Only pass the fields that updateCcwConfig expects
|
||||
await updateCcwConfig({
|
||||
enabledTools: currentConfig.enabledTools,
|
||||
projectRoot: currentConfig.projectRoot,
|
||||
allowedDirs: currentConfig.allowedDirs,
|
||||
enableSandbox: currentConfig.enableSandbox,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Failed to update CCW config:', error);
|
||||
queryClient.setQueryData(ccwMcpQueryKey, previousConfig);
|
||||
|
||||
@@ -195,9 +195,21 @@ export const useQueueSchedulerStore = create<QueueSchedulerStore>()(
|
||||
'loadInitialState'
|
||||
);
|
||||
} catch (error) {
|
||||
// Silently ignore network errors (backend not connected)
|
||||
// Only log non-network errors
|
||||
const message = error instanceof Error ? error.message : 'Unknown error';
|
||||
console.error('[QueueScheduler] loadInitialState error:', message);
|
||||
set({ error: message }, false, 'loadInitialState/error');
|
||||
const isNetworkError =
|
||||
message.includes('Failed to fetch') ||
|
||||
message.includes('NetworkError') ||
|
||||
message.includes('Network request failed') ||
|
||||
message.includes('ERR_CONNECTION_REFUSED') ||
|
||||
message.includes('ERR_CONNECTION_RESET');
|
||||
|
||||
if (!isNetworkError) {
|
||||
console.error('[QueueScheduler] loadInitialState error:', message);
|
||||
set({ error: message }, false, 'loadInitialState/error');
|
||||
}
|
||||
// For network errors, keep state as-is without showing error
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -51,9 +51,11 @@ function notifyDashboard(data: Record<string, unknown>): void {
|
||||
path: '/api/hook',
|
||||
method: 'POST',
|
||||
timeout: 2000, // 2 second timeout to prevent hanging
|
||||
agent: false, // Disable Keep-Alive to allow process exit
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Content-Length': Buffer.byteLength(payload)
|
||||
'Content-Length': Buffer.byteLength(payload),
|
||||
'Connection': 'close' // Ensure connection closes after response
|
||||
}
|
||||
});
|
||||
|
||||
@@ -93,9 +95,11 @@ function broadcastStreamEvent(eventType: string, payload: Record<string, unknown
|
||||
path: '/api/hook',
|
||||
method: 'POST',
|
||||
timeout: 1000, // Short timeout for streaming
|
||||
agent: false, // Disable Keep-Alive to allow process exit
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Content-Length': Buffer.byteLength(data)
|
||||
'Content-Length': Buffer.byteLength(data),
|
||||
'Connection': 'close' // Ensure connection closes after response
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -56,6 +56,26 @@ export class CsrfTokenManager {
|
||||
*/
|
||||
generateToken(sessionId: string): string {
|
||||
const tokens = this.generateTokens(sessionId, 1);
|
||||
// If no slots available (session at max capacity), force generate anyway
|
||||
// This ensures we always return a valid token
|
||||
if (tokens.length === 0) {
|
||||
const token = randomBytes(32).toString('hex');
|
||||
const expiresAtMs = Date.now() + this.tokenTtlMs;
|
||||
const record: CsrfTokenRecord = {
|
||||
sessionId,
|
||||
expiresAtMs,
|
||||
used: false,
|
||||
};
|
||||
// Get or create session map
|
||||
let sessionMap = this.sessionTokens.get(sessionId);
|
||||
if (!sessionMap) {
|
||||
sessionMap = new Map();
|
||||
this.sessionTokens.set(sessionId, sessionMap);
|
||||
}
|
||||
sessionMap.set(token, record);
|
||||
this.tokenToSession.set(token, sessionId);
|
||||
return token;
|
||||
}
|
||||
return tokens[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -100,14 +100,16 @@ export async function handleAuthRoutes(ctx: RouteContext): Promise<boolean> {
|
||||
} else {
|
||||
// Batch token response (pool pattern)
|
||||
const tokens = tokenManager.generateTokens(sessionId, count);
|
||||
const firstToken = tokens[0];
|
||||
|
||||
// If no tokens generated (session at max capacity), force generate one
|
||||
const firstToken = tokens.length > 0 ? tokens[0] : tokenManager.generateToken(sessionId);
|
||||
|
||||
// Set header and cookie with first token for compatibility
|
||||
res.setHeader('X-CSRF-Token', firstToken);
|
||||
setCsrfCookie(res, firstToken, 15 * 60);
|
||||
res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
|
||||
res.end(JSON.stringify({
|
||||
tokens,
|
||||
tokens: tokens.length > 0 ? tokens : [firstToken],
|
||||
expiresIn: 15 * 60, // seconds
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -945,6 +945,11 @@ function addGlobalMcpServer(serverName: string, serverConfig: unknown) {
|
||||
config.mcpServers = {};
|
||||
}
|
||||
|
||||
// Debug logging for ccw-tools
|
||||
if (serverName === 'ccw-tools') {
|
||||
console.log('[addGlobalMcpServer] Saving ccw-tools config:', JSON.stringify(serverConfig, null, 2));
|
||||
}
|
||||
|
||||
// Add the server to top-level mcpServers
|
||||
config.mcpServers[serverName] = serverConfig;
|
||||
|
||||
|
||||
@@ -8,53 +8,53 @@ Project-URL: Homepage, https://github.com/openai/codex-lens
|
||||
Requires-Python: >=3.10
|
||||
Description-Content-Type: text/markdown
|
||||
License-File: LICENSE
|
||||
Requires-Dist: typer>=0.9
|
||||
Requires-Dist: rich>=13
|
||||
Requires-Dist: pydantic>=2.0
|
||||
Requires-Dist: tree-sitter>=0.20
|
||||
Requires-Dist: tree-sitter-python>=0.25
|
||||
Requires-Dist: tree-sitter-javascript>=0.25
|
||||
Requires-Dist: tree-sitter-typescript>=0.23
|
||||
Requires-Dist: pathspec>=0.11
|
||||
Requires-Dist: watchdog>=3.0
|
||||
Requires-Dist: ast-grep-py>=0.40.0
|
||||
Requires-Dist: typer~=0.9.0
|
||||
Requires-Dist: rich~=13.0.0
|
||||
Requires-Dist: pydantic~=2.0.0
|
||||
Requires-Dist: tree-sitter~=0.20.0
|
||||
Requires-Dist: tree-sitter-python~=0.25.0
|
||||
Requires-Dist: tree-sitter-javascript~=0.25.0
|
||||
Requires-Dist: tree-sitter-typescript~=0.23.0
|
||||
Requires-Dist: pathspec~=0.11.0
|
||||
Requires-Dist: watchdog~=3.0.0
|
||||
Requires-Dist: ast-grep-py~=0.40.0
|
||||
Provides-Extra: semantic
|
||||
Requires-Dist: numpy>=1.24; extra == "semantic"
|
||||
Requires-Dist: fastembed>=0.2; extra == "semantic"
|
||||
Requires-Dist: hnswlib>=0.8.0; extra == "semantic"
|
||||
Requires-Dist: numpy~=1.24.0; extra == "semantic"
|
||||
Requires-Dist: fastembed~=0.2.0; extra == "semantic"
|
||||
Requires-Dist: hnswlib~=0.8.0; extra == "semantic"
|
||||
Provides-Extra: semantic-gpu
|
||||
Requires-Dist: numpy>=1.24; extra == "semantic-gpu"
|
||||
Requires-Dist: fastembed>=0.2; extra == "semantic-gpu"
|
||||
Requires-Dist: hnswlib>=0.8.0; extra == "semantic-gpu"
|
||||
Requires-Dist: onnxruntime-gpu>=1.15.0; extra == "semantic-gpu"
|
||||
Requires-Dist: numpy~=1.24.0; extra == "semantic-gpu"
|
||||
Requires-Dist: fastembed~=0.2.0; extra == "semantic-gpu"
|
||||
Requires-Dist: hnswlib~=0.8.0; extra == "semantic-gpu"
|
||||
Requires-Dist: onnxruntime-gpu~=1.15.0; extra == "semantic-gpu"
|
||||
Provides-Extra: semantic-directml
|
||||
Requires-Dist: numpy>=1.24; extra == "semantic-directml"
|
||||
Requires-Dist: fastembed>=0.2; extra == "semantic-directml"
|
||||
Requires-Dist: hnswlib>=0.8.0; extra == "semantic-directml"
|
||||
Requires-Dist: onnxruntime-directml>=1.15.0; extra == "semantic-directml"
|
||||
Requires-Dist: numpy~=1.24.0; extra == "semantic-directml"
|
||||
Requires-Dist: fastembed~=0.2.0; extra == "semantic-directml"
|
||||
Requires-Dist: hnswlib~=0.8.0; extra == "semantic-directml"
|
||||
Requires-Dist: onnxruntime-directml~=1.15.0; extra == "semantic-directml"
|
||||
Provides-Extra: reranker-onnx
|
||||
Requires-Dist: optimum>=1.16; extra == "reranker-onnx"
|
||||
Requires-Dist: onnxruntime>=1.15; extra == "reranker-onnx"
|
||||
Requires-Dist: transformers>=4.36; extra == "reranker-onnx"
|
||||
Requires-Dist: optimum~=1.16.0; extra == "reranker-onnx"
|
||||
Requires-Dist: onnxruntime~=1.15.0; extra == "reranker-onnx"
|
||||
Requires-Dist: transformers~=4.36.0; extra == "reranker-onnx"
|
||||
Provides-Extra: reranker-api
|
||||
Requires-Dist: httpx>=0.25; extra == "reranker-api"
|
||||
Requires-Dist: httpx~=0.25.0; extra == "reranker-api"
|
||||
Provides-Extra: reranker-litellm
|
||||
Requires-Dist: ccw-litellm>=0.1; extra == "reranker-litellm"
|
||||
Requires-Dist: ccw-litellm~=0.1.0; extra == "reranker-litellm"
|
||||
Provides-Extra: reranker-legacy
|
||||
Requires-Dist: sentence-transformers>=2.2; extra == "reranker-legacy"
|
||||
Requires-Dist: sentence-transformers~=2.2.0; extra == "reranker-legacy"
|
||||
Provides-Extra: reranker
|
||||
Requires-Dist: optimum>=1.16; extra == "reranker"
|
||||
Requires-Dist: onnxruntime>=1.15; extra == "reranker"
|
||||
Requires-Dist: transformers>=4.36; extra == "reranker"
|
||||
Requires-Dist: optimum~=1.16.0; extra == "reranker"
|
||||
Requires-Dist: onnxruntime~=1.15.0; extra == "reranker"
|
||||
Requires-Dist: transformers~=4.36.0; extra == "reranker"
|
||||
Provides-Extra: encoding
|
||||
Requires-Dist: chardet>=5.0; extra == "encoding"
|
||||
Requires-Dist: chardet~=5.0.0; extra == "encoding"
|
||||
Provides-Extra: clustering
|
||||
Requires-Dist: hdbscan>=0.8.1; extra == "clustering"
|
||||
Requires-Dist: scikit-learn>=1.3.0; extra == "clustering"
|
||||
Requires-Dist: hdbscan~=0.8.1; extra == "clustering"
|
||||
Requires-Dist: scikit-learn~=1.3.0; extra == "clustering"
|
||||
Provides-Extra: full
|
||||
Requires-Dist: tiktoken>=0.5.0; extra == "full"
|
||||
Requires-Dist: tiktoken~=0.5.0; extra == "full"
|
||||
Provides-Extra: lsp
|
||||
Requires-Dist: pygls>=1.3.0; extra == "lsp"
|
||||
Requires-Dist: pygls~=1.3.0; extra == "lsp"
|
||||
Dynamic: license-file
|
||||
|
||||
# CodexLens
|
||||
|
||||
@@ -153,10 +153,12 @@ tests/test_hybrid_chunker.py
|
||||
tests/test_hybrid_search_e2e.py
|
||||
tests/test_hybrid_search_reranker_backend.py
|
||||
tests/test_hybrid_search_unit.py
|
||||
tests/test_incremental_indexer.py
|
||||
tests/test_incremental_indexing.py
|
||||
tests/test_litellm_reranker.py
|
||||
tests/test_lsp_graph_builder_depth.py
|
||||
tests/test_merkle_detection.py
|
||||
tests/test_migrations.py
|
||||
tests/test_parser_integration.py
|
||||
tests/test_parsers.py
|
||||
tests/test_path_mapper_windows_drive.py
|
||||
|
||||
@@ -1,59 +1,59 @@
|
||||
typer>=0.9
|
||||
rich>=13
|
||||
pydantic>=2.0
|
||||
tree-sitter>=0.20
|
||||
tree-sitter-python>=0.25
|
||||
tree-sitter-javascript>=0.25
|
||||
tree-sitter-typescript>=0.23
|
||||
pathspec>=0.11
|
||||
watchdog>=3.0
|
||||
ast-grep-py>=0.40.0
|
||||
typer~=0.9.0
|
||||
rich~=13.0.0
|
||||
pydantic~=2.0.0
|
||||
tree-sitter~=0.20.0
|
||||
tree-sitter-python~=0.25.0
|
||||
tree-sitter-javascript~=0.25.0
|
||||
tree-sitter-typescript~=0.23.0
|
||||
pathspec~=0.11.0
|
||||
watchdog~=3.0.0
|
||||
ast-grep-py~=0.40.0
|
||||
|
||||
[clustering]
|
||||
hdbscan>=0.8.1
|
||||
scikit-learn>=1.3.0
|
||||
hdbscan~=0.8.1
|
||||
scikit-learn~=1.3.0
|
||||
|
||||
[encoding]
|
||||
chardet>=5.0
|
||||
chardet~=5.0.0
|
||||
|
||||
[full]
|
||||
tiktoken>=0.5.0
|
||||
tiktoken~=0.5.0
|
||||
|
||||
[lsp]
|
||||
pygls>=1.3.0
|
||||
pygls~=1.3.0
|
||||
|
||||
[reranker]
|
||||
optimum>=1.16
|
||||
onnxruntime>=1.15
|
||||
transformers>=4.36
|
||||
optimum~=1.16.0
|
||||
onnxruntime~=1.15.0
|
||||
transformers~=4.36.0
|
||||
|
||||
[reranker-api]
|
||||
httpx>=0.25
|
||||
httpx~=0.25.0
|
||||
|
||||
[reranker-legacy]
|
||||
sentence-transformers>=2.2
|
||||
sentence-transformers~=2.2.0
|
||||
|
||||
[reranker-litellm]
|
||||
ccw-litellm>=0.1
|
||||
ccw-litellm~=0.1.0
|
||||
|
||||
[reranker-onnx]
|
||||
optimum>=1.16
|
||||
onnxruntime>=1.15
|
||||
transformers>=4.36
|
||||
optimum~=1.16.0
|
||||
onnxruntime~=1.15.0
|
||||
transformers~=4.36.0
|
||||
|
||||
[semantic]
|
||||
numpy>=1.24
|
||||
fastembed>=0.2
|
||||
hnswlib>=0.8.0
|
||||
numpy~=1.24.0
|
||||
fastembed~=0.2.0
|
||||
hnswlib~=0.8.0
|
||||
|
||||
[semantic-directml]
|
||||
numpy>=1.24
|
||||
fastembed>=0.2
|
||||
hnswlib>=0.8.0
|
||||
onnxruntime-directml>=1.15.0
|
||||
numpy~=1.24.0
|
||||
fastembed~=0.2.0
|
||||
hnswlib~=0.8.0
|
||||
onnxruntime-directml~=1.15.0
|
||||
|
||||
[semantic-gpu]
|
||||
numpy>=1.24
|
||||
fastembed>=0.2
|
||||
hnswlib>=0.8.0
|
||||
onnxruntime-gpu>=1.15.0
|
||||
numpy~=1.24.0
|
||||
fastembed~=0.2.0
|
||||
hnswlib~=0.8.0
|
||||
onnxruntime-gpu~=1.15.0
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "claude-code-workflow",
|
||||
"version": "7.1.0",
|
||||
"version": "7.2.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "claude-code-workflow",
|
||||
"version": "7.1.0",
|
||||
"version": "7.2.0",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"workspaces": [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-code-workflow",
|
||||
"version": "7.1.0",
|
||||
"version": "7.2.1",
|
||||
"description": "JSON-driven multi-agent development framework with intelligent CLI orchestration (Gemini/Qwen/Codex), context-first architecture, and automated workflow execution",
|
||||
"type": "module",
|
||||
"main": "ccw/dist/index.js",
|
||||
|
||||
Reference in New Issue
Block a user