@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,26 @@
1
+ export interface SecurityCheckResult {
2
+ passed: boolean;
3
+ errors: string[];
4
+ warnings: string[];
5
+ matches: SecurityMatch[];
6
+ }
7
+ export interface SecurityMatch {
8
+ pattern: string;
9
+ file: string;
10
+ line: number;
11
+ match: string;
12
+ severity: 'error' | 'warning';
13
+ }
14
+ /**
15
+ * Scan a file for security issues
16
+ */
17
+ export declare function scanFile(filePath: string, content: string): SecurityMatch[];
18
+ /**
19
+ * Scan all files in a directory for security issues
20
+ */
21
+ export declare function scanDirectory(dir: string, extensions?: string[]): SecurityCheckResult;
22
+ /**
23
+ * Scan bundled code for security issues
24
+ */
25
+ export declare function scanBundledCode(code: string, filename?: string): SecurityCheckResult;
26
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/builder/security.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AA0GD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CA4B3E;AAYD;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAA4B,GAAG,mBAAmB,CA2C9G;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAoB,GAAG,mBAAmB,CAoBjG"}
@@ -0,0 +1,204 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ // Patterns that indicate leaked secrets or dev code
4
+ const SECURITY_PATTERNS = [
5
+ // API Keys
6
+ {
7
+ name: 'Stripe Live Key',
8
+ pattern: /sk_live_[a-zA-Z0-9]{24,}/g,
9
+ severity: 'error',
10
+ message: 'Stripe live API key detected'
11
+ },
12
+ {
13
+ name: 'Stripe Test Key',
14
+ pattern: /sk_test_[a-zA-Z0-9]{24,}/g,
15
+ severity: 'warning',
16
+ message: 'Stripe test API key detected'
17
+ },
18
+ {
19
+ name: 'SendGrid Key',
20
+ pattern: /SG\.[a-zA-Z0-9_-]{22,}\.[a-zA-Z0-9_-]{22,}/g,
21
+ severity: 'error',
22
+ message: 'SendGrid API key detected'
23
+ },
24
+ {
25
+ name: 'OpenAI Key',
26
+ pattern: /sk-[a-zA-Z0-9]{32,}/g,
27
+ severity: 'error',
28
+ message: 'OpenAI API key detected'
29
+ },
30
+ {
31
+ name: 'AWS Access Key',
32
+ pattern: /AKIA[0-9A-Z]{16}/g,
33
+ severity: 'error',
34
+ message: 'AWS Access Key ID detected'
35
+ },
36
+ {
37
+ name: 'AWS Secret Key',
38
+ pattern: /[a-zA-Z0-9/+=]{40}/g,
39
+ severity: 'warning',
40
+ message: 'Possible AWS Secret Access Key detected'
41
+ },
42
+ {
43
+ name: 'GitHub Token',
44
+ pattern: /ghp_[a-zA-Z0-9]{36}/g,
45
+ severity: 'error',
46
+ message: 'GitHub Personal Access Token detected'
47
+ },
48
+ {
49
+ name: 'Generic API Key',
50
+ pattern: /api[_-]?key\s*[:=]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,
51
+ severity: 'warning',
52
+ message: 'Possible hardcoded API key detected'
53
+ },
54
+ {
55
+ name: 'Generic Secret',
56
+ pattern: /secret\s*[:=]\s*['"][a-zA-Z0-9_-]{20,}['"]/gi,
57
+ severity: 'warning',
58
+ message: 'Possible hardcoded secret detected'
59
+ },
60
+ // Dev code leakage
61
+ {
62
+ name: '@TestValue Decorator',
63
+ pattern: /@TestValue\s*\(/g,
64
+ severity: 'error',
65
+ message: '@TestValue decorator found in production code'
66
+ },
67
+ {
68
+ name: 'afh/dev Import',
69
+ pattern: /from\s+['"]afh\/dev['"]/g,
70
+ severity: 'error',
71
+ message: 'afh/dev import found in production code'
72
+ },
73
+ {
74
+ name: 'TestValue Import',
75
+ pattern: /import\s+\{[^}]*TestValue[^}]*\}/g,
76
+ severity: 'error',
77
+ message: 'TestValue import found in production code'
78
+ },
79
+ // Common mistakes
80
+ {
81
+ name: 'Console.log',
82
+ pattern: /console\.(log|debug|info)\s*\(/g,
83
+ severity: 'warning',
84
+ message: 'console.log statement found - consider removing for production'
85
+ },
86
+ {
87
+ name: 'TODO Comment',
88
+ pattern: /\/\/\s*TODO/gi,
89
+ severity: 'warning',
90
+ message: 'TODO comment found'
91
+ },
92
+ {
93
+ name: 'FIXME Comment',
94
+ pattern: /\/\/\s*FIXME/gi,
95
+ severity: 'warning',
96
+ message: 'FIXME comment found'
97
+ },
98
+ ];
99
+ /**
100
+ * Scan a file for security issues
101
+ */
102
+ export function scanFile(filePath, content) {
103
+ const matches = [];
104
+ const lines = content.split('\n');
105
+ for (const { name, pattern, severity, message } of SECURITY_PATTERNS) {
106
+ // Reset regex lastIndex
107
+ pattern.lastIndex = 0;
108
+ let lineNumber = 0;
109
+ for (const line of lines) {
110
+ lineNumber++;
111
+ pattern.lastIndex = 0;
112
+ let match;
113
+ while ((match = pattern.exec(line)) !== null) {
114
+ // Mask the match for display
115
+ const maskedMatch = maskSecret(match[0]);
116
+ matches.push({
117
+ pattern: name,
118
+ file: filePath,
119
+ line: lineNumber,
120
+ match: maskedMatch,
121
+ severity
122
+ });
123
+ }
124
+ }
125
+ }
126
+ return matches;
127
+ }
128
+ /**
129
+ * Mask a secret for safe display
130
+ */
131
+ function maskSecret(secret) {
132
+ if (secret.length <= 8)
133
+ return '***';
134
+ const prefix = secret.slice(0, 4);
135
+ const suffix = secret.slice(-4);
136
+ return `${prefix}...${suffix}`;
137
+ }
138
+ /**
139
+ * Scan all files in a directory for security issues
140
+ */
141
+ export function scanDirectory(dir, extensions = ['.ts', '.js', '.json']) {
142
+ const allMatches = [];
143
+ const errors = [];
144
+ const warnings = [];
145
+ function processDir(currentDir) {
146
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
147
+ for (const entry of entries) {
148
+ const fullPath = path.join(currentDir, entry.name);
149
+ const relativePath = path.relative(dir, fullPath);
150
+ if (entry.isDirectory()) {
151
+ // Skip common non-code directories
152
+ if (!['node_modules', '.git', 'dist', '.afh'].includes(entry.name)) {
153
+ processDir(fullPath);
154
+ }
155
+ }
156
+ else if (extensions.some(ext => entry.name.endsWith(ext))) {
157
+ const content = fs.readFileSync(fullPath, 'utf-8');
158
+ const matches = scanFile(relativePath, content);
159
+ allMatches.push(...matches);
160
+ }
161
+ }
162
+ }
163
+ processDir(dir);
164
+ // Categorize matches into errors and warnings
165
+ for (const match of allMatches) {
166
+ const message = `${match.file}:${match.line} - ${match.pattern}: ${match.match}`;
167
+ if (match.severity === 'error') {
168
+ errors.push(message);
169
+ }
170
+ else {
171
+ warnings.push(message);
172
+ }
173
+ }
174
+ return {
175
+ passed: errors.length === 0,
176
+ errors,
177
+ warnings,
178
+ matches: allMatches
179
+ };
180
+ }
181
+ /**
182
+ * Scan bundled code for security issues
183
+ */
184
+ export function scanBundledCode(code, filename = 'bundle.js') {
185
+ const matches = scanFile(filename, code);
186
+ const errors = [];
187
+ const warnings = [];
188
+ for (const match of matches) {
189
+ const message = `${match.file}:${match.line} - ${match.pattern}: ${match.match}`;
190
+ if (match.severity === 'error') {
191
+ errors.push(message);
192
+ }
193
+ else {
194
+ warnings.push(message);
195
+ }
196
+ }
197
+ return {
198
+ passed: errors.length === 0,
199
+ errors,
200
+ warnings,
201
+ matches
202
+ };
203
+ }
204
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/builder/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface StripResult {
2
+ code: string;
3
+ strippedDecorators: string[];
4
+ strippedImports: string[];
5
+ }
6
+ /**
7
+ * Strip @TestValue decorators and afh/dev imports from TypeScript source
8
+ * Uses TypeScript Compiler API for accurate AST manipulation
9
+ */
10
+ export declare function stripDevCode(sourcePath: string): StripResult;
11
+ /**
12
+ * Strip dev code from all TypeScript files in a directory
13
+ */
14
+ export declare function stripDevCodeFromDirectory(srcDir: string, outDir: string): {
15
+ files: string[];
16
+ totalDecorators: number;
17
+ totalImports: number;
18
+ };
19
+ //# sourceMappingURL=stripper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripper.d.ts","sourceRoot":"","sources":["../../src/builder/stripper.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAmF5D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CA6BpE"}
@@ -0,0 +1,100 @@
1
+ import * as ts from 'typescript';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ /**
5
+ * Strip @TestValue decorators and afh/dev imports from TypeScript source
6
+ * Uses TypeScript Compiler API for accurate AST manipulation
7
+ */
8
+ export function stripDevCode(sourcePath) {
9
+ const sourceCode = fs.readFileSync(sourcePath, 'utf-8');
10
+ const sourceFile = ts.createSourceFile(sourcePath, sourceCode, ts.ScriptTarget.Latest, true);
11
+ const strippedDecorators = [];
12
+ const strippedImports = [];
13
+ // Transformer to remove @TestValue decorators and afh/dev imports
14
+ const transformer = (context) => {
15
+ return (rootNode) => {
16
+ function visit(node) {
17
+ // Remove imports from 'afh/dev' or './utils' (local TestValue re-export)
18
+ if (ts.isImportDeclaration(node)) {
19
+ const moduleSpecifier = node.moduleSpecifier;
20
+ if (ts.isStringLiteral(moduleSpecifier)) {
21
+ const moduleName = moduleSpecifier.text;
22
+ if (moduleName === 'afh/dev' ||
23
+ moduleName === './utils' ||
24
+ moduleName.includes('afh/dev')) {
25
+ strippedImports.push(moduleName);
26
+ return undefined; // Remove this import
27
+ }
28
+ }
29
+ }
30
+ // Remove @TestValue decorators from properties
31
+ if (ts.isPropertyDeclaration(node) && node.modifiers) {
32
+ const filteredModifiers = node.modifiers.filter(modifier => {
33
+ if (ts.isDecorator(modifier)) {
34
+ const expression = modifier.expression;
35
+ if (ts.isCallExpression(expression)) {
36
+ const callee = expression.expression;
37
+ if (ts.isIdentifier(callee) && callee.text === 'TestValue') {
38
+ strippedDecorators.push(node.name.getText());
39
+ return false; // Remove this decorator
40
+ }
41
+ }
42
+ else if (ts.isIdentifier(expression) && expression.text === 'TestValue') {
43
+ strippedDecorators.push(node.name.getText());
44
+ return false;
45
+ }
46
+ }
47
+ return true;
48
+ });
49
+ if (filteredModifiers.length !== node.modifiers.length) {
50
+ return ts.factory.updatePropertyDeclaration(node, filteredModifiers.length > 0 ? filteredModifiers : undefined, node.name, node.questionToken || node.exclamationToken, node.type, node.initializer);
51
+ }
52
+ }
53
+ return ts.visitEachChild(node, visit, context);
54
+ }
55
+ return ts.visitNode(rootNode, visit);
56
+ };
57
+ };
58
+ // Apply transformation
59
+ const result = ts.transform(sourceFile, [transformer]);
60
+ const transformedSourceFile = result.transformed[0];
61
+ // Print the transformed code
62
+ const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
63
+ const code = printer.printFile(transformedSourceFile);
64
+ result.dispose();
65
+ return {
66
+ code,
67
+ strippedDecorators,
68
+ strippedImports
69
+ };
70
+ }
71
+ /**
72
+ * Strip dev code from all TypeScript files in a directory
73
+ */
74
+ export function stripDevCodeFromDirectory(srcDir, outDir) {
75
+ const files = [];
76
+ let totalDecorators = 0;
77
+ let totalImports = 0;
78
+ function processDirectory(dir, relativePath = '') {
79
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
80
+ for (const entry of entries) {
81
+ const srcPath = path.join(dir, entry.name);
82
+ const outPath = path.join(outDir, relativePath, entry.name);
83
+ if (entry.isDirectory()) {
84
+ fs.mkdirSync(outPath, { recursive: true });
85
+ processDirectory(srcPath, path.join(relativePath, entry.name));
86
+ }
87
+ else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.test.ts')) {
88
+ const result = stripDevCode(srcPath);
89
+ fs.writeFileSync(outPath, result.code);
90
+ files.push(path.join(relativePath, entry.name));
91
+ totalDecorators += result.strippedDecorators.length;
92
+ totalImports += result.strippedImports.length;
93
+ }
94
+ }
95
+ }
96
+ fs.mkdirSync(outDir, { recursive: true });
97
+ processDirectory(srcDir);
98
+ return { files, totalDecorators, totalImports };
99
+ }
100
+ //# sourceMappingURL=stripper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripper.js","sourceRoot":"","sources":["../../src/builder/stripper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ errors: string[];
4
+ warnings: string[];
5
+ }
6
+ export interface ManifestValidation {
7
+ valid: boolean;
8
+ errors: string[];
9
+ warnings: string[];
10
+ manifest?: any;
11
+ }
12
+ /**
13
+ * Validate manifest.json structure and required fields
14
+ */
15
+ export declare function validateManifest(projectDir: string): ManifestValidation;
16
+ /**
17
+ * Validate required project files exist
18
+ */
19
+ export declare function validateProjectFiles(projectDir: string): ValidationResult;
20
+ /**
21
+ * Check for TypeScript compilation errors
22
+ */
23
+ export declare function validateTypeScript(projectDir: string): Promise<ValidationResult>;
24
+ /**
25
+ * Full project validation
26
+ */
27
+ export declare function validateProject(projectDir: string): Promise<{
28
+ valid: boolean;
29
+ manifest: ManifestValidation;
30
+ files: ValidationResult;
31
+ typescript: ValidationResult;
32
+ }>;
33
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/builder/validator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAwDvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAuCzE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCtF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,gBAAgB,CAAC;CAC9B,CAAC,CAWD"}
@@ -0,0 +1,150 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /**
4
+ * Validate manifest.json structure and required fields
5
+ */
6
+ export function validateManifest(projectDir) {
7
+ const manifestPath = path.join(projectDir, 'manifest.json');
8
+ const errors = [];
9
+ const warnings = [];
10
+ if (!fs.existsSync(manifestPath)) {
11
+ return { valid: false, errors: ['manifest.json not found'], warnings: [] };
12
+ }
13
+ let manifest;
14
+ try {
15
+ manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
16
+ }
17
+ catch (err) {
18
+ return { valid: false, errors: ['manifest.json is not valid JSON'], warnings: [] };
19
+ }
20
+ // Required fields
21
+ if (!manifest.id)
22
+ errors.push('manifest.id is required');
23
+ if (!manifest.version)
24
+ errors.push('manifest.version is required');
25
+ if (!manifest.name)
26
+ errors.push('manifest.name is required');
27
+ if (!manifest.description)
28
+ errors.push('manifest.description is required');
29
+ // Validate version format
30
+ if (manifest.version && !/^\d+\.\d+\.\d+/.test(manifest.version)) {
31
+ warnings.push('manifest.version should follow semver (e.g., 1.0.0)');
32
+ }
33
+ // Handler configuration
34
+ if (!manifest.handler) {
35
+ errors.push('manifest.handler is required');
36
+ }
37
+ else {
38
+ if (!manifest.handler.type)
39
+ errors.push('manifest.handler.type is required');
40
+ if (!manifest.handler.category)
41
+ errors.push('manifest.handler.category is required');
42
+ }
43
+ // Author info
44
+ if (!manifest.author) {
45
+ warnings.push('manifest.author is recommended');
46
+ }
47
+ else {
48
+ if (!manifest.author.name)
49
+ warnings.push('manifest.author.name is recommended');
50
+ }
51
+ // Inputs/Outputs
52
+ if (!manifest.inputs || !Array.isArray(manifest.inputs)) {
53
+ warnings.push('manifest.inputs should be an array');
54
+ }
55
+ if (!manifest.outputs || !Array.isArray(manifest.outputs)) {
56
+ warnings.push('manifest.outputs should be an array');
57
+ }
58
+ return {
59
+ valid: errors.length === 0,
60
+ errors,
61
+ warnings,
62
+ manifest
63
+ };
64
+ }
65
+ /**
66
+ * Validate required project files exist
67
+ */
68
+ export function validateProjectFiles(projectDir) {
69
+ const errors = [];
70
+ const warnings = [];
71
+ // Required files
72
+ const requiredFiles = [
73
+ { path: 'manifest.json', name: 'Manifest' },
74
+ { path: 'src/index.ts', name: 'Source file' },
75
+ ];
76
+ for (const file of requiredFiles) {
77
+ if (!fs.existsSync(path.join(projectDir, file.path))) {
78
+ errors.push(`${file.name} not found: ${file.path}`);
79
+ }
80
+ }
81
+ // Recommended files
82
+ const recommendedFiles = [
83
+ { path: 'assets/icon.png', name: 'Icon' },
84
+ { path: 'docs/README.md', name: 'Documentation' },
85
+ { path: 'LICENSE', name: 'License file' },
86
+ ];
87
+ for (const file of recommendedFiles) {
88
+ if (!fs.existsSync(path.join(projectDir, file.path))) {
89
+ warnings.push(`${file.name} not found: ${file.path}`);
90
+ }
91
+ }
92
+ // Check for .env file (should NOT be included in package)
93
+ if (fs.existsSync(path.join(projectDir, '.env'))) {
94
+ warnings.push('.env file found - will not be included in package');
95
+ }
96
+ return {
97
+ valid: errors.length === 0,
98
+ errors,
99
+ warnings
100
+ };
101
+ }
102
+ /**
103
+ * Check for TypeScript compilation errors
104
+ */
105
+ export async function validateTypeScript(projectDir) {
106
+ const errors = [];
107
+ const warnings = [];
108
+ // Check if tsconfig exists
109
+ const tsconfigPath = path.join(projectDir, 'tsconfig.json');
110
+ if (!fs.existsSync(tsconfigPath)) {
111
+ warnings.push('tsconfig.json not found - using default settings');
112
+ }
113
+ // Check for basic syntax errors by trying to parse
114
+ const srcIndex = path.join(projectDir, 'src', 'index.ts');
115
+ if (fs.existsSync(srcIndex)) {
116
+ try {
117
+ const ts = await import('typescript');
118
+ const source = fs.readFileSync(srcIndex, 'utf-8');
119
+ const result = ts.createSourceFile('index.ts', source, ts.ScriptTarget.Latest, true);
120
+ // Check for parse errors
121
+ const parseErrors = result.parseDiagnostics || [];
122
+ for (const diag of parseErrors) {
123
+ errors.push(`TypeScript parse error: ${diag.messageText}`);
124
+ }
125
+ }
126
+ catch (err) {
127
+ errors.push(`Failed to parse TypeScript: ${err}`);
128
+ }
129
+ }
130
+ return {
131
+ valid: errors.length === 0,
132
+ errors,
133
+ warnings
134
+ };
135
+ }
136
+ /**
137
+ * Full project validation
138
+ */
139
+ export async function validateProject(projectDir) {
140
+ const manifest = validateManifest(projectDir);
141
+ const files = validateProjectFiles(projectDir);
142
+ const typescript = await validateTypeScript(projectDir);
143
+ return {
144
+ valid: manifest.valid && files.valid && typescript.valid,
145
+ manifest,
146
+ files,
147
+ typescript
148
+ };
149
+ }
150
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/builder/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const buildCommand: Command;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,YAAY,SAsLrB,CAAC"}