@wayai/cli 0.2.43 → 0.2.45
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/commands/create-credential.d.ts +18 -0
- package/dist/commands/create-credential.js +162 -0
- package/dist/commands/create-credential.js.map +1 -0
- package/dist/commands/create-project.d.ts +14 -0
- package/dist/commands/create-project.js +50 -0
- package/dist/commands/create-project.js.map +1 -0
- package/dist/commands/init.js +65 -52
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.js +29 -67
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/push.d.ts +2 -1
- package/dist/commands/push.js +131 -43
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.js +43 -26
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +43 -0
- package/dist/lib/api-client.js +24 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/auth.d.ts +24 -35
- package/dist/lib/auth.js +74 -121
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config.d.ts +2 -6
- package/dist/lib/config.js +10 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/parser.d.ts +5 -1
- package/dist/lib/parser.js +14 -18
- package/dist/lib/parser.js.map +1 -1
- package/dist/lib/repo-config.d.ts +18 -0
- package/dist/lib/repo-config.js +75 -1
- package/dist/lib/repo-config.js.map +1 -1
- package/dist/lib/sentry.d.ts +3 -2
- package/dist/lib/sentry.js +14 -2
- package/dist/lib/sentry.js.map +1 -1
- package/dist/lib/utils.d.ts +20 -0
- package/dist/lib/utils.js +48 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/workspace.d.ts +11 -0
- package/dist/lib/workspace.js +47 -0
- package/dist/lib/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai create-credential — create an organization credential (API key, token, or basic auth)
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai create-credential --name "openai-key" --type "Bearer Token"
|
|
6
|
+
* wayai create-credential --name "my-api" --type "Basic Auth" --org <uuid>
|
|
7
|
+
* echo "$SECRET" | wayai create-credential --name "openai-key" --type "Bearer Token" --stdin
|
|
8
|
+
*/
|
|
9
|
+
interface ParsedArgs {
|
|
10
|
+
name: string | undefined;
|
|
11
|
+
type: string | undefined;
|
|
12
|
+
orgId: string | undefined;
|
|
13
|
+
description: string | undefined;
|
|
14
|
+
stdin: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function parseArgs(args: string[]): ParsedArgs;
|
|
17
|
+
export declare function createCredentialCommand(args: string[]): Promise<void>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai create-credential — create an organization credential (API key, token, or basic auth)
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai create-credential --name "openai-key" --type "Bearer Token"
|
|
6
|
+
* wayai create-credential --name "my-api" --type "Basic Auth" --org <uuid>
|
|
7
|
+
* echo "$SECRET" | wayai create-credential --name "openai-key" --type "Bearer Token" --stdin
|
|
8
|
+
*/
|
|
9
|
+
import * as readline from 'node:readline';
|
|
10
|
+
import { requireAuth } from '../lib/auth.js';
|
|
11
|
+
import { ApiClient } from '../lib/api-client.js';
|
|
12
|
+
import { prompt, resolveOrganizationId } from '../lib/utils.js';
|
|
13
|
+
const VALID_AUTH_TYPES = ['API Key', 'Bearer Token', 'Basic Auth'];
|
|
14
|
+
export function parseArgs(args) {
|
|
15
|
+
let name;
|
|
16
|
+
let type;
|
|
17
|
+
let orgId;
|
|
18
|
+
let description;
|
|
19
|
+
let stdin = false;
|
|
20
|
+
for (let i = 0; i < args.length; i++) {
|
|
21
|
+
if (args[i] === '--name' && args[i + 1]) {
|
|
22
|
+
name = args[++i];
|
|
23
|
+
}
|
|
24
|
+
else if (args[i] === '--type' && args[i + 1]) {
|
|
25
|
+
type = args[++i];
|
|
26
|
+
}
|
|
27
|
+
else if (args[i] === '--org' && args[i + 1]) {
|
|
28
|
+
orgId = args[++i];
|
|
29
|
+
}
|
|
30
|
+
else if (args[i] === '--description' && args[i + 1]) {
|
|
31
|
+
description = args[++i];
|
|
32
|
+
}
|
|
33
|
+
else if (args[i] === '--stdin') {
|
|
34
|
+
stdin = true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { name, type, orgId, description, stdin };
|
|
38
|
+
}
|
|
39
|
+
/** Read a line from stdin with masked output (shows * for each character). */
|
|
40
|
+
function promptSecret(question) {
|
|
41
|
+
return new Promise((resolve) => {
|
|
42
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
43
|
+
// Mute output by replacing _writeToOutput
|
|
44
|
+
const originalWrite = rl._writeToOutput;
|
|
45
|
+
let firstWrite = true;
|
|
46
|
+
rl._writeToOutput = function (s) {
|
|
47
|
+
if (firstWrite) {
|
|
48
|
+
// Let the prompt question through
|
|
49
|
+
originalWrite.call(rl, s);
|
|
50
|
+
firstWrite = false;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Replace typed characters with *
|
|
54
|
+
originalWrite.call(rl, '*'.repeat(s.replace(/[\r\n]/g, '').length));
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
rl.question(question, (answer) => {
|
|
58
|
+
// Restore and print newline
|
|
59
|
+
rl._writeToOutput = originalWrite;
|
|
60
|
+
process.stdout.write('\n');
|
|
61
|
+
rl.close();
|
|
62
|
+
resolve(answer);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Read all of stdin as a single string (for piped input). */
|
|
67
|
+
function readStdin() {
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
let data = '';
|
|
70
|
+
process.stdin.setEncoding('utf-8');
|
|
71
|
+
process.stdin.on('data', (chunk) => { data += chunk; });
|
|
72
|
+
process.stdin.on('end', () => resolve(data.trim()));
|
|
73
|
+
process.stdin.on('error', reject);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export async function createCredentialCommand(args) {
|
|
77
|
+
const parsed = parseArgs(args);
|
|
78
|
+
if (!parsed.name) {
|
|
79
|
+
console.error('Missing required flag: --name <credential-name>');
|
|
80
|
+
console.error('Usage: wayai create-credential --name "openai-key" --type "Bearer Token"');
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
if (!parsed.type) {
|
|
84
|
+
console.error('Missing required flag: --type <auth-type>');
|
|
85
|
+
console.error(`Supported types: ${VALID_AUTH_TYPES.join(', ')}`);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
if (!VALID_AUTH_TYPES.includes(parsed.type)) {
|
|
89
|
+
console.error(`Invalid authentication type: "${parsed.type}"`);
|
|
90
|
+
console.error(`Supported types: ${VALID_AUTH_TYPES.join(', ')}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
const authType = parsed.type;
|
|
94
|
+
const { config, accessToken } = await requireAuth();
|
|
95
|
+
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
96
|
+
const { organizationId } = await resolveOrganizationId(client, parsed.orgId);
|
|
97
|
+
// Collect secret(s) based on auth type
|
|
98
|
+
const secrets = {};
|
|
99
|
+
if (parsed.stdin) {
|
|
100
|
+
if (process.stdin.isTTY) {
|
|
101
|
+
console.error('--stdin requires piped input. Example: echo "$SECRET" | wayai create-credential --name "key" --type "Bearer Token" --stdin');
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
const input = await readStdin();
|
|
105
|
+
if (!input) {
|
|
106
|
+
console.error('No input received from stdin.');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
switch (authType) {
|
|
110
|
+
case 'Bearer Token':
|
|
111
|
+
secrets.access_token = input;
|
|
112
|
+
break;
|
|
113
|
+
case 'API Key':
|
|
114
|
+
secrets.api_key = input;
|
|
115
|
+
break;
|
|
116
|
+
case 'Basic Auth': {
|
|
117
|
+
const colonIdx = input.indexOf(':');
|
|
118
|
+
if (colonIdx === -1) {
|
|
119
|
+
console.error('Basic Auth stdin format: username:password');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
secrets.username = input.slice(0, colonIdx);
|
|
123
|
+
secrets.password = input.slice(colonIdx + 1);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Interactive prompt with masked input
|
|
130
|
+
switch (authType) {
|
|
131
|
+
case 'Bearer Token':
|
|
132
|
+
secrets.access_token = await promptSecret('Enter access token: ');
|
|
133
|
+
break;
|
|
134
|
+
case 'API Key':
|
|
135
|
+
secrets.api_key = await promptSecret('Enter API key: ');
|
|
136
|
+
break;
|
|
137
|
+
case 'Basic Auth':
|
|
138
|
+
secrets.username = await prompt('Enter username: ');
|
|
139
|
+
secrets.password = await promptSecret('Enter password: ');
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
// Validate secrets are not empty
|
|
143
|
+
for (const [key, value] of Object.entries(secrets)) {
|
|
144
|
+
if (!value) {
|
|
145
|
+
console.error(`${key} cannot be empty.`);
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
console.log(`Creating credential "${parsed.name}" (${authType})...`);
|
|
151
|
+
const result = await client.createOrgCredential({
|
|
152
|
+
organization_id: organizationId,
|
|
153
|
+
credential_display_name: parsed.name,
|
|
154
|
+
authentication_type: authType,
|
|
155
|
+
...(parsed.description && { credential_description: parsed.description }),
|
|
156
|
+
...secrets,
|
|
157
|
+
});
|
|
158
|
+
console.log(`\nCredential created: ${result.data.credential_display_name}`);
|
|
159
|
+
console.log(` ID: ${result.data.organization_credential_id}`);
|
|
160
|
+
console.log(` Type: ${result.data.authentication_type}`);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=create-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-credential.js","sourceRoot":"","sources":["../../src/commands/create-credential.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai create-project — create a new project in an organization
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai create-project --name "My Project"
|
|
6
|
+
* wayai create-project --name "My Project" --org <uuid>
|
|
7
|
+
*/
|
|
8
|
+
interface ParsedArgs {
|
|
9
|
+
name: string | undefined;
|
|
10
|
+
orgId: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseArgs(args: string[]): ParsedArgs;
|
|
13
|
+
export declare function createProjectCommand(args: string[]): Promise<void>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai create-project — create a new project in an organization
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai create-project --name "My Project"
|
|
6
|
+
* wayai create-project --name "My Project" --org <uuid>
|
|
7
|
+
*/
|
|
8
|
+
import { requireAuth } from '../lib/auth.js';
|
|
9
|
+
import { ApiClient } from '../lib/api-client.js';
|
|
10
|
+
import { writePartialRepoConfig } from '../lib/repo-config.js';
|
|
11
|
+
import { resolveOrganizationId } from '../lib/utils.js';
|
|
12
|
+
export function parseArgs(args) {
|
|
13
|
+
let name;
|
|
14
|
+
let orgId;
|
|
15
|
+
for (let i = 0; i < args.length; i++) {
|
|
16
|
+
if (args[i] === '--name' && args[i + 1]) {
|
|
17
|
+
name = args[++i];
|
|
18
|
+
}
|
|
19
|
+
else if (args[i] === '--org' && args[i + 1]) {
|
|
20
|
+
orgId = args[++i];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return { name, orgId };
|
|
24
|
+
}
|
|
25
|
+
export async function createProjectCommand(args) {
|
|
26
|
+
const parsed = parseArgs(args);
|
|
27
|
+
if (!parsed.name) {
|
|
28
|
+
console.error('Missing required flag: --name <project-name>');
|
|
29
|
+
console.error('Usage: wayai create-project --name "My Project" [--org <uuid>]');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const { config, accessToken } = await requireAuth();
|
|
33
|
+
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
34
|
+
const { organizationId, organizationName } = await resolveOrganizationId(client, parsed.orgId);
|
|
35
|
+
console.log(`Creating project "${parsed.name}"...`);
|
|
36
|
+
const result = await client.createProject(organizationId, parsed.name);
|
|
37
|
+
const project = result.data[0];
|
|
38
|
+
// Update .wayai.yaml with the new project (preserve existing org info, clear hub)
|
|
39
|
+
const configPath = writePartialRepoConfig({
|
|
40
|
+
organization_id: organizationId,
|
|
41
|
+
organization_name: organizationName,
|
|
42
|
+
project_id: project.project_id,
|
|
43
|
+
project_name: project.project_name,
|
|
44
|
+
});
|
|
45
|
+
console.log(`\nProject created: ${project.project_name}`);
|
|
46
|
+
console.log(` ID: ${project.project_id}`);
|
|
47
|
+
console.log(`\nWrote ${configPath}`);
|
|
48
|
+
console.log('Create hub files in workspace/ and run `wayai push` to create a hub.');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=create-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/commands/create-project.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,IAAwB,CAAC;IAC7B,IAAI,KAAyB,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAc;IACvD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAEtE,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/F,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,kFAAkF;IAClF,MAAM,UAAU,GAAG,sBAAsB,CAAC;QACxC,eAAe,EAAE,cAAc;QAC/B,iBAAiB,EAAE,gBAAgB;QACnC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;AACtF,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -4,22 +4,12 @@
|
|
|
4
4
|
* Interactive mode: prompts user to pick org → project → hub
|
|
5
5
|
* Direct mode: --hub <uuid> resolves org/project info from the API
|
|
6
6
|
*/
|
|
7
|
-
import * as readline from 'node:readline';
|
|
8
7
|
import { requireAuth } from '../lib/auth.js';
|
|
9
8
|
import { ApiClient } from '../lib/api-client.js';
|
|
10
|
-
import { readRepoConfig, writeRepoConfig } from '../lib/repo-config.js';
|
|
9
|
+
import { readRepoConfig, readPartialRepoConfig, writeRepoConfig, writePartialRepoConfig } from '../lib/repo-config.js';
|
|
11
10
|
import { refreshScaffold } from '../lib/scaffold.js';
|
|
12
11
|
import { findGitRoot } from '../lib/workspace.js';
|
|
13
|
-
|
|
14
|
-
function prompt(question) {
|
|
15
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
16
|
-
return new Promise((resolve) => {
|
|
17
|
-
rl.question(question, (answer) => {
|
|
18
|
-
rl.close();
|
|
19
|
-
resolve(answer.trim());
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
}
|
|
12
|
+
import { UUID_RE, prompt } from '../lib/utils.js';
|
|
23
13
|
export function parseArgs(args) {
|
|
24
14
|
let hubId;
|
|
25
15
|
let autoConfirm = false;
|
|
@@ -37,9 +27,12 @@ export function parseArgs(args) {
|
|
|
37
27
|
export async function initCommand(args) {
|
|
38
28
|
const { hubId: directHubId, autoConfirm } = parseArgs(args);
|
|
39
29
|
// Warn if .wayai.yaml already exists
|
|
40
|
-
const existing = readRepoConfig();
|
|
30
|
+
const existing = readRepoConfig() ?? readPartialRepoConfig();
|
|
41
31
|
if (existing) {
|
|
42
|
-
|
|
32
|
+
const scopeLabel = existing.hub_id
|
|
33
|
+
? `${existing.hub_name || existing.hub_id} in ${existing.organization_name || existing.organization_id}`
|
|
34
|
+
: `${existing.project_name || existing.project_id} in ${existing.organization_name || existing.organization_id} (no hub)`;
|
|
35
|
+
console.log(`Current scope: ${scopeLabel}`);
|
|
43
36
|
if (!autoConfirm) {
|
|
44
37
|
const answer = await prompt('Overwrite? [y/N]: ');
|
|
45
38
|
if (answer.toLowerCase() !== 'y') {
|
|
@@ -74,7 +67,11 @@ export async function initCommand(args) {
|
|
|
74
67
|
console.warn(`Warning: failed to download scaffold files: ${err instanceof Error ? err.message : String(err)}`);
|
|
75
68
|
}
|
|
76
69
|
}
|
|
77
|
-
|
|
70
|
+
// Check if a hub was selected (full config) or just org+project (partial config)
|
|
71
|
+
const finalConfig = readRepoConfig();
|
|
72
|
+
if (finalConfig) {
|
|
73
|
+
console.log('Run `wayai pull` to fetch hub configuration.');
|
|
74
|
+
}
|
|
78
75
|
}
|
|
79
76
|
async function initDirect(client, hubId) {
|
|
80
77
|
if (!UUID_RE.test(hubId)) {
|
|
@@ -137,68 +134,84 @@ async function initInteractive(client) {
|
|
|
137
134
|
}
|
|
138
135
|
selectedOrg = organizations[orgIdx];
|
|
139
136
|
}
|
|
140
|
-
// Step 2: Fetch
|
|
141
|
-
console.log('Fetching
|
|
142
|
-
const {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (previewHubs.length === 0) {
|
|
146
|
-
console.error('No preview hubs found. Create one in the WayAI platform first.');
|
|
137
|
+
// Step 2: Fetch projects directly (not derived from hubs — supports empty projects)
|
|
138
|
+
console.log('Fetching projects...');
|
|
139
|
+
const { data: projectList } = await client.listProjects(selectedOrg.id);
|
|
140
|
+
if (projectList.length === 0) {
|
|
141
|
+
console.error('No projects found. Create one with `wayai create-project --name "..."` first.');
|
|
147
142
|
process.exit(1);
|
|
148
143
|
}
|
|
149
|
-
// Group by project
|
|
150
|
-
const projectMap = new Map();
|
|
151
|
-
for (const hub of previewHubs) {
|
|
152
|
-
let project = projectMap.get(hub.project_id);
|
|
153
|
-
if (!project) {
|
|
154
|
-
project = { id: hub.project_id, name: hub.project_name, hubs: [] };
|
|
155
|
-
projectMap.set(hub.project_id, project);
|
|
156
|
-
}
|
|
157
|
-
project.hubs.push(hub);
|
|
158
|
-
}
|
|
159
|
-
const projects = Array.from(projectMap.values());
|
|
160
|
-
// Step 3: Pick project (skip if only one)
|
|
161
144
|
let selectedProject;
|
|
162
|
-
if (
|
|
163
|
-
selectedProject =
|
|
145
|
+
if (projectList.length === 1) {
|
|
146
|
+
selectedProject = { id: projectList[0].project_id, name: projectList[0].project_name };
|
|
164
147
|
console.log(`Project: ${selectedProject.name}`);
|
|
165
148
|
}
|
|
166
149
|
else {
|
|
167
150
|
console.log('\nProjects:');
|
|
168
|
-
for (let i = 0; i <
|
|
169
|
-
console.log(` ${i + 1}. ${
|
|
151
|
+
for (let i = 0; i < projectList.length; i++) {
|
|
152
|
+
console.log(` ${i + 1}. ${projectList[i].project_name}`);
|
|
170
153
|
}
|
|
171
|
-
const projAnswer = await prompt(`\nSelect project [1-${
|
|
154
|
+
const projAnswer = await prompt(`\nSelect project [1-${projectList.length}]: `);
|
|
172
155
|
const projIdx = parseInt(projAnswer, 10) - 1;
|
|
173
|
-
if (isNaN(projIdx) || projIdx < 0 || projIdx >=
|
|
156
|
+
if (isNaN(projIdx) || projIdx < 0 || projIdx >= projectList.length) {
|
|
174
157
|
console.error('Invalid selection.');
|
|
175
158
|
process.exit(1);
|
|
176
159
|
}
|
|
177
|
-
selectedProject =
|
|
160
|
+
selectedProject = { id: projectList[projIdx].project_id, name: projectList[projIdx].project_name };
|
|
161
|
+
}
|
|
162
|
+
// Step 3: Fetch hubs for the selected project
|
|
163
|
+
console.log('Fetching hubs...');
|
|
164
|
+
const { hubs } = await client.listHubs(selectedOrg.id, selectedProject.id);
|
|
165
|
+
const previewHubs = hubs.filter((h) => h.hub_environment === 'preview');
|
|
166
|
+
// Step 4: Pick hub (or skip to create later via push)
|
|
167
|
+
if (previewHubs.length === 0) {
|
|
168
|
+
// No hubs — write partial config (org + project only)
|
|
169
|
+
const configPath = writePartialRepoConfig({
|
|
170
|
+
organization_id: selectedOrg.id,
|
|
171
|
+
organization_name: selectedOrg.name,
|
|
172
|
+
project_id: selectedProject.id,
|
|
173
|
+
project_name: selectedProject.name,
|
|
174
|
+
});
|
|
175
|
+
console.log(`\nWrote ${configPath} (no hub selected)`);
|
|
176
|
+
console.log('Create hub files in workspace/<project>/<hub>/hub.yaml and run `wayai push` to create the hub.');
|
|
177
|
+
return;
|
|
178
178
|
}
|
|
179
|
-
// Step 4: Pick hub
|
|
180
|
-
const hubList = selectedProject.hubs;
|
|
181
179
|
let selectedHub;
|
|
182
|
-
if (
|
|
183
|
-
|
|
180
|
+
if (previewHubs.length === 1) {
|
|
181
|
+
// Auto-select single hub
|
|
182
|
+
selectedHub = previewHubs[0];
|
|
184
183
|
console.log(`Hub: ${selectedHub.hub_name}`);
|
|
185
184
|
}
|
|
186
185
|
else {
|
|
186
|
+
// Show hubs with option 0 to skip
|
|
187
187
|
console.log('\nHubs:');
|
|
188
|
-
|
|
189
|
-
|
|
188
|
+
console.log(' 0. (new hub — create via push later)');
|
|
189
|
+
for (let i = 0; i < previewHubs.length; i++) {
|
|
190
|
+
const h = previewHubs[i];
|
|
190
191
|
const label = h.preview_label ? ` (${h.preview_label})` : h.branch_name ? ` [${h.branch_name}]` : '';
|
|
191
192
|
console.log(` ${i + 1}. ${h.hub_name}${label}`);
|
|
192
193
|
}
|
|
193
|
-
const hubAnswer = await prompt(`\nSelect hub [
|
|
194
|
-
const hubIdx = parseInt(hubAnswer, 10)
|
|
195
|
-
if (isNaN(hubIdx) || hubIdx < 0 || hubIdx
|
|
194
|
+
const hubAnswer = await prompt(`\nSelect hub [0-${previewHubs.length}]: `);
|
|
195
|
+
const hubIdx = parseInt(hubAnswer, 10);
|
|
196
|
+
if (isNaN(hubIdx) || hubIdx < 0 || hubIdx > previewHubs.length) {
|
|
196
197
|
console.error('Invalid selection.');
|
|
197
198
|
process.exit(1);
|
|
198
199
|
}
|
|
199
|
-
|
|
200
|
+
if (hubIdx === 0) {
|
|
201
|
+
// Skip hub — write partial config
|
|
202
|
+
const configPath = writePartialRepoConfig({
|
|
203
|
+
organization_id: selectedOrg.id,
|
|
204
|
+
organization_name: selectedOrg.name,
|
|
205
|
+
project_id: selectedProject.id,
|
|
206
|
+
project_name: selectedProject.name,
|
|
207
|
+
});
|
|
208
|
+
console.log(`\nWrote ${configPath} (no hub selected)`);
|
|
209
|
+
console.log('Create hub files in workspace/<project>/<hub>/hub.yaml and run `wayai push` to create the hub.');
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
selectedHub = previewHubs[hubIdx - 1];
|
|
200
213
|
}
|
|
201
|
-
// Step 5: Write .wayai.yaml
|
|
214
|
+
// Step 5: Write .wayai.yaml with full config
|
|
202
215
|
const configPath = writeRepoConfig({
|
|
203
216
|
organization_id: selectedOrg.id,
|
|
204
217
|
organization_name: selectedOrg.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai login —
|
|
2
|
+
* wayai login — WorkOS browser flow (default) or --token fallback
|
|
3
3
|
*/
|
|
4
4
|
export declare function parseApiUrl(args: string[]): string;
|
|
5
5
|
export declare function loginCommand(args: string[]): Promise<void>;
|
package/dist/commands/login.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai login —
|
|
2
|
+
* wayai login — WorkOS browser flow (default) or --token fallback
|
|
3
3
|
*/
|
|
4
4
|
import * as readline from 'node:readline';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { generateState, findAvailablePort, startCallbackServer, fetchLoginUrl, exchangeCodeForToken, validateToken, } from '../lib/auth.js';
|
|
6
|
+
import { writeConfig } from '../lib/config.js';
|
|
7
7
|
function prompt(question, defaultValue) {
|
|
8
8
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
9
9
|
const display = defaultValue ? `${question} [${defaultValue}]: ` : `${question}: `;
|
|
@@ -29,100 +29,63 @@ export async function loginCommand(args) {
|
|
|
29
29
|
await loginWithToken(apiUrl);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
await
|
|
32
|
+
await loginWithBrowser(apiUrl);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
async function
|
|
35
|
+
async function loginWithBrowser(apiUrl) {
|
|
36
36
|
console.log('\nConnecting to WayAI...');
|
|
37
|
-
|
|
37
|
+
// Find an available port for the callback server
|
|
38
|
+
const port = await findAvailablePort();
|
|
39
|
+
const redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
40
|
+
const state = generateState();
|
|
41
|
+
// Get the WorkOS login URL from the backend
|
|
42
|
+
let loginUrl;
|
|
38
43
|
try {
|
|
39
|
-
|
|
40
|
-
supabaseUrl = authConfig.supabase_url;
|
|
44
|
+
loginUrl = await fetchLoginUrl(apiUrl, redirectUri, state);
|
|
41
45
|
}
|
|
42
46
|
catch (err) {
|
|
43
47
|
console.error(`Failed to connect to ${apiUrl}: ${err instanceof Error ? err.message : String(err)}`);
|
|
44
48
|
process.exit(1);
|
|
45
49
|
}
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
// Try to reuse the stored DCR client (same port → same redirect_uri → same client_id)
|
|
49
|
-
const { clientId, redirectUri } = await resolveOAuthClient(supabaseUrl);
|
|
50
|
-
// Build OAuth 2.1 authorize URL (Supabase as authorization server)
|
|
51
|
-
const authParams = new URLSearchParams({
|
|
52
|
-
client_id: clientId,
|
|
53
|
-
response_type: 'code',
|
|
54
|
-
redirect_uri: redirectUri,
|
|
55
|
-
code_challenge: codeChallenge,
|
|
56
|
-
code_challenge_method: 'S256',
|
|
57
|
-
scope: 'openid email profile',
|
|
58
|
-
});
|
|
59
|
-
const authUrl = `${supabaseUrl}/auth/v1/oauth/authorize?${authParams.toString()}`;
|
|
50
|
+
// Start callback server before opening browser
|
|
51
|
+
const callbackPromise = startCallbackServer(port, state);
|
|
60
52
|
// Try to open browser
|
|
61
|
-
const
|
|
62
|
-
if (!
|
|
63
|
-
console.log(`\nOpen this URL in your browser to log in:\n\n ${
|
|
53
|
+
const openedBrowser = await tryOpenBrowser(loginUrl);
|
|
54
|
+
if (!openedBrowser) {
|
|
55
|
+
console.log(`\nOpen this URL in your browser to log in:\n\n ${loginUrl}\n`);
|
|
64
56
|
}
|
|
65
57
|
else {
|
|
66
58
|
console.log('Opening browser for login...');
|
|
67
59
|
}
|
|
68
60
|
try {
|
|
69
|
-
const callbackPort = parseInt(new URL(redirectUri).port, 10);
|
|
70
|
-
const callbackPromise = startCallbackServer(callbackPort);
|
|
71
61
|
const { code } = await callbackPromise;
|
|
72
|
-
console.log('Exchanging authorization code
|
|
73
|
-
const
|
|
62
|
+
console.log('Exchanging authorization code...');
|
|
63
|
+
const result = await exchangeCodeForToken(apiUrl, code, redirectUri);
|
|
74
64
|
writeConfig({
|
|
75
65
|
api_url: apiUrl,
|
|
76
|
-
|
|
77
|
-
client_id: clientId,
|
|
78
|
-
redirect_uri: redirectUri,
|
|
79
|
-
refresh_token: refreshToken,
|
|
80
|
-
auth_method: 'oauth',
|
|
66
|
+
token: result.token,
|
|
81
67
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
console.log('\nLogin successful! Configuration saved to ~/.wayai/config.json');
|
|
68
|
+
console.log(`\nLogin successful! Logged in as ${result.email}`);
|
|
69
|
+
console.log('Configuration saved to ~/.wayai/config.json');
|
|
85
70
|
}
|
|
86
71
|
catch (err) {
|
|
87
72
|
console.error(`\nLogin failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
88
73
|
process.exit(1);
|
|
89
74
|
}
|
|
90
75
|
}
|
|
91
|
-
async function resolveOAuthClient(supabaseUrl) {
|
|
92
|
-
const existingConfig = readConfig();
|
|
93
|
-
if (existingConfig?.client_id &&
|
|
94
|
-
existingConfig?.redirect_uri &&
|
|
95
|
-
existingConfig?.supabase_url === supabaseUrl) {
|
|
96
|
-
const storedUrl = new URL(existingConfig.redirect_uri);
|
|
97
|
-
const storedPort = parseInt(storedUrl.port, 10);
|
|
98
|
-
if (storedPort && await isPortAvailable(storedPort)) {
|
|
99
|
-
return { clientId: existingConfig.client_id, redirectUri: existingConfig.redirect_uri };
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
const port = await findAvailablePort();
|
|
103
|
-
const redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
104
|
-
try {
|
|
105
|
-
const clientId = await registerOAuthClient(supabaseUrl, redirectUri);
|
|
106
|
-
return { clientId, redirectUri };
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
console.error(`Failed to register OAuth client: ${err instanceof Error ? err.message : String(err)}`);
|
|
110
|
-
process.exit(1);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
76
|
async function loginWithToken(apiUrl) {
|
|
114
|
-
const
|
|
115
|
-
if (!
|
|
116
|
-
console.error('
|
|
77
|
+
const token = await prompt('MCP Token (way_...)');
|
|
78
|
+
if (!token) {
|
|
79
|
+
console.error('Token is required.');
|
|
117
80
|
process.exit(1);
|
|
118
81
|
}
|
|
119
|
-
if (!
|
|
120
|
-
console.error('Invalid token format.
|
|
82
|
+
if (!token.startsWith('way_')) {
|
|
83
|
+
console.error('Invalid token format. Tokens start with "way_".');
|
|
121
84
|
process.exit(1);
|
|
122
85
|
}
|
|
123
86
|
console.log('\nValidating token...');
|
|
124
87
|
try {
|
|
125
|
-
await
|
|
88
|
+
await validateToken(apiUrl, token);
|
|
126
89
|
}
|
|
127
90
|
catch (err) {
|
|
128
91
|
console.error(`Token validation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -130,8 +93,7 @@ async function loginWithToken(apiUrl) {
|
|
|
130
93
|
}
|
|
131
94
|
writeConfig({
|
|
132
95
|
api_url: apiUrl,
|
|
133
|
-
|
|
134
|
-
auth_method: 'token',
|
|
96
|
+
token,
|
|
135
97
|
});
|
|
136
98
|
console.log('\nLogin successful! Configuration saved to ~/.wayai/config.json');
|
|
137
99
|
}
|