@outputai/cli 0.14.0 → 0.14.1-next.51e8690.0
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/dist/assets/docker/docker-compose-dev.yml +1 -1
- package/dist/commands/credentials/get.js +1 -1
- package/dist/commands/credentials/get.spec.js +1 -1
- package/dist/commands/fix.js +5 -1
- package/dist/commands/fix.spec.js +13 -1
- package/dist/generated/framework_version.json +1 -1
- package/dist/services/credentials_service.integration.test.js +1 -1
- package/dist/services/credentials_service.js +1 -1
- package/dist/services/credentials_service.spec.js +1 -1
- package/dist/services/fix_package.d.ts +2 -1
- package/dist/services/fix_package.js +15 -1
- package/dist/services/fix_package.spec.js +32 -0
- package/dist/services/messages.js +1 -1
- package/dist/templates/project/package.json.template +0 -3
- package/dist/utils/credentials_loader.js +1 -1
- package/dist/utils/credentials_loader.spec.js +3 -3
- package/oclif.manifest.json +138 -138
- package/package.json +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Args, Command, Flags } from '@oclif/core';
|
|
2
2
|
import { load as parseYaml } from 'js-yaml';
|
|
3
|
-
import { getNestedValue } from '@outputai/credentials';
|
|
3
|
+
import { getNestedValue } from '@outputai/core/credentials';
|
|
4
4
|
import { decryptCredentials, credentialsExist, resolveCredentialsPath } from '#services/credentials_service.js';
|
|
5
5
|
export default class CredentialsGet extends Command {
|
|
6
6
|
static description = 'Get a specific credential value by dot-notation path';
|
|
@@ -6,7 +6,7 @@ vi.mock('#services/credentials_service.js');
|
|
|
6
6
|
vi.mock('js-yaml', () => ({
|
|
7
7
|
load: vi.fn((yaml) => ({ anthropic: { api_key: yaml.includes('sk-test') ? 'sk-test' : undefined } }))
|
|
8
8
|
}));
|
|
9
|
-
vi.mock('@outputai/credentials', () => ({
|
|
9
|
+
vi.mock('@outputai/core/credentials', () => ({
|
|
10
10
|
getNestedValue: vi.fn((obj, path) => {
|
|
11
11
|
const parts = path.split('.');
|
|
12
12
|
return parts.reduce((acc, part) => acc?.[part], obj);
|
package/dist/commands/fix.js
CHANGED
|
@@ -9,7 +9,7 @@ const Ansi = {
|
|
|
9
9
|
RESET: '\x1b[0m'
|
|
10
10
|
};
|
|
11
11
|
export default class Fix extends Command {
|
|
12
|
-
static description = 'Fix Output scripts in the package.json (reset overwrites, add missing and remove deprecated)';
|
|
12
|
+
static description = 'Fix Output scripts in the package.json (reset overwrites, add missing and remove deprecated) and remove stale hook files';
|
|
13
13
|
static examples = [
|
|
14
14
|
'<%= config.bin %> <%= command.id %>'
|
|
15
15
|
];
|
|
@@ -30,6 +30,10 @@ export default class Fix extends Command {
|
|
|
30
30
|
this.log('\n Scripts to remove:');
|
|
31
31
|
plan.scriptsToRemove.forEach(({ key }) => this.log(` ${Ansi.RED}-${Ansi.RESET} "${key}"`));
|
|
32
32
|
}
|
|
33
|
+
if (plan.hookFilesToRemove.length > 0) {
|
|
34
|
+
this.log('\n Hook files to remove:');
|
|
35
|
+
plan.hookFilesToRemove.forEach(file => this.log(` ${Ansi.RED}-${Ansi.RESET} "${file}"`));
|
|
36
|
+
}
|
|
33
37
|
this.log('');
|
|
34
38
|
}
|
|
35
39
|
async run() {
|
|
@@ -16,7 +16,8 @@ const basePlan = () => ({
|
|
|
16
16
|
hasChanges: true,
|
|
17
17
|
scriptsToRemove: [{ key: 'dev', value: 'old' }],
|
|
18
18
|
scriptsToAdd: [{ key: 'output:new', value: 'echo new' }],
|
|
19
|
-
scriptsToReplace: [{ key: 'output:dev', before: 'old dev', after: 'output dev' }]
|
|
19
|
+
scriptsToReplace: [{ key: 'output:dev', before: 'old dev', after: 'output dev' }],
|
|
20
|
+
hookFilesToRemove: []
|
|
20
21
|
});
|
|
21
22
|
describe('fix command', () => {
|
|
22
23
|
const createTestCommand = () => {
|
|
@@ -59,6 +60,17 @@ describe('fix command', () => {
|
|
|
59
60
|
expect(fixService.applyFix).toHaveBeenCalledTimes(1);
|
|
60
61
|
expect(cmd.log).toHaveBeenCalledWith('Done, package.json is properly configured.');
|
|
61
62
|
});
|
|
63
|
+
it('should list hook files to remove', async () => {
|
|
64
|
+
vi.mocked(fixService.planFix).mockReturnValue({
|
|
65
|
+
...basePlan(),
|
|
66
|
+
hookFilesToRemove: ['node_modules/@outputai/credentials/dist/hooks.js']
|
|
67
|
+
});
|
|
68
|
+
vi.mocked(confirm).mockResolvedValue(false);
|
|
69
|
+
const cmd = createTestCommand();
|
|
70
|
+
await cmd.run();
|
|
71
|
+
expect(cmd.log).toHaveBeenCalledWith('\n Hook files to remove:');
|
|
72
|
+
expect(cmd.log).toHaveBeenCalledWith(expect.stringContaining('"node_modules/@outputai/credentials/dist/hooks.js"'));
|
|
73
|
+
});
|
|
62
74
|
it('should not apply when user declines', async () => {
|
|
63
75
|
vi.mocked(fixService.planFix).mockReturnValue(basePlan());
|
|
64
76
|
vi.mocked(confirm).mockResolvedValue(false);
|
|
@@ -3,7 +3,7 @@ import fs from 'node:fs';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
import { load as parseYaml } from 'js-yaml';
|
|
6
|
-
import { encrypt, decrypt, generateKey } from '@outputai/credentials';
|
|
6
|
+
import { encrypt, decrypt, generateKey } from '@outputai/core/credentials';
|
|
7
7
|
import { initCredentials, decryptCredentials, writeEncrypted, checkKeyMatchesCredentials } from './credentials_service.js';
|
|
8
8
|
describe('credentials service integration', () => {
|
|
9
9
|
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'output-creds-'));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { dump as stringifyYaml } from 'js-yaml';
|
|
4
|
-
import { encrypt, decrypt, generateKey, resolveCredentialsPath as resolveCredPath, resolveKeyPath as resolveKPath, resolveKeyEnvVar, resolveWorkflowCredentialsPath, resolveWorkflowKeyPath, resolveWorkflowKeyEnvVar } from '@outputai/credentials';
|
|
4
|
+
import { encrypt, decrypt, generateKey, resolveCredentialsPath as resolveCredPath, resolveKeyPath as resolveKPath, resolveKeyEnvVar, resolveWorkflowCredentialsPath, resolveWorkflowKeyPath, resolveWorkflowKeyEnvVar } from '@outputai/core/credentials';
|
|
5
5
|
const WORKFLOWS_DIR = path.join('src', 'workflows');
|
|
6
6
|
const resolveWorkflowDir = (workflow) => path.resolve(process.cwd(), WORKFLOWS_DIR, workflow);
|
|
7
7
|
export const resolveCredentialsPath = (environment, workflow) => workflow ?
|
|
@@ -8,7 +8,7 @@ vi.mock('node:fs', () => ({
|
|
|
8
8
|
mkdirSync: vi.fn()
|
|
9
9
|
}
|
|
10
10
|
}));
|
|
11
|
-
vi.mock('@outputai/credentials', async (importOriginal) => ({
|
|
11
|
+
vi.mock('@outputai/core/credentials', async (importOriginal) => ({
|
|
12
12
|
...(await importOriginal()),
|
|
13
13
|
encrypt: vi.fn((plaintext) => `encrypted:${plaintext}`),
|
|
14
14
|
decrypt: vi.fn((ciphertext) => ciphertext.replace('encrypted:', '')),
|
|
@@ -14,7 +14,7 @@ export interface ScriptToReplace {
|
|
|
14
14
|
after: string;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* Plan for aligning `scripts` with the scaffold template (reads only; no write until apply).
|
|
17
|
+
* Plan for aligning `scripts` with the scaffold template and dropping stale hook files (reads only; no write until apply).
|
|
18
18
|
*/
|
|
19
19
|
export interface FixPlan {
|
|
20
20
|
packageJsonPath: string;
|
|
@@ -23,6 +23,7 @@ export interface FixPlan {
|
|
|
23
23
|
scriptsToRemove: ScriptToRemove[];
|
|
24
24
|
scriptsToReplace: ScriptToReplace[];
|
|
25
25
|
scriptsToAdd: ScriptToAdd[];
|
|
26
|
+
hookFilesToRemove: string[];
|
|
26
27
|
}
|
|
27
28
|
/**
|
|
28
29
|
* Computes the package.json rewrite without writing. Use with {@link applyFix}.
|
|
@@ -6,6 +6,8 @@ const packageJson = 'package.json';
|
|
|
6
6
|
const templateRelativePath = path.join('templates', 'project', 'package.json.template');
|
|
7
7
|
/** Legacy script names from older versions of the project */
|
|
8
8
|
export const legacyScripts = ['dev'];
|
|
9
|
+
/** Hook files from the @outputai/credentials package, which was folded into @outputai/core */
|
|
10
|
+
const credentialsHookFilePattern = /@outputai[\\/]credentials([\\/]|$)/;
|
|
9
11
|
function getTemplatesPackageJsonPath() {
|
|
10
12
|
const __filename = fileURLToPath(import.meta.url);
|
|
11
13
|
const __dirname = path.dirname(__filename);
|
|
@@ -34,6 +36,16 @@ function parsePackageJsonObject(raw, packagePath) {
|
|
|
34
36
|
throw new Error(`File ${packagePath} is not a valid JSON.`, { cause: error });
|
|
35
37
|
}
|
|
36
38
|
}
|
|
39
|
+
function removeCredentialsHookFiles(pkg) {
|
|
40
|
+
const section = pkg.outputai;
|
|
41
|
+
if (typeof section !== 'object' || section === null || !Array.isArray(section.hookFiles)) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
const hookFiles = section.hookFiles;
|
|
45
|
+
const removed = hookFiles.filter((file) => typeof file === 'string' && credentialsHookFilePattern.test(file));
|
|
46
|
+
section.hookFiles = hookFiles.filter(file => !removed.includes(file));
|
|
47
|
+
return removed;
|
|
48
|
+
}
|
|
37
49
|
function parseTemplatePackageJson(processed) {
|
|
38
50
|
try {
|
|
39
51
|
return JSON.parse(processed);
|
|
@@ -83,6 +95,7 @@ export function planFix(projectRoot) {
|
|
|
83
95
|
scripts[key] = after;
|
|
84
96
|
}
|
|
85
97
|
pkg.scripts = scripts;
|
|
98
|
+
const hookFilesToRemove = removeCredentialsHookFiles(pkg);
|
|
86
99
|
const packageJsonUpdatedContent = `${JSON.stringify(pkg, null, 2)}\n`;
|
|
87
100
|
const hasChanges = packageJsonUpdatedContent !== raw;
|
|
88
101
|
return {
|
|
@@ -91,7 +104,8 @@ export function planFix(projectRoot) {
|
|
|
91
104
|
hasChanges,
|
|
92
105
|
scriptsToRemove,
|
|
93
106
|
scriptsToReplace,
|
|
94
|
-
scriptsToAdd
|
|
107
|
+
scriptsToAdd,
|
|
108
|
+
hookFilesToRemove
|
|
95
109
|
};
|
|
96
110
|
}
|
|
97
111
|
/**
|
|
@@ -52,6 +52,38 @@ describe('fix package', () => {
|
|
|
52
52
|
'output:worker:watch'
|
|
53
53
|
].sort());
|
|
54
54
|
});
|
|
55
|
+
it('should remove hook files pointing to @outputai/credentials and keep the others', async () => {
|
|
56
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'fix-test-'));
|
|
57
|
+
const pkg = {
|
|
58
|
+
name: 'my-proj',
|
|
59
|
+
outputai: {
|
|
60
|
+
hookFiles: [
|
|
61
|
+
'dist/hooks/cost_hooks.js',
|
|
62
|
+
'node_modules/@outputai/credentials/dist/hooks.js',
|
|
63
|
+
'dist/hooks/register_credentials.js'
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
await fs.writeFile(path.join(tmpDir, 'package.json'), JSON.stringify(pkg, null, 2), 'utf-8');
|
|
68
|
+
const plan = planFix(tmpDir);
|
|
69
|
+
expect(plan.hookFilesToRemove).toEqual(['node_modules/@outputai/credentials/dist/hooks.js']);
|
|
70
|
+
applyFix(plan);
|
|
71
|
+
const next = JSON.parse(await fs.readFile(path.join(tmpDir, 'package.json'), 'utf-8'));
|
|
72
|
+
expect(next.outputai.hookFiles).toEqual(['dist/hooks/cost_hooks.js', 'dist/hooks/register_credentials.js']);
|
|
73
|
+
});
|
|
74
|
+
it('should leave outputai untouched when hookFiles is missing or not an array', async () => {
|
|
75
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'fix-test-'));
|
|
76
|
+
const missing = { name: 'my-proj', outputai: {} };
|
|
77
|
+
await fs.writeFile(path.join(tmpDir, 'package.json'), JSON.stringify(missing, null, 2), 'utf-8');
|
|
78
|
+
const missingPlan = planFix(tmpDir);
|
|
79
|
+
expect(missingPlan.hookFilesToRemove).toEqual([]);
|
|
80
|
+
expect(JSON.parse(missingPlan.packageJsonUpdatedContent).outputai).toEqual({});
|
|
81
|
+
const malformed = { name: 'my-proj', outputai: { hookFiles: 'node_modules/@outputai/credentials/dist/hooks.js' } };
|
|
82
|
+
await fs.writeFile(path.join(tmpDir, 'package.json'), JSON.stringify(malformed, null, 2), 'utf-8');
|
|
83
|
+
const malformedPlan = planFix(tmpDir);
|
|
84
|
+
expect(malformedPlan.hookFilesToRemove).toEqual([]);
|
|
85
|
+
expect(JSON.parse(malformedPlan.packageJsonUpdatedContent).outputai).toEqual(malformed.outputai);
|
|
86
|
+
});
|
|
55
87
|
it('should throw when package.json is missing', async () => {
|
|
56
88
|
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'fix-test-'));
|
|
57
89
|
expect(() => planFix(tmpDir)).toThrow(/No package\.json found/);
|
|
@@ -168,7 +168,7 @@ export const getProjectSuccessMessage = (folderName, installSuccess, credentials
|
|
|
168
168
|
steps.push({
|
|
169
169
|
step: 'Add your API credentials',
|
|
170
170
|
command: 'npx output credentials edit',
|
|
171
|
-
note: 'Learn more: https://docs.output.ai/packages/credentials'
|
|
171
|
+
note: 'Learn more: https://docs.output.ai/packages/core/credentials'
|
|
172
172
|
});
|
|
173
173
|
}
|
|
174
174
|
steps.push({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InvalidCredentialsKeyError, MalformedCredentialsKeyError, MissingKeyError, resolveCredentialRefs } from '@outputai/credentials';
|
|
1
|
+
import { InvalidCredentialsKeyError, MalformedCredentialsKeyError, MissingKeyError, resolveCredentialRefs } from '@outputai/core/credentials';
|
|
2
2
|
const isCredentialsConfigError = (error) => error instanceof MissingKeyError ||
|
|
3
3
|
error instanceof InvalidCredentialsKeyError ||
|
|
4
4
|
error instanceof MalformedCredentialsKeyError;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import * as credentials from '@outputai/credentials';
|
|
2
|
+
import * as credentials from '@outputai/core/credentials';
|
|
3
3
|
import { loadCredentialRefs } from './credentials_loader.js';
|
|
4
|
-
vi.mock('@outputai/credentials', async () => {
|
|
5
|
-
const actual = await vi.importActual('@outputai/credentials');
|
|
4
|
+
vi.mock('@outputai/core/credentials', async () => {
|
|
5
|
+
const actual = await vi.importActual('@outputai/core/credentials');
|
|
6
6
|
return {
|
|
7
7
|
...actual,
|
|
8
8
|
resolveCredentialRefs: vi.fn()
|
package/oclif.manifest.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"fix": {
|
|
4
4
|
"aliases": [],
|
|
5
5
|
"args": {},
|
|
6
|
-
"description": "Fix Output scripts in the package.json (reset overwrites, add missing and remove deprecated)",
|
|
6
|
+
"description": "Fix Output scripts in the package.json (reset overwrites, add missing and remove deprecated) and remove stale hook files",
|
|
7
7
|
"examples": [
|
|
8
8
|
"<%= config.bin %> <%= command.id %>"
|
|
9
9
|
],
|
|
@@ -156,6 +156,142 @@
|
|
|
156
156
|
"update.js"
|
|
157
157
|
]
|
|
158
158
|
},
|
|
159
|
+
"dev:down": {
|
|
160
|
+
"aliases": [],
|
|
161
|
+
"args": {},
|
|
162
|
+
"description": "Stop Output development services started by `output dev`\n\nUseful after `output dev -d`, or when an attached `output dev` session\nleft the services running on quit.",
|
|
163
|
+
"examples": [
|
|
164
|
+
"<%= config.bin %> <%= command.id %>",
|
|
165
|
+
"<%= config.bin %> <%= command.id %> --compose-file ./custom-docker-compose.yml"
|
|
166
|
+
],
|
|
167
|
+
"flags": {
|
|
168
|
+
"compose-file": {
|
|
169
|
+
"char": "f",
|
|
170
|
+
"description": "Path to a custom docker-compose file",
|
|
171
|
+
"name": "compose-file",
|
|
172
|
+
"required": false,
|
|
173
|
+
"hasDynamicHelp": false,
|
|
174
|
+
"multiple": false,
|
|
175
|
+
"type": "option"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
"hasDynamicHelp": false,
|
|
179
|
+
"hiddenAliases": [],
|
|
180
|
+
"id": "dev:down",
|
|
181
|
+
"pluginAlias": "@outputai/cli",
|
|
182
|
+
"pluginName": "@outputai/cli",
|
|
183
|
+
"pluginType": "core",
|
|
184
|
+
"strict": true,
|
|
185
|
+
"enableJsonFlag": false,
|
|
186
|
+
"isESM": true,
|
|
187
|
+
"relativePath": [
|
|
188
|
+
"dist",
|
|
189
|
+
"commands",
|
|
190
|
+
"dev",
|
|
191
|
+
"down.js"
|
|
192
|
+
]
|
|
193
|
+
},
|
|
194
|
+
"dev:eject": {
|
|
195
|
+
"aliases": [],
|
|
196
|
+
"args": {},
|
|
197
|
+
"description": "Eject the Docker Compose configuration to your project root for customization",
|
|
198
|
+
"examples": [
|
|
199
|
+
"<%= config.bin %> <%= command.id %>",
|
|
200
|
+
"<%= config.bin %> <%= command.id %> --output ./custom-compose.yml"
|
|
201
|
+
],
|
|
202
|
+
"flags": {
|
|
203
|
+
"output": {
|
|
204
|
+
"char": "o",
|
|
205
|
+
"description": "Output path for the docker-compose file",
|
|
206
|
+
"name": "output",
|
|
207
|
+
"required": false,
|
|
208
|
+
"default": "docker-compose.yml",
|
|
209
|
+
"hasDynamicHelp": false,
|
|
210
|
+
"multiple": false,
|
|
211
|
+
"type": "option"
|
|
212
|
+
},
|
|
213
|
+
"force": {
|
|
214
|
+
"char": "f",
|
|
215
|
+
"description": "Overwrite existing file without prompting",
|
|
216
|
+
"name": "force",
|
|
217
|
+
"required": false,
|
|
218
|
+
"allowNo": false,
|
|
219
|
+
"type": "boolean"
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
"hasDynamicHelp": false,
|
|
223
|
+
"hiddenAliases": [],
|
|
224
|
+
"id": "dev:eject",
|
|
225
|
+
"pluginAlias": "@outputai/cli",
|
|
226
|
+
"pluginName": "@outputai/cli",
|
|
227
|
+
"pluginType": "core",
|
|
228
|
+
"strict": true,
|
|
229
|
+
"enableJsonFlag": false,
|
|
230
|
+
"isESM": true,
|
|
231
|
+
"relativePath": [
|
|
232
|
+
"dist",
|
|
233
|
+
"commands",
|
|
234
|
+
"dev",
|
|
235
|
+
"eject.js"
|
|
236
|
+
]
|
|
237
|
+
},
|
|
238
|
+
"dev": {
|
|
239
|
+
"aliases": [],
|
|
240
|
+
"args": {},
|
|
241
|
+
"description": "Start Output development services (auto-restarts worker on file changes)\n\nIf services are already running (e.g. after `output dev -d`), this attaches\nto monitor them rather than treating our own containers as a port collision.\nQuitting an attached session leaves the services running — stop them with\n`output dev down`.\n\nTo run a second dev stack concurrently, give it its own compose project and\nhost ports in .env — without DOCKER_SERVICE_NAME both checkouts share one\nstack, and the second will attach to the first instead of starting:\n\n DOCKER_SERVICE_NAME=output-sdk-two\n OUTPUT_API_HOST_PORT=3002\n OUTPUT_TEMPORAL_UI_HOST_PORT=8081\n OUTPUT_TEMPORAL_HOST_PORT=7234",
|
|
242
|
+
"examples": [
|
|
243
|
+
"<%= config.bin %> <%= command.id %>",
|
|
244
|
+
"<%= config.bin %> <%= command.id %> --detached",
|
|
245
|
+
"<%= config.bin %> <%= command.id %> --compose-file ./custom-docker-compose.yml",
|
|
246
|
+
"<%= config.bin %> <%= command.id %> --image-pull-policy missing"
|
|
247
|
+
],
|
|
248
|
+
"flags": {
|
|
249
|
+
"compose-file": {
|
|
250
|
+
"char": "f",
|
|
251
|
+
"description": "Path to a custom docker-compose file",
|
|
252
|
+
"name": "compose-file",
|
|
253
|
+
"required": false,
|
|
254
|
+
"hasDynamicHelp": false,
|
|
255
|
+
"multiple": false,
|
|
256
|
+
"type": "option"
|
|
257
|
+
},
|
|
258
|
+
"image-pull-policy": {
|
|
259
|
+
"description": "Image pull policy for docker compose (always, missing, never)",
|
|
260
|
+
"name": "image-pull-policy",
|
|
261
|
+
"default": "always",
|
|
262
|
+
"hasDynamicHelp": false,
|
|
263
|
+
"multiple": false,
|
|
264
|
+
"options": [
|
|
265
|
+
"always",
|
|
266
|
+
"missing",
|
|
267
|
+
"never"
|
|
268
|
+
],
|
|
269
|
+
"type": "option"
|
|
270
|
+
},
|
|
271
|
+
"detached": {
|
|
272
|
+
"char": "d",
|
|
273
|
+
"description": "Start services in detached (background) mode and exit immediately",
|
|
274
|
+
"name": "detached",
|
|
275
|
+
"allowNo": false,
|
|
276
|
+
"type": "boolean"
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
"hasDynamicHelp": false,
|
|
280
|
+
"hiddenAliases": [],
|
|
281
|
+
"id": "dev",
|
|
282
|
+
"pluginAlias": "@outputai/cli",
|
|
283
|
+
"pluginName": "@outputai/cli",
|
|
284
|
+
"pluginType": "core",
|
|
285
|
+
"strict": true,
|
|
286
|
+
"enableJsonFlag": false,
|
|
287
|
+
"isESM": true,
|
|
288
|
+
"relativePath": [
|
|
289
|
+
"dist",
|
|
290
|
+
"commands",
|
|
291
|
+
"dev",
|
|
292
|
+
"index.js"
|
|
293
|
+
]
|
|
294
|
+
},
|
|
159
295
|
"credentials:edit": {
|
|
160
296
|
"aliases": [],
|
|
161
297
|
"args": {},
|
|
@@ -416,142 +552,6 @@
|
|
|
416
552
|
"show.js"
|
|
417
553
|
]
|
|
418
554
|
},
|
|
419
|
-
"dev:down": {
|
|
420
|
-
"aliases": [],
|
|
421
|
-
"args": {},
|
|
422
|
-
"description": "Stop Output development services started by `output dev`\n\nUseful after `output dev -d`, or when an attached `output dev` session\nleft the services running on quit.",
|
|
423
|
-
"examples": [
|
|
424
|
-
"<%= config.bin %> <%= command.id %>",
|
|
425
|
-
"<%= config.bin %> <%= command.id %> --compose-file ./custom-docker-compose.yml"
|
|
426
|
-
],
|
|
427
|
-
"flags": {
|
|
428
|
-
"compose-file": {
|
|
429
|
-
"char": "f",
|
|
430
|
-
"description": "Path to a custom docker-compose file",
|
|
431
|
-
"name": "compose-file",
|
|
432
|
-
"required": false,
|
|
433
|
-
"hasDynamicHelp": false,
|
|
434
|
-
"multiple": false,
|
|
435
|
-
"type": "option"
|
|
436
|
-
}
|
|
437
|
-
},
|
|
438
|
-
"hasDynamicHelp": false,
|
|
439
|
-
"hiddenAliases": [],
|
|
440
|
-
"id": "dev:down",
|
|
441
|
-
"pluginAlias": "@outputai/cli",
|
|
442
|
-
"pluginName": "@outputai/cli",
|
|
443
|
-
"pluginType": "core",
|
|
444
|
-
"strict": true,
|
|
445
|
-
"enableJsonFlag": false,
|
|
446
|
-
"isESM": true,
|
|
447
|
-
"relativePath": [
|
|
448
|
-
"dist",
|
|
449
|
-
"commands",
|
|
450
|
-
"dev",
|
|
451
|
-
"down.js"
|
|
452
|
-
]
|
|
453
|
-
},
|
|
454
|
-
"dev:eject": {
|
|
455
|
-
"aliases": [],
|
|
456
|
-
"args": {},
|
|
457
|
-
"description": "Eject the Docker Compose configuration to your project root for customization",
|
|
458
|
-
"examples": [
|
|
459
|
-
"<%= config.bin %> <%= command.id %>",
|
|
460
|
-
"<%= config.bin %> <%= command.id %> --output ./custom-compose.yml"
|
|
461
|
-
],
|
|
462
|
-
"flags": {
|
|
463
|
-
"output": {
|
|
464
|
-
"char": "o",
|
|
465
|
-
"description": "Output path for the docker-compose file",
|
|
466
|
-
"name": "output",
|
|
467
|
-
"required": false,
|
|
468
|
-
"default": "docker-compose.yml",
|
|
469
|
-
"hasDynamicHelp": false,
|
|
470
|
-
"multiple": false,
|
|
471
|
-
"type": "option"
|
|
472
|
-
},
|
|
473
|
-
"force": {
|
|
474
|
-
"char": "f",
|
|
475
|
-
"description": "Overwrite existing file without prompting",
|
|
476
|
-
"name": "force",
|
|
477
|
-
"required": false,
|
|
478
|
-
"allowNo": false,
|
|
479
|
-
"type": "boolean"
|
|
480
|
-
}
|
|
481
|
-
},
|
|
482
|
-
"hasDynamicHelp": false,
|
|
483
|
-
"hiddenAliases": [],
|
|
484
|
-
"id": "dev:eject",
|
|
485
|
-
"pluginAlias": "@outputai/cli",
|
|
486
|
-
"pluginName": "@outputai/cli",
|
|
487
|
-
"pluginType": "core",
|
|
488
|
-
"strict": true,
|
|
489
|
-
"enableJsonFlag": false,
|
|
490
|
-
"isESM": true,
|
|
491
|
-
"relativePath": [
|
|
492
|
-
"dist",
|
|
493
|
-
"commands",
|
|
494
|
-
"dev",
|
|
495
|
-
"eject.js"
|
|
496
|
-
]
|
|
497
|
-
},
|
|
498
|
-
"dev": {
|
|
499
|
-
"aliases": [],
|
|
500
|
-
"args": {},
|
|
501
|
-
"description": "Start Output development services (auto-restarts worker on file changes)\n\nIf services are already running (e.g. after `output dev -d`), this attaches\nto monitor them rather than treating our own containers as a port collision.\nQuitting an attached session leaves the services running — stop them with\n`output dev down`.\n\nTo run a second dev stack concurrently, give it its own compose project and\nhost ports in .env — without DOCKER_SERVICE_NAME both checkouts share one\nstack, and the second will attach to the first instead of starting:\n\n DOCKER_SERVICE_NAME=output-sdk-two\n OUTPUT_API_HOST_PORT=3002\n OUTPUT_TEMPORAL_UI_HOST_PORT=8081\n OUTPUT_TEMPORAL_HOST_PORT=7234",
|
|
502
|
-
"examples": [
|
|
503
|
-
"<%= config.bin %> <%= command.id %>",
|
|
504
|
-
"<%= config.bin %> <%= command.id %> --detached",
|
|
505
|
-
"<%= config.bin %> <%= command.id %> --compose-file ./custom-docker-compose.yml",
|
|
506
|
-
"<%= config.bin %> <%= command.id %> --image-pull-policy missing"
|
|
507
|
-
],
|
|
508
|
-
"flags": {
|
|
509
|
-
"compose-file": {
|
|
510
|
-
"char": "f",
|
|
511
|
-
"description": "Path to a custom docker-compose file",
|
|
512
|
-
"name": "compose-file",
|
|
513
|
-
"required": false,
|
|
514
|
-
"hasDynamicHelp": false,
|
|
515
|
-
"multiple": false,
|
|
516
|
-
"type": "option"
|
|
517
|
-
},
|
|
518
|
-
"image-pull-policy": {
|
|
519
|
-
"description": "Image pull policy for docker compose (always, missing, never)",
|
|
520
|
-
"name": "image-pull-policy",
|
|
521
|
-
"default": "always",
|
|
522
|
-
"hasDynamicHelp": false,
|
|
523
|
-
"multiple": false,
|
|
524
|
-
"options": [
|
|
525
|
-
"always",
|
|
526
|
-
"missing",
|
|
527
|
-
"never"
|
|
528
|
-
],
|
|
529
|
-
"type": "option"
|
|
530
|
-
},
|
|
531
|
-
"detached": {
|
|
532
|
-
"char": "d",
|
|
533
|
-
"description": "Start services in detached (background) mode and exit immediately",
|
|
534
|
-
"name": "detached",
|
|
535
|
-
"allowNo": false,
|
|
536
|
-
"type": "boolean"
|
|
537
|
-
}
|
|
538
|
-
},
|
|
539
|
-
"hasDynamicHelp": false,
|
|
540
|
-
"hiddenAliases": [],
|
|
541
|
-
"id": "dev",
|
|
542
|
-
"pluginAlias": "@outputai/cli",
|
|
543
|
-
"pluginName": "@outputai/cli",
|
|
544
|
-
"pluginType": "core",
|
|
545
|
-
"strict": true,
|
|
546
|
-
"enableJsonFlag": false,
|
|
547
|
-
"isESM": true,
|
|
548
|
-
"relativePath": [
|
|
549
|
-
"dist",
|
|
550
|
-
"commands",
|
|
551
|
-
"dev",
|
|
552
|
-
"index.js"
|
|
553
|
-
]
|
|
554
|
-
},
|
|
555
555
|
"workflow:cost": {
|
|
556
556
|
"aliases": [],
|
|
557
557
|
"args": {
|
|
@@ -1752,5 +1752,5 @@
|
|
|
1752
1752
|
]
|
|
1753
1753
|
}
|
|
1754
1754
|
},
|
|
1755
|
-
"version": "0.14.0"
|
|
1755
|
+
"version": "0.14.1-next.51e8690.0"
|
|
1756
1756
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@outputai/cli",
|
|
3
|
-
"version": "0.14.0",
|
|
3
|
+
"version": "0.14.1-next.51e8690.0",
|
|
4
4
|
"description": "CLI for Output.ai workflow generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
"react": "19.2.5",
|
|
37
37
|
"semver": "7.7.4",
|
|
38
38
|
"undici": "8.9.0",
|
|
39
|
-
"@outputai/
|
|
40
|
-
"@outputai/
|
|
41
|
-
"@outputai/
|
|
39
|
+
"@outputai/core": "0.14.1-next.51e8690.0",
|
|
40
|
+
"@outputai/llm": "0.14.1-next.51e8690.0",
|
|
41
|
+
"@outputai/evals": "0.14.1-next.51e8690.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/cli-progress": "3.11.6",
|