@nemus-cli/nemus 0.2.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 (320) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/LICENSE +21 -0
  3. package/README.md +275 -0
  4. package/assets/README.md +53 -0
  5. package/assets/banner.png +0 -0
  6. package/assets/banner.svg +66 -0
  7. package/assets/favicon-32.png +0 -0
  8. package/assets/favicon-64.png +0 -0
  9. package/assets/icon-256.png +0 -0
  10. package/assets/icon.svg +23 -0
  11. package/assets/logo-256.png +0 -0
  12. package/assets/logo-512.png +0 -0
  13. package/assets/logo-wordmark.svg +35 -0
  14. package/assets/logo.svg +32 -0
  15. package/bin/workspace.js +130 -0
  16. package/dist/cli/ai-prompt.js +421 -0
  17. package/dist/cli/dashboard/AgentList.js +61 -0
  18. package/dist/cli/dashboard/DashboardSidebar.js +280 -0
  19. package/dist/cli/dashboard/HelpFooter.js +73 -0
  20. package/dist/cli/dashboard/StatusBadge.js +50 -0
  21. package/dist/cli/dashboard/index.js +11 -0
  22. package/dist/cli/dashboard/types.js +2 -0
  23. package/dist/cli/tui.js +48 -0
  24. package/dist/commands/ai-prompt.js +22 -0
  25. package/dist/commands/analyze-deps.js +138 -0
  26. package/dist/commands/archive.js +113 -0
  27. package/dist/commands/branch/create.js +119 -0
  28. package/dist/commands/branch/index.js +104 -0
  29. package/dist/commands/branch/merge.js +90 -0
  30. package/dist/commands/branch/rebase.js +84 -0
  31. package/dist/commands/branch/switch.js +165 -0
  32. package/dist/commands/cache/index.js +80 -0
  33. package/dist/commands/cache/manager.js +198 -0
  34. package/dist/commands/cleanup.js +153 -0
  35. package/dist/commands/configure-claude.js +55 -0
  36. package/dist/commands/configure.js +231 -0
  37. package/dist/commands/create.js +204 -0
  38. package/dist/commands/dashboard/hook-handler.js +162 -0
  39. package/dist/commands/dashboard/index.js +258 -0
  40. package/dist/commands/dashboard/launcher.js +40 -0
  41. package/dist/commands/dashboard/session-picker.js +106 -0
  42. package/dist/commands/dashboard/sidebar.js +39 -0
  43. package/dist/commands/dashboard/workspace-picker.js +95 -0
  44. package/dist/commands/delete.js +194 -0
  45. package/dist/commands/deprecated-aliases.js +44 -0
  46. package/dist/commands/diff.js +129 -0
  47. package/dist/commands/doctor.js +141 -0
  48. package/dist/commands/generate-docs.js +77 -0
  49. package/dist/commands/ghq-status.js +72 -0
  50. package/dist/commands/go.js +154 -0
  51. package/dist/commands/history.js +124 -0
  52. package/dist/commands/list.js +191 -0
  53. package/dist/commands/mcp/index.js +69 -0
  54. package/dist/commands/migrate.js +296 -0
  55. package/dist/commands/remove-repo.js +217 -0
  56. package/dist/commands/report-bug.js +112 -0
  57. package/dist/commands/run.js +147 -0
  58. package/dist/commands/save-context.js +171 -0
  59. package/dist/commands/sessions.js +129 -0
  60. package/dist/commands/status.js +138 -0
  61. package/dist/commands/suite/create.js +212 -0
  62. package/dist/commands/suite/delete.js +64 -0
  63. package/dist/commands/suite/export.js +126 -0
  64. package/dist/commands/suite/import.js +128 -0
  65. package/dist/commands/suite/index.js +94 -0
  66. package/dist/commands/suite/list.js +49 -0
  67. package/dist/commands/suite/use.js +227 -0
  68. package/dist/commands/sync.js +117 -0
  69. package/dist/commands/update.js +203 -0
  70. package/dist/mcp/install.js +550 -0
  71. package/dist/mcp/server.js +398 -0
  72. package/dist/mcp/tools.js +922 -0
  73. package/dist/pi-extensions/permission-sync.ts.template +41 -0
  74. package/dist/pi-extensions/permissions-gate.ts.template +69 -0
  75. package/dist/pi-extensions/pr-fix-trigger.ts.template +124 -0
  76. package/dist/pi-extensions/review-reminder.ts.template +58 -0
  77. package/dist/pi-extensions/workspace-input-status.ts.template +919 -0
  78. package/dist/program.js +136 -0
  79. package/dist/scripts/workspace-table.py +394 -0
  80. package/dist/types/dashboard.js +11 -0
  81. package/dist/types/index.js +2 -0
  82. package/dist/utils/agent-config.js +263 -0
  83. package/dist/utils/agent-state.js +178 -0
  84. package/dist/utils/banner.js +24 -0
  85. package/dist/utils/branch-operations.js +232 -0
  86. package/dist/utils/bug-report.js +355 -0
  87. package/dist/utils/cache.js +168 -0
  88. package/dist/utils/claude-integration.js +617 -0
  89. package/dist/utils/claude-sessions.js +260 -0
  90. package/dist/utils/cleanup-operations.js +120 -0
  91. package/dist/utils/colors.js +26 -0
  92. package/dist/utils/command-helpers.js +44 -0
  93. package/dist/utils/config.js +150 -0
  94. package/dist/utils/context-file.js +33 -0
  95. package/dist/utils/dashboard-hooks.js +172 -0
  96. package/dist/utils/dependency-analyzer.js +234 -0
  97. package/dist/utils/diff-operations.js +80 -0
  98. package/dist/utils/doc-generator.js +184 -0
  99. package/dist/utils/ghq-integration.js +332 -0
  100. package/dist/utils/git-operations.js +237 -0
  101. package/dist/utils/git-status.js +187 -0
  102. package/dist/utils/github.js +68 -0
  103. package/dist/utils/health-checks.js +345 -0
  104. package/dist/utils/history.js +150 -0
  105. package/dist/utils/hooks.js +100 -0
  106. package/dist/utils/logger.js +40 -0
  107. package/dist/utils/permission-sync.js +681 -0
  108. package/dist/utils/pi-extensions.js +224 -0
  109. package/dist/utils/progress.js +92 -0
  110. package/dist/utils/prompts.js +279 -0
  111. package/dist/utils/repo-resolver.js +260 -0
  112. package/dist/utils/retry.js +65 -0
  113. package/dist/utils/run-operations.js +30 -0
  114. package/dist/utils/suite.js +159 -0
  115. package/dist/utils/sync-operations.js +107 -0
  116. package/dist/utils/tmux-dashboard.js +184 -0
  117. package/dist/utils/validation.js +153 -0
  118. package/dist/utils/version-check.js +121 -0
  119. package/dist/utils/workspace-meta.js +185 -0
  120. package/install-shell-integration.sh +532 -0
  121. package/install.sh +401 -0
  122. package/package.json +90 -0
  123. package/remove-shell-block.awk +44 -0
  124. package/scripts/postinstall.js +85 -0
  125. package/skills/analyze-deps.md +23 -0
  126. package/skills/archive-workspace.md +26 -0
  127. package/skills/branch-create.md +18 -0
  128. package/skills/create-workspace.md +39 -0
  129. package/skills/delete-workspace.md +37 -0
  130. package/skills/list-org-repos.md +26 -0
  131. package/skills/list-suites.md +24 -0
  132. package/skills/list-workspaces.md +27 -0
  133. package/skills/refresh-workspace-docs.md +89 -0
  134. package/skills/remove-repo.md +25 -0
  135. package/skills/run-command.md +23 -0
  136. package/skills/save-context.md +68 -0
  137. package/skills/search-repos.md +31 -0
  138. package/skills/snapshot-list.md +18 -0
  139. package/skills/snapshot-save.md +12 -0
  140. package/skills/switch-branch.md +18 -0
  141. package/skills/update-cache.md +21 -0
  142. package/skills/update-workspace.md +66 -0
  143. package/skills/workspace-cleanup.md +18 -0
  144. package/skills/workspace-diff.md +23 -0
  145. package/skills/workspace-doctor.md +23 -0
  146. package/skills/workspace-info.md +45 -0
  147. package/skills/workspace-manager/SKILL.md +201 -0
  148. package/skills/workspace-manager/references/ai-prompt.md +44 -0
  149. package/skills/workspace-manager/references/analyze-deps.md +45 -0
  150. package/skills/workspace-manager/references/archive-workspace.md +38 -0
  151. package/skills/workspace-manager/references/branch-create.md +31 -0
  152. package/skills/workspace-manager/references/branch-merge.md +22 -0
  153. package/skills/workspace-manager/references/branch-rebase.md +22 -0
  154. package/skills/workspace-manager/references/cache-clear.md +18 -0
  155. package/skills/workspace-manager/references/cache-info.md +22 -0
  156. package/skills/workspace-manager/references/configure-claude.md +31 -0
  157. package/skills/workspace-manager/references/configure.md +35 -0
  158. package/skills/workspace-manager/references/create-workspace.md +45 -0
  159. package/skills/workspace-manager/references/dashboard.md +61 -0
  160. package/skills/workspace-manager/references/delete-workspace.md +33 -0
  161. package/skills/workspace-manager/references/generate-docs.md +36 -0
  162. package/skills/workspace-manager/references/ghq-status.md +28 -0
  163. package/skills/workspace-manager/references/go.md +33 -0
  164. package/skills/workspace-manager/references/history.md +41 -0
  165. package/skills/workspace-manager/references/list-org-repos.md +26 -0
  166. package/skills/workspace-manager/references/list-suites.md +21 -0
  167. package/skills/workspace-manager/references/list-workspaces.md +27 -0
  168. package/skills/workspace-manager/references/mcp.md +49 -0
  169. package/skills/workspace-manager/references/remove-repo.md +26 -0
  170. package/skills/workspace-manager/references/run-command.md +44 -0
  171. package/skills/workspace-manager/references/search-repos.md +24 -0
  172. package/skills/workspace-manager/references/sessions.md +27 -0
  173. package/skills/workspace-manager/references/suite-create.md +22 -0
  174. package/skills/workspace-manager/references/suite-delete.md +21 -0
  175. package/skills/workspace-manager/references/suite-export.md +19 -0
  176. package/skills/workspace-manager/references/suite-import.md +19 -0
  177. package/skills/workspace-manager/references/suite-use.md +27 -0
  178. package/skills/workspace-manager/references/switch-branch.md +25 -0
  179. package/skills/workspace-manager/references/update-cache.md +22 -0
  180. package/skills/workspace-manager/references/update-workspace.md +50 -0
  181. package/skills/workspace-manager/references/workspace-cleanup.md +33 -0
  182. package/skills/workspace-manager/references/workspace-diff.md +27 -0
  183. package/skills/workspace-manager/references/workspace-doctor.md +27 -0
  184. package/skills/workspace-manager/references/workspace-info.md +33 -0
  185. package/skills/workspace-manager/references/workspace-status.md +43 -0
  186. package/skills/workspace-manager/references/workspace-sync.md +26 -0
  187. package/skills/workspace-status.md +26 -0
  188. package/skills/workspace-sync.md +23 -0
  189. package/src/cli/ai-prompt.test.ts +667 -0
  190. package/src/cli/ai-prompt.ts +421 -0
  191. package/src/cli/dashboard/AgentList.tsx +44 -0
  192. package/src/cli/dashboard/DashboardSidebar.tsx +291 -0
  193. package/src/cli/dashboard/HelpFooter.tsx +22 -0
  194. package/src/cli/dashboard/StatusBadge.tsx +23 -0
  195. package/src/cli/dashboard/index.ts +5 -0
  196. package/src/cli/dashboard/types.ts +16 -0
  197. package/src/cli/tui.tsx +51 -0
  198. package/src/cli/workspace-cli.test.ts +30 -0
  199. package/src/commands/ai-prompt.ts +21 -0
  200. package/src/commands/analyze-deps.ts +119 -0
  201. package/src/commands/archive.ts +114 -0
  202. package/src/commands/branch/create.ts +94 -0
  203. package/src/commands/branch/index.ts +74 -0
  204. package/src/commands/branch/merge.ts +61 -0
  205. package/src/commands/branch/rebase.ts +54 -0
  206. package/src/commands/branch/switch.ts +150 -0
  207. package/src/commands/cache/index.ts +51 -0
  208. package/src/commands/cache/manager.ts +168 -0
  209. package/src/commands/cleanup.ts +132 -0
  210. package/src/commands/configure-claude.ts +55 -0
  211. package/src/commands/configure.ts +204 -0
  212. package/src/commands/create.ts +196 -0
  213. package/src/commands/dashboard/hook-handler.ts +138 -0
  214. package/src/commands/dashboard/index.ts +248 -0
  215. package/src/commands/dashboard/launcher.ts +42 -0
  216. package/src/commands/dashboard/session-picker.ts +73 -0
  217. package/src/commands/dashboard/sidebar.js +39 -0
  218. package/src/commands/dashboard/workspace-picker.ts +62 -0
  219. package/src/commands/delete.test.ts +250 -0
  220. package/src/commands/delete.ts +171 -0
  221. package/src/commands/deprecated-aliases.ts +55 -0
  222. package/src/commands/diff.ts +106 -0
  223. package/src/commands/doctor.ts +110 -0
  224. package/src/commands/generate-docs.ts +45 -0
  225. package/src/commands/ghq-status.ts +70 -0
  226. package/src/commands/go.ts +125 -0
  227. package/src/commands/history.ts +136 -0
  228. package/src/commands/list.test.ts +219 -0
  229. package/src/commands/list.ts +176 -0
  230. package/src/commands/mcp/index.ts +39 -0
  231. package/src/commands/migrate.ts +277 -0
  232. package/src/commands/remove-repo.ts +194 -0
  233. package/src/commands/report-bug.ts +88 -0
  234. package/src/commands/run.ts +125 -0
  235. package/src/commands/save-context.test.ts +113 -0
  236. package/src/commands/save-context.ts +141 -0
  237. package/src/commands/sessions.ts +99 -0
  238. package/src/commands/status.ts +111 -0
  239. package/src/commands/suite/create.ts +240 -0
  240. package/src/commands/suite/delete.ts +65 -0
  241. package/src/commands/suite/export.ts +97 -0
  242. package/src/commands/suite/import.ts +100 -0
  243. package/src/commands/suite/index.ts +66 -0
  244. package/src/commands/suite/list.ts +54 -0
  245. package/src/commands/suite/use.ts +232 -0
  246. package/src/commands/sync.ts +97 -0
  247. package/src/commands/update.ts +197 -0
  248. package/src/mcp/install.ts +529 -0
  249. package/src/mcp/server.ts +579 -0
  250. package/src/mcp/tools.test.ts +545 -0
  251. package/src/mcp/tools.ts +1019 -0
  252. package/src/mcp/update-workspace.test.ts +220 -0
  253. package/src/pi-extensions/permission-sync.ts.template +41 -0
  254. package/src/pi-extensions/permissions-gate.ts.template +69 -0
  255. package/src/pi-extensions/pr-fix-trigger.ts.template +124 -0
  256. package/src/pi-extensions/review-reminder.ts.template +58 -0
  257. package/src/pi-extensions/workspace-input-status.ts.template +919 -0
  258. package/src/program.ts +112 -0
  259. package/src/scripts/workspace-table.py +394 -0
  260. package/src/types/dashboard.ts +29 -0
  261. package/src/types/index.ts +109 -0
  262. package/src/types/ink.d.ts +171 -0
  263. package/src/utils/agent-config.test.ts +303 -0
  264. package/src/utils/agent-config.ts +264 -0
  265. package/src/utils/agent-state.test.ts +166 -0
  266. package/src/utils/agent-state.ts +135 -0
  267. package/src/utils/banner.ts +24 -0
  268. package/src/utils/branch-operations.ts +237 -0
  269. package/src/utils/bug-report.test.ts +174 -0
  270. package/src/utils/bug-report.ts +355 -0
  271. package/src/utils/cache.ts +150 -0
  272. package/src/utils/claude-integration.test.ts +381 -0
  273. package/src/utils/claude-integration.ts +649 -0
  274. package/src/utils/claude-sessions.test.ts +262 -0
  275. package/src/utils/claude-sessions.ts +251 -0
  276. package/src/utils/cleanup-operations.ts +94 -0
  277. package/src/utils/colors.ts +25 -0
  278. package/src/utils/command-helpers.ts +46 -0
  279. package/src/utils/config.test.ts +203 -0
  280. package/src/utils/config.ts +133 -0
  281. package/src/utils/context-file.ts +36 -0
  282. package/src/utils/dashboard-hooks.test.ts +168 -0
  283. package/src/utils/dashboard-hooks.ts +163 -0
  284. package/src/utils/dependency-analyzer.ts +243 -0
  285. package/src/utils/diff-operations.ts +59 -0
  286. package/src/utils/doc-generator.ts +187 -0
  287. package/src/utils/ghq-integration.test.ts +195 -0
  288. package/src/utils/ghq-integration.ts +317 -0
  289. package/src/utils/git-operations.test.ts +265 -0
  290. package/src/utils/git-operations.ts +233 -0
  291. package/src/utils/git-status.ts +171 -0
  292. package/src/utils/github.ts +74 -0
  293. package/src/utils/health-checks.ts +359 -0
  294. package/src/utils/history.ts +140 -0
  295. package/src/utils/hooks.ts +92 -0
  296. package/src/utils/logger.ts +37 -0
  297. package/src/utils/permission-sync.test.ts +593 -0
  298. package/src/utils/permission-sync.ts +720 -0
  299. package/src/utils/pi-extensions.test.ts +182 -0
  300. package/src/utils/pi-extensions.ts +226 -0
  301. package/src/utils/progress.ts +73 -0
  302. package/src/utils/prompts.test.ts +169 -0
  303. package/src/utils/prompts.ts +296 -0
  304. package/src/utils/repo-resolver.test.ts +313 -0
  305. package/src/utils/repo-resolver.ts +294 -0
  306. package/src/utils/retry.test.ts +124 -0
  307. package/src/utils/retry.ts +85 -0
  308. package/src/utils/run-operations.ts +38 -0
  309. package/src/utils/suite.test.ts +256 -0
  310. package/src/utils/suite.ts +144 -0
  311. package/src/utils/sync-operations.ts +87 -0
  312. package/src/utils/tmux-dashboard.ts +193 -0
  313. package/src/utils/validation.test.ts +139 -0
  314. package/src/utils/validation.ts +128 -0
  315. package/src/utils/version-check.test.ts +108 -0
  316. package/src/utils/version-check.ts +96 -0
  317. package/src/utils/workspace-meta.ts +173 -0
  318. package/sync-permissions.sh +137 -0
  319. package/tsconfig.json +20 -0
  320. package/uninstall.sh +162 -0
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerArchiveCommand = registerArchiveCommand;
7
+ const workspace_meta_1 = require("../utils/workspace-meta");
8
+ const prompts_1 = require("../utils/prompts");
9
+ const logger_1 = require("../utils/logger");
10
+ const colors_1 = require("../utils/colors");
11
+ const inquirer_1 = __importDefault(require("inquirer"));
12
+ const command_helpers_1 = require("../utils/command-helpers");
13
+ function registerArchiveCommand(parent) {
14
+ parent
15
+ .command('archive')
16
+ .alias('a')
17
+ .description('Archive a workspace (30-day expiry)')
18
+ .option('-w, --workspace <names>', 'Comma-separated workspace names')
19
+ .option('--unarchive', 'Unarchive a previously archived workspace')
20
+ .action(async (opts, cmd) => {
21
+ const globalOpts = (0, command_helpers_1.getGlobalOpts)(cmd);
22
+ await handleArchive({ ...opts, ...globalOpts });
23
+ });
24
+ }
25
+ async function handleArchive(opts) {
26
+ const isUnarchive = opts.unarchive ?? false;
27
+ const title = isUnarchive ? 'Unarchive Workspace' : 'Archive Workspace';
28
+ console.log('\n' + '='.repeat(60));
29
+ console.log((0, colors_1.colorize)(title, 'bright'));
30
+ console.log('='.repeat(60) + '\n');
31
+ try {
32
+ if (isUnarchive) {
33
+ const allWorkspaces = await (0, workspace_meta_1.listWorkspaces)(true);
34
+ const archivedWorkspaces = allWorkspaces.filter(ws => ws.metadata?.archivedAt);
35
+ if (archivedWorkspaces.length === 0) {
36
+ (0, logger_1.logInfo)('No archived workspaces found');
37
+ return;
38
+ }
39
+ let selectedNames;
40
+ if (opts.workspace) {
41
+ selectedNames = (0, command_helpers_1.parseList)(opts.workspace);
42
+ }
43
+ else {
44
+ selectedNames = await (0, prompts_1.promptMultiWorkspaceSelection)(archivedWorkspaces);
45
+ }
46
+ if (!opts.yes) {
47
+ const { confirmed } = await inquirer_1.default.prompt([{
48
+ type: 'confirm', name: 'confirmed',
49
+ message: selectedNames.length === 1
50
+ ? `Unarchive workspace ${selectedNames[0]}?`
51
+ : `Unarchive these ${selectedNames.length} workspaces?`,
52
+ default: true,
53
+ }]);
54
+ if (!confirmed)
55
+ return;
56
+ }
57
+ for (const name of selectedNames) {
58
+ try {
59
+ await (0, workspace_meta_1.unarchiveWorkspace)(name);
60
+ (0, logger_1.logSuccess)(`Unarchived "${(0, colors_1.colorize)(name, 'cyan')}"`);
61
+ }
62
+ catch (error) {
63
+ (0, logger_1.logError)(`Failed to unarchive "${name}"`);
64
+ if (error instanceof Error)
65
+ (0, logger_1.logError)(error.message);
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ const workspaces = await (0, workspace_meta_1.listWorkspaces)(false);
71
+ if (workspaces.length === 0) {
72
+ (0, logger_1.logInfo)('No active workspaces found');
73
+ return;
74
+ }
75
+ let selectedNames;
76
+ if (opts.workspace) {
77
+ selectedNames = (0, command_helpers_1.parseList)(opts.workspace);
78
+ }
79
+ else {
80
+ selectedNames = await (0, prompts_1.promptMultiWorkspaceSelection)(workspaces);
81
+ }
82
+ if (!opts.yes) {
83
+ const { confirmed } = await inquirer_1.default.prompt([{
84
+ type: 'confirm', name: 'confirmed',
85
+ message: selectedNames.length === 1
86
+ ? `Archive workspace ${selectedNames[0]}? It will be auto-deleted in 30 days.`
87
+ : `Archive these ${selectedNames.length} workspaces? They will be auto-deleted in 30 days.`,
88
+ default: true,
89
+ }]);
90
+ if (!confirmed)
91
+ return;
92
+ }
93
+ for (const name of selectedNames) {
94
+ try {
95
+ await (0, workspace_meta_1.archiveWorkspace)(name);
96
+ (0, logger_1.logSuccess)(`Archived "${(0, colors_1.colorize)(name, 'cyan')}" - will be auto-deleted in 30 days`);
97
+ }
98
+ catch (error) {
99
+ (0, logger_1.logError)(`Failed to archive "${name}"`);
100
+ if (error instanceof Error)
101
+ (0, logger_1.logError)(error.message);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ catch (error) {
107
+ (0, logger_1.logError)(`Failed to ${isUnarchive ? 'unarchive' : 'archive'} workspace`);
108
+ if (error instanceof Error) {
109
+ (0, logger_1.logError)(error.message);
110
+ }
111
+ process.exit(1);
112
+ }
113
+ }
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.main = void 0;
41
+ const path = __importStar(require("path"));
42
+ const workspace_meta_1 = require("../../utils/workspace-meta");
43
+ const prompts_1 = require("../../utils/prompts");
44
+ const branch_operations_1 = require("../../utils/branch-operations");
45
+ const logger_1 = require("../../utils/logger");
46
+ const colors_1 = require("../../utils/colors");
47
+ const config_1 = require("../../utils/config");
48
+ const inquirer_1 = __importDefault(require("inquirer"));
49
+ const main = async (opts) => {
50
+ try {
51
+ let workspaceName = opts?.workspace;
52
+ let branchName = opts?.branch;
53
+ const baseBranch = opts?.base;
54
+ const force = opts?.force ?? false;
55
+ // Resolve workspace interactively if needed
56
+ if (!workspaceName) {
57
+ if (!process.stdout.isTTY) {
58
+ (0, logger_1.logError)('Missing required option: --workspace');
59
+ (0, logger_1.logError)('Usage: w branch create --workspace <name> --branch <branch>');
60
+ process.exit(1);
61
+ }
62
+ const workspaces = await (0, workspace_meta_1.listWorkspaces)();
63
+ workspaceName = await (0, prompts_1.promptWorkspaceSelection)(workspaces);
64
+ }
65
+ // Resolve branch interactively if needed
66
+ if (!branchName) {
67
+ if (!process.stdout.isTTY) {
68
+ (0, logger_1.logError)('Missing required option: --branch');
69
+ (0, logger_1.logError)('Usage: w branch create --workspace <name> --branch <branch>');
70
+ process.exit(1);
71
+ }
72
+ const { branch } = await inquirer_1.default.prompt([
73
+ {
74
+ type: 'input',
75
+ name: 'branch',
76
+ message: 'New branch name:',
77
+ validate: (input) => input.trim() ? true : 'Branch name cannot be empty',
78
+ },
79
+ ]);
80
+ branchName = branch;
81
+ }
82
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, workspaceName);
83
+ const metadata = await (0, workspace_meta_1.loadMetadata)(workspacePath);
84
+ if (!metadata) {
85
+ (0, logger_1.logError)(`Workspace not found: ${workspaceName}`);
86
+ process.exit(1);
87
+ }
88
+ (0, logger_1.logStep)(`Creating branch ${(0, colors_1.colorize)(branchName, 'cyan')} across all repositories...`);
89
+ const results = [];
90
+ for (const repo of metadata.repositories) {
91
+ const repoPath = path.join(workspacePath, repo.directoryName);
92
+ const result = await (0, branch_operations_1.createBranch)(repoPath, repo.directoryName, branchName, baseBranch, force);
93
+ results.push(result);
94
+ if (result.success) {
95
+ (0, logger_1.logSuccess)(`${repo.directoryName}: ${result.message}`);
96
+ }
97
+ else {
98
+ (0, logger_1.logWarning)(`${repo.directoryName}: ${result.message}`);
99
+ }
100
+ }
101
+ const successful = results.filter(r => r.success).length;
102
+ const failed = results.filter(r => !r.success).length;
103
+ console.log('');
104
+ (0, logger_1.logInfo)(`Created branches in ${successful}/${results.length} repositories`);
105
+ if (failed > 0) {
106
+ (0, logger_1.logWarning)(`${failed} repositories were skipped or failed`);
107
+ }
108
+ }
109
+ catch (error) {
110
+ (0, logger_1.logError)('Failed to create branches');
111
+ if (error instanceof Error) {
112
+ (0, logger_1.logError)(error.message);
113
+ }
114
+ process.exit(1);
115
+ }
116
+ };
117
+ exports.main = main;
118
+ if (require.main === module)
119
+ (0, exports.main)();
@@ -0,0 +1,104 @@
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.registerBranchCommands = registerBranchCommands;
37
+ const command_helpers_1 = require("../../utils/command-helpers");
38
+ function registerBranchCommands(parent) {
39
+ const branch = parent
40
+ .command('branch')
41
+ .description('Branch management');
42
+ branch
43
+ .command('switch')
44
+ .description('Switch all repos to a specific branch')
45
+ .option('-w, --workspace <name>', 'Workspace name')
46
+ .option('-b, --branch <name>', 'Branch name')
47
+ .action(async (opts, cmd) => {
48
+ const globalOpts = (0, command_helpers_1.getGlobalOpts)(cmd);
49
+ const { main } = await Promise.resolve().then(() => __importStar(require('./switch')));
50
+ await main({
51
+ workspace: opts.workspace,
52
+ branch: opts.branch,
53
+ yes: globalOpts.yes,
54
+ });
55
+ });
56
+ branch
57
+ .command('create')
58
+ .description('Create branches across all repos')
59
+ .argument('[workspace]', 'Workspace name')
60
+ .argument('[branch]', 'Branch name')
61
+ .option('-w, --workspace <name>', 'Workspace name (flag alternative)')
62
+ .option('-b, --branch <name>', 'Branch name (flag alternative)')
63
+ .option('--base <branch>', 'Base branch')
64
+ .option('--force', 'Force create')
65
+ .action(async (workspaceArg, branchArg, opts) => {
66
+ const { main } = await Promise.resolve().then(() => __importStar(require('./create')));
67
+ await main({
68
+ workspace: opts.workspace || workspaceArg,
69
+ branch: opts.branch || branchArg,
70
+ base: opts.base,
71
+ force: opts.force,
72
+ });
73
+ });
74
+ branch
75
+ .command('merge')
76
+ .description('Merge branches across all repos')
77
+ .argument('<workspace>', 'Workspace name')
78
+ .argument('<source>', 'Source branch')
79
+ .argument('<target>', 'Target branch')
80
+ .option('--no-ff', 'No fast-forward')
81
+ .option('--ff-only', 'Fast-forward only')
82
+ .option('--squash', 'Squash merge')
83
+ .action(async (workspace, source, target, opts) => {
84
+ const { main } = await Promise.resolve().then(() => __importStar(require('./merge')));
85
+ await main({
86
+ workspace,
87
+ source,
88
+ target,
89
+ // Commander's --no-ff sets opts.ff = false
90
+ noFf: opts.ff === false,
91
+ ffOnly: opts.ffOnly,
92
+ squash: opts.squash,
93
+ });
94
+ });
95
+ branch
96
+ .command('rebase')
97
+ .description('Rebase branches across all repos')
98
+ .argument('<workspace>', 'Workspace name')
99
+ .argument('<base>', 'Base branch')
100
+ .action(async (workspace, base) => {
101
+ const { main } = await Promise.resolve().then(() => __importStar(require('./rebase')));
102
+ await main({ workspace, base });
103
+ });
104
+ }
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.main = void 0;
38
+ const path = __importStar(require("path"));
39
+ const config_1 = require("../../utils/config");
40
+ const workspace_meta_1 = require("../../utils/workspace-meta");
41
+ const branch_operations_1 = require("../../utils/branch-operations");
42
+ const logger_1 = require("../../utils/logger");
43
+ const colors_1 = require("../../utils/colors");
44
+ const main = async (opts) => {
45
+ try {
46
+ const workspaceName = opts?.workspace ?? process.argv[2];
47
+ const sourceBranch = opts?.source ?? process.argv[3];
48
+ const targetBranch = opts?.target ?? process.argv[4];
49
+ if (!workspaceName || !sourceBranch || !targetBranch) {
50
+ (0, logger_1.logError)('Usage: workspace branch-merge <workspace> <source-branch> <target-branch> [--no-ff|--ff-only|--squash]');
51
+ process.exit(1);
52
+ }
53
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, workspaceName);
54
+ const metadata = await (0, workspace_meta_1.loadMetadata)(workspacePath);
55
+ if (!metadata) {
56
+ (0, logger_1.logError)(`Workspace not found: ${workspaceName}`);
57
+ process.exit(1);
58
+ }
59
+ const options = {
60
+ noFf: opts?.noFf ?? process.argv.includes('--no-ff'),
61
+ ffOnly: opts?.ffOnly ?? process.argv.includes('--ff-only'),
62
+ squash: opts?.squash ?? process.argv.includes('--squash'),
63
+ };
64
+ (0, logger_1.logStep)(`Merging ${(0, colors_1.colorize)(sourceBranch, 'cyan')} into ${(0, colors_1.colorize)(targetBranch, 'cyan')}...`);
65
+ const results = [];
66
+ for (const repo of metadata.repositories) {
67
+ const repoPath = path.join(workspacePath, repo.name);
68
+ const result = await (0, branch_operations_1.mergeBranch)(repoPath, repo.name, sourceBranch, targetBranch, options);
69
+ results.push(result);
70
+ if (result.success) {
71
+ (0, logger_1.logSuccess)(`${repo.name}: ${result.message}`);
72
+ }
73
+ else {
74
+ (0, logger_1.logWarning)(`${repo.name}: ${result.message} - ${result.error || ''}`);
75
+ }
76
+ }
77
+ const successful = results.filter(r => r.success).length;
78
+ (0, logger_1.logInfo)(`Merged successfully in ${successful}/${results.length} repositories`);
79
+ }
80
+ catch (error) {
81
+ (0, logger_1.logError)('Failed to merge branches');
82
+ if (error instanceof Error) {
83
+ (0, logger_1.logError)(error.message);
84
+ }
85
+ process.exit(1);
86
+ }
87
+ };
88
+ exports.main = main;
89
+ if (require.main === module)
90
+ (0, exports.main)();
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.main = void 0;
38
+ const path = __importStar(require("path"));
39
+ const config_1 = require("../../utils/config");
40
+ const workspace_meta_1 = require("../../utils/workspace-meta");
41
+ const branch_operations_1 = require("../../utils/branch-operations");
42
+ const logger_1 = require("../../utils/logger");
43
+ const colors_1 = require("../../utils/colors");
44
+ const main = async (opts) => {
45
+ try {
46
+ const workspaceName = opts?.workspace ?? process.argv[2];
47
+ const targetBranch = opts?.base ?? process.argv[3];
48
+ if (!workspaceName || !targetBranch) {
49
+ (0, logger_1.logError)('Usage: workspace branch-rebase <workspace> <target-branch>');
50
+ process.exit(1);
51
+ }
52
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, workspaceName);
53
+ const metadata = await (0, workspace_meta_1.loadMetadata)(workspacePath);
54
+ if (!metadata) {
55
+ (0, logger_1.logError)(`Workspace not found: ${workspaceName}`);
56
+ process.exit(1);
57
+ }
58
+ (0, logger_1.logStep)(`Rebasing onto ${(0, colors_1.colorize)(targetBranch, 'cyan')}...`);
59
+ const results = [];
60
+ for (const repo of metadata.repositories) {
61
+ const repoPath = path.join(workspacePath, repo.name);
62
+ const result = await (0, branch_operations_1.rebaseBranch)(repoPath, repo.name, targetBranch);
63
+ results.push(result);
64
+ if (result.success) {
65
+ (0, logger_1.logSuccess)(`${repo.name}: ${result.message}`);
66
+ }
67
+ else {
68
+ (0, logger_1.logWarning)(`${repo.name}: ${result.message} - ${result.error || ''}`);
69
+ }
70
+ }
71
+ const successful = results.filter(r => r.success).length;
72
+ (0, logger_1.logInfo)(`Rebased successfully in ${successful}/${results.length} repositories`);
73
+ }
74
+ catch (error) {
75
+ (0, logger_1.logError)('Failed to rebase branches');
76
+ if (error instanceof Error) {
77
+ (0, logger_1.logError)(error.message);
78
+ }
79
+ process.exit(1);
80
+ }
81
+ };
82
+ exports.main = main;
83
+ if (require.main === module)
84
+ (0, exports.main)();
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.main = main;
41
+ const config_1 = require("../../utils/config");
42
+ const path = __importStar(require("path"));
43
+ const workspace_meta_1 = require("../../utils/workspace-meta");
44
+ const prompts_1 = require("../../utils/prompts");
45
+ const logger_1 = require("../../utils/logger");
46
+ const colors_1 = require("../../utils/colors");
47
+ const branch_operations_1 = require("../../utils/branch-operations");
48
+ const inquirer_1 = __importDefault(require("inquirer"));
49
+ async function main(opts) {
50
+ console.log('\n' + '='.repeat(60));
51
+ console.log((0, colors_1.colorize)('Bulk Branch Switch', 'bright'));
52
+ console.log('='.repeat(60) + '\n');
53
+ const yes = opts?.yes ?? false;
54
+ try {
55
+ // Select workspace
56
+ let workspaceName;
57
+ if (opts?.workspace) {
58
+ workspaceName = opts.workspace;
59
+ }
60
+ else {
61
+ if (!process.stdout.isTTY) {
62
+ (0, logger_1.logError)('Missing required option: --workspace');
63
+ (0, logger_1.logError)('Usage: w branch switch --workspace <name> --branch <branch>');
64
+ process.exit(1);
65
+ }
66
+ const workspaces = await (0, workspace_meta_1.listWorkspaces)();
67
+ workspaceName = await (0, prompts_1.promptWorkspaceSelection)(workspaces);
68
+ }
69
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, workspaceName);
70
+ (0, logger_1.logInfo)(`Selected workspace: ${(0, colors_1.colorize)(workspaceName, 'cyan')}`);
71
+ const metadata = await (0, workspace_meta_1.loadMetadata)(workspacePath);
72
+ if (!metadata) {
73
+ (0, logger_1.logError)('No metadata found for this workspace');
74
+ process.exit(1);
75
+ }
76
+ const repos = metadata.repositories.filter(r => r.status === 'success');
77
+ console.log(`\nFound ${repos.length} repositories\n`);
78
+ // Determine target branch
79
+ let targetBranch;
80
+ if (opts?.branch) {
81
+ targetBranch = opts.branch;
82
+ }
83
+ else {
84
+ if (!process.stdout.isTTY) {
85
+ (0, logger_1.logError)('Missing required option: --branch');
86
+ (0, logger_1.logError)('Usage: w branch switch --workspace <name> --branch <branch>');
87
+ process.exit(1);
88
+ }
89
+ const { branch } = await inquirer_1.default.prompt([
90
+ {
91
+ type: 'input',
92
+ name: 'branch',
93
+ message: 'Target branch name:',
94
+ default: 'main',
95
+ validate: (input) => {
96
+ if (!input || input.trim().length === 0) {
97
+ return 'Branch name cannot be empty';
98
+ }
99
+ return true;
100
+ },
101
+ },
102
+ ]);
103
+ targetBranch = branch;
104
+ }
105
+ (0, logger_1.logWarning)(`This will switch all repositories to branch: ${(0, colors_1.colorize)(targetBranch, 'cyan')}`);
106
+ // Skip confirmation when --yes flag is provided
107
+ if (!yes && process.stdout.isTTY) {
108
+ const { confirmed } = await inquirer_1.default.prompt([
109
+ {
110
+ type: 'confirm',
111
+ name: 'confirmed',
112
+ message: 'Proceed with bulk branch switch?',
113
+ default: true,
114
+ },
115
+ ]);
116
+ if (!confirmed) {
117
+ (0, logger_1.logInfo)('Branch switch cancelled');
118
+ process.exit(0);
119
+ }
120
+ }
121
+ console.log('');
122
+ const results = [];
123
+ for (const repo of repos) {
124
+ const repoPath = path.join(workspacePath, repo.directoryName);
125
+ const displayName = repo.directoryName !== repo.name
126
+ ? `${repo.directoryName} (${repo.name})`
127
+ : repo.name;
128
+ const result = await (0, branch_operations_1.switchBranch)(repoPath, displayName, targetBranch);
129
+ results.push(result);
130
+ }
131
+ console.log('\n' + '='.repeat(60));
132
+ console.log('Branch Switch Results Summary');
133
+ console.log('='.repeat(60));
134
+ const successful = results.filter(r => r.status === 'success');
135
+ const failed = results.filter(r => r.status === 'failed');
136
+ const skipped = results.filter(r => r.status === 'skipped');
137
+ console.log(`${(0, colors_1.colorize)('✓', 'green')} Switched: ${successful.length}`);
138
+ console.log(`${(0, colors_1.colorize)('✗', 'red')} Failed: ${failed.length}`);
139
+ console.log(`${(0, colors_1.colorize)('○', 'yellow')} Skipped: ${skipped.length}`);
140
+ console.log('='.repeat(60));
141
+ if (failed.length > 0) {
142
+ console.log('\nFailed repositories:');
143
+ failed.forEach(result => {
144
+ console.log(` ${(0, colors_1.colorize)('✗', 'red')} ${result.repo}: ${result.message}`);
145
+ });
146
+ }
147
+ if (skipped.length > 0) {
148
+ console.log('\nSkipped repositories:');
149
+ skipped.forEach(result => {
150
+ console.log(` ${(0, colors_1.colorize)('○', 'yellow')} ${result.repo}: ${result.message}`);
151
+ });
152
+ }
153
+ console.log('');
154
+ (0, logger_1.logSuccess)('Bulk branch switch complete!');
155
+ }
156
+ catch (error) {
157
+ (0, logger_1.logError)('Failed to switch branches');
158
+ if (error instanceof Error) {
159
+ (0, logger_1.logError)(error.message);
160
+ }
161
+ process.exit(1);
162
+ }
163
+ }
164
+ if (require.main === module)
165
+ main();