@wayai/cli 0.2.67 → 0.2.69
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/analytics.js +16 -69
- package/dist/commands/analytics.js.map +1 -1
- package/dist/commands/conversations.js +7 -5
- package/dist/commands/conversations.js.map +1 -1
- package/dist/commands/delete-history.js +4 -2
- package/dist/commands/delete-history.js.map +1 -1
- package/dist/commands/eval-capture.js +8 -6
- package/dist/commands/eval-capture.js.map +1 -1
- package/dist/commands/eval-results.js +4 -2
- package/dist/commands/eval-results.js.map +1 -1
- package/dist/commands/evals.d.ts +13 -1
- package/dist/commands/evals.js +84 -4
- package/dist/commands/evals.js.map +1 -1
- package/dist/commands/init.d.ts +7 -4
- package/dist/commands/init.js +34 -134
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts +2 -2
- package/dist/commands/list.js +6 -21
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/pull.d.ts +8 -2
- package/dist/commands/pull.js +50 -21
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts +8 -3
- package/dist/commands/push.js +71 -62
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/report-bug.js +2 -5
- package/dist/commands/report-bug.js.map +1 -1
- package/dist/commands/run-eval.js +5 -3
- package/dist/commands/run-eval.js.map +1 -1
- package/dist/commands/send-message.js +4 -2
- package/dist/commands/send-message.js.map +1 -1
- package/dist/commands/status.js +1 -13
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync-skills.js +3 -2
- package/dist/commands/sync-skills.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.js +15 -21
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +5 -22
- package/dist/lib/api-client.js +10 -18
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/repo-config.d.ts +4 -23
- package/dist/lib/repo-config.js +17 -103
- package/dist/lib/repo-config.js.map +1 -1
- package/dist/lib/sql-output.d.ts +17 -0
- package/dist/lib/sql-output.js +48 -0
- package/dist/lib/sql-output.js.map +1 -0
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.js +14 -2
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/workspace.d.ts +38 -15
- package/dist/lib/workspace.js +147 -57
- package/dist/lib/workspace.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/create-project.d.ts +0 -14
- package/dist/commands/create-project.js +0 -50
- package/dist/commands/create-project.js.map +0 -1
package/dist/commands/evals.js
CHANGED
|
@@ -1,18 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai evals — list evaluation scenarios for the current hub
|
|
2
|
+
* wayai evals — list evaluation scenarios for the current hub, or query eval
|
|
3
|
+
* results stored in ClickHouse.
|
|
3
4
|
*
|
|
4
5
|
* Usage:
|
|
5
6
|
* wayai evals # list all evals
|
|
6
7
|
* wayai evals --enabled # show only enabled evals
|
|
7
8
|
* wayai evals --disabled # show only disabled evals
|
|
9
|
+
*
|
|
10
|
+
* wayai evals sql "SELECT count() FROM conversation"
|
|
11
|
+
* wayai evals sql "SELECT eval_id, count() FROM conversation GROUP BY 1" --json
|
|
12
|
+
* wayai evals sql --schema # column + eval-score-path catalog
|
|
13
|
+
* wayai evals sql "..." --limit 500
|
|
14
|
+
*
|
|
15
|
+
* `sql` is a thin wrapper over POST /api/evals/sql — server enforces hub_id +
|
|
16
|
+
* is_eval=true scoping (CTE shadow), single-SELECT only, function/keyword
|
|
17
|
+
* denylist, 10k row cap. `--schema` calls GET /api/evals/sql/schema and
|
|
18
|
+
* returns top-level columns + system variable paths + dynamically discovered
|
|
19
|
+
* `data.eval_scores.*` dimensions.
|
|
8
20
|
*/
|
|
9
21
|
import { requireAuth } from '../lib/auth.js';
|
|
10
22
|
import { requireRepoConfig } from '../lib/repo-config.js';
|
|
23
|
+
import { resolveActiveHubId } from '../lib/workspace.js';
|
|
11
24
|
import { ApiClient } from '../lib/api-client.js';
|
|
25
|
+
import { printQueryRows, printSqlSchema } from '../lib/sql-output.js';
|
|
26
|
+
import { parsePositiveIntFlag } from '../lib/utils.js';
|
|
12
27
|
export async function evalsCommand(args) {
|
|
28
|
+
if (args[0] === 'sql') {
|
|
29
|
+
return evalsSqlSubcommand(args.slice(1));
|
|
30
|
+
}
|
|
31
|
+
return evalsListCommand(args);
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Default list command (GET /api/evals)
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
async function evalsListCommand(args) {
|
|
37
|
+
const hubId = resolveActiveHubId(args);
|
|
13
38
|
const { config, accessToken } = await requireAuth();
|
|
14
|
-
|
|
15
|
-
// Parse args
|
|
39
|
+
requireRepoConfig();
|
|
16
40
|
let enabledFilter;
|
|
17
41
|
for (let i = 0; i < args.length; i++) {
|
|
18
42
|
const arg = args[i];
|
|
@@ -24,7 +48,7 @@ export async function evalsCommand(args) {
|
|
|
24
48
|
}
|
|
25
49
|
}
|
|
26
50
|
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
27
|
-
const result = await client.getEvals(
|
|
51
|
+
const result = await client.getEvals(hubId, { enabled: enabledFilter });
|
|
28
52
|
if (result.data.evals.length === 0) {
|
|
29
53
|
console.log('No evals found.');
|
|
30
54
|
return;
|
|
@@ -37,4 +61,60 @@ export async function evalsCommand(args) {
|
|
|
37
61
|
console.log(` ${eval_.eval_name.padEnd(20)} ${eval_.eval_id.slice(0, 8)} ${status.padEnd(9)} ${runs.padEnd(7)} Agent: ${agentName}`);
|
|
38
62
|
}
|
|
39
63
|
}
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// `wayai evals sql` — POST /api/evals/sql (read-only, server-scoped to is_eval = true)
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
async function evalsSqlSubcommand(args) {
|
|
68
|
+
const hubId = resolveActiveHubId(args);
|
|
69
|
+
const { config, accessToken } = await requireAuth();
|
|
70
|
+
requireRepoConfig();
|
|
71
|
+
let sql;
|
|
72
|
+
let limit;
|
|
73
|
+
let jsonOutput = false;
|
|
74
|
+
let schemaOnly = false;
|
|
75
|
+
for (let i = 0; i < args.length; i++) {
|
|
76
|
+
const arg = args[i];
|
|
77
|
+
if (arg === '--limit') {
|
|
78
|
+
limit = parsePositiveIntFlag('--limit', args[++i]);
|
|
79
|
+
}
|
|
80
|
+
else if (arg === '--json') {
|
|
81
|
+
jsonOutput = true;
|
|
82
|
+
}
|
|
83
|
+
else if (arg === '--schema') {
|
|
84
|
+
schemaOnly = true;
|
|
85
|
+
}
|
|
86
|
+
else if (!arg.startsWith('--') && sql === undefined) {
|
|
87
|
+
sql = arg;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.error(`Unknown flag for \`evals sql\`: ${arg}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
95
|
+
if (schemaOnly) {
|
|
96
|
+
const schema = await client.getEvalsSqlSchema(hubId);
|
|
97
|
+
if (jsonOutput) {
|
|
98
|
+
console.log(JSON.stringify(schema.data, null, 2));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
printSqlSchema(schema.data, 'Variable paths (data.system.* + data.eval_scores.*):');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!sql) {
|
|
105
|
+
console.error('Provide a SQL string. Example: wayai evals sql "SELECT count() FROM conversation"');
|
|
106
|
+
console.error('Or run: wayai evals sql --schema to list available columns and paths.');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const result = await client.runEvalsSql({
|
|
110
|
+
hub_id: hubId,
|
|
111
|
+
sql,
|
|
112
|
+
...(limit !== undefined && { limit }),
|
|
113
|
+
});
|
|
114
|
+
if (jsonOutput) {
|
|
115
|
+
console.log(JSON.stringify(result, null, 2));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
printQueryRows(result.data);
|
|
119
|
+
}
|
|
40
120
|
//# sourceMappingURL=evals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evals.js","sourceRoot":"","sources":["../../src/commands/evals.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evals.js","sourceRoot":"","sources":["../../src/commands/evals.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai init [--
|
|
2
|
+
* wayai init [--org <uuid>] — set up .wayai.yaml to scope this repo to an organization
|
|
3
3
|
*
|
|
4
|
-
* Interactive mode: prompts user to pick org
|
|
5
|
-
* Direct mode: --
|
|
4
|
+
* Interactive mode: prompts user to pick an org (or auto-selects if only one).
|
|
5
|
+
* Direct mode: --org <uuid> sets the org without prompting.
|
|
6
|
+
*
|
|
7
|
+
* Hubs self-identify via `hub.yaml` inside their folder; this file only carries
|
|
8
|
+
* org context so that push/pull know which org to talk to.
|
|
6
9
|
*/
|
|
7
10
|
export declare function parseArgs(args: string[]): {
|
|
8
|
-
|
|
11
|
+
orgId: string | undefined;
|
|
9
12
|
autoConfirm: boolean;
|
|
10
13
|
};
|
|
11
14
|
export declare function initCommand(args: string[]): Promise<void>;
|
package/dist/commands/init.js
CHANGED
|
@@ -1,37 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai init [--
|
|
2
|
+
* wayai init [--org <uuid>] — set up .wayai.yaml to scope this repo to an organization
|
|
3
3
|
*
|
|
4
|
-
* Interactive mode: prompts user to pick org
|
|
5
|
-
* Direct mode: --
|
|
4
|
+
* Interactive mode: prompts user to pick an org (or auto-selects if only one).
|
|
5
|
+
* Direct mode: --org <uuid> sets the org without prompting.
|
|
6
|
+
*
|
|
7
|
+
* Hubs self-identify via `hub.yaml` inside their folder; this file only carries
|
|
8
|
+
* org context so that push/pull know which org to talk to.
|
|
6
9
|
*/
|
|
7
10
|
import { requireAuth } from '../lib/auth.js';
|
|
8
11
|
import { ApiClient } from '../lib/api-client.js';
|
|
9
|
-
import { readRepoConfig,
|
|
12
|
+
import { readRepoConfig, writeRepoConfig } from '../lib/repo-config.js';
|
|
10
13
|
import { refreshScaffold } from '../lib/scaffold.js';
|
|
11
14
|
import { findGitRoot } from '../lib/workspace.js';
|
|
12
15
|
import { UUID_RE, prompt } from '../lib/utils.js';
|
|
13
16
|
export function parseArgs(args) {
|
|
14
|
-
let
|
|
17
|
+
let orgId;
|
|
15
18
|
let autoConfirm = false;
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
18
|
-
|
|
19
|
+
const orgIdx = args.indexOf('--org');
|
|
20
|
+
if (orgIdx !== -1 && args[orgIdx + 1]) {
|
|
21
|
+
orgId = args[orgIdx + 1];
|
|
19
22
|
}
|
|
20
23
|
for (const arg of args) {
|
|
21
24
|
if (arg === '--yes' || arg === '-y') {
|
|
22
25
|
autoConfirm = true;
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
|
-
return {
|
|
28
|
+
return { orgId, autoConfirm };
|
|
26
29
|
}
|
|
27
30
|
export async function initCommand(args) {
|
|
28
|
-
const {
|
|
31
|
+
const { orgId: directOrgId, autoConfirm } = parseArgs(args);
|
|
29
32
|
// Warn if .wayai.yaml already exists
|
|
30
|
-
const existing = readRepoConfig()
|
|
33
|
+
const existing = readRepoConfig();
|
|
31
34
|
if (existing) {
|
|
32
|
-
const scopeLabel = existing.
|
|
33
|
-
? `${existing.
|
|
34
|
-
:
|
|
35
|
+
const scopeLabel = existing.organization_name
|
|
36
|
+
? `${existing.organization_name} (${existing.organization_id})`
|
|
37
|
+
: existing.organization_id;
|
|
35
38
|
console.log(`Current scope: ${scopeLabel}`);
|
|
36
39
|
if (!autoConfirm) {
|
|
37
40
|
const answer = await prompt('Overwrite? [y/N]: ');
|
|
@@ -43,8 +46,8 @@ export async function initCommand(args) {
|
|
|
43
46
|
}
|
|
44
47
|
const { config, accessToken } = await requireAuth();
|
|
45
48
|
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
46
|
-
if (
|
|
47
|
-
await initDirect(client,
|
|
49
|
+
if (directOrgId) {
|
|
50
|
+
await initDirect(client, directOrgId);
|
|
48
51
|
}
|
|
49
52
|
else {
|
|
50
53
|
await initInteractive(client);
|
|
@@ -67,49 +70,28 @@ export async function initCommand(args) {
|
|
|
67
70
|
console.warn(`Warning: failed to download scaffold files: ${err instanceof Error ? err.message : String(err)}`);
|
|
68
71
|
}
|
|
69
72
|
}
|
|
70
|
-
|
|
71
|
-
const finalConfig = readRepoConfig();
|
|
72
|
-
if (finalConfig) {
|
|
73
|
-
console.log('Run `wayai pull` to fetch hub configuration.');
|
|
74
|
-
}
|
|
73
|
+
console.log('Run `wayai pull` to fetch hub configuration, or create hub files in workspace/<hub>/hub.yaml and run `wayai push`.');
|
|
75
74
|
}
|
|
76
|
-
async function initDirect(client,
|
|
77
|
-
if (!UUID_RE.test(
|
|
78
|
-
console.error('Invalid
|
|
75
|
+
async function initDirect(client, orgId) {
|
|
76
|
+
if (!UUID_RE.test(orgId)) {
|
|
77
|
+
console.error('Invalid organization ID. Expected a UUID.');
|
|
79
78
|
process.exit(1);
|
|
80
79
|
}
|
|
81
|
-
|
|
82
|
-
console.log('Looking up hub...');
|
|
80
|
+
console.log('Looking up organization...');
|
|
83
81
|
const { organizations } = await client.organizations();
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (hubMatch.hub_environment === 'production') {
|
|
89
|
-
console.error(`Hub "${hubMatch.hub_name}" is a production hub. Production hubs are read-only — use the linked preview hub instead.`);
|
|
90
|
-
process.exit(1);
|
|
91
|
-
}
|
|
92
|
-
if (hubMatch.branch_name) {
|
|
93
|
-
console.log(`Warning: "${hubMatch.hub_name}" is a CI branch preview (${hubMatch.branch_name}) and may be auto-deleted after 7 days of inactivity.`);
|
|
94
|
-
}
|
|
95
|
-
console.log(`Found: ${hubMatch.hub_name} in ${hubMatch.project_name} (${org.name})`);
|
|
96
|
-
const configPath = writeRepoConfig({
|
|
97
|
-
organization_id: org.id,
|
|
98
|
-
organization_name: org.name,
|
|
99
|
-
project_id: hubMatch.project_id,
|
|
100
|
-
project_name: hubMatch.project_name,
|
|
101
|
-
hub_id: hubId,
|
|
102
|
-
hub_name: hubMatch.hub_name,
|
|
103
|
-
});
|
|
104
|
-
console.log(`\nWrote ${configPath}`);
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
82
|
+
const match = organizations.find((o) => o.id === orgId);
|
|
83
|
+
if (!match) {
|
|
84
|
+
console.error(`Organization ${orgId} not found among the orgs you can access.`);
|
|
85
|
+
process.exit(1);
|
|
107
86
|
}
|
|
108
|
-
|
|
109
|
-
|
|
87
|
+
const configPath = writeRepoConfig({
|
|
88
|
+
organization_id: match.id,
|
|
89
|
+
organization_name: match.name,
|
|
90
|
+
});
|
|
91
|
+
console.log(`Found: ${match.name}`);
|
|
92
|
+
console.log(`\nWrote ${configPath}`);
|
|
110
93
|
}
|
|
111
94
|
async function initInteractive(client) {
|
|
112
|
-
// Step 1: Pick organization
|
|
113
95
|
console.log('Fetching organizations...');
|
|
114
96
|
const { organizations } = await client.organizations();
|
|
115
97
|
if (organizations.length === 0) {
|
|
@@ -134,91 +116,9 @@ async function initInteractive(client) {
|
|
|
134
116
|
}
|
|
135
117
|
selectedOrg = organizations[orgIdx];
|
|
136
118
|
}
|
|
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.');
|
|
142
|
-
process.exit(1);
|
|
143
|
-
}
|
|
144
|
-
let selectedProject;
|
|
145
|
-
if (projectList.length === 1) {
|
|
146
|
-
selectedProject = { id: projectList[0].project_id, name: projectList[0].project_name };
|
|
147
|
-
console.log(`Project: ${selectedProject.name}`);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
console.log('\nProjects:');
|
|
151
|
-
for (let i = 0; i < projectList.length; i++) {
|
|
152
|
-
console.log(` ${i + 1}. ${projectList[i].project_name}`);
|
|
153
|
-
}
|
|
154
|
-
const projAnswer = await prompt(`\nSelect project [1-${projectList.length}]: `);
|
|
155
|
-
const projIdx = parseInt(projAnswer, 10) - 1;
|
|
156
|
-
if (isNaN(projIdx) || projIdx < 0 || projIdx >= projectList.length) {
|
|
157
|
-
console.error('Invalid selection.');
|
|
158
|
-
process.exit(1);
|
|
159
|
-
}
|
|
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
|
-
}
|
|
179
|
-
let selectedHub;
|
|
180
|
-
if (previewHubs.length === 1) {
|
|
181
|
-
// Auto-select single hub
|
|
182
|
-
selectedHub = previewHubs[0];
|
|
183
|
-
console.log(`Hub: ${selectedHub.hub_name}`);
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
// Show hubs with option 0 to skip
|
|
187
|
-
console.log('\nHubs:');
|
|
188
|
-
console.log(' 0. (new hub — create via push later)');
|
|
189
|
-
for (let i = 0; i < previewHubs.length; i++) {
|
|
190
|
-
const h = previewHubs[i];
|
|
191
|
-
const label = h.preview_label ? ` (${h.preview_label})` : h.branch_name ? ` [${h.branch_name}]` : '';
|
|
192
|
-
console.log(` ${i + 1}. ${h.hub_name}${label}`);
|
|
193
|
-
}
|
|
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) {
|
|
197
|
-
console.error('Invalid selection.');
|
|
198
|
-
process.exit(1);
|
|
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];
|
|
213
|
-
}
|
|
214
|
-
// Step 5: Write .wayai.yaml with full config
|
|
215
119
|
const configPath = writeRepoConfig({
|
|
216
120
|
organization_id: selectedOrg.id,
|
|
217
121
|
organization_name: selectedOrg.name,
|
|
218
|
-
project_id: selectedProject.id,
|
|
219
|
-
project_name: selectedProject.name,
|
|
220
|
-
hub_id: selectedHub.hub_id,
|
|
221
|
-
hub_name: selectedHub.hub_name,
|
|
222
122
|
});
|
|
223
123
|
console.log(`\nWrote ${configPath}`);
|
|
224
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/list.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai list — list organizations
|
|
2
|
+
* wayai list — list organizations and hubs
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
|
-
* wayai list # all orgs →
|
|
5
|
+
* wayai list # all orgs → hubs
|
|
6
6
|
* wayai list --org <id> # filter to one org
|
|
7
7
|
* wayai list --json # structured output for agents/scripts
|
|
8
8
|
*/
|
package/dist/commands/list.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai list — list organizations
|
|
2
|
+
* wayai list — list organizations and hubs
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
|
-
* wayai list # all orgs →
|
|
5
|
+
* wayai list # all orgs → hubs
|
|
6
6
|
* wayai list --org <id> # filter to one org
|
|
7
7
|
* wayai list --json # structured output for agents/scripts
|
|
8
8
|
*/
|
|
@@ -48,8 +48,6 @@ export async function listCommand(args) {
|
|
|
48
48
|
hubs: hubs.map((h) => ({
|
|
49
49
|
hub_id: h.hub_id,
|
|
50
50
|
hub_name: h.hub_name,
|
|
51
|
-
project_id: h.project_id,
|
|
52
|
-
project_name: h.project_name,
|
|
53
51
|
preview_label: h.preview_label ?? null,
|
|
54
52
|
})),
|
|
55
53
|
})),
|
|
@@ -59,26 +57,13 @@ export async function listCommand(args) {
|
|
|
59
57
|
}
|
|
60
58
|
for (const { org, hubs } of results) {
|
|
61
59
|
console.log(`\n${org.name} (${org.id})`);
|
|
62
|
-
|
|
63
|
-
const projectMap = new Map();
|
|
64
|
-
for (const hub of hubs) {
|
|
65
|
-
let project = projectMap.get(hub.project_id);
|
|
66
|
-
if (!project) {
|
|
67
|
-
project = { name: hub.project_name, hubs: [] };
|
|
68
|
-
projectMap.set(hub.project_id, project);
|
|
69
|
-
}
|
|
70
|
-
project.hubs.push(hub);
|
|
71
|
-
}
|
|
72
|
-
if (projectMap.size === 0) {
|
|
60
|
+
if (hubs.length === 0) {
|
|
73
61
|
console.log(' (no hubs)');
|
|
74
62
|
continue;
|
|
75
63
|
}
|
|
76
|
-
for (const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const label = hub.preview_label ? ` (${hub.preview_label})` : '';
|
|
80
|
-
console.log(` ${hub.hub_name}${label} ${hub.hub_id}`);
|
|
81
|
-
}
|
|
64
|
+
for (const hub of hubs) {
|
|
65
|
+
const label = hub.preview_label ? ` (${hub.preview_label})` : '';
|
|
66
|
+
console.log(` ${hub.hub_name}${label} ${hub.hub_id}`);
|
|
82
67
|
}
|
|
83
68
|
}
|
|
84
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,KAAyB,CAAC;IAC9B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACxC,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,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IAEvD,MAAM,UAAU,GAAG,KAAK;QACtB,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC;QAC7C,CAAC,CAAC,aAAa,CAAC;IAElB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,KAAK,aAAa,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACtF,CAAC;QACD,OAAO;IACT,CAAC;IAED,sCAAsC;IACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CACtF,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,OAAO,GAAG;YACd,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC7C,eAAe,EAAE,GAAG,CAAC,EAAE;gBACvB,iBAAiB,EAAE,GAAG,CAAC,IAAI;gBAC3B,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/pull.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai pull [-y] — fetch hub config from the platform and write local files
|
|
2
|
+
* wayai pull [--hub <id|name>] [-y] — fetch hub config from the platform and write local files
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* The hub is derived from the workspace:
|
|
5
|
+
* - cwd is inside a hub folder → use that hub
|
|
6
|
+
* - exactly one hub in `workspace/` → use it
|
|
7
|
+
* - multiple hubs → require `--hub <uuid|folder-name>` to disambiguate
|
|
8
|
+
*
|
|
9
|
+
* For first-time pulls in an empty workspace, pass `--hub <uuid>` to fetch and
|
|
10
|
+
* materialize the hub at `workspace/<hub-slug>/`.
|
|
5
11
|
*/
|
|
6
12
|
import type { HubAsCodePayload } from '../lib/types.js';
|
|
7
13
|
export declare function pullCommand(args: string[]): Promise<void>;
|
package/dist/commands/pull.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* wayai pull [-y] — fetch hub config from the platform and write local files
|
|
2
|
+
* wayai pull [--hub <id|name>] [-y] — fetch hub config from the platform and write local files
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* The hub is derived from the workspace:
|
|
5
|
+
* - cwd is inside a hub folder → use that hub
|
|
6
|
+
* - exactly one hub in `workspace/` → use it
|
|
7
|
+
* - multiple hubs → require `--hub <uuid|folder-name>` to disambiguate
|
|
8
|
+
*
|
|
9
|
+
* For first-time pulls in an empty workspace, pass `--hub <uuid>` to fetch and
|
|
10
|
+
* materialize the hub at `workspace/<hub-slug>/`.
|
|
5
11
|
*/
|
|
6
12
|
import * as fs from 'node:fs';
|
|
7
13
|
import * as path from 'node:path';
|
|
@@ -10,36 +16,59 @@ import { ApiClient } from '../lib/api-client.js';
|
|
|
10
16
|
import { writeHubFolder } from '../lib/yaml-writer.js';
|
|
11
17
|
import { parseHubFolder } from '../lib/parser.js';
|
|
12
18
|
import { printDiff } from '../lib/diff-display.js';
|
|
13
|
-
import { confirm, slugify } from '../lib/utils.js';
|
|
14
|
-
import { autoRenameHubFolder, detectWorkspace, findGitRoot, resolveHubFolder, scanWorkspaceHubs } from '../lib/workspace.js';
|
|
19
|
+
import { confirm, slugify, UUID_RE } from '../lib/utils.js';
|
|
20
|
+
import { autoRenameHubFolder, detectWorkspace, findGitRoot, findEnclosingHubFolder, resolveHubFolder, scanWorkspaceHubs, } from '../lib/workspace.js';
|
|
15
21
|
import { requireRepoConfig } from '../lib/repo-config.js';
|
|
16
22
|
import { refreshScaffold } from '../lib/scaffold.js';
|
|
17
23
|
function parseArgs(args) {
|
|
18
24
|
let autoConfirm = false;
|
|
19
|
-
|
|
25
|
+
let hubSelector;
|
|
26
|
+
for (let i = 0; i < args.length; i++) {
|
|
27
|
+
const arg = args[i];
|
|
20
28
|
if (arg === '--yes' || arg === '-y') {
|
|
21
29
|
autoConfirm = true;
|
|
22
30
|
}
|
|
31
|
+
else if (arg === '--hub' && args[i + 1]) {
|
|
32
|
+
hubSelector = args[++i];
|
|
33
|
+
}
|
|
23
34
|
}
|
|
24
|
-
return { autoConfirm };
|
|
35
|
+
return { autoConfirm, hubSelector };
|
|
25
36
|
}
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
* Scans workspace first; falls back to creating a new path using remote hub info.
|
|
29
|
-
*/
|
|
30
|
-
function findHubFolder(workspaceDir, hubId) {
|
|
31
|
-
if (!fs.existsSync(workspaceDir))
|
|
32
|
-
return null;
|
|
37
|
+
/** Resolve the target hub for the pull. May return a not-yet-materialized hub_id. */
|
|
38
|
+
function resolveHubTarget(workspaceDir, selector) {
|
|
33
39
|
const allHubs = scanWorkspaceHubs(workspaceDir);
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
if (selector) {
|
|
41
|
+
// Match against existing folders by hubId or basename
|
|
42
|
+
const match = allHubs.find((h) => h.hubId === selector || path.basename(h.hubFolder) === selector);
|
|
43
|
+
if (match)
|
|
44
|
+
return { hubId: match.hubId, hubFolder: match.hubFolder };
|
|
45
|
+
// Selector might be a UUID for a hub that hasn't been materialized yet.
|
|
46
|
+
if (UUID_RE.test(selector))
|
|
47
|
+
return { hubId: selector, hubFolder: null };
|
|
48
|
+
console.error(`No hub matching --hub ${selector} found in workspace/. Pass a UUID for first-time pulls.`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const enclosing = findEnclosingHubFolder(workspaceDir);
|
|
52
|
+
if (enclosing)
|
|
53
|
+
return { hubId: enclosing.hubId, hubFolder: enclosing.hubFolder };
|
|
54
|
+
if (allHubs.length === 1)
|
|
55
|
+
return { hubId: allHubs[0].hubId, hubFolder: allHubs[0].hubFolder };
|
|
56
|
+
if (allHubs.length === 0) {
|
|
57
|
+
console.error('No hub folders found in workspace/. Pass --hub <uuid> to fetch a hub for the first time.');
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
console.error('Multiple hubs found in workspace/. Pass --hub <uuid|folder-name> to choose, or run from inside a hub folder:');
|
|
61
|
+
for (const h of allHubs) {
|
|
62
|
+
console.error(` ${path.basename(h.hubFolder)} (${h.hubId})`);
|
|
63
|
+
}
|
|
64
|
+
process.exit(1);
|
|
36
65
|
}
|
|
37
66
|
export async function pullCommand(args) {
|
|
38
|
-
const { autoConfirm } = parseArgs(args);
|
|
67
|
+
const { autoConfirm, hubSelector } = parseArgs(args);
|
|
68
|
+
const repoConfig = requireRepoConfig();
|
|
69
|
+
const { organization_id: organizationId } = repoConfig;
|
|
39
70
|
const { config, accessToken } = await requireAuth();
|
|
40
71
|
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
41
|
-
const repoConfig = requireRepoConfig();
|
|
42
|
-
const { organization_id: organizationId, hub_id: hubId } = repoConfig;
|
|
43
72
|
// Determine workspace directory
|
|
44
73
|
let workspaceDir;
|
|
45
74
|
const workspace = detectWorkspace();
|
|
@@ -54,8 +83,7 @@ export async function pullCommand(args) {
|
|
|
54
83
|
}
|
|
55
84
|
workspaceDir = path.join(gitRoot, 'workspace');
|
|
56
85
|
}
|
|
57
|
-
|
|
58
|
-
let hubFolder = findHubFolder(workspaceDir, hubId);
|
|
86
|
+
const { hubId, hubFolder: existingFolder } = resolveHubTarget(workspaceDir, hubSelector);
|
|
59
87
|
// Fetch remote hub config
|
|
60
88
|
console.log('Fetching hub configuration...');
|
|
61
89
|
const payload = await client.pull(hubId, organizationId);
|
|
@@ -63,9 +91,10 @@ export async function pullCommand(args) {
|
|
|
63
91
|
console.log('Skipping production hub — production hubs are not tracked in the repository. Edit the linked preview hub instead.');
|
|
64
92
|
return;
|
|
65
93
|
}
|
|
94
|
+
let hubFolder = existingFolder;
|
|
66
95
|
// If no existing folder, create path for first pull
|
|
67
96
|
if (!hubFolder) {
|
|
68
|
-
hubFolder = resolveHubFolder(workspaceDir, hubId,
|
|
97
|
+
hubFolder = resolveHubFolder(workspaceDir, hubId, payload.hub.name, payload.hub_environment, payload.preview_label, payload.branch_name);
|
|
69
98
|
// Ensure parent directories exist
|
|
70
99
|
fs.mkdirSync(path.dirname(hubFolder), { recursive: true });
|
|
71
100
|
console.log('Writing hub configuration...');
|