@outputai/cli 0.1.2-dev.0 → 0.1.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/package.json +7 -7
- package/dist/api/generated/api.d.ts +0 -820
- package/dist/api/generated/api.js +0 -226
- package/dist/api/http_client.d.ts +0 -27
- package/dist/api/http_client.js +0 -71
- package/dist/api/orval_post_process.d.ts +0 -11
- package/dist/api/orval_post_process.js +0 -46
- package/dist/api/parser.d.ts +0 -17
- package/dist/api/parser.js +0 -68
- package/dist/assets/config/costs.yml +0 -309
- package/dist/assets/docker/docker-compose-dev.yml +0 -146
- package/dist/commands/credentials/edit.d.ts +0 -10
- package/dist/commands/credentials/edit.js +0 -67
- package/dist/commands/credentials/edit.spec.d.ts +0 -1
- package/dist/commands/credentials/edit.spec.js +0 -73
- package/dist/commands/credentials/get.d.ts +0 -13
- package/dist/commands/credentials/get.js +0 -46
- package/dist/commands/credentials/get.spec.d.ts +0 -1
- package/dist/commands/credentials/get.spec.js +0 -74
- package/dist/commands/credentials/init.d.ts +0 -11
- package/dist/commands/credentials/init.js +0 -45
- package/dist/commands/credentials/init.spec.d.ts +0 -1
- package/dist/commands/credentials/init.spec.js +0 -68
- package/dist/commands/credentials/show.d.ts +0 -10
- package/dist/commands/credentials/show.js +0 -33
- package/dist/commands/credentials/show.spec.d.ts +0 -1
- package/dist/commands/credentials/show.spec.js +0 -57
- package/dist/commands/dev/eject.d.ts +0 -11
- package/dist/commands/dev/eject.js +0 -58
- package/dist/commands/dev/eject.spec.d.ts +0 -1
- package/dist/commands/dev/eject.spec.js +0 -109
- package/dist/commands/dev/index.d.ts +0 -13
- package/dist/commands/dev/index.js +0 -162
- package/dist/commands/dev/index.spec.d.ts +0 -1
- package/dist/commands/dev/index.spec.js +0 -239
- package/dist/commands/init.d.ts +0 -12
- package/dist/commands/init.js +0 -37
- package/dist/commands/init.spec.d.ts +0 -1
- package/dist/commands/init.spec.js +0 -100
- package/dist/commands/update.d.ts +0 -14
- package/dist/commands/update.js +0 -120
- package/dist/commands/update.spec.d.ts +0 -1
- package/dist/commands/update.spec.js +0 -178
- package/dist/commands/workflow/cost.d.ts +0 -16
- package/dist/commands/workflow/cost.js +0 -71
- package/dist/commands/workflow/cost.spec.d.ts +0 -1
- package/dist/commands/workflow/cost.spec.js +0 -47
- package/dist/commands/workflow/dataset/generate.d.ts +0 -22
- package/dist/commands/workflow/dataset/generate.js +0 -143
- package/dist/commands/workflow/dataset/list.d.ts +0 -12
- package/dist/commands/workflow/dataset/list.js +0 -87
- package/dist/commands/workflow/debug.d.ts +0 -16
- package/dist/commands/workflow/debug.js +0 -60
- package/dist/commands/workflow/debug.spec.d.ts +0 -1
- package/dist/commands/workflow/debug.spec.js +0 -34
- package/dist/commands/workflow/generate.d.ts +0 -17
- package/dist/commands/workflow/generate.js +0 -85
- package/dist/commands/workflow/generate.spec.d.ts +0 -1
- package/dist/commands/workflow/generate.spec.js +0 -115
- package/dist/commands/workflow/list.d.ts +0 -22
- package/dist/commands/workflow/list.js +0 -152
- package/dist/commands/workflow/list.spec.d.ts +0 -1
- package/dist/commands/workflow/list.spec.js +0 -99
- package/dist/commands/workflow/plan.d.ts +0 -12
- package/dist/commands/workflow/plan.js +0 -66
- package/dist/commands/workflow/plan.spec.d.ts +0 -1
- package/dist/commands/workflow/plan.spec.js +0 -341
- package/dist/commands/workflow/reset.d.ts +0 -14
- package/dist/commands/workflow/reset.js +0 -51
- package/dist/commands/workflow/result.d.ts +0 -13
- package/dist/commands/workflow/result.js +0 -46
- package/dist/commands/workflow/result.spec.d.ts +0 -1
- package/dist/commands/workflow/result.spec.js +0 -23
- package/dist/commands/workflow/run.d.ts +0 -16
- package/dist/commands/workflow/run.js +0 -97
- package/dist/commands/workflow/run.spec.d.ts +0 -1
- package/dist/commands/workflow/run.spec.js +0 -110
- package/dist/commands/workflow/runs/list.d.ts +0 -14
- package/dist/commands/workflow/runs/list.js +0 -104
- package/dist/commands/workflow/start.d.ts +0 -15
- package/dist/commands/workflow/start.js +0 -62
- package/dist/commands/workflow/start.spec.d.ts +0 -1
- package/dist/commands/workflow/start.spec.js +0 -28
- package/dist/commands/workflow/status.d.ts +0 -13
- package/dist/commands/workflow/status.js +0 -57
- package/dist/commands/workflow/status.spec.d.ts +0 -1
- package/dist/commands/workflow/status.spec.js +0 -33
- package/dist/commands/workflow/stop.d.ts +0 -10
- package/dist/commands/workflow/stop.js +0 -31
- package/dist/commands/workflow/stop.spec.d.ts +0 -1
- package/dist/commands/workflow/stop.spec.js +0 -17
- package/dist/commands/workflow/terminate.d.ts +0 -13
- package/dist/commands/workflow/terminate.js +0 -39
- package/dist/commands/workflow/test_eval.d.ts +0 -20
- package/dist/commands/workflow/test_eval.js +0 -151
- package/dist/config.d.ts +0 -47
- package/dist/config.js +0 -47
- package/dist/generated/framework_version.json +0 -3
- package/dist/hooks/init.d.ts +0 -3
- package/dist/hooks/init.js +0 -30
- package/dist/hooks/init.spec.d.ts +0 -1
- package/dist/hooks/init.spec.js +0 -54
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/index.spec.d.ts +0 -1
- package/dist/index.spec.js +0 -6
- package/dist/services/claude_client.d.ts +0 -30
- package/dist/services/claude_client.integration.test.d.ts +0 -1
- package/dist/services/claude_client.integration.test.js +0 -43
- package/dist/services/claude_client.js +0 -215
- package/dist/services/claude_client.spec.d.ts +0 -1
- package/dist/services/claude_client.spec.js +0 -145
- package/dist/services/coding_agents.d.ts +0 -36
- package/dist/services/coding_agents.js +0 -236
- package/dist/services/coding_agents.spec.d.ts +0 -1
- package/dist/services/coding_agents.spec.js +0 -256
- package/dist/services/copy_assets.spec.d.ts +0 -1
- package/dist/services/copy_assets.spec.js +0 -22
- package/dist/services/cost_calculator.d.ts +0 -18
- package/dist/services/cost_calculator.js +0 -359
- package/dist/services/cost_calculator.spec.d.ts +0 -1
- package/dist/services/cost_calculator.spec.js +0 -540
- package/dist/services/credentials_service.d.ts +0 -12
- package/dist/services/credentials_service.integration.test.d.ts +0 -1
- package/dist/services/credentials_service.integration.test.js +0 -66
- package/dist/services/credentials_service.js +0 -64
- package/dist/services/credentials_service.spec.d.ts +0 -1
- package/dist/services/credentials_service.spec.js +0 -106
- package/dist/services/datasets.d.ts +0 -20
- package/dist/services/datasets.js +0 -132
- package/dist/services/docker.d.ts +0 -38
- package/dist/services/docker.js +0 -148
- package/dist/services/docker.spec.d.ts +0 -1
- package/dist/services/docker.spec.js +0 -124
- package/dist/services/env_configurator.d.ts +0 -15
- package/dist/services/env_configurator.js +0 -163
- package/dist/services/env_configurator.spec.d.ts +0 -1
- package/dist/services/env_configurator.spec.js +0 -192
- package/dist/services/generate_plan_name@v1.prompt +0 -24
- package/dist/services/messages.d.ts +0 -9
- package/dist/services/messages.js +0 -338
- package/dist/services/messages.spec.d.ts +0 -1
- package/dist/services/messages.spec.js +0 -55
- package/dist/services/npm_update_service.d.ts +0 -6
- package/dist/services/npm_update_service.js +0 -87
- package/dist/services/npm_update_service.spec.d.ts +0 -1
- package/dist/services/npm_update_service.spec.js +0 -104
- package/dist/services/project_scaffold.d.ts +0 -31
- package/dist/services/project_scaffold.js +0 -212
- package/dist/services/project_scaffold.spec.d.ts +0 -1
- package/dist/services/project_scaffold.spec.js +0 -122
- package/dist/services/s3_trace_downloader.d.ts +0 -12
- package/dist/services/s3_trace_downloader.js +0 -57
- package/dist/services/template_processor.d.ts +0 -14
- package/dist/services/template_processor.js +0 -57
- package/dist/services/trace_reader.d.ts +0 -16
- package/dist/services/trace_reader.js +0 -57
- package/dist/services/trace_reader.spec.d.ts +0 -1
- package/dist/services/trace_reader.spec.js +0 -78
- package/dist/services/version_check.d.ts +0 -6
- package/dist/services/version_check.js +0 -52
- package/dist/services/version_check.spec.d.ts +0 -1
- package/dist/services/version_check.spec.js +0 -106
- package/dist/services/workflow_builder.d.ts +0 -16
- package/dist/services/workflow_builder.js +0 -86
- package/dist/services/workflow_builder.spec.d.ts +0 -1
- package/dist/services/workflow_builder.spec.js +0 -165
- package/dist/services/workflow_generator.d.ts +0 -5
- package/dist/services/workflow_generator.js +0 -40
- package/dist/services/workflow_generator.spec.d.ts +0 -1
- package/dist/services/workflow_generator.spec.js +0 -77
- package/dist/services/workflow_planner.d.ts +0 -15
- package/dist/services/workflow_planner.js +0 -48
- package/dist/services/workflow_planner.spec.d.ts +0 -1
- package/dist/services/workflow_planner.spec.js +0 -122
- package/dist/services/workflow_runs.d.ts +0 -14
- package/dist/services/workflow_runs.js +0 -25
- package/dist/templates/agent_instructions/CLAUDE.md.template +0 -19
- package/dist/templates/agent_instructions/dotclaude/settings.json.template +0 -29
- package/dist/templates/project/.env.example.template +0 -9
- package/dist/templates/project/.gitignore.template +0 -35
- package/dist/templates/project/README.md.template +0 -100
- package/dist/templates/project/config/costs.yml.template +0 -29
- package/dist/templates/project/package.json.template +0 -25
- package/dist/templates/project/src/clients/jina.ts.template +0 -30
- package/dist/templates/project/src/shared/utils/string.ts.template +0 -3
- package/dist/templates/project/src/shared/utils/url.ts.template +0 -15
- package/dist/templates/project/src/workflows/blog_evaluator/evaluators.ts.template +0 -23
- package/dist/templates/project/src/workflows/blog_evaluator/prompts/signal_noise@v1.prompt.template +0 -26
- package/dist/templates/project/src/workflows/blog_evaluator/scenarios/paulgraham_hwh.json.template +0 -3
- package/dist/templates/project/src/workflows/blog_evaluator/steps.ts.template +0 -27
- package/dist/templates/project/src/workflows/blog_evaluator/types.ts.template +0 -30
- package/dist/templates/project/src/workflows/blog_evaluator/utils.ts.template +0 -15
- package/dist/templates/project/src/workflows/blog_evaluator/workflow.ts.template +0 -27
- package/dist/templates/project/tsconfig.json.template +0 -20
- package/dist/templates/workflow/README.md.template +0 -216
- package/dist/templates/workflow/evaluators.ts.template +0 -21
- package/dist/templates/workflow/prompts/example@v1.prompt.template +0 -15
- package/dist/templates/workflow/scenarios/test_input.json.template +0 -3
- package/dist/templates/workflow/steps.ts.template +0 -20
- package/dist/templates/workflow/types.ts.template +0 -13
- package/dist/templates/workflow/workflow.ts.template +0 -23
- package/dist/test_helpers/mocks.d.ts +0 -38
- package/dist/test_helpers/mocks.js +0 -77
- package/dist/types/cost.d.ts +0 -149
- package/dist/types/cost.js +0 -6
- package/dist/types/domain.d.ts +0 -20
- package/dist/types/domain.js +0 -4
- package/dist/types/errors.d.ts +0 -68
- package/dist/types/errors.js +0 -100
- package/dist/types/errors.spec.d.ts +0 -1
- package/dist/types/errors.spec.js +0 -18
- package/dist/types/generator.d.ts +0 -26
- package/dist/types/generator.js +0 -1
- package/dist/types/trace.d.ts +0 -161
- package/dist/types/trace.js +0 -18
- package/dist/utils/claude.d.ts +0 -5
- package/dist/utils/claude.js +0 -19
- package/dist/utils/claude.spec.d.ts +0 -1
- package/dist/utils/claude.spec.js +0 -119
- package/dist/utils/constants.d.ts +0 -5
- package/dist/utils/constants.js +0 -4
- package/dist/utils/cost_formatter.d.ts +0 -5
- package/dist/utils/cost_formatter.js +0 -218
- package/dist/utils/date_formatter.d.ts +0 -23
- package/dist/utils/date_formatter.js +0 -49
- package/dist/utils/env_loader.d.ts +0 -1
- package/dist/utils/env_loader.js +0 -22
- package/dist/utils/env_loader.spec.d.ts +0 -1
- package/dist/utils/env_loader.spec.js +0 -43
- package/dist/utils/error_handler.d.ts +0 -8
- package/dist/utils/error_handler.js +0 -71
- package/dist/utils/error_utils.d.ts +0 -24
- package/dist/utils/error_utils.js +0 -87
- package/dist/utils/file_system.d.ts +0 -3
- package/dist/utils/file_system.js +0 -33
- package/dist/utils/format_workflow_result.d.ts +0 -5
- package/dist/utils/format_workflow_result.js +0 -18
- package/dist/utils/format_workflow_result.spec.d.ts +0 -1
- package/dist/utils/format_workflow_result.spec.js +0 -81
- package/dist/utils/framework_version.d.ts +0 -4
- package/dist/utils/framework_version.js +0 -4
- package/dist/utils/framework_version.spec.d.ts +0 -1
- package/dist/utils/framework_version.spec.js +0 -13
- package/dist/utils/header_utils.d.ts +0 -12
- package/dist/utils/header_utils.js +0 -29
- package/dist/utils/header_utils.spec.d.ts +0 -1
- package/dist/utils/header_utils.spec.js +0 -52
- package/dist/utils/input_parser.d.ts +0 -1
- package/dist/utils/input_parser.js +0 -19
- package/dist/utils/output_formatter.d.ts +0 -2
- package/dist/utils/output_formatter.js +0 -11
- package/dist/utils/paths.d.ts +0 -25
- package/dist/utils/paths.js +0 -36
- package/dist/utils/process.d.ts +0 -4
- package/dist/utils/process.js +0 -50
- package/dist/utils/resolve_input.d.ts +0 -1
- package/dist/utils/resolve_input.js +0 -22
- package/dist/utils/scenario_resolver.d.ts +0 -9
- package/dist/utils/scenario_resolver.js +0 -93
- package/dist/utils/scenario_resolver.spec.d.ts +0 -1
- package/dist/utils/scenario_resolver.spec.js +0 -214
- package/dist/utils/secret_sanitizer.d.ts +0 -1
- package/dist/utils/secret_sanitizer.js +0 -29
- package/dist/utils/sleep.d.ts +0 -5
- package/dist/utils/sleep.js +0 -5
- package/dist/utils/template.d.ts +0 -9
- package/dist/utils/template.js +0 -30
- package/dist/utils/template.spec.d.ts +0 -1
- package/dist/utils/template.spec.js +0 -77
- package/dist/utils/trace_extractor.d.ts +0 -27
- package/dist/utils/trace_extractor.js +0 -53
- package/dist/utils/trace_formatter.d.ts +0 -11
- package/dist/utils/trace_formatter.js +0 -402
- package/dist/utils/validation.d.ts +0 -13
- package/dist/utils/validation.js +0 -25
- package/dist/utils/validation.spec.d.ts +0 -1
- package/dist/utils/validation.spec.js +0 -140
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Success and informational messages for project initialization
|
|
3
|
-
*/
|
|
4
|
-
import { ux } from '@oclif/core';
|
|
5
|
-
import { config } from '#config.js';
|
|
6
|
-
/**
|
|
7
|
-
* Creates a colored ASCII art banner for Output.ai
|
|
8
|
-
*/
|
|
9
|
-
const createOutputBanner = () => {
|
|
10
|
-
// ASCII art banner for "Output.ai"
|
|
11
|
-
const banner = `
|
|
12
|
-
██████╗ ██╗ ██╗████████╗██████╗ ██╗ ██╗████████╗ █████╗ ██╗
|
|
13
|
-
██╔═══██╗██║ ██║╚══██╔══╝██╔══██╗██║ ██║╚══██╔══╝ ██╔══██╗██║
|
|
14
|
-
██║ ██║██║ ██║ ██║ ██████╔╝██║ ██║ ██║ ███████║██║
|
|
15
|
-
██║ ██║██║ ██║ ██║ ██╔═══╝ ██║ ██║ ██║ ██╔══██║██║
|
|
16
|
-
╚██████╔╝╚██████╔╝ ██║ ██║ ╚██████╔╝ ██║ ██╗██║ ██║██║
|
|
17
|
-
╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝`;
|
|
18
|
-
// Apply gradient colors from cyan to magenta
|
|
19
|
-
const colors = ['cyan', 'cyan', 'blue', 'blue', 'magenta', 'magenta'];
|
|
20
|
-
return banner
|
|
21
|
-
.split('\n')
|
|
22
|
-
.map((line, index) => {
|
|
23
|
-
return ux.colorize(colors[index], line);
|
|
24
|
-
})
|
|
25
|
-
.join('\n');
|
|
26
|
-
};
|
|
27
|
-
/**
|
|
28
|
-
* Formats a command for display with proper styling
|
|
29
|
-
*/
|
|
30
|
-
const formatCommand = (command) => {
|
|
31
|
-
return ux.colorize('cyan', command);
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* Formats a file path for display
|
|
35
|
-
*/
|
|
36
|
-
const formatPath = (path) => {
|
|
37
|
-
return ux.colorize('yellow', path);
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Creates a section header with styling
|
|
41
|
-
*/
|
|
42
|
-
const createSectionHeader = (title, icon = '') => {
|
|
43
|
-
const header = icon ? `${icon} ${title}` : title;
|
|
44
|
-
return ux.colorize('bold', header);
|
|
45
|
-
};
|
|
46
|
-
export const getEjectSuccessMessage = (destPath, outputFile, binName) => {
|
|
47
|
-
const divider = ux.colorize('dim', '─'.repeat(80));
|
|
48
|
-
const bulletPoint = ux.colorize('green', '▸');
|
|
49
|
-
// Build the customization tips
|
|
50
|
-
const customizationTips = [
|
|
51
|
-
{
|
|
52
|
-
title: 'Environment Variables',
|
|
53
|
-
description: 'Adjust service configurations and API settings'
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
title: 'Port Mappings',
|
|
57
|
-
description: 'Change exposed ports to avoid conflicts'
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
title: 'Service Versions',
|
|
61
|
-
description: 'Update Docker images to specific versions'
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
title: 'Volume Mounts',
|
|
65
|
-
description: 'Add custom volumes for persistent data'
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
title: 'Network Configuration',
|
|
69
|
-
description: 'Modify network settings for your infrastructure'
|
|
70
|
-
}
|
|
71
|
-
];
|
|
72
|
-
const formattedTips = customizationTips.map(tip => {
|
|
73
|
-
return ` ${bulletPoint} ${ux.colorize('white', `${tip.title}:`)} ${ux.colorize('dim', tip.description)}`;
|
|
74
|
-
}).join('\n');
|
|
75
|
-
// Build common modifications examples
|
|
76
|
-
const examples = [
|
|
77
|
-
{
|
|
78
|
-
title: 'Change Redis port',
|
|
79
|
-
code: 'ports:\n - \'6380:6379\' # Changed from 6379'
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
title: 'Add environment variable',
|
|
83
|
-
code: 'environment:\n - MY_CUSTOM_VAR=value'
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
title: 'Use specific image version',
|
|
87
|
-
code: 'image: redis:8.0.0-alpine # Pin to specific version'
|
|
88
|
-
}
|
|
89
|
-
];
|
|
90
|
-
const formattedExamples = examples.map((example, index) => {
|
|
91
|
-
const number = ux.colorize('dim', `${index + 1}.`);
|
|
92
|
-
const title = ux.colorize('white', example.title);
|
|
93
|
-
const code = ux.colorize('cyan', example.code.split('\n').map(line => ` ${line}`).join('\n'));
|
|
94
|
-
return ` ${number} ${title}\n${code}`;
|
|
95
|
-
}).join('\n\n');
|
|
96
|
-
return `
|
|
97
|
-
|
|
98
|
-
${divider}
|
|
99
|
-
|
|
100
|
-
${ux.colorize('bold', ux.colorize('green', '✅ SUCCESS!'))} ${ux.colorize('bold', 'Docker Compose configuration ejected')}
|
|
101
|
-
|
|
102
|
-
${divider}
|
|
103
|
-
|
|
104
|
-
${createSectionHeader('CONFIGURATION DETAILS', '📦')}
|
|
105
|
-
|
|
106
|
-
${bulletPoint} ${ux.colorize('white', 'Location:')} ${formatPath(destPath)}
|
|
107
|
-
${bulletPoint} ${ux.colorize('white', 'Services:')} Temporal, Redis, PostgreSQL, API, Worker, UI
|
|
108
|
-
${bulletPoint} ${ux.colorize('white', 'Network:')} Isolated bridge network for all services
|
|
109
|
-
|
|
110
|
-
${divider}
|
|
111
|
-
|
|
112
|
-
${createSectionHeader('USAGE', '🚀')}
|
|
113
|
-
|
|
114
|
-
${ux.colorize('white', 'Start services with your custom configuration:')}
|
|
115
|
-
|
|
116
|
-
${formatCommand(`${binName} dev --compose-file ${outputFile}`)}
|
|
117
|
-
|
|
118
|
-
${ux.colorize('white', 'Or use Docker Compose directly:')}
|
|
119
|
-
|
|
120
|
-
${formatCommand(`docker compose -f ${outputFile} up`)}
|
|
121
|
-
|
|
122
|
-
${divider}
|
|
123
|
-
|
|
124
|
-
${createSectionHeader('CUSTOMIZATION OPTIONS', '🎨')}
|
|
125
|
-
|
|
126
|
-
${formattedTips}
|
|
127
|
-
|
|
128
|
-
${divider}
|
|
129
|
-
|
|
130
|
-
${createSectionHeader('COMMON MODIFICATIONS', '🔧')}
|
|
131
|
-
|
|
132
|
-
${formattedExamples}
|
|
133
|
-
|
|
134
|
-
${divider}
|
|
135
|
-
|
|
136
|
-
${createSectionHeader('IMPORTANT NOTES', '⚠️')}
|
|
137
|
-
|
|
138
|
-
${bulletPoint} ${ux.colorize('yellow', 'Service Dependencies:')} Maintain the ${ux.colorize('cyan', 'depends_on')} relationships
|
|
139
|
-
${bulletPoint} ${ux.colorize('yellow', 'Health Checks:')} Keep health check configurations for service reliability
|
|
140
|
-
${bulletPoint} ${ux.colorize('yellow', 'Volume Names:')} Be careful when changing volume names (data persistence)
|
|
141
|
-
${bulletPoint} ${ux.colorize('yellow', 'Network Mode:')} The ${ux.colorize('cyan', 'main')} network connects all services
|
|
142
|
-
|
|
143
|
-
${divider}
|
|
144
|
-
|
|
145
|
-
${ux.colorize('dim', '💡 Tip: Test your changes with ')}${formatCommand('docker compose config')}${ux.colorize('dim', ' to validate the syntax')}
|
|
146
|
-
|
|
147
|
-
${ux.colorize('green', ux.colorize('bold', 'Happy customizing! 🛠️'))}
|
|
148
|
-
`;
|
|
149
|
-
};
|
|
150
|
-
export const getProjectSuccessMessage = (folderName, installSuccess, envConfigured = false) => {
|
|
151
|
-
const divider = ux.colorize('dim', '─'.repeat(80));
|
|
152
|
-
const bulletPoint = ux.colorize('green', '▸');
|
|
153
|
-
// Build the next steps array with proper formatting
|
|
154
|
-
const steps = [
|
|
155
|
-
{
|
|
156
|
-
step: 'Navigate to your project',
|
|
157
|
-
command: `cd ${folderName}`
|
|
158
|
-
}
|
|
159
|
-
];
|
|
160
|
-
if (!installSuccess) {
|
|
161
|
-
steps.push({
|
|
162
|
-
step: 'Install dependencies',
|
|
163
|
-
command: 'npm install',
|
|
164
|
-
note: 'Required before running workflows'
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
if (!envConfigured) {
|
|
168
|
-
steps.push({
|
|
169
|
-
step: 'Configure environment variables',
|
|
170
|
-
command: 'cp .env.example .env',
|
|
171
|
-
note: 'Copy .env.example to .env and add your API keys'
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
steps.push({
|
|
175
|
-
step: 'Start development services',
|
|
176
|
-
command: 'npx output dev',
|
|
177
|
-
note: 'Launches Temporal, Redis, PostgreSQL, API, Worker, and UI'
|
|
178
|
-
}, {
|
|
179
|
-
step: 'Run example workflow',
|
|
180
|
-
command: 'npx output workflow run blog_evaluator paulgraham_hwh',
|
|
181
|
-
note: 'Execute in a new terminal after services are running'
|
|
182
|
-
}, {
|
|
183
|
-
step: 'Monitor workflows',
|
|
184
|
-
command: 'open http://localhost:8080',
|
|
185
|
-
note: 'Access Temporal UI for workflow visualization'
|
|
186
|
-
});
|
|
187
|
-
// Format each step with proper indentation and colors
|
|
188
|
-
const formattedSteps = steps.map((item, index) => {
|
|
189
|
-
const stepNumber = ux.colorize('dim', `${index + 1}.`);
|
|
190
|
-
const stepText = ux.colorize('white', item.step);
|
|
191
|
-
const command = item.command ? `\n ${bulletPoint} ${formatCommand(item.command)}` : '';
|
|
192
|
-
const note = item.note ? `\n ${ux.colorize('dim', ` ${item.note}`)}` : '';
|
|
193
|
-
return ` ${stepNumber} ${stepText}${command}${note}`;
|
|
194
|
-
}).join('\n\n');
|
|
195
|
-
// Build the complete message using template string
|
|
196
|
-
return `
|
|
197
|
-
|
|
198
|
-
${createOutputBanner()}
|
|
199
|
-
|
|
200
|
-
${divider}
|
|
201
|
-
|
|
202
|
-
${ux.colorize('bold', ux.colorize('green', '🎉 SUCCESS!'))} ${ux.colorize('bold', 'Your Output project has been created')}
|
|
203
|
-
|
|
204
|
-
${divider}
|
|
205
|
-
|
|
206
|
-
${createSectionHeader('PROJECT DETAILS', '📁')}
|
|
207
|
-
|
|
208
|
-
${bulletPoint} ${ux.colorize('white', 'Name:')} ${formatPath(folderName)}
|
|
209
|
-
${bulletPoint} ${ux.colorize('white', 'Type:')} Output Project
|
|
210
|
-
${bulletPoint} ${ux.colorize('white', 'Structure:')} ${formatPath('.outputai/')} (agents), ${formatPath('workflows/')} (implementations)
|
|
211
|
-
|
|
212
|
-
${divider}
|
|
213
|
-
|
|
214
|
-
${createSectionHeader('NEXT STEPS', '🚀')}
|
|
215
|
-
|
|
216
|
-
${formattedSteps}
|
|
217
|
-
|
|
218
|
-
${divider}
|
|
219
|
-
|
|
220
|
-
${createSectionHeader('QUICK START COMMANDS', '⚡')}
|
|
221
|
-
|
|
222
|
-
${bulletPoint} ${ux.colorize('white', 'Plan a workflow:')} ${formatCommand('npx output workflow plan')}
|
|
223
|
-
${bulletPoint} ${ux.colorize('white', 'Generate from plan:')} ${formatCommand('npx output workflow generate')}
|
|
224
|
-
${bulletPoint} ${ux.colorize('white', 'List workflows:')} ${formatCommand('npx output workflow list')}
|
|
225
|
-
${bulletPoint} ${ux.colorize('white', 'View help:')} ${formatCommand('npx output --help')}
|
|
226
|
-
|
|
227
|
-
${divider}
|
|
228
|
-
|
|
229
|
-
${ux.colorize('dim', '💡 Tip: Use ')}${formatCommand('npx output workflow plan')}${ux.colorize('dim', ' to design your first custom workflow')}
|
|
230
|
-
${ux.colorize('dim', ' with AI assistance.')}
|
|
231
|
-
|
|
232
|
-
${ux.colorize('green', ux.colorize('bold', 'Happy building with Output! 🚀'))}
|
|
233
|
-
`;
|
|
234
|
-
};
|
|
235
|
-
export const getWorkflowGenerateSuccessMessage = (workflowName, targetDir, filesCreated) => {
|
|
236
|
-
const divider = ux.colorize('dim', '─'.repeat(80));
|
|
237
|
-
const bulletPoint = ux.colorize('green', '▸');
|
|
238
|
-
const formattedFiles = filesCreated.map(file => {
|
|
239
|
-
return ` ${bulletPoint} ${formatPath(file)}`;
|
|
240
|
-
}).join('\n');
|
|
241
|
-
const steps = [
|
|
242
|
-
{
|
|
243
|
-
step: 'Navigate to workflow directory',
|
|
244
|
-
command: `cd ${targetDir}`
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
step: 'Edit workflow files',
|
|
248
|
-
note: 'Customize workflow.ts, steps.ts, and prompts to match your requirements'
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
step: 'Configure environment',
|
|
252
|
-
command: 'cp .env.example .env',
|
|
253
|
-
note: 'Copy .env.example to .env and add your LLM provider credentials'
|
|
254
|
-
},
|
|
255
|
-
{
|
|
256
|
-
step: 'Test your workflow',
|
|
257
|
-
command: `npx output workflow run ${workflowName} test_input`,
|
|
258
|
-
note: 'Run after starting services with "npx output dev"'
|
|
259
|
-
}
|
|
260
|
-
];
|
|
261
|
-
const formattedSteps = steps.map((item, index) => {
|
|
262
|
-
const stepNumber = ux.colorize('dim', `${index + 1}.`);
|
|
263
|
-
const stepText = ux.colorize('white', item.step);
|
|
264
|
-
const command = item.command ? `\n ${bulletPoint} ${formatCommand(item.command)}` : '';
|
|
265
|
-
const note = item.note ? `\n ${ux.colorize('dim', ` ${item.note}`)}` : '';
|
|
266
|
-
return ` ${stepNumber} ${stepText}${command}${note}`;
|
|
267
|
-
}).join('\n\n');
|
|
268
|
-
return `
|
|
269
|
-
${divider}
|
|
270
|
-
|
|
271
|
-
${ux.colorize('bold', ux.colorize('green', '✅ SUCCESS!'))} ${ux.colorize('bold', `Workflow "${workflowName}" created`)}
|
|
272
|
-
|
|
273
|
-
${divider}
|
|
274
|
-
|
|
275
|
-
${createSectionHeader('WORKFLOW DETAILS', '📁')}
|
|
276
|
-
|
|
277
|
-
${bulletPoint} ${ux.colorize('white', 'Name:')} ${formatPath(workflowName)}
|
|
278
|
-
${bulletPoint} ${ux.colorize('white', 'Location:')} ${formatPath(targetDir)}
|
|
279
|
-
|
|
280
|
-
${divider}
|
|
281
|
-
|
|
282
|
-
${createSectionHeader('FILES CREATED', '📄')}
|
|
283
|
-
|
|
284
|
-
${formattedFiles}
|
|
285
|
-
|
|
286
|
-
${divider}
|
|
287
|
-
|
|
288
|
-
${createSectionHeader('NEXT STEPS', '🚀')}
|
|
289
|
-
|
|
290
|
-
${formattedSteps}
|
|
291
|
-
|
|
292
|
-
${divider}
|
|
293
|
-
|
|
294
|
-
${ux.colorize('dim', '💡 Tip: Check the README.md in your workflow directory for detailed documentation.')}
|
|
295
|
-
|
|
296
|
-
${ux.colorize('green', ux.colorize('bold', 'Happy building! 🛠️'))}
|
|
297
|
-
`;
|
|
298
|
-
};
|
|
299
|
-
export const getDevSuccessMessage = (services) => {
|
|
300
|
-
const divider = ux.colorize('dim', '─'.repeat(80));
|
|
301
|
-
const bulletPoint = ux.colorize('green', '▸');
|
|
302
|
-
const serviceNames = services.map(s => s.name).sort().join('|');
|
|
303
|
-
const logsCommand = `docker compose -p ${config.dockerServiceName} logs -f <${serviceNames}>`;
|
|
304
|
-
return `
|
|
305
|
-
${divider}
|
|
306
|
-
|
|
307
|
-
${ux.colorize('bold', ux.colorize('green', '✅ SUCCESS!'))} ${ux.colorize('bold', 'Development services are running')}
|
|
308
|
-
|
|
309
|
-
${divider}
|
|
310
|
-
|
|
311
|
-
${createSectionHeader('SERVICES', '🐳')}
|
|
312
|
-
|
|
313
|
-
${bulletPoint} ${ux.colorize('white', 'Temporal:')} ${formatPath('localhost:7233')}
|
|
314
|
-
${bulletPoint} ${ux.colorize('white', 'Temporal UI:')} ${formatCommand('http://localhost:8080')}
|
|
315
|
-
${bulletPoint} ${ux.colorize('white', 'API Server:')} ${formatPath('localhost:3001')}
|
|
316
|
-
${bulletPoint} ${ux.colorize('white', 'Redis:')} ${formatPath('localhost:6379')}
|
|
317
|
-
|
|
318
|
-
${divider}
|
|
319
|
-
|
|
320
|
-
${createSectionHeader('RUN A WORKFLOW', '🚀')}
|
|
321
|
-
|
|
322
|
-
${ux.colorize('white', 'In a new terminal, execute:')}
|
|
323
|
-
|
|
324
|
-
${formatCommand('npx output workflow run blog_evaluator paulgraham_hwh')}
|
|
325
|
-
|
|
326
|
-
${divider}
|
|
327
|
-
|
|
328
|
-
${createSectionHeader('USEFUL COMMANDS', '⚡')}
|
|
329
|
-
|
|
330
|
-
${bulletPoint} ${ux.colorize('white', 'Open Temporal UI:')} ${formatCommand('open http://localhost:8080')}
|
|
331
|
-
${bulletPoint} ${ux.colorize('white', 'View logs:')} ${formatCommand(logsCommand)}
|
|
332
|
-
${bulletPoint} ${ux.colorize('white', 'Stop services:')} ${formatCommand('Press Ctrl+C')}
|
|
333
|
-
|
|
334
|
-
${divider}
|
|
335
|
-
|
|
336
|
-
${ux.colorize('dim', '💡 Tip: The Temporal UI lets you monitor workflow executions in real-time')}
|
|
337
|
-
`;
|
|
338
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { getDevSuccessMessage } from './messages.js';
|
|
3
|
-
const mockServices = [
|
|
4
|
-
{ name: 'api' },
|
|
5
|
-
{ name: 'postgresql' },
|
|
6
|
-
{ name: 'redis' },
|
|
7
|
-
{ name: 'temporal' },
|
|
8
|
-
{ name: 'temporal-ui' },
|
|
9
|
-
{ name: 'worker' }
|
|
10
|
-
];
|
|
11
|
-
describe('messages', () => {
|
|
12
|
-
describe('getDevSuccessMessage', () => {
|
|
13
|
-
it('should return a string', () => {
|
|
14
|
-
const message = getDevSuccessMessage(mockServices);
|
|
15
|
-
expect(typeof message).toBe('string');
|
|
16
|
-
});
|
|
17
|
-
it('should include the Temporal UI URL', () => {
|
|
18
|
-
const message = getDevSuccessMessage(mockServices);
|
|
19
|
-
expect(message).toContain('http://localhost:8080');
|
|
20
|
-
});
|
|
21
|
-
it('should include the Temporal server address', () => {
|
|
22
|
-
const message = getDevSuccessMessage(mockServices);
|
|
23
|
-
expect(message).toContain('localhost:7233');
|
|
24
|
-
});
|
|
25
|
-
it('should include the API server address', () => {
|
|
26
|
-
const message = getDevSuccessMessage(mockServices);
|
|
27
|
-
expect(message).toContain('localhost:3001');
|
|
28
|
-
});
|
|
29
|
-
it('should include workflow run example', () => {
|
|
30
|
-
const message = getDevSuccessMessage(mockServices);
|
|
31
|
-
expect(message).toContain('output workflow run');
|
|
32
|
-
});
|
|
33
|
-
it('should include success indicator', () => {
|
|
34
|
-
const message = getDevSuccessMessage(mockServices);
|
|
35
|
-
expect(message).toContain('SUCCESS');
|
|
36
|
-
});
|
|
37
|
-
it('should include services section', () => {
|
|
38
|
-
const message = getDevSuccessMessage(mockServices);
|
|
39
|
-
expect(message).toContain('Temporal UI');
|
|
40
|
-
expect(message).toContain('API Server');
|
|
41
|
-
expect(message).toContain('Redis');
|
|
42
|
-
});
|
|
43
|
-
it('should include helpful tip about Temporal UI', () => {
|
|
44
|
-
const message = getDevSuccessMessage(mockServices);
|
|
45
|
-
expect(message).toContain('Temporal UI');
|
|
46
|
-
expect(message).toContain('workflow');
|
|
47
|
-
});
|
|
48
|
-
it('should include dynamic docker logs command with service names', () => {
|
|
49
|
-
const message = getDevSuccessMessage(mockServices);
|
|
50
|
-
expect(message).toContain('docker compose -p');
|
|
51
|
-
expect(message).toContain('logs -f');
|
|
52
|
-
expect(message).toContain('api|postgresql|redis|temporal|temporal-ui|worker');
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
});
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export declare function fetchLatestVersion(): Promise<string | null>;
|
|
2
|
-
export declare function getGlobalInstalledVersion(): Promise<string | null>;
|
|
3
|
-
export declare function getLocalInstalledVersion(cwd: string): Promise<string | null>;
|
|
4
|
-
export declare function updateGlobal(): Promise<void>;
|
|
5
|
-
export declare function updateLocal(cwd: string): Promise<void>;
|
|
6
|
-
export declare function isOutdated(current: string, latest: string): boolean;
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { execFile as execFileCb, spawn } from 'node:child_process';
|
|
2
|
-
import { promisify } from 'node:util';
|
|
3
|
-
import debugFactory from 'debug';
|
|
4
|
-
import semver from 'semver';
|
|
5
|
-
import packageJson from '../../package.json' with { type: 'json' };
|
|
6
|
-
const execFile = promisify(execFileCb);
|
|
7
|
-
const debug = debugFactory('output-cli:npm-update');
|
|
8
|
-
const PACKAGE_NAME = packageJson.name;
|
|
9
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
10
|
-
function findVersionInTree(deps) {
|
|
11
|
-
if (!deps) {
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
if (deps[PACKAGE_NAME]?.version) {
|
|
15
|
-
return deps[PACKAGE_NAME].version;
|
|
16
|
-
}
|
|
17
|
-
for (const dep of Object.values(deps)) {
|
|
18
|
-
const found = findVersionInTree(dep.dependencies);
|
|
19
|
-
if (found) {
|
|
20
|
-
return found;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
function parseNpmLsVersion(output) {
|
|
26
|
-
try {
|
|
27
|
-
const parsed = JSON.parse(output);
|
|
28
|
-
return findVersionInTree(parsed.dependencies);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export async function fetchLatestVersion() {
|
|
35
|
-
try {
|
|
36
|
-
const { stdout } = await execFile('npm', ['view', PACKAGE_NAME, 'version']);
|
|
37
|
-
const version = stdout.trim();
|
|
38
|
-
return version || null;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
debug('Failed to fetch latest version: %O', error);
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export async function getGlobalInstalledVersion() {
|
|
46
|
-
try {
|
|
47
|
-
const { stdout } = await execFile('npm', ['ls', '-g', PACKAGE_NAME, '--json']);
|
|
48
|
-
return parseNpmLsVersion(stdout);
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
debug('Failed to get global version: %O', error);
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export async function getLocalInstalledVersion(cwd) {
|
|
56
|
-
try {
|
|
57
|
-
const { stdout } = await execFile('npm', ['ls', PACKAGE_NAME, '--json'], { cwd });
|
|
58
|
-
return parseNpmLsVersion(stdout);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
debug('Failed to get local version: %O', error);
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
function spawnInherit(command, args, cwd) {
|
|
66
|
-
return new Promise((resolve, reject) => {
|
|
67
|
-
const proc = spawn(command, args, { cwd, stdio: 'inherit' });
|
|
68
|
-
proc.on('error', reject);
|
|
69
|
-
proc.on('close', code => {
|
|
70
|
-
if (code === 0) {
|
|
71
|
-
resolve();
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
reject(new Error(`${command} exited with code ${code}`));
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
export async function updateGlobal() {
|
|
80
|
-
await spawnInherit('npm', ['install', '-g', '--ignore-scripts', `${PACKAGE_NAME}@latest`]);
|
|
81
|
-
}
|
|
82
|
-
export async function updateLocal(cwd) {
|
|
83
|
-
await spawnInherit('npm', ['update', '--ignore-scripts', PACKAGE_NAME], cwd);
|
|
84
|
-
}
|
|
85
|
-
export function isOutdated(current, latest) {
|
|
86
|
-
return semver.lt(current, latest);
|
|
87
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
2
|
-
import { fetchLatestVersion, getGlobalInstalledVersion, getLocalInstalledVersion, isOutdated } from './npm_update_service.js';
|
|
3
|
-
const { mockExecFile } = vi.hoisted(() => ({ mockExecFile: vi.fn() }));
|
|
4
|
-
vi.mock('node:child_process', () => ({
|
|
5
|
-
execFile: vi.fn(),
|
|
6
|
-
spawn: vi.fn()
|
|
7
|
-
}));
|
|
8
|
-
vi.mock('node:util', () => ({
|
|
9
|
-
promisify: vi.fn(() => mockExecFile)
|
|
10
|
-
}));
|
|
11
|
-
describe('npm_update_service', () => {
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
vi.clearAllMocks();
|
|
14
|
-
});
|
|
15
|
-
describe('fetchLatestVersion', () => {
|
|
16
|
-
it('should return version from npm view output', async () => {
|
|
17
|
-
mockExecFile.mockResolvedValue({ stdout: '1.2.3\n' });
|
|
18
|
-
const result = await fetchLatestVersion();
|
|
19
|
-
expect(result).toBe('1.2.3');
|
|
20
|
-
expect(mockExecFile).toHaveBeenCalledWith('npm', ['view', '@outputai/cli', 'version']);
|
|
21
|
-
});
|
|
22
|
-
it('should return null on empty output', async () => {
|
|
23
|
-
mockExecFile.mockResolvedValue({ stdout: '' });
|
|
24
|
-
const result = await fetchLatestVersion();
|
|
25
|
-
expect(result).toBeNull();
|
|
26
|
-
});
|
|
27
|
-
it('should return null on whitespace-only output', async () => {
|
|
28
|
-
mockExecFile.mockResolvedValue({ stdout: ' \n' });
|
|
29
|
-
const result = await fetchLatestVersion();
|
|
30
|
-
expect(result).toBeNull();
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe('getGlobalInstalledVersion', () => {
|
|
34
|
-
it('should parse version from npm ls -g output', async () => {
|
|
35
|
-
const output = JSON.stringify({
|
|
36
|
-
dependencies: { '@outputai/cli': { version: '0.8.4' } }
|
|
37
|
-
});
|
|
38
|
-
mockExecFile.mockResolvedValue({ stdout: output });
|
|
39
|
-
const result = await getGlobalInstalledVersion();
|
|
40
|
-
expect(result).toBe('0.8.4');
|
|
41
|
-
expect(mockExecFile).toHaveBeenCalledWith('npm', ['ls', '-g', '@outputai/cli', '--json']);
|
|
42
|
-
});
|
|
43
|
-
it('should return null when not installed globally', async () => {
|
|
44
|
-
mockExecFile.mockResolvedValue({ stdout: JSON.stringify({}) });
|
|
45
|
-
const result = await getGlobalInstalledVersion();
|
|
46
|
-
expect(result).toBeNull();
|
|
47
|
-
});
|
|
48
|
-
it('should return null on invalid JSON', async () => {
|
|
49
|
-
mockExecFile.mockResolvedValue({ stdout: 'not json' });
|
|
50
|
-
const result = await getGlobalInstalledVersion();
|
|
51
|
-
expect(result).toBeNull();
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
describe('getLocalInstalledVersion', () => {
|
|
55
|
-
it('should parse version from npm ls output', async () => {
|
|
56
|
-
const output = JSON.stringify({
|
|
57
|
-
dependencies: { '@outputai/cli': { version: '0.8.3' } }
|
|
58
|
-
});
|
|
59
|
-
mockExecFile.mockResolvedValue({ stdout: output });
|
|
60
|
-
const result = await getLocalInstalledVersion('/some/project');
|
|
61
|
-
expect(result).toBe('0.8.3');
|
|
62
|
-
expect(mockExecFile).toHaveBeenCalledWith('npm', ['ls', '@outputai/cli', '--json'], { cwd: '/some/project' });
|
|
63
|
-
});
|
|
64
|
-
it('should find version in transitive dependencies', async () => {
|
|
65
|
-
const output = JSON.stringify({
|
|
66
|
-
dependencies: {
|
|
67
|
-
'@outputai/output': {
|
|
68
|
-
version: '0.2.0',
|
|
69
|
-
dependencies: {
|
|
70
|
-
'@outputai/cli': { version: '0.8.0' }
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
mockExecFile.mockResolvedValue({ stdout: output });
|
|
76
|
-
const result = await getLocalInstalledVersion('/some/project');
|
|
77
|
-
expect(result).toBe('0.8.0');
|
|
78
|
-
});
|
|
79
|
-
it('should return null when not installed locally', async () => {
|
|
80
|
-
mockExecFile.mockResolvedValue({ stdout: JSON.stringify({}) });
|
|
81
|
-
const result = await getLocalInstalledVersion('/some/project');
|
|
82
|
-
expect(result).toBeNull();
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
describe('isOutdated', () => {
|
|
86
|
-
it('should return true when latest is newer', () => {
|
|
87
|
-
expect(isOutdated('0.8.4', '0.8.5')).toBe(true);
|
|
88
|
-
expect(isOutdated('0.8.4', '0.9.0')).toBe(true);
|
|
89
|
-
expect(isOutdated('0.8.4', '1.0.0')).toBe(true);
|
|
90
|
-
});
|
|
91
|
-
it('should return false when versions are equal', () => {
|
|
92
|
-
expect(isOutdated('0.8.4', '0.8.4')).toBe(false);
|
|
93
|
-
expect(isOutdated('1.0.0', '1.0.0')).toBe(false);
|
|
94
|
-
});
|
|
95
|
-
it('should return false when current is newer', () => {
|
|
96
|
-
expect(isOutdated('0.9.0', '0.8.4')).toBe(false);
|
|
97
|
-
expect(isOutdated('1.0.0', '0.9.9')).toBe(false);
|
|
98
|
-
});
|
|
99
|
-
it('should handle prerelease versions', () => {
|
|
100
|
-
expect(isOutdated('1.0.0-beta.1', '1.0.0')).toBe(true);
|
|
101
|
-
expect(isOutdated('1.0.0', '1.0.0-beta.1')).toBe(false);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
});
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
interface ProjectConfig {
|
|
2
|
-
projectName: string;
|
|
3
|
-
folderName: string;
|
|
4
|
-
projectPath: string;
|
|
5
|
-
description: string;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Check for required dependencies (Docker and Claude CLI)
|
|
9
|
-
* Prompts user to continue if dependencies are missing
|
|
10
|
-
* @throws UserCancelledError if user declines to proceed without dependencies
|
|
11
|
-
*/
|
|
12
|
-
export declare function checkDependencies(): Promise<void>;
|
|
13
|
-
/**
|
|
14
|
-
* Get project configuration from user input
|
|
15
|
-
* @param userFolderNameArg - Optional folder name to skip folder name prompt
|
|
16
|
-
*/
|
|
17
|
-
export declare const getProjectConfig: (userFolderNameArg?: string) => Promise<ProjectConfig>;
|
|
18
|
-
/**
|
|
19
|
-
* Create a SIGINT handler for cleanup during init
|
|
20
|
-
* Exits immediately without prompting to avoid race conditions
|
|
21
|
-
* @param projectPath - Path to the project folder
|
|
22
|
-
* @param folderCreated - Whether the folder has been created
|
|
23
|
-
*/
|
|
24
|
-
export declare function createSigintHandler(projectPath: string, folderCreated: boolean): () => void;
|
|
25
|
-
/**
|
|
26
|
-
* Run the init command workflow
|
|
27
|
-
* @param skipEnv - Whether to skip environment configuration prompts
|
|
28
|
-
* @param folderName - Optional folder name to skip folder name prompt
|
|
29
|
-
*/
|
|
30
|
-
export declare function runInit(skipEnv?: boolean, folderName?: string): Promise<void>;
|
|
31
|
-
export {};
|