@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.

Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +476 -0
  3. package/dist/cli/commands/run.d.ts +7 -0
  4. package/dist/cli/commands/run.d.ts.map +1 -0
  5. package/dist/cli/commands/run.js +242 -0
  6. package/dist/cli/commands/run.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +211 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/config/index.d.ts +2 -0
  12. package/dist/config/index.d.ts.map +1 -0
  13. package/dist/config/index.js +3 -0
  14. package/dist/config/index.js.map +1 -0
  15. package/dist/config/omniflow.d.ts +115 -0
  16. package/dist/config/omniflow.d.ts.map +1 -0
  17. package/dist/config/omniflow.js +451 -0
  18. package/dist/config/omniflow.js.map +1 -0
  19. package/dist/core/git.d.ts +22 -0
  20. package/dist/core/git.d.ts.map +1 -0
  21. package/dist/core/git.js +164 -0
  22. package/dist/core/git.js.map +1 -0
  23. package/dist/core/strategies/BaseMergeRequest.d.ts +58 -0
  24. package/dist/core/strategies/BaseMergeRequest.d.ts.map +1 -0
  25. package/dist/core/strategies/BaseMergeRequest.js +57 -0
  26. package/dist/core/strategies/BaseMergeRequest.js.map +1 -0
  27. package/dist/core/strategies/ForgejoRequest.d.ts +35 -0
  28. package/dist/core/strategies/ForgejoRequest.d.ts.map +1 -0
  29. package/dist/core/strategies/ForgejoRequest.js +82 -0
  30. package/dist/core/strategies/ForgejoRequest.js.map +1 -0
  31. package/dist/core/strategies/GitHubRequest.d.ts +34 -0
  32. package/dist/core/strategies/GitHubRequest.d.ts.map +1 -0
  33. package/dist/core/strategies/GitHubRequest.js +84 -0
  34. package/dist/core/strategies/GitHubRequest.js.map +1 -0
  35. package/dist/core/strategies/GitLabRequest.d.ts +25 -0
  36. package/dist/core/strategies/GitLabRequest.d.ts.map +1 -0
  37. package/dist/core/strategies/GitLabRequest.js +70 -0
  38. package/dist/core/strategies/GitLabRequest.js.map +1 -0
  39. package/dist/core/strategies/index.d.ts +36 -0
  40. package/dist/core/strategies/index.d.ts.map +1 -0
  41. package/dist/core/strategies/index.js +50 -0
  42. package/dist/core/strategies/index.js.map +1 -0
  43. package/dist/core/strategies/types.d.ts +22 -0
  44. package/dist/core/strategies/types.d.ts.map +1 -0
  45. package/dist/core/strategies/types.js +5 -0
  46. package/dist/core/strategies/types.js.map +1 -0
  47. package/dist/index.d.ts +2 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +3 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/types/config.d.ts +63 -0
  52. package/dist/types/config.d.ts.map +1 -0
  53. package/dist/types/config.js +3 -0
  54. package/dist/types/config.js.map +1 -0
  55. 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"}
@@ -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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"}