@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.
- package/CHANGELOG.md +86 -0
- package/LICENSE +21 -0
- package/README.md +275 -0
- package/assets/README.md +53 -0
- package/assets/banner.png +0 -0
- package/assets/banner.svg +66 -0
- package/assets/favicon-32.png +0 -0
- package/assets/favicon-64.png +0 -0
- package/assets/icon-256.png +0 -0
- package/assets/icon.svg +23 -0
- package/assets/logo-256.png +0 -0
- package/assets/logo-512.png +0 -0
- package/assets/logo-wordmark.svg +35 -0
- package/assets/logo.svg +32 -0
- package/bin/workspace.js +130 -0
- package/dist/cli/ai-prompt.js +421 -0
- package/dist/cli/dashboard/AgentList.js +61 -0
- package/dist/cli/dashboard/DashboardSidebar.js +280 -0
- package/dist/cli/dashboard/HelpFooter.js +73 -0
- package/dist/cli/dashboard/StatusBadge.js +50 -0
- package/dist/cli/dashboard/index.js +11 -0
- package/dist/cli/dashboard/types.js +2 -0
- package/dist/cli/tui.js +48 -0
- package/dist/commands/ai-prompt.js +22 -0
- package/dist/commands/analyze-deps.js +138 -0
- package/dist/commands/archive.js +113 -0
- package/dist/commands/branch/create.js +119 -0
- package/dist/commands/branch/index.js +104 -0
- package/dist/commands/branch/merge.js +90 -0
- package/dist/commands/branch/rebase.js +84 -0
- package/dist/commands/branch/switch.js +165 -0
- package/dist/commands/cache/index.js +80 -0
- package/dist/commands/cache/manager.js +198 -0
- package/dist/commands/cleanup.js +153 -0
- package/dist/commands/configure-claude.js +55 -0
- package/dist/commands/configure.js +231 -0
- package/dist/commands/create.js +204 -0
- package/dist/commands/dashboard/hook-handler.js +162 -0
- package/dist/commands/dashboard/index.js +258 -0
- package/dist/commands/dashboard/launcher.js +40 -0
- package/dist/commands/dashboard/session-picker.js +106 -0
- package/dist/commands/dashboard/sidebar.js +39 -0
- package/dist/commands/dashboard/workspace-picker.js +95 -0
- package/dist/commands/delete.js +194 -0
- package/dist/commands/deprecated-aliases.js +44 -0
- package/dist/commands/diff.js +129 -0
- package/dist/commands/doctor.js +141 -0
- package/dist/commands/generate-docs.js +77 -0
- package/dist/commands/ghq-status.js +72 -0
- package/dist/commands/go.js +154 -0
- package/dist/commands/history.js +124 -0
- package/dist/commands/list.js +191 -0
- package/dist/commands/mcp/index.js +69 -0
- package/dist/commands/migrate.js +296 -0
- package/dist/commands/remove-repo.js +217 -0
- package/dist/commands/report-bug.js +112 -0
- package/dist/commands/run.js +147 -0
- package/dist/commands/save-context.js +171 -0
- package/dist/commands/sessions.js +129 -0
- package/dist/commands/status.js +138 -0
- package/dist/commands/suite/create.js +212 -0
- package/dist/commands/suite/delete.js +64 -0
- package/dist/commands/suite/export.js +126 -0
- package/dist/commands/suite/import.js +128 -0
- package/dist/commands/suite/index.js +94 -0
- package/dist/commands/suite/list.js +49 -0
- package/dist/commands/suite/use.js +227 -0
- package/dist/commands/sync.js +117 -0
- package/dist/commands/update.js +203 -0
- package/dist/mcp/install.js +550 -0
- package/dist/mcp/server.js +398 -0
- package/dist/mcp/tools.js +922 -0
- package/dist/pi-extensions/permission-sync.ts.template +41 -0
- package/dist/pi-extensions/permissions-gate.ts.template +69 -0
- package/dist/pi-extensions/pr-fix-trigger.ts.template +124 -0
- package/dist/pi-extensions/review-reminder.ts.template +58 -0
- package/dist/pi-extensions/workspace-input-status.ts.template +919 -0
- package/dist/program.js +136 -0
- package/dist/scripts/workspace-table.py +394 -0
- package/dist/types/dashboard.js +11 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/agent-config.js +263 -0
- package/dist/utils/agent-state.js +178 -0
- package/dist/utils/banner.js +24 -0
- package/dist/utils/branch-operations.js +232 -0
- package/dist/utils/bug-report.js +355 -0
- package/dist/utils/cache.js +168 -0
- package/dist/utils/claude-integration.js +617 -0
- package/dist/utils/claude-sessions.js +260 -0
- package/dist/utils/cleanup-operations.js +120 -0
- package/dist/utils/colors.js +26 -0
- package/dist/utils/command-helpers.js +44 -0
- package/dist/utils/config.js +150 -0
- package/dist/utils/context-file.js +33 -0
- package/dist/utils/dashboard-hooks.js +172 -0
- package/dist/utils/dependency-analyzer.js +234 -0
- package/dist/utils/diff-operations.js +80 -0
- package/dist/utils/doc-generator.js +184 -0
- package/dist/utils/ghq-integration.js +332 -0
- package/dist/utils/git-operations.js +237 -0
- package/dist/utils/git-status.js +187 -0
- package/dist/utils/github.js +68 -0
- package/dist/utils/health-checks.js +345 -0
- package/dist/utils/history.js +150 -0
- package/dist/utils/hooks.js +100 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/permission-sync.js +681 -0
- package/dist/utils/pi-extensions.js +224 -0
- package/dist/utils/progress.js +92 -0
- package/dist/utils/prompts.js +279 -0
- package/dist/utils/repo-resolver.js +260 -0
- package/dist/utils/retry.js +65 -0
- package/dist/utils/run-operations.js +30 -0
- package/dist/utils/suite.js +159 -0
- package/dist/utils/sync-operations.js +107 -0
- package/dist/utils/tmux-dashboard.js +184 -0
- package/dist/utils/validation.js +153 -0
- package/dist/utils/version-check.js +121 -0
- package/dist/utils/workspace-meta.js +185 -0
- package/install-shell-integration.sh +532 -0
- package/install.sh +401 -0
- package/package.json +90 -0
- package/remove-shell-block.awk +44 -0
- package/scripts/postinstall.js +85 -0
- package/skills/analyze-deps.md +23 -0
- package/skills/archive-workspace.md +26 -0
- package/skills/branch-create.md +18 -0
- package/skills/create-workspace.md +39 -0
- package/skills/delete-workspace.md +37 -0
- package/skills/list-org-repos.md +26 -0
- package/skills/list-suites.md +24 -0
- package/skills/list-workspaces.md +27 -0
- package/skills/refresh-workspace-docs.md +89 -0
- package/skills/remove-repo.md +25 -0
- package/skills/run-command.md +23 -0
- package/skills/save-context.md +68 -0
- package/skills/search-repos.md +31 -0
- package/skills/snapshot-list.md +18 -0
- package/skills/snapshot-save.md +12 -0
- package/skills/switch-branch.md +18 -0
- package/skills/update-cache.md +21 -0
- package/skills/update-workspace.md +66 -0
- package/skills/workspace-cleanup.md +18 -0
- package/skills/workspace-diff.md +23 -0
- package/skills/workspace-doctor.md +23 -0
- package/skills/workspace-info.md +45 -0
- package/skills/workspace-manager/SKILL.md +201 -0
- package/skills/workspace-manager/references/ai-prompt.md +44 -0
- package/skills/workspace-manager/references/analyze-deps.md +45 -0
- package/skills/workspace-manager/references/archive-workspace.md +38 -0
- package/skills/workspace-manager/references/branch-create.md +31 -0
- package/skills/workspace-manager/references/branch-merge.md +22 -0
- package/skills/workspace-manager/references/branch-rebase.md +22 -0
- package/skills/workspace-manager/references/cache-clear.md +18 -0
- package/skills/workspace-manager/references/cache-info.md +22 -0
- package/skills/workspace-manager/references/configure-claude.md +31 -0
- package/skills/workspace-manager/references/configure.md +35 -0
- package/skills/workspace-manager/references/create-workspace.md +45 -0
- package/skills/workspace-manager/references/dashboard.md +61 -0
- package/skills/workspace-manager/references/delete-workspace.md +33 -0
- package/skills/workspace-manager/references/generate-docs.md +36 -0
- package/skills/workspace-manager/references/ghq-status.md +28 -0
- package/skills/workspace-manager/references/go.md +33 -0
- package/skills/workspace-manager/references/history.md +41 -0
- package/skills/workspace-manager/references/list-org-repos.md +26 -0
- package/skills/workspace-manager/references/list-suites.md +21 -0
- package/skills/workspace-manager/references/list-workspaces.md +27 -0
- package/skills/workspace-manager/references/mcp.md +49 -0
- package/skills/workspace-manager/references/remove-repo.md +26 -0
- package/skills/workspace-manager/references/run-command.md +44 -0
- package/skills/workspace-manager/references/search-repos.md +24 -0
- package/skills/workspace-manager/references/sessions.md +27 -0
- package/skills/workspace-manager/references/suite-create.md +22 -0
- package/skills/workspace-manager/references/suite-delete.md +21 -0
- package/skills/workspace-manager/references/suite-export.md +19 -0
- package/skills/workspace-manager/references/suite-import.md +19 -0
- package/skills/workspace-manager/references/suite-use.md +27 -0
- package/skills/workspace-manager/references/switch-branch.md +25 -0
- package/skills/workspace-manager/references/update-cache.md +22 -0
- package/skills/workspace-manager/references/update-workspace.md +50 -0
- package/skills/workspace-manager/references/workspace-cleanup.md +33 -0
- package/skills/workspace-manager/references/workspace-diff.md +27 -0
- package/skills/workspace-manager/references/workspace-doctor.md +27 -0
- package/skills/workspace-manager/references/workspace-info.md +33 -0
- package/skills/workspace-manager/references/workspace-status.md +43 -0
- package/skills/workspace-manager/references/workspace-sync.md +26 -0
- package/skills/workspace-status.md +26 -0
- package/skills/workspace-sync.md +23 -0
- package/src/cli/ai-prompt.test.ts +667 -0
- package/src/cli/ai-prompt.ts +421 -0
- package/src/cli/dashboard/AgentList.tsx +44 -0
- package/src/cli/dashboard/DashboardSidebar.tsx +291 -0
- package/src/cli/dashboard/HelpFooter.tsx +22 -0
- package/src/cli/dashboard/StatusBadge.tsx +23 -0
- package/src/cli/dashboard/index.ts +5 -0
- package/src/cli/dashboard/types.ts +16 -0
- package/src/cli/tui.tsx +51 -0
- package/src/cli/workspace-cli.test.ts +30 -0
- package/src/commands/ai-prompt.ts +21 -0
- package/src/commands/analyze-deps.ts +119 -0
- package/src/commands/archive.ts +114 -0
- package/src/commands/branch/create.ts +94 -0
- package/src/commands/branch/index.ts +74 -0
- package/src/commands/branch/merge.ts +61 -0
- package/src/commands/branch/rebase.ts +54 -0
- package/src/commands/branch/switch.ts +150 -0
- package/src/commands/cache/index.ts +51 -0
- package/src/commands/cache/manager.ts +168 -0
- package/src/commands/cleanup.ts +132 -0
- package/src/commands/configure-claude.ts +55 -0
- package/src/commands/configure.ts +204 -0
- package/src/commands/create.ts +196 -0
- package/src/commands/dashboard/hook-handler.ts +138 -0
- package/src/commands/dashboard/index.ts +248 -0
- package/src/commands/dashboard/launcher.ts +42 -0
- package/src/commands/dashboard/session-picker.ts +73 -0
- package/src/commands/dashboard/sidebar.js +39 -0
- package/src/commands/dashboard/workspace-picker.ts +62 -0
- package/src/commands/delete.test.ts +250 -0
- package/src/commands/delete.ts +171 -0
- package/src/commands/deprecated-aliases.ts +55 -0
- package/src/commands/diff.ts +106 -0
- package/src/commands/doctor.ts +110 -0
- package/src/commands/generate-docs.ts +45 -0
- package/src/commands/ghq-status.ts +70 -0
- package/src/commands/go.ts +125 -0
- package/src/commands/history.ts +136 -0
- package/src/commands/list.test.ts +219 -0
- package/src/commands/list.ts +176 -0
- package/src/commands/mcp/index.ts +39 -0
- package/src/commands/migrate.ts +277 -0
- package/src/commands/remove-repo.ts +194 -0
- package/src/commands/report-bug.ts +88 -0
- package/src/commands/run.ts +125 -0
- package/src/commands/save-context.test.ts +113 -0
- package/src/commands/save-context.ts +141 -0
- package/src/commands/sessions.ts +99 -0
- package/src/commands/status.ts +111 -0
- package/src/commands/suite/create.ts +240 -0
- package/src/commands/suite/delete.ts +65 -0
- package/src/commands/suite/export.ts +97 -0
- package/src/commands/suite/import.ts +100 -0
- package/src/commands/suite/index.ts +66 -0
- package/src/commands/suite/list.ts +54 -0
- package/src/commands/suite/use.ts +232 -0
- package/src/commands/sync.ts +97 -0
- package/src/commands/update.ts +197 -0
- package/src/mcp/install.ts +529 -0
- package/src/mcp/server.ts +579 -0
- package/src/mcp/tools.test.ts +545 -0
- package/src/mcp/tools.ts +1019 -0
- package/src/mcp/update-workspace.test.ts +220 -0
- package/src/pi-extensions/permission-sync.ts.template +41 -0
- package/src/pi-extensions/permissions-gate.ts.template +69 -0
- package/src/pi-extensions/pr-fix-trigger.ts.template +124 -0
- package/src/pi-extensions/review-reminder.ts.template +58 -0
- package/src/pi-extensions/workspace-input-status.ts.template +919 -0
- package/src/program.ts +112 -0
- package/src/scripts/workspace-table.py +394 -0
- package/src/types/dashboard.ts +29 -0
- package/src/types/index.ts +109 -0
- package/src/types/ink.d.ts +171 -0
- package/src/utils/agent-config.test.ts +303 -0
- package/src/utils/agent-config.ts +264 -0
- package/src/utils/agent-state.test.ts +166 -0
- package/src/utils/agent-state.ts +135 -0
- package/src/utils/banner.ts +24 -0
- package/src/utils/branch-operations.ts +237 -0
- package/src/utils/bug-report.test.ts +174 -0
- package/src/utils/bug-report.ts +355 -0
- package/src/utils/cache.ts +150 -0
- package/src/utils/claude-integration.test.ts +381 -0
- package/src/utils/claude-integration.ts +649 -0
- package/src/utils/claude-sessions.test.ts +262 -0
- package/src/utils/claude-sessions.ts +251 -0
- package/src/utils/cleanup-operations.ts +94 -0
- package/src/utils/colors.ts +25 -0
- package/src/utils/command-helpers.ts +46 -0
- package/src/utils/config.test.ts +203 -0
- package/src/utils/config.ts +133 -0
- package/src/utils/context-file.ts +36 -0
- package/src/utils/dashboard-hooks.test.ts +168 -0
- package/src/utils/dashboard-hooks.ts +163 -0
- package/src/utils/dependency-analyzer.ts +243 -0
- package/src/utils/diff-operations.ts +59 -0
- package/src/utils/doc-generator.ts +187 -0
- package/src/utils/ghq-integration.test.ts +195 -0
- package/src/utils/ghq-integration.ts +317 -0
- package/src/utils/git-operations.test.ts +265 -0
- package/src/utils/git-operations.ts +233 -0
- package/src/utils/git-status.ts +171 -0
- package/src/utils/github.ts +74 -0
- package/src/utils/health-checks.ts +359 -0
- package/src/utils/history.ts +140 -0
- package/src/utils/hooks.ts +92 -0
- package/src/utils/logger.ts +37 -0
- package/src/utils/permission-sync.test.ts +593 -0
- package/src/utils/permission-sync.ts +720 -0
- package/src/utils/pi-extensions.test.ts +182 -0
- package/src/utils/pi-extensions.ts +226 -0
- package/src/utils/progress.ts +73 -0
- package/src/utils/prompts.test.ts +169 -0
- package/src/utils/prompts.ts +296 -0
- package/src/utils/repo-resolver.test.ts +313 -0
- package/src/utils/repo-resolver.ts +294 -0
- package/src/utils/retry.test.ts +124 -0
- package/src/utils/retry.ts +85 -0
- package/src/utils/run-operations.ts +38 -0
- package/src/utils/suite.test.ts +256 -0
- package/src/utils/suite.ts +144 -0
- package/src/utils/sync-operations.ts +87 -0
- package/src/utils/tmux-dashboard.ts +193 -0
- package/src/utils/validation.test.ts +139 -0
- package/src/utils/validation.ts +128 -0
- package/src/utils/version-check.test.ts +108 -0
- package/src/utils/version-check.ts +96 -0
- package/src/utils/workspace-meta.ts +173 -0
- package/sync-permissions.sh +137 -0
- package/tsconfig.json +20 -0
- package/uninstall.sh +162 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.main = main;
|
|
8
|
+
const github_1 = require("../../utils/github");
|
|
9
|
+
const prompts_1 = require("../../utils/prompts");
|
|
10
|
+
const workspace_meta_1 = require("../../utils/workspace-meta");
|
|
11
|
+
const logger_1 = require("../../utils/logger");
|
|
12
|
+
const colors_1 = require("../../utils/colors");
|
|
13
|
+
const suite_1 = require("../../utils/suite");
|
|
14
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
15
|
+
async function promptSuiteDetails(defaultName) {
|
|
16
|
+
const { name, description } = await inquirer_1.default.prompt([
|
|
17
|
+
{
|
|
18
|
+
type: 'input',
|
|
19
|
+
name: 'name',
|
|
20
|
+
message: 'Suite name:',
|
|
21
|
+
default: defaultName,
|
|
22
|
+
validate: (input) => (0, suite_1.validateSuiteName)(input.trim()),
|
|
23
|
+
filter: (input) => input.trim(),
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: 'input',
|
|
27
|
+
name: 'description',
|
|
28
|
+
message: 'Suite description (optional):',
|
|
29
|
+
},
|
|
30
|
+
]);
|
|
31
|
+
return { name, description: description || '' };
|
|
32
|
+
}
|
|
33
|
+
async function promptPostCloneHooks() {
|
|
34
|
+
const { addHooks } = await inquirer_1.default.prompt([
|
|
35
|
+
{
|
|
36
|
+
type: 'confirm',
|
|
37
|
+
name: 'addHooks',
|
|
38
|
+
message: 'Add post-clone hooks?',
|
|
39
|
+
default: false,
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
if (!addHooks)
|
|
43
|
+
return undefined;
|
|
44
|
+
const commands = [];
|
|
45
|
+
console.log('Enter commands one at a time. Type "done" when finished.\n');
|
|
46
|
+
while (true) {
|
|
47
|
+
const { command } = await inquirer_1.default.prompt([
|
|
48
|
+
{
|
|
49
|
+
type: 'input',
|
|
50
|
+
name: 'command',
|
|
51
|
+
message: `Command ${commands.length + 1} (or "done"):`,
|
|
52
|
+
},
|
|
53
|
+
]);
|
|
54
|
+
if (command.trim().toLowerCase() === 'done')
|
|
55
|
+
break;
|
|
56
|
+
if (command.trim()) {
|
|
57
|
+
commands.push(command.trim());
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (commands.length === 0)
|
|
61
|
+
return undefined;
|
|
62
|
+
return [{
|
|
63
|
+
commands,
|
|
64
|
+
continueOnError: true,
|
|
65
|
+
}];
|
|
66
|
+
}
|
|
67
|
+
async function checkOverwrite(name) {
|
|
68
|
+
const existing = await (0, suite_1.getSuite)(name);
|
|
69
|
+
if (!existing)
|
|
70
|
+
return true;
|
|
71
|
+
const { overwrite } = await inquirer_1.default.prompt([
|
|
72
|
+
{
|
|
73
|
+
type: 'confirm',
|
|
74
|
+
name: 'overwrite',
|
|
75
|
+
message: `Suite "${name}" already exists (${existing.entries.length} repos). Overwrite?`,
|
|
76
|
+
default: false,
|
|
77
|
+
},
|
|
78
|
+
]);
|
|
79
|
+
return overwrite;
|
|
80
|
+
}
|
|
81
|
+
async function createInteractive() {
|
|
82
|
+
// Step 1: Verify gh CLI authentication
|
|
83
|
+
(0, logger_1.logStep)(1, 4, 'Verifying GitHub CLI authentication...');
|
|
84
|
+
const isAuthenticated = await (0, github_1.verifyGhAuth)();
|
|
85
|
+
if (!isAuthenticated) {
|
|
86
|
+
(0, logger_1.logError)('GitHub CLI is not authenticated');
|
|
87
|
+
(0, github_1.displayAuthInstructions)();
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
(0, logger_1.logSuccess)('GitHub CLI authenticated');
|
|
91
|
+
// Step 2: Fetch repos
|
|
92
|
+
(0, logger_1.logStep)(2, 4, 'Fetching repositories...');
|
|
93
|
+
const forceRefresh = process.argv.includes('--force-refresh') || process.argv.includes('-f');
|
|
94
|
+
const repos = await (0, github_1.fetchOrgRepos)({ forceRefresh });
|
|
95
|
+
if (repos.length === 0) {
|
|
96
|
+
(0, logger_1.logError)('No repositories found');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
// Step 3: Select repositories
|
|
100
|
+
(0, logger_1.logStep)(3, 4, 'Select repositories for the suite...');
|
|
101
|
+
const selections = await (0, prompts_1.promptRepositorySelection)(repos);
|
|
102
|
+
const entries = selections.map(s => ({
|
|
103
|
+
repoName: s.repo.name,
|
|
104
|
+
directoryName: s.directoryName,
|
|
105
|
+
}));
|
|
106
|
+
// Step 4: Name and save
|
|
107
|
+
(0, logger_1.logStep)(4, 5, 'Enter suite details...');
|
|
108
|
+
const { name, description } = await promptSuiteDetails();
|
|
109
|
+
if (!(await checkOverwrite(name))) {
|
|
110
|
+
(0, logger_1.logInfo)('Suite creation cancelled');
|
|
111
|
+
process.exit(0);
|
|
112
|
+
}
|
|
113
|
+
// Step 5: Optional hooks
|
|
114
|
+
(0, logger_1.logStep)(5, 5, 'Post-clone hooks (optional)...');
|
|
115
|
+
const postCloneHooks = await promptPostCloneHooks();
|
|
116
|
+
const existing = await (0, suite_1.getSuite)(name);
|
|
117
|
+
const now = new Date().toISOString();
|
|
118
|
+
const suite = {
|
|
119
|
+
name,
|
|
120
|
+
description,
|
|
121
|
+
entries,
|
|
122
|
+
createdAt: existing?.createdAt || now,
|
|
123
|
+
updatedAt: now,
|
|
124
|
+
...(postCloneHooks && { postCloneHooks }),
|
|
125
|
+
};
|
|
126
|
+
await (0, suite_1.saveSuite)(suite);
|
|
127
|
+
(0, logger_1.logSuccess)(`Suite "${(0, colors_1.colorize)(name, 'cyan')}" created with ${entries.length} repositories`);
|
|
128
|
+
}
|
|
129
|
+
async function createFromWorkspace() {
|
|
130
|
+
// Step 1: Select workspace
|
|
131
|
+
(0, logger_1.logStep)(1, 3, 'Select a workspace...');
|
|
132
|
+
const workspaces = await (0, workspace_meta_1.listWorkspaces)();
|
|
133
|
+
if (workspaces.length === 0) {
|
|
134
|
+
(0, logger_1.logError)('No workspaces found. Create one first with: workspace create');
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
const workspaceName = await (0, prompts_1.promptWorkspaceSelection)(workspaces);
|
|
138
|
+
const workspace = workspaces.find(ws => ws.name === workspaceName);
|
|
139
|
+
if (!workspace?.metadata) {
|
|
140
|
+
(0, logger_1.logError)('No metadata found for this workspace');
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
const entries = workspace.metadata.repositories
|
|
144
|
+
.filter(r => r.status === 'success')
|
|
145
|
+
.map(r => ({
|
|
146
|
+
repoName: r.name,
|
|
147
|
+
directoryName: r.directoryName,
|
|
148
|
+
}));
|
|
149
|
+
console.log(`\n${(0, colors_1.colorize)('Repositories from workspace:', 'cyan')} ${entries.length}`);
|
|
150
|
+
for (const e of entries) {
|
|
151
|
+
const alias = e.directoryName !== e.repoName ? ` (${e.repoName})` : '';
|
|
152
|
+
console.log(` - ${e.directoryName}${alias}`);
|
|
153
|
+
}
|
|
154
|
+
console.log('');
|
|
155
|
+
// Step 2: Name and save
|
|
156
|
+
(0, logger_1.logStep)(2, 4, 'Enter suite details...');
|
|
157
|
+
const { name, description } = await promptSuiteDetails(workspaceName);
|
|
158
|
+
if (!(await checkOverwrite(name))) {
|
|
159
|
+
(0, logger_1.logInfo)('Suite creation cancelled');
|
|
160
|
+
process.exit(0);
|
|
161
|
+
}
|
|
162
|
+
// Step 3: Optional hooks
|
|
163
|
+
(0, logger_1.logStep)(3, 4, 'Post-clone hooks (optional)...');
|
|
164
|
+
const postCloneHooks = await promptPostCloneHooks();
|
|
165
|
+
const existing = await (0, suite_1.getSuite)(name);
|
|
166
|
+
const now = new Date().toISOString();
|
|
167
|
+
const suite = {
|
|
168
|
+
name,
|
|
169
|
+
description,
|
|
170
|
+
entries,
|
|
171
|
+
createdAt: existing?.createdAt || now,
|
|
172
|
+
updatedAt: now,
|
|
173
|
+
...(postCloneHooks && { postCloneHooks }),
|
|
174
|
+
};
|
|
175
|
+
// Step 4: Save
|
|
176
|
+
(0, logger_1.logStep)(4, 4, 'Saving suite...');
|
|
177
|
+
await (0, suite_1.saveSuite)(suite);
|
|
178
|
+
(0, logger_1.logSuccess)(`Suite "${(0, colors_1.colorize)(name, 'cyan')}" created with ${entries.length} repositories`);
|
|
179
|
+
}
|
|
180
|
+
async function main() {
|
|
181
|
+
console.log('\n' + '='.repeat(60));
|
|
182
|
+
console.log((0, colors_1.colorize)('Create Suite', 'bright'));
|
|
183
|
+
console.log('='.repeat(60) + '\n');
|
|
184
|
+
try {
|
|
185
|
+
const { mode } = await inquirer_1.default.prompt([
|
|
186
|
+
{
|
|
187
|
+
type: 'list',
|
|
188
|
+
name: 'mode',
|
|
189
|
+
message: 'How would you like to create the suite?',
|
|
190
|
+
choices: [
|
|
191
|
+
{ name: 'Pick repositories interactively', value: 'interactive' },
|
|
192
|
+
{ name: 'Save from an existing workspace', value: 'workspace' },
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
]);
|
|
196
|
+
if (mode === 'interactive') {
|
|
197
|
+
await createInteractive();
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
await createFromWorkspace();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
(0, logger_1.logError)('Failed to create suite');
|
|
205
|
+
if (error instanceof Error) {
|
|
206
|
+
(0, logger_1.logError)(error.message);
|
|
207
|
+
}
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (require.main === module)
|
|
212
|
+
main();
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.main = main;
|
|
8
|
+
const suite_1 = require("../../utils/suite");
|
|
9
|
+
const logger_1 = require("../../utils/logger");
|
|
10
|
+
const colors_1 = require("../../utils/colors");
|
|
11
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
12
|
+
async function main() {
|
|
13
|
+
console.log('\n' + '='.repeat(60));
|
|
14
|
+
console.log((0, colors_1.colorize)('Delete Suite', 'bright'));
|
|
15
|
+
console.log('='.repeat(60) + '\n');
|
|
16
|
+
try {
|
|
17
|
+
const suites = await (0, suite_1.listSuites)();
|
|
18
|
+
if (suites.length === 0) {
|
|
19
|
+
(0, logger_1.logInfo)('No suites found');
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
const { suiteName } = await inquirer_1.default.prompt([
|
|
23
|
+
{
|
|
24
|
+
type: 'list',
|
|
25
|
+
name: 'suiteName',
|
|
26
|
+
message: 'Select a suite to delete:',
|
|
27
|
+
choices: suites.map(s => ({
|
|
28
|
+
name: `${s.name} (${s.entries.length} repos)${s.description ? ` - ${s.description}` : ''}`,
|
|
29
|
+
value: s.name,
|
|
30
|
+
short: s.name,
|
|
31
|
+
})),
|
|
32
|
+
pageSize: 15,
|
|
33
|
+
},
|
|
34
|
+
]);
|
|
35
|
+
const { confirmed } = await inquirer_1.default.prompt([
|
|
36
|
+
{
|
|
37
|
+
type: 'confirm',
|
|
38
|
+
name: 'confirmed',
|
|
39
|
+
message: `Are you sure you want to delete suite "${suiteName}"?`,
|
|
40
|
+
default: false,
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
if (!confirmed) {
|
|
44
|
+
(0, logger_1.logInfo)('Deletion cancelled');
|
|
45
|
+
process.exit(0);
|
|
46
|
+
}
|
|
47
|
+
const deleted = await (0, suite_1.deleteSuite)(suiteName);
|
|
48
|
+
if (deleted) {
|
|
49
|
+
(0, logger_1.logSuccess)(`Suite "${(0, colors_1.colorize)(suiteName, 'cyan')}" deleted`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
(0, logger_1.logError)(`Suite "${suiteName}" not found`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
(0, logger_1.logError)('Failed to delete suite');
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
(0, logger_1.logError)(error.message);
|
|
59
|
+
}
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (require.main === module)
|
|
64
|
+
main();
|
|
@@ -0,0 +1,126 @@
|
|
|
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 fs = __importStar(require("fs/promises"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const suite_1 = require("../../utils/suite");
|
|
44
|
+
const logger_1 = require("../../utils/logger");
|
|
45
|
+
const colors_1 = require("../../utils/colors");
|
|
46
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
47
|
+
async function main(opts) {
|
|
48
|
+
console.log('\n' + '='.repeat(60));
|
|
49
|
+
console.log((0, colors_1.colorize)('Export Suite', 'bright'));
|
|
50
|
+
console.log('='.repeat(60) + '\n');
|
|
51
|
+
try {
|
|
52
|
+
const suites = await (0, suite_1.listSuites)();
|
|
53
|
+
if (suites.length === 0) {
|
|
54
|
+
(0, logger_1.logInfo)('No suites found');
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
const { mode } = await inquirer_1.default.prompt([
|
|
58
|
+
{
|
|
59
|
+
type: 'list',
|
|
60
|
+
name: 'mode',
|
|
61
|
+
message: 'What would you like to export?',
|
|
62
|
+
choices: [
|
|
63
|
+
{ name: 'A single suite', value: 'single' },
|
|
64
|
+
{ name: 'All suites', value: 'all' },
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
]);
|
|
68
|
+
let data;
|
|
69
|
+
let defaultFilename;
|
|
70
|
+
if (mode === 'single') {
|
|
71
|
+
const { suiteName } = await inquirer_1.default.prompt([
|
|
72
|
+
{
|
|
73
|
+
type: 'list',
|
|
74
|
+
name: 'suiteName',
|
|
75
|
+
message: 'Select a suite to export:',
|
|
76
|
+
choices: suites.map(s => ({
|
|
77
|
+
name: `${s.name} (${s.entries.length} repos)${s.description ? ` - ${s.description}` : ''}`,
|
|
78
|
+
value: s.name,
|
|
79
|
+
short: s.name,
|
|
80
|
+
})),
|
|
81
|
+
pageSize: 15,
|
|
82
|
+
},
|
|
83
|
+
]);
|
|
84
|
+
data = await (0, suite_1.exportSuite)(suiteName);
|
|
85
|
+
if (!data) {
|
|
86
|
+
(0, logger_1.logError)(`Suite "${suiteName}" not found`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
defaultFilename = `${suiteName}-suite.json`;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
data = await (0, suite_1.exportAllSuites)();
|
|
93
|
+
defaultFilename = 'all-suites.json';
|
|
94
|
+
}
|
|
95
|
+
const outputArg = opts?.file;
|
|
96
|
+
let outputPath;
|
|
97
|
+
if (outputArg && !outputArg.startsWith('-')) {
|
|
98
|
+
outputPath = path.resolve(outputArg);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const { filePath } = await inquirer_1.default.prompt([
|
|
102
|
+
{
|
|
103
|
+
type: 'input',
|
|
104
|
+
name: 'filePath',
|
|
105
|
+
message: 'Output file path:',
|
|
106
|
+
default: `./${defaultFilename}`,
|
|
107
|
+
},
|
|
108
|
+
]);
|
|
109
|
+
outputPath = path.resolve(filePath);
|
|
110
|
+
}
|
|
111
|
+
await fs.writeFile(outputPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
112
|
+
(0, logger_1.logSuccess)(`Exported to ${(0, colors_1.colorize)(outputPath, 'cyan')}`);
|
|
113
|
+
const suiteCount = data.suites.length;
|
|
114
|
+
const totalRepos = data.suites.reduce((sum, s) => sum + s.entries.length, 0);
|
|
115
|
+
console.log(` ${suiteCount} suite(s), ${totalRepos} total repositories\n`);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
(0, logger_1.logError)('Failed to export suite');
|
|
119
|
+
if (error instanceof Error) {
|
|
120
|
+
(0, logger_1.logError)(error.message);
|
|
121
|
+
}
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (require.main === module)
|
|
126
|
+
main();
|
|
@@ -0,0 +1,128 @@
|
|
|
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 fs = __importStar(require("fs/promises"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const suite_1 = require("../../utils/suite");
|
|
44
|
+
const logger_1 = require("../../utils/logger");
|
|
45
|
+
const colors_1 = require("../../utils/colors");
|
|
46
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
47
|
+
async function main(opts) {
|
|
48
|
+
console.log('\n' + '='.repeat(60));
|
|
49
|
+
console.log((0, colors_1.colorize)('Import Suite', 'bright'));
|
|
50
|
+
console.log('='.repeat(60) + '\n');
|
|
51
|
+
try {
|
|
52
|
+
const fileArg = opts?.file;
|
|
53
|
+
let filePath;
|
|
54
|
+
if (fileArg && !fileArg.startsWith('-')) {
|
|
55
|
+
filePath = path.resolve(fileArg);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const { inputPath } = await inquirer_1.default.prompt([
|
|
59
|
+
{
|
|
60
|
+
type: 'input',
|
|
61
|
+
name: 'inputPath',
|
|
62
|
+
message: 'Path to suite JSON file:',
|
|
63
|
+
validate: (input) => input.trim().length > 0 || 'File path is required',
|
|
64
|
+
},
|
|
65
|
+
]);
|
|
66
|
+
filePath = path.resolve(inputPath);
|
|
67
|
+
}
|
|
68
|
+
let content;
|
|
69
|
+
try {
|
|
70
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
(0, logger_1.logError)(`Could not read file: ${filePath}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
let data;
|
|
77
|
+
try {
|
|
78
|
+
data = JSON.parse(content);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
(0, logger_1.logError)('Invalid JSON file');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
if (!data.suites || !Array.isArray(data.suites)) {
|
|
85
|
+
(0, logger_1.logError)('Invalid suite file format: missing "suites" array');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
console.log(`Found ${(0, colors_1.colorize)(String(data.suites.length), 'yellow')} suite(s):\n`);
|
|
89
|
+
for (const suite of data.suites) {
|
|
90
|
+
console.log(` ${(0, colors_1.colorize)(suite.name, 'cyan')} (${suite.entries?.length ?? 0} repos)`);
|
|
91
|
+
if (suite.description) {
|
|
92
|
+
console.log(` ${suite.description}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
console.log('');
|
|
96
|
+
const { overwrite } = await inquirer_1.default.prompt([
|
|
97
|
+
{
|
|
98
|
+
type: 'confirm',
|
|
99
|
+
name: 'overwrite',
|
|
100
|
+
message: 'Overwrite existing suites with the same name?',
|
|
101
|
+
default: false,
|
|
102
|
+
},
|
|
103
|
+
]);
|
|
104
|
+
const result = await (0, suite_1.importSuites)(data, overwrite);
|
|
105
|
+
if (result.imported.length > 0) {
|
|
106
|
+
(0, logger_1.logSuccess)(`Imported: ${result.imported.join(', ')}`);
|
|
107
|
+
}
|
|
108
|
+
if (result.skipped.length > 0) {
|
|
109
|
+
(0, logger_1.logInfo)(`Skipped (already exist): ${result.skipped.join(', ')}`);
|
|
110
|
+
}
|
|
111
|
+
if (result.errors.length > 0) {
|
|
112
|
+
(0, logger_1.logWarning)('Errors:');
|
|
113
|
+
for (const err of result.errors) {
|
|
114
|
+
(0, logger_1.logError)(` ${err}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
console.log('');
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
(0, logger_1.logError)('Failed to import suite');
|
|
121
|
+
if (error instanceof Error) {
|
|
122
|
+
(0, logger_1.logError)(error.message);
|
|
123
|
+
}
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (require.main === module)
|
|
128
|
+
main();
|
|
@@ -0,0 +1,94 @@
|
|
|
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.registerSuiteCommands = registerSuiteCommands;
|
|
37
|
+
const command_helpers_1 = require("../../utils/command-helpers");
|
|
38
|
+
function registerSuiteCommands(parent) {
|
|
39
|
+
const suite = parent
|
|
40
|
+
.command('suite')
|
|
41
|
+
.description('Suite management');
|
|
42
|
+
suite
|
|
43
|
+
.command('create')
|
|
44
|
+
.description('Create a new suite (pick repos or save from workspace)')
|
|
45
|
+
.action(async () => {
|
|
46
|
+
const { main } = await Promise.resolve().then(() => __importStar(require('./create')));
|
|
47
|
+
await main();
|
|
48
|
+
});
|
|
49
|
+
suite
|
|
50
|
+
.command('list')
|
|
51
|
+
.description('List all saved suites')
|
|
52
|
+
.action(async () => {
|
|
53
|
+
const { main } = await Promise.resolve().then(() => __importStar(require('./list')));
|
|
54
|
+
await main();
|
|
55
|
+
});
|
|
56
|
+
suite
|
|
57
|
+
.command('delete')
|
|
58
|
+
.description('Delete a suite')
|
|
59
|
+
.action(async () => {
|
|
60
|
+
const { main } = await Promise.resolve().then(() => __importStar(require('./delete')));
|
|
61
|
+
await main();
|
|
62
|
+
});
|
|
63
|
+
suite
|
|
64
|
+
.command('export')
|
|
65
|
+
.description('Export suite(s) to JSON file for sharing')
|
|
66
|
+
.argument('[file]', 'Output file path')
|
|
67
|
+
.action(async (file) => {
|
|
68
|
+
const { main } = await Promise.resolve().then(() => __importStar(require('./export')));
|
|
69
|
+
await main({ file });
|
|
70
|
+
});
|
|
71
|
+
suite
|
|
72
|
+
.command('import')
|
|
73
|
+
.description('Import suite(s) from JSON file')
|
|
74
|
+
.argument('[file]', 'Input file path')
|
|
75
|
+
.action(async (file) => {
|
|
76
|
+
const { main } = await Promise.resolve().then(() => __importStar(require('./import')));
|
|
77
|
+
await main({ file });
|
|
78
|
+
});
|
|
79
|
+
suite
|
|
80
|
+
.command('use')
|
|
81
|
+
.description('Create workspace from a suite')
|
|
82
|
+
.option('-s, --suite <name>', 'Suite name')
|
|
83
|
+
.option('-w, --workspace <name>', 'Workspace name')
|
|
84
|
+
.action(async (opts, cmd) => {
|
|
85
|
+
const globalOpts = (0, command_helpers_1.getGlobalOpts)(cmd);
|
|
86
|
+
const { main } = await Promise.resolve().then(() => __importStar(require('./use')));
|
|
87
|
+
await main({
|
|
88
|
+
suite: opts.suite,
|
|
89
|
+
workspace: opts.workspace,
|
|
90
|
+
yes: globalOpts.yes,
|
|
91
|
+
forceRefresh: globalOpts.forceRefresh,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.main = main;
|
|
5
|
+
const suite_1 = require("../../utils/suite");
|
|
6
|
+
const logger_1 = require("../../utils/logger");
|
|
7
|
+
const colors_1 = require("../../utils/colors");
|
|
8
|
+
async function main() {
|
|
9
|
+
console.log('\n' + '='.repeat(60));
|
|
10
|
+
console.log((0, colors_1.colorize)('Saved Suites', 'bright'));
|
|
11
|
+
console.log('='.repeat(60) + '\n');
|
|
12
|
+
try {
|
|
13
|
+
const suites = await (0, suite_1.listSuites)();
|
|
14
|
+
if (suites.length === 0) {
|
|
15
|
+
(0, logger_1.logInfo)('No suites found');
|
|
16
|
+
console.log('\nCreate a new suite with:');
|
|
17
|
+
console.log(' workspace suite-create\n');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const suite of suites) {
|
|
21
|
+
console.log((0, colors_1.colorize)(suite.name, 'cyan'));
|
|
22
|
+
if (suite.description) {
|
|
23
|
+
console.log(` ${suite.description}`);
|
|
24
|
+
}
|
|
25
|
+
console.log(` Repositories: ${(0, colors_1.colorize)(String(suite.entries.length), 'yellow')}`);
|
|
26
|
+
for (const entry of suite.entries) {
|
|
27
|
+
const alias = entry.directoryName !== entry.repoName ? ` (${entry.repoName})` : '';
|
|
28
|
+
console.log(` - ${entry.directoryName}${alias}`);
|
|
29
|
+
}
|
|
30
|
+
const createdDate = new Date(suite.createdAt).toLocaleString();
|
|
31
|
+
const updatedDate = new Date(suite.updatedAt).toLocaleString();
|
|
32
|
+
console.log(` Created: ${createdDate}`);
|
|
33
|
+
if (suite.updatedAt !== suite.createdAt) {
|
|
34
|
+
console.log(` Updated: ${updatedDate}`);
|
|
35
|
+
}
|
|
36
|
+
console.log('');
|
|
37
|
+
}
|
|
38
|
+
console.log('='.repeat(60) + '\n');
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
(0, logger_1.logError)('Failed to list suites');
|
|
42
|
+
if (error instanceof Error) {
|
|
43
|
+
(0, logger_1.logError)(error.message);
|
|
44
|
+
}
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (require.main === module)
|
|
49
|
+
main();
|