@pitcher/cli-scripts 2.11.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +40 -2
  2. package/dist/index.js +2 -0
  3. package/dist/src/commands/analytics.d.ts +16 -0
  4. package/dist/src/commands/analytics.js +44 -1
  5. package/dist/src/commands/ld/assessment.d.ts +61 -0
  6. package/dist/src/commands/ld/assessment.js +235 -0
  7. package/dist/src/commands/ld/canvasCourse.d.ts +20 -0
  8. package/dist/src/commands/ld/canvasCourse.js +69 -0
  9. package/dist/src/commands/ld/cert.d.ts +93 -0
  10. package/dist/src/commands/ld/cert.js +355 -0
  11. package/dist/src/commands/ld/course.d.ts +62 -0
  12. package/dist/src/commands/ld/course.js +308 -0
  13. package/dist/src/commands/ld/module.d.ts +43 -0
  14. package/dist/src/commands/ld/module.js +199 -0
  15. package/dist/src/commands/ld.d.ts +2 -0
  16. package/dist/src/commands/ld.js +15 -0
  17. package/dist/src/core/http.d.ts +10 -0
  18. package/dist/src/core/http.js +20 -0
  19. package/dist/src/core/ld.d.ts +38 -0
  20. package/dist/src/core/ld.js +102 -0
  21. package/dist/src/core/readInput.d.ts +1 -0
  22. package/dist/src/core/readInput.js +14 -0
  23. package/dist/src/mcp/bundled.js +1 -1
  24. package/dist/src/mcp/prompts/ldCanvasCourse.d.ts +2 -0
  25. package/dist/src/mcp/prompts/ldCanvasCourse.js +50 -0
  26. package/dist/src/mcp/prompts/registry.js +8 -1
  27. package/dist/src/mcp/registry.js +2 -0
  28. package/dist/src/mcp/resources/ldCanvasDesign.d.ts +3 -0
  29. package/dist/src/mcp/resources/ldCanvasDesign.js +51 -0
  30. package/dist/src/mcp/resources/registry.js +2 -1
  31. package/dist/src/mcp/tools/analytics.js +18 -1
  32. package/dist/src/mcp/tools/ld.d.ts +2 -0
  33. package/dist/src/mcp/tools/ld.js +680 -0
  34. package/package.json +1 -1
@@ -0,0 +1,355 @@
1
+ import { Command } from 'commander';
2
+ import { ldClientFor, ldData, toLdCliError, requireInstance, pickTruthy } from '../../core/ld.js';
3
+ import { ok, fail } from '../../core/envelope.js';
4
+ import { createCliError } from '../../core/errors.js';
5
+ import { parseJsonInput } from '../../core/readInput.js';
6
+ import { listLimitOffsetParams } from '../../core/pagination.js';
7
+ import { assertIntFlags } from '../../schema/content.js';
8
+ import { csv, ldFlags, render, boolFlag } from './course.js';
9
+ const ADMIN = '/admin/certificates';
10
+ // ---- run* functions ----
11
+ export async function runLdCertTags(opts, deps = {}) {
12
+ try {
13
+ const instanceId = requireInstance(opts);
14
+ const client = await ldClientFor(opts, deps);
15
+ const res = await client.get(`${ADMIN}/tags`, { params: { instanceId } });
16
+ return ok(ldData(res));
17
+ }
18
+ catch (e) {
19
+ return fail(toLdCliError(e));
20
+ }
21
+ }
22
+ export async function runLdCertList(opts, deps = {}) {
23
+ try {
24
+ const instanceId = requireInstance(opts);
25
+ assertIntFlags(opts); // rejects --limit/--offset that parsed to NaN (matches sibling commands)
26
+ const params = { instanceId, ...listLimitOffsetParams(opts), ...pickTruthy(opts, ['status', 'title', 'tags']) };
27
+ const client = await ldClientFor(opts, deps);
28
+ const res = await client.get(ADMIN, { params });
29
+ return ok(ldData(res));
30
+ }
31
+ catch (e) {
32
+ return fail(toLdCliError(e));
33
+ }
34
+ }
35
+ export async function runLdCertGet(opts, deps = {}) {
36
+ try {
37
+ const instanceId = requireInstance(opts);
38
+ if (!opts.id)
39
+ throw createCliError('VALIDATION', '--id is required');
40
+ const client = await ldClientFor(opts, deps);
41
+ const res = await client.get(`${ADMIN}/${opts.id}`, { params: { instanceId } });
42
+ return ok(ldData(res));
43
+ }
44
+ catch (e) {
45
+ return fail(toLdCliError(e));
46
+ }
47
+ }
48
+ // createCertificateSchema requires instanceId + title IN THE BODY (validateBody parses req.body
49
+ // alone; the controller also reads instanceId from the query, but validation runs first, so
50
+ // instanceId must be in the body too). description/tags/validityPeriod pass through when set.
51
+ export async function runLdCertCreate(opts, deps = {}) {
52
+ try {
53
+ const instanceId = requireInstance(opts);
54
+ if (!opts.title)
55
+ throw createCliError('VALIDATION', '--title is required');
56
+ const body = { instanceId, title: opts.title };
57
+ if (opts.description !== undefined)
58
+ body.description = opts.description;
59
+ if (opts.tags !== undefined)
60
+ body.tags = opts.tags;
61
+ if (opts.validityPeriod !== undefined)
62
+ body.validityPeriod = opts.validityPeriod;
63
+ const client = await ldClientFor(opts, deps);
64
+ const res = await client.post(ADMIN, body, { params: { instanceId } });
65
+ return ok(ldData(res));
66
+ }
67
+ catch (e) {
68
+ return fail(toLdCliError(e));
69
+ }
70
+ }
71
+ // updateCertificateSchema is createCertificateSchema.partial() — every field optional. Send only what changed.
72
+ export async function runLdCertUpdate(opts, deps = {}) {
73
+ try {
74
+ const instanceId = requireInstance(opts);
75
+ if (!opts.id)
76
+ throw createCliError('VALIDATION', '--id is required');
77
+ const body = {};
78
+ if (opts.title !== undefined)
79
+ body.title = opts.title;
80
+ if (opts.description !== undefined)
81
+ body.description = opts.description;
82
+ if (opts.tags !== undefined)
83
+ body.tags = opts.tags;
84
+ if (opts.validityPeriod !== undefined)
85
+ body.validityPeriod = opts.validityPeriod;
86
+ const client = await ldClientFor(opts, deps);
87
+ const res = await client.put(`${ADMIN}/${opts.id}`, body, { params: { instanceId } });
88
+ return ok(ldData(res));
89
+ }
90
+ catch (e) {
91
+ return fail(toLdCliError(e));
92
+ }
93
+ }
94
+ export async function runLdCertDelete(opts, deps = {}) {
95
+ try {
96
+ const instanceId = requireInstance(opts);
97
+ if (!opts.id)
98
+ throw createCliError('VALIDATION', '--id is required');
99
+ const client = await ldClientFor(opts, deps);
100
+ const res = await client.delete(`${ADMIN}/${opts.id}`, { params: { instanceId } });
101
+ return ok(ldData(res) ?? { id: opts.id, deleted: true });
102
+ }
103
+ catch (e) {
104
+ return fail(toLdCliError(e));
105
+ }
106
+ }
107
+ export async function runLdCertTrainingMaterials(opts, deps = {}) {
108
+ try {
109
+ const instanceId = requireInstance(opts);
110
+ if (!opts.id)
111
+ throw createCliError('VALIDATION', '--id is required');
112
+ const client = await ldClientFor(opts, deps);
113
+ const res = await client.get(`${ADMIN}/${opts.id}/training-materials`, { params: { instanceId } });
114
+ return ok(ldData(res));
115
+ }
116
+ catch (e) {
117
+ return fail(toLdCliError(e));
118
+ }
119
+ }
120
+ // ---- modules ----
121
+ export async function runLdCertListModules(opts, deps = {}) {
122
+ try {
123
+ const instanceId = requireInstance(opts);
124
+ if (!opts.id)
125
+ throw createCliError('VALIDATION', '--id is required');
126
+ const client = await ldClientFor(opts, deps);
127
+ const res = await client.get(`${ADMIN}/${opts.id}/modules`, { params: { instanceId } });
128
+ return ok(ldData(res));
129
+ }
130
+ catch (e) {
131
+ return fail(toLdCliError(e));
132
+ }
133
+ }
134
+ export async function runLdCertAddModules(opts, deps = {}) {
135
+ try {
136
+ const instanceId = requireInstance(opts);
137
+ if (!opts.id)
138
+ throw createCliError('VALIDATION', '--id is required');
139
+ if (!opts.moduleIds?.length)
140
+ throw createCliError('VALIDATION', '--module-ids is required (comma-separated)');
141
+ const client = await ldClientFor(opts, deps);
142
+ const res = await client.post(`${ADMIN}/${opts.id}/modules`, { moduleIds: opts.moduleIds }, { params: { instanceId } });
143
+ return ok(ldData(res));
144
+ }
145
+ catch (e) {
146
+ return fail(toLdCliError(e));
147
+ }
148
+ }
149
+ export async function runLdCertReorderModules(opts, deps = {}) {
150
+ try {
151
+ const instanceId = requireInstance(opts);
152
+ if (!opts.id)
153
+ throw createCliError('VALIDATION', '--id is required');
154
+ if (!opts.itemId)
155
+ throw createCliError('VALIDATION', '--item-id is required');
156
+ if (opts.newOrder === undefined || !Number.isInteger(opts.newOrder))
157
+ throw createCliError('VALIDATION', '--new-order is required (integer)');
158
+ const client = await ldClientFor(opts, deps);
159
+ const res = await client.put(`${ADMIN}/${opts.id}/modules/order`, { itemId: opts.itemId, newOrder: opts.newOrder, type: 'module' }, { params: { instanceId } });
160
+ return ok(ldData(res));
161
+ }
162
+ catch (e) {
163
+ return fail(toLdCliError(e));
164
+ }
165
+ }
166
+ export async function runLdCertUpdateModule(opts, deps = {}) {
167
+ try {
168
+ const instanceId = requireInstance(opts);
169
+ if (!opts.id || !opts.moduleId)
170
+ throw createCliError('VALIDATION', '--id and --module-id are required');
171
+ const body = {};
172
+ if (opts.isRequired !== undefined)
173
+ body.isRequired = opts.isRequired;
174
+ const client = await ldClientFor(opts, deps);
175
+ const res = await client.put(`${ADMIN}/${opts.id}/modules/${opts.moduleId}`, body, { params: { instanceId } });
176
+ return ok(ldData(res));
177
+ }
178
+ catch (e) {
179
+ return fail(toLdCliError(e));
180
+ }
181
+ }
182
+ export async function runLdCertRemoveModule(opts, deps = {}) {
183
+ try {
184
+ const instanceId = requireInstance(opts);
185
+ if (!opts.id || !opts.moduleId)
186
+ throw createCliError('VALIDATION', '--id and --module-id are required');
187
+ const client = await ldClientFor(opts, deps);
188
+ const res = await client.delete(`${ADMIN}/${opts.id}/modules/${opts.moduleId}`, { params: { instanceId } });
189
+ return ok(ldData(res) ?? { removed: true });
190
+ }
191
+ catch (e) {
192
+ return fail(toLdCliError(e));
193
+ }
194
+ }
195
+ // ---- courses ----
196
+ export async function runLdCertListCourses(opts, deps = {}) {
197
+ try {
198
+ const instanceId = requireInstance(opts);
199
+ if (!opts.id)
200
+ throw createCliError('VALIDATION', '--id is required');
201
+ const client = await ldClientFor(opts, deps);
202
+ const res = await client.get(`${ADMIN}/${opts.id}/courses`, { params: { instanceId } });
203
+ return ok(ldData(res));
204
+ }
205
+ catch (e) {
206
+ return fail(toLdCliError(e));
207
+ }
208
+ }
209
+ // NOTE: cert course-add uses `courseIds` (UNLIKE the module add, which uses `moduleIds`).
210
+ export async function runLdCertAddCourses(opts, deps = {}) {
211
+ try {
212
+ const instanceId = requireInstance(opts);
213
+ if (!opts.id)
214
+ throw createCliError('VALIDATION', '--id is required');
215
+ if (!opts.courseIds?.length)
216
+ throw createCliError('VALIDATION', '--course-ids is required (comma-separated)');
217
+ const client = await ldClientFor(opts, deps);
218
+ const res = await client.post(`${ADMIN}/${opts.id}/courses`, { courseIds: opts.courseIds }, { params: { instanceId } });
219
+ return ok(ldData(res));
220
+ }
221
+ catch (e) {
222
+ return fail(toLdCliError(e));
223
+ }
224
+ }
225
+ export async function runLdCertReorderCourses(opts, deps = {}) {
226
+ try {
227
+ const instanceId = requireInstance(opts);
228
+ if (!opts.id)
229
+ throw createCliError('VALIDATION', '--id is required');
230
+ if (!opts.itemId)
231
+ throw createCliError('VALIDATION', '--item-id is required');
232
+ if (opts.newOrder === undefined || !Number.isInteger(opts.newOrder))
233
+ throw createCliError('VALIDATION', '--new-order is required (integer)');
234
+ const client = await ldClientFor(opts, deps);
235
+ const res = await client.put(`${ADMIN}/${opts.id}/courses/order`, { itemId: opts.itemId, newOrder: opts.newOrder, type: 'course' }, { params: { instanceId } });
236
+ return ok(ldData(res));
237
+ }
238
+ catch (e) {
239
+ return fail(toLdCliError(e));
240
+ }
241
+ }
242
+ export async function runLdCertUpdateCourse(opts, deps = {}) {
243
+ try {
244
+ const instanceId = requireInstance(opts);
245
+ if (!opts.id || !opts.courseId)
246
+ throw createCliError('VALIDATION', '--id and --course-id are required');
247
+ const body = {};
248
+ if (opts.isRequired !== undefined)
249
+ body.isRequired = opts.isRequired;
250
+ const client = await ldClientFor(opts, deps);
251
+ const res = await client.put(`${ADMIN}/${opts.id}/courses/${opts.courseId}`, body, { params: { instanceId } });
252
+ return ok(ldData(res));
253
+ }
254
+ catch (e) {
255
+ return fail(toLdCliError(e));
256
+ }
257
+ }
258
+ export async function runLdCertRemoveCourse(opts, deps = {}) {
259
+ try {
260
+ const instanceId = requireInstance(opts);
261
+ if (!opts.id || !opts.courseId)
262
+ throw createCliError('VALIDATION', '--id and --course-id are required');
263
+ const client = await ldClientFor(opts, deps);
264
+ const res = await client.delete(`${ADMIN}/${opts.id}/courses/${opts.courseId}`, { params: { instanceId } });
265
+ return ok(ldData(res) ?? { removed: true });
266
+ }
267
+ catch (e) {
268
+ return fail(toLdCliError(e));
269
+ }
270
+ }
271
+ // ---- assessments ----
272
+ export async function runLdCertListAssessments(opts, deps = {}) {
273
+ try {
274
+ const instanceId = requireInstance(opts);
275
+ if (!opts.id)
276
+ throw createCliError('VALIDATION', '--id is required');
277
+ const client = await ldClientFor(opts, deps);
278
+ const res = await client.get(`${ADMIN}/${opts.id}/assessments`, { params: { instanceId } });
279
+ return ok(ldData(res));
280
+ }
281
+ catch (e) {
282
+ return fail(toLdCliError(e));
283
+ }
284
+ }
285
+ // The cert assessments payload is a full array [{ id, isRequired? }], not just ids — accepted as
286
+ // inline JSON (--assessments) or a file (--assessments-file), resolved by resolveTextInput then parsed.
287
+ export async function runLdCertAddAssessments(opts, deps = {}) {
288
+ try {
289
+ const instanceId = requireInstance(opts);
290
+ if (!opts.id)
291
+ throw createCliError('VALIDATION', '--id is required');
292
+ const assessments = parseJsonInput(opts.assessments, opts.assessmentsFile, 'assessments');
293
+ const client = await ldClientFor(opts, deps);
294
+ const res = await client.post(`${ADMIN}/${opts.id}/assessments`, { assessments }, { params: { instanceId } });
295
+ return ok(ldData(res));
296
+ }
297
+ catch (e) {
298
+ return fail(toLdCliError(e));
299
+ }
300
+ }
301
+ export async function runLdCertUpdateAssessment(opts, deps = {}) {
302
+ try {
303
+ const instanceId = requireInstance(opts);
304
+ if (!opts.id || !opts.assessmentId)
305
+ throw createCliError('VALIDATION', '--id and --assessment-id are required');
306
+ // updateCertAssessmentSchema requires isRequired — sending {} 400s. Guard client-side.
307
+ if (opts.isRequired === undefined)
308
+ throw createCliError('VALIDATION', '--is-required is required (true|false)');
309
+ const client = await ldClientFor(opts, deps);
310
+ const res = await client.patch(`${ADMIN}/${opts.id}/assessments/${opts.assessmentId}`, { isRequired: opts.isRequired }, { params: { instanceId } });
311
+ return ok(ldData(res));
312
+ }
313
+ catch (e) {
314
+ return fail(toLdCliError(e));
315
+ }
316
+ }
317
+ export async function runLdCertRemoveAssessment(opts, deps = {}) {
318
+ try {
319
+ const instanceId = requireInstance(opts);
320
+ if (!opts.id || !opts.assessmentId)
321
+ throw createCliError('VALIDATION', '--id and --assessment-id are required');
322
+ const client = await ldClientFor(opts, deps);
323
+ const res = await client.delete(`${ADMIN}/${opts.id}/assessments/${opts.assessmentId}`, { params: { instanceId } });
324
+ return ok(ldData(res) ?? { removed: true });
325
+ }
326
+ catch (e) {
327
+ return fail(toLdCliError(e));
328
+ }
329
+ }
330
+ // ---- commander subcommand ----
331
+ export function createCertSubcommand() {
332
+ const cmd = new Command('cert').description('Author L&D certificates');
333
+ ldFlags(cmd.command('tags')).action(render(runLdCertTags));
334
+ ldFlags(cmd.command('list')).option('--status <s>').option('--title <t>').option('--tags <t>', 'Comma-separated', csv).option('--limit <n>', '', Number).option('--offset <n>', '', Number).action(render(runLdCertList));
335
+ ldFlags(cmd.command('get')).option('--id <id>', 'Certificate ID (required)').action(render(runLdCertGet));
336
+ ldFlags(cmd.command('create')).option('--title <t>', 'required').option('--description <d>').option('--tags <t>', 'Comma-separated', csv).option('--validity-period <n>', 'days, integer', Number).action(render(runLdCertCreate));
337
+ ldFlags(cmd.command('update')).option('--id <id>', 'required').option('--title <t>').option('--description <d>').option('--tags <t>', 'Comma-separated', csv).option('--validity-period <n>', '', Number).action(render(runLdCertUpdate));
338
+ ldFlags(cmd.command('delete')).option('--id <id>', 'required').action(render(runLdCertDelete));
339
+ ldFlags(cmd.command('training-materials')).option('--id <id>', 'required').action(render(runLdCertTrainingMaterials));
340
+ ldFlags(cmd.command('list-modules')).option('--id <id>', 'required').action(render(runLdCertListModules));
341
+ ldFlags(cmd.command('add-modules')).option('--id <id>', 'required').option('--module-ids <ids>', 'Comma-separated (required)', csv).action(render(runLdCertAddModules));
342
+ ldFlags(cmd.command('reorder-modules')).option('--id <id>', 'required').option('--item-id <id>', 'required').option('--new-order <n>', 'integer (required)', Number).action(render(runLdCertReorderModules));
343
+ ldFlags(cmd.command('update-module')).option('--id <id>', 'required').option('--module-id <id>', 'required').option('--is-required <bool>', 'true|false', boolFlag).action(render(runLdCertUpdateModule));
344
+ ldFlags(cmd.command('remove-module')).option('--id <id>', 'required').option('--module-id <id>', 'required').action(render(runLdCertRemoveModule));
345
+ ldFlags(cmd.command('list-courses')).option('--id <id>', 'required').action(render(runLdCertListCourses));
346
+ ldFlags(cmd.command('add-courses')).option('--id <id>', 'required').option('--course-ids <ids>', 'Comma-separated (required)', csv).action(render(runLdCertAddCourses));
347
+ ldFlags(cmd.command('reorder-courses')).option('--id <id>', 'required').option('--item-id <id>', 'required').option('--new-order <n>', 'integer (required)', Number).action(render(runLdCertReorderCourses));
348
+ ldFlags(cmd.command('update-course')).option('--id <id>', 'required').option('--course-id <id>', 'required').option('--is-required <bool>', 'true|false', boolFlag).action(render(runLdCertUpdateCourse));
349
+ ldFlags(cmd.command('remove-course')).option('--id <id>', 'required').option('--course-id <id>', 'required').action(render(runLdCertRemoveCourse));
350
+ ldFlags(cmd.command('list-assessments')).option('--id <id>', 'required').action(render(runLdCertListAssessments));
351
+ ldFlags(cmd.command('add-assessments')).option('--id <id>', 'required').option('--assessments <json>', 'Inline assessments JSON array').option('--assessments-file <path>').action(render(runLdCertAddAssessments));
352
+ ldFlags(cmd.command('update-assessment')).option('--id <id>', 'required').option('--assessment-id <id>', 'required').option('--is-required <bool>', 'true|false (required)', boolFlag).action(render(runLdCertUpdateAssessment));
353
+ ldFlags(cmd.command('remove-assessment')).option('--id <id>', 'required').option('--assessment-id <id>', 'required').action(render(runLdCertRemoveAssessment));
354
+ return cmd;
355
+ }
@@ -0,0 +1,62 @@
1
+ import { Command } from 'commander';
2
+ import { type LdCommonOpts, type LdDeps } from '../../core/ld.js';
3
+ import { type Envelope } from '../../core/envelope.js';
4
+ export declare function runLdCourseList(opts: LdCommonOpts & {
5
+ status?: string;
6
+ title?: string;
7
+ tags?: string[];
8
+ limit?: number;
9
+ offset?: number;
10
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
11
+ export declare function runLdCourseGet(opts: LdCommonOpts & {
12
+ id?: string;
13
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
14
+ export declare function runLdCourseTags(opts: LdCommonOpts, deps?: LdDeps): Promise<Envelope<unknown>>;
15
+ export declare function runLdCourseCreate(opts: LdCommonOpts & Record<string, unknown>, deps?: LdDeps): Promise<Envelope<unknown>>;
16
+ export declare function runLdCourseUpdate(opts: LdCommonOpts & {
17
+ id?: string;
18
+ } & Record<string, unknown>, deps?: LdDeps): Promise<Envelope<unknown>>;
19
+ export declare function runLdCourseDelete(opts: LdCommonOpts & {
20
+ id?: string;
21
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
22
+ export declare const runLdCoursePublish: (o: LdCommonOpts & {
23
+ id?: string;
24
+ }, d?: LdDeps) => Promise<Envelope<unknown>>;
25
+ export declare const runLdCourseUnpublish: (o: LdCommonOpts & {
26
+ id?: string;
27
+ }, d?: LdDeps) => Promise<Envelope<unknown>>;
28
+ export declare function runLdCourseGetCanvas(opts: LdCommonOpts & {
29
+ id?: string;
30
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
31
+ export declare function runLdCourseSetCanvas(opts: LdCommonOpts & {
32
+ id?: string;
33
+ canvas?: string;
34
+ canvasFile?: string;
35
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
36
+ export declare function runLdCourseListModules(opts: LdCommonOpts & {
37
+ id?: string;
38
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
39
+ export declare function runLdCourseAddToModules(opts: LdCommonOpts & {
40
+ id?: string;
41
+ moduleIds?: string[];
42
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
43
+ export declare function runLdCourseRemoveFromModule(opts: LdCommonOpts & {
44
+ id?: string;
45
+ moduleId?: string;
46
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
47
+ export declare function runLdCourseListAssessments(opts: LdCommonOpts & {
48
+ id?: string;
49
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
50
+ export declare function runLdCourseLinkAssessments(opts: LdCommonOpts & {
51
+ id?: string;
52
+ assessmentIds?: string[];
53
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
54
+ export declare function runLdCourseUnlinkAssessment(opts: LdCommonOpts & {
55
+ id?: string;
56
+ assessmentId?: string;
57
+ }, deps?: LdDeps): Promise<Envelope<unknown>>;
58
+ export declare const csv: (v: string) => string[];
59
+ export declare const boolFlag: (v: string) => boolean;
60
+ export declare const ldFlags: (c: Command) => Command;
61
+ export declare const render: (fn: (o: Record<string, unknown>, d?: LdDeps) => Promise<Envelope<unknown>>) => (o: Record<string, unknown>, c: Command) => Promise<void>;
62
+ export declare function createCourseSubcommand(): Command;