@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
package/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # afh - AgenticFlow Handler CLI
2
+
3
+ CLI tool for developing, testing, and building AgenticFlow handlers.
4
+
5
+ > ⚠️ **Beta Release** - Publishing to marketplace is under development.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install -g @agenticflow/cli
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ # Create a new handler
17
+ afh init my-handler --yes
18
+ cd my-handler
19
+
20
+ # Start development server
21
+ npm install
22
+ afh dev
23
+
24
+ # Build package
25
+ afh build
26
+ ```
27
+
28
+ ## Commands
29
+
30
+ ### `afh init <name>`
31
+
32
+ Create a new handler project from template.
33
+
34
+ ```bash
35
+ afh init my-stripe-handler
36
+ afh init my-handler --stateful
37
+ afh init my-handler --yes # Skip prompts
38
+ ```
39
+
40
+ **Options:**
41
+ - `--stateful` - Create a stateful handler (supports checkpoints)
42
+ - `--yes, -y` - Skip prompts and use defaults
43
+ - `--category <cat>` - Handler category (ai, data, external, control, utility)
44
+
45
+ ### `afh dev`
46
+
47
+ Start development server with hot-reload and web UI.
48
+
49
+ ```bash
50
+ afh dev
51
+ ```
52
+
53
+ Opens a browser-based development environment with:
54
+ - **Test Tab** - Execute handlers with test values
55
+ - **Inspector Tab** - View handler inputs and metadata
56
+ - **Trace Tab** - Debug execution flow
57
+ - **Docs Tab** - Preview documentation
58
+ - **Build Tab** - Build and package for distribution
59
+
60
+ ### `afh test`
61
+
62
+ Run unit tests for your handler.
63
+
64
+ ```bash
65
+ afh test
66
+ ```
67
+
68
+ ### `afh build`
69
+
70
+ Package handler for distribution.
71
+
72
+ ```bash
73
+ afh build
74
+ ```
75
+
76
+ Creates a `.afh` package file ready for publishing.
77
+
78
+ ## Handler Structure
79
+
80
+ ```
81
+ my-handler/
82
+ ├── manifest.json # Handler metadata
83
+ ├── package.json # Dependencies
84
+ ├── src/
85
+ │ ├── index.ts # Main handler code
86
+ │ └── utils.ts # Development utilities
87
+ ├── docs/
88
+ │ └── README.md # Documentation
89
+ ├── assets/
90
+ │ └── icon.png # Handler icon (256x256)
91
+ └── .env # Local secrets (gitignored)
92
+ ```
93
+
94
+ ## Development with @TestValue
95
+
96
+ Use the `@TestValue` decorator to provide test values during development:
97
+
98
+ ```typescript
99
+ import { Handler, Input, StatelessHandler, StepResult } from '@flowmonkey/core';
100
+ import { TestValue } from './utils';
101
+
102
+ @Handler({
103
+ type: 'my-handler',
104
+ name: 'My Handler',
105
+ category: 'utility',
106
+ })
107
+ export class MyHandler extends StatelessHandler<Input, Output> {
108
+ @Input({ type: 'string', source: 'vault', required: true })
109
+ @TestValue(process.env.API_KEY!) // Stripped at build time
110
+ apiKey!: string;
111
+
112
+ async execute(): Promise<StepResult<Output>> {
113
+ // Your handler logic
114
+ return this.success({ result: 'done' });
115
+ }
116
+ }
117
+
118
+ export default new MyHandler();
119
+ ```
120
+
121
+ `@TestValue` decorators are automatically stripped from production builds.
122
+
123
+ ## License
124
+
125
+ MIT
@@ -0,0 +1,121 @@
1
+ # Technical Debt & Known Issues
2
+
3
+ This document tracks technical debt, workarounds, and proposed fixes for the `@agenticflow/cli` package.
4
+
5
+ ## Resolved Issues
6
+
7
+ ### 1. `.npmignore` Stripping Nested `src/` Directories (FIXED in beta.7)
8
+
9
+ **Problem:** `.npmignore` with `src/` pattern was stripping ALL directories named `src/`, including:
10
+ - `dist/templates/stateless/src/`
11
+ - `dist/templates/stateful/src/`
12
+ - `dist/templates/_shared/src/`
13
+ - `dist/dev/ui/src/`
14
+
15
+ **Root Cause:** In `.gitignore`/`.npmignore`, patterns without a leading `/` match anywhere in the tree.
16
+
17
+ **Fix:** Changed `.npmignore` from `src/` to `/src/`:
18
+ - `src/` - matches ANY directory named `src` anywhere (wrong)
19
+ - `/src/` - matches only the TOP-LEVEL `src` directory (correct)
20
+
21
+ **Lesson:** Always use leading `/` for patterns that should only match at the root level.
22
+
23
+ ---
24
+
25
+ ### 2. `init copy.js` Artifact in Published Package
26
+
27
+ **Problem:** An old backup file `src/cli/init copy.ts` was accidentally included in builds.
28
+
29
+ **Status:** Source file deleted, but `dist/cli/init copy.js` may still exist in older published versions.
30
+
31
+ **Fix:** Clean `dist/` before each build to prevent stale files.
32
+
33
+ ---
34
+
35
+ ## Proposed Improvements
36
+
37
+ ### 1. Switch to `package.json` `files` Field
38
+
39
+ Instead of `.npmignore`, use explicit inclusion in `package.json`:
40
+
41
+ ```json
42
+ {
43
+ "files": [
44
+ "dist/",
45
+ "README.md"
46
+ ]
47
+ }
48
+ ```
49
+
50
+ This is more predictable and doesn't have the recursive pattern issues.
51
+
52
+ ### 2. Add Pre-publish Validation
53
+
54
+ Add a script that verifies the package contents before publishing:
55
+
56
+ ```bash
57
+ npm run prepublish:check
58
+ ```
59
+
60
+ This should verify:
61
+ - All template files exist in `dist/templates/`
62
+ - UI source files exist in `dist/dev/ui/_src_/`
63
+ - No `.env` or secret files are included
64
+ - Package size is within expected bounds
65
+
66
+ ### 3. Add Automated Tests
67
+
68
+ Create tests that:
69
+ - Mock `afh init` and verify all expected files are created
70
+ - Verify template processing works correctly
71
+ - Test the `_src_` → `src` mapping
72
+ - Test the build security scanner
73
+
74
+ ### 4. CI/CD Pipeline
75
+
76
+ Add GitHub Actions to:
77
+ - Run tests on PR
78
+ - Build and verify package contents
79
+ - Publish to npm on release tags
80
+
81
+ ---
82
+
83
+ ## Version History of Fixes
84
+
85
+ | Version | Fix |
86
+ |---------|-----|
87
+ | beta.1 | Initial release |
88
+ | beta.2 | Branding updates (FlowMonkey → AgenticFlow) |
89
+ | beta.3 | Attempted template path resolution fix |
90
+ | beta.4 | `_src_` workaround for template directories |
91
+ | beta.5 | `_src_` workaround for UI directory |
92
+
93
+ ---
94
+
95
+ ## Testing Checklist
96
+
97
+ Before publishing a new version, verify on a **fresh machine** (or clean npm cache):
98
+
99
+ ```bash
100
+ # Install globally
101
+ npm install -g @agenticflow/cli@latest
102
+
103
+ # Test init
104
+ afh init test-handler --yes
105
+ cd test-handler
106
+
107
+ # Verify files exist
108
+ ls -la src/ # Should have index.ts and utils.ts
109
+ cat src/index.ts # Should have handler code
110
+
111
+ # Test dev server
112
+ npm install
113
+ afh dev # Should start API server and UI
114
+ ```
115
+
116
+ ---
117
+
118
+ ## Notes
119
+
120
+ - The `@flowmonkey/core` package references should remain unchanged - that's the actual npm package name for the handler runtime
121
+ - `afh/dev` import in handlers is a local re-export from `utils.ts`, not an npm package
@@ -0,0 +1,17 @@
1
+ export interface BundleResult {
2
+ code: string;
3
+ map?: string;
4
+ errors: string[];
5
+ warnings: string[];
6
+ }
7
+ /**
8
+ * Simple bundler that compiles TypeScript and concatenates files
9
+ * For a production implementation, you'd use esbuild, rollup, or webpack
10
+ */
11
+ export declare function bundleHandler(projectDir: string, strippedSrcDir: string): Promise<BundleResult>;
12
+ /**
13
+ * Minify JavaScript code (basic implementation)
14
+ * For production, use terser
15
+ */
16
+ export declare function minifyCode(code: string): string;
17
+ //# sourceMappingURL=bundler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../src/builder/bundler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,CAAC,CAqHvB;AAkCD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe/C"}
@@ -0,0 +1,170 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as ts from 'typescript';
4
+ /**
5
+ * Simple bundler that compiles TypeScript and concatenates files
6
+ * For a production implementation, you'd use esbuild, rollup, or webpack
7
+ */
8
+ export async function bundleHandler(projectDir, strippedSrcDir) {
9
+ const errors = [];
10
+ const warnings = [];
11
+ // Read tsconfig if exists, or use defaults
12
+ let compilerOptions = {
13
+ target: ts.ScriptTarget.ES2020,
14
+ module: ts.ModuleKind.ES2020,
15
+ moduleResolution: ts.ModuleResolutionKind.Node10,
16
+ declaration: false,
17
+ sourceMap: false,
18
+ strict: true,
19
+ esModuleInterop: true,
20
+ skipLibCheck: true,
21
+ experimentalDecorators: true,
22
+ emitDecoratorMetadata: true,
23
+ };
24
+ const tsconfigPath = path.join(projectDir, 'tsconfig.json');
25
+ if (fs.existsSync(tsconfigPath)) {
26
+ try {
27
+ const tsconfigContent = fs.readFileSync(tsconfigPath, 'utf-8');
28
+ const tsconfig = JSON.parse(tsconfigContent);
29
+ if (tsconfig.compilerOptions) {
30
+ // Merge with our defaults
31
+ compilerOptions = { ...compilerOptions, ...parseCompilerOptions(tsconfig.compilerOptions) };
32
+ }
33
+ }
34
+ catch (err) {
35
+ warnings.push(`Failed to parse tsconfig.json: ${err}`);
36
+ }
37
+ }
38
+ // Find all TypeScript files
39
+ const sourceFiles = [];
40
+ function findTsFiles(dir) {
41
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
42
+ for (const entry of entries) {
43
+ const fullPath = path.join(dir, entry.name);
44
+ if (entry.isDirectory()) {
45
+ findTsFiles(fullPath);
46
+ }
47
+ else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.d.ts')) {
48
+ sourceFiles.push(fullPath);
49
+ }
50
+ }
51
+ }
52
+ findTsFiles(strippedSrcDir);
53
+ if (sourceFiles.length === 0) {
54
+ return {
55
+ code: '',
56
+ errors: ['No TypeScript files found'],
57
+ warnings
58
+ };
59
+ }
60
+ // Compile TypeScript
61
+ const program = ts.createProgram(sourceFiles, compilerOptions);
62
+ const emitResult = program.emit();
63
+ // Collect diagnostics
64
+ const diagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
65
+ for (const diagnostic of diagnostics) {
66
+ const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
67
+ if (diagnostic.file) {
68
+ const { line } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
69
+ const fileName = path.relative(projectDir, diagnostic.file.fileName);
70
+ if (diagnostic.category === ts.DiagnosticCategory.Error) {
71
+ errors.push(`${fileName}:${line + 1}: ${message}`);
72
+ }
73
+ else {
74
+ warnings.push(`${fileName}:${line + 1}: ${message}`);
75
+ }
76
+ }
77
+ else {
78
+ if (diagnostic.category === ts.DiagnosticCategory.Error) {
79
+ errors.push(message);
80
+ }
81
+ else {
82
+ warnings.push(message);
83
+ }
84
+ }
85
+ }
86
+ // If there are errors, return early
87
+ if (errors.length > 0) {
88
+ return { code: '', errors, warnings };
89
+ }
90
+ // For a simple bundler, we'll compile each file and concatenate
91
+ // In production, you'd want to use a proper bundler like esbuild
92
+ let bundledCode = '';
93
+ // Add a simple module wrapper
94
+ bundledCode += '// Handler Bundle - Generated by afh build\n';
95
+ bundledCode += '// Do not edit this file directly\n\n';
96
+ // Transpile each file
97
+ for (const sourceFile of sourceFiles) {
98
+ const source = fs.readFileSync(sourceFile, 'utf-8');
99
+ const relativePath = path.relative(strippedSrcDir, sourceFile);
100
+ const result = ts.transpileModule(source, {
101
+ compilerOptions: {
102
+ ...compilerOptions,
103
+ module: ts.ModuleKind.ES2020,
104
+ },
105
+ fileName: sourceFile,
106
+ });
107
+ bundledCode += `// --- ${relativePath} ---\n`;
108
+ bundledCode += result.outputText;
109
+ bundledCode += '\n\n';
110
+ }
111
+ return {
112
+ code: bundledCode,
113
+ errors,
114
+ warnings
115
+ };
116
+ }
117
+ /**
118
+ * Parse compiler options from tsconfig format to ts.CompilerOptions
119
+ */
120
+ function parseCompilerOptions(options) {
121
+ const result = {};
122
+ if (options.target) {
123
+ const targetMap = {
124
+ 'ES5': ts.ScriptTarget.ES5,
125
+ 'ES6': ts.ScriptTarget.ES2015,
126
+ 'ES2015': ts.ScriptTarget.ES2015,
127
+ 'ES2016': ts.ScriptTarget.ES2016,
128
+ 'ES2017': ts.ScriptTarget.ES2017,
129
+ 'ES2018': ts.ScriptTarget.ES2018,
130
+ 'ES2019': ts.ScriptTarget.ES2019,
131
+ 'ES2020': ts.ScriptTarget.ES2020,
132
+ 'ES2021': ts.ScriptTarget.ES2021,
133
+ 'ES2022': ts.ScriptTarget.ES2022,
134
+ 'ESNext': ts.ScriptTarget.ESNext,
135
+ };
136
+ result.target = targetMap[options.target.toUpperCase()] || ts.ScriptTarget.ES2020;
137
+ }
138
+ if (options.strict !== undefined)
139
+ result.strict = options.strict;
140
+ if (options.esModuleInterop !== undefined)
141
+ result.esModuleInterop = options.esModuleInterop;
142
+ if (options.skipLibCheck !== undefined)
143
+ result.skipLibCheck = options.skipLibCheck;
144
+ if (options.experimentalDecorators !== undefined)
145
+ result.experimentalDecorators = options.experimentalDecorators;
146
+ if (options.emitDecoratorMetadata !== undefined)
147
+ result.emitDecoratorMetadata = options.emitDecoratorMetadata;
148
+ return result;
149
+ }
150
+ /**
151
+ * Minify JavaScript code (basic implementation)
152
+ * For production, use terser
153
+ */
154
+ export function minifyCode(code) {
155
+ // Basic minification - remove comments and extra whitespace
156
+ // In production, you'd use terser for proper minification
157
+ return code
158
+ // Remove single-line comments (but not URLs)
159
+ .replace(/(?<!:)\/\/(?!\/).*$/gm, '')
160
+ // Remove multi-line comments
161
+ .replace(/\/\*[\s\S]*?\*\//g, '')
162
+ // Collapse multiple newlines
163
+ .replace(/\n\s*\n\s*\n/g, '\n\n')
164
+ // Remove leading/trailing whitespace from lines
165
+ .split('\n')
166
+ .map(line => line.trim())
167
+ .filter(line => line.length > 0)
168
+ .join('\n');
169
+ }
170
+ //# sourceMappingURL=bundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../src/builder/bundler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { stripDevCode, stripDevCodeFromDirectory } from './stripper.js';
2
+ export { validateManifest, validateProjectFiles, validateTypeScript, validateProject } from './validator.js';
3
+ export { scanFile, scanDirectory, scanBundledCode } from './security.js';
4
+ export { bundleHandler, minifyCode } from './bundler.js';
5
+ export { createPackage, verifyPackage, getPackageInfo, formatSize } from './packager.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { stripDevCode, stripDevCodeFromDirectory } from './stripper.js';
2
+ export { validateManifest, validateProjectFiles, validateTypeScript, validateProject } from './validator.js';
3
+ export { scanFile, scanDirectory, scanBundledCode } from './security.js';
4
+ export { bundleHandler, minifyCode } from './bundler.js';
5
+ export { createPackage, verifyPackage, getPackageInfo, formatSize } from './packager.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,41 @@
1
+ export interface PackageContents {
2
+ 'handler.bundle.js': string;
3
+ 'manifest.json': string;
4
+ 'README.md'?: string;
5
+ 'LICENSE'?: string;
6
+ 'icon.png'?: Buffer;
7
+ }
8
+ export interface PackageInfo {
9
+ id: string;
10
+ version: string;
11
+ name: string;
12
+ size: number;
13
+ checksum: string;
14
+ files: string[];
15
+ }
16
+ /**
17
+ * Create a .afh package file (zip format)
18
+ */
19
+ export declare function createPackage(projectDir: string, bundledCode: string, outputPath: string): Promise<PackageInfo>;
20
+ /**
21
+ * Extract and verify a .afh package
22
+ */
23
+ export declare function verifyPackage(packagePath: string): Promise<{
24
+ valid: boolean;
25
+ manifest?: any;
26
+ files: string[];
27
+ errors: string[];
28
+ }>;
29
+ /**
30
+ * Get package info without extracting
31
+ */
32
+ export declare function getPackageInfo(packagePath: string): {
33
+ size: number;
34
+ checksum: string;
35
+ filename: string;
36
+ };
37
+ /**
38
+ * Format file size for display
39
+ */
40
+ export declare function formatSize(bytes: number): string;
41
+ //# sourceMappingURL=packager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packager.d.ts","sourceRoot":"","sources":["../../src/builder/packager.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAsFtB;AAUD;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAuCD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAOA;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD"}
@@ -0,0 +1,145 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as crypto from 'crypto';
4
+ /**
5
+ * Create a .afh package file (zip format)
6
+ */
7
+ export async function createPackage(projectDir, bundledCode, outputPath) {
8
+ // Dynamic import archiver
9
+ const archiver = (await import('archiver')).default;
10
+ const manifestPath = path.join(projectDir, 'manifest.json');
11
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
12
+ const packageName = `${manifest.id}-${manifest.version}.afh`;
13
+ const packagePath = path.join(outputPath, packageName);
14
+ // Ensure output directory exists
15
+ fs.mkdirSync(outputPath, { recursive: true });
16
+ // Create write stream
17
+ const output = fs.createWriteStream(packagePath);
18
+ const archive = archiver('zip', {
19
+ zlib: { level: 9 } // Maximum compression
20
+ });
21
+ const files = [];
22
+ return new Promise((resolve, reject) => {
23
+ output.on('close', () => {
24
+ const stats = fs.statSync(packagePath);
25
+ const checksum = calculateChecksum(packagePath);
26
+ resolve({
27
+ id: manifest.id,
28
+ version: manifest.version,
29
+ name: manifest.name,
30
+ size: stats.size,
31
+ checksum,
32
+ files
33
+ });
34
+ });
35
+ archive.on('error', (err) => {
36
+ reject(err);
37
+ });
38
+ archive.pipe(output);
39
+ // Add bundled handler code
40
+ archive.append(bundledCode, { name: 'handler.bundle.js' });
41
+ files.push('handler.bundle.js');
42
+ // Add manifest
43
+ archive.file(manifestPath, { name: 'manifest.json' });
44
+ files.push('manifest.json');
45
+ // Add README if exists
46
+ const readmePaths = [
47
+ path.join(projectDir, 'docs', 'README.md'),
48
+ path.join(projectDir, 'README.md')
49
+ ];
50
+ for (const readmePath of readmePaths) {
51
+ if (fs.existsSync(readmePath)) {
52
+ archive.file(readmePath, { name: 'README.md' });
53
+ files.push('README.md');
54
+ break;
55
+ }
56
+ }
57
+ // Add LICENSE if exists
58
+ const licensePath = path.join(projectDir, 'LICENSE');
59
+ if (fs.existsSync(licensePath)) {
60
+ archive.file(licensePath, { name: 'LICENSE' });
61
+ files.push('LICENSE');
62
+ }
63
+ // Add icon if exists
64
+ const iconPath = path.join(projectDir, 'assets', 'icon.png');
65
+ if (fs.existsSync(iconPath)) {
66
+ archive.file(iconPath, { name: 'assets/icon.png' });
67
+ files.push('assets/icon.png');
68
+ }
69
+ // Add preview image if exists
70
+ const previewPath = path.join(projectDir, 'assets', 'preview.png');
71
+ if (fs.existsSync(previewPath)) {
72
+ archive.file(previewPath, { name: 'assets/preview.png' });
73
+ files.push('assets/preview.png');
74
+ }
75
+ archive.finalize();
76
+ });
77
+ }
78
+ /**
79
+ * Calculate SHA256 checksum of a file
80
+ */
81
+ function calculateChecksum(filePath) {
82
+ const content = fs.readFileSync(filePath);
83
+ return crypto.createHash('sha256').update(content).digest('hex');
84
+ }
85
+ /**
86
+ * Extract and verify a .afh package
87
+ */
88
+ export async function verifyPackage(packagePath) {
89
+ const errors = [];
90
+ const files = [];
91
+ let manifest = null;
92
+ try {
93
+ const unzipper = await import('unzipper');
94
+ const directory = await unzipper.Open.file(packagePath);
95
+ for (const entry of directory.files) {
96
+ files.push(entry.path);
97
+ if (entry.path === 'manifest.json') {
98
+ const content = await entry.buffer();
99
+ manifest = JSON.parse(content.toString());
100
+ }
101
+ }
102
+ // Check required files
103
+ if (!files.includes('handler.bundle.js')) {
104
+ errors.push('Missing handler.bundle.js');
105
+ }
106
+ if (!files.includes('manifest.json')) {
107
+ errors.push('Missing manifest.json');
108
+ }
109
+ return {
110
+ valid: errors.length === 0,
111
+ manifest,
112
+ files,
113
+ errors
114
+ };
115
+ }
116
+ catch (err) {
117
+ return {
118
+ valid: false,
119
+ files: [],
120
+ errors: [`Failed to open package: ${err}`]
121
+ };
122
+ }
123
+ }
124
+ /**
125
+ * Get package info without extracting
126
+ */
127
+ export function getPackageInfo(packagePath) {
128
+ const stats = fs.statSync(packagePath);
129
+ return {
130
+ size: stats.size,
131
+ checksum: calculateChecksum(packagePath),
132
+ filename: path.basename(packagePath)
133
+ };
134
+ }
135
+ /**
136
+ * Format file size for display
137
+ */
138
+ export function formatSize(bytes) {
139
+ if (bytes < 1024)
140
+ return `${bytes} B`;
141
+ if (bytes < 1024 * 1024)
142
+ return `${(bytes / 1024).toFixed(1)} KB`;
143
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
144
+ }
145
+ //# sourceMappingURL=packager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packager.js","sourceRoot":"","sources":["../../src/builder/packager.ts"],"names":[],"mappings":"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"}