@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.
Files changed (57) hide show
  1. package/dist/commands/analytics.js +16 -69
  2. package/dist/commands/analytics.js.map +1 -1
  3. package/dist/commands/conversations.js +7 -5
  4. package/dist/commands/conversations.js.map +1 -1
  5. package/dist/commands/delete-history.js +4 -2
  6. package/dist/commands/delete-history.js.map +1 -1
  7. package/dist/commands/eval-capture.js +8 -6
  8. package/dist/commands/eval-capture.js.map +1 -1
  9. package/dist/commands/eval-results.js +4 -2
  10. package/dist/commands/eval-results.js.map +1 -1
  11. package/dist/commands/evals.d.ts +13 -1
  12. package/dist/commands/evals.js +84 -4
  13. package/dist/commands/evals.js.map +1 -1
  14. package/dist/commands/init.d.ts +7 -4
  15. package/dist/commands/init.js +34 -134
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/list.d.ts +2 -2
  18. package/dist/commands/list.js +6 -21
  19. package/dist/commands/list.js.map +1 -1
  20. package/dist/commands/pull.d.ts +8 -2
  21. package/dist/commands/pull.js +50 -21
  22. package/dist/commands/pull.js.map +1 -1
  23. package/dist/commands/push.d.ts +8 -3
  24. package/dist/commands/push.js +71 -62
  25. package/dist/commands/push.js.map +1 -1
  26. package/dist/commands/report-bug.js +2 -5
  27. package/dist/commands/report-bug.js.map +1 -1
  28. package/dist/commands/run-eval.js +5 -3
  29. package/dist/commands/run-eval.js.map +1 -1
  30. package/dist/commands/send-message.js +4 -2
  31. package/dist/commands/send-message.js.map +1 -1
  32. package/dist/commands/status.js +1 -13
  33. package/dist/commands/status.js.map +1 -1
  34. package/dist/commands/sync-skills.js +3 -2
  35. package/dist/commands/sync-skills.js.map +1 -1
  36. package/dist/index.d.ts +2 -3
  37. package/dist/index.js +15 -21
  38. package/dist/index.js.map +1 -1
  39. package/dist/lib/api-client.d.ts +5 -22
  40. package/dist/lib/api-client.js +10 -18
  41. package/dist/lib/api-client.js.map +1 -1
  42. package/dist/lib/repo-config.d.ts +4 -23
  43. package/dist/lib/repo-config.js +17 -103
  44. package/dist/lib/repo-config.js.map +1 -1
  45. package/dist/lib/sql-output.d.ts +17 -0
  46. package/dist/lib/sql-output.js +48 -0
  47. package/dist/lib/sql-output.js.map +1 -0
  48. package/dist/lib/utils.d.ts +1 -0
  49. package/dist/lib/utils.js +14 -2
  50. package/dist/lib/utils.js.map +1 -1
  51. package/dist/lib/workspace.d.ts +38 -15
  52. package/dist/lib/workspace.js +147 -57
  53. package/dist/lib/workspace.js.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/commands/create-project.d.ts +0 -14
  56. package/dist/commands/create-project.js +0 -50
  57. package/dist/commands/create-project.js.map +0 -1
@@ -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
- const repoConfig = requireRepoConfig();
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(repoConfig.hub_id, { enabled: enabledFilter });
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;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IACpD,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IAEvC,aAAa;IACb,IAAI,aAAiC,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,aAAa,GAAG,MAAM,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,aAAa,GAAG,OAAO,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAEpF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QACtD,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,cAAc,OAAO,KAAK,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACnF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,UAAU,IAAI,SAAS,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;IAC5I,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"evals.js","sourceRoot":"","sources":["../../src/commands/evals.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,14 @@
1
1
  /**
2
- * wayai init [--hub <hub-id>] — set up .wayai.yaml to scope this repo to a single hub
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 project hub
5
- * Direct mode: --hub <uuid> resolves org/project info from the API
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
- hubId: string | undefined;
11
+ orgId: string | undefined;
9
12
  autoConfirm: boolean;
10
13
  };
11
14
  export declare function initCommand(args: string[]): Promise<void>;
@@ -1,37 +1,40 @@
1
1
  /**
2
- * wayai init [--hub <hub-id>] — set up .wayai.yaml to scope this repo to a single hub
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 project hub
5
- * Direct mode: --hub <uuid> resolves org/project info from the API
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, readPartialRepoConfig, writeRepoConfig, writePartialRepoConfig } from '../lib/repo-config.js';
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 hubId;
17
+ let orgId;
15
18
  let autoConfirm = false;
16
- const hubIdx = args.indexOf('--hub');
17
- if (hubIdx !== -1 && args[hubIdx + 1]) {
18
- hubId = args[hubIdx + 1];
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 { hubId, autoConfirm };
28
+ return { orgId, autoConfirm };
26
29
  }
27
30
  export async function initCommand(args) {
28
- const { hubId: directHubId, autoConfirm } = parseArgs(args);
31
+ const { orgId: directOrgId, autoConfirm } = parseArgs(args);
29
32
  // Warn if .wayai.yaml already exists
30
- const existing = readRepoConfig() ?? readPartialRepoConfig();
33
+ const existing = readRepoConfig();
31
34
  if (existing) {
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
+ 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 (directHubId) {
47
- await initDirect(client, directHubId);
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
- // 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
- }
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, hubId) {
77
- if (!UUID_RE.test(hubId)) {
78
- console.error('Invalid hub ID. Expected a UUID.');
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
- // Search all orgs → hubs to find the hub by ID (fan out in parallel)
82
- console.log('Looking up hub...');
80
+ console.log('Looking up organization...');
83
81
  const { organizations } = await client.organizations();
84
- const results = await Promise.all(organizations.map((org) => client.listHubs(org.id).then((r) => ({ org, hubs: r.hubs }))));
85
- for (const { org, hubs } of results) {
86
- const hubMatch = hubs.find((h) => h.hub_id === hubId);
87
- if (hubMatch) {
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
- console.error(`Hub ${hubId} not found in any organization you have access to.`);
109
- process.exit(1);
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":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * wayai list — list organizations, projects, and hubs
2
+ * wayai list — list organizations and hubs
3
3
  *
4
4
  * Usage:
5
- * wayai list # all orgs → projects → hubs
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
  */
@@ -1,8 +1,8 @@
1
1
  /**
2
- * wayai list — list organizations, projects, and hubs
2
+ * wayai list — list organizations and hubs
3
3
  *
4
4
  * Usage:
5
- * wayai list # all orgs → projects → hubs
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
- // Group hubs by project
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 [projectId, project] of projectMap) {
77
- console.log(` ${project.name} (${projectId})`);
78
- for (const hub of project.hubs) {
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":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -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
- * Pulls the single hub specified in .wayai.yaml (hub_id).
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>;
@@ -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
- * Pulls the single hub specified in .wayai.yaml (hub_id).
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
- for (const arg of args) {
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
- * Resolve the hub folder for the configured hub_id.
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
- const match = allHubs.find((h) => h.hubId === hubId);
35
- return match ? match.hubFolder : null;
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
- // Try to find existing hub folder locally
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, repoConfig.project_name || repoConfig.project_id.slice(0, 8), payload.hub.name, payload.hub_environment, payload.preview_label, payload.branch_name);
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...');