claude-code-workflow 6.3.48 → 6.3.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/.claude/CLAUDE.md +6 -8
  2. package/.claude/agents/action-planning-agent.md +28 -45
  3. package/.claude/agents/cli-lite-planning-agent.md +93 -1
  4. package/.claude/agents/code-developer.md +144 -27
  5. package/.claude/commands/ccw-coordinator.md +175 -21
  6. package/.claude/commands/ccw-debug.md +832 -0
  7. package/.claude/commands/ccw.md +90 -9
  8. package/.claude/commands/cli/cli-init.md +1 -0
  9. package/.claude/commands/issue/convert-to-plan.md +718 -0
  10. package/.claude/commands/issue/from-brainstorm.md +382 -0
  11. package/.claude/commands/memory/tips.md +332 -0
  12. package/.claude/commands/workflow/analyze-with-file.md +804 -0
  13. package/.claude/commands/workflow/brainstorm/auto-parallel.md +18 -43
  14. package/.claude/commands/workflow/brainstorm/role-analysis.md +705 -0
  15. package/.claude/commands/workflow/brainstorm-with-file.md +1153 -0
  16. package/.claude/commands/workflow/debug-with-file.md +7 -5
  17. package/.claude/commands/workflow/execute.md +6 -4
  18. package/.claude/commands/workflow/lite-plan.md +2 -2
  19. package/.claude/commands/workflow/plan-verify.md +162 -327
  20. package/.claude/commands/workflow/plan.md +162 -26
  21. package/.claude/commands/workflow/replan.md +78 -2
  22. package/.claude/commands/workflow/{review-fix.md → review-cycle-fix.md} +6 -6
  23. package/.claude/commands/workflow/review-module-cycle.md +2 -2
  24. package/.claude/commands/workflow/review-session-cycle.md +2 -2
  25. package/.claude/commands/workflow/tools/conflict-resolution.md +16 -26
  26. package/.claude/commands/workflow/tools/context-gather.md +81 -118
  27. package/.claude/commands/workflow/tools/task-generate-agent.md +94 -10
  28. package/.claude/skills/ccw-help/command.json +4 -4
  29. package/.claude/skills/lite-skill-generator/SKILL.md +650 -0
  30. package/.claude/skills/lite-skill-generator/templates/simple-skill.md +68 -0
  31. package/.claude/skills/lite-skill-generator/templates/style-guide.md +64 -0
  32. package/.claude/skills/skill-generator/SKILL.md +277 -85
  33. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +4 -15
  34. package/.claude/skills/skill-generator/phases/02-structure-generation.md +72 -17
  35. package/.claude/skills/skill-generator/phases/03-phase-generation.md +218 -51
  36. package/.claude/skills/skill-generator/phases/04-specs-templates.md +111 -41
  37. package/.claude/skills/skill-generator/phases/05-validation.md +139 -56
  38. package/.claude/skills/skill-generator/templates/autonomous-action.md +78 -268
  39. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +14 -0
  40. package/.claude/skills/skill-generator/templates/code-analysis-action.md +12 -0
  41. package/.claude/skills/skill-generator/templates/llm-action.md +12 -0
  42. package/.claude/skills/skill-generator/templates/script-template.md +368 -0
  43. package/.claude/skills/skill-generator/templates/sequential-phase.md +14 -0
  44. package/.claude/skills/skill-generator/templates/skill-md.md +14 -0
  45. package/.claude/skills/skill-tuning/SKILL.md +130 -266
  46. package/.claude/skills/skill-tuning/phases/orchestrator.md +95 -283
  47. package/.claude/skills/skill-tuning/specs/problem-taxonomy.md +90 -198
  48. package/.claude/skills/skill-tuning/specs/tuning-strategies.md +193 -1345
  49. package/.claude/workflows/cli-templates/schemas/plan-verify-agent-schema.json +47 -0
  50. package/.claude/workflows/cli-templates/schemas/verify-json-schema.json +158 -0
  51. package/.claude/workflows/cli-tools-usage.md +1 -1
  52. package/.codex/AGENTS.md +1 -3
  53. package/.codex/prompts/analyze-with-file.md +607 -0
  54. package/.codex/prompts/brainstorm-to-cycle.md +455 -0
  55. package/.codex/prompts/brainstorm-with-file.md +933 -0
  56. package/.codex/prompts/debug-with-file.md +15 -20
  57. package/.codex/skills/ccw-cli-tools/SKILL.md +559 -0
  58. package/ccw/dist/commands/cli.d.ts.map +1 -1
  59. package/ccw/dist/commands/cli.js +29 -5
  60. package/ccw/dist/commands/cli.js.map +1 -1
  61. package/ccw/dist/commands/issue.d.ts +2 -0
  62. package/ccw/dist/commands/issue.d.ts.map +1 -1
  63. package/ccw/dist/commands/issue.js +62 -20
  64. package/ccw/dist/commands/issue.js.map +1 -1
  65. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  66. package/ccw/dist/config/litellm-api-config-manager.js +5 -3
  67. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  68. package/ccw/dist/config/litellm-provider-models.d.ts +73 -0
  69. package/ccw/dist/config/litellm-provider-models.d.ts.map +1 -0
  70. package/ccw/dist/config/litellm-provider-models.js +172 -0
  71. package/ccw/dist/config/litellm-provider-models.js.map +1 -0
  72. package/ccw/dist/config/provider-models.d.ts +25 -51
  73. package/ccw/dist/config/provider-models.d.ts.map +1 -1
  74. package/ccw/dist/config/provider-models.js +84 -149
  75. package/ccw/dist/config/provider-models.js.map +1 -1
  76. package/ccw/dist/config/storage-paths.d.ts.map +1 -1
  77. package/ccw/dist/config/storage-paths.js +23 -5
  78. package/ccw/dist/config/storage-paths.js.map +1 -1
  79. package/ccw/dist/core/auth/csrf-middleware.js +3 -3
  80. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -1
  81. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  82. package/ccw/dist/core/dashboard-generator.js +3 -1
  83. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  84. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  85. package/ccw/dist/core/routes/claude-routes.js +206 -14
  86. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  87. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  88. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  89. package/ccw/dist/core/routes/commands-routes.d.ts +7 -0
  90. package/ccw/dist/core/routes/commands-routes.d.ts.map +1 -0
  91. package/ccw/dist/core/routes/commands-routes.js +480 -0
  92. package/ccw/dist/core/routes/commands-routes.js.map +1 -0
  93. package/ccw/dist/core/routes/model-routes.d.ts +11 -0
  94. package/ccw/dist/core/routes/model-routes.d.ts.map +1 -0
  95. package/ccw/dist/core/routes/model-routes.js +112 -0
  96. package/ccw/dist/core/routes/model-routes.js.map +1 -0
  97. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -1
  98. package/ccw/dist/core/routes/nav-status-routes.js +84 -1
  99. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -1
  100. package/ccw/dist/core/routes/provider-routes.d.ts +11 -0
  101. package/ccw/dist/core/routes/provider-routes.d.ts.map +1 -0
  102. package/ccw/dist/core/routes/provider-routes.js +67 -0
  103. package/ccw/dist/core/routes/provider-routes.js.map +1 -0
  104. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  105. package/ccw/dist/core/routes/skills-routes.js +219 -7
  106. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  107. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  108. package/ccw/dist/core/routes/system-routes.js +58 -6
  109. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  110. package/ccw/dist/core/server.d.ts.map +1 -1
  111. package/ccw/dist/core/server.js +13 -0
  112. package/ccw/dist/core/server.js.map +1 -1
  113. package/ccw/dist/mcp-server/index.js +2 -2
  114. package/ccw/dist/mcp-server/index.js.map +1 -1
  115. package/ccw/dist/tools/claude-cli-tools.d.ts +48 -11
  116. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  117. package/ccw/dist/tools/claude-cli-tools.js +146 -50
  118. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  119. package/ccw/dist/tools/cli-config-manager.d.ts +1 -13
  120. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  121. package/ccw/dist/tools/cli-config-manager.js +3 -27
  122. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  123. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -1
  124. package/ccw/dist/tools/cli-executor-core.js +7 -2
  125. package/ccw/dist/tools/cli-executor-core.js.map +1 -1
  126. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -1
  127. package/ccw/dist/tools/cli-history-store.d.ts +11 -0
  128. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  129. package/ccw/dist/tools/cli-history-store.js +82 -2
  130. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  131. package/ccw/dist/tools/command-registry.d.ts +7 -0
  132. package/ccw/dist/tools/command-registry.d.ts.map +1 -1
  133. package/ccw/dist/tools/command-registry.js +14 -1
  134. package/ccw/dist/tools/command-registry.js.map +1 -1
  135. package/ccw/dist/tools/generate-module-docs.d.ts.map +1 -1
  136. package/ccw/dist/tools/generate-module-docs.js +11 -7
  137. package/ccw/dist/tools/generate-module-docs.js.map +1 -1
  138. package/ccw/dist/tools/litellm-executor.d.ts +1 -0
  139. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  140. package/ccw/dist/tools/litellm-executor.js +11 -9
  141. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  142. package/ccw/dist/types/skill-types.d.ts +97 -0
  143. package/ccw/dist/types/skill-types.d.ts.map +1 -0
  144. package/ccw/dist/types/skill-types.js +6 -0
  145. package/ccw/dist/types/skill-types.js.map +1 -0
  146. package/ccw/src/commands/cli.ts +36 -5
  147. package/ccw/src/commands/issue.ts +81 -26
  148. package/ccw/src/config/litellm-api-config-manager.ts +5 -3
  149. package/ccw/src/config/litellm-provider-models.ts +222 -0
  150. package/ccw/src/config/provider-models.ts +91 -190
  151. package/ccw/src/config/storage-paths.ts +20 -5
  152. package/ccw/src/core/auth/csrf-middleware.ts +3 -3
  153. package/ccw/src/core/dashboard-generator.ts +3 -1
  154. package/ccw/src/core/routes/claude-routes.ts +233 -15
  155. package/ccw/src/core/routes/cli-routes.ts +2 -3
  156. package/ccw/src/core/routes/commands-routes.ts +620 -0
  157. package/ccw/src/core/routes/nav-status-routes.ts +95 -1
  158. package/ccw/src/core/routes/provider-routes.ts +78 -0
  159. package/ccw/src/core/routes/skills-routes.ts +266 -45
  160. package/ccw/src/core/routes/system-routes.ts +102 -50
  161. package/ccw/src/core/server.ts +13 -0
  162. package/ccw/src/mcp-server/index.ts +2 -2
  163. package/ccw/src/templates/dashboard-css/18-cli-settings.css +35 -0
  164. package/ccw/src/templates/dashboard-css/37-commands.css +193 -0
  165. package/ccw/src/templates/dashboard-js/components/navigation.js +4 -0
  166. package/ccw/src/templates/dashboard-js/i18n.js +116 -0
  167. package/ccw/src/templates/dashboard-js/views/cli-manager.js +249 -4
  168. package/ccw/src/templates/dashboard-js/views/commands-manager.js +503 -0
  169. package/ccw/src/templates/dashboard-js/views/issue-manager.js +7 -7
  170. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2 -7
  171. package/ccw/src/templates/dashboard-js/views/skills-manager.js +164 -23
  172. package/ccw/src/templates/dashboard.html +7 -0
  173. package/ccw/src/tools/claude-cli-tools.ts +170 -56
  174. package/ccw/src/tools/cli-config-manager.ts +2 -33
  175. package/ccw/src/tools/cli-executor-core.ts +8 -2
  176. package/ccw/src/tools/cli-history-store.ts +92 -2
  177. package/ccw/src/tools/command-registry.ts +16 -1
  178. package/ccw/src/tools/generate-module-docs.ts +11 -7
  179. package/ccw/src/tools/litellm-executor.ts +13 -9
  180. package/ccw/src/types/skill-types.ts +99 -0
  181. package/package.json +1 -1
  182. package/.claude/commands/enhance-prompt.md +0 -93
  183. package/.claude/commands/memory/code-map-memory.md +0 -687
  184. package/.claude/commands/memory/docs.md +0 -615
  185. package/.claude/commands/memory/load-skill-memory.md +0 -182
  186. package/.claude/commands/memory/skill-memory.md +0 -525
  187. package/.claude/commands/memory/swagger-docs.md +0 -773
  188. package/.claude/commands/memory/tech-research-rules.md +0 -310
  189. package/.claude/commands/memory/workflow-skill-memory.md +0 -517
  190. package/.claude/commands/task/breakdown.md +0 -208
  191. package/.claude/commands/task/create.md +0 -152
  192. package/.claude/commands/task/execute.md +0 -270
  193. package/.claude/commands/task/replan.md +0 -441
  194. package/.claude/commands/version.md +0 -254
  195. package/.claude/commands/workflow/action-plan-verify.md +0 -485
  196. package/.claude/commands/workflow/brainstorm/api-designer.md +0 -587
  197. package/.claude/commands/workflow/brainstorm/data-architect.md +0 -220
  198. package/.claude/commands/workflow/brainstorm/product-manager.md +0 -200
  199. package/.claude/commands/workflow/brainstorm/product-owner.md +0 -200
  200. package/.claude/commands/workflow/brainstorm/scrum-master.md +0 -200
  201. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  202. package/.claude/commands/workflow/brainstorm/system-architect.md +0 -389
  203. package/.claude/commands/workflow/brainstorm/ui-designer.md +0 -221
  204. package/.claude/commands/workflow/brainstorm/ux-expert.md +0 -221
  205. package/.claude/commands/workflow/debug.md +0 -331
  206. package/.claude/commands/workflow/develop-with-file.md +0 -1044
  207. package/.claude/skills/ccw-loop/README.md +0 -303
  208. package/.claude/skills/skill-generator/templates/script-bash.md +0 -277
  209. package/.claude/skills/skill-generator/templates/script-python.md +0 -198
  210. package/.codex/prompts/debug.md +0 -318
  211. package/ccw/src/core/routes/mcp-routes.ts.backup +0 -549
@@ -1,222 +1,123 @@
1
1
  /**
2
- * Provider Model Presets
2
+ * CLI Tool Model Reference Library
3
3
  *
4
- * Predefined model information for each supported LLM provider.
5
- * Used for UI dropdowns and validation.
4
+ * System reference for available models per CLI tool provider.
5
+ * This is a read-only reference, NOT user configuration.
6
+ * User configuration is managed via tools.{tool}.primaryModel/secondaryModel in cli-tools.json
6
7
  */
7
8
 
8
- import type { ProviderType } from '../types/litellm-api-config.js';
9
-
10
- /**
11
- * Model information metadata
12
- */
13
- export interface ModelInfo {
14
- /** Model identifier (used in API calls) */
9
+ export interface ProviderModelInfo {
15
10
  id: string;
16
-
17
- /** Human-readable display name */
18
11
  name: string;
19
-
20
- /** Context window size in tokens */
21
- contextWindow: number;
22
-
23
- /** Whether this model supports prompt caching */
24
- supportsCaching: boolean;
12
+ capabilities?: string[];
13
+ contextWindow?: number;
14
+ deprecated?: boolean;
25
15
  }
26
16
 
27
- /**
28
- * Embedding model information metadata
29
- */
30
- export interface EmbeddingModelInfo {
31
- /** Model identifier (used in API calls) */
32
- id: string;
33
-
34
- /** Human-readable display name */
17
+ export interface ProviderInfo {
35
18
  name: string;
36
-
37
- /** Embedding dimensions */
38
- dimensions: number;
39
-
40
- /** Maximum input tokens */
41
- maxTokens: number;
42
-
43
- /** Provider identifier */
44
- provider: string;
19
+ models: ProviderModelInfo[];
45
20
  }
46
21
 
47
-
48
22
  /**
49
- * Predefined models for each API format
50
- * Used for UI selection and validation
51
- * Note: Most providers use OpenAI-compatible format
23
+ * System reference for CLI tool models
24
+ * Maps provider names to their available models
52
25
  */
53
- export const PROVIDER_MODELS: Record<ProviderType, ModelInfo[]> = {
54
- // OpenAI-compatible format (used by OpenAI, DeepSeek, Ollama, etc.)
55
- openai: [
56
- {
57
- id: 'gpt-4o',
58
- name: 'GPT-4o',
59
- contextWindow: 128000,
60
- supportsCaching: true
61
- },
62
- {
63
- id: 'gpt-4o-mini',
64
- name: 'GPT-4o Mini',
65
- contextWindow: 128000,
66
- supportsCaching: true
67
- },
68
- {
69
- id: 'o1',
70
- name: 'O1',
71
- contextWindow: 200000,
72
- supportsCaching: true
73
- },
74
- {
75
- id: 'deepseek-chat',
76
- name: 'DeepSeek Chat',
77
- contextWindow: 64000,
78
- supportsCaching: false
79
- },
80
- {
81
- id: 'deepseek-coder',
82
- name: 'DeepSeek Coder',
83
- contextWindow: 64000,
84
- supportsCaching: false
85
- },
86
- {
87
- id: 'llama3.2',
88
- name: 'Llama 3.2',
89
- contextWindow: 128000,
90
- supportsCaching: false
91
- },
92
- {
93
- id: 'qwen2.5-coder',
94
- name: 'Qwen 2.5 Coder',
95
- contextWindow: 32000,
96
- supportsCaching: false
97
- }
98
- ],
99
-
100
- // Anthropic format
101
- anthropic: [
102
- {
103
- id: 'claude-sonnet-4-20250514',
104
- name: 'Claude Sonnet 4',
105
- contextWindow: 200000,
106
- supportsCaching: true
107
- },
108
- {
109
- id: 'claude-3-5-sonnet-20241022',
110
- name: 'Claude 3.5 Sonnet',
111
- contextWindow: 200000,
112
- supportsCaching: true
113
- },
114
- {
115
- id: 'claude-3-5-haiku-20241022',
116
- name: 'Claude 3.5 Haiku',
117
- contextWindow: 200000,
118
- supportsCaching: true
119
- },
120
- {
121
- id: 'claude-3-opus-20240229',
122
- name: 'Claude 3 Opus',
123
- contextWindow: 200000,
124
- supportsCaching: false
125
- }
126
- ],
127
-
128
- // Custom format
129
- custom: [
130
- {
131
- id: 'custom-model',
132
- name: 'Custom Model',
133
- contextWindow: 128000,
134
- supportsCaching: false
135
- }
136
- ]
137
- };
26
+ export const PROVIDER_MODELS: Record<string, ProviderInfo> = {
27
+ google: {
28
+ name: 'Google AI',
29
+ models: [
30
+ { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', capabilities: ['text', 'vision', 'code'], contextWindow: 1000000 },
31
+ { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', capabilities: ['text', 'code'], contextWindow: 1000000 },
32
+ { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', capabilities: ['text'], contextWindow: 1000000 },
33
+ { id: 'gemini-1.5-pro', name: 'Gemini 1.5 Pro', capabilities: ['text', 'vision'], contextWindow: 2000000 },
34
+ { id: 'gemini-1.5-flash', name: 'Gemini 1.5 Flash', capabilities: ['text'], contextWindow: 1000000 }
35
+ ]
36
+ },
37
+ qwen: {
38
+ name: 'Qwen',
39
+ models: [
40
+ { id: 'coder-model', name: 'Qwen Coder', capabilities: ['code'] },
41
+ { id: 'vision-model', name: 'Qwen Vision', capabilities: ['vision'] },
42
+ { id: 'qwen2.5-coder-32b', name: 'Qwen 2.5 Coder 32B', capabilities: ['code'] }
43
+ ]
44
+ },
45
+ openai: {
46
+ name: 'OpenAI',
47
+ models: [
48
+ { id: 'gpt-5.2', name: 'GPT-5.2', capabilities: ['text', 'code'] },
49
+ { id: 'gpt-4.1', name: 'GPT-4.1', capabilities: ['text', 'code'] },
50
+ { id: 'o4-mini', name: 'O4 Mini', capabilities: ['text'] },
51
+ { id: 'o3', name: 'O3', capabilities: ['text'] }
52
+ ]
53
+ },
54
+ anthropic: {
55
+ name: 'Anthropic',
56
+ models: [
57
+ { id: 'sonnet', name: 'Claude Sonnet', capabilities: ['text', 'code'] },
58
+ { id: 'opus', name: 'Claude Opus', capabilities: ['text', 'code', 'vision'] },
59
+ { id: 'haiku', name: 'Claude Haiku', capabilities: ['text'] },
60
+ { id: 'claude-sonnet-4-5-20250929', name: 'Claude 4.5 Sonnet (2025-09-29)', capabilities: ['text', 'code'] },
61
+ { id: 'claude-opus-4-5-20251101', name: 'Claude 4.5 Opus (2025-11-01)', capabilities: ['text', 'code', 'vision'] }
62
+ ]
63
+ },
64
+ litellm: {
65
+ name: 'LiteLLM Aggregator',
66
+ models: [
67
+ { id: 'opencode/glm-4.7-free', name: 'GLM-4.7 Free', capabilities: ['text'] },
68
+ { id: 'opencode/gpt-5-nano', name: 'GPT-5 Nano', capabilities: ['text'] },
69
+ { id: 'opencode/grok-code', name: 'Grok Code', capabilities: ['code'] },
70
+ { id: 'opencode/minimax-m2.1-free', name: 'MiniMax M2.1 Free', capabilities: ['text'] },
71
+ { id: 'anthropic/claude-sonnet-4-20250514', name: 'Claude Sonnet 4 (via LiteLLM)', capabilities: ['text'] },
72
+ { id: 'anthropic/claude-opus-4-20250514', name: 'Claude Opus 4 (via LiteLLM)', capabilities: ['text'] },
73
+ { id: 'openai/gpt-4.1', name: 'GPT-4.1 (via LiteLLM)', capabilities: ['text'] },
74
+ { id: 'openai/o3', name: 'O3 (via LiteLLM)', capabilities: ['text'] },
75
+ { id: 'google/gemini-2.5-pro', name: 'Gemini 2.5 Pro (via LiteLLM)', capabilities: ['text'] },
76
+ { id: 'google/gemini-2.5-flash', name: 'Gemini 2.5 Flash (via LiteLLM)', capabilities: ['text'] }
77
+ ]
78
+ }
79
+ } as const;
138
80
 
139
81
  /**
140
82
  * Get models for a specific provider
141
- * @param providerType - Provider type to get models for
83
+ * @param provider - Provider name (e.g., 'google', 'qwen', 'openai', 'anthropic', 'litellm')
142
84
  * @returns Array of model information
143
85
  */
144
- export function getModelsForProvider(providerType: ProviderType): ModelInfo[] {
145
- return PROVIDER_MODELS[providerType] || [];
86
+ export function getProviderModels(provider: string): ProviderModelInfo[] {
87
+ return PROVIDER_MODELS[provider]?.models || [];
146
88
  }
147
89
 
148
90
  /**
149
- * Predefined embedding models for each API format
150
- * Used for UI selection and validation
91
+ * Get all provider names
92
+ * @returns Array of provider names
151
93
  */
152
- export const EMBEDDING_MODELS: Record<ProviderType, EmbeddingModelInfo[]> = {
153
- // OpenAI embedding models
154
- openai: [
155
- {
156
- id: 'text-embedding-3-small',
157
- name: 'Text Embedding 3 Small',
158
- dimensions: 1536,
159
- maxTokens: 8191,
160
- provider: 'openai'
161
- },
162
- {
163
- id: 'text-embedding-3-large',
164
- name: 'Text Embedding 3 Large',
165
- dimensions: 3072,
166
- maxTokens: 8191,
167
- provider: 'openai'
168
- },
169
- {
170
- id: 'text-embedding-ada-002',
171
- name: 'Ada 002',
172
- dimensions: 1536,
173
- maxTokens: 8191,
174
- provider: 'openai'
175
- }
176
- ],
177
-
178
- // Anthropic doesn't have embedding models
179
- anthropic: [],
180
-
181
- // Custom embedding models
182
- custom: [
183
- {
184
- id: 'custom-embedding',
185
- name: 'Custom Embedding',
186
- dimensions: 1536,
187
- maxTokens: 8192,
188
- provider: 'custom'
189
- }
190
- ]
191
- };
192
-
193
- /**
194
- * Get embedding models for a specific provider
195
- * @param providerType - Provider type to get embedding models for
196
- * @returns Array of embedding model information
197
- */
198
- export function getEmbeddingModelsForProvider(providerType: ProviderType): EmbeddingModelInfo[] {
199
- return EMBEDDING_MODELS[providerType] || [];
94
+ export function getAllProviders(): string[] {
95
+ return Object.keys(PROVIDER_MODELS);
200
96
  }
201
97
 
202
-
203
98
  /**
204
- * Get model information by ID within a provider
205
- * @param providerType - Provider type
206
- * @param modelId - Model identifier
99
+ * Find model information across all providers
100
+ * @param modelId - Model identifier to search for
207
101
  * @returns Model information or undefined if not found
208
102
  */
209
- export function getModelInfo(providerType: ProviderType, modelId: string): ModelInfo | undefined {
210
- const models = PROVIDER_MODELS[providerType] || [];
211
- return models.find(m => m.id === modelId);
103
+ export function findModelInfo(modelId: string): ProviderModelInfo | undefined {
104
+ for (const provider of Object.values(PROVIDER_MODELS)) {
105
+ const model = provider.models.find(m => m.id === modelId);
106
+ if (model) return model;
107
+ }
108
+ return undefined;
212
109
  }
213
110
 
214
111
  /**
215
- * Validate if a model ID is supported by a provider
216
- * @param providerType - Provider type
217
- * @param modelId - Model identifier to validate
218
- * @returns true if model is valid for provider
112
+ * Get provider name for a model ID
113
+ * @param modelId - Model identifier
114
+ * @returns Provider name or undefined if not found
219
115
  */
220
- export function isValidModel(providerType: ProviderType, modelId: string): boolean {
221
- return getModelInfo(providerType, modelId) !== undefined;
116
+ export function getProviderForModel(modelId: string): string | undefined {
117
+ for (const [providerId, provider] of Object.entries(PROVIDER_MODELS)) {
118
+ if (provider.models.some(m => m.id === modelId)) {
119
+ return providerId;
120
+ }
121
+ }
122
+ return undefined;
222
123
  }
@@ -8,7 +8,7 @@
8
8
  import { homedir } from 'os';
9
9
  import { join, resolve, dirname, relative, sep } from 'path';
10
10
  import { createHash } from 'crypto';
11
- import { existsSync, mkdirSync, renameSync, rmSync, readdirSync } from 'fs';
11
+ import { existsSync, mkdirSync, renameSync, rmSync, readdirSync, cpSync } from 'fs';
12
12
  import { readdir } from 'fs/promises';
13
13
 
14
14
  // Environment variable override for custom storage location
@@ -211,14 +211,29 @@ function migrateToHierarchical(legacyDir: string, targetDir: string): void {
211
211
  const target = join(targetDir, subDir);
212
212
 
213
213
  if (existsSync(source)) {
214
- // Use atomic rename (same filesystem)
214
+ // Try atomic rename first (fastest, same filesystem)
215
215
  try {
216
216
  renameSync(source, target);
217
217
  console.log(` ✓ 迁移 ${subDir}`);
218
218
  } catch (error: any) {
219
- // If rename fails (cross-filesystem), fallback to copy-delete
220
- // For now, we'll just throw the error
221
- throw new Error(`无法迁移 ${subDir}: ${error.message}`);
219
+ // If rename fails (EPERM, cross-filesystem, etc.), fallback to copy-delete
220
+ if (error.code === 'EPERM' || error.code === 'EXDEV' || error.code === 'EBUSY') {
221
+ try {
222
+ console.log(` ⚠️ rename 失败,使用 copy-delete 方式迁移 ${subDir}...`);
223
+ cpSync(source, target, { recursive: true, force: true });
224
+ // Verify copy succeeded before deleting source
225
+ if (existsSync(target)) {
226
+ rmSync(source, { recursive: true, force: true });
227
+ console.log(` ✓ 迁移 ${subDir} (copy-delete)`);
228
+ } else {
229
+ throw new Error('复制失败:目标目录不存在');
230
+ }
231
+ } catch (copyError: any) {
232
+ throw new Error(`无法迁移 ${subDir}: ${copyError.message}`);
233
+ }
234
+ } else {
235
+ throw new Error(`无法迁移 ${subDir}: ${error.message}`);
236
+ }
222
237
  }
223
238
  }
224
239
  }
@@ -113,9 +113,9 @@ export async function csrfValidation(ctx: CsrfMiddlewareContext): Promise<boolea
113
113
  const { pathname, req, res } = ctx;
114
114
 
115
115
  if (!pathname.startsWith('/api/')) return true;
116
- // CSRF is disabled by default for local deployment scenarios.
117
- // Set CCW_ENABLE_CSRF=1 to enable CSRF protection.
118
- if (!envFlagEnabled('CCW_ENABLE_CSRF')) return true;
116
+ // CSRF is enabled by default for security.
117
+ // Set CCW_DISABLE_CSRF=1 to disable CSRF protection for local development.
118
+ if (envFlagEnabled('CCW_DISABLE_CSRF')) return true;
119
119
 
120
120
  const method = (req.method || 'GET').toUpperCase();
121
121
  if (!['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) return true;
@@ -102,7 +102,8 @@ const MODULE_CSS_FILES = [
102
102
  '32-issue-manager.css',
103
103
  '33-cli-stream-viewer.css',
104
104
  '34-discovery.css',
105
- '36-loop-monitor.css'
105
+ '36-loop-monitor.css',
106
+ '37-commands.css'
106
107
  ];
107
108
 
108
109
  const MODULE_FILES = [
@@ -151,6 +152,7 @@ const MODULE_FILES = [
151
152
  'views/prompt-history.js',
152
153
  'views/skills-manager.js',
153
154
  'views/rules-manager.js',
155
+ 'views/commands-manager.js',
154
156
  'views/claude-manager.js',
155
157
  'views/api-settings.js',
156
158
  'views/issue-manager.js',