antigravity-flow 1.0.0
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.
- package/README.md +182 -0
- package/dist/bin/ag-flow.js +127 -0
- package/dist/src/adapters/ConsoleLoggerAdapter.js +52 -0
- package/dist/src/adapters/EjsTemplateAdapter.js +66 -0
- package/dist/src/adapters/JsonLocalizationAdapter.js +81 -0
- package/dist/src/adapters/NodeFileSystemAdapter.js +52 -0
- package/dist/src/adapters/index.js +20 -0
- package/dist/src/commands/guide.js +89 -0
- package/dist/src/commands/index.js +19 -0
- package/dist/src/commands/init.js +581 -0
- package/dist/src/commands/templates.js +143 -0
- package/dist/src/core/ConfigService.js +75 -0
- package/dist/src/core/ContextGenerator.js +27 -0
- package/dist/src/core/DockerfileGenerator.js +151 -0
- package/dist/src/core/GitignoreGenerator.js +129 -0
- package/dist/src/core/PipelineGenerator.js +68 -0
- package/dist/src/core/RulesComposer.js +62 -0
- package/dist/src/core/StackDetector.js +115 -0
- package/dist/src/core/WorkflowGenerator.js +137 -0
- package/dist/src/core/index.js +26 -0
- package/dist/src/core/interfaces.js +2 -0
- package/dist/src/core/pipelines/PipelineStrategy.js +97 -0
- package/dist/src/core/types.js +300 -0
- package/dist/src/locales/en.json +293 -0
- package/dist/src/locales/fr.json +293 -0
- package/dist/src/templates/docker/django.Dockerfile.ejs +21 -0
- package/dist/src/templates/docker/dockerignore.ejs +12 -0
- package/dist/src/templates/docker/go.Dockerfile.ejs +20 -0
- package/dist/src/templates/docker/nestjs.Dockerfile.ejs +25 -0
- package/dist/src/templates/docker/node.Dockerfile.ejs +13 -0
- package/dist/src/templates/docker/python.Dockerfile.ejs +13 -0
- package/dist/src/templates/docker/springboot.Dockerfile.ejs +25 -0
- package/dist/src/templates/en/architect.md.ejs +85 -0
- package/dist/src/templates/en/ba.md.ejs +88 -0
- package/dist/src/templates/en/data.md.ejs +47 -0
- package/dist/src/templates/en/dev.md.ejs +77 -0
- package/dist/src/templates/en/devops.md.ejs +54 -0
- package/dist/src/templates/en/fragments/arch/feature-sliced.md.ejs +12 -0
- package/dist/src/templates/en/fragments/arch/hexagonal.md.ejs +14 -0
- package/dist/src/templates/en/fragments/arch/mvc.md.ejs +11 -0
- package/dist/src/templates/en/fragments/aspnet-core.md.ejs +11 -0
- package/dist/src/templates/en/fragments/base-rules.md.ejs +5 -0
- package/dist/src/templates/en/fragments/django.md.ejs +12 -0
- package/dist/src/templates/en/fragments/fastapi.md.ejs +11 -0
- package/dist/src/templates/en/fragments/flutter.md.ejs +11 -0
- package/dist/src/templates/en/fragments/nestjs.md.ejs +5 -0
- package/dist/src/templates/en/fragments/nextjs.md.ejs +10 -0
- package/dist/src/templates/en/fragments/react-native.md.ejs +12 -0
- package/dist/src/templates/en/fragments/react.md.ejs +5 -0
- package/dist/src/templates/en/fragments/rigor/legacy.md.ejs +6 -0
- package/dist/src/templates/en/fragments/rigor/prototype.md.ejs +6 -0
- package/dist/src/templates/en/fragments/rigor/strict.md.ejs +7 -0
- package/dist/src/templates/en/fragments/rust.md.ejs +11 -0
- package/dist/src/templates/en/fragments/scrypto.md.ejs +8 -0
- package/dist/src/templates/en/fragments/solidity.md.ejs +20 -0
- package/dist/src/templates/en/fragments/spring-boot.md.ejs +13 -0
- package/dist/src/templates/en/guide.txt +48 -0
- package/dist/src/templates/en/lead.md.ejs +76 -0
- package/dist/src/templates/en/pipelines/github-dotnet.yml.ejs +24 -0
- package/dist/src/templates/en/pipelines/github-flutter.yml.ejs +24 -0
- package/dist/src/templates/en/pipelines/github-nestjs.yml.ejs +26 -0
- package/dist/src/templates/en/pipelines/github-react.yml.ejs +26 -0
- package/dist/src/templates/en/pipelines/github-rust.yml.ejs +38 -0
- package/dist/src/templates/en/pipelines/github-scrypto.yml.ejs +34 -0
- package/dist/src/templates/en/po.md.ejs +86 -0
- package/dist/src/templates/en/project-context.md.ejs +26 -0
- package/dist/src/templates/en/qa.md.ejs +103 -0
- package/dist/src/templates/en/rules.md.ejs +30 -0
- package/dist/src/templates/en/security.md.ejs +55 -0
- package/dist/src/templates/en/techwriter.md.ejs +46 -0
- package/dist/src/templates/fr/architect.md.ejs +15 -0
- package/dist/src/templates/fr/ba.md.ejs +11 -0
- package/dist/src/templates/fr/data.md.ejs +47 -0
- package/dist/src/templates/fr/dev.md.ejs +11 -0
- package/dist/src/templates/fr/devops.md.ejs +54 -0
- package/dist/src/templates/fr/fragments/arch/feature-sliced.md.ejs +12 -0
- package/dist/src/templates/fr/fragments/arch/hexagonal.md.ejs +14 -0
- package/dist/src/templates/fr/fragments/arch/mvc.md.ejs +11 -0
- package/dist/src/templates/fr/fragments/aspnet-core.md.ejs +11 -0
- package/dist/src/templates/fr/fragments/flutter.md.ejs +11 -0
- package/dist/src/templates/fr/fragments/rigor/legacy.md.ejs +6 -0
- package/dist/src/templates/fr/fragments/rigor/prototype.md.ejs +6 -0
- package/dist/src/templates/fr/fragments/rigor/strict.md.ejs +7 -0
- package/dist/src/templates/fr/fragments/rust.md.ejs +10 -0
- package/dist/src/templates/fr/fragments/scrypto.md.ejs +8 -0
- package/dist/src/templates/fr/guide.txt +47 -0
- package/dist/src/templates/fr/lead.md.ejs +12 -0
- package/dist/src/templates/fr/po.md.ejs +11 -0
- package/dist/src/templates/fr/project-context.md.ejs +28 -0
- package/dist/src/templates/fr/qa.md.ejs +14 -0
- package/dist/src/templates/fr/rules.md.ejs +30 -0
- package/dist/src/templates/fr/security.md.ejs +55 -0
- package/dist/src/templates/fr/techwriter.md.ejs +46 -0
- package/dist/src/templates/gitignore/dotnet.txt +6 -0
- package/dist/src/templates/gitignore/go.txt +15 -0
- package/dist/src/templates/gitignore/java.txt +4 -0
- package/dist/src/templates/gitignore/jetbrains.txt +4 -0
- package/dist/src/templates/gitignore/linux.txt +5 -0
- package/dist/src/templates/gitignore/macos.txt +3 -0
- package/dist/src/templates/gitignore/node.txt +11 -0
- package/dist/src/templates/gitignore/python.txt +10 -0
- package/dist/src/templates/gitignore/rust.txt +3 -0
- package/dist/src/templates/gitignore/solidity.txt +19 -0
- package/dist/src/templates/gitignore/vscode.txt +6 -0
- package/dist/src/templates/gitignore/windows.txt +4 -0
- package/dist/tests/commands/InitCommand.spec.js +529 -0
- package/dist/tests/commands/InitConfig.spec.js +108 -0
- package/dist/tests/core/ConfigService.spec.js +97 -0
- package/dist/tests/core/ContextGenerator.spec.js +51 -0
- package/dist/tests/core/PipelineGenerator.spec.js +206 -0
- package/dist/tests/core/RulesComposer.spec.js +89 -0
- package/dist/tests/core/StackDetector.spec.js +69 -0
- package/dist/tests/core/Types.spec.js +243 -0
- package/dist/tests/core/WorkflowGenerator.spec.js +99 -0
- package/package.json +55 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.StackDetector = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const types_1 = require("./types");
|
|
39
|
+
class StackDetector {
|
|
40
|
+
fileSystem;
|
|
41
|
+
logger;
|
|
42
|
+
constructor(fileSystem, logger) {
|
|
43
|
+
this.fileSystem = fileSystem;
|
|
44
|
+
this.logger = logger;
|
|
45
|
+
}
|
|
46
|
+
async detectStack(rootPath) {
|
|
47
|
+
const stack = {};
|
|
48
|
+
try {
|
|
49
|
+
// 1. Rust / Scrypto
|
|
50
|
+
const cargoPath = path.join(rootPath, 'Cargo.toml');
|
|
51
|
+
if (await this.fileSystem.exists(cargoPath)) {
|
|
52
|
+
const content = await this.fileSystem.readFile(cargoPath);
|
|
53
|
+
if (content.includes('scrypto')) {
|
|
54
|
+
stack.smartContract = types_1.SmartContractFramework.SCRYPTO;
|
|
55
|
+
// Scrypto usually implies backend or part of it, but technically it's smart contract.
|
|
56
|
+
// Often no backend or a separate one.
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
stack.backend = types_1.BackendFramework.RUST; // Default to Rust backend if generic Cargo
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 2. Flutter
|
|
63
|
+
const pubspecPath = path.join(rootPath, 'pubspec.yaml');
|
|
64
|
+
if (await this.fileSystem.exists(pubspecPath)) {
|
|
65
|
+
stack.frontend = types_1.FrontendFramework.FLUTTER;
|
|
66
|
+
}
|
|
67
|
+
// 3. Python
|
|
68
|
+
const requirementsPath = path.join(rootPath, 'requirements.txt');
|
|
69
|
+
const pyprojectPath = path.join(rootPath, 'pyproject.toml');
|
|
70
|
+
if (await this.fileSystem.exists(requirementsPath) || await this.fileSystem.exists(pyprojectPath)) {
|
|
71
|
+
stack.backend = types_1.BackendFramework.PYTHON;
|
|
72
|
+
}
|
|
73
|
+
// 4. Node / JS Ecosystem
|
|
74
|
+
const packageJsonPath = path.join(rootPath, 'package.json');
|
|
75
|
+
if (await this.fileSystem.exists(packageJsonPath)) {
|
|
76
|
+
const content = await this.fileSystem.readFile(packageJsonPath);
|
|
77
|
+
const pkg = JSON.parse(content);
|
|
78
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
79
|
+
// Frontend detection
|
|
80
|
+
if (allDeps['react'] || allDeps['next']) {
|
|
81
|
+
stack.frontend = types_1.FrontendFramework.REACT;
|
|
82
|
+
}
|
|
83
|
+
// Backend detection (if not already set by others)
|
|
84
|
+
if (!stack.backend) {
|
|
85
|
+
if (allDeps['@nestjs/core']) {
|
|
86
|
+
stack.backend = types_1.BackendFramework.NESTJS;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Default to Node if generic package.json and no other backend specific found
|
|
90
|
+
// But only if we suspect it's backend.
|
|
91
|
+
// If just frontend deps, maybe it's just frontend.
|
|
92
|
+
// We'll set NODE as a safe fallback if no explicit backend framework is found but package.json exists.
|
|
93
|
+
stack.backend = types_1.BackendFramework.NODE;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 5. .NET
|
|
98
|
+
// We need to scan for .csproj or .sln
|
|
99
|
+
// Since IFileSystem doesn't support glob/scan easily here without specific implementation,
|
|
100
|
+
// we might skip deep scan or try a common pattern?
|
|
101
|
+
// For now, let's assume if we can't easily glob, we skip or assume user selects it.
|
|
102
|
+
// Or check specific file "Program.cs"?
|
|
103
|
+
// Let's assume user selection for .NET if not easily detectable via 'project.fsproj' etc.
|
|
104
|
+
// Actually, list_dir is not available to the class, only specific file exists checks.
|
|
105
|
+
// So let's skip .NET auto-detect for MVP unless we know a specific file. `*.sln` at root?
|
|
106
|
+
// I can't check wildcard.
|
|
107
|
+
// I will skip .NET for now.
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.logger.warn(`Failed to auto-detect stack: ${error.message}`);
|
|
111
|
+
}
|
|
112
|
+
return stack;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.StackDetector = StackDetector;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WorkflowGenerator = void 0;
|
|
37
|
+
const types_1 = require("./types");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class WorkflowGenerator {
|
|
40
|
+
fileSystem;
|
|
41
|
+
templateProvider;
|
|
42
|
+
logger;
|
|
43
|
+
localizationService;
|
|
44
|
+
rulesComposer;
|
|
45
|
+
contextGenerator;
|
|
46
|
+
constructor(fileSystem, templateProvider, logger, localizationService, rulesComposer, contextGenerator) {
|
|
47
|
+
this.fileSystem = fileSystem;
|
|
48
|
+
this.templateProvider = templateProvider;
|
|
49
|
+
this.logger = logger;
|
|
50
|
+
this.localizationService = localizationService;
|
|
51
|
+
this.rulesComposer = rulesComposer;
|
|
52
|
+
this.contextGenerator = contextGenerator;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generates workflow files for the specified project.
|
|
56
|
+
*/
|
|
57
|
+
async generateWorkflows(project, roles) {
|
|
58
|
+
this.logger.info(this.localizationService.translate('prompts.intro'));
|
|
59
|
+
// Ensure .agent/workflows directory exists for standard workflows
|
|
60
|
+
const workflowsDir = path.join(project.rootPath, project.workflowDirectory);
|
|
61
|
+
// Generate each selected role workflow
|
|
62
|
+
for (const role of roles) {
|
|
63
|
+
if (role === types_1.WorkflowRole.RULES) {
|
|
64
|
+
if (project.rulesDirectory) {
|
|
65
|
+
const rulesDir = path.join(project.rootPath, project.rulesDirectory);
|
|
66
|
+
await this.ensureDirectory(rulesDir);
|
|
67
|
+
await this.generateWorkflowForRole(role, project, rulesDir);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
await this.ensureDirectory(workflowsDir);
|
|
72
|
+
await this.generateWorkflowForRole(role, project, workflowsDir);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
this.logger.success(this.localizationService.translate('prompts.success'));
|
|
76
|
+
}
|
|
77
|
+
async ensureDirectory(dirPath) {
|
|
78
|
+
if (!(await this.fileSystem.exists(dirPath))) {
|
|
79
|
+
this.logger.info(`Creating directory: ${dirPath}`);
|
|
80
|
+
await this.fileSystem.createDirectory(dirPath);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async generateProjectContext(project) {
|
|
84
|
+
const contextContent = await this.contextGenerator.generateContext(project);
|
|
85
|
+
const contextPath = path.join(project.rootPath, '.agent/project-context.md');
|
|
86
|
+
// Ensure .agent exists (it should if workflows run, but safety first)
|
|
87
|
+
await this.ensureDirectory(path.dirname(contextPath));
|
|
88
|
+
await this.fileSystem.writeFile(contextPath, contextContent);
|
|
89
|
+
this.logger.success(`Created: ${contextPath}`);
|
|
90
|
+
}
|
|
91
|
+
async generateWorkflowForRole(role, project, outputDir) {
|
|
92
|
+
const fileName = types_1.WORKFLOW_FILES[role];
|
|
93
|
+
const outputPath = path.join(outputDir, fileName);
|
|
94
|
+
let content = '';
|
|
95
|
+
if (role === types_1.WorkflowRole.RULES) {
|
|
96
|
+
this.logger.info(`Generaring customized rules for stack: ${project.techStack.frontend}/${project.techStack.backend}...`);
|
|
97
|
+
const rulesContent = await this.rulesComposer.composeRules(project.techStack, project.rigor);
|
|
98
|
+
content = rulesContent; // Assign rulesContent to content
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const lang = this.localizationService.getLanguage();
|
|
102
|
+
const templatePath = path.join(lang, `${role}.md.ejs`);
|
|
103
|
+
this.logger.info(`Generating ${fileName} from template ${templatePath}...`);
|
|
104
|
+
try {
|
|
105
|
+
const templateContent = await this.templateProvider.getTemplate(templatePath);
|
|
106
|
+
// Load architecture fragment if needed (for architect/lead roles)
|
|
107
|
+
let folderStructure = '';
|
|
108
|
+
if (role === types_1.WorkflowRole.ARCHITECT || role === types_1.WorkflowRole.LEAD_DEV) {
|
|
109
|
+
const archTemplatePath = `${lang}/fragments/arch/${project.architecture}.md.ejs`;
|
|
110
|
+
try {
|
|
111
|
+
folderStructure = await this.templateProvider.getTemplate(archTemplatePath);
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
this.logger.warn(`Missing architecture fragment: ${archTemplatePath}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
content = this.templateProvider.render(templateContent, {
|
|
118
|
+
buildCommand: project.buildCommand,
|
|
119
|
+
testCommand: project.testCommand,
|
|
120
|
+
folderStructure: folderStructure,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
this.logger.error(`Failed to generate ${fileName}: ${error.message}`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
await this.fileSystem.writeFile(outputPath, content);
|
|
130
|
+
this.logger.success(`Created: ${outputPath}`);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
this.logger.error(`Failed to write ${fileName}: ${error.message}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.WorkflowGenerator = WorkflowGenerator;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./interfaces"), exports);
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
__exportStar(require("./WorkflowGenerator"), exports);
|
|
20
|
+
__exportStar(require("./RulesComposer"), exports);
|
|
21
|
+
__exportStar(require("./ContextGenerator"), exports);
|
|
22
|
+
__exportStar(require("./PipelineGenerator"), exports);
|
|
23
|
+
__exportStar(require("./ConfigService"), exports);
|
|
24
|
+
__exportStar(require("./StackDetector"), exports);
|
|
25
|
+
__exportStar(require("./GitignoreGenerator"), exports);
|
|
26
|
+
__exportStar(require("./DockerfileGenerator"), exports);
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PipelineStrategyFactory = exports.DefaultNodePipelineStrategy = exports.ReactPipelineStrategy = exports.FlutterPipelineStrategy = exports.NestJSPipelineStrategy = exports.DotNetPipelineStrategy = exports.PythonPipelineStrategy = exports.RustPipelineStrategy = exports.ScryptoPipelineStrategy = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class ScryptoPipelineStrategy {
|
|
6
|
+
canHandle(project) {
|
|
7
|
+
return project.techStack.smartContract === types_1.SmartContractFramework.SCRYPTO;
|
|
8
|
+
}
|
|
9
|
+
getTemplateName() {
|
|
10
|
+
return 'github-scrypto.yml.ejs';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.ScryptoPipelineStrategy = ScryptoPipelineStrategy;
|
|
14
|
+
class RustPipelineStrategy {
|
|
15
|
+
canHandle(project) {
|
|
16
|
+
return project.techStack.backend === types_1.BackendFramework.RUST;
|
|
17
|
+
}
|
|
18
|
+
getTemplateName() {
|
|
19
|
+
return 'github-rust.yml.ejs';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.RustPipelineStrategy = RustPipelineStrategy;
|
|
23
|
+
class PythonPipelineStrategy {
|
|
24
|
+
canHandle(project) {
|
|
25
|
+
return project.techStack.backend === types_1.BackendFramework.PYTHON;
|
|
26
|
+
}
|
|
27
|
+
getTemplateName() {
|
|
28
|
+
return 'github-python.yml.ejs';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.PythonPipelineStrategy = PythonPipelineStrategy;
|
|
32
|
+
class DotNetPipelineStrategy {
|
|
33
|
+
canHandle(project) {
|
|
34
|
+
return project.techStack.backend === types_1.BackendFramework.ASPNET_CORE;
|
|
35
|
+
}
|
|
36
|
+
getTemplateName() {
|
|
37
|
+
return 'github-dotnet.yml.ejs';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.DotNetPipelineStrategy = DotNetPipelineStrategy;
|
|
41
|
+
class NestJSPipelineStrategy {
|
|
42
|
+
canHandle(project) {
|
|
43
|
+
return project.techStack.backend === types_1.BackendFramework.NESTJS;
|
|
44
|
+
}
|
|
45
|
+
getTemplateName() {
|
|
46
|
+
return 'github-nestjs.yml.ejs';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.NestJSPipelineStrategy = NestJSPipelineStrategy;
|
|
50
|
+
class FlutterPipelineStrategy {
|
|
51
|
+
canHandle(project) {
|
|
52
|
+
return project.techStack.frontend === types_1.FrontendFramework.FLUTTER;
|
|
53
|
+
}
|
|
54
|
+
getTemplateName() {
|
|
55
|
+
return 'github-flutter.yml.ejs';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.FlutterPipelineStrategy = FlutterPipelineStrategy;
|
|
59
|
+
class ReactPipelineStrategy {
|
|
60
|
+
canHandle(project) {
|
|
61
|
+
return project.techStack.frontend !== types_1.FrontendFramework.NONE && project.techStack.frontend !== types_1.FrontendFramework.FLUTTER;
|
|
62
|
+
}
|
|
63
|
+
getTemplateName() {
|
|
64
|
+
return 'github-react.yml.ejs';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.ReactPipelineStrategy = ReactPipelineStrategy;
|
|
68
|
+
class DefaultNodePipelineStrategy {
|
|
69
|
+
canHandle(project) {
|
|
70
|
+
return true; // Fallback
|
|
71
|
+
}
|
|
72
|
+
getTemplateName() {
|
|
73
|
+
return 'github-node.yml.ejs';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.DefaultNodePipelineStrategy = DefaultNodePipelineStrategy;
|
|
77
|
+
class PipelineStrategyFactory {
|
|
78
|
+
strategies = [
|
|
79
|
+
new ScryptoPipelineStrategy(),
|
|
80
|
+
new RustPipelineStrategy(),
|
|
81
|
+
new PythonPipelineStrategy(),
|
|
82
|
+
new DotNetPipelineStrategy(),
|
|
83
|
+
new NestJSPipelineStrategy(),
|
|
84
|
+
new FlutterPipelineStrategy(),
|
|
85
|
+
new ReactPipelineStrategy(), // Checks if frontend != NONE
|
|
86
|
+
new DefaultNodePipelineStrategy()
|
|
87
|
+
];
|
|
88
|
+
getStrategy(project) {
|
|
89
|
+
for (const strategy of this.strategies) {
|
|
90
|
+
if (strategy.canHandle(project)) {
|
|
91
|
+
return strategy;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return new DefaultNodePipelineStrategy();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.PipelineStrategyFactory = PipelineStrategyFactory;
|