@wayai/cli 0.1.1 → 0.2.1
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/init.d.ts +7 -0
- package/dist/commands/init.js +88 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pull.d.ts +7 -1
- package/dist/commands/pull.js +134 -42
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts +14 -1
- package/dist/commands/push.js +270 -54
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.js +17 -8
- package/dist/commands/status.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +108 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +3 -1
- package/dist/lib/api-client.js +9 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/parser.js +13 -3
- package/dist/lib/parser.js.map +1 -1
- package/dist/lib/repo-config.d.ts +16 -0
- package/dist/lib/repo-config.js +49 -0
- package/dist/lib/repo-config.js.map +1 -0
- package/dist/lib/types.d.ts +13 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.js +13 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/workspace.d.ts +75 -0
- package/dist/lib/workspace.js +244 -0
- package/dist/lib/workspace.js.map +1 -0
- package/dist/lib/workspace.test.d.ts +5 -0
- package/dist/lib/workspace.test.js +329 -0
- package/dist/lib/workspace.test.js.map +1 -0
- package/dist/lib/yaml-writer.js +10 -6
- package/dist/lib/yaml-writer.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for resolveExplicitHubPath and findHubByFolderPath
|
|
3
|
+
* using vi.mock to mock filesystem and child_process dependencies.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Mocks
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
vi.mock('node:fs', () => ({
|
|
11
|
+
existsSync: vi.fn(),
|
|
12
|
+
statSync: vi.fn(),
|
|
13
|
+
readFileSync: vi.fn(),
|
|
14
|
+
readdirSync: vi.fn(),
|
|
15
|
+
}));
|
|
16
|
+
vi.mock('node:child_process', () => ({
|
|
17
|
+
execFileSync: vi.fn(),
|
|
18
|
+
}));
|
|
19
|
+
// Import after mocks are set up
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import { execFileSync } from 'node:child_process';
|
|
22
|
+
import { resolveExplicitHubPath, findHubByFolderPath } from './workspace.js';
|
|
23
|
+
const mockExistsSync = vi.mocked(fs.existsSync);
|
|
24
|
+
const mockStatSync = vi.mocked(fs.statSync);
|
|
25
|
+
const mockReadFileSync = vi.mocked(fs.readFileSync);
|
|
26
|
+
const mockExecFileSync = vi.mocked(execFileSync);
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Helpers
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
const VALID_WAYAI_YAML = `hub_id: "hub-abc-123"
|
|
31
|
+
hub_environment: production
|
|
32
|
+
hub:
|
|
33
|
+
name: Test Hub
|
|
34
|
+
`;
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Tests: findHubByFolderPath
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
describe('findHubByFolderPath', () => {
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
vi.resetAllMocks();
|
|
41
|
+
});
|
|
42
|
+
it('returns HubLocation when folder exists with valid wayai.yaml', () => {
|
|
43
|
+
const workspaceDir = '/workspace';
|
|
44
|
+
const candidate = path.join(workspaceDir, 'my-project', 'my-hub');
|
|
45
|
+
const yamlPath = path.join(candidate, 'wayai.yaml');
|
|
46
|
+
// Mock the directory check (isDirectory via statSync)
|
|
47
|
+
mockStatSync.mockImplementation((p) => {
|
|
48
|
+
if (p === candidate) {
|
|
49
|
+
return { isDirectory: () => true };
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
52
|
+
});
|
|
53
|
+
// Mock wayai.yaml existence and content
|
|
54
|
+
mockExistsSync.mockImplementation((p) => p === yamlPath);
|
|
55
|
+
mockReadFileSync.mockImplementation((p) => {
|
|
56
|
+
if (p === yamlPath)
|
|
57
|
+
return VALID_WAYAI_YAML;
|
|
58
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
59
|
+
});
|
|
60
|
+
const result = findHubByFolderPath(workspaceDir, 'my-project', 'my-hub');
|
|
61
|
+
expect(result).not.toBeNull();
|
|
62
|
+
expect(result.hubId).toBe('hub-abc-123');
|
|
63
|
+
expect(result.hubEnvironment).toBe('production');
|
|
64
|
+
expect(result.hubFolder).toBe(candidate);
|
|
65
|
+
});
|
|
66
|
+
it('returns null when folder does not exist', () => {
|
|
67
|
+
mockStatSync.mockImplementation(() => {
|
|
68
|
+
throw new Error('ENOENT');
|
|
69
|
+
});
|
|
70
|
+
const result = findHubByFolderPath('/workspace', 'project', 'nonexistent-hub');
|
|
71
|
+
expect(result).toBeNull();
|
|
72
|
+
});
|
|
73
|
+
it('returns null when folder exists but has no wayai.yaml', () => {
|
|
74
|
+
const workspaceDir = '/workspace';
|
|
75
|
+
const candidate = path.join(workspaceDir, 'project', 'hub-no-yaml');
|
|
76
|
+
const yamlPath = path.join(candidate, 'wayai.yaml');
|
|
77
|
+
mockStatSync.mockImplementation((p) => {
|
|
78
|
+
if (p === candidate) {
|
|
79
|
+
return { isDirectory: () => true };
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
82
|
+
});
|
|
83
|
+
// wayai.yaml does not exist
|
|
84
|
+
mockExistsSync.mockImplementation(() => false);
|
|
85
|
+
const result = findHubByFolderPath(workspaceDir, 'project', 'hub-no-yaml');
|
|
86
|
+
expect(result).toBeNull();
|
|
87
|
+
});
|
|
88
|
+
it('returns null when wayai.yaml exists but lacks hub_id', () => {
|
|
89
|
+
const workspaceDir = '/workspace';
|
|
90
|
+
const candidate = path.join(workspaceDir, 'project', 'bad-hub');
|
|
91
|
+
const yamlPath = path.join(candidate, 'wayai.yaml');
|
|
92
|
+
mockStatSync.mockImplementation((p) => {
|
|
93
|
+
if (p === candidate) {
|
|
94
|
+
return { isDirectory: () => true };
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
97
|
+
});
|
|
98
|
+
mockExistsSync.mockImplementation((p) => p === yamlPath);
|
|
99
|
+
mockReadFileSync.mockImplementation((p) => {
|
|
100
|
+
if (p === yamlPath)
|
|
101
|
+
return 'hub_environment: preview\nhub:\n name: Bad\n';
|
|
102
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
103
|
+
});
|
|
104
|
+
const result = findHubByFolderPath(workspaceDir, 'project', 'bad-hub');
|
|
105
|
+
expect(result).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
it('returns null when wayai.yaml has invalid YAML', () => {
|
|
108
|
+
const workspaceDir = '/workspace';
|
|
109
|
+
const candidate = path.join(workspaceDir, 'project', 'bad-yaml');
|
|
110
|
+
const yamlPath = path.join(candidate, 'wayai.yaml');
|
|
111
|
+
mockStatSync.mockImplementation((p) => {
|
|
112
|
+
if (p === candidate) {
|
|
113
|
+
return { isDirectory: () => true };
|
|
114
|
+
}
|
|
115
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
116
|
+
});
|
|
117
|
+
mockExistsSync.mockImplementation((p) => p === yamlPath);
|
|
118
|
+
mockReadFileSync.mockImplementation((p) => {
|
|
119
|
+
if (p === yamlPath)
|
|
120
|
+
return '{{{{ invalid yaml';
|
|
121
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
122
|
+
});
|
|
123
|
+
const result = findHubByFolderPath(workspaceDir, 'project', 'bad-yaml');
|
|
124
|
+
expect(result).toBeNull();
|
|
125
|
+
});
|
|
126
|
+
it('returns preview environment when wayai.yaml specifies preview', () => {
|
|
127
|
+
const workspaceDir = '/workspace';
|
|
128
|
+
const candidate = path.join(workspaceDir, 'project', 'preview-hub');
|
|
129
|
+
const yamlPath = path.join(candidate, 'wayai.yaml');
|
|
130
|
+
mockStatSync.mockImplementation((p) => {
|
|
131
|
+
if (p === candidate) {
|
|
132
|
+
return { isDirectory: () => true };
|
|
133
|
+
}
|
|
134
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
135
|
+
});
|
|
136
|
+
const previewYaml = `hub_id: "hub-preview-1"
|
|
137
|
+
hub_environment: preview
|
|
138
|
+
hub:
|
|
139
|
+
name: Preview Hub
|
|
140
|
+
`;
|
|
141
|
+
mockExistsSync.mockImplementation((p) => p === yamlPath);
|
|
142
|
+
mockReadFileSync.mockImplementation((p) => {
|
|
143
|
+
if (p === yamlPath)
|
|
144
|
+
return previewYaml;
|
|
145
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
146
|
+
});
|
|
147
|
+
const result = findHubByFolderPath(workspaceDir, 'project', 'preview-hub');
|
|
148
|
+
expect(result).not.toBeNull();
|
|
149
|
+
expect(result.hubId).toBe('hub-preview-1');
|
|
150
|
+
expect(result.hubEnvironment).toBe('preview');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Tests: resolveExplicitHubPath
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
describe('resolveExplicitHubPath', () => {
|
|
157
|
+
beforeEach(() => {
|
|
158
|
+
vi.resetAllMocks();
|
|
159
|
+
});
|
|
160
|
+
/**
|
|
161
|
+
* Helper: configure mocks so detectWorkspace() returns null
|
|
162
|
+
* (no git root or no workspace/ directory).
|
|
163
|
+
*/
|
|
164
|
+
function mockNoWorkspace() {
|
|
165
|
+
// execFileSync for git rev-parse throws (not in a git repo)
|
|
166
|
+
mockExecFileSync.mockImplementation(() => {
|
|
167
|
+
throw new Error('not a git repository');
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Helper: configure mocks so detectWorkspace() finds a workspace at the given root.
|
|
172
|
+
*/
|
|
173
|
+
function mockWorkspaceAt(gitRoot) {
|
|
174
|
+
const workspaceDir = path.join(gitRoot, 'workspace');
|
|
175
|
+
// execFileSync for git rev-parse returns the gitRoot
|
|
176
|
+
mockExecFileSync.mockReturnValue(gitRoot + '\n');
|
|
177
|
+
// workspace dir exists and is a directory
|
|
178
|
+
mockExistsSync.mockImplementation((p) => {
|
|
179
|
+
if (p === workspaceDir)
|
|
180
|
+
return true;
|
|
181
|
+
return false;
|
|
182
|
+
});
|
|
183
|
+
mockStatSync.mockImplementation((p) => {
|
|
184
|
+
if (p === workspaceDir) {
|
|
185
|
+
return { isDirectory: () => true };
|
|
186
|
+
}
|
|
187
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
it('throws Error for invalid path with 1 segment', () => {
|
|
191
|
+
mockNoWorkspace();
|
|
192
|
+
expect(() => resolveExplicitHubPath('just-one-segment')).toThrow('Hub path must be project/hub or org/project/hub');
|
|
193
|
+
});
|
|
194
|
+
it('throws Error for invalid path with 4 segments', () => {
|
|
195
|
+
mockNoWorkspace();
|
|
196
|
+
expect(() => resolveExplicitHubPath('a/b/c/d')).toThrow('Hub path must be project/hub or org/project/hub');
|
|
197
|
+
});
|
|
198
|
+
it('throws Error for empty path (0 segments)', () => {
|
|
199
|
+
mockNoWorkspace();
|
|
200
|
+
// Empty string split by '/' gives [''] which has length 1
|
|
201
|
+
expect(() => resolveExplicitHubPath('')).toThrow('Hub path must be project/hub or org/project/hub');
|
|
202
|
+
});
|
|
203
|
+
it('returns segments for 2-part path when no workspace exists', () => {
|
|
204
|
+
mockNoWorkspace();
|
|
205
|
+
const result = resolveExplicitHubPath('my-project/my-hub');
|
|
206
|
+
expect('segments' in result).toBe(true);
|
|
207
|
+
if ('segments' in result) {
|
|
208
|
+
expect(result.segments.project).toBe('my-project');
|
|
209
|
+
expect(result.segments.hub).toBe('my-hub');
|
|
210
|
+
expect(result.segments.orgPrefix).toBeUndefined();
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
it('returns segments for 3-part path (org/project/hub)', () => {
|
|
214
|
+
mockNoWorkspace();
|
|
215
|
+
const result = resolveExplicitHubPath('my-org/my-project/my-hub');
|
|
216
|
+
expect('segments' in result).toBe(true);
|
|
217
|
+
if ('segments' in result) {
|
|
218
|
+
expect(result.segments.orgPrefix).toBe('my-org');
|
|
219
|
+
expect(result.segments.project).toBe('my-project');
|
|
220
|
+
expect(result.segments.hub).toBe('my-hub');
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
it('returns segments for 2-part path when workspace exists but hub not found locally', () => {
|
|
224
|
+
const gitRoot = '/home/user/repo';
|
|
225
|
+
mockWorkspaceAt(gitRoot);
|
|
226
|
+
// findHubByFolderPath will call statSync on the candidate path, which will
|
|
227
|
+
// fail since we only mock workspace dir — causing it to return null
|
|
228
|
+
const result = resolveExplicitHubPath('project-x/hub-y');
|
|
229
|
+
expect('segments' in result).toBe(true);
|
|
230
|
+
if ('segments' in result) {
|
|
231
|
+
expect(result.segments.project).toBe('project-x');
|
|
232
|
+
expect(result.segments.hub).toBe('hub-y');
|
|
233
|
+
expect(result.segments.orgPrefix).toBeUndefined();
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
it('returns resolved hub for 2-part path when workspace has matching folder', () => {
|
|
237
|
+
const gitRoot = '/home/user/repo';
|
|
238
|
+
const workspaceDir = path.join(gitRoot, 'workspace');
|
|
239
|
+
const candidateFolder = path.join(workspaceDir, 'support', 'customer-hub');
|
|
240
|
+
const yamlPath = path.join(candidateFolder, 'wayai.yaml');
|
|
241
|
+
// execFileSync for git rev-parse
|
|
242
|
+
mockExecFileSync.mockReturnValue(gitRoot + '\n');
|
|
243
|
+
// existsSync: workspace dir, wayai.yaml
|
|
244
|
+
mockExistsSync.mockImplementation((p) => {
|
|
245
|
+
if (p === workspaceDir)
|
|
246
|
+
return true;
|
|
247
|
+
if (p === yamlPath)
|
|
248
|
+
return true;
|
|
249
|
+
return false;
|
|
250
|
+
});
|
|
251
|
+
// statSync: workspace dir is a directory, candidate hub folder is a directory
|
|
252
|
+
mockStatSync.mockImplementation((p) => {
|
|
253
|
+
if (p === workspaceDir || p === candidateFolder) {
|
|
254
|
+
return { isDirectory: () => true };
|
|
255
|
+
}
|
|
256
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
257
|
+
});
|
|
258
|
+
// readFileSync: wayai.yaml content
|
|
259
|
+
mockReadFileSync.mockImplementation((p) => {
|
|
260
|
+
if (p === yamlPath) {
|
|
261
|
+
return `hub_id: "hub-resolved-id"
|
|
262
|
+
hub_environment: production
|
|
263
|
+
hub:
|
|
264
|
+
name: Customer Hub
|
|
265
|
+
`;
|
|
266
|
+
}
|
|
267
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
268
|
+
});
|
|
269
|
+
const result = resolveExplicitHubPath('support/customer-hub');
|
|
270
|
+
expect('resolved' in result).toBe(true);
|
|
271
|
+
if ('resolved' in result) {
|
|
272
|
+
expect(result.resolved.hubId).toBe('hub-resolved-id');
|
|
273
|
+
expect(result.resolved.hubFolder).toBe(candidateFolder);
|
|
274
|
+
expect(result.resolved.hubEnvironment).toBe('production');
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
it('returns segments for 3-part path even when workspace exists but hub not found', () => {
|
|
278
|
+
const gitRoot = '/home/user/repo';
|
|
279
|
+
mockWorkspaceAt(gitRoot);
|
|
280
|
+
// For 3-part path, project segment is parts[1] and hub segment is parts[2]
|
|
281
|
+
// The folder lookup uses project="my-project" and hub="my-hub"
|
|
282
|
+
const result = resolveExplicitHubPath('acme-org/my-project/my-hub');
|
|
283
|
+
expect('segments' in result).toBe(true);
|
|
284
|
+
if ('segments' in result) {
|
|
285
|
+
expect(result.segments.orgPrefix).toBe('acme-org');
|
|
286
|
+
expect(result.segments.project).toBe('my-project');
|
|
287
|
+
expect(result.segments.hub).toBe('my-hub');
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
it('returns resolved hub for 3-part path when workspace has matching folder', () => {
|
|
291
|
+
const gitRoot = '/home/user/repo';
|
|
292
|
+
const workspaceDir = path.join(gitRoot, 'workspace');
|
|
293
|
+
// Note: for 3-part path, the folder lookup uses parts[1] (project) and parts[2] (hub)
|
|
294
|
+
const candidateFolder = path.join(workspaceDir, 'sales', 'lead-hub');
|
|
295
|
+
const yamlPath = path.join(candidateFolder, 'wayai.yaml');
|
|
296
|
+
mockExecFileSync.mockReturnValue(gitRoot + '\n');
|
|
297
|
+
mockExistsSync.mockImplementation((p) => {
|
|
298
|
+
if (p === workspaceDir)
|
|
299
|
+
return true;
|
|
300
|
+
if (p === yamlPath)
|
|
301
|
+
return true;
|
|
302
|
+
return false;
|
|
303
|
+
});
|
|
304
|
+
mockStatSync.mockImplementation((p) => {
|
|
305
|
+
if (p === workspaceDir || p === candidateFolder) {
|
|
306
|
+
return { isDirectory: () => true };
|
|
307
|
+
}
|
|
308
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
309
|
+
});
|
|
310
|
+
mockReadFileSync.mockImplementation((p) => {
|
|
311
|
+
if (p === yamlPath) {
|
|
312
|
+
return `hub_id: "hub-lead-456"
|
|
313
|
+
hub_environment: preview
|
|
314
|
+
hub:
|
|
315
|
+
name: Lead Hub
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
318
|
+
throw new Error(`ENOENT: ${String(p)}`);
|
|
319
|
+
});
|
|
320
|
+
const result = resolveExplicitHubPath('acme-org/sales/lead-hub');
|
|
321
|
+
expect('resolved' in result).toBe(true);
|
|
322
|
+
if ('resolved' in result) {
|
|
323
|
+
expect(result.resolved.hubId).toBe('hub-lead-456');
|
|
324
|
+
expect(result.resolved.hubFolder).toBe(candidateFolder);
|
|
325
|
+
expect(result.resolved.hubEnvironment).toBe('preview');
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
//# sourceMappingURL=workspace.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.test.js","sourceRoot":"","sources":["../../src/lib/workspace.test.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/yaml-writer.js
CHANGED
|
@@ -62,16 +62,20 @@ function buildYamlPayload(payload) {
|
|
|
62
62
|
version: payload.version,
|
|
63
63
|
hub_id: payload.hub_id,
|
|
64
64
|
hub_environment: payload.hub_environment,
|
|
65
|
-
hub: payload.hub,
|
|
66
65
|
};
|
|
66
|
+
// Include preview_label for preview hubs (read-only metadata)
|
|
67
|
+
if (payload.preview_label) {
|
|
68
|
+
result.preview_label = payload.preview_label;
|
|
69
|
+
}
|
|
70
|
+
result.hub = payload.hub;
|
|
67
71
|
if (payload.agents && payload.agents.length > 0) {
|
|
68
72
|
result.agents = payload.agents.map((agent) => {
|
|
69
73
|
const entry = { ...agent };
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
// Remove inline instructions — convention-based path resolution (agents/<slug>.md)
|
|
75
|
+
// The .md file is still written by extractAgentFiles().
|
|
76
|
+
// Note: the writer is only called during `pull` (payload has inline text from server).
|
|
77
|
+
// Explicit .md path overrides in YAML are preserved across `push` (parser handles them).
|
|
78
|
+
delete entry.instructions;
|
|
75
79
|
return entry;
|
|
76
80
|
});
|
|
77
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-writer.js","sourceRoot":"","sources":["../../src/lib/yaml-writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAyB;IACzE,2BAA2B;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,8EAA8E;IAC9E,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE9C,mBAAmB;IACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACzC,SAAS,EAAE,CAAC,CAAC,EAAO,mBAAmB;QACvC,MAAM,EAAE,IAAI,EAAS,yBAAyB;QAC9C,WAAW,EAAE,GAAG;QAChB,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAE3E,gCAAgC;IAChC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,CAAC;QAC3C,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAED,0BAA0B;IAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAyB;IACjD,MAAM,MAAM,GAA4B;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,eAAe,EAAE,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"yaml-writer.js","sourceRoot":"","sources":["../../src/lib/yaml-writer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wayai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "WayAI CLI — sync hub configuration between local files and the platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -24,7 +24,13 @@
|
|
|
24
24
|
"url": "https://github.com/wayai-pro/platform.git",
|
|
25
25
|
"directory": "cli"
|
|
26
26
|
},
|
|
27
|
-
"keywords": [
|
|
27
|
+
"keywords": [
|
|
28
|
+
"wayai",
|
|
29
|
+
"cli",
|
|
30
|
+
"hub",
|
|
31
|
+
"ai",
|
|
32
|
+
"config"
|
|
33
|
+
],
|
|
28
34
|
"license": "MIT",
|
|
29
35
|
"dependencies": {
|
|
30
36
|
"js-yaml": "^4.1.0"
|