@burdenoff/cli-sdk 2026.1102.3 → 2026.1107.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.
@@ -1,110 +1,122 @@
1
- 'use strict';require('graphql-request'),require('cross-fetch'),require('commander');var m=class extends Error{exitCode;hint;constructor(r,e){super(r),this.name="CliUserError",this.exitCode=e?.exitCode??1,this.hint=e?.hint;}},C=class extends m{constructor(r,e){super(r,{exitCode:2,hint:e?.hint??"Run `<product> auth login` to authenticate."}),this.name="CliAuthError";}},h=class extends Error{cause;constructor(r,e){super(r),this.name="CliInternalError",this.cause=e;}};var w=null;function k(a){w=a;}function I(){if(!w)throw new h("vibecontrols module helpers used before setHelpersContext was called");return w}function Nt(){let a=I();if(!a.auth.isAuthenticated())throw new C("Authentication required.",{hint:`Run \`${a.productName} auth login\` to authenticate.`})}async function s(a,r){return Nt(),I().gql.workspace.request(a,r)}async function T(a,r){return I().gql.workspaceAuthOnly.request(a,r)}function o(a){let r=a instanceof Error?a.message:String(a);throw new m(r)}function i(a,r,e){I().output.formatAndOutput(a,r,e);}function u(a){I().output.printSuccess(a);}function b(a){return I().output.formatDate(a)}function d(a,r){return I().output.truncate(a,r)}var S=`
1
+ 'use strict';require('graphql-request'),require('cross-fetch'),require('commander');var l=class extends Error{exitCode;hint;constructor(r,t){super(r),this.name="CliUserError",this.exitCode=t?.exitCode??1,this.hint=t?.hint;}},w=class extends l{constructor(r,t){super(r,{exitCode:2,hint:t?.hint??"Run `<product> auth login` to authenticate."}),this.name="CliAuthError";}},b=class extends Error{cause;constructor(r,t){super(r),this.name="CliInternalError",this.cause=t;}};var y=null;function A(o){y=o;}function C(){if(!y)throw new b("vibecontrols module helpers used before setHelpersContext was called");return y}function qt(){let o=C();if(!o.auth.isAuthenticated())throw new w("Authentication required.",{hint:`Run \`${o.productName} auth login\` to authenticate.`})}async function a(o,r){return qt(),C().gql.workspace.request(o,r)}async function E(o,r){return C().gql.workspaceAuthOnly.request(o,r)}function i(o){let r=o instanceof Error?o.message:String(o);throw new l(r)}function s(o,r,t){C().output.formatAndOutput(o,r,t);}function u(o){C().output.printSuccess(o);}function x(o){C().output.printWarning(o);}function T(o){return C().output.formatDate(o)}function p(o,r){return C().output.truncate(o,r)}var O=`
2
2
  query TecCourse($id: ID!) {
3
- tecCourse(id: $id) {
4
- id slug title topic summary level status estimatedMinutes instructorId
5
- tags publishedAt createdAt updatedAt workspaceId
6
- cover { id }
7
- lessons { id title kind position }
3
+ tecCanonicalCourse(id: $id) {
4
+ id
5
+ technospamCourse {
6
+ id slug title topic summary level status estimatedMinutes instructorId
7
+ tags publishedAt createdAt updatedAt workspaceId
8
+ cover { id }
9
+ lessons { id title kind position }
10
+ }
8
11
  }
9
12
  }
10
- `,A=`
13
+ `,R=`
11
14
  query TecListCourses(
12
15
  $level: TecCourseLevel
13
16
  $status: TecCourseStatus
14
17
  $pagination: PaginationInput
15
18
  ) {
16
- tecListCourses(level: $level, status: $status, pagination: $pagination) {
19
+ tecCanonicalCourses(level: $level, status: $status, pagination: $pagination) {
17
20
  items {
18
- id slug title topic level status estimatedMinutes instructorId
19
- publishedAt createdAt
21
+ id
22
+ technospamCourse {
23
+ id slug title topic level status estimatedMinutes instructorId
24
+ publishedAt createdAt
25
+ }
20
26
  }
21
27
  pageInfo { cursor hasMore }
22
28
  }
23
29
  }
24
- `,x=`
30
+ `,v=`
25
31
  mutation TecCreateCourse($input: TecCreateCourseInput!) {
26
32
  tecCreateCourse(input: $input) {
27
33
  id slug title topic summary level status estimatedMinutes instructorId
28
34
  tags createdAt
29
35
  }
30
36
  }
31
- `,O=`
37
+ `,P=`
32
38
  mutation TecUpdateCourse($id: ID!, $input: TecUpdateCourseInput!) {
33
39
  tecUpdateCourse(id: $id, input: $input) {
34
40
  id slug title topic summary level status estimatedMinutes instructorId
35
41
  tags updatedAt
36
42
  }
37
43
  }
38
- `,R=`
44
+ `,$=`
39
45
  mutation TecPublishCourse($id: ID!) {
40
46
  tecPublishCourse(id: $id) {
41
47
  id slug title status publishedAt updatedAt
42
48
  }
43
49
  }
44
- `,v=`
50
+ `,L=`
45
51
  mutation TecArchiveCourse($id: ID!) {
46
52
  tecArchiveCourse(id: $id)
47
53
  }
48
- `,P=`
49
- query TecListLessons($courseId: ID!) {
50
- tecListLessons(courseId: $courseId) {
54
+ `,D=`
55
+ query TecListLessons($courseId: ID!, $pagination: PaginationInput) {
56
+ tecCanonicalLessons(courseId: $courseId, pagination: $pagination) {
51
57
  items {
52
- id courseId title kind position estimatedMinutes isPreview content
53
- file { id }
54
- createdAt updatedAt workspaceId
58
+ id
59
+ technospamLesson {
60
+ id courseId title kind position estimatedMinutes isPreview content
61
+ file { id }
62
+ createdAt updatedAt workspaceId
63
+ }
55
64
  }
56
65
  pageInfo { cursor hasMore }
57
66
  }
58
67
  }
59
- `,L=`
68
+ `,M=`
60
69
  mutation TecCreateLesson($input: TecCreateLessonInput!) {
61
70
  tecCreateLesson(input: $input) {
62
71
  id courseId title kind position estimatedMinutes isPreview content
63
72
  createdAt
64
73
  }
65
74
  }
66
- `,$=`
75
+ `,N=`
67
76
  mutation TecUpdateLesson($id: ID!, $input: TecUpdateLessonInput!) {
68
77
  tecUpdateLesson(id: $id, input: $input) {
69
78
  id courseId title kind position estimatedMinutes isPreview content
70
79
  updatedAt
71
80
  }
72
81
  }
73
- `,D=`
82
+ `,U=`
74
83
  query TecListEnrollments(
75
84
  $courseId: ID
76
85
  $learnerId: ID
77
86
  $pagination: PaginationInput
78
87
  ) {
79
- tecListEnrollments(courseId: $courseId, learnerId: $learnerId, pagination: $pagination) {
88
+ tecCanonicalEnrollments(courseId: $courseId, learnerId: $learnerId, pagination: $pagination) {
80
89
  items {
81
- id courseId learnerId status progressPct lessonsCompleted
82
- startedAt lastActiveAt completedAt createdAt
90
+ id
91
+ technospamEnrollment {
92
+ id courseId learnerId status progressPct lessonsCompleted
93
+ startedAt lastActiveAt completedAt createdAt
94
+ }
83
95
  }
84
96
  pageInfo { cursor hasMore }
85
97
  }
86
98
  }
87
- `,M=`
99
+ `,_=`
88
100
  mutation TecEnroll($input: TecEnrollInput!) {
89
101
  tecEnroll(input: $input) {
90
102
  id courseId learnerId status progressPct lessonsCompleted startedAt createdAt
91
103
  }
92
104
  }
93
- `,N=`
105
+ `,q=`
94
106
  mutation TecUpdateProgress($input: TecUpdateProgressInput!) {
95
107
  tecUpdateProgress(input: $input) {
96
108
  id courseId learnerId status progressPct lessonsCompleted
97
109
  lastActiveAt completedAt updatedAt
98
110
  }
99
111
  }
100
- `,U=`
112
+ `,H=`
101
113
  query TecMentor($id: ID!) {
102
114
  tecMentor(id: $id) {
103
115
  id userId headline bio expertise hourlyRate currency status
104
116
  isAcceptingMentees ratingAvg sessionsCount createdAt updatedAt workspaceId
105
117
  }
106
118
  }
107
- `,_=`
119
+ `,F=`
108
120
  query TecListMentors($status: TecMentorStatus, $pagination: PaginationInput) {
109
121
  tecListMentors(status: $status, pagination: $pagination) {
110
122
  items {
@@ -114,27 +126,27 @@
114
126
  pageInfo { cursor hasMore }
115
127
  }
116
128
  }
117
- `,q=`
129
+ `,G=`
118
130
  mutation TecBecomeMentor($input: TecCreateMentorInput!) {
119
131
  tecBecomeMentor(input: $input) {
120
132
  id userId headline bio expertise hourlyRate currency status
121
133
  isAcceptingMentees createdAt
122
134
  }
123
135
  }
124
- `,H=`
136
+ `,j=`
125
137
  mutation TecUpdateMentor($id: ID!, $input: TecUpdateMentorInput!) {
126
138
  tecUpdateMentor(id: $id, input: $input) {
127
139
  id userId headline bio expertise hourlyRate currency status
128
140
  isAcceptingMentees updatedAt
129
141
  }
130
142
  }
131
- `,F=`
143
+ `,B=`
132
144
  mutation TecApproveMentor($id: ID!) {
133
145
  tecApproveMentor(id: $id) {
134
146
  id userId headline status updatedAt
135
147
  }
136
148
  }
137
- `,G=`
149
+ `,z=`
138
150
  query TecListSessions($mentorId: ID, $menteeId: ID, $status: TecSessionStatus) {
139
151
  tecListSessions(mentorId: $mentorId, menteeId: $menteeId, status: $status) {
140
152
  items {
@@ -144,38 +156,38 @@
144
156
  pageInfo { cursor hasMore }
145
157
  }
146
158
  }
147
- `,j=`
159
+ `,W=`
148
160
  mutation TecBookSession($input: TecBookSessionInput!) {
149
161
  tecBookSession(input: $input) {
150
162
  id mentorId menteeId topic agenda status scheduledAt durationMinutes createdAt
151
163
  }
152
164
  }
153
- `,B=`
165
+ `,V=`
154
166
  mutation TecConfirmSession($id: ID!, $meetingUrl: String) {
155
167
  tecConfirmSession(id: $id, meetingUrl: $meetingUrl) {
156
168
  id mentorId menteeId topic status scheduledAt meetingUrl updatedAt
157
169
  }
158
170
  }
159
- `,z=`
171
+ `,K=`
160
172
  mutation TecCancelSession($id: ID!) {
161
173
  tecCancelSession(id: $id) {
162
174
  id mentorId menteeId topic status cancelledAt updatedAt
163
175
  }
164
176
  }
165
- `,W=`
177
+ `,J=`
166
178
  mutation TecCompleteSession($id: ID!, $rating: Int, $feedback: String) {
167
179
  tecCompleteSession(id: $id, rating: $rating, feedback: $feedback) {
168
180
  id mentorId menteeId topic status rating feedback completedAt updatedAt
169
181
  }
170
182
  }
171
- `,V=`
183
+ `,Y=`
172
184
  query TecHackathon($id: ID!) {
173
185
  tecHackathon(id: $id) {
174
186
  id slug title theme description status startAt endAt submissionDeadline
175
187
  maxTeamSize prizePool currency tags createdAt updatedAt workspaceId
176
188
  }
177
189
  }
178
- `,K=`
190
+ `,Q=`
179
191
  query TecListHackathons($status: TecHackathonStatus, $pagination: PaginationInput) {
180
192
  tecListHackathons(status: $status, pagination: $pagination) {
181
193
  items {
@@ -185,27 +197,27 @@
185
197
  pageInfo { cursor hasMore }
186
198
  }
187
199
  }
188
- `,J=`
200
+ `,X=`
189
201
  mutation TecCreateHackathon($input: TecCreateHackathonInput!) {
190
202
  tecCreateHackathon(input: $input) {
191
203
  id slug title theme description status startAt endAt submissionDeadline
192
204
  maxTeamSize prizePool currency tags createdAt
193
205
  }
194
206
  }
195
- `,Y=`
207
+ `,Z=`
196
208
  mutation TecUpdateHackathon($id: ID!, $input: TecUpdateHackathonInput!) {
197
209
  tecUpdateHackathon(id: $id, input: $input) {
198
210
  id slug title theme description status startAt endAt submissionDeadline
199
211
  maxTeamSize prizePool currency tags updatedAt
200
212
  }
201
213
  }
202
- `,Q=`
214
+ `,tt=`
203
215
  mutation TecOpenRegistration($id: ID!) {
204
216
  tecOpenRegistration(id: $id) {
205
217
  id slug title status updatedAt
206
218
  }
207
219
  }
208
- `,X=`
220
+ `,et=`
209
221
  query TecListTeams($hackathonId: ID!) {
210
222
  tecListTeams(hackathonId: $hackathonId) {
211
223
  items {
@@ -215,33 +227,33 @@
215
227
  pageInfo { cursor hasMore }
216
228
  }
217
229
  }
218
- `,Z=`
230
+ `,nt=`
219
231
  mutation TecRegisterTeam($input: TecRegisterTeamInput!) {
220
232
  tecRegisterTeam(input: $input) {
221
233
  id hackathonId name captainId memberIds status score createdAt
222
234
  }
223
235
  }
224
- `,tt=`
236
+ `,rt=`
225
237
  mutation TecSubmitProject($input: TecSubmitProjectInput!) {
226
238
  tecSubmitProject(input: $input) {
227
239
  id hackathonId name status projectName projectUrl repoUrl pitch
228
240
  submittedAt updatedAt
229
241
  }
230
242
  }
231
- `,et=`
243
+ `,ot=`
232
244
  mutation TecScoreTeam($id: ID!, $score: Int!, $winner: Boolean) {
233
245
  tecScoreTeam(id: $id, score: $score, winner: $winner) {
234
246
  id hackathonId name status score updatedAt
235
247
  }
236
248
  }
237
- `,nt=`
249
+ `,it=`
238
250
  query TecProblem($id: ID!) {
239
251
  tecProblem(id: $id) {
240
252
  id slug title topic statement difficulty status points languages tags
241
253
  starterCode publishedAt createdAt updatedAt workspaceId
242
254
  }
243
255
  }
244
- `,rt=`
256
+ `,st=`
245
257
  query TecListProblems(
246
258
  $difficulty: TecProblemDifficulty
247
259
  $status: TecProblemStatus
@@ -261,27 +273,27 @@
261
273
  pageInfo { cursor hasMore }
262
274
  }
263
275
  }
264
- `,ot=`
276
+ `,at=`
265
277
  mutation TecCreateProblem($input: TecCreateProblemInput!) {
266
278
  tecCreateProblem(input: $input) {
267
279
  id slug title topic statement difficulty status points languages tags
268
280
  starterCode createdAt
269
281
  }
270
282
  }
271
- `,it=`
283
+ `,ct=`
272
284
  mutation TecUpdateProblem($id: ID!, $input: TecUpdateProblemInput!) {
273
285
  tecUpdateProblem(id: $id, input: $input) {
274
286
  id slug title topic statement difficulty status points languages tags
275
287
  starterCode updatedAt
276
288
  }
277
289
  }
278
- `,st=`
290
+ `,ut=`
279
291
  mutation TecPublishProblem($id: ID!) {
280
292
  tecPublishProblem(id: $id) {
281
293
  id slug title status publishedAt updatedAt
282
294
  }
283
295
  }
284
- `,at=`
296
+ `,dt=`
285
297
  query TecListSubmissions(
286
298
  $problemId: ID
287
299
  $learnerId: ID
@@ -295,40 +307,46 @@
295
307
  pageInfo { cursor hasMore }
296
308
  }
297
309
  }
298
- `,ct=`
310
+ `,pt=`
299
311
  mutation TecSubmitSolution($input: TecSubmitSolutionInput!) {
300
312
  tecSubmitSolution(input: $input) {
301
313
  id problemId learnerId language verdict pointsAwarded runtimeMs createdAt
302
314
  }
303
315
  }
304
- `,ut=`
316
+ `,mt=`
305
317
  mutation TecGradeSubmission($id: ID!, $verdict: TecSubmissionVerdict!, $runtimeMs: Int) {
306
318
  tecGradeSubmission(id: $id, verdict: $verdict, runtimeMs: $runtimeMs) {
307
319
  id problemId learnerId language verdict pointsAwarded runtimeMs
308
320
  judgedAt updatedAt
309
321
  }
310
322
  }
311
- `,dt=`
312
- query TecListCertificates($courseId: ID, $learnerId: ID) {
313
- tecListCertificates(courseId: $courseId, learnerId: $learnerId) {
314
- id courseId learnerId serial score status issuedAt revokedAt
315
- revokeReason createdAt updatedAt workspaceId
323
+ `,lt=`
324
+ query TecListCertificates($courseId: ID, $learnerId: ID, $pagination: PaginationInput) {
325
+ tecCanonicalCertificates(courseId: $courseId, learnerId: $learnerId, pagination: $pagination) {
326
+ items {
327
+ id
328
+ technospamCertificate {
329
+ id courseId learnerId serial score status issuedAt revokedAt
330
+ revokeReason createdAt updatedAt workspaceId
331
+ }
332
+ }
333
+ pageInfo { cursor hasMore }
316
334
  }
317
335
  }
318
- `,pt=`
336
+ `,gt=`
319
337
  mutation TecIssueCertificate($courseId: ID!, $learnerId: ID!, $score: Int!) {
320
338
  tecIssueCertificate(courseId: $courseId, learnerId: $learnerId, score: $score) {
321
339
  id courseId learnerId serial score status issuedAt createdAt
322
340
  }
323
341
  }
324
- `,mt=`
342
+ `,ft=`
325
343
  mutation TecRevokeCertificate($id: ID!, $reason: String) {
326
344
  tecRevokeCertificate(id: $id, reason: $reason) {
327
345
  id courseId learnerId serial score status revokedAt revokeReason updatedAt
328
346
  }
329
347
  }
330
- `,lt=`
348
+ `,ht=`
331
349
  query TecHealth {
332
350
  tecHealth
333
351
  }
334
- `;function c(a){let r=Number.parseInt(a,10);if(Number.isNaN(r))throw new m(`Expected an integer but got "${a}"`);return r}function l(a){return a.split(",").map(r=>r.trim()).filter(r=>r.length>0)}function ft(a){let r=a.command("courses").description("Technospam courses");r.command("list").description("List courses").option("--level <l>","BEGINNER|INTERMEDIATE|ADVANCED|EXPERT").option("--status <s>","DRAFT|PUBLISHED|ARCHIVED").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(A,{level:e.level?e.level.toUpperCase():void 0,status:e.status?e.status.toUpperCase():void 0,pagination:{limit:e.limit,offset:e.offset}});i(e,t.tecListCourses.items,{headers:["ID","Title","Level","Status","Minutes"],rows:t.tecListCourses.items.map(n=>[d(n.id,12),n.title,n.level,n.status,String(n.estimatedMinutes??0)])});}catch(t){o(t);}}),r.command("get").description("Get a course by id").argument("<id>","Course ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(S,{id:e});if(!n.tecCourse)throw new m(`Course ${e} not found`);i(t,n.tecCourse);}catch(n){o(n);}}),r.command("create").description("Create a course").requiredOption("--title <t>","Course title").requiredOption("--slug <slug>","URL slug").option("--topic <t>","Topic").option("--summary <s>","Summary").option("--level <l>","BEGINNER|INTERMEDIATE|ADVANCED|EXPERT","BEGINNER").option("--estimated-minutes <n>","Estimated minutes",c).option("--instructor-id <id>","Instructor user ID").option("--cover-file-id <id>","Cover image File ID").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async e=>{try{let t={title:e.title,slug:e.slug,level:(e.level??"BEGINNER").toUpperCase()};e.topic&&(t.topic=e.topic),e.summary&&(t.summary=e.summary),e.estimatedMinutes!==void 0&&(t.estimatedMinutes=e.estimatedMinutes),e.instructorId&&(t.instructorId=e.instructorId),e.coverFileId&&(t.coverFileId=e.coverFileId),e.tags&&(t.tags=l(e.tags));let n=await s(x,{input:t});u(`Course created: ${n.tecCreateCourse.title}`),i(e,n.tecCreateCourse);}catch(t){o(t);}}),r.command("update").description("Update a course").argument("<id>","Course ID").option("--title <t>","Course title").option("--topic <t>","Topic").option("--summary <s>","Summary").option("--level <l>","BEGINNER|INTERMEDIATE|ADVANCED|EXPERT").option("--estimated-minutes <n>","Estimated minutes",c).option("--instructor-id <id>","Instructor user ID").option("--cover-file-id <id>","Cover image File ID").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n={};if(t.title&&(n.title=t.title),t.topic!==void 0&&(n.topic=t.topic),t.summary!==void 0&&(n.summary=t.summary),t.level&&(n.level=t.level.toUpperCase()),t.estimatedMinutes!==void 0&&(n.estimatedMinutes=t.estimatedMinutes),t.instructorId&&(n.instructorId=t.instructorId),t.coverFileId&&(n.coverFileId=t.coverFileId),t.tags&&(n.tags=l(t.tags)),!Object.keys(n).length)throw new m("No updates specified");let g=await s(O,{id:e,input:n});u("Course updated"),i(t,g.tecUpdateCourse);}catch(n){o(n);}}),r.command("publish").description("Publish a course (DRAFT -> PUBLISHED)").argument("<id>","Course ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(R,{id:e});u(`Course published: ${n.tecPublishCourse.title}`),i(t,n.tecPublishCourse);}catch(n){o(n);}}),r.command("archive").description("Archive a course").argument("<id>","Course ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(v,{id:e});u(n.tecArchiveCourse?"Course archived":"Course not archived"),i(t,{archived:n.tecArchiveCourse});}catch(n){o(n);}});}function gt(a){let r=a.command("lessons").description("Technospam course lessons");r.command("list").description("List lessons for a course").requiredOption("--course <id>","Course ID").option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(P,{courseId:e.course});i(e,t.tecListLessons.items,{headers:["ID","Title","Kind","Position","Minutes","Preview"],rows:t.tecListLessons.items.map(n=>[d(n.id,12),n.title,n.kind,String(n.position),String(n.estimatedMinutes??0),n.isPreview?"yes":"no"])});}catch(t){o(t);}}),r.command("create").description("Create a lesson").requiredOption("--course <id>","Course ID").requiredOption("--title <t>","Lesson title").option("--kind <k>","ARTICLE|VIDEO|QUIZ|INTERACTIVE|PROJECT","ARTICLE").option("--content <s>","Lesson content").option("--position <n>","Order position",c).option("--estimated-minutes <n>","Estimated minutes",c).option("--file-id <id>","Attachment / video File ID").option("--preview","Mark as a free preview lesson").option("-f, --format <format>","Output format").action(async e=>{try{let t={courseId:e.course,title:e.title,kind:(e.kind??"ARTICLE").toUpperCase()};e.content&&(t.content=e.content),e.position!==void 0&&(t.position=e.position),e.estimatedMinutes!==void 0&&(t.estimatedMinutes=e.estimatedMinutes),e.fileId&&(t.fileId=e.fileId),e.preview&&(t.isPreview=!0);let n=await s(L,{input:t});u(`Lesson created: ${n.tecCreateLesson.title}`),i(e,n.tecCreateLesson);}catch(t){o(t);}}),r.command("update").description("Update a lesson").argument("<id>","Lesson ID").option("--title <t>","Lesson title").option("--kind <k>","ARTICLE|VIDEO|QUIZ|INTERACTIVE|PROJECT").option("--content <s>","Lesson content").option("--position <n>","Order position",c).option("--estimated-minutes <n>","Estimated minutes",c).option("--file-id <id>","Attachment / video File ID").option("--preview <bool>","true|false",e=>e==="true").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n={};if(t.title&&(n.title=t.title),t.kind&&(n.kind=t.kind.toUpperCase()),t.content!==void 0&&(n.content=t.content),t.position!==void 0&&(n.position=t.position),t.estimatedMinutes!==void 0&&(n.estimatedMinutes=t.estimatedMinutes),t.fileId&&(n.fileId=t.fileId),t.preview!==void 0&&(n.isPreview=t.preview),!Object.keys(n).length)throw new m("No updates specified");let g=await s($,{id:e,input:n});u("Lesson updated"),i(t,g.tecUpdateLesson);}catch(n){o(n);}});}function ht(a){let r=a.command("enrollments").description("Technospam course enrollments");r.command("list").description("List enrollments").option("--course <id>","Filter by course ID").option("--learner <id>","Filter by learner ID").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(D,{courseId:e.course,learnerId:e.learner,pagination:{limit:e.limit,offset:e.offset}});i(e,t.tecListEnrollments.items,{headers:["ID","Course","Learner","Status","Progress %","Lessons"],rows:t.tecListEnrollments.items.map(n=>[d(n.id,12),d(n.courseId,12),d(n.learnerId,12),n.status,String(n.progressPct),String(n.lessonsCompleted)])});}catch(t){o(t);}}),r.command("enroll").description("Enroll the calling user in a course").requiredOption("--course <id>","Course ID").option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(M,{input:{courseId:e.course}});u(`Enrolled in course ${t.tecEnroll.courseId}`),i(e,t.tecEnroll);}catch(t){o(t);}}),r.command("update-progress").description("Update a learner's enrollment progress (auto-completes at 100%)").requiredOption("--enrollment <id>","Enrollment ID").requiredOption("--progress-pct <n>","Progress percent (0-100)",c).option("--lessons-completed <n>","Lessons completed count",c).option("-f, --format <format>","Output format").action(async e=>{try{let t={enrollmentId:e.enrollment,progressPct:e.progressPct};e.lessonsCompleted!==void 0&&(t.lessonsCompleted=e.lessonsCompleted);let n=await s(N,{input:t});u(`Progress updated to ${n.tecUpdateProgress.progressPct}%`),i(e,n.tecUpdateProgress);}catch(t){o(t);}});}function It(a){let r=a.command("mentors").description("Technospam mentors");r.command("list").description("List mentors").option("--status <s>","PENDING|ACTIVE|PAUSED|INACTIVE").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(_,{status:e.status?e.status.toUpperCase():void 0,pagination:{limit:e.limit,offset:e.offset}});i(e,t.tecListMentors.items,{headers:["ID","Headline","Status","Rate","Rating","Accepting"],rows:t.tecListMentors.items.map(n=>[d(n.id,12),d(n.headline,30),n.status,String(n.hourlyRate??0),String(n.ratingAvg??0),n.isAcceptingMentees?"yes":"no"])});}catch(t){o(t);}}),r.command("get").description("Get a mentor by id").argument("<id>","Mentor ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(U,{id:e});if(!n.tecMentor)throw new m(`Mentor ${e} not found`);i(t,n.tecMentor);}catch(n){o(n);}}),r.command("become").description("Create the calling user's mentor profile").requiredOption("--headline <h>","Mentor headline").option("--bio <s>","Bio").option("--expertise <csv>","Comma-separated areas of expertise").option("--hourly-rate <n>","Hourly rate",c).option("--currency <c>","Currency code").option("-f, --format <format>","Output format").action(async e=>{try{let t={headline:e.headline};e.bio&&(t.bio=e.bio),e.expertise&&(t.expertise=l(e.expertise)),e.hourlyRate!==void 0&&(t.hourlyRate=e.hourlyRate),e.currency&&(t.currency=e.currency);let n=await s(q,{input:t});u(`Mentor profile created: ${n.tecBecomeMentor.headline}`),i(e,n.tecBecomeMentor);}catch(t){o(t);}}),r.command("update").description("Update a mentor profile").argument("<id>","Mentor ID").option("--headline <h>","Mentor headline").option("--bio <s>","Bio").option("--expertise <csv>","Comma-separated areas of expertise").option("--hourly-rate <n>","Hourly rate",c).option("--currency <c>","Currency code").option("--accepting <bool>","true|false (accepting mentees)",e=>e==="true").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n={};if(t.headline&&(n.headline=t.headline),t.bio!==void 0&&(n.bio=t.bio),t.expertise&&(n.expertise=l(t.expertise)),t.hourlyRate!==void 0&&(n.hourlyRate=t.hourlyRate),t.currency&&(n.currency=t.currency),t.accepting!==void 0&&(n.isAcceptingMentees=t.accepting),!Object.keys(n).length)throw new m("No updates specified");let g=await s(H,{id:e,input:n});u("Mentor updated"),i(t,g.tecUpdateMentor);}catch(n){o(n);}}),r.command("approve").description("Approve a pending mentor profile (PENDING -> ACTIVE)").argument("<id>","Mentor ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(F,{id:e});u(`Mentor approved: ${n.tecApproveMentor.status}`),i(t,n.tecApproveMentor);}catch(n){o(n);}});}function Ct(a){let r=a.command("sessions").description("Technospam mentorship sessions");r.command("list").description("List mentorship sessions").option("--mentor <id>","Filter by mentor ID").option("--mentee <id>","Filter by mentee ID").option("--status <s>","REQUESTED|CONFIRMED|COMPLETED|CANCELLED|NO_SHOW").option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(G,{mentorId:e.mentor,menteeId:e.mentee,status:e.status?e.status.toUpperCase():void 0});i(e,t.tecListSessions.items,{headers:["ID","Mentor","Mentee","Topic","Status","Scheduled"],rows:t.tecListSessions.items.map(n=>[d(n.id,12),d(n.mentorId,12),d(n.menteeId,12),d(n.topic,24),n.status,b(n.scheduledAt)])});}catch(t){o(t);}}),r.command("book").description("Book a 1:1 session with a mentor as the calling mentee").requiredOption("--mentor <id>","Mentor ID").requiredOption("--topic <t>","Session topic").requiredOption("--scheduled-at <iso>","Scheduled time (ISO date)").option("--agenda <s>","Agenda").option("--duration-minutes <n>","Duration (minutes)",c).option("-f, --format <format>","Output format").action(async e=>{try{let t={mentorId:e.mentor,topic:e.topic,scheduledAt:e.scheduledAt};e.agenda&&(t.agenda=e.agenda),e.durationMinutes!==void 0&&(t.durationMinutes=e.durationMinutes);let n=await s(j,{input:t});u(`Session booked: ${n.tecBookSession.topic}`),i(e,n.tecBookSession);}catch(t){o(t);}}),r.command("confirm").description("Confirm a requested session").argument("<id>","Session ID").option("--meeting-url <url>","Meeting URL").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(B,{id:e,meetingUrl:t.meetingUrl});u("Session confirmed"),i(t,n.tecConfirmSession);}catch(n){o(n);}}),r.command("cancel").description("Cancel a session").argument("<id>","Session ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(z,{id:e});u("Session cancelled"),i(t,n.tecCancelSession);}catch(n){o(n);}}),r.command("complete").description("Complete a session with optional rating and feedback").argument("<id>","Session ID").option("--rating <n>","Rating (1-5)",c).option("--feedback <s>","Feedback").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(W,{id:e,rating:t.rating,feedback:t.feedback});u("Session completed"),i(t,n.tecCompleteSession);}catch(n){o(n);}});}function bt(a){let r=a.command("hackathons").description("Technospam hackathons");r.command("list").description("List hackathons").option("--status <s>","DRAFT|REGISTRATION_OPEN|IN_PROGRESS|JUDGING|COMPLETED|CANCELLED").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(K,{status:e.status?e.status.toUpperCase():void 0,pagination:{limit:e.limit,offset:e.offset}});i(e,t.tecListHackathons.items,{headers:["ID","Title","Status","Start","Prize"],rows:t.tecListHackathons.items.map(n=>[d(n.id,12),n.title,n.status,b(n.startAt),String(n.prizePool??0)])});}catch(t){o(t);}}),r.command("get").description("Get a hackathon by id").argument("<id>","Hackathon ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(V,{id:e});if(!n.tecHackathon)throw new m(`Hackathon ${e} not found`);i(t,n.tecHackathon);}catch(n){o(n);}}),r.command("create").description("Create a hackathon").requiredOption("--title <t>","Hackathon title").requiredOption("--slug <slug>","URL slug").requiredOption("--start-at <iso>","Start time (ISO date)").requiredOption("--end-at <iso>","End time (ISO date)").option("--theme <t>","Theme").option("--description <s>","Description").option("--submission-deadline <iso>","Submission deadline (ISO date)").option("--max-team-size <n>","Max team size",c).option("--prize-pool <n>","Prize pool",c).option("--currency <c>","Currency code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async e=>{try{let t={title:e.title,slug:e.slug,startAt:e.startAt,endAt:e.endAt};e.theme&&(t.theme=e.theme),e.description&&(t.description=e.description),e.submissionDeadline&&(t.submissionDeadline=e.submissionDeadline),e.maxTeamSize!==void 0&&(t.maxTeamSize=e.maxTeamSize),e.prizePool!==void 0&&(t.prizePool=e.prizePool),e.currency&&(t.currency=e.currency),e.tags&&(t.tags=l(e.tags));let n=await s(J,{input:t});u(`Hackathon created: ${n.tecCreateHackathon.title}`),i(e,n.tecCreateHackathon);}catch(t){o(t);}}),r.command("update").description("Update a hackathon").argument("<id>","Hackathon ID").option("--title <t>","Hackathon title").option("--theme <t>","Theme").option("--description <s>","Description").option("--start-at <iso>","Start time (ISO date)").option("--end-at <iso>","End time (ISO date)").option("--submission-deadline <iso>","Submission deadline (ISO date)").option("--max-team-size <n>","Max team size",c).option("--prize-pool <n>","Prize pool",c).option("--currency <c>","Currency code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n={};if(t.title&&(n.title=t.title),t.theme!==void 0&&(n.theme=t.theme),t.description!==void 0&&(n.description=t.description),t.startAt&&(n.startAt=t.startAt),t.endAt&&(n.endAt=t.endAt),t.submissionDeadline&&(n.submissionDeadline=t.submissionDeadline),t.maxTeamSize!==void 0&&(n.maxTeamSize=t.maxTeamSize),t.prizePool!==void 0&&(n.prizePool=t.prizePool),t.currency&&(n.currency=t.currency),t.tags&&(n.tags=l(t.tags)),!Object.keys(n).length)throw new m("No updates specified");let g=await s(Y,{id:e,input:n});u("Hackathon updated"),i(t,g.tecUpdateHackathon);}catch(n){o(n);}}),r.command("open-registration").description("Open registration for a hackathon (DRAFT -> REGISTRATION_OPEN)").argument("<id>","Hackathon ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(Q,{id:e});u(`Registration open: ${n.tecOpenRegistration.status}`),i(t,n.tecOpenRegistration);}catch(n){o(n);}});}function wt(a){let r=a.command("teams").description("Technospam hackathon teams");r.command("list").description("List teams for a hackathon").requiredOption("--hackathon <id>","Hackathon ID").option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(X,{hackathonId:e.hackathon});i(e,t.tecListTeams.items,{headers:["ID","Name","Captain","Status","Score"],rows:t.tecListTeams.items.map(n=>[d(n.id,12),n.name,d(n.captainId,12),n.status,String(n.score??0)])});}catch(t){o(t);}}),r.command("register").description("Register a team for a hackathon with the calling user as captain").requiredOption("--hackathon <id>","Hackathon ID").requiredOption("--name <name>","Team name").option("--members <csv>","Comma-separated member user IDs").option("-f, --format <format>","Output format").action(async e=>{try{let t={hackathonId:e.hackathon,name:e.name};e.members&&(t.memberIds=l(e.members));let n=await s(Z,{input:t});u(`Team registered: ${n.tecRegisterTeam.name}`),i(e,n.tecRegisterTeam);}catch(t){o(t);}}),r.command("submit-project").description("Submit a team's project for judging").requiredOption("--team <id>","Team ID").requiredOption("--project-name <n>","Project name").option("--project-url <url>","Project URL").option("--repo-url <url>","Repository URL").option("--pitch <s>","Pitch").option("-f, --format <format>","Output format").action(async e=>{try{let t={teamId:e.team,projectName:e.projectName};e.projectUrl&&(t.projectUrl=e.projectUrl),e.repoUrl&&(t.repoUrl=e.repoUrl),e.pitch&&(t.pitch=e.pitch);let n=await s(tt,{input:t});u(`Project submitted: ${n.tecSubmitProject.status}`),i(e,n.tecSubmitProject);}catch(t){o(t);}}),r.command("score").description("Record a judge score for a team and optionally mark it WINNER").argument("<id>","Team ID").requiredOption("--score <n>","Score",c).option("--winner","Mark the team as winner").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(et,{id:e,score:t.score,winner:t.winner??void 0});u(`Team scored: ${n.tecScoreTeam.score}`),i(t,n.tecScoreTeam);}catch(n){o(n);}});}function Tt(a){let r=a.command("problems").description("Technospam practice problems");r.command("list").description("List problems").option("--difficulty <d>","EASY|MEDIUM|HARD").option("--status <s>","DRAFT|PUBLISHED|ARCHIVED").option("--topic <t>","Filter by topic").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(rt,{difficulty:e.difficulty?e.difficulty.toUpperCase():void 0,status:e.status?e.status.toUpperCase():void 0,topic:e.topic,pagination:{limit:e.limit,offset:e.offset}});i(e,t.tecListProblems.items,{headers:["ID","Title","Difficulty","Status","Points"],rows:t.tecListProblems.items.map(n=>[d(n.id,12),n.title,n.difficulty,n.status,String(n.points??0)])});}catch(t){o(t);}}),r.command("get").description("Get a problem by id").argument("<id>","Problem ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(nt,{id:e});if(!n.tecProblem)throw new m(`Problem ${e} not found`);i(t,n.tecProblem);}catch(n){o(n);}}),r.command("create").description("Create a problem").requiredOption("--title <t>","Problem title").requiredOption("--slug <slug>","URL slug").option("--topic <t>","Topic").option("--statement <s>","Problem statement").option("--difficulty <d>","EASY|MEDIUM|HARD","EASY").option("--points <n>","Points",c).option("--languages <csv>","Comma-separated allowed languages").option("--starter-code <s>","Starter code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async e=>{try{let t={title:e.title,slug:e.slug,difficulty:(e.difficulty??"EASY").toUpperCase()};e.topic&&(t.topic=e.topic),e.statement&&(t.statement=e.statement),e.points!==void 0&&(t.points=e.points),e.languages&&(t.languages=l(e.languages)),e.starterCode&&(t.starterCode=e.starterCode),e.tags&&(t.tags=l(e.tags));let n=await s(ot,{input:t});u(`Problem created: ${n.tecCreateProblem.title}`),i(e,n.tecCreateProblem);}catch(t){o(t);}}),r.command("update").description("Update a problem").argument("<id>","Problem ID").option("--title <t>","Problem title").option("--topic <t>","Topic").option("--statement <s>","Problem statement").option("--difficulty <d>","EASY|MEDIUM|HARD").option("--points <n>","Points",c).option("--languages <csv>","Comma-separated allowed languages").option("--starter-code <s>","Starter code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n={};if(t.title&&(n.title=t.title),t.topic!==void 0&&(n.topic=t.topic),t.statement!==void 0&&(n.statement=t.statement),t.difficulty&&(n.difficulty=t.difficulty.toUpperCase()),t.points!==void 0&&(n.points=t.points),t.languages&&(n.languages=l(t.languages)),t.starterCode!==void 0&&(n.starterCode=t.starterCode),t.tags&&(n.tags=l(t.tags)),!Object.keys(n).length)throw new m("No updates specified");let g=await s(it,{id:e,input:n});u("Problem updated"),i(t,g.tecUpdateProblem);}catch(n){o(n);}}),r.command("publish").description("Publish a problem (DRAFT -> PUBLISHED)").argument("<id>","Problem ID").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(st,{id:e});u(`Problem published: ${n.tecPublishProblem.title}`),i(t,n.tecPublishProblem);}catch(n){o(n);}});}function yt(a){let r=a.command("submissions").description("Technospam problem submissions");r.command("list").description("List submissions").option("--problem <id>","Filter by problem ID").option("--learner <id>","Filter by learner ID").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(at,{problemId:e.problem,learnerId:e.learner,pagination:{limit:e.limit,offset:e.offset}});i(e,t.tecListSubmissions.items,{headers:["ID","Problem","Learner","Language","Verdict","Points"],rows:t.tecListSubmissions.items.map(n=>[d(n.id,12),d(n.problemId,12),d(n.learnerId,12),n.language,n.verdict,String(n.pointsAwarded??0)])});}catch(t){o(t);}}),r.command("submit").description("Submit a solution to a problem").requiredOption("--problem <id>","Problem ID").requiredOption("--language <l>","Language").requiredOption("--code <c>","Solution code").option("-f, --format <format>","Output format").action(async e=>{try{let t={problemId:e.problem,language:e.language,code:e.code},n=await s(ct,{input:t});u(`Solution submitted: ${n.tecSubmitSolution.verdict}`),i(e,n.tecSubmitSolution);}catch(t){o(t);}}),r.command("grade").description("Record the grader verdict for a submission").argument("<id>","Submission ID").requiredOption("--verdict <v>","PENDING|ACCEPTED|WRONG_ANSWER|TIME_LIMIT_EXCEEDED|RUNTIME_ERROR|COMPILE_ERROR").option("--runtime-ms <n>","Runtime in milliseconds",c).option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(ut,{id:e,verdict:t.verdict.toUpperCase(),runtimeMs:t.runtimeMs});u(`Submission graded: ${n.tecGradeSubmission.verdict}`),i(t,n.tecGradeSubmission);}catch(n){o(n);}});}function Et(a){let r=a.command("certificates").description("Technospam completion certificates");r.command("list").description("List certificates").option("--course <id>","Filter by course ID").option("--learner <id>","Filter by learner ID").option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(dt,{courseId:e.course,learnerId:e.learner});i(e,t.tecListCertificates,{headers:["ID","Serial","Course","Learner","Score","Status"],rows:t.tecListCertificates.map(n=>[d(n.id,12),n.serial,d(n.courseId,12),d(n.learnerId,12),String(n.score),n.status])});}catch(t){o(t);}}),r.command("issue").description("Issue a verifiable completion certificate for a learner on a course").requiredOption("--course <id>","Course ID").requiredOption("--learner <id>","Learner ID").requiredOption("--score <n>","Score",c).option("-f, --format <format>","Output format").action(async e=>{try{let t=await s(pt,{courseId:e.course,learnerId:e.learner,score:e.score});u(`Certificate issued: ${t.tecIssueCertificate.serial}`),i(e,t.tecIssueCertificate);}catch(t){o(t);}}),r.command("revoke").description("Revoke a certificate").argument("<id>","Certificate ID").option("--reason <s>","Revocation reason").option("-f, --format <format>","Output format").action(async(e,t)=>{try{let n=await s(mt,{id:e,reason:t.reason});u(`Certificate revoked: ${n.tecRevokeCertificate.status}`),i(t,n.tecRevokeCertificate);}catch(n){o(n);}});}function kt(a){a.command("health").description("Technospam service health check (public)").option("-f, --format <format>","Output format").action(async r=>{try{let e=await T(lt);u(e.tecHealth),i(r,{health:e.tecHealth});}catch(e){o(e);}});}var Ut={id:"technospam",version:"1.0.0",displayName:"Technospam",dependsOn:["auth","workspaces"],register(a,r){k(r);let e=a.command("technospam").description("Technospam developer-education platform");ft(e),gt(e),ht(e),It(e),Ct(e),bt(e),wt(e),Tt(e),yt(e),Et(e),kt(e);}},_n=Ut;module.exports=_n;
352
+ `;function c(o){let r=Number.parseInt(o,10);if(Number.isNaN(r))throw new l(`Expected an integer but got "${o}"`);return r}function g(o){return o.split(",").map(r=>r.trim()).filter(r=>r.length>0)}function h(o,r){let t=[];for(let e of o){let n=e[r];n&&t.push({...n,canonicalId:e.id});}return t}function I(o){o.hasMore&&o.cursor&&x(`More results available: rerun with --cursor ${o.cursor}`);}function Ct(o){let r=o.command("courses").description("Technospam courses");r.command("list").description("List courses").option("--level <l>","BEGINNER|INTERMEDIATE|ADVANCED|EXPERT").option("--status <s>","DRAFT|PUBLISHED|ARCHIVED").option("--limit <n>","Page size",c,50).option("--cursor <id>","Start after this course (pageInfo.cursor of the previous page)").option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(R,{level:t.level?t.level.toUpperCase():void 0,status:t.status?t.status.toUpperCase():void 0,pagination:{limit:t.limit,...t.cursor?{cursor:t.cursor}:{}}}),n=h(e.tecCanonicalCourses.items,"technospamCourse");s(t,n,{headers:["ID","Title","Level","Status","Minutes"],rows:n.map(d=>[p(d.id,12),d.title,d.level,d.status,String(d.estimatedMinutes??0)])}),I(e.tecCanonicalCourses.pageInfo);}catch(e){i(e);}}),r.command("get").description("Get a course by id").argument("<id>","Course ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(O,{id:t}),[d]=h(n.tecCanonicalCourse?[n.tecCanonicalCourse]:[],"technospamCourse");if(!d)throw new l(`Course ${t} not found`);s(e,d);}catch(n){i(n);}}),r.command("create").description("Create a course").requiredOption("--title <t>","Course title").requiredOption("--slug <slug>","URL slug").option("--topic <t>","Topic").option("--summary <s>","Summary").option("--level <l>","BEGINNER|INTERMEDIATE|ADVANCED|EXPERT","BEGINNER").option("--estimated-minutes <n>","Estimated minutes",c).option("--instructor-id <id>","Instructor user ID").option("--cover-file-id <id>","Cover image File ID").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async t=>{try{let e={title:t.title,slug:t.slug,level:(t.level??"BEGINNER").toUpperCase()};t.topic&&(e.topic=t.topic),t.summary&&(e.summary=t.summary),t.estimatedMinutes!==void 0&&(e.estimatedMinutes=t.estimatedMinutes),t.instructorId&&(e.instructorId=t.instructorId),t.coverFileId&&(e.coverFileId=t.coverFileId),t.tags&&(e.tags=g(t.tags));let n=await a(v,{input:e});u(`Course created: ${n.tecCreateCourse.title}`),s(t,n.tecCreateCourse);}catch(e){i(e);}}),r.command("update").description("Update a course").argument("<id>","Course ID").option("--title <t>","Course title").option("--topic <t>","Topic").option("--summary <s>","Summary").option("--level <l>","BEGINNER|INTERMEDIATE|ADVANCED|EXPERT").option("--estimated-minutes <n>","Estimated minutes",c).option("--instructor-id <id>","Instructor user ID").option("--cover-file-id <id>","Cover image File ID").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n={};if(e.title&&(n.title=e.title),e.topic!==void 0&&(n.topic=e.topic),e.summary!==void 0&&(n.summary=e.summary),e.level&&(n.level=e.level.toUpperCase()),e.estimatedMinutes!==void 0&&(n.estimatedMinutes=e.estimatedMinutes),e.instructorId&&(n.instructorId=e.instructorId),e.coverFileId&&(n.coverFileId=e.coverFileId),e.tags&&(n.tags=g(e.tags)),!Object.keys(n).length)throw new l("No updates specified");let d=await a(P,{id:t,input:n});u("Course updated"),s(e,d.tecUpdateCourse);}catch(n){i(n);}}),r.command("publish").description("Publish a course (DRAFT -> PUBLISHED)").argument("<id>","Course ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a($,{id:t});u(`Course published: ${n.tecPublishCourse.title}`),s(e,n.tecPublishCourse);}catch(n){i(n);}}),r.command("archive").description("Archive a course").argument("<id>","Course ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(L,{id:t});u(n.tecArchiveCourse?"Course archived":"Course not archived"),s(e,{archived:n.tecArchiveCourse});}catch(n){i(n);}});}function It(o){let r=o.command("lessons").description("Technospam course lessons");r.command("list").description("List lessons for a course").requiredOption("--course <id>","Course ID").option("--limit <n>","Page size",c,100).option("--cursor <id>","Start after this lesson (pageInfo.cursor of the previous page)").option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(D,{courseId:t.course,pagination:{limit:t.limit,...t.cursor?{cursor:t.cursor}:{}}}),n=h(e.tecCanonicalLessons.items,"technospamLesson");s(t,n,{headers:["ID","Title","Kind","Position","Minutes","Preview"],rows:n.map(d=>[p(d.id,12),d.title,d.kind,String(d.position),String(d.estimatedMinutes??0),d.isPreview?"yes":"no"])}),I(e.tecCanonicalLessons.pageInfo);}catch(e){i(e);}}),r.command("create").description("Create a lesson").requiredOption("--course <id>","Course ID").requiredOption("--title <t>","Lesson title").option("--kind <k>","ARTICLE|VIDEO|QUIZ|INTERACTIVE|PROJECT","ARTICLE").option("--content <s>","Lesson content").option("--position <n>","Order position",c).option("--estimated-minutes <n>","Estimated minutes",c).option("--file-id <id>","Attachment / video File ID").option("--preview","Mark as a free preview lesson").option("-f, --format <format>","Output format").action(async t=>{try{let e={courseId:t.course,title:t.title,kind:(t.kind??"ARTICLE").toUpperCase()};t.content&&(e.content=t.content),t.position!==void 0&&(e.position=t.position),t.estimatedMinutes!==void 0&&(e.estimatedMinutes=t.estimatedMinutes),t.fileId&&(e.fileId=t.fileId),t.preview&&(e.isPreview=!0);let n=await a(M,{input:e});u(`Lesson created: ${n.tecCreateLesson.title}`),s(t,n.tecCreateLesson);}catch(e){i(e);}}),r.command("update").description("Update a lesson").argument("<id>","Lesson ID").option("--title <t>","Lesson title").option("--kind <k>","ARTICLE|VIDEO|QUIZ|INTERACTIVE|PROJECT").option("--content <s>","Lesson content").option("--position <n>","Order position",c).option("--estimated-minutes <n>","Estimated minutes",c).option("--file-id <id>","Attachment / video File ID").option("--preview <bool>","true|false",t=>t==="true").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n={};if(e.title&&(n.title=e.title),e.kind&&(n.kind=e.kind.toUpperCase()),e.content!==void 0&&(n.content=e.content),e.position!==void 0&&(n.position=e.position),e.estimatedMinutes!==void 0&&(n.estimatedMinutes=e.estimatedMinutes),e.fileId&&(n.fileId=e.fileId),e.preview!==void 0&&(n.isPreview=e.preview),!Object.keys(n).length)throw new l("No updates specified");let d=await a(N,{id:t,input:n});u("Lesson updated"),s(e,d.tecUpdateLesson);}catch(n){i(n);}});}function bt(o){let r=o.command("enrollments").description("Technospam course enrollments");r.command("list").description("List enrollments").option("--course <id>","Filter by course ID").option("--learner <id>","Filter by learner ID").option("--limit <n>","Page size",c,50).option("--cursor <id>","Start after this enrollment (pageInfo.cursor of the previous page)").option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(U,{courseId:t.course,learnerId:t.learner,pagination:{limit:t.limit,...t.cursor?{cursor:t.cursor}:{}}}),n=h(e.tecCanonicalEnrollments.items,"technospamEnrollment");s(t,n,{headers:["ID","Course","Learner","Status","Progress %","Lessons"],rows:n.map(d=>[p(d.id,12),p(d.courseId,12),p(d.learnerId,12),d.status,String(d.progressPct),String(d.lessonsCompleted)])}),I(e.tecCanonicalEnrollments.pageInfo);}catch(e){i(e);}}),r.command("enroll").description("Enroll the calling user in a course").requiredOption("--course <id>","Course ID").option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(_,{input:{courseId:t.course}});u(`Enrolled in course ${e.tecEnroll.courseId}`),s(t,e.tecEnroll);}catch(e){i(e);}}),r.command("update-progress").description("Update a learner's enrollment progress (auto-completes at 100%)").requiredOption("--enrollment <id>","Enrollment ID").requiredOption("--progress-pct <n>","Progress percent (0-100)",c).option("--lessons-completed <n>","Lessons completed count",c).option("-f, --format <format>","Output format").action(async t=>{try{let e={enrollmentId:t.enrollment,progressPct:t.progressPct};t.lessonsCompleted!==void 0&&(e.lessonsCompleted=t.lessonsCompleted);let n=await a(q,{input:e});u(`Progress updated to ${n.tecUpdateProgress.progressPct}%`),s(t,n.tecUpdateProgress);}catch(e){i(e);}});}function wt(o){let r=o.command("mentors").description("Technospam mentors");r.command("list").description("List mentors").option("--status <s>","PENDING|ACTIVE|PAUSED|INACTIVE").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(F,{status:t.status?t.status.toUpperCase():void 0,pagination:{limit:t.limit,offset:t.offset}});s(t,e.tecListMentors.items,{headers:["ID","Headline","Status","Rate","Rating","Accepting"],rows:e.tecListMentors.items.map(n=>[p(n.id,12),p(n.headline,30),n.status,String(n.hourlyRate??0),String(n.ratingAvg??0),n.isAcceptingMentees?"yes":"no"])});}catch(e){i(e);}}),r.command("get").description("Get a mentor by id").argument("<id>","Mentor ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(H,{id:t});if(!n.tecMentor)throw new l(`Mentor ${t} not found`);s(e,n.tecMentor);}catch(n){i(n);}}),r.command("become").description("Create the calling user's mentor profile").requiredOption("--headline <h>","Mentor headline").option("--bio <s>","Bio").option("--expertise <csv>","Comma-separated areas of expertise").option("--hourly-rate <n>","Hourly rate",c).option("--currency <c>","Currency code").option("-f, --format <format>","Output format").action(async t=>{try{let e={headline:t.headline};t.bio&&(e.bio=t.bio),t.expertise&&(e.expertise=g(t.expertise)),t.hourlyRate!==void 0&&(e.hourlyRate=t.hourlyRate),t.currency&&(e.currency=t.currency);let n=await a(G,{input:e});u(`Mentor profile created: ${n.tecBecomeMentor.headline}`),s(t,n.tecBecomeMentor);}catch(e){i(e);}}),r.command("update").description("Update a mentor profile").argument("<id>","Mentor ID").option("--headline <h>","Mentor headline").option("--bio <s>","Bio").option("--expertise <csv>","Comma-separated areas of expertise").option("--hourly-rate <n>","Hourly rate",c).option("--currency <c>","Currency code").option("--accepting <bool>","true|false (accepting mentees)",t=>t==="true").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n={};if(e.headline&&(n.headline=e.headline),e.bio!==void 0&&(n.bio=e.bio),e.expertise&&(n.expertise=g(e.expertise)),e.hourlyRate!==void 0&&(n.hourlyRate=e.hourlyRate),e.currency&&(n.currency=e.currency),e.accepting!==void 0&&(n.isAcceptingMentees=e.accepting),!Object.keys(n).length)throw new l("No updates specified");let d=await a(j,{id:t,input:n});u("Mentor updated"),s(e,d.tecUpdateMentor);}catch(n){i(n);}}),r.command("approve").description("Approve a pending mentor profile (PENDING -> ACTIVE)").argument("<id>","Mentor ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(B,{id:t});u(`Mentor approved: ${n.tecApproveMentor.status}`),s(e,n.tecApproveMentor);}catch(n){i(n);}});}function Tt(o){let r=o.command("sessions").description("Technospam mentorship sessions");r.command("list").description("List mentorship sessions").option("--mentor <id>","Filter by mentor ID").option("--mentee <id>","Filter by mentee ID").option("--status <s>","REQUESTED|CONFIRMED|COMPLETED|CANCELLED|NO_SHOW").option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(z,{mentorId:t.mentor,menteeId:t.mentee,status:t.status?t.status.toUpperCase():void 0});s(t,e.tecListSessions.items,{headers:["ID","Mentor","Mentee","Topic","Status","Scheduled"],rows:e.tecListSessions.items.map(n=>[p(n.id,12),p(n.mentorId,12),p(n.menteeId,12),p(n.topic,24),n.status,T(n.scheduledAt)])});}catch(e){i(e);}}),r.command("book").description("Book a 1:1 session with a mentor as the calling mentee").requiredOption("--mentor <id>","Mentor ID").requiredOption("--topic <t>","Session topic").requiredOption("--scheduled-at <iso>","Scheduled time (ISO date)").option("--agenda <s>","Agenda").option("--duration-minutes <n>","Duration (minutes)",c).option("-f, --format <format>","Output format").action(async t=>{try{let e={mentorId:t.mentor,topic:t.topic,scheduledAt:t.scheduledAt};t.agenda&&(e.agenda=t.agenda),t.durationMinutes!==void 0&&(e.durationMinutes=t.durationMinutes);let n=await a(W,{input:e});u(`Session booked: ${n.tecBookSession.topic}`),s(t,n.tecBookSession);}catch(e){i(e);}}),r.command("confirm").description("Confirm a requested session").argument("<id>","Session ID").option("--meeting-url <url>","Meeting URL").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(V,{id:t,meetingUrl:e.meetingUrl});u("Session confirmed"),s(e,n.tecConfirmSession);}catch(n){i(n);}}),r.command("cancel").description("Cancel a session").argument("<id>","Session ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(K,{id:t});u("Session cancelled"),s(e,n.tecCancelSession);}catch(n){i(n);}}),r.command("complete").description("Complete a session with optional rating and feedback").argument("<id>","Session ID").option("--rating <n>","Rating (1-5)",c).option("--feedback <s>","Feedback").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(J,{id:t,rating:e.rating,feedback:e.feedback});u("Session completed"),s(e,n.tecCompleteSession);}catch(n){i(n);}});}function yt(o){let r=o.command("hackathons").description("Technospam hackathons");r.command("list").description("List hackathons").option("--status <s>","DRAFT|REGISTRATION_OPEN|IN_PROGRESS|JUDGING|COMPLETED|CANCELLED").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(Q,{status:t.status?t.status.toUpperCase():void 0,pagination:{limit:t.limit,offset:t.offset}});s(t,e.tecListHackathons.items,{headers:["ID","Title","Status","Start","Prize"],rows:e.tecListHackathons.items.map(n=>[p(n.id,12),n.title,n.status,T(n.startAt),String(n.prizePool??0)])});}catch(e){i(e);}}),r.command("get").description("Get a hackathon by id").argument("<id>","Hackathon ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(Y,{id:t});if(!n.tecHackathon)throw new l(`Hackathon ${t} not found`);s(e,n.tecHackathon);}catch(n){i(n);}}),r.command("create").description("Create a hackathon").requiredOption("--title <t>","Hackathon title").requiredOption("--slug <slug>","URL slug").requiredOption("--start-at <iso>","Start time (ISO date)").requiredOption("--end-at <iso>","End time (ISO date)").option("--theme <t>","Theme").option("--description <s>","Description").option("--submission-deadline <iso>","Submission deadline (ISO date)").option("--max-team-size <n>","Max team size",c).option("--prize-pool <n>","Prize pool",c).option("--currency <c>","Currency code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async t=>{try{let e={title:t.title,slug:t.slug,startAt:t.startAt,endAt:t.endAt};t.theme&&(e.theme=t.theme),t.description&&(e.description=t.description),t.submissionDeadline&&(e.submissionDeadline=t.submissionDeadline),t.maxTeamSize!==void 0&&(e.maxTeamSize=t.maxTeamSize),t.prizePool!==void 0&&(e.prizePool=t.prizePool),t.currency&&(e.currency=t.currency),t.tags&&(e.tags=g(t.tags));let n=await a(X,{input:e});u(`Hackathon created: ${n.tecCreateHackathon.title}`),s(t,n.tecCreateHackathon);}catch(e){i(e);}}),r.command("update").description("Update a hackathon").argument("<id>","Hackathon ID").option("--title <t>","Hackathon title").option("--theme <t>","Theme").option("--description <s>","Description").option("--start-at <iso>","Start time (ISO date)").option("--end-at <iso>","End time (ISO date)").option("--submission-deadline <iso>","Submission deadline (ISO date)").option("--max-team-size <n>","Max team size",c).option("--prize-pool <n>","Prize pool",c).option("--currency <c>","Currency code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n={};if(e.title&&(n.title=e.title),e.theme!==void 0&&(n.theme=e.theme),e.description!==void 0&&(n.description=e.description),e.startAt&&(n.startAt=e.startAt),e.endAt&&(n.endAt=e.endAt),e.submissionDeadline&&(n.submissionDeadline=e.submissionDeadline),e.maxTeamSize!==void 0&&(n.maxTeamSize=e.maxTeamSize),e.prizePool!==void 0&&(n.prizePool=e.prizePool),e.currency&&(n.currency=e.currency),e.tags&&(n.tags=g(e.tags)),!Object.keys(n).length)throw new l("No updates specified");let d=await a(Z,{id:t,input:n});u("Hackathon updated"),s(e,d.tecUpdateHackathon);}catch(n){i(n);}}),r.command("open-registration").description("Open registration for a hackathon (DRAFT -> REGISTRATION_OPEN)").argument("<id>","Hackathon ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(tt,{id:t});u(`Registration open: ${n.tecOpenRegistration.status}`),s(e,n.tecOpenRegistration);}catch(n){i(n);}});}function Et(o){let r=o.command("teams").description("Technospam hackathon teams");r.command("list").description("List teams for a hackathon").requiredOption("--hackathon <id>","Hackathon ID").option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(et,{hackathonId:t.hackathon});s(t,e.tecListTeams.items,{headers:["ID","Name","Captain","Status","Score"],rows:e.tecListTeams.items.map(n=>[p(n.id,12),n.name,p(n.captainId,12),n.status,String(n.score??0)])});}catch(e){i(e);}}),r.command("register").description("Register a team for a hackathon with the calling user as captain").requiredOption("--hackathon <id>","Hackathon ID").requiredOption("--name <name>","Team name").option("--members <csv>","Comma-separated member user IDs").option("-f, --format <format>","Output format").action(async t=>{try{let e={hackathonId:t.hackathon,name:t.name};t.members&&(e.memberIds=g(t.members));let n=await a(nt,{input:e});u(`Team registered: ${n.tecRegisterTeam.name}`),s(t,n.tecRegisterTeam);}catch(e){i(e);}}),r.command("submit-project").description("Submit a team's project for judging").requiredOption("--team <id>","Team ID").requiredOption("--project-name <n>","Project name").option("--project-url <url>","Project URL").option("--repo-url <url>","Repository URL").option("--pitch <s>","Pitch").option("-f, --format <format>","Output format").action(async t=>{try{let e={teamId:t.team,projectName:t.projectName};t.projectUrl&&(e.projectUrl=t.projectUrl),t.repoUrl&&(e.repoUrl=t.repoUrl),t.pitch&&(e.pitch=t.pitch);let n=await a(rt,{input:e});u(`Project submitted: ${n.tecSubmitProject.status}`),s(t,n.tecSubmitProject);}catch(e){i(e);}}),r.command("score").description("Record a judge score for a team and optionally mark it WINNER").argument("<id>","Team ID").requiredOption("--score <n>","Score",c).option("--winner","Mark the team as winner").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(ot,{id:t,score:e.score,winner:e.winner??void 0});u(`Team scored: ${n.tecScoreTeam.score}`),s(e,n.tecScoreTeam);}catch(n){i(n);}});}function St(o){let r=o.command("problems").description("Technospam practice problems");r.command("list").description("List problems").option("--difficulty <d>","EASY|MEDIUM|HARD").option("--status <s>","DRAFT|PUBLISHED|ARCHIVED").option("--topic <t>","Filter by topic").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(st,{difficulty:t.difficulty?t.difficulty.toUpperCase():void 0,status:t.status?t.status.toUpperCase():void 0,topic:t.topic,pagination:{limit:t.limit,offset:t.offset}});s(t,e.tecListProblems.items,{headers:["ID","Title","Difficulty","Status","Points"],rows:e.tecListProblems.items.map(n=>[p(n.id,12),n.title,n.difficulty,n.status,String(n.points??0)])});}catch(e){i(e);}}),r.command("get").description("Get a problem by id").argument("<id>","Problem ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(it,{id:t});if(!n.tecProblem)throw new l(`Problem ${t} not found`);s(e,n.tecProblem);}catch(n){i(n);}}),r.command("create").description("Create a problem").requiredOption("--title <t>","Problem title").requiredOption("--slug <slug>","URL slug").option("--topic <t>","Topic").option("--statement <s>","Problem statement").option("--difficulty <d>","EASY|MEDIUM|HARD","EASY").option("--points <n>","Points",c).option("--languages <csv>","Comma-separated allowed languages").option("--starter-code <s>","Starter code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async t=>{try{let e={title:t.title,slug:t.slug,difficulty:(t.difficulty??"EASY").toUpperCase()};t.topic&&(e.topic=t.topic),t.statement&&(e.statement=t.statement),t.points!==void 0&&(e.points=t.points),t.languages&&(e.languages=g(t.languages)),t.starterCode&&(e.starterCode=t.starterCode),t.tags&&(e.tags=g(t.tags));let n=await a(at,{input:e});u(`Problem created: ${n.tecCreateProblem.title}`),s(t,n.tecCreateProblem);}catch(e){i(e);}}),r.command("update").description("Update a problem").argument("<id>","Problem ID").option("--title <t>","Problem title").option("--topic <t>","Topic").option("--statement <s>","Problem statement").option("--difficulty <d>","EASY|MEDIUM|HARD").option("--points <n>","Points",c).option("--languages <csv>","Comma-separated allowed languages").option("--starter-code <s>","Starter code").option("--tags <csv>","Comma-separated tags").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n={};if(e.title&&(n.title=e.title),e.topic!==void 0&&(n.topic=e.topic),e.statement!==void 0&&(n.statement=e.statement),e.difficulty&&(n.difficulty=e.difficulty.toUpperCase()),e.points!==void 0&&(n.points=e.points),e.languages&&(n.languages=g(e.languages)),e.starterCode!==void 0&&(n.starterCode=e.starterCode),e.tags&&(n.tags=g(e.tags)),!Object.keys(n).length)throw new l("No updates specified");let d=await a(ct,{id:t,input:n});u("Problem updated"),s(e,d.tecUpdateProblem);}catch(n){i(n);}}),r.command("publish").description("Publish a problem (DRAFT -> PUBLISHED)").argument("<id>","Problem ID").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(ut,{id:t});u(`Problem published: ${n.tecPublishProblem.title}`),s(e,n.tecPublishProblem);}catch(n){i(n);}});}function kt(o){let r=o.command("submissions").description("Technospam problem submissions");r.command("list").description("List submissions").option("--problem <id>","Filter by problem ID").option("--learner <id>","Filter by learner ID").option("--limit <n>","Page size",c,50).option("--offset <n>","Offset",c,0).option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(dt,{problemId:t.problem,learnerId:t.learner,pagination:{limit:t.limit,offset:t.offset}});s(t,e.tecListSubmissions.items,{headers:["ID","Problem","Learner","Language","Verdict","Points"],rows:e.tecListSubmissions.items.map(n=>[p(n.id,12),p(n.problemId,12),p(n.learnerId,12),n.language,n.verdict,String(n.pointsAwarded??0)])});}catch(e){i(e);}}),r.command("submit").description("Submit a solution to a problem").requiredOption("--problem <id>","Problem ID").requiredOption("--language <l>","Language").requiredOption("--code <c>","Solution code").option("-f, --format <format>","Output format").action(async t=>{try{let e={problemId:t.problem,language:t.language,code:t.code},n=await a(pt,{input:e});u(`Solution submitted: ${n.tecSubmitSolution.verdict}`),s(t,n.tecSubmitSolution);}catch(e){i(e);}}),r.command("grade").description("Record the grader verdict for a submission").argument("<id>","Submission ID").requiredOption("--verdict <v>","PENDING|ACCEPTED|WRONG_ANSWER|TIME_LIMIT_EXCEEDED|RUNTIME_ERROR|COMPILE_ERROR").option("--runtime-ms <n>","Runtime in milliseconds",c).option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(mt,{id:t,verdict:e.verdict.toUpperCase(),runtimeMs:e.runtimeMs});u(`Submission graded: ${n.tecGradeSubmission.verdict}`),s(e,n.tecGradeSubmission);}catch(n){i(n);}});}function At(o){let r=o.command("certificates").description("Technospam completion certificates");r.command("list").description("List certificates").option("--course <id>","Filter by course ID").option("--learner <id>","Filter by learner ID").option("--limit <n>","Page size",c,50).option("--cursor <id>","Start after this certificate (pageInfo.cursor of the previous page)").option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(lt,{courseId:t.course,learnerId:t.learner,pagination:{limit:t.limit,...t.cursor?{cursor:t.cursor}:{}}}),n=h(e.tecCanonicalCertificates.items,"technospamCertificate");s(t,n,{headers:["ID","Serial","Course","Learner","Score","Status"],rows:n.map(d=>[p(d.id,12),d.serial,p(d.courseId,12),p(d.learnerId,12),String(d.score),d.status])}),I(e.tecCanonicalCertificates.pageInfo);}catch(e){i(e);}}),r.command("issue").description("Issue a verifiable completion certificate for a learner on a course").requiredOption("--course <id>","Course ID").requiredOption("--learner <id>","Learner ID").requiredOption("--score <n>","Score",c).option("-f, --format <format>","Output format").action(async t=>{try{let e=await a(gt,{courseId:t.course,learnerId:t.learner,score:t.score});u(`Certificate issued: ${e.tecIssueCertificate.serial}`),s(t,e.tecIssueCertificate);}catch(e){i(e);}}),r.command("revoke").description("Revoke a certificate").argument("<id>","Certificate ID").option("--reason <s>","Revocation reason").option("-f, --format <format>","Output format").action(async(t,e)=>{try{let n=await a(ft,{id:t,reason:e.reason});u(`Certificate revoked: ${n.tecRevokeCertificate.status}`),s(e,n.tecRevokeCertificate);}catch(n){i(n);}});}function xt(o){o.command("health").description("Technospam service health check (public)").option("-f, --format <format>","Output format").action(async r=>{try{let t=await E(ht);u(t.tecHealth),s(r,{health:t.tecHealth});}catch(t){i(t);}});}var Ht={id:"technospam",version:"1.0.0",displayName:"Technospam",dependsOn:["auth","workspaces"],register(o,r){A(r);let t=o.command("technospam").description("Technospam developer-education platform");Ct(t),It(t),bt(t),wt(t),Tt(t),yt(t),Et(t),St(t),kt(t),At(t),xt(t);}},Fn=Ht;module.exports=Fn;