@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,154 @@
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.registerGoCommand = registerGoCommand;
40
+ const path = __importStar(require("path"));
41
+ const config_1 = require("../utils/config");
42
+ const fs = __importStar(require("fs/promises"));
43
+ const os = __importStar(require("os"));
44
+ const workspace_meta_1 = require("../utils/workspace-meta");
45
+ const claude_sessions_1 = require("../utils/claude-sessions");
46
+ const logger_1 = require("../utils/logger");
47
+ const colors_1 = require("../utils/colors");
48
+ const inquirer_1 = __importDefault(require("inquirer"));
49
+ const inquirer_autocomplete_prompt_1 = __importDefault(require("inquirer-autocomplete-prompt"));
50
+ const fuzzy = __importStar(require("fuzzy"));
51
+ inquirer_1.default.registerPrompt('autocomplete', inquirer_autocomplete_prompt_1.default);
52
+ const TEMP_FILE = path.join(os.homedir(), '.workspace-last-go');
53
+ const RESUME_FLAG_FILE = path.join(os.homedir(), '.workspace-resume-session');
54
+ function registerGoCommand(parent) {
55
+ parent
56
+ .command('go')
57
+ .description('Quick navigate to workspace')
58
+ .argument('[workspace]', 'Workspace name')
59
+ .action(async (workspace) => {
60
+ await handleGo(workspace);
61
+ });
62
+ }
63
+ async function handleGo(workspaceArg) {
64
+ try {
65
+ let selectedWorkspace;
66
+ if (workspaceArg) {
67
+ selectedWorkspace = workspaceArg;
68
+ }
69
+ else {
70
+ const [workspaces, sessions] = await Promise.all([
71
+ (0, workspace_meta_1.listWorkspaces)(),
72
+ (0, claude_sessions_1.getWorkspaceSessions)(),
73
+ ]);
74
+ if (workspaces.length === 0) {
75
+ (0, logger_1.logError)('No workspaces found');
76
+ process.exit(1);
77
+ return;
78
+ }
79
+ // Build session map, keeping most-recent session per workspace
80
+ // (sessions are sorted most-recent-first, so first entry wins)
81
+ const sessionMap = new Map();
82
+ for (const session of sessions) {
83
+ if (!sessionMap.has(session.workspaceName)) {
84
+ sessionMap.set(session.workspaceName, session);
85
+ }
86
+ }
87
+ const items = workspaces.map(ws => ({
88
+ name: ws.name,
89
+ repoCount: ws.metadata?.repositories?.length ?? 0,
90
+ lastActiveLabel: sessionMap.get(ws.name)?.lastActiveLabel ?? null,
91
+ lastActiveAt: sessionMap.get(ws.name)?.lastActiveAt.getTime() ?? 0,
92
+ hasSession: sessionMap.has(ws.name),
93
+ }));
94
+ items.sort((a, b) => {
95
+ if (a.hasSession && b.hasSession)
96
+ return b.lastActiveAt - a.lastActiveAt;
97
+ if (a.hasSession)
98
+ return -1;
99
+ if (b.hasSession)
100
+ return 1;
101
+ return 0;
102
+ });
103
+ const { workspaceName } = await inquirer_1.default.prompt([
104
+ {
105
+ type: 'autocomplete',
106
+ name: 'workspaceName',
107
+ message: 'Select workspace to navigate to:',
108
+ source: async (_answersSoFar, input) => {
109
+ const searchInput = input || '';
110
+ const source = items.map(item => ({
111
+ name: `${item.name} ${item.lastActiveLabel ? (0, colors_1.colorize)(item.lastActiveLabel, 'dim') : (0, colors_1.colorize)('no session', 'dim')} ${(0, colors_1.colorize)(`${item.repoCount} repos`, 'dim')}`,
112
+ value: item.name,
113
+ }));
114
+ if (!searchInput)
115
+ return source;
116
+ const results = fuzzy.filter(searchInput, items, { extract: (item) => item.name });
117
+ return results.map(result => ({
118
+ name: `${result.original.name} ${result.original.lastActiveLabel ? (0, colors_1.colorize)(result.original.lastActiveLabel, 'dim') : (0, colors_1.colorize)('no session', 'dim')} ${(0, colors_1.colorize)(`${result.original.repoCount} repos`, 'dim')}`,
119
+ value: result.original.name,
120
+ }));
121
+ },
122
+ pageSize: 15,
123
+ },
124
+ ]);
125
+ selectedWorkspace = workspaceName;
126
+ }
127
+ const workspacePath = path.join(config_1.WORKSPACES_DIR, selectedWorkspace);
128
+ try {
129
+ await fs.access(workspacePath);
130
+ }
131
+ catch {
132
+ (0, logger_1.logError)(`Workspace not found: ${selectedWorkspace}`);
133
+ process.exit(1);
134
+ }
135
+ await fs.writeFile(TEMP_FILE, workspacePath, 'utf-8');
136
+ const sessions = await (0, claude_sessions_1.getWorkspaceSessions)();
137
+ const session = sessions.find(s => s.workspaceName === selectedWorkspace);
138
+ if (session) {
139
+ // Write JSON with session ID and agent type for correct resume
140
+ await fs.writeFile(RESUME_FLAG_FILE, JSON.stringify({
141
+ sessionId: session.sessionId,
142
+ agentType: session.agentType,
143
+ }), 'utf-8');
144
+ }
145
+ console.log(workspacePath);
146
+ }
147
+ catch (error) {
148
+ (0, logger_1.logError)('Failed to navigate to workspace');
149
+ if (error instanceof Error) {
150
+ (0, logger_1.logError)(error.message);
151
+ }
152
+ process.exit(1);
153
+ }
154
+ }
@@ -0,0 +1,124 @@
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.registerHistoryCommand = registerHistoryCommand;
7
+ const history_1 = require("../utils/history");
8
+ const logger_1 = require("../utils/logger");
9
+ const colors_1 = require("../utils/colors");
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ const command_helpers_1 = require("../utils/command-helpers");
12
+ const displayHistoryTable = (records) => {
13
+ if (records.length === 0) {
14
+ (0, logger_1.logInfo)('No operation history found');
15
+ return;
16
+ }
17
+ console.log('\n' + (0, colors_1.colorize)('═'.repeat(120), 'gray'));
18
+ console.log((0, colors_1.colorize)('Time', 'bright').padEnd(25) +
19
+ (0, colors_1.colorize)('Command', 'bright').padEnd(25) +
20
+ (0, colors_1.colorize)('Workspace', 'bright').padEnd(25) +
21
+ (0, colors_1.colorize)('Duration', 'bright').padEnd(15) +
22
+ (0, colors_1.colorize)('Status', 'bright'));
23
+ console.log((0, colors_1.colorize)('─'.repeat(120), 'gray'));
24
+ for (const record of records) {
25
+ const time = new Date(record.timestamp).toLocaleString().padEnd(15);
26
+ const command = record.command.padEnd(15);
27
+ const workspace = (record.workspace || '-').padEnd(15);
28
+ const duration = `${(record.duration / 1000).toFixed(1)}s`.padEnd(10);
29
+ const status = record.success
30
+ ? (0, colors_1.colorize)('✓ Success', 'green')
31
+ : (0, colors_1.colorize)('✗ Failed', 'red') + (record.error ? ` (${record.error})` : '');
32
+ console.log(`${time} ${command} ${workspace} ${duration} ${status}`);
33
+ }
34
+ console.log((0, colors_1.colorize)('═'.repeat(120), 'gray') + '\n');
35
+ };
36
+ const displayStats = (stats) => {
37
+ console.log((0, colors_1.colorize)('Operation Statistics', 'bright'));
38
+ console.log((0, colors_1.colorize)('─'.repeat(60), 'gray'));
39
+ console.log(`Total Operations: ${(0, colors_1.colorize)(String(stats.totalOperations), 'cyan')}`);
40
+ console.log(`Success Rate: ${(0, colors_1.colorize)(`${stats.successRate.toFixed(1)}%`, 'green')}`);
41
+ console.log(`Average Duration: ${(0, colors_1.colorize)(`${(stats.avgDuration / 1000).toFixed(1)}s`, 'yellow')}`);
42
+ console.log(`\n${(0, colors_1.colorize)('Command Usage', 'bright')}`);
43
+ const sortedCommands = Object.entries(stats.commandCounts).sort((a, b) => b[1] - a[1]);
44
+ for (const [command, count] of sortedCommands) {
45
+ console.log(` ${command.padEnd(20)} ${(0, colors_1.colorize)(String(count), 'cyan')} times`);
46
+ }
47
+ console.log('');
48
+ };
49
+ function registerHistoryCommand(parent) {
50
+ const history = parent
51
+ .command('history')
52
+ .alias('h')
53
+ .description('View operation history');
54
+ history
55
+ .command('show', { isDefault: true })
56
+ .description('Show recent operations')
57
+ .argument('[limit]', 'Number of records to show', '20')
58
+ .option('--command <cmd>', 'Filter by command')
59
+ .option('--workspace <name>', 'Filter by workspace')
60
+ .action(async (limit, opts) => {
61
+ await handleHistoryShow(parseInt(limit) || 20, opts);
62
+ });
63
+ history
64
+ .command('stats')
65
+ .description('Show detailed statistics')
66
+ .action(async () => {
67
+ (0, logger_1.logStep)('Calculating statistics...');
68
+ const stats = await (0, history_1.getOperationStats)();
69
+ displayStats(stats);
70
+ });
71
+ history
72
+ .command('clear')
73
+ .description('Clear all history')
74
+ .action(async (opts, cmd) => {
75
+ const globalOpts = (0, command_helpers_1.getGlobalOpts)(cmd);
76
+ if (globalOpts.yes) {
77
+ await (0, history_1.clearHistory)();
78
+ (0, logger_1.logSuccess)('Operation history cleared');
79
+ return;
80
+ }
81
+ const { confirm } = await inquirer_1.default.prompt([
82
+ {
83
+ type: 'confirm',
84
+ name: 'confirm',
85
+ message: 'Are you sure you want to clear operation history?',
86
+ default: false,
87
+ },
88
+ ]);
89
+ if (confirm) {
90
+ await (0, history_1.clearHistory)();
91
+ (0, logger_1.logSuccess)('Operation history cleared');
92
+ }
93
+ else {
94
+ (0, logger_1.logInfo)('Operation cancelled');
95
+ }
96
+ });
97
+ }
98
+ async function handleHistoryShow(limit, opts) {
99
+ try {
100
+ (0, logger_1.logStep)(`Fetching operation history (last ${limit} records)...`);
101
+ let records;
102
+ if (opts.command || opts.workspace) {
103
+ records = await (0, history_1.filterHistory)(opts.command, opts.workspace);
104
+ records = records.slice(0, limit);
105
+ }
106
+ else {
107
+ records = await (0, history_1.readHistory)(limit);
108
+ }
109
+ displayHistoryTable(records);
110
+ const stats = await (0, history_1.getOperationStats)();
111
+ console.log((0, colors_1.colorize)('Quick Stats:', 'bright'));
112
+ console.log(` Total Operations: ${stats.totalOperations}`);
113
+ console.log(` Success Rate: ${stats.successRate.toFixed(1)}%`);
114
+ console.log(` Average Duration: ${(stats.avgDuration / 1000).toFixed(1)}s`);
115
+ console.log('');
116
+ }
117
+ catch (error) {
118
+ (0, logger_1.logError)('Failed to retrieve history');
119
+ if (error instanceof Error) {
120
+ (0, logger_1.logError)(error.message);
121
+ }
122
+ process.exit(1);
123
+ }
124
+ }
@@ -0,0 +1,191 @@
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.registerListCommand = registerListCommand;
40
+ exports.main = main;
41
+ const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
43
+ const fsPromises = __importStar(require("fs/promises"));
44
+ const workspace_meta_1 = require("../utils/workspace-meta");
45
+ const claude_sessions_1 = require("../utils/claude-sessions");
46
+ const logger_1 = require("../utils/logger");
47
+ const colors_1 = require("../utils/colors");
48
+ const inquirer_1 = __importDefault(require("inquirer"));
49
+ const inquirer_autocomplete_prompt_1 = __importDefault(require("inquirer-autocomplete-prompt"));
50
+ const fuzzy = __importStar(require("fuzzy"));
51
+ inquirer_1.default.registerPrompt('autocomplete', inquirer_autocomplete_prompt_1.default);
52
+ const TEMP_FILE = path.join(os.homedir(), '.workspace-last-go');
53
+ const RESUME_FLAG_FILE = path.join(os.homedir(), '.workspace-resume-session');
54
+ function registerListCommand(parent) {
55
+ parent
56
+ .command('list')
57
+ .alias('l')
58
+ .description('List workspaces and navigate to one')
59
+ .option('-a, --archived', 'Show archived workspaces')
60
+ .action(async (opts) => {
61
+ await handleList(opts);
62
+ });
63
+ }
64
+ async function handleList(opts) {
65
+ const showArchived = opts.archived ?? false;
66
+ const title = showArchived ? 'Archived Workspaces' : 'Existing Workspaces';
67
+ try {
68
+ const [workspaces, sessions] = await Promise.all([
69
+ showArchived
70
+ ? (0, workspace_meta_1.listWorkspaces)(true).then(ws => ws.filter(w => w.metadata?.archivedAt))
71
+ : (0, workspace_meta_1.listWorkspaces)(false),
72
+ (0, claude_sessions_1.getWorkspaceSessions)(),
73
+ ]);
74
+ if (workspaces.length === 0) {
75
+ console.log('\n' + '='.repeat(60));
76
+ console.log((0, colors_1.colorize)(title, 'bright'));
77
+ console.log('='.repeat(60) + '\n');
78
+ if (showArchived) {
79
+ (0, logger_1.logInfo)('No archived workspaces found');
80
+ }
81
+ else {
82
+ (0, logger_1.logInfo)('No workspaces found');
83
+ console.log('\nCreate a new workspace with:');
84
+ console.log(' workspace create\n');
85
+ }
86
+ return;
87
+ }
88
+ const sessionMap = new Map(sessions.map(s => [s.workspaceName, s]));
89
+ const items = workspaces.map(ws => {
90
+ const session = sessionMap.get(ws.name);
91
+ const repoCount = ws.metadata?.repositories?.length ?? 0;
92
+ return {
93
+ name: ws.name,
94
+ wsPath: ws.path,
95
+ repoCount,
96
+ createdAt: ws.metadata?.createdAt ?? '',
97
+ lastActiveLabel: session?.lastActiveLabel ?? null,
98
+ lastActiveAt: session?.lastActiveAt.getTime() ?? 0,
99
+ hasSession: !!session,
100
+ };
101
+ });
102
+ items.sort((a, b) => {
103
+ if (a.hasSession && b.hasSession)
104
+ return b.lastActiveAt - a.lastActiveAt;
105
+ if (a.hasSession)
106
+ return -1;
107
+ if (b.hasSession)
108
+ return 1;
109
+ return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
110
+ });
111
+ console.log('');
112
+ console.log((0, colors_1.colorize)(' ' + title, 'bright') + (0, colors_1.colorize)(' (sorted by last active)', 'dim'));
113
+ console.log((0, colors_1.colorize)(' ' + '─'.repeat(54), 'dim'));
114
+ const maxNameLen = Math.max(...items.map(i => i.name.length));
115
+ for (const item of items) {
116
+ const name = item.name.padEnd(maxNameLen);
117
+ const active = item.lastActiveLabel
118
+ ? (0, colors_1.colorize)(item.lastActiveLabel, 'yellow')
119
+ : (0, colors_1.colorize)('no session', 'dim');
120
+ const repos = (0, colors_1.colorize)(`${item.repoCount} repos`, 'dim');
121
+ if (showArchived) {
122
+ const ws = workspaces.find(w => w.name === item.name);
123
+ if (ws?.metadata?.archivedAt) {
124
+ const daysSinceArchive = (Date.now() - new Date(ws.metadata.archivedAt).getTime()) / (1000 * 60 * 60 * 24);
125
+ const daysRemaining = Math.max(0, Math.ceil(30 - daysSinceArchive));
126
+ const archiveLabel = (0, colors_1.colorize)(`${daysRemaining}d left`, 'red');
127
+ console.log(` ${(0, colors_1.colorize)(name, 'cyan')} ${active} ${repos} ${archiveLabel}`);
128
+ }
129
+ }
130
+ else {
131
+ console.log(` ${(0, colors_1.colorize)(name, 'cyan')} ${active} ${repos}`);
132
+ }
133
+ }
134
+ console.log('');
135
+ if (items.length > 0 && (process.stdout.isTTY || process.env.VITEST === 'true')) {
136
+ const { selected } = await inquirer_1.default.prompt([
137
+ {
138
+ type: 'autocomplete',
139
+ name: 'selected',
140
+ message: 'Select workspace to open:',
141
+ source: async (_answersSoFar, input) => {
142
+ const searchInput = input || '';
143
+ const source = items.map(item => ({
144
+ name: `${item.name} ${item.lastActiveLabel ? (0, colors_1.colorize)(item.lastActiveLabel, 'dim') : (0, colors_1.colorize)('no session', 'dim')} ${(0, colors_1.colorize)(`${item.repoCount} repos`, 'dim')}`,
145
+ value: item.name,
146
+ }));
147
+ if (!searchInput)
148
+ return source;
149
+ const results = fuzzy.filter(searchInput, items, {
150
+ extract: (item) => item.name,
151
+ });
152
+ return results.map(result => ({
153
+ name: `${result.original.name} ${result.original.lastActiveLabel ? (0, colors_1.colorize)(result.original.lastActiveLabel, 'dim') : (0, colors_1.colorize)('no session', 'dim')} ${(0, colors_1.colorize)(`${result.original.repoCount} repos`, 'dim')}`,
154
+ value: result.original.name,
155
+ }));
156
+ },
157
+ pageSize: 15,
158
+ },
159
+ ]);
160
+ const selectedItem = items.find(i => i.name === selected);
161
+ if (selectedItem) {
162
+ await fsPromises.writeFile(TEMP_FILE, selectedItem.wsPath, 'utf-8');
163
+ if (selectedItem.hasSession) {
164
+ const session = sessionMap.get(selectedItem.name);
165
+ if (session) {
166
+ await fsPromises.writeFile(RESUME_FLAG_FILE, JSON.stringify({
167
+ sessionId: session.sessionId,
168
+ agentType: session.agentType,
169
+ }), 'utf-8');
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+ catch (error) {
176
+ (0, logger_1.logError)('Failed to list workspaces');
177
+ if (error instanceof Error) {
178
+ (0, logger_1.logError)(error.message);
179
+ }
180
+ process.exit(1);
181
+ }
182
+ }
183
+ /**
184
+ * Legacy main() for backward compatibility with tests.
185
+ * Reads process.argv to determine options.
186
+ */
187
+ async function main() {
188
+ const args = process.argv.slice(2);
189
+ const archived = args.includes('--archived') || args.includes('-a');
190
+ await handleList({ archived });
191
+ }
@@ -0,0 +1,69 @@
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.registerMcpCommands = registerMcpCommands;
37
+ function registerMcpCommands(parent) {
38
+ const mcp = parent
39
+ .command('mcp')
40
+ .description('MCP server management');
41
+ mcp
42
+ .command('install')
43
+ .description('Register MCP server with Claude Code')
44
+ .action(async () => {
45
+ const { main } = await Promise.resolve().then(() => __importStar(require('../../mcp/install')));
46
+ await main('install');
47
+ });
48
+ mcp
49
+ .command('uninstall')
50
+ .description('Unregister the MCP server')
51
+ .action(async () => {
52
+ const { main } = await Promise.resolve().then(() => __importStar(require('../../mcp/install')));
53
+ await main('uninstall');
54
+ });
55
+ mcp
56
+ .command('upgrade')
57
+ .description('Update hooks and skills (no MCP re-register)')
58
+ .action(async () => {
59
+ const { main } = await Promise.resolve().then(() => __importStar(require('../../mcp/install')));
60
+ await main('upgrade');
61
+ });
62
+ mcp
63
+ .command('status')
64
+ .description('Check MCP server registration')
65
+ .action(async () => {
66
+ const { main } = await Promise.resolve().then(() => __importStar(require('../../mcp/install')));
67
+ await main('status');
68
+ });
69
+ }