@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,194 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerDeleteCommand = registerDeleteCommand;
40
+ exports.main = main;
41
+ const fs = __importStar(require("fs/promises"));
42
+ const config_1 = require("../utils/config");
43
+ const path = __importStar(require("path"));
44
+ const workspace_meta_1 = require("../utils/workspace-meta");
45
+ const prompts_1 = require("../utils/prompts");
46
+ const logger_1 = require("../utils/logger");
47
+ const colors_1 = require("../utils/colors");
48
+ const inquirer_1 = __importDefault(require("inquirer"));
49
+ const command_helpers_1 = require("../utils/command-helpers");
50
+ function registerDeleteCommand(parent) {
51
+ parent
52
+ .command('delete')
53
+ .aliases(['d', 'del'])
54
+ .description('Delete a workspace')
55
+ .option('-w, --workspace <names>', 'Comma-separated workspace names')
56
+ .action(async (opts, cmd) => {
57
+ const globalOpts = (0, command_helpers_1.getGlobalOpts)(cmd);
58
+ await handleDelete({ ...opts, ...globalOpts });
59
+ });
60
+ }
61
+ async function handleDelete(opts) {
62
+ console.log('\n' + '='.repeat(60));
63
+ console.log((0, colors_1.colorize)('Delete Workspace', 'bright'));
64
+ console.log('='.repeat(60) + '\n');
65
+ try {
66
+ // Non-interactive path: workspace names provided via flag
67
+ if (opts.workspace) {
68
+ const selectedNames = (0, command_helpers_1.parseList)(opts.workspace);
69
+ const workspaces = await (0, workspace_meta_1.listWorkspaces)();
70
+ for (const name of selectedNames) {
71
+ const workspace = workspaces.find(ws => ws.name === name);
72
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, name);
73
+ if (workspace?.metadata) {
74
+ console.log(`${(0, colors_1.colorize)(name, 'cyan')}`);
75
+ console.log(` Repositories: ${workspace.metadata.repositories.length}`);
76
+ console.log(` Path: ${workspacePath}`);
77
+ }
78
+ else {
79
+ console.log(`${(0, colors_1.colorize)(name, 'cyan')}: ${workspacePath}`);
80
+ }
81
+ }
82
+ console.log('');
83
+ (0, logger_1.logWarning)('This will permanently delete all cloned repositories in the selected workspaces!');
84
+ if (!opts.yes) {
85
+ const { confirmed } = await inquirer_1.default.prompt([
86
+ {
87
+ type: 'confirm',
88
+ name: 'confirmed',
89
+ message: selectedNames.length === 1
90
+ ? `Delete workspace ${selectedNames[0]}?`
91
+ : `Delete these ${selectedNames.length} workspaces?`,
92
+ default: true,
93
+ },
94
+ ]);
95
+ if (!confirmed) {
96
+ (0, logger_1.logInfo)('Deletion cancelled');
97
+ process.exit(0);
98
+ }
99
+ }
100
+ for (const name of selectedNames) {
101
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, name);
102
+ try {
103
+ await fs.rm(workspacePath, { recursive: true, force: true });
104
+ (0, logger_1.logSuccess)(`Deleted "${(0, colors_1.colorize)(name, 'cyan')}"`);
105
+ }
106
+ catch (error) {
107
+ (0, logger_1.logError)(`Failed to delete "${name}"`);
108
+ if (error instanceof Error)
109
+ (0, logger_1.logError)(error.message);
110
+ }
111
+ }
112
+ return;
113
+ }
114
+ // Interactive path
115
+ while (true) {
116
+ const workspaces = await (0, workspace_meta_1.listWorkspaces)();
117
+ if (workspaces.length === 0) {
118
+ (0, logger_1.logInfo)('No more workspaces remaining');
119
+ break;
120
+ }
121
+ const selectedNames = await (0, prompts_1.promptMultiWorkspaceSelection)(workspaces);
122
+ for (const name of selectedNames) {
123
+ const workspace = workspaces.find(ws => ws.name === name);
124
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, name);
125
+ if (workspace?.metadata) {
126
+ console.log(`${(0, colors_1.colorize)(name, 'cyan')}`);
127
+ console.log(` Repositories: ${workspace.metadata.repositories.length}`);
128
+ console.log(` Created: ${new Date(workspace.metadata.createdAt).toLocaleString()}`);
129
+ console.log(` Path: ${workspacePath}`);
130
+ }
131
+ else {
132
+ console.log(`${(0, colors_1.colorize)(name, 'cyan')}`);
133
+ console.log(` Path: ${workspacePath}`);
134
+ }
135
+ }
136
+ console.log('');
137
+ (0, logger_1.logWarning)('This will permanently delete all cloned repositories in the selected workspaces!');
138
+ const confirmMessage = selectedNames.length === 1
139
+ ? `Delete workspace ${selectedNames[0]}?`
140
+ : `Delete these ${selectedNames.length} workspaces?`;
141
+ const { confirmed } = await inquirer_1.default.prompt([
142
+ {
143
+ type: 'confirm',
144
+ name: 'confirmed',
145
+ message: confirmMessage,
146
+ default: true,
147
+ },
148
+ ]);
149
+ if (confirmed) {
150
+ for (const name of selectedNames) {
151
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, name);
152
+ try {
153
+ await fs.rm(workspacePath, { recursive: true, force: true });
154
+ (0, logger_1.logSuccess)(`Deleted "${(0, colors_1.colorize)(name, 'cyan')}"`);
155
+ }
156
+ catch (error) {
157
+ (0, logger_1.logError)(`Failed to delete "${name}"`);
158
+ if (error instanceof Error)
159
+ (0, logger_1.logError)(error.message);
160
+ }
161
+ }
162
+ }
163
+ const remaining = await (0, workspace_meta_1.listWorkspaces)();
164
+ if (remaining.length === 0) {
165
+ (0, logger_1.logInfo)('No more workspaces remaining');
166
+ break;
167
+ }
168
+ const { deleteMore } = await inquirer_1.default.prompt([
169
+ {
170
+ type: 'confirm',
171
+ name: 'deleteMore',
172
+ message: 'Delete more workspaces?',
173
+ default: false,
174
+ },
175
+ ]);
176
+ if (!deleteMore) {
177
+ break;
178
+ }
179
+ }
180
+ }
181
+ catch (error) {
182
+ (0, logger_1.logError)('Failed to delete workspace');
183
+ if (error instanceof Error) {
184
+ (0, logger_1.logError)(error.message);
185
+ }
186
+ process.exit(1);
187
+ }
188
+ }
189
+ /**
190
+ * Legacy main() for backward compatibility with tests.
191
+ */
192
+ async function main() {
193
+ await handleDelete({ yes: false, forceRefresh: false });
194
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerDeprecatedAliases = registerDeprecatedAliases;
4
+ const DEPRECATED_SHORT_ALIASES = [
5
+ { name: 'sc', target: ['suite', 'create'] },
6
+ { name: 'sls', target: ['suite', 'list'] },
7
+ { name: 'sd', target: ['suite', 'delete'] },
8
+ { name: 'se', target: ['suite', 'export'] },
9
+ { name: 'si', target: ['suite', 'import'] },
10
+ { name: 'fs', target: ['suite', 'use'] },
11
+ { name: 'sb', target: ['branch', 'switch'] },
12
+ { name: 'bc', target: ['branch', 'create'] },
13
+ { name: 'bm', target: ['branch', 'merge'] },
14
+ { name: 'br', target: ['branch', 'rebase'] },
15
+ { name: 'uc', target: ['cache', 'refresh'] },
16
+ ];
17
+ const DEPRECATED_FLAT_COMMANDS = [
18
+ { name: 'suite-create', target: ['suite', 'create'] },
19
+ { name: 'suite-list', target: ['suite', 'list'] },
20
+ { name: 'suite-delete', target: ['suite', 'delete'] },
21
+ { name: 'suite-export', target: ['suite', 'export'] },
22
+ { name: 'suite-import', target: ['suite', 'import'] },
23
+ { name: 'from-suite', target: ['suite', 'use'] },
24
+ { name: 'switch-branch', target: ['branch', 'switch'] },
25
+ { name: 'branch-create', target: ['branch', 'create'] },
26
+ { name: 'branch-merge', target: ['branch', 'merge'] },
27
+ { name: 'branch-rebase', target: ['branch', 'rebase'] },
28
+ { name: 'update-cache', target: ['cache', 'refresh'] },
29
+ ];
30
+ function registerDeprecatedAliases(program) {
31
+ const all = [...DEPRECATED_SHORT_ALIASES, ...DEPRECATED_FLAT_COMMANDS];
32
+ for (const alias of all) {
33
+ program
34
+ .command(alias.name, { hidden: true })
35
+ .allowUnknownOption()
36
+ .allowExcessArguments()
37
+ .action(async () => {
38
+ const [group, sub] = alias.target;
39
+ process.stderr.write(`[nemus] "w ${alias.name}" is deprecated, use "w ${group} ${sub}" instead\n`);
40
+ // Re-parse with the correct group + subcommand
41
+ await program.parseAsync([process.argv[0], process.argv[1], group, sub, ...process.argv.slice(3)]);
42
+ });
43
+ }
44
+ }
@@ -0,0 +1,129 @@
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.registerDiffCommand = registerDiffCommand;
37
+ const path = __importStar(require("path"));
38
+ const config_1 = require("../utils/config");
39
+ const workspace_meta_1 = require("../utils/workspace-meta");
40
+ const logger_1 = require("../utils/logger");
41
+ const colors_1 = require("../utils/colors");
42
+ const command_helpers_1 = require("../utils/command-helpers");
43
+ const diff_operations_1 = require("../utils/diff-operations");
44
+ const child_process_1 = require("child_process");
45
+ const util_1 = require("util");
46
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
47
+ function registerDiffCommand(parent) {
48
+ parent
49
+ .command('diff')
50
+ .alias('di')
51
+ .description('Show diff summary across all repos')
52
+ .argument('[workspace]', 'Workspace name')
53
+ .option('--full', 'Show full diff output')
54
+ .action(async (workspace, opts) => {
55
+ await handleDiff(workspace, opts);
56
+ });
57
+ }
58
+ async function handleDiff(workspaceArg, opts = {}) {
59
+ try {
60
+ const selectedWorkspace = await (0, command_helpers_1.resolveWorkspace)(workspaceArg);
61
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, selectedWorkspace);
62
+ const metadata = await (0, workspace_meta_1.loadMetadata)(workspacePath);
63
+ if (!metadata) {
64
+ (0, logger_1.logError)(`Workspace metadata not found for: ${selectedWorkspace}`);
65
+ process.exit(1);
66
+ }
67
+ const repos = metadata.repositories.filter(r => r.status === 'success');
68
+ console.log('\n' + (0, colors_1.colorize)('Workspace Diff Summary', 'bright'));
69
+ console.log((0, colors_1.colorize)('═'.repeat(40), 'gray') + '\n');
70
+ const diffs = [];
71
+ let totalStaged = 0;
72
+ let totalUnstaged = 0;
73
+ let reposWithChanges = 0;
74
+ for (const repo of repos) {
75
+ const repoPath = path.join(workspacePath, repo.directoryName);
76
+ const displayName = repo.directoryName !== repo.name
77
+ ? `${repo.directoryName} (${repo.name})`
78
+ : repo.name;
79
+ const diff = await (0, diff_operations_1.getRepoDiff)(repoPath, displayName);
80
+ diffs.push(diff);
81
+ if (diff.error) {
82
+ console.log((0, colors_1.colorize)(diff.repo, 'cyan'));
83
+ console.log(` ${(0, colors_1.colorize)('⚠', 'yellow')} ${diff.error}\n`);
84
+ continue;
85
+ }
86
+ const hasChanges = diff.staged.files > 0 || diff.unstaged.files > 0;
87
+ if (hasChanges) {
88
+ reposWithChanges++;
89
+ totalStaged += diff.staged.files;
90
+ totalUnstaged += diff.unstaged.files;
91
+ console.log((0, colors_1.colorize)(diff.repo, 'cyan'));
92
+ if (diff.staged.files > 0) {
93
+ console.log(` Staged: ${diff.staged.files} file(s), ${(0, colors_1.colorize)(`+${diff.staged.insertions}`, 'green')}, ${(0, colors_1.colorize)(`-${diff.staged.deletions}`, 'red')}`);
94
+ }
95
+ if (diff.unstaged.files > 0) {
96
+ console.log(` Unstaged: ${diff.unstaged.files} file(s), ${(0, colors_1.colorize)(`+${diff.unstaged.insertions}`, 'green')}, ${(0, colors_1.colorize)(`-${diff.unstaged.deletions}`, 'red')}`);
97
+ }
98
+ console.log('');
99
+ if (opts.full) {
100
+ try {
101
+ const { stdout: fullDiff } = await execAsync('git diff', { cwd: path.join(workspacePath, repo.directoryName) });
102
+ if (fullDiff.trim()) {
103
+ console.log((0, colors_1.colorize)('--- Full diff ---', 'gray'));
104
+ console.log(fullDiff);
105
+ console.log('');
106
+ }
107
+ }
108
+ catch {
109
+ // Ignore errors getting full diff
110
+ }
111
+ }
112
+ }
113
+ else {
114
+ console.log((0, colors_1.colorize)(diff.repo, 'cyan'));
115
+ console.log(` ${(0, colors_1.colorize)('✓', 'green')} Clean\n`);
116
+ }
117
+ }
118
+ console.log((0, colors_1.colorize)('═'.repeat(40), 'gray'));
119
+ console.log(`Total: ${(0, colors_1.colorize)(String(totalStaged), 'green')} staged, ${(0, colors_1.colorize)(String(totalUnstaged), 'yellow')} unstaged across ${reposWithChanges} repo(s)`);
120
+ console.log('');
121
+ }
122
+ catch (error) {
123
+ (0, logger_1.logError)('Failed to get workspace diff');
124
+ if (error instanceof Error) {
125
+ (0, logger_1.logError)(error.message);
126
+ }
127
+ process.exit(1);
128
+ }
129
+ }
@@ -0,0 +1,141 @@
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.registerDoctorCommand = registerDoctorCommand;
37
+ const path = __importStar(require("path"));
38
+ const config_1 = require("../utils/config");
39
+ const workspace_meta_1 = require("../utils/workspace-meta");
40
+ const health_checks_1 = require("../utils/health-checks");
41
+ const logger_1 = require("../utils/logger");
42
+ const colors_1 = require("../utils/colors");
43
+ const command_helpers_1 = require("../utils/command-helpers");
44
+ const displayHealthCheck = (result) => {
45
+ let statusIcon = '';
46
+ let statusColor = 'green';
47
+ switch (result.status) {
48
+ case 'healthy':
49
+ statusIcon = '✓';
50
+ statusColor = 'green';
51
+ break;
52
+ case 'warning':
53
+ statusIcon = '⚠';
54
+ statusColor = 'yellow';
55
+ break;
56
+ case 'error':
57
+ statusIcon = '✗';
58
+ statusColor = 'red';
59
+ break;
60
+ }
61
+ console.log(`\n${(0, colors_1.colorize)(statusIcon, statusColor)} ${(0, colors_1.colorize)(result.category, 'bright')}`);
62
+ console.log(` ${result.message}`);
63
+ if (result.details) {
64
+ console.log(` ${(0, colors_1.colorize)('Details:', 'gray')} ${result.details}`);
65
+ }
66
+ if (result.actionable) {
67
+ console.log(` ${(0, colors_1.colorize)('→', 'cyan')} ${result.actionable}`);
68
+ }
69
+ };
70
+ const displayHealthScore = (score) => {
71
+ let scoreColor = 'green';
72
+ let rating = 'Excellent';
73
+ if (score >= 80) {
74
+ scoreColor = 'green';
75
+ rating = 'Excellent';
76
+ }
77
+ else if (score >= 60) {
78
+ scoreColor = 'yellow';
79
+ rating = 'Good';
80
+ }
81
+ else if (score >= 40) {
82
+ scoreColor = 'yellow';
83
+ rating = 'Fair';
84
+ }
85
+ else {
86
+ scoreColor = 'red';
87
+ rating = 'Poor';
88
+ }
89
+ console.log('\n' + (0, colors_1.colorize)('═'.repeat(60), 'gray'));
90
+ console.log(`${(0, colors_1.colorize)('Overall Health Score:', 'bright')} ${(0, colors_1.colorize)(String(score), scoreColor)}/100 (${(0, colors_1.colorize)(rating, scoreColor)})`);
91
+ console.log((0, colors_1.colorize)('═'.repeat(60), 'gray') + '\n');
92
+ };
93
+ function registerDoctorCommand(parent) {
94
+ parent
95
+ .command('doctor')
96
+ .alias('doc')
97
+ .description('Run comprehensive health checks')
98
+ .argument('[workspace]', 'Workspace name')
99
+ .action(async (workspace) => {
100
+ await handleDoctor(workspace);
101
+ });
102
+ }
103
+ async function handleDoctor(workspaceArg) {
104
+ try {
105
+ const selectedWorkspace = await (0, command_helpers_1.resolveWorkspace)(workspaceArg);
106
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, selectedWorkspace);
107
+ const metadata = await (0, workspace_meta_1.loadMetadata)(workspacePath);
108
+ if (!metadata) {
109
+ (0, logger_1.logError)(`Workspace metadata not found for: ${selectedWorkspace}`);
110
+ process.exit(1);
111
+ }
112
+ (0, logger_1.logStep)(`Running health checks for workspace: ${(0, colors_1.colorize)(selectedWorkspace, 'cyan')}`);
113
+ (0, logger_1.logInfo)('This may take a moment...');
114
+ const results = await (0, health_checks_1.runAllHealthChecks)(workspacePath, metadata);
115
+ const score = (0, health_checks_1.calculateHealthScore)(results);
116
+ console.log('\n' + (0, colors_1.colorize)('Health Check Results', 'bright'));
117
+ console.log((0, colors_1.colorize)('═'.repeat(60), 'gray'));
118
+ for (const result of results) {
119
+ displayHealthCheck(result);
120
+ }
121
+ displayHealthScore(score);
122
+ const hasErrors = results.some(r => r.status === 'error');
123
+ const hasWarnings = results.some(r => r.status === 'warning');
124
+ if (hasErrors) {
125
+ (0, logger_1.logError)('Critical issues detected. Please address error items above.');
126
+ }
127
+ else if (hasWarnings) {
128
+ (0, logger_1.logWarning)('Some warnings detected. Review and address when possible.');
129
+ }
130
+ else {
131
+ (0, logger_1.logSuccess)('All health checks passed! Your workspace is in good shape.');
132
+ }
133
+ }
134
+ catch (error) {
135
+ (0, logger_1.logError)('Failed to run health checks');
136
+ if (error instanceof Error) {
137
+ (0, logger_1.logError)(error.message);
138
+ }
139
+ process.exit(1);
140
+ }
141
+ }
@@ -0,0 +1,77 @@
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.registerGenerateDocsCommand = registerGenerateDocsCommand;
37
+ const path = __importStar(require("path"));
38
+ const config_1 = require("../utils/config");
39
+ const workspace_meta_1 = require("../utils/workspace-meta");
40
+ const doc_generator_1 = require("../utils/doc-generator");
41
+ const logger_1 = require("../utils/logger");
42
+ const colors_1 = require("../utils/colors");
43
+ const command_helpers_1 = require("../utils/command-helpers");
44
+ function registerGenerateDocsCommand(parent) {
45
+ parent
46
+ .command('generate-docs')
47
+ .alias('gd')
48
+ .description('Generate workspace documentation')
49
+ .argument('[workspace]', 'Workspace name')
50
+ .action(async (workspace) => {
51
+ await handleGenerateDocs(workspace);
52
+ });
53
+ }
54
+ async function handleGenerateDocs(workspaceArg) {
55
+ try {
56
+ const workspaceName = await (0, command_helpers_1.resolveWorkspace)(workspaceArg);
57
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, workspaceName);
58
+ const metadata = await (0, workspace_meta_1.loadMetadata)(workspacePath);
59
+ if (!metadata) {
60
+ (0, logger_1.logError)(`Workspace not found: ${workspaceName}`);
61
+ process.exit(1);
62
+ }
63
+ (0, logger_1.logStep)(`Generating documentation for ${(0, colors_1.colorize)(workspaceName, 'cyan')}...`);
64
+ await (0, doc_generator_1.writeDocs)(workspacePath, metadata);
65
+ (0, logger_1.logSuccess)('Documentation generated:');
66
+ console.log(` • WORKSPACE-README.md`);
67
+ console.log(` • DEPENDENCY-GRAPH.md`);
68
+ console.log(` • REPOSITORY-INDEX.md`);
69
+ }
70
+ catch (error) {
71
+ (0, logger_1.logError)('Failed to generate documentation');
72
+ if (error instanceof Error) {
73
+ (0, logger_1.logError)(error.message);
74
+ }
75
+ process.exit(1);
76
+ }
77
+ }
@@ -0,0 +1,72 @@
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.registerGhqStatusCommand = registerGhqStatusCommand;
7
+ const ghq_integration_1 = require("../utils/ghq-integration");
8
+ const logger_1 = require("../utils/logger");
9
+ const colors_1 = require("../utils/colors");
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ function registerGhqStatusCommand(parent) {
12
+ parent
13
+ .command('ghq-status')
14
+ .description('Check ghq integration status')
15
+ .action(async () => {
16
+ await handleGhqStatus();
17
+ });
18
+ }
19
+ async function handleGhqStatus() {
20
+ console.log('\n' + '='.repeat(60));
21
+ console.log((0, colors_1.colorize)('ghq Integration Status', 'bright'));
22
+ console.log('='.repeat(60) + '\n');
23
+ try {
24
+ const status = await (0, ghq_integration_1.getGhqStatus)();
25
+ if (status.installed) {
26
+ (0, logger_1.logSuccess)('ghq is installed and active');
27
+ console.log('');
28
+ console.log((0, colors_1.colorize)('Configuration:', 'cyan'));
29
+ console.log(` Root directory: ${(0, colors_1.colorize)(status.root || 'unknown', 'gray')}`);
30
+ console.log(` Managed repositories: ${(0, colors_1.colorize)(String(status.repoCount || 0), 'yellow')}`);
31
+ console.log('');
32
+ if (status.repoCount && status.repoCount > 0) {
33
+ const { showRepos } = await inquirer_1.default.prompt([{
34
+ type: 'confirm', name: 'showRepos',
35
+ message: `View all ${status.repoCount} managed repositories?`, default: false,
36
+ }]);
37
+ if (showRepos) {
38
+ const repos = await (0, ghq_integration_1.ghqList)();
39
+ console.log('');
40
+ console.log((0, colors_1.colorize)('Managed Repositories:', 'cyan'));
41
+ repos.forEach((repo, index) => { console.log(` ${index + 1}. ${repo}`); });
42
+ console.log('');
43
+ }
44
+ }
45
+ }
46
+ else {
47
+ (0, logger_1.logWarning)('ghq is not installed');
48
+ console.log('');
49
+ console.log('The workspace manager will use direct git clones.');
50
+ const { showInfo } = await inquirer_1.default.prompt([{
51
+ type: 'confirm', name: 'showInfo',
52
+ message: 'Show ghq installation information?', default: true,
53
+ }]);
54
+ if (showInfo) {
55
+ (0, ghq_integration_1.displayGhqInfo)();
56
+ }
57
+ }
58
+ console.log((0, colors_1.colorize)('Workspace Manager Behavior:', 'cyan'));
59
+ console.log(' • Auto-detects ghq installation');
60
+ console.log(' • Uses ghq when available');
61
+ console.log(' • Falls back to git clone if needed');
62
+ console.log(' • Always maintains workspace isolation');
63
+ console.log('');
64
+ }
65
+ catch (error) {
66
+ (0, logger_1.logError)('Failed to check ghq status');
67
+ if (error instanceof Error) {
68
+ (0, logger_1.logError)(error.message);
69
+ }
70
+ process.exit(1);
71
+ }
72
+ }