@ticatec/omniflow 0.1.5
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.
Potentially problematic release.
This version of @ticatec/omniflow might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/README.md +476 -0
- package/dist/cli/commands/run.d.ts +7 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +242 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +211 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/omniflow.d.ts +115 -0
- package/dist/config/omniflow.d.ts.map +1 -0
- package/dist/config/omniflow.js +451 -0
- package/dist/config/omniflow.js.map +1 -0
- package/dist/core/git.d.ts +22 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +164 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/strategies/BaseMergeRequest.d.ts +58 -0
- package/dist/core/strategies/BaseMergeRequest.d.ts.map +1 -0
- package/dist/core/strategies/BaseMergeRequest.js +57 -0
- package/dist/core/strategies/BaseMergeRequest.js.map +1 -0
- package/dist/core/strategies/ForgejoRequest.d.ts +35 -0
- package/dist/core/strategies/ForgejoRequest.d.ts.map +1 -0
- package/dist/core/strategies/ForgejoRequest.js +82 -0
- package/dist/core/strategies/ForgejoRequest.js.map +1 -0
- package/dist/core/strategies/GitHubRequest.d.ts +34 -0
- package/dist/core/strategies/GitHubRequest.d.ts.map +1 -0
- package/dist/core/strategies/GitHubRequest.js +84 -0
- package/dist/core/strategies/GitHubRequest.js.map +1 -0
- package/dist/core/strategies/GitLabRequest.d.ts +25 -0
- package/dist/core/strategies/GitLabRequest.d.ts.map +1 -0
- package/dist/core/strategies/GitLabRequest.js +70 -0
- package/dist/core/strategies/GitLabRequest.js.map +1 -0
- package/dist/core/strategies/index.d.ts +36 -0
- package/dist/core/strategies/index.d.ts.map +1 -0
- package/dist/core/strategies/index.js +50 -0
- package/dist/core/strategies/index.js.map +1 -0
- package/dist/core/strategies/types.d.ts +22 -0
- package/dist/core/strategies/types.d.ts.map +1 -0
- package/dist/core/strategies/types.js +5 -0
- package/dist/core/strategies/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/types/config.d.ts +63 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
// Omniflow configuration loader
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import YAML from 'yaml';
|
|
6
|
+
export class OmniflowConfigLoader {
|
|
7
|
+
config = null;
|
|
8
|
+
initialized = false;
|
|
9
|
+
/**
|
|
10
|
+
* Ensure configuration is initialized (fetch from git if needed)
|
|
11
|
+
*/
|
|
12
|
+
async ensureInitialized() {
|
|
13
|
+
if (this.initialized)
|
|
14
|
+
return;
|
|
15
|
+
const { OMNIFLOW_CONFIG_REPO, OMNIFLOW_CONFIG_BRANCH = 'main', OMNIFLOW_CONFIG_FILE = 'config.yaml', GIT_USERNAME, GIT_PASSWORD, GIT_TOKEN } = process.env;
|
|
16
|
+
if (!OMNIFLOW_CONFIG_REPO) {
|
|
17
|
+
throw new Error('\n❌ Configuration error: OMNIFLOW_CONFIG_REPO environment variable is not set\n' +
|
|
18
|
+
'Please set the configuration repository URL:\n' +
|
|
19
|
+
' export OMNIFLOW_CONFIG_REPO=https://your-git-repo/config.git\n');
|
|
20
|
+
}
|
|
21
|
+
// Config directory - ~/.omniflow/config/
|
|
22
|
+
const OMNIFLOW_HOME = process.env.OMNIFLOW_HOME || path.join(os.homedir(), '.omniflow');
|
|
23
|
+
const configDir = path.join(OMNIFLOW_HOME, 'config');
|
|
24
|
+
const configPath = path.join(configDir, OMNIFLOW_CONFIG_FILE);
|
|
25
|
+
// Check if config file exists
|
|
26
|
+
const configExists = await fs.access(configPath).then(() => true).catch(() => false);
|
|
27
|
+
if (configExists) {
|
|
28
|
+
this.initialized = true;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Build authenticated URL
|
|
32
|
+
let repoUrl = OMNIFLOW_CONFIG_REPO;
|
|
33
|
+
const password = GIT_TOKEN || GIT_PASSWORD;
|
|
34
|
+
if (GIT_USERNAME && password) {
|
|
35
|
+
try {
|
|
36
|
+
const urlObj = new URL(OMNIFLOW_CONFIG_REPO);
|
|
37
|
+
urlObj.username = GIT_USERNAME;
|
|
38
|
+
urlObj.password = password;
|
|
39
|
+
repoUrl = urlObj.toString();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Invalid URL, use as-is
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Clone config repository
|
|
46
|
+
console.log(`\n📋 Initializing omniflow configuration...`);
|
|
47
|
+
console.log(` Repository: ${OMNIFLOW_CONFIG_REPO}`);
|
|
48
|
+
console.log(` Branch: ${OMNIFLOW_CONFIG_BRANCH}`);
|
|
49
|
+
console.log(` Target: ${configDir}\n`);
|
|
50
|
+
try {
|
|
51
|
+
// Clone the config repository
|
|
52
|
+
const { execaCommand } = await import('execa');
|
|
53
|
+
await execaCommand(`git clone --depth 1 --branch ${OMNIFLOW_CONFIG_BRANCH} --single-branch ${repoUrl} ${configDir}`, {
|
|
54
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' }
|
|
55
|
+
});
|
|
56
|
+
// Verify config.yaml exists
|
|
57
|
+
await fs.access(configPath);
|
|
58
|
+
console.log('✅ Configuration initialized\n');
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error(`\n❌ Failed to initialize configuration: ${error.message}\n`);
|
|
62
|
+
console.error('Please check:');
|
|
63
|
+
console.error(' - OMNIFLOW_CONFIG_REPO URL is correct');
|
|
64
|
+
console.error(' - Git authentication is configured (GIT_USERNAME, GIT_TOKEN)');
|
|
65
|
+
console.error(' - Network connectivity\n');
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
this.initialized = true;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Load configuration
|
|
72
|
+
* Uses cached config if available, otherwise fetches from git
|
|
73
|
+
*/
|
|
74
|
+
async load() {
|
|
75
|
+
if (this.config) {
|
|
76
|
+
return this.config;
|
|
77
|
+
}
|
|
78
|
+
// Ensure configuration is initialized
|
|
79
|
+
await this.ensureInitialized();
|
|
80
|
+
// Read and parse config file
|
|
81
|
+
const { OMNIFLOW_CONFIG_FILE = 'config.yaml' } = process.env;
|
|
82
|
+
const OMNIFLOW_HOME = process.env.OMNIFLOW_HOME || path.join(os.homedir(), '.omniflow');
|
|
83
|
+
const configPath = path.join(OMNIFLOW_HOME, 'config', OMNIFLOW_CONFIG_FILE);
|
|
84
|
+
try {
|
|
85
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
86
|
+
const rawConfig = YAML.parse(content);
|
|
87
|
+
// Validate required fields
|
|
88
|
+
if (!rawConfig.omniflow) {
|
|
89
|
+
throw new Error('Missing "omniflow" section in configuration');
|
|
90
|
+
}
|
|
91
|
+
if (!rawConfig.projects) {
|
|
92
|
+
throw new Error('Missing "projects" section in configuration');
|
|
93
|
+
}
|
|
94
|
+
this.config = this.resolveEnvVars(rawConfig);
|
|
95
|
+
return this.config;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error.code === 'ENOENT') {
|
|
99
|
+
throw new Error(`Configuration file not found: ${configPath}`);
|
|
100
|
+
}
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Find a project by its path (supports nested paths like "omni-gate/platform")
|
|
106
|
+
*/
|
|
107
|
+
findProjectByPath(projects, pathParts) {
|
|
108
|
+
const [current, ...rest] = pathParts;
|
|
109
|
+
for (const item of projects) {
|
|
110
|
+
if (item.name === current) {
|
|
111
|
+
if (rest.length === 0) {
|
|
112
|
+
// 找到目标,检查是否是文件夹
|
|
113
|
+
return item.type === 'folder' ? null : item;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// 继续在子项中查找(只有 folder 有 items)
|
|
117
|
+
if (item.type === 'folder' && item.items) {
|
|
118
|
+
return this.findProjectByPath(item.items, rest);
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get a specific project configuration by path
|
|
128
|
+
* @param projectPath Project path like "omni-gate/platform" or "platform"
|
|
129
|
+
*/
|
|
130
|
+
async getProject(projectPath) {
|
|
131
|
+
const config = await this.load();
|
|
132
|
+
const pathParts = projectPath.split('/');
|
|
133
|
+
const project = this.findProjectByPath(config.projects, pathParts);
|
|
134
|
+
return project;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all projects (flattened, excluding folders)
|
|
138
|
+
*/
|
|
139
|
+
async listProjects() {
|
|
140
|
+
const config = await this.load();
|
|
141
|
+
const projects = [];
|
|
142
|
+
const traverse = (items, prefix = '') => {
|
|
143
|
+
for (const project of items) {
|
|
144
|
+
const path = prefix ? `${prefix}/${project.name}` : project.name;
|
|
145
|
+
if (project.type === 'folder') {
|
|
146
|
+
if (project.items) {
|
|
147
|
+
traverse(project.items, path);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
projects.push({
|
|
152
|
+
key: path,
|
|
153
|
+
name: project.name,
|
|
154
|
+
description: project.description
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
traverse(config.projects);
|
|
160
|
+
return projects;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* List all items (including folders) with their structure
|
|
164
|
+
*/
|
|
165
|
+
async listProjectTree() {
|
|
166
|
+
const config = await this.load();
|
|
167
|
+
const buildTree = (items, prefix = '') => {
|
|
168
|
+
return items.map(item => {
|
|
169
|
+
const path = prefix ? `${prefix}/${item.name}` : item.name;
|
|
170
|
+
const isFolder = item.type === 'folder';
|
|
171
|
+
return {
|
|
172
|
+
name: item.name,
|
|
173
|
+
description: item.description,
|
|
174
|
+
type: isFolder ? 'folder' : 'project',
|
|
175
|
+
path: path.split('/'),
|
|
176
|
+
children: isFolder && item.items ? buildTree(item.items, path) : undefined,
|
|
177
|
+
config: isFolder ? undefined : item
|
|
178
|
+
};
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
return buildTree(config.projects);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get environment configuration for a project
|
|
185
|
+
* @param projectPath Project path like "omni-gate/platform"
|
|
186
|
+
* @param envName Environment name like "test" or "prod"
|
|
187
|
+
*/
|
|
188
|
+
async getEnvironment(projectPath, envName) {
|
|
189
|
+
const project = await this.getProject(projectPath);
|
|
190
|
+
if (!project || !project.environments)
|
|
191
|
+
return null;
|
|
192
|
+
// Find environment by name
|
|
193
|
+
const envConfig = project.environments.find(e => e.name === envName);
|
|
194
|
+
return envConfig || null;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Alias for getEnvironment (backward compatibility)
|
|
198
|
+
*/
|
|
199
|
+
async getBranch(projectPath, branchName) {
|
|
200
|
+
return this.getEnvironment(projectPath, branchName);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* List environments for a project
|
|
204
|
+
* @param projectPath Project path like "omni-gate/platform"
|
|
205
|
+
*/
|
|
206
|
+
async listEnvironments(projectPath) {
|
|
207
|
+
const project = await this.getProject(projectPath);
|
|
208
|
+
if (!project || !project.environments)
|
|
209
|
+
return [];
|
|
210
|
+
return project.environments.map(e => e.name);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Alias for listEnvironments (backward compatibility)
|
|
214
|
+
*/
|
|
215
|
+
async listBranches(projectPath) {
|
|
216
|
+
return this.listEnvironments(projectPath);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get merged Git configuration for a project
|
|
220
|
+
* @param projectPath Project path like "omni-gate/platform"
|
|
221
|
+
* @param envName Environment name like "test" or "prod"
|
|
222
|
+
*/
|
|
223
|
+
async getGitConfig(projectPath, envName) {
|
|
224
|
+
const config = await this.load();
|
|
225
|
+
const pathParts = projectPath.split('/');
|
|
226
|
+
const project = this.findProjectByPath(config.projects, pathParts);
|
|
227
|
+
if (!project)
|
|
228
|
+
return null;
|
|
229
|
+
const globalGit = config.omniflow.git;
|
|
230
|
+
const projectRepos = project.repos;
|
|
231
|
+
// Build URL
|
|
232
|
+
let url = '';
|
|
233
|
+
if (projectRepos?.git) {
|
|
234
|
+
url = projectRepos.git;
|
|
235
|
+
}
|
|
236
|
+
else if (globalGit?.repos) {
|
|
237
|
+
const projectName = projectPath.replace(/-/g, '/');
|
|
238
|
+
url = `${globalGit.repos}/${projectName}.git`;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
// Determine branch
|
|
244
|
+
let targetBranch = 'main';
|
|
245
|
+
let mergeFrom;
|
|
246
|
+
if (envName && project.environments) {
|
|
247
|
+
// Find environment config by name
|
|
248
|
+
const envConfig = project.environments.find(e => e.name === envName);
|
|
249
|
+
if (envConfig) {
|
|
250
|
+
targetBranch = envConfig.branch;
|
|
251
|
+
mergeFrom = envConfig.merge_from;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
else if (projectRepos?.branch) {
|
|
255
|
+
targetBranch = projectRepos.branch;
|
|
256
|
+
}
|
|
257
|
+
else if (globalGit?.default_branch) {
|
|
258
|
+
targetBranch = globalGit.default_branch;
|
|
259
|
+
}
|
|
260
|
+
// Strategy comes from project repos level or GIT_MERGE_STRATEGY env var
|
|
261
|
+
const strategy = projectRepos?.merge_strategy || process.env.GIT_MERGE_STRATEGY;
|
|
262
|
+
// Merge configuration (project takes precedence)
|
|
263
|
+
return {
|
|
264
|
+
url,
|
|
265
|
+
branch: targetBranch,
|
|
266
|
+
username: projectRepos?.username || globalGit?.username,
|
|
267
|
+
password: projectRepos?.password || globalGit?.password,
|
|
268
|
+
merge_from: mergeFrom,
|
|
269
|
+
strategy: strategy
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get SSH configuration
|
|
274
|
+
*/
|
|
275
|
+
async getSshConfig(serverName) {
|
|
276
|
+
const config = await this.load();
|
|
277
|
+
const sshConfig = config.omniflow.ssh?.[serverName];
|
|
278
|
+
return sshConfig || null;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Resolve environment variables in configuration
|
|
282
|
+
*/
|
|
283
|
+
resolveEnvVars(config) {
|
|
284
|
+
const resolve = (value) => {
|
|
285
|
+
if (typeof value === 'string') {
|
|
286
|
+
return value.replace(/\$\{([^}]+)\}/g, (_, varName) => {
|
|
287
|
+
return process.env[varName] || `\${${varName}}`;
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
if (Array.isArray(value)) {
|
|
291
|
+
return value.map(resolve);
|
|
292
|
+
}
|
|
293
|
+
if (value && typeof value === 'object') {
|
|
294
|
+
const resolved = {};
|
|
295
|
+
for (const [key, val] of Object.entries(value)) {
|
|
296
|
+
resolved[key] = resolve(val);
|
|
297
|
+
}
|
|
298
|
+
return resolved;
|
|
299
|
+
}
|
|
300
|
+
return value;
|
|
301
|
+
};
|
|
302
|
+
return resolve(config);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Reload configuration (fetches from git again)
|
|
306
|
+
*/
|
|
307
|
+
async reload() {
|
|
308
|
+
const { OMNIFLOW_CONFIG_REPO, OMNIFLOW_CONFIG_BRANCH = 'main', GIT_USERNAME, GIT_PASSWORD, GIT_TOKEN } = process.env;
|
|
309
|
+
if (!OMNIFLOW_CONFIG_REPO) {
|
|
310
|
+
throw new Error('\n❌ Configuration error: OMNIFLOW_CONFIG_REPO environment variable is not set\n');
|
|
311
|
+
}
|
|
312
|
+
const OMNIFLOW_HOME = process.env.OMNIFLOW_HOME || path.join(os.homedir(), '.omniflow');
|
|
313
|
+
const configDir = path.join(OMNIFLOW_HOME, 'config');
|
|
314
|
+
console.log('🔄 Fetching latest configuration from git...');
|
|
315
|
+
try {
|
|
316
|
+
const { execaCommand } = await import('execa');
|
|
317
|
+
// Check if config directory exists
|
|
318
|
+
const configExists = await fs.access(configDir).then(() => true).catch(() => false);
|
|
319
|
+
if (!configExists) {
|
|
320
|
+
// Directory doesn't exist, clone the repository
|
|
321
|
+
console.log(` Config directory not found, cloning...`);
|
|
322
|
+
// Build authenticated URL
|
|
323
|
+
let repoUrl = OMNIFLOW_CONFIG_REPO;
|
|
324
|
+
const password = GIT_TOKEN || GIT_PASSWORD;
|
|
325
|
+
if (GIT_USERNAME && password) {
|
|
326
|
+
try {
|
|
327
|
+
const urlObj = new URL(OMNIFLOW_CONFIG_REPO);
|
|
328
|
+
urlObj.username = GIT_USERNAME;
|
|
329
|
+
urlObj.password = password;
|
|
330
|
+
repoUrl = urlObj.toString();
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
// Invalid URL, use as-is
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Create parent directory if needed
|
|
337
|
+
await fs.mkdir(OMNIFLOW_HOME, { recursive: true });
|
|
338
|
+
// Clone the config repository
|
|
339
|
+
await execaCommand(`git clone --depth 1 --branch ${OMNIFLOW_CONFIG_BRANCH} --single-branch ${repoUrl} ${configDir}`, {
|
|
340
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' }
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
// Directory exists, fetch latest changes
|
|
345
|
+
await execaCommand('git fetch origin', { cwd: configDir });
|
|
346
|
+
await execaCommand(`git checkout ${OMNIFLOW_CONFIG_BRANCH}`, { cwd: configDir });
|
|
347
|
+
await execaCommand(`git pull origin ${OMNIFLOW_CONFIG_BRANCH}`, { cwd: configDir });
|
|
348
|
+
}
|
|
349
|
+
// Clear cache
|
|
350
|
+
this.config = null;
|
|
351
|
+
this.initialized = false;
|
|
352
|
+
// Reload
|
|
353
|
+
await this.load();
|
|
354
|
+
console.log('✅ Configuration updated\n');
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
throw new Error(`Failed to reload configuration: ${error.message}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Collect vars from the project path (traverses folder hierarchy)
|
|
362
|
+
* Returns vars from all folders in the path + the project itself
|
|
363
|
+
*/
|
|
364
|
+
async collectVarsFromPath(pathParts) {
|
|
365
|
+
const config = await this.load();
|
|
366
|
+
const vars = {};
|
|
367
|
+
// Start with global vars
|
|
368
|
+
Object.assign(vars, config.omniflow.env || {});
|
|
369
|
+
// Traverse the path and collect vars from each folder
|
|
370
|
+
let currentItems = config.projects;
|
|
371
|
+
for (const part of pathParts) {
|
|
372
|
+
const item = currentItems.find(i => i.name === part);
|
|
373
|
+
if (!item)
|
|
374
|
+
break;
|
|
375
|
+
// Merge vars from this level (folder or project)
|
|
376
|
+
if (item.vars) {
|
|
377
|
+
Object.assign(vars, item.vars);
|
|
378
|
+
}
|
|
379
|
+
// Move to next level if this is a folder
|
|
380
|
+
if (item.items) {
|
|
381
|
+
currentItems = item.items;
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
break; // Reached a project, stop traversing
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return vars;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get merged variables for a project and environment
|
|
391
|
+
* Priority: global -> parent folders -> project -> environment (later overrides earlier)
|
|
392
|
+
*/
|
|
393
|
+
async getMergedVars(projectPath, envName) {
|
|
394
|
+
const envConfig = await this.getEnvironment(projectPath, envName);
|
|
395
|
+
if (!envConfig) {
|
|
396
|
+
throw new Error(`Environment not found: ${envName}`);
|
|
397
|
+
}
|
|
398
|
+
// Collect vars from: global -> folders -> project
|
|
399
|
+
const pathVars = await this.collectVarsFromPath(projectPath.split('/'));
|
|
400
|
+
// Merge with environment vars (highest priority)
|
|
401
|
+
return {
|
|
402
|
+
...pathVars, // global -> folders -> project
|
|
403
|
+
...envConfig.vars // environment vars (override all)
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Load commands.js from omniflow home directory
|
|
408
|
+
* Returns the exported object or null if file doesn't exist
|
|
409
|
+
*/
|
|
410
|
+
async loadCommands() {
|
|
411
|
+
const { OMNIFLOW_COMMANDS_FILE = 'commands.js' } = process.env;
|
|
412
|
+
const OMNIFLOW_HOME = process.env.OMNIFLOW_HOME || path.join(os.homedir(), '.omniflow');
|
|
413
|
+
const commandsPath = path.join(OMNIFLOW_HOME, 'config', OMNIFLOW_COMMANDS_FILE);
|
|
414
|
+
try {
|
|
415
|
+
// Check if file exists
|
|
416
|
+
await fs.access(commandsPath);
|
|
417
|
+
// Dynamic import of commands.js
|
|
418
|
+
const commandsModule = await import(commandsPath);
|
|
419
|
+
// Return the default export or the module itself
|
|
420
|
+
return commandsModule.default || commandsModule;
|
|
421
|
+
}
|
|
422
|
+
catch {
|
|
423
|
+
// File doesn't exist or import failed
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Get the data directory path for projects
|
|
429
|
+
* Maps to ~/.omniflow/data/
|
|
430
|
+
*/
|
|
431
|
+
getDataDir() {
|
|
432
|
+
const OMNIFLOW_HOME = process.env.OMNIFLOW_HOME || path.join(os.homedir(), '.omniflow');
|
|
433
|
+
return path.join(OMNIFLOW_HOME, 'data');
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Get project path by project key (e.g., "omni-gate/platform" -> ~/.omniflow/data/omni-gate/platform)
|
|
437
|
+
*/
|
|
438
|
+
getProjectPath(projectKey) {
|
|
439
|
+
return path.join(this.getDataDir(), projectKey);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Load Omniflow configuration from git
|
|
444
|
+
* Configuration is fetched from the repository specified by OMNIFLOW_CONFIG_REPO
|
|
445
|
+
* @returns The loaded configuration
|
|
446
|
+
*/
|
|
447
|
+
export async function loadOmniflowConfig() {
|
|
448
|
+
const loader = new OmniflowConfigLoader();
|
|
449
|
+
return await loader.load();
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=omniflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omniflow.js","sourceRoot":"","sources":["../../src/config/omniflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface GitConfig {
|
|
2
|
+
url: string;
|
|
3
|
+
branch: string;
|
|
4
|
+
username?: string;
|
|
5
|
+
password?: string;
|
|
6
|
+
merge_from?: string;
|
|
7
|
+
strategy?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface GitResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
branch: string;
|
|
12
|
+
commit: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Git workflow:
|
|
17
|
+
* 1. If merge_from is specified, submit merge request via API
|
|
18
|
+
* 2. git pull to update local (if already exists)
|
|
19
|
+
* 3. Otherwise git clone
|
|
20
|
+
*/
|
|
21
|
+
export declare function executeGitWorkflow(config: GitConfig, targetDir: string): Promise<GitResult>;
|
|
22
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,CAyEpB"}
|
package/dist/core/git.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// Git workflow operations
|
|
2
|
+
import { exec } from 'child_process';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { strategyRegistry } from './strategies/index.js';
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
/**
|
|
7
|
+
* Git workflow:
|
|
8
|
+
* 1. If merge_from is specified, submit merge request via API
|
|
9
|
+
* 2. git pull to update local (if already exists)
|
|
10
|
+
* 3. Otherwise git clone
|
|
11
|
+
*/
|
|
12
|
+
export async function executeGitWorkflow(config, targetDir) {
|
|
13
|
+
try {
|
|
14
|
+
const url = buildAuthenticatedUrl(config.url, config.username, config.password);
|
|
15
|
+
const branch = config.branch;
|
|
16
|
+
// 1. If merge_from is specified, submit merge request via API
|
|
17
|
+
if (config.merge_from) {
|
|
18
|
+
console.log(` 📨 Submitting merge request: ${config.merge_from} → ${branch}`);
|
|
19
|
+
await createMergeRequest(url, config.merge_from, branch, config.username, config.password, config.strategy);
|
|
20
|
+
console.log(` ✓ Merge request submitted`);
|
|
21
|
+
}
|
|
22
|
+
// 2. Check if local directory already exists
|
|
23
|
+
let alreadyExists = false;
|
|
24
|
+
try {
|
|
25
|
+
await execAsync('git rev-parse --git-dir', { cwd: targetDir });
|
|
26
|
+
alreadyExists = true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Directory doesn't exist or is not a git repo
|
|
30
|
+
}
|
|
31
|
+
if (alreadyExists) {
|
|
32
|
+
// Local exists, fetch and reset to remote (overwrite local changes)
|
|
33
|
+
console.log(` 📥 Updating local: git fetch && reset`);
|
|
34
|
+
await execAsync(`git fetch origin ${branch}`, {
|
|
35
|
+
cwd: targetDir,
|
|
36
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' }
|
|
37
|
+
});
|
|
38
|
+
await execAsync(`git reset --hard origin/${branch}`, {
|
|
39
|
+
cwd: targetDir
|
|
40
|
+
});
|
|
41
|
+
// Clean untracked files and directories
|
|
42
|
+
await execAsync('git clean -fd', {
|
|
43
|
+
cwd: targetDir
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Local doesn't exist, clone
|
|
48
|
+
console.log(` 📥 Cloning repository`);
|
|
49
|
+
let cloneCmd = `git clone --depth 1 --single-branch`;
|
|
50
|
+
if (branch) {
|
|
51
|
+
cloneCmd += ` --branch ${branch}`;
|
|
52
|
+
}
|
|
53
|
+
cloneCmd += ` ${url} ${targetDir}`;
|
|
54
|
+
await execAsync(cloneCmd, {
|
|
55
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0' }
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// 3. Get current state
|
|
59
|
+
const commit = await execAsync('git rev-parse HEAD', { cwd: targetDir });
|
|
60
|
+
const currentBranch = await execAsync('git rev-parse --abbrev-ref HEAD', { cwd: targetDir });
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
branch: currentBranch.stdout.trim(),
|
|
64
|
+
commit: commit.stdout.trim()
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
branch: '',
|
|
71
|
+
commit: '',
|
|
72
|
+
error: error instanceof Error ? error.message : String(error)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Submit merge request via API and auto-merge it
|
|
78
|
+
* @param repoUrl Repository URL
|
|
79
|
+
* @param sourceBranch Source branch
|
|
80
|
+
* @param targetBranch Target branch
|
|
81
|
+
* @param username Git username (optional, for token)
|
|
82
|
+
* @param password Git password or token
|
|
83
|
+
* @param strategyName Strategy name from config (e.g., 'github', 'gitlab')
|
|
84
|
+
*/
|
|
85
|
+
async function createMergeRequest(repoUrl, sourceBranch, targetBranch, username, password, strategyName) {
|
|
86
|
+
const repoInfo = parseGitUrl(repoUrl);
|
|
87
|
+
if (!repoInfo) {
|
|
88
|
+
console.log(` ℹ️ Cannot parse repository URL, skipping API request`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const token = password || username || process.env.GIT_TOKEN;
|
|
92
|
+
if (!token) {
|
|
93
|
+
console.log(` ℹ️ No token configured, skipping API request`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Add serverUrl and token to repoInfo
|
|
97
|
+
repoInfo.serverUrl = `https://${repoInfo.platform}`;
|
|
98
|
+
repoInfo.token = token;
|
|
99
|
+
// Get strategy from config, or infer from platform
|
|
100
|
+
let strategy = strategyName ? strategyRegistry.get(strategyName) : undefined;
|
|
101
|
+
// Fallback: infer strategy from platform hostname
|
|
102
|
+
if (!strategy) {
|
|
103
|
+
const hostname = repoInfo.platform.toLowerCase();
|
|
104
|
+
if (hostname.includes('github')) {
|
|
105
|
+
strategy = strategyRegistry.get('github');
|
|
106
|
+
}
|
|
107
|
+
else if (hostname.includes('gitlab')) {
|
|
108
|
+
strategy = strategyRegistry.get('gitlab');
|
|
109
|
+
}
|
|
110
|
+
else if (hostname.includes('forgejo') || hostname.includes('gitea')) {
|
|
111
|
+
strategy = strategyRegistry.get('forgejo');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!strategy) {
|
|
115
|
+
console.log(` ℹ️ Strategy '${strategyName || 'undefined'}' not found. Available: ${strategyRegistry.listStrategies().join(', ')}`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
await strategy.create(repoInfo, sourceBranch, targetBranch);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.log(` ⚠️ API request failed: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parse Git URL to extract repository info
|
|
127
|
+
*/
|
|
128
|
+
function parseGitUrl(url) {
|
|
129
|
+
try {
|
|
130
|
+
let cleanUrl = url;
|
|
131
|
+
if (url.startsWith('git@')) {
|
|
132
|
+
cleanUrl = url.replace(':', '/').replace('git@', 'https://');
|
|
133
|
+
}
|
|
134
|
+
const urlObj = new URL(cleanUrl);
|
|
135
|
+
const pathParts = urlObj.pathname.split('/').filter(p => p);
|
|
136
|
+
if (pathParts.length >= 2) {
|
|
137
|
+
const repo = pathParts[pathParts.length - 1].replace(/\.git$/, '');
|
|
138
|
+
const owner = pathParts[pathParts.length - 2];
|
|
139
|
+
const platform = urlObj.hostname;
|
|
140
|
+
return { platform, owner, repo };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Parse failed
|
|
145
|
+
}
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Build authenticated URL
|
|
150
|
+
*/
|
|
151
|
+
function buildAuthenticatedUrl(url, username, password) {
|
|
152
|
+
if (!username || !password)
|
|
153
|
+
return url;
|
|
154
|
+
try {
|
|
155
|
+
const urlObj = new URL(url);
|
|
156
|
+
urlObj.username = username;
|
|
157
|
+
urlObj.password = password;
|
|
158
|
+
return urlObj.toString();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return url;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
|