myaidev-method 0.2.23 → 0.2.24-2
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/.claude-plugin/plugin.json +251 -0
- package/PLUGIN_ARCHITECTURE.md +276 -0
- package/README.md +204 -0
- package/USER_GUIDE.md +436 -9
- package/bin/cli.js +370 -38
- package/dist/server/.tsbuildinfo +1 -1
- package/extension.json +174 -0
- package/hooks/hooks.json +221 -0
- package/marketplace.json +179 -0
- package/package.json +24 -7
- package/skills/content-verifier/SKILL.md +178 -0
- package/skills/content-writer/SKILL.md +151 -0
- package/skills/coolify-deployer/SKILL.md +207 -0
- package/skills/openstack-manager/SKILL.md +213 -0
- package/skills/security-auditor/SKILL.md +180 -0
- package/skills/security-tester/SKILL.md +171 -0
- package/skills/sparc-architect/SKILL.md +146 -0
- package/skills/sparc-coder/SKILL.md +136 -0
- package/skills/sparc-documenter/SKILL.md +195 -0
- package/skills/sparc-reviewer/SKILL.md +179 -0
- package/skills/sparc-tester/SKILL.md +156 -0
- package/skills/visual-generator/SKILL.md +147 -0
- package/skills/wordpress-publisher/SKILL.md +150 -0
- package/src/config/workflows.js +28 -44
- package/src/lib/ascii-banner.js +214 -0
- package/src/lib/config-manager.js +470 -0
- package/src/lib/content-coordinator.js +2562 -0
- package/src/lib/content-generator.js +427 -0
- package/src/lib/html-conversion-utils.js +843 -0
- package/src/lib/installation-detector.js +266 -0
- package/src/lib/seo-optimizer.js +515 -0
- package/src/lib/visual-config-utils.js +1 -1
- package/src/lib/visual-generation-utils.js +34 -14
- package/src/lib/wordpress-client.js +633 -0
- package/src/lib/workflow-installer.js +3 -3
- package/src/scripts/generate-visual-cli.js +39 -10
- package/src/scripts/html-conversion-cli.js +526 -0
- package/src/scripts/init/configure.js +436 -0
- package/src/scripts/init/install.js +460 -0
- package/src/scripts/ping.js +0 -1
- package/src/scripts/utils/file-utils.js +404 -0
- package/src/scripts/utils/logger.js +300 -0
- package/src/scripts/utils/write-content.js +293 -0
- package/src/templates/claude/agents/content-production-coordinator.md +689 -15
- package/src/templates/claude/agents/visual-content-generator.md +129 -4
- package/src/templates/claude/commands/myai-content-enrichment.md +227 -0
- package/src/templates/claude/commands/myai-content-writer.md +48 -37
- package/src/templates/claude/commands/myai-convert-html.md +186 -0
- package/src/templates/claude/commands/myai-coordinate-content.md +347 -11
- package/src/templates/diagrams/architecture.d2 +52 -0
- package/src/templates/diagrams/flowchart.d2 +42 -0
- package/src/templates/diagrams/sequence.d2 +47 -0
- package/src/templates/docs/content-creation-guide.md +164 -0
- package/src/templates/docs/deployment-guide.md +336 -0
- package/src/templates/docs/visual-generation-guide.md +248 -0
- package/src/templates/docs/wordpress-publishing-guide.md +208 -0
- package/src/templates/infographics/comparison-table.html +347 -0
- package/src/templates/infographics/data-chart.html +268 -0
- package/src/templates/infographics/process-flow.html +365 -0
- /package/src/scripts/{wordpress-health-check.js → wordpress/wordpress-health-check.js} +0 -0
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Install Script
|
|
5
|
+
* Workflow installation orchestrator for MyAIDev Method
|
|
6
|
+
* Handles installation of workflows, agents, commands, and dependencies
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import WorkflowInstaller from '../../lib/workflow-installer.js';
|
|
10
|
+
import { ConfigManager } from '../../lib/config-manager.js';
|
|
11
|
+
import { logger, ProgressTracker, createSpinner } from '../utils/logger.js';
|
|
12
|
+
import { ensureDir } from '../utils/file-utils.js';
|
|
13
|
+
import inquirer from 'inquirer';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import fs from 'fs-extra';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Installation Orchestrator Class
|
|
19
|
+
*/
|
|
20
|
+
class InstallationOrchestrator {
|
|
21
|
+
constructor(targetDir = process.cwd()) {
|
|
22
|
+
this.targetDir = targetDir;
|
|
23
|
+
this.configManager = new ConfigManager(targetDir);
|
|
24
|
+
this.installer = new WorkflowInstaller();
|
|
25
|
+
this.installedWorkflows = [];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Run the installation
|
|
30
|
+
* @param {Object} options - Installation options
|
|
31
|
+
*/
|
|
32
|
+
async run(options = {}) {
|
|
33
|
+
const {
|
|
34
|
+
workflows = [],
|
|
35
|
+
cliType = 'claude',
|
|
36
|
+
interactive = false,
|
|
37
|
+
force = false,
|
|
38
|
+
verbose = false
|
|
39
|
+
} = options;
|
|
40
|
+
|
|
41
|
+
logger.header('MyAIDev Method Installation');
|
|
42
|
+
logger.info(`Target directory: ${this.targetDir}`);
|
|
43
|
+
logger.info(`CLI type: ${cliType}`);
|
|
44
|
+
logger.blank();
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
// Interactive mode - show workflow selection
|
|
48
|
+
if (interactive) {
|
|
49
|
+
const selectedWorkflows = await this.selectWorkflows();
|
|
50
|
+
if (selectedWorkflows.length === 0) {
|
|
51
|
+
logger.info('No workflows selected. Exiting.');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
workflows.push(...selectedWorkflows);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// If no workflows specified, install core
|
|
58
|
+
if (workflows.length === 0) {
|
|
59
|
+
workflows.push('core');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Install each workflow
|
|
63
|
+
const progress = new ProgressTracker(workflows.length, 'Installation');
|
|
64
|
+
progress.start();
|
|
65
|
+
|
|
66
|
+
for (const workflow of workflows) {
|
|
67
|
+
try {
|
|
68
|
+
await this.installWorkflow(workflow, cliType, { force, verbose });
|
|
69
|
+
progress.increment(workflow);
|
|
70
|
+
this.installedWorkflows.push(workflow);
|
|
71
|
+
} catch (error) {
|
|
72
|
+
progress.fail(workflow, error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
progress.complete();
|
|
77
|
+
|
|
78
|
+
// Show summary
|
|
79
|
+
await this.showSummary();
|
|
80
|
+
|
|
81
|
+
// Offer to configure
|
|
82
|
+
if (interactive && this.needsConfiguration()) {
|
|
83
|
+
await this.offerConfiguration();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
} catch (error) {
|
|
87
|
+
logger.error(`Installation failed: ${error.message}`);
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Show workflow selection prompt
|
|
94
|
+
* @returns {Promise<string[]>} Selected workflows
|
|
95
|
+
*/
|
|
96
|
+
async selectWorkflows() {
|
|
97
|
+
const available = this.installer.getAvailableWorkflows();
|
|
98
|
+
|
|
99
|
+
const { workflows } = await inquirer.prompt([
|
|
100
|
+
{
|
|
101
|
+
type: 'checkbox',
|
|
102
|
+
name: 'workflows',
|
|
103
|
+
message: 'Select workflows to install:',
|
|
104
|
+
choices: available.map(w => ({
|
|
105
|
+
name: `${w.name} - ${w.description}`,
|
|
106
|
+
value: w.id,
|
|
107
|
+
checked: w.id === 'core'
|
|
108
|
+
})),
|
|
109
|
+
validate: (answer) => {
|
|
110
|
+
if (answer.length === 0) {
|
|
111
|
+
return 'Please select at least one workflow';
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
]);
|
|
117
|
+
|
|
118
|
+
return workflows;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Install a single workflow
|
|
123
|
+
* @param {string} workflow - Workflow ID
|
|
124
|
+
* @param {string} cliType - CLI type
|
|
125
|
+
* @param {Object} options - Installation options
|
|
126
|
+
*/
|
|
127
|
+
async installWorkflow(workflow, cliType, options = {}) {
|
|
128
|
+
const { verbose = false } = options;
|
|
129
|
+
|
|
130
|
+
if (verbose) {
|
|
131
|
+
logger.info(`Installing workflow: ${workflow}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const spinner = createSpinner(`Installing ${workflow}...`);
|
|
135
|
+
spinner.start();
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
const result = await this.installer.install(workflow, this.targetDir, cliType);
|
|
139
|
+
|
|
140
|
+
if (result.success) {
|
|
141
|
+
spinner.succeed(`${workflow} installed`);
|
|
142
|
+
|
|
143
|
+
if (verbose && result.installed) {
|
|
144
|
+
if (result.installed.agents?.length > 0) {
|
|
145
|
+
logger.info(` Agents: ${result.installed.agents.join(', ')}`);
|
|
146
|
+
}
|
|
147
|
+
if (result.installed.commands?.length > 0) {
|
|
148
|
+
logger.info(` Commands: ${result.installed.commands.join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
spinner.fail(`${workflow} failed`);
|
|
153
|
+
if (result.errors) {
|
|
154
|
+
for (const error of result.errors) {
|
|
155
|
+
logger.error(` ${error}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return result;
|
|
161
|
+
} catch (error) {
|
|
162
|
+
spinner.fail(`${workflow} error: ${error.message}`);
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Show installation summary
|
|
169
|
+
*/
|
|
170
|
+
async showSummary() {
|
|
171
|
+
logger.section('Installation Summary');
|
|
172
|
+
|
|
173
|
+
// Count installed items
|
|
174
|
+
const claudeDir = path.join(this.targetDir, '.claude');
|
|
175
|
+
const agentsDir = path.join(claudeDir, 'agents');
|
|
176
|
+
const commandsDir = path.join(claudeDir, 'commands');
|
|
177
|
+
|
|
178
|
+
let agentCount = 0;
|
|
179
|
+
let commandCount = 0;
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
if (await fs.pathExists(agentsDir)) {
|
|
183
|
+
const agents = await fs.readdir(agentsDir);
|
|
184
|
+
agentCount = agents.filter(f => f.endsWith('.md')).length;
|
|
185
|
+
}
|
|
186
|
+
if (await fs.pathExists(commandsDir)) {
|
|
187
|
+
const commands = await fs.readdir(commandsDir);
|
|
188
|
+
commandCount = commands.filter(f => f.endsWith('.md')).length;
|
|
189
|
+
}
|
|
190
|
+
} catch (error) {
|
|
191
|
+
// Ignore errors
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
logger.log(`Workflows installed: ${this.installedWorkflows.length}`);
|
|
195
|
+
logger.log(` - ${this.installedWorkflows.join(', ')}`);
|
|
196
|
+
logger.blank();
|
|
197
|
+
logger.log(`Agents: ${agentCount}`);
|
|
198
|
+
logger.log(`Commands: ${commandCount}`);
|
|
199
|
+
logger.blank();
|
|
200
|
+
|
|
201
|
+
// Show next steps
|
|
202
|
+
logger.section('Next Steps');
|
|
203
|
+
logger.log('1. Configure your settings:');
|
|
204
|
+
logger.log(' Run: /myai-configure');
|
|
205
|
+
logger.blank();
|
|
206
|
+
logger.log('2. Available commands:');
|
|
207
|
+
|
|
208
|
+
if (this.installedWorkflows.includes('content') || this.installedWorkflows.includes('core')) {
|
|
209
|
+
logger.log(' /myai-content-writer - Create SEO-optimized content');
|
|
210
|
+
}
|
|
211
|
+
if (this.installedWorkflows.includes('content') || this.installedWorkflows.includes('publish-wordpress')) {
|
|
212
|
+
logger.log(' /myai-wordpress-publish - Publish to WordPress');
|
|
213
|
+
}
|
|
214
|
+
if (this.installedWorkflows.includes('content') || this.installedWorkflows.includes('core')) {
|
|
215
|
+
logger.log(' /myai-coordinate-content - Coordinate content workflow');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
logger.blank();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Check if configuration is needed
|
|
223
|
+
* @returns {boolean}
|
|
224
|
+
*/
|
|
225
|
+
needsConfiguration() {
|
|
226
|
+
const needsWordPress = this.installedWorkflows.some(w =>
|
|
227
|
+
['content', 'publish-wordpress'].includes(w)
|
|
228
|
+
);
|
|
229
|
+
const needsOpenStack = this.installedWorkflows.some(w =>
|
|
230
|
+
['openstack'].includes(w)
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
return needsWordPress || needsOpenStack;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Offer to run configuration
|
|
238
|
+
*/
|
|
239
|
+
async offerConfiguration() {
|
|
240
|
+
const { configure } = await inquirer.prompt([
|
|
241
|
+
{
|
|
242
|
+
type: 'confirm',
|
|
243
|
+
name: 'configure',
|
|
244
|
+
message: 'Would you like to configure your settings now?',
|
|
245
|
+
default: true
|
|
246
|
+
}
|
|
247
|
+
]);
|
|
248
|
+
|
|
249
|
+
if (configure) {
|
|
250
|
+
// Import and run configure script
|
|
251
|
+
const { default: runConfigure } = await import('./configure.js');
|
|
252
|
+
// Note: This will run the configure wizard
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Uninstall workflows
|
|
258
|
+
* @param {string[]} workflows - Workflows to uninstall
|
|
259
|
+
*/
|
|
260
|
+
async uninstall(workflows) {
|
|
261
|
+
logger.header('Uninstalling Workflows');
|
|
262
|
+
|
|
263
|
+
for (const workflow of workflows) {
|
|
264
|
+
const spinner = createSpinner(`Uninstalling ${workflow}...`);
|
|
265
|
+
spinner.start();
|
|
266
|
+
|
|
267
|
+
try {
|
|
268
|
+
// Get workflow info
|
|
269
|
+
const workflowInfo = this.installer.getWorkflow(workflow);
|
|
270
|
+
if (!workflowInfo) {
|
|
271
|
+
spinner.warn(`Workflow not found: ${workflow}`);
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Remove agents
|
|
276
|
+
if (workflowInfo.agents) {
|
|
277
|
+
for (const agent of workflowInfo.agents) {
|
|
278
|
+
const agentPath = path.join(this.targetDir, '.claude', 'agents', `${agent}.md`);
|
|
279
|
+
await fs.remove(agentPath);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Remove commands
|
|
284
|
+
if (workflowInfo.commands) {
|
|
285
|
+
for (const command of workflowInfo.commands) {
|
|
286
|
+
const commandPath = path.join(this.targetDir, '.claude', 'commands', `${command}.md`);
|
|
287
|
+
await fs.remove(commandPath);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
spinner.succeed(`${workflow} uninstalled`);
|
|
292
|
+
} catch (error) {
|
|
293
|
+
spinner.fail(`Failed to uninstall ${workflow}: ${error.message}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* List installed workflows
|
|
300
|
+
*/
|
|
301
|
+
async listInstalled() {
|
|
302
|
+
logger.header('Installed Workflows');
|
|
303
|
+
|
|
304
|
+
const claudeDir = path.join(this.targetDir, '.claude');
|
|
305
|
+
|
|
306
|
+
if (!await fs.pathExists(claudeDir)) {
|
|
307
|
+
logger.info('No workflows installed.');
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const agentsDir = path.join(claudeDir, 'agents');
|
|
312
|
+
const commandsDir = path.join(claudeDir, 'commands');
|
|
313
|
+
|
|
314
|
+
logger.section('Agents');
|
|
315
|
+
if (await fs.pathExists(agentsDir)) {
|
|
316
|
+
const agents = await fs.readdir(agentsDir);
|
|
317
|
+
const mdAgents = agents.filter(f => f.endsWith('.md'));
|
|
318
|
+
if (mdAgents.length > 0) {
|
|
319
|
+
for (const agent of mdAgents) {
|
|
320
|
+
logger.log(` • ${agent.replace('.md', '')}`);
|
|
321
|
+
}
|
|
322
|
+
} else {
|
|
323
|
+
logger.info(' No agents installed.');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
logger.section('Commands');
|
|
328
|
+
if (await fs.pathExists(commandsDir)) {
|
|
329
|
+
const commands = await fs.readdir(commandsDir);
|
|
330
|
+
const mdCommands = commands.filter(f => f.endsWith('.md'));
|
|
331
|
+
if (mdCommands.length > 0) {
|
|
332
|
+
for (const command of mdCommands) {
|
|
333
|
+
logger.log(` • ${command.replace('.md', '')}`);
|
|
334
|
+
}
|
|
335
|
+
} else {
|
|
336
|
+
logger.info(' No commands installed.');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Parse command line arguments
|
|
344
|
+
* @param {string[]} args - Command line arguments
|
|
345
|
+
* @returns {Object} Parsed options
|
|
346
|
+
*/
|
|
347
|
+
function parseArgs(args) {
|
|
348
|
+
const options = {
|
|
349
|
+
workflows: [],
|
|
350
|
+
cliType: 'claude',
|
|
351
|
+
interactive: false,
|
|
352
|
+
force: false,
|
|
353
|
+
verbose: false,
|
|
354
|
+
uninstall: false,
|
|
355
|
+
list: false,
|
|
356
|
+
help: false
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
let i = 0;
|
|
360
|
+
while (i < args.length) {
|
|
361
|
+
const arg = args[i];
|
|
362
|
+
|
|
363
|
+
if (arg === '--help' || arg === '-h') {
|
|
364
|
+
options.help = true;
|
|
365
|
+
} else if (arg === '--interactive' || arg === '-i') {
|
|
366
|
+
options.interactive = true;
|
|
367
|
+
} else if (arg === '--force' || arg === '-f') {
|
|
368
|
+
options.force = true;
|
|
369
|
+
} else if (arg === '--verbose' || arg === '-v') {
|
|
370
|
+
options.verbose = true;
|
|
371
|
+
} else if (arg === '--claude') {
|
|
372
|
+
options.cliType = 'claude';
|
|
373
|
+
} else if (arg === '--gemini') {
|
|
374
|
+
options.cliType = 'gemini';
|
|
375
|
+
} else if (arg === '--codex') {
|
|
376
|
+
options.cliType = 'codex';
|
|
377
|
+
} else if (arg === '--uninstall' || arg === '-u') {
|
|
378
|
+
options.uninstall = true;
|
|
379
|
+
} else if (arg === '--list' || arg === '-l') {
|
|
380
|
+
options.list = true;
|
|
381
|
+
} else if (!arg.startsWith('-')) {
|
|
382
|
+
options.workflows.push(arg);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
i++;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return options;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Show help message
|
|
393
|
+
*/
|
|
394
|
+
function showHelp() {
|
|
395
|
+
console.log(`
|
|
396
|
+
MyAIDev Method - Installation Script
|
|
397
|
+
|
|
398
|
+
Usage: node install.js [workflows...] [options]
|
|
399
|
+
|
|
400
|
+
Workflows:
|
|
401
|
+
core Core workflow with configuration tools
|
|
402
|
+
content Content creation with SEO optimization
|
|
403
|
+
visual Visual content generation
|
|
404
|
+
publish-wordpress WordPress publishing
|
|
405
|
+
development Development tools
|
|
406
|
+
security-pentest Security penetration testing
|
|
407
|
+
security-audit Security auditing
|
|
408
|
+
|
|
409
|
+
Options:
|
|
410
|
+
-h, --help Show this help message
|
|
411
|
+
-i, --interactive Run interactive workflow selection
|
|
412
|
+
-f, --force Force overwrite existing files
|
|
413
|
+
-v, --verbose Show detailed output
|
|
414
|
+
--claude Configure for Claude Code (default)
|
|
415
|
+
--gemini Configure for Gemini CLI
|
|
416
|
+
--codex Configure for Codex CLI
|
|
417
|
+
-l, --list List installed workflows
|
|
418
|
+
-u, --uninstall Uninstall specified workflows
|
|
419
|
+
|
|
420
|
+
Examples:
|
|
421
|
+
node install.js core content --claude
|
|
422
|
+
node install.js --interactive
|
|
423
|
+
node install.js --list
|
|
424
|
+
node install.js content --uninstall
|
|
425
|
+
`);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Main function
|
|
430
|
+
*/
|
|
431
|
+
async function main() {
|
|
432
|
+
const args = process.argv.slice(2);
|
|
433
|
+
const options = parseArgs(args);
|
|
434
|
+
|
|
435
|
+
if (options.help) {
|
|
436
|
+
showHelp();
|
|
437
|
+
process.exit(0);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const orchestrator = new InstallationOrchestrator();
|
|
441
|
+
|
|
442
|
+
try {
|
|
443
|
+
if (options.list) {
|
|
444
|
+
await orchestrator.listInstalled();
|
|
445
|
+
} else if (options.uninstall) {
|
|
446
|
+
if (options.workflows.length === 0) {
|
|
447
|
+
logger.error('Please specify workflows to uninstall.');
|
|
448
|
+
process.exit(1);
|
|
449
|
+
}
|
|
450
|
+
await orchestrator.uninstall(options.workflows);
|
|
451
|
+
} else {
|
|
452
|
+
await orchestrator.run(options);
|
|
453
|
+
}
|
|
454
|
+
} catch (error) {
|
|
455
|
+
logger.error(`Error: ${error.message}`);
|
|
456
|
+
process.exit(1);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
main();
|
package/src/scripts/ping.js
CHANGED