sync-worktrees 0.4.1 → 0.5.1

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -80
  3. package/dist/index.js +7 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/services/config-loader.service.js +7 -7
  6. package/dist/services/config-loader.service.js.map +1 -1
  7. package/dist/services/git.service.d.ts +3 -0
  8. package/dist/services/git.service.d.ts.map +1 -1
  9. package/dist/services/git.service.js +70 -19
  10. package/dist/services/git.service.js.map +1 -1
  11. package/dist/types/index.d.ts +2 -2
  12. package/dist/types/index.d.ts.map +1 -1
  13. package/dist/utils/cli.d.ts +1 -0
  14. package/dist/utils/cli.d.ts.map +1 -1
  15. package/dist/utils/cli.js +10 -12
  16. package/dist/utils/cli.js.map +1 -1
  17. package/dist/utils/config-generator.d.ts.map +1 -1
  18. package/dist/utils/config-generator.js +55 -20
  19. package/dist/utils/config-generator.js.map +1 -1
  20. package/dist/utils/git-url.d.ts +15 -0
  21. package/dist/utils/git-url.d.ts.map +1 -0
  22. package/dist/utils/git-url.js +46 -0
  23. package/dist/utils/git-url.js.map +1 -0
  24. package/dist/utils/interactive.d.ts.map +1 -1
  25. package/dist/utils/interactive.js +43 -28
  26. package/dist/utils/interactive.js.map +1 -1
  27. package/package.json +8 -5
  28. package/dist/__tests__/fixtures/git-responses.d.ts +0 -114
  29. package/dist/__tests__/fixtures/git-responses.d.ts.map +0 -1
  30. package/dist/__tests__/fixtures/git-responses.js +0 -119
  31. package/dist/__tests__/fixtures/git-responses.js.map +0 -1
  32. package/dist/__tests__/helpers/mock-helpers.d.ts +0 -29
  33. package/dist/__tests__/helpers/mock-helpers.d.ts.map +0 -1
  34. package/dist/__tests__/helpers/mock-helpers.js +0 -82
  35. package/dist/__tests__/helpers/mock-helpers.js.map +0 -1
  36. package/dist/__tests__/integration.test.d.ts +0 -2
  37. package/dist/__tests__/integration.test.d.ts.map +0 -1
  38. package/dist/__tests__/integration.test.js +0 -300
  39. package/dist/__tests__/integration.test.js.map +0 -1
  40. package/dist/__tests__/setup.d.ts +0 -2
  41. package/dist/__tests__/setup.d.ts.map +0 -1
  42. package/dist/__tests__/setup.js +0 -18
  43. package/dist/__tests__/setup.js.map +0 -1
  44. package/dist/services/__tests__/config-loader.service.test.d.ts +0 -2
  45. package/dist/services/__tests__/config-loader.service.test.d.ts.map +0 -1
  46. package/dist/services/__tests__/config-loader.service.test.js +0 -222
  47. package/dist/services/__tests__/config-loader.service.test.js.map +0 -1
  48. package/dist/services/__tests__/git.service.test.d.ts +0 -2
  49. package/dist/services/__tests__/git.service.test.d.ts.map +0 -1
  50. package/dist/services/__tests__/git.service.test.js +0 -289
  51. package/dist/services/__tests__/git.service.test.js.map +0 -1
  52. package/dist/services/__tests__/worktree-sync.service.test.d.ts +0 -2
  53. package/dist/services/__tests__/worktree-sync.service.test.d.ts.map +0 -1
  54. package/dist/services/__tests__/worktree-sync.service.test.js +0 -342
  55. package/dist/services/__tests__/worktree-sync.service.test.js.map +0 -1
  56. package/dist/utils/__tests__/config-generator.test.d.ts +0 -2
  57. package/dist/utils/__tests__/config-generator.test.d.ts.map +0 -1
  58. package/dist/utils/__tests__/config-generator.test.js +0 -142
  59. package/dist/utils/__tests__/config-generator.test.js.map +0 -1
  60. package/dist/utils/__tests__/interactive.test.d.ts +0 -2
  61. package/dist/utils/__tests__/interactive.test.d.ts.map +0 -1
  62. package/dist/utils/__tests__/interactive.test.js +0 -281
  63. package/dist/utils/__tests__/interactive.test.js.map +0 -1
package/dist/utils/cli.js CHANGED
@@ -26,15 +26,15 @@ function parseArguments() {
26
26
  description: "List configured repositories and exit",
27
27
  default: false,
28
28
  })
29
- .option("repoPath", {
30
- alias: "r",
29
+ .option("bareRepoDir", {
30
+ alias: "b",
31
31
  type: "string",
32
- description: "Absolute path to the target local repository directory.",
32
+ description: "Directory for storing bare repositories (default: .bare/<repo-name>).",
33
33
  })
34
34
  .option("repoUrl", {
35
35
  alias: "u",
36
36
  type: "string",
37
- description: "Git repository URL (e.g., SSH or HTTPS). Used to clone if repoPath does not exist.",
37
+ description: "Git repository URL (e.g., SSH or HTTPS).",
38
38
  })
39
39
  .option("worktreeDir", {
40
40
  alias: "w",
@@ -59,28 +59,26 @@ function parseArguments() {
59
59
  config: argv.config,
60
60
  filter: argv.filter,
61
61
  list: argv.list,
62
- repoPath: argv.repoPath,
63
62
  repoUrl: argv.repoUrl,
64
63
  worktreeDir: argv.worktreeDir,
65
64
  cronSchedule: argv.cronSchedule,
66
65
  runOnce: argv.runOnce,
66
+ bareRepoDir: argv.bareRepoDir,
67
67
  };
68
68
  }
69
69
  function isInteractiveMode(config) {
70
- return !config.repoPath || !config.worktreeDir;
70
+ return !config.repoUrl || !config.worktreeDir;
71
71
  }
72
72
  function reconstructCliCommand(config) {
73
73
  const executable = process.argv[1].includes("ts-node") ? "ts-node src/index.ts" : "sync-worktrees";
74
74
  const args = [];
75
- if (config.repoPath) {
76
- args.push(`--repoPath "${config.repoPath}"`);
77
- }
78
- if (config.repoUrl) {
79
- args.push(`--repoUrl "${config.repoUrl}"`);
80
- }
75
+ args.push(`--repoUrl "${config.repoUrl}"`);
81
76
  if (config.worktreeDir) {
82
77
  args.push(`--worktreeDir "${config.worktreeDir}"`);
83
78
  }
79
+ if (config.bareRepoDir) {
80
+ args.push(`--bareRepoDir "${config.bareRepoDir}"`);
81
+ }
84
82
  if (config.cronSchedule && config.cronSchedule !== "0 * * * *") {
85
83
  args.push(`--cronSchedule "${config.cronSchedule}"`);
86
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/utils/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC1F;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
1
+ {"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA2CvC,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C1F;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -37,37 +37,72 @@ exports.generateConfigFile = generateConfigFile;
37
37
  exports.getDefaultConfigPath = getDefaultConfigPath;
38
38
  const fs = __importStar(require("fs/promises"));
39
39
  const path = __importStar(require("path"));
40
+ const git_url_1 = require("./git-url");
41
+ /**
42
+ * Serializes a JavaScript object to a clean module.exports format
43
+ */
44
+ function serializeToModuleExports(obj, indent = 0) {
45
+ const spaces = " ".repeat(indent);
46
+ const innerSpaces = " ".repeat(indent + 2);
47
+ if (typeof obj === "string") {
48
+ return `"${obj}"`;
49
+ }
50
+ if (typeof obj === "number" || typeof obj === "boolean") {
51
+ return String(obj);
52
+ }
53
+ if (Array.isArray(obj)) {
54
+ if (obj.length === 0)
55
+ return "[]";
56
+ const items = obj.map((item) => `${innerSpaces}${serializeToModuleExports(item, indent + 2)}`).join(",\n");
57
+ return `[\n${items}\n${spaces}]`;
58
+ }
59
+ if (obj && typeof obj === "object") {
60
+ const entries = Object.entries(obj)
61
+ .filter(([_, value]) => value !== undefined)
62
+ .map(([key, value]) => {
63
+ const serializedValue = serializeToModuleExports(value, indent + 2);
64
+ return `${innerSpaces}${key}: ${serializedValue}`;
65
+ });
66
+ if (entries.length === 0)
67
+ return "{}";
68
+ return `{\n${entries.join(",\n")}\n${spaces}}`;
69
+ }
70
+ return String(obj);
71
+ }
40
72
  async function generateConfigFile(config, configPath) {
41
73
  const configDir = path.dirname(configPath);
42
74
  await fs.mkdir(configDir, { recursive: true });
43
75
  // Calculate relative paths from config file location
44
- const repoPathRelative = path.relative(configDir, config.repoPath);
45
76
  const worktreeDirRelative = path.relative(configDir, config.worktreeDir);
46
- // Use relative paths if they don't go up too many levels
47
- const useRelativeRepo = !repoPathRelative.startsWith("../../../");
48
77
  const useRelativeWorktree = !worktreeDirRelative.startsWith("../../../");
49
- const repoUrlEntry = config.repoUrl ? `repoUrl: "${config.repoUrl}",\n ` : "";
50
- const repoPathEntry = `repoPath: "${useRelativeRepo ? `./${repoPathRelative}` : config.repoPath}"`;
51
- const worktreeDirEntry = `worktreeDir: "${useRelativeWorktree ? `./${worktreeDirRelative}` : config.worktreeDir}"`;
78
+ const repoName = (0, git_url_1.extractRepoNameFromUrl)(config.repoUrl);
79
+ // Build the repository object
80
+ const repository = {
81
+ name: repoName,
82
+ repoUrl: config.repoUrl,
83
+ worktreeDir: useRelativeWorktree ? `./${worktreeDirRelative}` : config.worktreeDir,
84
+ };
85
+ // Add bareRepoDir if provided
86
+ if (config.bareRepoDir) {
87
+ const bareRepoDirRelative = path.relative(configDir, config.bareRepoDir);
88
+ const useRelativeBare = !bareRepoDirRelative.startsWith("../../../");
89
+ repository.bareRepoDir = useRelativeBare ? `./${bareRepoDirRelative}` : config.bareRepoDir;
90
+ }
91
+ // Build the complete config object
92
+ const configObject = {
93
+ defaults: {
94
+ cronSchedule: config.cronSchedule,
95
+ runOnce: config.runOnce,
96
+ },
97
+ repositories: [repository],
98
+ };
99
+ // Generate the config file content
52
100
  const configContent = `/**
53
101
  * Sync-worktrees configuration file
54
102
  * Generated on ${new Date().toISOString()}
55
103
  */
56
104
 
57
- module.exports = {
58
- defaults: {
59
- cronSchedule: "${config.cronSchedule}",
60
- runOnce: ${config.runOnce}
61
- },
62
-
63
- repositories: [
64
- {
65
- name: "${path.basename(config.repoPath)}",
66
- ${repoUrlEntry}${repoPathEntry},
67
- ${worktreeDirEntry}
68
- }
69
- ]
70
- };
105
+ module.exports = ${serializeToModuleExports(configObject)};
71
106
  `;
72
107
  await fs.writeFile(configPath, configContent, "utf-8");
73
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,gDAsCC;AAED,oDAEC;AA/CD,gDAAkC;AAClC,2CAA6B;AAItB,KAAK,UAAU,kBAAkB,CAAC,MAAc,EAAE,UAAkB;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,qDAAqD;IACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzE,yDAAyD;IACzD,MAAM,eAAe,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,mBAAmB,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEzE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,MAAM,aAAa,GAAG,cAAc,eAAe,CAAC,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;IACnG,MAAM,gBAAgB,GAAG,iBAAiB,mBAAmB,CAAC,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC;IAEnH,MAAM,aAAa,GAAG;;kBAEN,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;qBAKrB,MAAM,CAAC,YAAY;eACzB,MAAM,CAAC,OAAO;;;;;eAKd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrC,YAAY,GAAG,aAAa;QAC5B,gBAAgB;;;;CAIvB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../src/utils/config-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Extracts the repository name from a Git URL
3
+ * @param gitUrl - The Git URL (HTTPS or SSH format)
4
+ * @returns The repository name without .git extension
5
+ * @throws Error if the URL format is invalid
6
+ */
7
+ export declare function extractRepoNameFromUrl(gitUrl: string): string;
8
+ /**
9
+ * Generates the default bare repository directory path
10
+ * @param repoUrl - The Git repository URL
11
+ * @param baseDir - The base directory for bare repos (default: .bare)
12
+ * @returns The path to the bare repository
13
+ */
14
+ export declare function getDefaultBareRepoDir(repoUrl: string, baseDir?: string): string;
15
+ //# sourceMappingURL=git-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-url.d.ts","sourceRoot":"","sources":["../../src/utils/git-url.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6B7D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAgB,GAAG,MAAM,CAGxF"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractRepoNameFromUrl = extractRepoNameFromUrl;
4
+ exports.getDefaultBareRepoDir = getDefaultBareRepoDir;
5
+ /**
6
+ * Extracts the repository name from a Git URL
7
+ * @param gitUrl - The Git URL (HTTPS or SSH format)
8
+ * @returns The repository name without .git extension
9
+ * @throws Error if the URL format is invalid
10
+ */
11
+ function extractRepoNameFromUrl(gitUrl) {
12
+ // Remove trailing spaces
13
+ const url = gitUrl.trim();
14
+ // Handle SSH format: git@github.com:user/repo.git or ssh://git@domain/path/repo.git
15
+ const sshMatch = url.match(/^git@[^:]+:(?:.+\/)?([^/]+?)(?:\.git)?$/);
16
+ if (sshMatch) {
17
+ return sshMatch[1];
18
+ }
19
+ // Handle SSH URL format: ssh://git@domain.com/path/repo.git
20
+ const sshUrlMatch = url.match(/^ssh:\/\/[^/]+\/(?:.+\/)?([^/]+?)(?:\.git)?$/);
21
+ if (sshUrlMatch) {
22
+ return sshUrlMatch[1];
23
+ }
24
+ // Handle HTTPS format: https://github.com/user/repo.git
25
+ const httpsMatch = url.match(/^https?:\/\/[^/]+\/(?:.+\/)?([^/]+?)(?:\.git)?$/);
26
+ if (httpsMatch) {
27
+ return httpsMatch[1];
28
+ }
29
+ // Handle file:// URLs for local repositories
30
+ const fileMatch = url.match(/^file:\/\/(?:.+\/)?([^/]+?)(?:\.git)?$/);
31
+ if (fileMatch) {
32
+ return fileMatch[1];
33
+ }
34
+ throw new Error(`Invalid Git URL format: ${gitUrl}`);
35
+ }
36
+ /**
37
+ * Generates the default bare repository directory path
38
+ * @param repoUrl - The Git repository URL
39
+ * @param baseDir - The base directory for bare repos (default: .bare)
40
+ * @returns The path to the bare repository
41
+ */
42
+ function getDefaultBareRepoDir(repoUrl, baseDir = ".bare") {
43
+ const repoName = extractRepoNameFromUrl(repoUrl);
44
+ return `${baseDir}/${repoName}`;
45
+ }
46
+ //# sourceMappingURL=git-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-url.js","sourceRoot":"","sources":["../../src/utils/git-url.ts"],"names":[],"mappings":";;AAMA,wDA6BC;AAQD,sDAGC;AA9CD;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,MAAc;IACnD,yBAAyB;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAE1B,oFAAoF;IACpF,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACtE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,4DAA4D;IAC5D,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,wDAAwD;IACxD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAChF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,6CAA6C;IAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,OAAe,EAAE,UAAkB,OAAO;IAC9E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;AAClC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA2IrF"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAsB,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA0JrF"}
@@ -34,37 +34,29 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.promptForConfig = promptForConfig;
37
- const fs = __importStar(require("fs"));
38
37
  const path = __importStar(require("path"));
39
38
  const prompts_1 = require("@inquirer/prompts");
40
39
  const config_generator_1 = require("./config-generator");
41
40
  async function promptForConfig(partialConfig) {
42
41
  console.log("🔧 Welcome to sync-worktrees interactive setup!\n");
43
- let repoPath = partialConfig.repoPath;
44
- if (!repoPath) {
45
- repoPath = await (0, prompts_1.input)({
46
- message: "Enter the path to your Git repository:",
47
- validate: (value) => {
48
- if (!value.trim()) {
49
- return "Repository path is required";
50
- }
51
- return true;
52
- },
53
- });
54
- if (!path.isAbsolute(repoPath)) {
55
- repoPath = path.resolve(repoPath);
56
- }
57
- }
58
42
  let repoUrl = partialConfig.repoUrl;
59
- if (repoPath && !fs.existsSync(repoPath)) {
43
+ if (!repoUrl) {
60
44
  repoUrl = await (0, prompts_1.input)({
61
- message: "Enter the Git repository URL (leave empty if repository already exists):",
62
- default: partialConfig.repoUrl || "",
45
+ message: "Enter the Git repository URL (e.g., https://github.com/user/repo.git):",
63
46
  validate: (value) => {
64
47
  if (!value.trim()) {
65
- return "Repository URL is required since the repository path doesn't exist";
48
+ return "Repository URL is required";
49
+ }
50
+ try {
51
+ // Basic URL validation
52
+ if (!value.match(/^(https?:\/\/|ssh:\/\/|git@|file:\/\/).*$/)) {
53
+ return "Please enter a valid Git URL (https://, ssh://, git@, or file://)";
54
+ }
55
+ return true;
56
+ }
57
+ catch {
58
+ return "Please enter a valid URL";
66
59
  }
67
- return true;
68
60
  },
69
61
  });
70
62
  }
@@ -83,6 +75,26 @@ async function promptForConfig(partialConfig) {
83
75
  worktreeDir = path.resolve(worktreeDir);
84
76
  }
85
77
  }
78
+ let bareRepoDir = partialConfig.bareRepoDir;
79
+ const askForBareDir = await (0, prompts_1.confirm)({
80
+ message: "Would you like to specify a custom location for the bare repository?",
81
+ default: false,
82
+ });
83
+ if (askForBareDir) {
84
+ bareRepoDir = await (0, prompts_1.input)({
85
+ message: "Enter the directory for the bare repository:",
86
+ default: "",
87
+ validate: (value) => {
88
+ if (!value.trim()) {
89
+ return "Bare repository directory is required";
90
+ }
91
+ return true;
92
+ },
93
+ });
94
+ if (!path.isAbsolute(bareRepoDir)) {
95
+ bareRepoDir = path.resolve(bareRepoDir);
96
+ }
97
+ }
86
98
  let runOnce = partialConfig.runOnce;
87
99
  let cronSchedule = partialConfig.cronSchedule || "0 * * * *";
88
100
  if (runOnce === undefined) {
@@ -112,23 +124,26 @@ async function promptForConfig(partialConfig) {
112
124
  }
113
125
  }
114
126
  const finalConfig = {
115
- repoPath,
116
127
  repoUrl,
117
128
  worktreeDir,
118
129
  cronSchedule,
119
130
  runOnce: runOnce || false,
131
+ bareRepoDir,
120
132
  };
121
133
  console.log("\n📋 Configuration summary:");
122
- console.log(` Repository: ${finalConfig.repoPath}`);
123
- if (finalConfig.repoUrl) {
124
- console.log(` Clone from: ${finalConfig.repoUrl}`);
134
+ console.log(` Repository URL: ${finalConfig.repoUrl}`);
135
+ console.log(` Worktrees: ${finalConfig.worktreeDir}`);
136
+ if (finalConfig.bareRepoDir) {
137
+ console.log(` Bare repo: ${finalConfig.bareRepoDir}`);
138
+ }
139
+ else {
140
+ console.log(` Bare repo: .bare/<repo-name> (default)`);
125
141
  }
126
- console.log(` Worktrees: ${finalConfig.worktreeDir}`);
127
142
  if (finalConfig.runOnce) {
128
- console.log(` Mode: Run once`);
143
+ console.log(` Mode: Run once`);
129
144
  }
130
145
  else {
131
- console.log(` Mode: Scheduled (${finalConfig.cronSchedule})`);
146
+ console.log(` Mode: Scheduled (${finalConfig.cronSchedule})`);
132
147
  }
133
148
  console.log("");
134
149
  // Ask if user wants to save configuration to a file
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,0CA0JC;AAlKD,2CAA6B;AAE7B,+CAA2D;AAE3D,yDAA8E;AAIvE,KAAK,UAAU,eAAe,CAAC,aAA8B;IAClE,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEjE,IAAI,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,IAAA,eAAK,EAAC;YACpB,OAAO,EAAE,wEAAwE;YACjF,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,4BAA4B,CAAC;gBACtC,CAAC;gBACD,IAAI,CAAC;oBACH,uBAAuB;oBACvB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,EAAE,CAAC;wBAC9D,OAAO,mEAAmE,CAAC;oBAC7E,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,0BAA0B,CAAC;gBACpC,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,MAAM,IAAA,eAAK,EAAC;YACxB,OAAO,EAAE,4CAA4C;YACrD,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,gCAAgC,CAAC;gBAC1C,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;IAC5C,MAAM,aAAa,GAAG,MAAM,IAAA,iBAAO,EAAC;QAClC,OAAO,EAAE,sEAAsE;QAC/E,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG,MAAM,IAAA,eAAK,EAAC;YACxB,OAAO,EAAE,8CAA8C;YACvD,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,uCAAuC,CAAC;gBACjD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IACpC,IAAI,YAAY,GAAG,aAAa,CAAC,YAAY,IAAI,WAAW,CAAC;IAE7D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAM,EAAC;YAC3B,OAAO,EAAE,qCAAqC;YAC9C,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;gBACnC,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,WAAW,EAAE;aACnD;SACF,CAAC,CAAC;QACH,OAAO,GAAG,OAAO,KAAK,MAAM,CAAC;QAE7B,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;YAC5C,YAAY,GAAG,MAAM,IAAA,eAAK,EAAC;gBACzB,OAAO,EAAE,uDAAuD;gBAChE,OAAO,EAAE,WAAW;gBACpB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;wBAClB,OAAO,2BAA2B,CAAC;oBACrC,CAAC;oBACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,OAAO,oDAAoD,CAAC;oBAC9D,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAW;QAC1B,OAAO;QACP,WAAW;QACX,YAAY;QACZ,OAAO,EAAE,OAAO,IAAI,KAAK;QACzB,WAAW;KACZ,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7D,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,WAAW,CAAC,YAAY,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,oDAAoD;IACpD,MAAM,UAAU,GAAG,MAAM,IAAA,iBAAO,EAAC;QAC/B,OAAO,EAAE,qEAAqE;QAC9E,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,iBAAiB,GAAG,IAAA,uCAAoB,GAAE,CAAC;QACjD,IAAI,UAAU,GAAG,MAAM,IAAA,eAAK,EAAC;YAC3B,OAAO,EAAE,qCAAqC;YAC9C,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,8BAA8B,CAAC;gBACxC,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3B,OAAO,uCAAuC,CAAC;gBACjD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAA,qCAAkB,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sync-worktrees",
3
- "version": "0.4.1",
4
- "description": "Synchronize Git worktrees with remote repository branches",
3
+ "version": "0.5.1",
4
+ "description": "Automatically synchronize Git worktrees with remote branches - perfect for multi-branch development workflows",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
7
7
  "sync-worktrees": "./dist/index.js"
@@ -10,10 +10,13 @@
10
10
  "git",
11
11
  "worktree",
12
12
  "sync",
13
- "automation"
13
+ "automation",
14
+ "branch-management",
15
+ "git-worktrees",
16
+ "devops"
14
17
  ],
15
- "author": "",
16
- "license": "ISC",
18
+ "author": "Yordan Kanchelov <yordan.kanchelov@gmail.com>",
19
+ "license": "MIT",
17
20
  "engines": {
18
21
  "node": ">=22.0.0"
19
22
  },
@@ -1,114 +0,0 @@
1
- /**
2
- * Common git response fixtures for testing
3
- */
4
- export declare const gitBranchResponses: {
5
- withMultipleBranches: {
6
- all: string[];
7
- current: string;
8
- branches: {};
9
- detached: boolean;
10
- };
11
- withSingleBranch: {
12
- all: string[];
13
- current: string;
14
- branches: {};
15
- detached: boolean;
16
- };
17
- empty: {
18
- all: never[];
19
- current: string;
20
- branches: {};
21
- detached: boolean;
22
- };
23
- withLocalAndRemote: {
24
- all: string[];
25
- current: string;
26
- branches: {};
27
- detached: boolean;
28
- };
29
- };
30
- export declare const gitStatusResponses: {
31
- clean: {
32
- isClean: () => boolean;
33
- not_added: never[];
34
- conflicted: never[];
35
- created: never[];
36
- deleted: never[];
37
- modified: never[];
38
- renamed: never[];
39
- files: never[];
40
- staged: never[];
41
- ahead: number;
42
- behind: number;
43
- current: string;
44
- tracking: string;
45
- detached: boolean;
46
- };
47
- withChanges: {
48
- isClean: () => boolean;
49
- not_added: string[];
50
- conflicted: never[];
51
- created: never[];
52
- deleted: never[];
53
- modified: string[];
54
- renamed: never[];
55
- files: {
56
- path: string;
57
- index: string;
58
- working_dir: string;
59
- }[];
60
- staged: never[];
61
- ahead: number;
62
- behind: number;
63
- current: string;
64
- tracking: string;
65
- detached: boolean;
66
- };
67
- withStagedChanges: {
68
- isClean: () => boolean;
69
- not_added: never[];
70
- conflicted: never[];
71
- created: string[];
72
- deleted: never[];
73
- modified: string[];
74
- renamed: never[];
75
- files: {
76
- path: string;
77
- index: string;
78
- working_dir: string;
79
- }[];
80
- staged: string[];
81
- ahead: number;
82
- behind: number;
83
- current: string;
84
- tracking: string;
85
- detached: boolean;
86
- };
87
- };
88
- export declare const worktreeScenarios: {
89
- fresh: {
90
- remoteBranches: string[];
91
- existingWorktrees: never[];
92
- expectedNewWorktrees: string[];
93
- expectedRemovals: never[];
94
- };
95
- partial: {
96
- remoteBranches: string[];
97
- existingWorktrees: string[];
98
- expectedNewWorktrees: string[];
99
- expectedRemovals: never[];
100
- };
101
- withStale: {
102
- remoteBranches: string[];
103
- existingWorktrees: string[];
104
- expectedNewWorktrees: never[];
105
- expectedRemovals: string[];
106
- };
107
- mixed: {
108
- remoteBranches: string[];
109
- existingWorktrees: string[];
110
- expectedNewWorktrees: string[];
111
- expectedRemovals: string[];
112
- };
113
- };
114
- //# sourceMappingURL=git-responses.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-responses.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/git-responses.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;CAyB9B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuD9B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;CA6B7B,CAAC"}
@@ -1,119 +0,0 @@
1
- "use strict";
2
- /**
3
- * Common git response fixtures for testing
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.worktreeScenarios = exports.gitStatusResponses = exports.gitBranchResponses = void 0;
7
- exports.gitBranchResponses = {
8
- withMultipleBranches: {
9
- all: ["origin/main", "origin/feature-1", "origin/feature-2", "origin/bugfix/issue-123", "origin/release/v1.0.0"],
10
- current: "main",
11
- branches: {},
12
- detached: false,
13
- },
14
- withSingleBranch: {
15
- all: ["origin/main"],
16
- current: "main",
17
- branches: {},
18
- detached: false,
19
- },
20
- empty: {
21
- all: [],
22
- current: "",
23
- branches: {},
24
- detached: false,
25
- },
26
- withLocalAndRemote: {
27
- all: ["main", "feature-local", "origin/main", "origin/feature-1", "origin/feature-2"],
28
- current: "main",
29
- branches: {},
30
- detached: false,
31
- },
32
- };
33
- exports.gitStatusResponses = {
34
- clean: {
35
- isClean: () => true,
36
- not_added: [],
37
- conflicted: [],
38
- created: [],
39
- deleted: [],
40
- modified: [],
41
- renamed: [],
42
- files: [],
43
- staged: [],
44
- ahead: 0,
45
- behind: 0,
46
- current: "main",
47
- tracking: "origin/main",
48
- detached: false,
49
- },
50
- withChanges: {
51
- isClean: () => false,
52
- not_added: ["new-file.txt"],
53
- conflicted: [],
54
- created: [],
55
- deleted: [],
56
- modified: ["existing-file.ts"],
57
- renamed: [],
58
- files: [
59
- { path: "new-file.txt", index: "?", working_dir: "?" },
60
- { path: "existing-file.ts", index: " ", working_dir: "M" },
61
- ],
62
- staged: [],
63
- ahead: 0,
64
- behind: 0,
65
- current: "feature-1",
66
- tracking: "origin/feature-1",
67
- detached: false,
68
- },
69
- withStagedChanges: {
70
- isClean: () => false,
71
- not_added: [],
72
- conflicted: [],
73
- created: ["new-file.txt"],
74
- deleted: [],
75
- modified: ["existing-file.ts"],
76
- renamed: [],
77
- files: [
78
- { path: "new-file.txt", index: "A", working_dir: " " },
79
- { path: "existing-file.ts", index: "M", working_dir: " " },
80
- ],
81
- staged: ["new-file.txt", "existing-file.ts"],
82
- ahead: 1,
83
- behind: 0,
84
- current: "feature-1",
85
- tracking: "origin/feature-1",
86
- detached: false,
87
- },
88
- };
89
- exports.worktreeScenarios = {
90
- // Scenario: Fresh repository with no worktrees
91
- fresh: {
92
- remoteBranches: ["main", "develop", "feature-1"],
93
- existingWorktrees: [],
94
- expectedNewWorktrees: ["main", "develop", "feature-1"],
95
- expectedRemovals: [],
96
- },
97
- // Scenario: Some worktrees already exist
98
- partial: {
99
- remoteBranches: ["main", "develop", "feature-1", "feature-2"],
100
- existingWorktrees: ["main", "develop"],
101
- expectedNewWorktrees: ["feature-1", "feature-2"],
102
- expectedRemovals: [],
103
- },
104
- // Scenario: Need to prune old worktrees
105
- withStale: {
106
- remoteBranches: ["main", "develop"],
107
- existingWorktrees: ["main", "develop", "old-feature", "deleted-branch"],
108
- expectedNewWorktrees: [],
109
- expectedRemovals: ["old-feature", "deleted-branch"],
110
- },
111
- // Scenario: Mixed - add new and remove old
112
- mixed: {
113
- remoteBranches: ["main", "develop", "new-feature"],
114
- existingWorktrees: ["main", "old-feature"],
115
- expectedNewWorktrees: ["develop", "new-feature"],
116
- expectedRemovals: ["old-feature"],
117
- },
118
- };
119
- //# sourceMappingURL=git-responses.js.map