@agenticflow/cli 0.0.1-beta.13

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 (105) hide show
  1. package/README.md +125 -0
  2. package/TECHNICAL_DEBT.md +121 -0
  3. package/dist/builder/bundler.d.ts +17 -0
  4. package/dist/builder/bundler.d.ts.map +1 -0
  5. package/dist/builder/bundler.js +170 -0
  6. package/dist/builder/bundler.js.map +1 -0
  7. package/dist/builder/index.d.ts +6 -0
  8. package/dist/builder/index.d.ts.map +1 -0
  9. package/dist/builder/index.js +6 -0
  10. package/dist/builder/index.js.map +1 -0
  11. package/dist/builder/packager.d.ts +41 -0
  12. package/dist/builder/packager.d.ts.map +1 -0
  13. package/dist/builder/packager.js +145 -0
  14. package/dist/builder/packager.js.map +1 -0
  15. package/dist/builder/security.d.ts +26 -0
  16. package/dist/builder/security.d.ts.map +1 -0
  17. package/dist/builder/security.js +204 -0
  18. package/dist/builder/security.js.map +1 -0
  19. package/dist/builder/stripper.d.ts +19 -0
  20. package/dist/builder/stripper.d.ts.map +1 -0
  21. package/dist/builder/stripper.js +100 -0
  22. package/dist/builder/stripper.js.map +1 -0
  23. package/dist/builder/validator.d.ts +33 -0
  24. package/dist/builder/validator.d.ts.map +1 -0
  25. package/dist/builder/validator.js +150 -0
  26. package/dist/builder/validator.js.map +1 -0
  27. package/dist/cli/build.d.ts +3 -0
  28. package/dist/cli/build.d.ts.map +1 -0
  29. package/dist/cli/build.js +167 -0
  30. package/dist/cli/build.js.map +1 -0
  31. package/dist/cli/categories.d.ts +40 -0
  32. package/dist/cli/categories.d.ts.map +1 -0
  33. package/dist/cli/categories.js +101 -0
  34. package/dist/cli/categories.js.map +1 -0
  35. package/dist/cli/dev.d.ts +3 -0
  36. package/dist/cli/dev.d.ts.map +1 -0
  37. package/dist/cli/dev.js +226 -0
  38. package/dist/cli/dev.js.map +1 -0
  39. package/dist/cli/handler-types.d.ts +34 -0
  40. package/dist/cli/handler-types.d.ts.map +1 -0
  41. package/dist/cli/handler-types.js +67 -0
  42. package/dist/cli/handler-types.js.map +1 -0
  43. package/dist/cli/index.d.ts +3 -0
  44. package/dist/cli/index.d.ts.map +1 -0
  45. package/dist/cli/index.js +24 -0
  46. package/dist/cli/index.js.map +1 -0
  47. package/dist/cli/init.d.ts +3 -0
  48. package/dist/cli/init.d.ts.map +1 -0
  49. package/dist/cli/init.js +264 -0
  50. package/dist/cli/init.js.map +1 -0
  51. package/dist/cli/login.d.ts +3 -0
  52. package/dist/cli/login.d.ts.map +1 -0
  53. package/dist/cli/login.js +10 -0
  54. package/dist/cli/login.js.map +1 -0
  55. package/dist/cli/publish.d.ts +5 -0
  56. package/dist/cli/publish.d.ts.map +1 -0
  57. package/dist/cli/publish.js +120 -0
  58. package/dist/cli/publish.js.map +1 -0
  59. package/dist/cli/template-processor.d.ts +35 -0
  60. package/dist/cli/template-processor.d.ts.map +1 -0
  61. package/dist/cli/template-processor.js +82 -0
  62. package/dist/cli/template-processor.js.map +1 -0
  63. package/dist/cli/test.d.ts +3 -0
  64. package/dist/cli/test.d.ts.map +1 -0
  65. package/dist/cli/test.js +12 -0
  66. package/dist/cli/test.js.map +1 -0
  67. package/dist/dev/decorators.d.ts +10 -0
  68. package/dist/dev/decorators.d.ts.map +1 -0
  69. package/dist/dev/decorators.js +26 -0
  70. package/dist/dev/decorators.js.map +1 -0
  71. package/dist/dev/executor.d.ts +22 -0
  72. package/dist/dev/executor.d.ts.map +1 -0
  73. package/dist/dev/executor.js +243 -0
  74. package/dist/dev/executor.js.map +1 -0
  75. package/dist/dev/extractor.d.ts +15 -0
  76. package/dist/dev/extractor.d.ts.map +1 -0
  77. package/dist/dev/extractor.js +224 -0
  78. package/dist/dev/extractor.js.map +1 -0
  79. package/dist/dev/index.d.ts +3 -0
  80. package/dist/dev/index.d.ts.map +1 -0
  81. package/dist/dev/index.js +4 -0
  82. package/dist/dev/index.js.map +1 -0
  83. package/dist/dev/server.d.ts +91 -0
  84. package/dist/dev/server.d.ts.map +1 -0
  85. package/dist/dev/server.js +507 -0
  86. package/dist/dev/server.js.map +1 -0
  87. package/dist/dev/ui-dist/assets/index-BkKxvzfq.js +246 -0
  88. package/dist/dev/ui-dist/assets/index-DTO1qt7B.css +1 -0
  89. package/dist/dev/ui-dist/index.html +14 -0
  90. package/dist/dev/ui-dist/monkey.svg +3 -0
  91. package/dist/dev/ui-dist/package.json +27 -0
  92. package/dist/templates/_shared/.env.template +16 -0
  93. package/dist/templates/_shared/.gitignore.template +46 -0
  94. package/dist/templates/_shared/LICENSE.template +21 -0
  95. package/dist/templates/_shared/src/utils.ts.template +29 -0
  96. package/dist/templates/_shared/tsconfig.json.template +23 -0
  97. package/dist/templates/stateful/manifest.json.template +63 -0
  98. package/dist/templates/stateful/package.json.template +23 -0
  99. package/dist/templates/stateful/src/index.ts.template +147 -0
  100. package/dist/templates/stateless/docs/README.md.template +102 -0
  101. package/dist/templates/stateless/manifest.json.template +63 -0
  102. package/dist/templates/stateless/package.json.template +23 -0
  103. package/dist/templates/stateless/src/index.ts.template +103 -0
  104. package/package.json +51 -0
  105. package/vitest.config.ts +15 -0
@@ -0,0 +1,167 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ import { validateProject, stripDevCodeFromDirectory, bundleHandler, minifyCode, scanBundledCode, createPackage, formatSize } from '../builder/index.js';
6
+ export const buildCommand = new Command('build')
7
+ .description('Bundle handler into .afh package file')
8
+ .option('--output <dir>', 'Output directory', '.afh/build')
9
+ .option('--no-minify', 'Skip minification')
10
+ .option('--skip-security', 'Skip security checks')
11
+ .action(async (options) => {
12
+ const cwd = process.cwd();
13
+ const manifestPath = path.join(cwd, 'manifest.json');
14
+ // Check we're in a handler project
15
+ if (!fs.existsSync(manifestPath)) {
16
+ console.error(chalk.red('\n❌ No manifest.json found in current directory.'));
17
+ console.error(chalk.dim('Make sure you\'re in a handler project directory.\n'));
18
+ process.exit(1);
19
+ }
20
+ // Load manifest for display
21
+ let manifest;
22
+ try {
23
+ manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
24
+ }
25
+ catch (err) {
26
+ console.error(chalk.red('\n❌ Failed to parse manifest.json'));
27
+ process.exit(1);
28
+ }
29
+ console.log(chalk.blue('\n📦 Building') + chalk.dim(` ${manifest.name} v${manifest.version}\n`));
30
+ // Step 1: Validate project
31
+ console.log(chalk.dim('Validating project...'));
32
+ const validation = await validateProject(cwd);
33
+ // Show validation results
34
+ if (validation.manifest.errors.length > 0) {
35
+ console.log(chalk.red('✗ Manifest validation failed:'));
36
+ for (const error of validation.manifest.errors) {
37
+ console.log(chalk.red(` - ${error}`));
38
+ }
39
+ }
40
+ else {
41
+ console.log(chalk.green('✓') + ' Manifest valid');
42
+ }
43
+ if (validation.manifest.warnings.length > 0) {
44
+ for (const warning of validation.manifest.warnings) {
45
+ console.log(chalk.yellow(` ⚠ ${warning}`));
46
+ }
47
+ }
48
+ if (validation.files.errors.length > 0) {
49
+ console.log(chalk.red('✗ File validation failed:'));
50
+ for (const error of validation.files.errors) {
51
+ console.log(chalk.red(` - ${error}`));
52
+ }
53
+ }
54
+ else {
55
+ console.log(chalk.green('✓') + ' Required files present');
56
+ }
57
+ if (validation.files.warnings.length > 0) {
58
+ for (const warning of validation.files.warnings) {
59
+ console.log(chalk.yellow(` ⚠ ${warning}`));
60
+ }
61
+ }
62
+ if (validation.typescript.errors.length > 0) {
63
+ console.log(chalk.red('✗ TypeScript validation failed:'));
64
+ for (const error of validation.typescript.errors) {
65
+ console.log(chalk.red(` - ${error}`));
66
+ }
67
+ }
68
+ else {
69
+ console.log(chalk.green('✓') + ' TypeScript syntax valid');
70
+ }
71
+ // Stop if validation failed
72
+ if (!validation.valid) {
73
+ console.log(chalk.red('\n❌ Build failed due to validation errors.\n'));
74
+ process.exit(1);
75
+ }
76
+ // Step 2: Strip dev code
77
+ console.log(chalk.dim('\nStripping dev code...'));
78
+ const strippedDir = path.join(cwd, '.afh', 'stripped');
79
+ // Clean stripped directory
80
+ if (fs.existsSync(strippedDir)) {
81
+ fs.rmSync(strippedDir, { recursive: true });
82
+ }
83
+ const srcDir = path.join(cwd, 'src');
84
+ const stripResult = stripDevCodeFromDirectory(srcDir, strippedDir);
85
+ if (stripResult.totalDecorators > 0) {
86
+ console.log(chalk.green('✓') + ` Stripped ${stripResult.totalDecorators} @TestValue decorator(s)`);
87
+ }
88
+ else {
89
+ console.log(chalk.green('✓') + ' No @TestValue decorators found');
90
+ }
91
+ if (stripResult.totalImports > 0) {
92
+ console.log(chalk.green('✓') + ` Removed ${stripResult.totalImports} dev import(s)`);
93
+ }
94
+ // Step 3: Bundle
95
+ console.log(chalk.dim('\nBundling handler...'));
96
+ const bundleResult = await bundleHandler(cwd, strippedDir);
97
+ if (bundleResult.errors.length > 0) {
98
+ console.log(chalk.red('✗ Bundling failed:'));
99
+ for (const error of bundleResult.errors) {
100
+ console.log(chalk.red(` - ${error}`));
101
+ }
102
+ process.exit(1);
103
+ }
104
+ if (bundleResult.warnings.length > 0) {
105
+ for (const warning of bundleResult.warnings) {
106
+ console.log(chalk.yellow(` ⚠ ${warning}`));
107
+ }
108
+ }
109
+ console.log(chalk.green('✓') + ' Bundle created');
110
+ // Step 4: Minify (optional)
111
+ let finalCode = bundleResult.code;
112
+ if (options.minify) {
113
+ console.log(chalk.dim('\nMinifying...'));
114
+ const originalSize = Buffer.byteLength(finalCode, 'utf-8');
115
+ finalCode = minifyCode(finalCode);
116
+ const minifiedSize = Buffer.byteLength(finalCode, 'utf-8');
117
+ const reduction = ((1 - minifiedSize / originalSize) * 100).toFixed(1);
118
+ console.log(chalk.green('✓') + ` Minified (${reduction}% reduction)`);
119
+ }
120
+ // Step 5: Security scan
121
+ if (!options.skipSecurity) {
122
+ console.log(chalk.dim('\nRunning security checks...'));
123
+ const securityResult = scanBundledCode(finalCode);
124
+ if (securityResult.errors.length > 0) {
125
+ console.log(chalk.red('✗ Security check failed:'));
126
+ for (const error of securityResult.errors) {
127
+ console.log(chalk.red(` - ${error}`));
128
+ }
129
+ console.log(chalk.red('\n❌ Build aborted due to security issues.'));
130
+ console.log(chalk.dim('Use --skip-security to bypass (not recommended).\n'));
131
+ process.exit(1);
132
+ }
133
+ if (securityResult.warnings.length > 0) {
134
+ console.log(chalk.yellow('⚠ Security warnings:'));
135
+ for (const warning of securityResult.warnings) {
136
+ console.log(chalk.yellow(` - ${warning}`));
137
+ }
138
+ }
139
+ else {
140
+ console.log(chalk.green('✓') + ' No security issues found');
141
+ }
142
+ }
143
+ // Step 6: Create package
144
+ console.log(chalk.dim('\nCreating package...'));
145
+ const outputDir = path.isAbsolute(options.output)
146
+ ? options.output
147
+ : path.join(cwd, options.output);
148
+ try {
149
+ const packageInfo = await createPackage(cwd, finalCode, outputDir);
150
+ console.log(chalk.green('✓') + ' Package created\n');
151
+ // Summary
152
+ console.log(chalk.bold('📦 Build successful!\n'));
153
+ console.log(` ${chalk.dim('Package:')} ${packageInfo.id}-${packageInfo.version}.afh`);
154
+ console.log(` ${chalk.dim('Size:')} ${formatSize(packageInfo.size)}`);
155
+ console.log(` ${chalk.dim('Files:')} ${packageInfo.files.join(', ')}`);
156
+ console.log(` ${chalk.dim('Checksum:')} ${packageInfo.checksum.slice(0, 16)}...`);
157
+ console.log(` ${chalk.dim('Location:')} ${outputDir}`);
158
+ console.log(chalk.dim('\nNext steps:'));
159
+ console.log(chalk.cyan(` afh publish ${packageInfo.id}-${packageInfo.version}.afh\n`));
160
+ }
161
+ catch (err) {
162
+ console.log(chalk.red('✗ Failed to create package:'));
163
+ console.log(chalk.red(` ${err}`));
164
+ process.exit(1);
165
+ }
166
+ });
167
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Handler categories with descriptions for the marketplace
3
+ *
4
+ * API-compatible categories: 'control' | 'data' | 'external' | 'ai' | 'utility'
5
+ */
6
+ export interface CategoryChoice {
7
+ name: string;
8
+ value: string;
9
+ apiValue: string;
10
+ description: string;
11
+ }
12
+ export declare const CATEGORIES: CategoryChoice[];
13
+ /**
14
+ * Get category color for visual representation
15
+ */
16
+ export declare function getCategoryColor(category: string): string;
17
+ /**
18
+ * Get the API-compatible category value
19
+ */
20
+ export declare function getCategoryApiValue(category: string): string;
21
+ /**
22
+ * Display numbered category list
23
+ */
24
+ export declare function displayCategoryList(): void;
25
+ /**
26
+ * Get category by number (1-indexed)
27
+ */
28
+ export declare function getCategoryByNumber(num: number): CategoryChoice | undefined;
29
+ /**
30
+ * Validate category number input
31
+ */
32
+ export declare function isValidCategoryNumber(input: string): boolean;
33
+ /**
34
+ * Get formatted category choices for inquirer prompts
35
+ */
36
+ export declare function getCategoryChoices(): {
37
+ name: string;
38
+ value: string;
39
+ }[];
40
+ //# sourceMappingURL=categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../src/cli/categories.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,UAAU,EAAE,cAAc,EA2CtC,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAK3E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB;;;IAKjC"}
@@ -0,0 +1,101 @@
1
+ export const CATEGORIES = [
2
+ {
3
+ name: 'Integration',
4
+ value: 'integration',
5
+ apiValue: 'external',
6
+ description: 'Connect to external services like APIs, databases, and third-party platforms'
7
+ },
8
+ {
9
+ name: 'Utility',
10
+ value: 'utility',
11
+ apiValue: 'utility',
12
+ description: 'General purpose tools for data manipulation, formatting, and validation'
13
+ },
14
+ {
15
+ name: 'Data',
16
+ value: 'data',
17
+ apiValue: 'data',
18
+ description: 'Data processing, transformation, parsing, and analysis tools'
19
+ },
20
+ {
21
+ name: 'AI',
22
+ value: 'ai',
23
+ apiValue: 'ai',
24
+ description: 'AI and machine learning integrations, LLM APIs, and intelligent processing'
25
+ },
26
+ {
27
+ name: 'Communication',
28
+ value: 'communication',
29
+ apiValue: 'external',
30
+ description: 'Email, SMS, notifications, messaging, and communication platforms'
31
+ },
32
+ {
33
+ name: 'Control',
34
+ value: 'control',
35
+ apiValue: 'control',
36
+ description: 'Flow control, branching, loops, and execution management'
37
+ },
38
+ {
39
+ name: 'Other',
40
+ value: 'other',
41
+ apiValue: 'utility',
42
+ description: 'Miscellaneous handlers that don\'t fit other categories'
43
+ }
44
+ ];
45
+ /**
46
+ * Get category color for visual representation
47
+ */
48
+ export function getCategoryColor(category) {
49
+ const colors = {
50
+ integration: '#635BFF',
51
+ utility: '#4A90E2',
52
+ data: '#7ED321',
53
+ ai: '#F5A623',
54
+ communication: '#50C878',
55
+ control: '#E74C3C',
56
+ other: '#9B59B6'
57
+ };
58
+ return colors[category] || '#9B59B6';
59
+ }
60
+ /**
61
+ * Get the API-compatible category value
62
+ */
63
+ export function getCategoryApiValue(category) {
64
+ const cat = CATEGORIES.find(c => c.value === category);
65
+ return cat?.apiValue ?? 'utility';
66
+ }
67
+ /**
68
+ * Display numbered category list
69
+ */
70
+ export function displayCategoryList() {
71
+ console.log(' Categories:');
72
+ CATEGORIES.forEach((cat, index) => {
73
+ console.log(` ${index + 1}. ${cat.name} - ${cat.description}`);
74
+ });
75
+ }
76
+ /**
77
+ * Get category by number (1-indexed)
78
+ */
79
+ export function getCategoryByNumber(num) {
80
+ if (num >= 1 && num <= CATEGORIES.length) {
81
+ return CATEGORIES[num - 1];
82
+ }
83
+ return undefined;
84
+ }
85
+ /**
86
+ * Validate category number input
87
+ */
88
+ export function isValidCategoryNumber(input) {
89
+ const num = parseInt(input, 10);
90
+ return !isNaN(num) && num >= 1 && num <= CATEGORIES.length;
91
+ }
92
+ /**
93
+ * Get formatted category choices for inquirer prompts
94
+ */
95
+ export function getCategoryChoices() {
96
+ return CATEGORIES.map(cat => ({
97
+ name: `${cat.name} - ${cat.description}`,
98
+ value: cat.value
99
+ }));
100
+ }
101
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/cli/categories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const devCommand: Command;
3
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,UAAU,SAiPnB,CAAC"}
@@ -0,0 +1,226 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ import { spawn } from 'child_process';
6
+ import { fileURLToPath } from 'url';
7
+ import chokidar from 'chokidar';
8
+ import express from 'express';
9
+ import { createServer } from 'http';
10
+ import { DevServer } from '../dev/server.js';
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ export const devCommand = new Command('dev')
14
+ .description('Start development server with hot-reload and web UI')
15
+ .option('--port <number>', 'Dev server port', '3000')
16
+ .option('--api-port <number>', 'API server port', '3001')
17
+ .option('--no-open', "Don't auto-open browser")
18
+ .action(async (options) => {
19
+ const cwd = process.cwd();
20
+ const manifestPath = path.join(cwd, 'manifest.json');
21
+ // Check we're in a handler project
22
+ if (!fs.existsSync(manifestPath)) {
23
+ console.error(chalk.red('\n❌ No manifest.json found in current directory.'));
24
+ console.error(chalk.dim('Make sure you are in a handler project directory.\n'));
25
+ console.error(chalk.dim('To create a new handler project:'));
26
+ console.error(chalk.cyan(' afh init my-handler\n'));
27
+ process.exit(1);
28
+ }
29
+ // Load manifest for display
30
+ let manifest;
31
+ try {
32
+ manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
33
+ }
34
+ catch (err) {
35
+ console.error(chalk.red('\n❌ Failed to parse manifest.json'));
36
+ process.exit(1);
37
+ }
38
+ const apiPort = parseInt(options.apiPort);
39
+ const uiPort = parseInt(options.port);
40
+ console.log(chalk.blue('\n🐵 afh dev') + chalk.dim(' - ' + manifest.name + ' v' + manifest.version + '\n'));
41
+ // Load .env file
42
+ const envPath = path.join(cwd, '.env');
43
+ if (fs.existsSync(envPath)) {
44
+ const dotenv = await import('dotenv');
45
+ dotenv.config({ path: envPath });
46
+ const envLines = fs.readFileSync(envPath, 'utf-8').split('\n').filter(l => l.trim() && !l.startsWith('#'));
47
+ console.log(chalk.green('✓') + chalk.dim(' Loaded .env (' + envLines.length + ' variables)'));
48
+ }
49
+ // Start API server
50
+ console.log(chalk.dim('Starting API server...'));
51
+ const devServer = new DevServer({
52
+ port: apiPort,
53
+ uiPort: uiPort,
54
+ projectDir: cwd,
55
+ open: options.open
56
+ });
57
+ try {
58
+ await devServer.start();
59
+ console.log(chalk.green('✓') + ' API server running on ' + chalk.cyan('http://localhost:' + apiPort));
60
+ }
61
+ catch (err) {
62
+ console.error(chalk.red('\n❌ Failed to start API server:'), err);
63
+ process.exit(1);
64
+ }
65
+ // Find UI directory - check for pre-built ui-dist first
66
+ const uiDistDir = path.join(__dirname, '..', 'dev', 'ui-dist');
67
+ const uiSourceDir = path.join(__dirname, '..', '..', 'src', 'dev', 'ui');
68
+ const usePrebuilt = fs.existsSync(uiDistDir) && fs.existsSync(path.join(uiDistDir, 'index.html'));
69
+ let uiServer = null;
70
+ let viteProcess = null;
71
+ if (usePrebuilt) {
72
+ // Serve pre-built UI with Express + proxy API requests
73
+ console.log(chalk.dim('Starting UI server (pre-built)...'));
74
+ const app = express();
75
+ // Proxy /api/* requests to the API server
76
+ app.use('/api', async (req, res) => {
77
+ const apiUrl = 'http://localhost:' + apiPort + '/api' + req.url;
78
+ try {
79
+ const fetchModule = await import('node-fetch');
80
+ const fetch = fetchModule.default;
81
+ const headers = {};
82
+ for (const [key, value] of Object.entries(req.headers)) {
83
+ if (typeof value === 'string') {
84
+ headers[key] = value;
85
+ }
86
+ }
87
+ delete headers['host'];
88
+ let body;
89
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
90
+ const chunks = [];
91
+ for await (const chunk of req) {
92
+ chunks.push(chunk);
93
+ }
94
+ body = Buffer.concat(chunks).toString();
95
+ }
96
+ const response = await fetch(apiUrl, {
97
+ method: req.method,
98
+ headers,
99
+ body,
100
+ });
101
+ res.status(response.status);
102
+ response.headers.forEach((value, key) => {
103
+ if (key !== 'transfer-encoding') {
104
+ res.setHeader(key, value);
105
+ }
106
+ });
107
+ const text = await response.text();
108
+ res.send(text);
109
+ }
110
+ catch (err) {
111
+ console.error('Proxy error:', err);
112
+ res.status(502).json({ error: 'Proxy error', details: String(err) });
113
+ }
114
+ });
115
+ // Serve static files
116
+ app.use(express.static(uiDistDir));
117
+ // SPA fallback
118
+ app.get('/{*splat}', (req, res) => {
119
+ res.sendFile(path.join(uiDistDir, 'index.html'));
120
+ });
121
+ uiServer = createServer(app);
122
+ await new Promise((resolve, reject) => {
123
+ uiServer.listen(uiPort, () => {
124
+ console.log(chalk.green('✓') + ' UI server running on ' + chalk.cyan('http://localhost:' + uiPort));
125
+ console.log('');
126
+ console.log(chalk.dim(' ➜ ') + 'Local: ' + chalk.cyan('http://localhost:' + uiPort));
127
+ console.log(chalk.dim(' ➜ ') + 'API: ' + chalk.cyan('http://localhost:' + apiPort));
128
+ console.log('');
129
+ resolve();
130
+ });
131
+ uiServer.on('error', reject);
132
+ });
133
+ if (options.open) {
134
+ const url = 'http://localhost:' + uiPort;
135
+ const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
136
+ spawn(openCmd, [url], { shell: true, stdio: 'ignore' });
137
+ }
138
+ }
139
+ else {
140
+ // Fall back to Vite dev server
141
+ let uiDir = uiSourceDir;
142
+ if (!fs.existsSync(uiDir)) {
143
+ uiDir = path.join(__dirname, '..', 'dev', 'ui');
144
+ }
145
+ const appTsx = path.join(uiDir, 'src', 'App.tsx');
146
+ if (!fs.existsSync(appTsx)) {
147
+ console.error(chalk.red('\n❌ UI files not found.'));
148
+ console.error(chalk.dim('Looked in: ' + uiDir));
149
+ process.exit(1);
150
+ }
151
+ const uiNodeModules = path.join(uiDir, 'node_modules');
152
+ if (!fs.existsSync(uiNodeModules)) {
153
+ console.log(chalk.dim('Installing UI dependencies...'));
154
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
155
+ const install = spawn(npm, ['install'], { cwd: uiDir, stdio: 'inherit' });
156
+ await new Promise((resolve, reject) => {
157
+ install.on('close', (code) => {
158
+ if (code === 0)
159
+ resolve();
160
+ else
161
+ reject(new Error('npm install failed with code ' + code));
162
+ });
163
+ });
164
+ }
165
+ console.log(chalk.dim('Starting UI server (Vite dev)...'));
166
+ const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
167
+ viteProcess = spawn(npm, ['run', 'dev', '--', '--port', String(uiPort)], {
168
+ cwd: uiDir,
169
+ stdio: ['ignore', 'pipe', 'pipe'],
170
+ env: { ...process.env, FORCE_COLOR: '1' }
171
+ });
172
+ viteProcess.stdout?.on('data', (data) => {
173
+ const output = data.toString();
174
+ if (output.includes('Local:') || output.includes('ready')) {
175
+ console.log(chalk.green('✓') + ' UI server running on ' + chalk.cyan('http://localhost:' + uiPort));
176
+ console.log('');
177
+ console.log(chalk.dim(' ➜ ') + 'Local: ' + chalk.cyan('http://localhost:' + uiPort));
178
+ console.log(chalk.dim(' ➜ ') + 'API: ' + chalk.cyan('http://localhost:' + apiPort));
179
+ console.log('');
180
+ if (options.open) {
181
+ const url = 'http://localhost:' + uiPort;
182
+ const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
183
+ spawn(openCmd, [url], { shell: true, stdio: 'ignore' });
184
+ }
185
+ }
186
+ });
187
+ viteProcess.stderr?.on('data', (data) => {
188
+ const output = data.toString();
189
+ if (!output.includes('ExperimentalWarning') && !output.includes('--trace-warnings')) {
190
+ process.stderr.write(data);
191
+ }
192
+ });
193
+ }
194
+ // Watch for file changes
195
+ const watcher = chokidar.watch([
196
+ path.join(cwd, 'src', '**', '*.ts'),
197
+ path.join(cwd, 'manifest.json'),
198
+ ], { ignoreInitial: true });
199
+ watcher.on('change', async (filePath) => {
200
+ const relativePath = path.relative(cwd, filePath);
201
+ const timestamp = new Date().toLocaleTimeString();
202
+ console.log(chalk.dim('[' + timestamp + ']') + ' File changed: ' + chalk.cyan(relativePath));
203
+ try {
204
+ console.log(chalk.dim('[' + timestamp + ']') + ' Reloading handler...');
205
+ const startTime = Date.now();
206
+ await devServer.reloadHandler();
207
+ const duration = Date.now() - startTime;
208
+ console.log(chalk.dim('[' + timestamp + ']') + chalk.green(' ✓ Handler reloaded (' + duration + 'ms)'));
209
+ }
210
+ catch (err) {
211
+ console.error(chalk.dim('[' + timestamp + ']') + chalk.red(' ✗ Reload failed:'), err);
212
+ }
213
+ });
214
+ console.log(chalk.dim('[' + new Date().toLocaleTimeString() + ']') + ' Watching for changes...\n');
215
+ const shutdown = () => {
216
+ console.log(chalk.dim('\nShutting down...'));
217
+ watcher.close();
218
+ devServer.stop();
219
+ uiServer?.close();
220
+ viteProcess?.kill();
221
+ process.exit(0);
222
+ };
223
+ process.on('SIGINT', shutdown);
224
+ process.on('SIGTERM', shutdown);
225
+ });
226
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Handler types with descriptions for project scaffolding
3
+ */
4
+ export interface HandlerTypeChoice {
5
+ name: string;
6
+ value: string;
7
+ description: string;
8
+ features: string[];
9
+ }
10
+ export declare const HANDLER_TYPES: HandlerTypeChoice[];
11
+ /**
12
+ * Display numbered handler type list
13
+ */
14
+ export declare function displayHandlerTypeList(): void;
15
+ /**
16
+ * Get handler type by number (1-indexed)
17
+ */
18
+ export declare function getHandlerTypeByNumber(num: number): HandlerTypeChoice | undefined;
19
+ /**
20
+ * Validate handler type number input
21
+ */
22
+ export declare function isValidHandlerTypeNumber(input: string): boolean;
23
+ /**
24
+ * Get formatted handler type choices for inquirer prompts
25
+ */
26
+ export declare function getHandlerTypeChoices(): {
27
+ name: string;
28
+ value: string;
29
+ }[];
30
+ /**
31
+ * Get detailed description for a handler type
32
+ */
33
+ export declare function getHandlerTypeDetails(type: string): HandlerTypeChoice | undefined;
34
+ //# sourceMappingURL=handler-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-types.d.ts","sourceRoot":"","sources":["../../src/cli/handler-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,eAAO,MAAM,aAAa,EAAE,iBAAiB,EAyB5C,CAAC;AAEF;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAKjF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG/D;AAED;;GAEG;AACH,wBAAgB,qBAAqB;;;IAKpC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEjF"}