@sylphx/flow 2.1.2 → 2.1.4

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 (70) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +44 -0
  3. package/package.json +79 -73
  4. package/src/commands/flow/execute-v2.ts +39 -30
  5. package/src/commands/flow/index.ts +2 -4
  6. package/src/commands/flow/prompt.ts +5 -3
  7. package/src/commands/flow/types.ts +0 -9
  8. package/src/commands/flow-command.ts +20 -13
  9. package/src/commands/hook-command.ts +1 -3
  10. package/src/commands/settings-command.ts +36 -33
  11. package/src/config/ai-config.ts +60 -41
  12. package/src/core/agent-loader.ts +11 -6
  13. package/src/core/attach-manager.ts +92 -84
  14. package/src/core/backup-manager.ts +35 -29
  15. package/src/core/cleanup-handler.ts +11 -8
  16. package/src/core/error-handling.ts +23 -30
  17. package/src/core/flow-executor.ts +58 -76
  18. package/src/core/formatting/bytes.ts +2 -4
  19. package/src/core/functional/async.ts +5 -4
  20. package/src/core/functional/error-handler.ts +2 -2
  21. package/src/core/git-stash-manager.ts +21 -10
  22. package/src/core/installers/file-installer.ts +0 -1
  23. package/src/core/installers/mcp-installer.ts +0 -1
  24. package/src/core/project-manager.ts +24 -18
  25. package/src/core/secrets-manager.ts +54 -73
  26. package/src/core/session-manager.ts +20 -22
  27. package/src/core/state-detector.ts +139 -80
  28. package/src/core/template-loader.ts +13 -31
  29. package/src/core/upgrade-manager.ts +122 -69
  30. package/src/index.ts +8 -5
  31. package/src/services/auto-upgrade.ts +1 -1
  32. package/src/services/config-service.ts +41 -29
  33. package/src/services/global-config.ts +2 -2
  34. package/src/services/target-installer.ts +9 -7
  35. package/src/targets/claude-code.ts +28 -15
  36. package/src/targets/opencode.ts +17 -6
  37. package/src/types/cli.types.ts +2 -2
  38. package/src/types/provider.types.ts +1 -7
  39. package/src/types/session.types.ts +11 -11
  40. package/src/types/target.types.ts +3 -1
  41. package/src/types/todo.types.ts +1 -1
  42. package/src/types.ts +1 -1
  43. package/src/utils/__tests__/package-manager-detector.test.ts +6 -6
  44. package/src/utils/agent-enhancer.ts +111 -3
  45. package/src/utils/config/paths.ts +3 -1
  46. package/src/utils/config/target-utils.ts +2 -2
  47. package/src/utils/display/banner.ts +2 -2
  48. package/src/utils/display/notifications.ts +58 -45
  49. package/src/utils/display/status.ts +29 -12
  50. package/src/utils/files/file-operations.ts +1 -1
  51. package/src/utils/files/sync-utils.ts +38 -41
  52. package/src/utils/index.ts +19 -27
  53. package/src/utils/package-manager-detector.ts +15 -5
  54. package/src/utils/security/security.ts +8 -4
  55. package/src/utils/target-selection.ts +5 -2
  56. package/src/utils/version.ts +4 -2
  57. package/src/commands/flow/execute.ts +0 -453
  58. package/src/commands/flow/setup.ts +0 -312
  59. package/src/commands/flow-orchestrator.ts +0 -328
  60. package/src/commands/init-command.ts +0 -92
  61. package/src/commands/init-core.ts +0 -331
  62. package/src/commands/run-command.ts +0 -126
  63. package/src/core/agent-manager.ts +0 -174
  64. package/src/core/loop-controller.ts +0 -200
  65. package/src/core/rule-loader.ts +0 -147
  66. package/src/core/rule-manager.ts +0 -240
  67. package/src/services/claude-config-service.ts +0 -252
  68. package/src/services/first-run-setup.ts +0 -220
  69. package/src/services/smart-config-service.ts +0 -269
  70. package/src/types/api.types.ts +0 -9
@@ -1,269 +0,0 @@
1
- /**
2
- * Smart Configuration Service
3
- * Handles intelligent provider and agent selection with user preferences
4
- */
5
-
6
- import inquirer from 'inquirer';
7
- import chalk from 'chalk';
8
- import { ConfigService, UserSettings, RuntimeChoices } from './config-service.js';
9
- import { loadAllAgents } from '../core/agent-loader.js';
10
-
11
- export interface SmartConfigOptions {
12
- selectProvider?: boolean;
13
- selectAgent?: boolean;
14
- useDefaults?: boolean;
15
- provider?: string;
16
- agent?: string;
17
- }
18
-
19
- export class SmartConfigService {
20
- /**
21
- * Initial setup - configure API keys once
22
- */
23
- static async initialSetup(): Promise<void> {
24
- console.log(chalk.cyan.bold('šŸ”‘ Initial Setup - Configure API Keys\n'));
25
-
26
- const userSettings = await ConfigService.loadHomeSettings();
27
- const apiKeys = userSettings.apiKeys || {};
28
-
29
- // Configure providers
30
- const providers = [
31
- { id: 'kimi', name: 'Kimi', hasKey: !!apiKeys.kimi },
32
- { id: 'z.ai', name: 'Z.ai (Recommended)', hasKey: !!apiKeys['z.ai'] },
33
- ];
34
-
35
- const missingProviders = providers.filter(p => !p.hasKey);
36
- const existingProviders = providers.filter(p => p.hasKey);
37
-
38
- // Ask which providers to configure
39
- console.log(chalk.cyan('Available providers:\n'));
40
- console.log(chalk.dim(' • Default (uses Claude Code configuration)'));
41
- providers.forEach(p => {
42
- const status = p.hasKey ? chalk.green('āœ“') : chalk.yellow('ā—‹');
43
- console.log(` ${status} ${p.name}`);
44
- });
45
- console.log('');
46
-
47
- const { selectedProvider } = await inquirer.prompt([
48
- {
49
- type: 'list',
50
- name: 'selectedProvider',
51
- message: 'Select provider:',
52
- choices: [
53
- {
54
- name: 'Default (Use Claude Code configuration)',
55
- value: 'default',
56
- },
57
- {
58
- name: 'Kimi',
59
- value: 'kimi',
60
- },
61
- {
62
- name: 'Z.ai (Recommended)',
63
- value: 'z.ai',
64
- },
65
- ],
66
- },
67
- ]);
68
-
69
- if (selectedProvider !== 'default') {
70
- await this.configureSelectedProviders([selectedProvider], apiKeys);
71
- } else {
72
- console.log(chalk.dim('Using Claude Code default configuration.'));
73
- }
74
-
75
- if (existingProviders.length > 0) {
76
- console.log(chalk.green('\nāœ… Already configured:'));
77
- existingProviders.forEach(p => {
78
- console.log(chalk.dim(` • ${p.name}`));
79
- });
80
- }
81
-
82
- // Mark setup as completed (only save API keys, no defaults)
83
- await ConfigService.saveHomeSettings({ hasCompletedSetup: true });
84
- console.log(chalk.green('\nāœ“ Setup complete!\n'));
85
- }
86
-
87
- /**
88
- * Configure selected providers
89
- */
90
- private static async configureSelectedProviders(
91
- selectedProviders: string[],
92
- existingApiKeys: any
93
- ): Promise<void> {
94
- for (const providerId of selectedProviders) {
95
- const providerName = providerId === 'kimi' ? 'Kimi' : 'Z.ai';
96
- console.log(chalk.cyan(`\nšŸ“‹ Configure ${providerName}\n`));
97
-
98
- const { apiKey } = await inquirer.prompt([
99
- {
100
- type: 'password',
101
- name: 'apiKey',
102
- message: `Enter API Key for ${providerName}:`,
103
- mask: '*',
104
- validate: (input) => input.length > 10 || 'API Key appears too short',
105
- },
106
- ]);
107
-
108
- existingApiKeys[providerId] = apiKey;
109
- console.log(chalk.green(`āœ“ API Key configured for ${providerName}`));
110
- }
111
-
112
- // Save all API keys
113
- await ConfigService.saveHomeSettings({ apiKeys: existingApiKeys });
114
- }
115
-
116
-
117
- /**
118
- * Runtime selection - choose provider and agent for this run
119
- *
120
- * DESIGN PRINCIPLE: Always Ask (Simple & Explicit)
121
- * - Has args (--provider/--agent) → Use them directly
122
- * - No args → Always prompt user
123
- * - Never save runtime choices as defaults
124
- */
125
- static async selectRuntimeChoices(options: SmartConfigOptions): Promise<RuntimeChoices> {
126
- const config = await ConfigService.loadConfiguration();
127
- const choices: RuntimeChoices = {};
128
-
129
- // Handle provider selection
130
- if (options.provider) {
131
- // Explicit option provided via args
132
- choices.provider = options.provider;
133
- } else {
134
- // Always prompt
135
- choices.provider = await this.selectProvider(config.user);
136
- }
137
-
138
- // Handle agent selection
139
- if (options.agent) {
140
- // Explicit option provided via args
141
- choices.agent = options.agent;
142
- } else {
143
- // Always prompt
144
- choices.agent = await this.selectAgent();
145
- }
146
-
147
- return choices;
148
- }
149
-
150
- /**
151
- * Select provider for this run
152
- */
153
- private static async selectProvider(userSettings: UserSettings): Promise<string> {
154
- const apiKeys = userSettings.apiKeys || {};
155
-
156
- // Always show all 3 providers
157
- const allProviders = [
158
- { id: 'default', name: 'Default (Claude Code configuration)', hasKey: true },
159
- { id: 'kimi', name: 'Kimi', hasKey: !!apiKeys.kimi },
160
- { id: 'z.ai', name: 'Z.ai (Recommended)', hasKey: !!apiKeys['z.ai'] },
161
- ];
162
-
163
- const { provider } = await inquirer.prompt([
164
- {
165
- type: 'list',
166
- name: 'provider',
167
- message: 'Select provider:',
168
- choices: allProviders.map(p => ({
169
- name: p.hasKey ? p.name : `${p.name} (Need API key)`,
170
- value: p.id,
171
- })),
172
- default: 'default',
173
- },
174
- ]);
175
-
176
- // If user selected a provider without API key, prompt for it
177
- if (provider !== 'default' && !apiKeys[provider]) {
178
- console.log(chalk.cyan(`\nšŸ”‘ Configure ${provider} API key:\n`));
179
- const { apiKey } = await inquirer.prompt([
180
- {
181
- type: 'password',
182
- name: 'apiKey',
183
- message: `Enter API Key for ${provider}:`,
184
- mask: '*',
185
- validate: (input) => input.length > 10 || 'API Key appears too short',
186
- },
187
- ]);
188
-
189
- // Save the API key
190
- apiKeys[provider] = apiKey;
191
- await ConfigService.saveHomeSettings({ apiKeys });
192
- console.log(chalk.green(`āœ“ API Key saved for ${provider}\n`));
193
- }
194
-
195
- return provider;
196
- }
197
-
198
- /**
199
- * Select agent for this run
200
- */
201
- private static async selectAgent(): Promise<string> {
202
- try {
203
- const agents = await loadAllAgents(process.cwd());
204
-
205
- if (agents.length === 0) {
206
- console.log(chalk.yellow('⚠ No agents found, using "coder"'));
207
- return 'coder';
208
- }
209
-
210
- const { agent } = await inquirer.prompt([
211
- {
212
- type: 'list',
213
- name: 'agent',
214
- message: 'Select agent:',
215
- choices: agents.map(a => ({
216
- name: a.metadata.name || a.id,
217
- value: a.id,
218
- })),
219
- default: agents.find(a => a.id === 'coder')?.id || agents[0].id,
220
- },
221
- ]);
222
-
223
- return agent;
224
- } catch (error) {
225
- console.log(chalk.yellow('⚠ Could not load agents, using "coder"'));
226
- return 'coder';
227
- }
228
- }
229
-
230
- /**
231
- * Setup environment variables based on runtime choices
232
- */
233
- static async setupEnvironment(provider: string): Promise<void> {
234
- const userSettings = await ConfigService.loadHomeSettings();
235
- const apiKeys = userSettings.apiKeys || {};
236
-
237
- if (provider !== 'default' && !apiKeys[provider]) {
238
- throw new Error(`No API key configured for provider: ${provider}`);
239
- }
240
-
241
- const providerConfigs = {
242
- default: {
243
- description: 'Default (No Override)',
244
- },
245
- kimi: {
246
- ANTHROPIC_BASE_URL: 'https://api.kimi.com/coding/',
247
- description: 'Kimi',
248
- },
249
- 'z.ai': {
250
- ANTHROPIC_BASE_URL: 'https://api.z.ai/api/anthropic',
251
- description: 'Z.ai Proxy',
252
- },
253
- };
254
-
255
- // Setup environment based on provider
256
- if (provider === 'default') {
257
- // Don't override anything - use user's existing Claude Code configuration
258
- console.log(chalk.dim(' āœ“ Using Claude Code default configuration'));
259
- return;
260
- }
261
-
262
- const config = providerConfigs[provider as keyof typeof providerConfigs];
263
- process.env.ANTHROPIC_BASE_URL = config.ANTHROPIC_BASE_URL;
264
- process.env.ANTHROPIC_AUTH_TOKEN = apiKeys[provider]; // Claude Code uses ANTHROPIC_AUTH_TOKEN, not ANTHROPIC_API_KEY
265
-
266
- // Success message
267
- console.log(chalk.green(` āœ“ Environment configured for ${provider}`));
268
- }
269
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * Backward compatibility layer for API types
3
- * Re-exports from the organized API types module
4
- *
5
- * @deprecated Import from './types/api' instead
6
- */
7
-
8
- // Re-export everything from the organized API types module
9
- export * from './types/api/index.js';