@agi-ventures-canada/hackathon-cli 0.1.6 → 0.1.8

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 (65) hide show
  1. package/dist/_chunks/activate-round.mjs +18 -0
  2. package/dist/_chunks/activate-round.mjs.map +1 -0
  3. package/dist/_chunks/activity.mjs +82 -0
  4. package/dist/_chunks/activity.mjs.map +1 -0
  5. package/dist/_chunks/buckets.mjs +56 -0
  6. package/dist/_chunks/buckets.mjs.map +1 -0
  7. package/dist/_chunks/calculate-results.mjs +18 -0
  8. package/dist/_chunks/calculate-results.mjs.map +1 -0
  9. package/dist/_chunks/create.mjs +1 -1
  10. package/dist/_chunks/create.mjs.map +1 -1
  11. package/dist/_chunks/create6.mjs +29 -38
  12. package/dist/_chunks/create6.mjs.map +1 -1
  13. package/dist/_chunks/create7.mjs +63 -0
  14. package/dist/_chunks/create7.mjs.map +1 -0
  15. package/dist/_chunks/criteria-create.mjs +9 -22
  16. package/dist/_chunks/criteria-create.mjs.map +1 -1
  17. package/dist/_chunks/criteria-list.mjs +4 -0
  18. package/dist/_chunks/criteria-list.mjs.map +1 -1
  19. package/dist/_chunks/criteria-update.mjs +13 -5
  20. package/dist/_chunks/criteria-update.mjs.map +1 -1
  21. package/dist/_chunks/delete5.mjs +8 -8
  22. package/dist/_chunks/delete5.mjs.map +1 -1
  23. package/dist/_chunks/delete6.mjs +22 -0
  24. package/dist/_chunks/delete6.mjs.map +1 -0
  25. package/dist/_chunks/get5.mjs +42 -0
  26. package/dist/_chunks/get5.mjs.map +1 -0
  27. package/dist/_chunks/levels-add.mjs +53 -0
  28. package/dist/_chunks/levels-add.mjs.map +1 -0
  29. package/dist/_chunks/levels-delete.mjs +53 -0
  30. package/dist/_chunks/levels-delete.mjs.map +1 -0
  31. package/dist/_chunks/levels-list.mjs +39 -0
  32. package/dist/_chunks/levels-list.mjs.map +1 -0
  33. package/dist/_chunks/levels-update.mjs +61 -0
  34. package/dist/_chunks/levels-update.mjs.map +1 -0
  35. package/dist/_chunks/list6.mjs +22 -19
  36. package/dist/_chunks/list6.mjs.map +1 -1
  37. package/dist/_chunks/list7.mjs +40 -0
  38. package/dist/_chunks/list7.mjs.map +1 -0
  39. package/dist/_chunks/track-assign.mjs +37 -0
  40. package/dist/_chunks/track-assign.mjs.map +1 -0
  41. package/dist/_chunks/track-unassign.mjs +49 -0
  42. package/dist/_chunks/track-unassign.mjs.map +1 -0
  43. package/dist/_chunks/update-round.mjs +49 -0
  44. package/dist/_chunks/update-round.mjs.map +1 -0
  45. package/dist/_chunks/update5.mjs +41 -48
  46. package/dist/_chunks/update5.mjs.map +1 -1
  47. package/dist/_chunks/update6.mjs +56 -0
  48. package/dist/_chunks/update6.mjs.map +1 -0
  49. package/dist/cli.mjs +160 -86
  50. package/dist/cli.mjs.map +1 -1
  51. package/package.json +1 -1
  52. package/dist/_chunks/hackathons-delete.mjs +0 -26
  53. package/dist/_chunks/hackathons-delete.mjs.map +0 -1
  54. package/dist/_chunks/hackathons-get.mjs +0 -34
  55. package/dist/_chunks/hackathons-get.mjs.map +0 -1
  56. package/dist/_chunks/hackathons-list.mjs +0 -64
  57. package/dist/_chunks/hackathons-list.mjs.map +0 -1
  58. package/dist/_chunks/hackathons-update.mjs +0 -73
  59. package/dist/_chunks/hackathons-update.mjs.map +0 -1
  60. package/dist/_chunks/scenarios-list.mjs +0 -24
  61. package/dist/_chunks/scenarios-list.mjs.map +0 -1
  62. package/dist/_chunks/scenarios-run.mjs +0 -23
  63. package/dist/_chunks/scenarios-run.mjs.map +0 -1
  64. package/dist/_chunks/stats.mjs +0 -37
  65. package/dist/_chunks/stats.mjs.map +0 -1
@@ -0,0 +1,18 @@
1
+ import { n as formatJson, r as formatSuccess } from "../cli.mjs";
2
+ //#region src/commands/tracks/activate-round.ts
3
+ async function runTracksActivateRound(client, hackathonId, trackId, roundId, options) {
4
+ if (!trackId || !roundId) {
5
+ console.error("Usage: hackathon tracks activate-round <hackathon-id> <track-id> <round-id>");
6
+ process.exit(1);
7
+ }
8
+ const result = await client.post(`/api/dashboard/hackathons/${hackathonId}/prize-tracks/${trackId}/rounds/${roundId}/activate`, {});
9
+ if (options.json) {
10
+ console.log(formatJson(result));
11
+ return;
12
+ }
13
+ console.log(formatSuccess("Round activated"));
14
+ }
15
+ //#endregion
16
+ export { runTracksActivateRound };
17
+
18
+ //# sourceMappingURL=activate-round.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate-round.mjs","names":[],"sources":["../../src/commands/tracks/activate-round.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\n\nexport async function runTracksActivateRound(\n client: OatmealClient,\n hackathonId: string,\n trackId: string,\n roundId: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!trackId || !roundId) {\n console.error(\"Usage: hackathon tracks activate-round <hackathon-id> <track-id> <round-id>\")\n process.exit(1)\n }\n\n const result = await client.post<{ success: boolean }>(\n `/api/dashboard/hackathons/${hackathonId}/prize-tracks/${trackId}/rounds/${roundId}/activate`,\n {}\n )\n\n if (options.json) {\n console.log(formatJson(result))\n return\n }\n\n console.log(formatSuccess(\"Round activated\"))\n}\n"],"mappings":";;AAGA,eAAsB,uBACpB,QACA,aACA,SACA,SACA,SACe;AACf,KAAI,CAAC,WAAW,CAAC,SAAS;AACxB,UAAQ,MAAM,8EAA8E;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,MAAM,OAAO,KAC1B,6BAA6B,YAAY,gBAAgB,QAAQ,UAAU,QAAQ,YACnF,EAAE,CACH;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,OAAO,CAAC;AAC/B;;AAGF,SAAQ,IAAI,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { i as formatTable, n as formatJson } from "../cli.mjs";
2
+ import { t as resolveHackathonId } from "./resolve.mjs";
3
+ //#region src/commands/hackathons/activity.ts
4
+ function parseArgs(args) {
5
+ const options = {};
6
+ for (let i = 0; i < args.length; i++) switch (args[i]) {
7
+ case "--json":
8
+ options.json = true;
9
+ break;
10
+ case "--limit":
11
+ options.limit = parseInt(args[++i]);
12
+ break;
13
+ case "--offset":
14
+ options.offset = parseInt(args[++i]);
15
+ break;
16
+ case "--action":
17
+ options.action = args[++i];
18
+ break;
19
+ case "--resource-type":
20
+ options.resourceType = args[++i];
21
+ break;
22
+ case "--since":
23
+ options.since = args[++i];
24
+ break;
25
+ case "--until":
26
+ options.until = args[++i];
27
+ break;
28
+ case "--sort":
29
+ options.sort = args[++i];
30
+ break;
31
+ }
32
+ return options;
33
+ }
34
+ async function runHackathonsActivity(client, idOrSlug, args) {
35
+ if (!idOrSlug) {
36
+ console.error("Usage: hackathon events activity <id-or-slug> [--limit N] [--offset N] [--action filter] [--resource-type type] [--since ISO] [--until ISO] [--sort asc|desc]");
37
+ process.exit(1);
38
+ }
39
+ const options = parseArgs(args);
40
+ const id = await resolveHackathonId(client, idOrSlug);
41
+ const params = new URLSearchParams();
42
+ if (options.limit) params.set("limit", String(options.limit));
43
+ if (options.offset) params.set("offset", String(options.offset));
44
+ if (options.action) params.set("action", options.action);
45
+ if (options.resourceType) params.set("resource_type", options.resourceType);
46
+ if (options.since) params.set("since", options.since);
47
+ if (options.until) params.set("until", options.until);
48
+ if (options.sort) params.set("sort", options.sort);
49
+ const qs = params.toString();
50
+ const data = await client.get(`/api/v1/hackathons/${id}/activity${qs ? `?${qs}` : ""}`);
51
+ if (options.json) {
52
+ console.log(formatJson(data));
53
+ return;
54
+ }
55
+ if (!data.logs?.length) {
56
+ console.log("No activity recorded for this event.");
57
+ return;
58
+ }
59
+ console.log(`${data.total} total events\n`);
60
+ console.log(formatTable(data.logs, [
61
+ {
62
+ key: "action",
63
+ label: "Action"
64
+ },
65
+ {
66
+ key: "resourceType",
67
+ label: "Resource"
68
+ },
69
+ {
70
+ key: "actorType",
71
+ label: "Actor"
72
+ },
73
+ {
74
+ key: "createdAt",
75
+ label: "Time"
76
+ }
77
+ ]));
78
+ }
79
+ //#endregion
80
+ export { runHackathonsActivity };
81
+
82
+ //# sourceMappingURL=activity.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.mjs","names":[],"sources":["../../src/commands/hackathons/activity.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport { resolveHackathonId } from \"./resolve.js\"\n\ntype ActivityLog = {\n id: string\n action: string\n resourceType: string\n resourceId: string | null\n actorType: string\n metadata: Record<string, unknown> | null\n createdAt: string\n}\n\ntype ActivityResponse = {\n logs: ActivityLog[]\n total: number\n}\n\ntype ActivityOptions = {\n json?: boolean\n limit?: number\n offset?: number\n action?: string\n resourceType?: string\n since?: string\n until?: string\n sort?: string\n}\n\nfunction parseArgs(args: string[]): ActivityOptions {\n const options: ActivityOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--json\":\n options.json = true\n break\n case \"--limit\":\n options.limit = parseInt(args[++i])\n break\n case \"--offset\":\n options.offset = parseInt(args[++i])\n break\n case \"--action\":\n options.action = args[++i]\n break\n case \"--resource-type\":\n options.resourceType = args[++i]\n break\n case \"--since\":\n options.since = args[++i]\n break\n case \"--until\":\n options.until = args[++i]\n break\n case \"--sort\":\n options.sort = args[++i]\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsActivity(\n client: OatmealClient,\n idOrSlug: string,\n args: string[]\n): Promise<void> {\n if (!idOrSlug) {\n console.error(\"Usage: hackathon events activity <id-or-slug> [--limit N] [--offset N] [--action filter] [--resource-type type] [--since ISO] [--until ISO] [--sort asc|desc]\")\n process.exit(1)\n }\n\n const options = parseArgs(args)\n const id = await resolveHackathonId(client, idOrSlug)\n\n const params = new URLSearchParams()\n if (options.limit) params.set(\"limit\", String(options.limit))\n if (options.offset) params.set(\"offset\", String(options.offset))\n if (options.action) params.set(\"action\", options.action)\n if (options.resourceType) params.set(\"resource_type\", options.resourceType)\n if (options.since) params.set(\"since\", options.since)\n if (options.until) params.set(\"until\", options.until)\n if (options.sort) params.set(\"sort\", options.sort)\n\n const qs = params.toString()\n const data = await client.get<ActivityResponse>(`/api/v1/hackathons/${id}/activity${qs ? `?${qs}` : \"\"}`)\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.logs?.length) {\n console.log(\"No activity recorded for this event.\")\n return\n }\n\n console.log(`${data.total} total events\\n`)\n console.log(\n formatTable(data.logs, [\n { key: \"action\", label: \"Action\" },\n { key: \"resourceType\", label: \"Resource\" },\n { key: \"actorType\", label: \"Actor\" },\n { key: \"createdAt\", label: \"Time\" },\n ])\n )\n}\n"],"mappings":";;;AA8BA,SAAS,UAAU,MAAiC;CAClD,MAAM,UAA2B,EAAE;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO;AACf;EACF,KAAK;AACH,WAAQ,QAAQ,SAAS,KAAK,EAAE,GAAG;AACnC;EACF,KAAK;AACH,WAAQ,SAAS,SAAS,KAAK,EAAE,GAAG;AACpC;EACF,KAAK;AACH,WAAQ,SAAS,KAAK,EAAE;AACxB;EACF,KAAK;AACH,WAAQ,eAAe,KAAK,EAAE;AAC9B;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;;AAGN,QAAO;;AAGT,eAAsB,sBACpB,QACA,UACA,MACe;AACf,KAAI,CAAC,UAAU;AACb,UAAQ,MAAM,gKAAgK;AAC9K,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,UAAU,KAAK;CAC/B,MAAM,KAAK,MAAM,mBAAmB,QAAQ,SAAS;CAErD,MAAM,SAAS,IAAI,iBAAiB;AACpC,KAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,OAAO,QAAQ,MAAM,CAAC;AAC7D,KAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,OAAO,QAAQ,OAAO,CAAC;AAChE,KAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,OAAO;AACxD,KAAI,QAAQ,aAAc,QAAO,IAAI,iBAAiB,QAAQ,aAAa;AAC3E,KAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,QAAQ,MAAM;AACrD,KAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,QAAQ,MAAM;AACrD,KAAI,QAAQ,KAAM,QAAO,IAAI,QAAQ,QAAQ,KAAK;CAElD,MAAM,KAAK,OAAO,UAAU;CAC5B,MAAM,OAAO,MAAM,OAAO,IAAsB,sBAAsB,GAAG,WAAW,KAAK,IAAI,OAAO,KAAK;AAEzG,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,MAAM,QAAQ;AACtB,UAAQ,IAAI,uCAAuC;AACnD;;AAGF,SAAQ,IAAI,GAAG,KAAK,MAAM,iBAAiB;AAC3C,SAAQ,IACN,YAAY,KAAK,MAAM;EACrB;GAAE,KAAK;GAAU,OAAO;GAAU;EAClC;GAAE,KAAK;GAAgB,OAAO;GAAY;EAC1C;GAAE,KAAK;GAAa,OAAO;GAAS;EACpC;GAAE,KAAK;GAAa,OAAO;;EAC5B,CAAC,CACH"}
@@ -0,0 +1,56 @@
1
+ import { n as formatJson, r as formatSuccess } from "../cli.mjs";
2
+ //#region src/commands/tracks/buckets.ts
3
+ function parseOptions(args) {
4
+ const options = {};
5
+ const buckets = [];
6
+ let currentLabel = "";
7
+ let currentDesc = "";
8
+ for (let i = 0; i < args.length; i++) switch (args[i]) {
9
+ case "--json":
10
+ options.json = true;
11
+ break;
12
+ case "--bucket":
13
+ if (currentLabel) buckets.push({
14
+ level: buckets.length + 1,
15
+ label: currentLabel,
16
+ description: currentDesc || void 0
17
+ });
18
+ currentLabel = args[++i];
19
+ currentDesc = "";
20
+ break;
21
+ case "--bucket-desc":
22
+ currentDesc = args[++i];
23
+ break;
24
+ }
25
+ if (currentLabel) buckets.push({
26
+ level: buckets.length + 1,
27
+ label: currentLabel,
28
+ description: currentDesc || void 0
29
+ });
30
+ return {
31
+ buckets,
32
+ options
33
+ };
34
+ }
35
+ async function runTracksBuckets(client, hackathonId, trackId, roundId, args) {
36
+ if (!trackId || !roundId) {
37
+ console.error("Usage: hackathon tracks buckets <hackathon-id> <track-id> <round-id> --bucket <label> [--bucket-desc <desc>] ...");
38
+ process.exit(1);
39
+ }
40
+ const { buckets, options } = parseOptions(args);
41
+ if (buckets.length < 2) {
42
+ console.error("Error: at least 2 buckets are required (use --bucket <label> for each)");
43
+ process.exit(1);
44
+ }
45
+ const result = await client.put(`/api/dashboard/hackathons/${hackathonId}/prize-tracks/${trackId}/rounds/${roundId}/buckets`, { buckets });
46
+ if (options.json) {
47
+ console.log(formatJson(result));
48
+ return;
49
+ }
50
+ console.log(formatSuccess(`Saved ${result.buckets.length} bucket definitions`));
51
+ for (const b of result.buckets) console.log(` ${b.level}. ${b.label}${b.description ? ` — ${b.description}` : ""}`);
52
+ }
53
+ //#endregion
54
+ export { runTracksBuckets };
55
+
56
+ //# sourceMappingURL=buckets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buckets.mjs","names":[],"sources":["../../src/commands/tracks/buckets.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { BucketDef } from \"../../types.js\"\n\ninterface BucketsOptions {\n json?: boolean\n}\n\nfunction parseOptions(args: string[]): { buckets: Array<{ level: number; label: string; description?: string }>; options: BucketsOptions } {\n const options: BucketsOptions = {}\n const buckets: Array<{ level: number; label: string; description?: string }> = []\n let currentLabel = \"\"\n let currentDesc = \"\"\n\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--json\":\n options.json = true\n break\n case \"--bucket\": {\n if (currentLabel) {\n buckets.push({ level: buckets.length + 1, label: currentLabel, description: currentDesc || undefined })\n }\n currentLabel = args[++i]\n currentDesc = \"\"\n break\n }\n case \"--bucket-desc\":\n currentDesc = args[++i]\n break\n }\n }\n if (currentLabel) {\n buckets.push({ level: buckets.length + 1, label: currentLabel, description: currentDesc || undefined })\n }\n\n return { buckets, options }\n}\n\nexport async function runTracksBuckets(\n client: OatmealClient,\n hackathonId: string,\n trackId: string,\n roundId: string,\n args: string[]\n): Promise<void> {\n if (!trackId || !roundId) {\n console.error(\"Usage: hackathon tracks buckets <hackathon-id> <track-id> <round-id> --bucket <label> [--bucket-desc <desc>] ...\")\n process.exit(1)\n }\n\n const { buckets, options } = parseOptions(args)\n\n if (buckets.length < 2) {\n console.error(\"Error: at least 2 buckets are required (use --bucket <label> for each)\")\n process.exit(1)\n }\n\n const result = await client.put<{ buckets: BucketDef[] }>(\n `/api/dashboard/hackathons/${hackathonId}/prize-tracks/${trackId}/rounds/${roundId}/buckets`,\n { buckets }\n )\n\n if (options.json) {\n console.log(formatJson(result))\n return\n }\n\n console.log(formatSuccess(`Saved ${result.buckets.length} bucket definitions`))\n for (const b of result.buckets) {\n console.log(` ${b.level}. ${b.label}${b.description ? ` — ${b.description}` : \"\"}`)\n }\n}\n"],"mappings":";;AAQA,SAAS,aAAa,MAAqH;CACzI,MAAM,UAA0B,EAAE;CAClC,MAAM,UAAyE,EAAE;CACjF,IAAI,eAAe;CACnB,IAAI,cAAc;AAElB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO;AACf;EACF,KAAK;AACH,OAAI,aACF,SAAQ,KAAK;IAAE,OAAO,QAAQ,SAAS;IAAG,OAAO;IAAc,aAAa,eAAe,KAAA;IAAW,CAAC;AAEzG,kBAAe,KAAK,EAAE;AACtB,iBAAc;AACd;EAEF,KAAK;AACH,iBAAc,KAAK,EAAE;AACrB;;AAGN,KAAI,aACF,SAAQ,KAAK;EAAE,OAAO,QAAQ,SAAS;EAAG,OAAO;EAAc,aAAa,eAAe,KAAA;EAAW,CAAC;AAGzG,QAAO;EAAE;EAAS;EAAS;;AAG7B,eAAsB,iBACpB,QACA,aACA,SACA,SACA,MACe;AACf,KAAI,CAAC,WAAW,CAAC,SAAS;AACxB,UAAQ,MAAM,mHAAmH;AACjI,UAAQ,KAAK,EAAE;;CAGjB,MAAM,EAAE,SAAS,YAAY,aAAa,KAAK;AAE/C,KAAI,QAAQ,SAAS,GAAG;AACtB,UAAQ,MAAM,yEAAyE;AACvF,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,MAAM,OAAO,IAC1B,6BAA6B,YAAY,gBAAgB,QAAQ,UAAU,QAAQ,WACnF,EAAE,SAAS,CACZ;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,OAAO,CAAC;AAC/B;;AAGF,SAAQ,IAAI,cAAc,SAAS,OAAO,QAAQ,OAAO,qBAAqB,CAAC;AAC/E,MAAK,MAAM,KAAK,OAAO,QACrB,SAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,cAAc,MAAM,EAAE,gBAAgB,KAAK"}
@@ -0,0 +1,18 @@
1
+ import { n as formatJson, r as formatSuccess } from "../cli.mjs";
2
+ //#region src/commands/tracks/calculate-results.ts
3
+ async function runTracksCalculateResults(client, hackathonId, trackId, roundId, options) {
4
+ if (!trackId || !roundId) {
5
+ console.error("Usage: hackathon tracks calculate-results <hackathon-id> <track-id> <round-id>");
6
+ process.exit(1);
7
+ }
8
+ const result = await client.post(`/api/dashboard/hackathons/${hackathonId}/prize-tracks/${trackId}/rounds/${roundId}/calculate-results`, {});
9
+ if (options.json) {
10
+ console.log(formatJson(result));
11
+ return;
12
+ }
13
+ console.log(formatSuccess(`Calculated results for ${result.resultsCount} submissions`));
14
+ }
15
+ //#endregion
16
+ export { runTracksCalculateResults };
17
+
18
+ //# sourceMappingURL=calculate-results.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate-results.mjs","names":[],"sources":["../../src/commands/tracks/calculate-results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\n\nexport async function runTracksCalculateResults(\n client: OatmealClient,\n hackathonId: string,\n trackId: string,\n roundId: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!trackId || !roundId) {\n console.error(\"Usage: hackathon tracks calculate-results <hackathon-id> <track-id> <round-id>\")\n process.exit(1)\n }\n\n const result = await client.post<{ success: boolean; resultsCount: number }>(\n `/api/dashboard/hackathons/${hackathonId}/prize-tracks/${trackId}/rounds/${roundId}/calculate-results`,\n {}\n )\n\n if (options.json) {\n console.log(formatJson(result))\n return\n }\n\n console.log(formatSuccess(`Calculated results for ${result.resultsCount} submissions`))\n}\n"],"mappings":";;AAGA,eAAsB,0BACpB,QACA,aACA,SACA,SACA,SACe;AACf,KAAI,CAAC,WAAW,CAAC,SAAS;AACxB,UAAQ,MAAM,iFAAiF;AAC/F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,MAAM,OAAO,KAC1B,6BAA6B,YAAY,gBAAgB,QAAQ,UAAU,QAAQ,qBACnF,EAAE,CACH;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,OAAO,CAAC;AAC/B;;AAGF,SAAQ,IAAI,cAAc,0BAA0B,OAAO,aAAa,cAAc,CAAC"}
@@ -28,7 +28,7 @@ async function runHackathonsCreate(client, args) {
28
28
  let slug = options.slug;
29
29
  let description = options.description;
30
30
  if (options.fromUrl) {
31
- const hackathon = await client.post("/api/dashboard/import/luma-url", {
31
+ const hackathon = await client.post("/api/dashboard/import/url", {
32
32
  url: options.fromUrl,
33
33
  name,
34
34
  description
@@ -1 +1 @@
1
- {"version":3,"file":"create.mjs","names":[],"sources":["../../src/commands/hackathons/create.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\n\ninterface CreateOptions {\n name?: string\n slug?: string\n description?: string\n fromUrl?: string\n json?: boolean\n}\n\ninterface ImportedHackathonResponse {\n id: string\n name: string\n slug: string\n}\n\nexport function parseCreateOptions(args: string[]): CreateOptions {\n const options: CreateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--slug\":\n options.slug = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--from-url\":\n options.fromUrl = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsCreate(\n client: OatmealClient,\n args: string[]\n): Promise<void> {\n const options = parseCreateOptions(args)\n\n let name = options.name\n let slug = options.slug\n let description = options.description\n\n if (options.fromUrl) {\n const hackathon = await client.post<ImportedHackathonResponse>(\"/api/dashboard/import/luma-url\", {\n url: options.fromUrl,\n name,\n description,\n })\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Imported hackathon \"${hackathon.name}\" (${hackathon.id})`))\n return\n }\n\n if (!name && process.stdout.isTTY) {\n const result = await p.text({ message: \"Hackathon name:\", validate: (v: string) => (v ? undefined : \"Name is required\") })\n if (p.isCancel(result)) return\n name = result\n }\n\n if (!name) {\n console.error(\"Error: --name is required\")\n process.exit(1)\n }\n\n if (!slug && process.stdout.isTTY) {\n const suggested = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\")\n const result = await p.text({ message: \"Slug:\", initialValue: suggested })\n if (p.isCancel(result)) return\n slug = result\n }\n\n if (!description && process.stdout.isTTY) {\n const result = await p.text({ message: \"Description (optional):\" })\n if (!p.isCancel(result)) description = result || undefined\n }\n\n const hackathon = await client.post<Hackathon>(\"/api/dashboard/hackathons\", {\n name,\n slug,\n description,\n })\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Created hackathon \"${hackathon.name}\" (${hackathon.id})`))\n}\n"],"mappings":";;;AAmBA,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,UAAyB,EAAE;AACjC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,UAAU,KAAK,EAAE;AACzB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,oBACpB,QACA,MACe;CACf,MAAM,UAAU,mBAAmB,KAAK;CAExC,IAAI,OAAO,QAAQ;CACnB,IAAI,OAAO,QAAQ;CACnB,IAAI,cAAc,QAAQ;AAE1B,KAAI,QAAQ,SAAS;EACnB,MAAM,YAAY,MAAM,OAAO,KAAgC,kCAAkC;GAC/F,KAAK,QAAQ;GACb;GACA;GACD,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,UAAQ,IAAI,cAAc,uBAAuB,UAAU,KAAK,KAAK,UAAU,GAAG,GAAG,CAAC;AACtF;;AAGF,KAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO;EACjC,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAmB,WAAW,MAAe,IAAI,KAAA,IAAY;GAAqB,CAAC;AAC1H,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,SAAO;;AAGT,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,4BAA4B;AAC1C,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO;EACjC,MAAM,YAAY,KAAK,aAAa,CAAC,QAAQ,eAAe,IAAI,CAAC,QAAQ,UAAU,GAAG;EACtF,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAS,cAAc;GAAW,CAAC;AAC1E,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,SAAO;;AAGT,KAAI,CAAC,eAAe,QAAQ,OAAO,OAAO;EACxC,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,2BAA2B,CAAC;AACnE,MAAI,CAAC,EAAE,SAAS,OAAO,CAAE,eAAc,UAAU,KAAA;;CAGnD,MAAM,YAAY,MAAM,OAAO,KAAgB,6BAA6B;EAC1E;EACA;EACA;EACD,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,SAAQ,IAAI,cAAc,sBAAsB,UAAU,KAAK,KAAK,UAAU,GAAG,GAAG,CAAC"}
1
+ {"version":3,"file":"create.mjs","names":[],"sources":["../../src/commands/hackathons/create.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\n\ninterface CreateOptions {\n name?: string\n slug?: string\n description?: string\n fromUrl?: string\n json?: boolean\n}\n\ninterface ImportedHackathonResponse {\n id: string\n name: string\n slug: string\n}\n\nexport function parseCreateOptions(args: string[]): CreateOptions {\n const options: CreateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--slug\":\n options.slug = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--from-url\":\n options.fromUrl = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsCreate(\n client: OatmealClient,\n args: string[]\n): Promise<void> {\n const options = parseCreateOptions(args)\n\n let name = options.name\n let slug = options.slug\n let description = options.description\n\n if (options.fromUrl) {\n const hackathon = await client.post<ImportedHackathonResponse>(\"/api/dashboard/import/url\", {\n url: options.fromUrl,\n name,\n description,\n })\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Imported hackathon \"${hackathon.name}\" (${hackathon.id})`))\n return\n }\n\n if (!name && process.stdout.isTTY) {\n const result = await p.text({ message: \"Hackathon name:\", validate: (v: string) => (v ? undefined : \"Name is required\") })\n if (p.isCancel(result)) return\n name = result\n }\n\n if (!name) {\n console.error(\"Error: --name is required\")\n process.exit(1)\n }\n\n if (!slug && process.stdout.isTTY) {\n const suggested = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\")\n const result = await p.text({ message: \"Slug:\", initialValue: suggested })\n if (p.isCancel(result)) return\n slug = result\n }\n\n if (!description && process.stdout.isTTY) {\n const result = await p.text({ message: \"Description (optional):\" })\n if (!p.isCancel(result)) description = result || undefined\n }\n\n const hackathon = await client.post<Hackathon>(\"/api/dashboard/hackathons\", {\n name,\n slug,\n description,\n })\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Created hackathon \"${hackathon.name}\" (${hackathon.id})`))\n}\n"],"mappings":";;;AAmBA,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,UAAyB,EAAE;AACjC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,UAAU,KAAK,EAAE;AACzB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,oBACpB,QACA,MACe;CACf,MAAM,UAAU,mBAAmB,KAAK;CAExC,IAAI,OAAO,QAAQ;CACnB,IAAI,OAAO,QAAQ;CACnB,IAAI,cAAc,QAAQ;AAE1B,KAAI,QAAQ,SAAS;EACnB,MAAM,YAAY,MAAM,OAAO,KAAgC,6BAA6B;GAC1F,KAAK,QAAQ;GACb;GACA;GACD,CAAC;AAEF,MAAI,QAAQ,MAAM;AAChB,WAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,UAAQ,IAAI,cAAc,uBAAuB,UAAU,KAAK,KAAK,UAAU,GAAG,GAAG,CAAC;AACtF;;AAGF,KAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO;EACjC,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAmB,WAAW,MAAe,IAAI,KAAA,IAAY;GAAqB,CAAC;AAC1H,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,SAAO;;AAGT,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,4BAA4B;AAC1C,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO;EACjC,MAAM,YAAY,KAAK,aAAa,CAAC,QAAQ,eAAe,IAAI,CAAC,QAAQ,UAAU,GAAG;EACtF,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAS,cAAc;GAAW,CAAC;AAC1E,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,SAAO;;AAGT,KAAI,CAAC,eAAe,QAAQ,OAAO,OAAO;EACxC,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,2BAA2B,CAAC;AACnE,MAAI,CAAC,EAAE,SAAS,OAAO,CAAE,eAAc,UAAU,KAAA;;CAGnD,MAAM,YAAY,MAAM,OAAO,KAAgB,6BAA6B;EAC1E;EACA;EACA;EACD,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,SAAQ,IAAI,cAAc,sBAAsB,UAAU,KAAK,KAAK,UAAU,GAAG,GAAG,CAAC"}
@@ -1,20 +1,20 @@
1
- import { a as formatWarning, n as formatJson, r as formatSuccess } from "../cli.mjs";
1
+ import { n as formatJson, r as formatSuccess } from "../cli.mjs";
2
2
  import * as p from "@clack/prompts";
3
- //#region src/commands/webhooks/create.ts
4
- function normalizeUrl(input) {
5
- const trimmed = input.trim();
6
- if (!trimmed) return trimmed;
7
- if (/^https?:\/\//i.test(trimmed)) return trimmed;
8
- return `https://${trimmed}`;
9
- }
10
- function parseWebhookCreateOptions(args) {
3
+ //#region src/commands/tracks/create.ts
4
+ function parseOptions(args) {
11
5
  const options = {};
12
6
  for (let i = 0; i < args.length; i++) switch (args[i]) {
13
- case "--url":
14
- options.url = args[++i];
7
+ case "--name":
8
+ options.name = args[++i];
9
+ break;
10
+ case "--description":
11
+ options.description = args[++i];
12
+ break;
13
+ case "--intent":
14
+ options.intent = args[++i];
15
15
  break;
16
- case "--events":
17
- options.events = args[++i]?.split(",").map((s) => s.trim());
16
+ case "--style":
17
+ options.style = args[++i];
18
18
  break;
19
19
  case "--json":
20
20
  options.json = true;
@@ -22,42 +22,33 @@ function parseWebhookCreateOptions(args) {
22
22
  }
23
23
  return options;
24
24
  }
25
- async function runWebhooksCreate(client, args) {
26
- const options = parseWebhookCreateOptions(args);
27
- let url = options.url;
28
- let events = options.events;
29
- if (!url && process.stdout.isTTY) {
25
+ async function runTracksCreate(client, hackathonId, args) {
26
+ const options = parseOptions(args);
27
+ let name = options.name;
28
+ if (!name && process.stdout.isTTY) {
30
29
  const result = await p.text({
31
- message: "Webhook URL:",
30
+ message: "Track name:",
32
31
  validate: (v) => v ? void 0 : "Required"
33
32
  });
34
33
  if (p.isCancel(result)) return;
35
- url = result;
34
+ name = result;
36
35
  }
37
- if (!url) {
38
- console.error("Error: --url is required");
36
+ if (!name) {
37
+ console.error("Error: --name is required");
39
38
  process.exit(1);
40
39
  }
41
- if (!events?.length && process.stdout.isTTY) {
42
- const result = await p.text({ message: "Events (comma-separated):" });
43
- if (p.isCancel(result)) return;
44
- events = result.split(",").map((s) => s.trim());
45
- }
46
- const webhook = await client.post("/api/v1/webhooks", {
47
- url: normalizeUrl(url),
48
- events
49
- });
40
+ const body = { name };
41
+ if (options.description) body.description = options.description;
42
+ if (options.intent) body.intent = options.intent;
43
+ if (options.style) body.style = options.style;
44
+ const track = await client.post(`/api/dashboard/hackathons/${hackathonId}/prize-tracks`, body);
50
45
  if (options.json) {
51
- console.log(formatJson(webhook));
46
+ console.log(formatJson(track));
52
47
  return;
53
48
  }
54
- console.log(formatSuccess(`Created webhook ${webhook.id}`));
55
- if (webhook.signingSecret) {
56
- console.log(formatWarning("Save this signing secret — it won't be shown again:"));
57
- console.log(webhook.signingSecret);
58
- }
49
+ console.log(formatSuccess(`Created track "${track.name}" (${track.id})`));
59
50
  }
60
51
  //#endregion
61
- export { runWebhooksCreate };
52
+ export { runTracksCreate };
62
53
 
63
54
  //# sourceMappingURL=create6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"create6.mjs","names":[],"sources":["../../src/commands/webhooks/create.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess, formatWarning } from \"../../output.js\"\nimport type { Webhook } from \"../../types.js\"\n\ninterface WebhookCreateOptions {\n url?: string\n events?: string[]\n json?: boolean\n}\n\nfunction normalizeUrl(input: string): string {\n const trimmed = input.trim()\n if (!trimmed) return trimmed\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed\n return `https://${trimmed}`\n}\n\nexport function parseWebhookCreateOptions(args: string[]): WebhookCreateOptions {\n const options: WebhookCreateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--url\":\n options.url = args[++i]\n break\n case \"--events\":\n options.events = args[++i]?.split(\",\").map((s) => s.trim())\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runWebhooksCreate(\n client: OatmealClient,\n args: string[]\n): Promise<void> {\n const options = parseWebhookCreateOptions(args)\n\n let url = options.url\n let events = options.events\n\n if (!url && process.stdout.isTTY) {\n const result = await p.text({ message: \"Webhook URL:\", validate: (v: string) => (v ? undefined : \"Required\") })\n if (p.isCancel(result)) return\n url = result\n }\n\n if (!url) {\n console.error(\"Error: --url is required\")\n process.exit(1)\n }\n\n if (!events?.length && process.stdout.isTTY) {\n const result = await p.text({ message: \"Events (comma-separated):\" })\n if (p.isCancel(result)) return\n events = result.split(\",\").map((s: string) => s.trim())\n }\n\n const webhook = await client.post<Webhook>(\"/api/v1/webhooks\", {\n url: normalizeUrl(url),\n events,\n })\n\n if (options.json) {\n console.log(formatJson(webhook))\n return\n }\n\n console.log(formatSuccess(`Created webhook ${webhook.id}`))\n if (webhook.signingSecret) {\n console.log(formatWarning(\"Save this signing secret — it won't be shown again:\"))\n console.log(webhook.signingSecret)\n }\n}\n"],"mappings":";;;AAWA,SAAS,aAAa,OAAuB;CAC3C,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI,gBAAgB,KAAK,QAAQ,CAAE,QAAO;AAC1C,QAAO,WAAW;;AAGpB,SAAgB,0BAA0B,MAAsC;CAC9E,MAAM,UAAgC,EAAE;AACxC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,MAAM,KAAK,EAAE;AACrB;EACF,KAAK;AACH,WAAQ,SAAS,KAAK,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;AAC3D;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,kBACpB,QACA,MACe;CACf,MAAM,UAAU,0BAA0B,KAAK;CAE/C,IAAI,MAAM,QAAQ;CAClB,IAAI,SAAS,QAAQ;AAErB,KAAI,CAAC,OAAO,QAAQ,OAAO,OAAO;EAChC,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAgB,WAAW,MAAe,IAAI,KAAA,IAAY;GAAa,CAAC;AAC/G,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,QAAM;;AAGR,KAAI,CAAC,KAAK;AACR,UAAQ,MAAM,2BAA2B;AACzC,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,UAAU,QAAQ,OAAO,OAAO;EAC3C,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,6BAA6B,CAAC;AACrE,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,WAAS,OAAO,MAAM,IAAI,CAAC,KAAK,MAAc,EAAE,MAAM,CAAC;;CAGzD,MAAM,UAAU,MAAM,OAAO,KAAc,oBAAoB;EAC7D,KAAK,aAAa,IAAI;EACtB;EACD,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,QAAQ,CAAC;AAChC;;AAGF,SAAQ,IAAI,cAAc,mBAAmB,QAAQ,KAAK,CAAC;AAC3D,KAAI,QAAQ,eAAe;AACzB,UAAQ,IAAI,cAAc,sDAAsD,CAAC;AACjF,UAAQ,IAAI,QAAQ,cAAc"}
1
+ {"version":3,"file":"create6.mjs","names":[],"sources":["../../src/commands/tracks/create.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\n\ninterface TrackCreateOptions {\n name?: string\n description?: string\n intent?: string\n style?: string\n json?: boolean\n}\n\nfunction parseOptions(args: string[]): TrackCreateOptions {\n const options: TrackCreateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--intent\":\n options.intent = args[++i]\n break\n case \"--style\":\n options.style = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runTracksCreate(\n client: OatmealClient,\n hackathonId: string,\n args: string[]\n): Promise<void> {\n const options = parseOptions(args)\n\n let name = options.name\n\n if (!name && process.stdout.isTTY) {\n const result = await p.text({ message: \"Track name:\", validate: (v: string) => (v ? undefined : \"Required\") })\n if (p.isCancel(result)) return\n name = result\n }\n\n if (!name) {\n console.error(\"Error: --name is required\")\n process.exit(1)\n }\n\n const body: Record<string, unknown> = { name }\n if (options.description) body.description = options.description\n if (options.intent) body.intent = options.intent\n if (options.style) body.style = options.style\n\n const track = await client.post<{ id: string; name: string; intent: string }>(\n `/api/dashboard/hackathons/${hackathonId}/prize-tracks`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(track))\n return\n }\n\n console.log(formatSuccess(`Created track \"${track.name}\" (${track.id})`))\n}\n"],"mappings":";;;AAYA,SAAS,aAAa,MAAoC;CACxD,MAAM,UAA8B,EAAE;AACtC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,SAAS,KAAK,EAAE;AACxB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,gBACpB,QACA,aACA,MACe;CACf,MAAM,UAAU,aAAa,KAAK;CAElC,IAAI,OAAO,QAAQ;AAEnB,KAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO;EACjC,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAe,WAAW,MAAe,IAAI,KAAA,IAAY;GAAa,CAAC;AAC9G,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,SAAO;;AAGT,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,4BAA4B;AAC1C,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAgC,EAAE,MAAM;AAC9C,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AACpD,KAAI,QAAQ,OAAQ,MAAK,SAAS,QAAQ;AAC1C,KAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;CAExC,MAAM,QAAQ,MAAM,OAAO,KACzB,6BAA6B,YAAY,gBACzC,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,MAAM,CAAC;AAC9B;;AAGF,SAAQ,IAAI,cAAc,kBAAkB,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { a as formatWarning, n as formatJson, r as formatSuccess } from "../cli.mjs";
2
+ import * as p from "@clack/prompts";
3
+ //#region src/commands/webhooks/create.ts
4
+ function normalizeUrl(input) {
5
+ const trimmed = input.trim();
6
+ if (!trimmed) return trimmed;
7
+ if (/^https?:\/\//i.test(trimmed)) return trimmed;
8
+ return `https://${trimmed}`;
9
+ }
10
+ function parseWebhookCreateOptions(args) {
11
+ const options = {};
12
+ for (let i = 0; i < args.length; i++) switch (args[i]) {
13
+ case "--url":
14
+ options.url = args[++i];
15
+ break;
16
+ case "--events":
17
+ options.events = args[++i]?.split(",").map((s) => s.trim());
18
+ break;
19
+ case "--json":
20
+ options.json = true;
21
+ break;
22
+ }
23
+ return options;
24
+ }
25
+ async function runWebhooksCreate(client, args) {
26
+ const options = parseWebhookCreateOptions(args);
27
+ let url = options.url;
28
+ let events = options.events;
29
+ if (!url && process.stdout.isTTY) {
30
+ const result = await p.text({
31
+ message: "Webhook URL:",
32
+ validate: (v) => v ? void 0 : "Required"
33
+ });
34
+ if (p.isCancel(result)) return;
35
+ url = result;
36
+ }
37
+ if (!url) {
38
+ console.error("Error: --url is required");
39
+ process.exit(1);
40
+ }
41
+ if (!events?.length && process.stdout.isTTY) {
42
+ const result = await p.text({ message: "Events (comma-separated):" });
43
+ if (p.isCancel(result)) return;
44
+ events = result.split(",").map((s) => s.trim());
45
+ }
46
+ const webhook = await client.post("/api/v1/webhooks", {
47
+ url: normalizeUrl(url),
48
+ events
49
+ });
50
+ if (options.json) {
51
+ console.log(formatJson(webhook));
52
+ return;
53
+ }
54
+ console.log(formatSuccess(`Created webhook ${webhook.id}`));
55
+ if (webhook.signingSecret) {
56
+ console.log(formatWarning("Save this signing secret — it won't be shown again:"));
57
+ console.log(webhook.signingSecret);
58
+ }
59
+ }
60
+ //#endregion
61
+ export { runWebhooksCreate };
62
+
63
+ //# sourceMappingURL=create7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create7.mjs","names":[],"sources":["../../src/commands/webhooks/create.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess, formatWarning } from \"../../output.js\"\nimport type { Webhook } from \"../../types.js\"\n\ninterface WebhookCreateOptions {\n url?: string\n events?: string[]\n json?: boolean\n}\n\nfunction normalizeUrl(input: string): string {\n const trimmed = input.trim()\n if (!trimmed) return trimmed\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed\n return `https://${trimmed}`\n}\n\nexport function parseWebhookCreateOptions(args: string[]): WebhookCreateOptions {\n const options: WebhookCreateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--url\":\n options.url = args[++i]\n break\n case \"--events\":\n options.events = args[++i]?.split(\",\").map((s) => s.trim())\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runWebhooksCreate(\n client: OatmealClient,\n args: string[]\n): Promise<void> {\n const options = parseWebhookCreateOptions(args)\n\n let url = options.url\n let events = options.events\n\n if (!url && process.stdout.isTTY) {\n const result = await p.text({ message: \"Webhook URL:\", validate: (v: string) => (v ? undefined : \"Required\") })\n if (p.isCancel(result)) return\n url = result\n }\n\n if (!url) {\n console.error(\"Error: --url is required\")\n process.exit(1)\n }\n\n if (!events?.length && process.stdout.isTTY) {\n const result = await p.text({ message: \"Events (comma-separated):\" })\n if (p.isCancel(result)) return\n events = result.split(\",\").map((s: string) => s.trim())\n }\n\n const webhook = await client.post<Webhook>(\"/api/v1/webhooks\", {\n url: normalizeUrl(url),\n events,\n })\n\n if (options.json) {\n console.log(formatJson(webhook))\n return\n }\n\n console.log(formatSuccess(`Created webhook ${webhook.id}`))\n if (webhook.signingSecret) {\n console.log(formatWarning(\"Save this signing secret — it won't be shown again:\"))\n console.log(webhook.signingSecret)\n }\n}\n"],"mappings":";;;AAWA,SAAS,aAAa,OAAuB;CAC3C,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI,gBAAgB,KAAK,QAAQ,CAAE,QAAO;AAC1C,QAAO,WAAW;;AAGpB,SAAgB,0BAA0B,MAAsC;CAC9E,MAAM,UAAgC,EAAE;AACxC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,MAAM,KAAK,EAAE;AACrB;EACF,KAAK;AACH,WAAQ,SAAS,KAAK,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;AAC3D;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,kBACpB,QACA,MACe;CACf,MAAM,UAAU,0BAA0B,KAAK;CAE/C,IAAI,MAAM,QAAQ;CAClB,IAAI,SAAS,QAAQ;AAErB,KAAI,CAAC,OAAO,QAAQ,OAAO,OAAO;EAChC,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAgB,WAAW,MAAe,IAAI,KAAA,IAAY;GAAa,CAAC;AAC/G,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,QAAM;;AAGR,KAAI,CAAC,KAAK;AACR,UAAQ,MAAM,2BAA2B;AACzC,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,UAAU,QAAQ,OAAO,OAAO;EAC3C,MAAM,SAAS,MAAM,EAAE,KAAK,EAAE,SAAS,6BAA6B,CAAC;AACrE,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,WAAS,OAAO,MAAM,IAAI,CAAC,KAAK,MAAc,EAAE,MAAM,CAAC;;CAGzD,MAAM,UAAU,MAAM,OAAO,KAAc,oBAAoB;EAC7D,KAAK,aAAa,IAAI;EACtB;EACD,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,QAAQ,CAAC;AAChC;;AAGF,SAAQ,IAAI,cAAc,mBAAmB,QAAQ,KAAK,CAAC;AAC3D,KAAI,QAAQ,eAAe;AACzB,UAAQ,IAAI,cAAc,sDAAsD,CAAC;AACjF,UAAQ,IAAI,QAAQ,cAAc"}
@@ -16,6 +16,9 @@ function parseCriteriaCreateOptions(args) {
16
16
  case "--weight":
17
17
  options.weight = parseFloat(args[++i]);
18
18
  break;
19
+ case "--category":
20
+ options.category = args[++i];
21
+ break;
19
22
  case "--json":
20
23
  options.json = true;
21
24
  break;
@@ -25,8 +28,6 @@ function parseCriteriaCreateOptions(args) {
25
28
  async function runCriteriaCreate(client, hackathonId, args) {
26
29
  const options = parseCriteriaCreateOptions(args);
27
30
  let name = options.name;
28
- let maxScore = options.maxScore;
29
- let weight = options.weight;
30
31
  if (!name && process.stdout.isTTY) {
31
32
  const result = await p.text({
32
33
  message: "Criteria name:",
@@ -39,31 +40,17 @@ async function runCriteriaCreate(client, hackathonId, args) {
39
40
  console.error("Error: --name is required");
40
41
  process.exit(1);
41
42
  }
42
- if (maxScore === void 0 && process.stdout.isTTY) {
43
- const result = await p.text({
44
- message: "Max score:",
45
- initialValue: "10"
46
- });
47
- if (p.isCancel(result)) return;
48
- maxScore = parseInt(result, 10);
49
- }
50
- if (maxScore !== void 0 && (isNaN(maxScore) || maxScore <= 0)) {
51
- console.error("Error: --max-score must be a positive integer");
43
+ const category = options.category ?? "core";
44
+ if (category !== "core" && category !== "bonus") {
45
+ console.error("Error: --category must be 'core' or 'bonus'");
52
46
  process.exit(1);
53
47
  }
54
- if (weight === void 0 && process.stdout.isTTY) {
55
- const result = await p.text({
56
- message: "Weight:",
57
- initialValue: "1"
58
- });
59
- if (p.isCancel(result)) return;
60
- weight = parseFloat(result);
61
- }
62
48
  const criteria = await client.post(`/api/dashboard/hackathons/${hackathonId}/judging/criteria`, {
63
49
  name,
64
50
  description: options.description,
65
- maxScore: maxScore ?? 10,
66
- weight: weight ?? 1
51
+ category,
52
+ ...options.maxScore !== void 0 && { maxScore: options.maxScore },
53
+ ...options.weight !== void 0 && { weight: options.weight }
67
54
  });
68
55
  if (options.json) {
69
56
  console.log(formatJson(criteria));
@@ -1 +1 @@
1
- {"version":3,"file":"criteria-create.mjs","names":[],"sources":["../../src/commands/judging/criteria-create.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { JudgingCriteria } from \"../../types.js\"\n\ninterface CriteriaCreateOptions {\n name?: string\n description?: string\n maxScore?: number\n weight?: number\n json?: boolean\n}\n\nexport function parseCriteriaCreateOptions(args: string[]): CriteriaCreateOptions {\n const options: CriteriaCreateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--max-score\":\n options.maxScore = parseInt(args[++i], 10)\n break\n case \"--weight\":\n options.weight = parseFloat(args[++i])\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runCriteriaCreate(\n client: OatmealClient,\n hackathonId: string,\n args: string[]\n): Promise<void> {\n const options = parseCriteriaCreateOptions(args)\n\n let name = options.name\n let maxScore = options.maxScore\n let weight = options.weight\n\n if (!name && process.stdout.isTTY) {\n const result = await p.text({ message: \"Criteria name:\", validate: (v: string) => (v ? undefined : \"Required\") })\n if (p.isCancel(result)) return\n name = result\n }\n\n if (!name) {\n console.error(\"Error: --name is required\")\n process.exit(1)\n }\n\n if (maxScore === undefined && process.stdout.isTTY) {\n const result = await p.text({ message: \"Max score:\", initialValue: \"10\" })\n if (p.isCancel(result)) return\n maxScore = parseInt(result, 10)\n }\n\n if (maxScore !== undefined && (isNaN(maxScore) || maxScore <= 0)) {\n console.error(\"Error: --max-score must be a positive integer\")\n process.exit(1)\n }\n\n if (weight === undefined && process.stdout.isTTY) {\n const result = await p.text({ message: \"Weight:\", initialValue: \"1\" })\n if (p.isCancel(result)) return\n weight = parseFloat(result)\n }\n\n const criteria = await client.post<JudgingCriteria>(\n `/api/dashboard/hackathons/${hackathonId}/judging/criteria`,\n {\n name,\n description: options.description,\n maxScore: maxScore ?? 10,\n weight: weight ?? 1,\n }\n )\n\n if (options.json) {\n console.log(formatJson(criteria))\n return\n }\n\n console.log(formatSuccess(`Created criteria \"${criteria.name}\" (${criteria.id})`))\n}\n"],"mappings":";;;AAaA,SAAgB,2BAA2B,MAAuC;CAChF,MAAM,UAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,WAAW,SAAS,KAAK,EAAE,IAAI,GAAG;AAC1C;EACF,KAAK;AACH,WAAQ,SAAS,WAAW,KAAK,EAAE,GAAG;AACtC;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,kBACpB,QACA,aACA,MACe;CACf,MAAM,UAAU,2BAA2B,KAAK;CAEhD,IAAI,OAAO,QAAQ;CACnB,IAAI,WAAW,QAAQ;CACvB,IAAI,SAAS,QAAQ;AAErB,KAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO;EACjC,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAkB,WAAW,MAAe,IAAI,KAAA,IAAY;GAAa,CAAC;AACjH,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,SAAO;;AAGT,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,4BAA4B;AAC1C,UAAQ,KAAK,EAAE;;AAGjB,KAAI,aAAa,KAAA,KAAa,QAAQ,OAAO,OAAO;EAClD,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAc,cAAc;GAAM,CAAC;AAC1E,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,aAAW,SAAS,QAAQ,GAAG;;AAGjC,KAAI,aAAa,KAAA,MAAc,MAAM,SAAS,IAAI,YAAY,IAAI;AAChE,UAAQ,MAAM,gDAAgD;AAC9D,UAAQ,KAAK,EAAE;;AAGjB,KAAI,WAAW,KAAA,KAAa,QAAQ,OAAO,OAAO;EAChD,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAW,cAAc;GAAK,CAAC;AACtE,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,WAAS,WAAW,OAAO;;CAG7B,MAAM,WAAW,MAAM,OAAO,KAC5B,6BAA6B,YAAY,oBACzC;EACE;EACA,aAAa,QAAQ;EACrB,UAAU,YAAY;EACtB,QAAQ,UAAU;EACnB,CACF;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,KAAK,SAAS,GAAG,GAAG,CAAC"}
1
+ {"version":3,"file":"criteria-create.mjs","names":[],"sources":["../../src/commands/judging/criteria-create.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { JudgingCriteria } from \"../../types.js\"\n\ninterface CriteriaCreateOptions {\n name?: string\n description?: string\n maxScore?: number\n weight?: number\n category?: \"core\" | \"bonus\"\n json?: boolean\n}\n\nexport function parseCriteriaCreateOptions(args: string[]): CriteriaCreateOptions {\n const options: CriteriaCreateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--max-score\":\n options.maxScore = parseInt(args[++i], 10)\n break\n case \"--weight\":\n options.weight = parseFloat(args[++i])\n break\n case \"--category\":\n options.category = args[++i] as \"core\" | \"bonus\"\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runCriteriaCreate(\n client: OatmealClient,\n hackathonId: string,\n args: string[]\n): Promise<void> {\n const options = parseCriteriaCreateOptions(args)\n\n let name = options.name\n\n if (!name && process.stdout.isTTY) {\n const result = await p.text({ message: \"Criteria name:\", validate: (v: string) => (v ? undefined : \"Required\") })\n if (p.isCancel(result)) return\n name = result\n }\n\n if (!name) {\n console.error(\"Error: --name is required\")\n process.exit(1)\n }\n\n const category = options.category ?? \"core\"\n\n if (category !== \"core\" && category !== \"bonus\") {\n console.error(\"Error: --category must be 'core' or 'bonus'\")\n process.exit(1)\n }\n\n const criteria = await client.post<JudgingCriteria>(\n `/api/dashboard/hackathons/${hackathonId}/judging/criteria`,\n {\n name,\n description: options.description,\n category,\n ...(options.maxScore !== undefined && { maxScore: options.maxScore }),\n ...(options.weight !== undefined && { weight: options.weight }),\n }\n )\n\n if (options.json) {\n console.log(formatJson(criteria))\n return\n }\n\n console.log(formatSuccess(`Created criteria \"${criteria.name}\" (${criteria.id})`))\n}\n"],"mappings":";;;AAcA,SAAgB,2BAA2B,MAAuC;CAChF,MAAM,UAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,WAAW,SAAS,KAAK,EAAE,IAAI,GAAG;AAC1C;EACF,KAAK;AACH,WAAQ,SAAS,WAAW,KAAK,EAAE,GAAG;AACtC;EACF,KAAK;AACH,WAAQ,WAAW,KAAK,EAAE;AAC1B;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,kBACpB,QACA,aACA,MACe;CACf,MAAM,UAAU,2BAA2B,KAAK;CAEhD,IAAI,OAAO,QAAQ;AAEnB,KAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO;EACjC,MAAM,SAAS,MAAM,EAAE,KAAK;GAAE,SAAS;GAAkB,WAAW,MAAe,IAAI,KAAA,IAAY;GAAa,CAAC;AACjH,MAAI,EAAE,SAAS,OAAO,CAAE;AACxB,SAAO;;AAGT,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,4BAA4B;AAC1C,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,QAAQ,YAAY;AAErC,KAAI,aAAa,UAAU,aAAa,SAAS;AAC/C,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,KAC5B,6BAA6B,YAAY,oBACzC;EACE;EACA,aAAa,QAAQ;EACrB;EACA,GAAI,QAAQ,aAAa,KAAA,KAAa,EAAE,UAAU,QAAQ,UAAU;EACpE,GAAI,QAAQ,WAAW,KAAA,KAAa,EAAE,QAAQ,QAAQ,QAAA;EACvD,CACF;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,KAAK,SAAS,GAAG,GAAG,CAAC"}
@@ -15,6 +15,10 @@ async function runCriteriaList(client, hackathonId, options) {
15
15
  key: "name",
16
16
  label: "Name"
17
17
  },
18
+ {
19
+ key: "category",
20
+ label: "Category"
21
+ },
18
22
  {
19
23
  key: "maxScore",
20
24
  label: "Max Score"
@@ -1 +1 @@
1
- {"version":3,"file":"criteria-list.mjs","names":[],"sources":["../../src/commands/judging/criteria-list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { JudgingCriteria } from \"../../types.js\"\n\nexport async function runCriteriaList(\n client: OatmealClient,\n hackathonId: string,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ criteria: JudgingCriteria[] }>(\n `/api/dashboard/hackathons/${hackathonId}/judging/criteria`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.criteria?.length) {\n console.log(\"No judging criteria found.\")\n return\n }\n\n console.log(\n formatTable(data.criteria, [\n { key: \"name\", label: \"Name\" },\n { key: \"maxScore\", label: \"Max Score\" },\n { key: \"weight\", label: \"Weight\" },\n { key: \"description\", label: \"Description\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,gBACpB,QACA,aACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IACxB,6BAA6B,YAAY,mBAC1C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,UAAQ,IAAI,6BAA6B;AACzC;;AAGF,SAAQ,IACN,YAAY,KAAK,UAAU;EACzB;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAY,OAAO;GAAa;EACvC;GAAE,KAAK;GAAU,OAAO;GAAU;EAClC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
1
+ {"version":3,"file":"criteria-list.mjs","names":[],"sources":["../../src/commands/judging/criteria-list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { JudgingCriteria } from \"../../types.js\"\n\nexport async function runCriteriaList(\n client: OatmealClient,\n hackathonId: string,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ criteria: JudgingCriteria[] }>(\n `/api/dashboard/hackathons/${hackathonId}/judging/criteria`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.criteria?.length) {\n console.log(\"No judging criteria found.\")\n return\n }\n\n console.log(\n formatTable(data.criteria, [\n { key: \"name\", label: \"Name\" },\n { key: \"category\", label: \"Category\" },\n { key: \"maxScore\", label: \"Max Score\" },\n { key: \"weight\", label: \"Weight\" },\n { key: \"description\", label: \"Description\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,gBACpB,QACA,aACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IACxB,6BAA6B,YAAY,mBAC1C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,UAAQ,IAAI,6BAA6B;AACzC;;AAGF,SAAQ,IACN,YAAY,KAAK,UAAU;EACzB;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAY,OAAO;GAAY;EACtC;GAAE,KAAK;GAAY,OAAO;GAAa;EACvC;GAAE,KAAK;GAAU,OAAO;GAAU;EAClC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
@@ -1,4 +1,4 @@
1
- import { n as formatJson, r as formatSuccess } from "../cli.mjs";
1
+ import { a as formatWarning, n as formatJson, r as formatSuccess } from "../cli.mjs";
2
2
  //#region src/commands/judging/criteria-update.ts
3
3
  function parseCriteriaUpdateOptions(args) {
4
4
  const options = {};
@@ -15,6 +15,9 @@ function parseCriteriaUpdateOptions(args) {
15
15
  case "--weight":
16
16
  options.weight = parseFloat(args[++i]);
17
17
  break;
18
+ case "--category":
19
+ options.category = args[++i];
20
+ break;
18
21
  case "--json":
19
22
  options.json = true;
20
23
  break;
@@ -23,15 +26,20 @@ function parseCriteriaUpdateOptions(args) {
23
26
  }
24
27
  async function runCriteriaUpdate(client, hackathonId, criteriaId, args) {
25
28
  if (!criteriaId) {
26
- console.error("Usage: hackathon judging criteria update <hackathon-id> <criteria-id> [--name ...] [--max-score ...]");
29
+ console.error("Usage: hackathon judging criteria update <hackathon-id> <criteria-id> [--name ...] [--category ...]");
27
30
  process.exit(1);
28
31
  }
29
32
  const options = parseCriteriaUpdateOptions(args);
33
+ if (options.maxScore !== void 0) console.warn(formatWarning("--max-score is deprecated and has no effect in rubric mode"));
34
+ if (options.weight !== void 0) console.warn(formatWarning("--weight is deprecated and has no effect in rubric mode"));
35
+ if (options.category !== void 0 && options.category !== "core" && options.category !== "bonus") {
36
+ console.error("Error: --category must be 'core' or 'bonus'");
37
+ process.exit(1);
38
+ }
30
39
  const body = {};
31
40
  if (options.name) body.name = options.name;
32
- if (options.description) body.description = options.description;
33
- if (options.maxScore !== void 0) body.maxScore = options.maxScore;
34
- if (options.weight !== void 0) body.weight = options.weight;
41
+ if (options.description !== void 0) body.description = options.description;
42
+ if (options.category !== void 0) body.category = options.category;
35
43
  if (Object.keys(body).length === 0) {
36
44
  console.error("Error: provide at least one field to update");
37
45
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"criteria-update.mjs","names":[],"sources":["../../src/commands/judging/criteria-update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { JudgingCriteria } from \"../../types.js\"\n\ninterface CriteriaUpdateOptions {\n name?: string\n description?: string\n maxScore?: number\n weight?: number\n json?: boolean\n}\n\nexport function parseCriteriaUpdateOptions(args: string[]): CriteriaUpdateOptions {\n const options: CriteriaUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--max-score\":\n options.maxScore = parseInt(args[++i], 10)\n break\n case \"--weight\":\n options.weight = parseFloat(args[++i])\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runCriteriaUpdate(\n client: OatmealClient,\n hackathonId: string,\n criteriaId: string,\n args: string[]\n): Promise<void> {\n if (!criteriaId) {\n console.error(\"Usage: hackathon judging criteria update <hackathon-id> <criteria-id> [--name ...] [--max-score ...]\")\n process.exit(1)\n }\n\n const options = parseCriteriaUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.description) body.description = options.description\n if (options.maxScore !== undefined) body.maxScore = options.maxScore\n if (options.weight !== undefined) body.weight = options.weight\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update\")\n process.exit(1)\n }\n\n const criteria = await client.patch<JudgingCriteria>(\n `/api/dashboard/hackathons/${hackathonId}/judging/criteria/${criteriaId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(criteria))\n return\n }\n\n console.log(formatSuccess(`Updated criteria \"${criteria.name}\"`))\n}\n"],"mappings":";;AAYA,SAAgB,2BAA2B,MAAuC;CAChF,MAAM,UAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,WAAW,SAAS,KAAK,EAAE,IAAI,GAAG;AAC1C;EACF,KAAK;AACH,WAAQ,SAAS,WAAW,KAAK,EAAE,GAAG;AACtC;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,kBACpB,QACA,aACA,YACA,MACe;AACf,KAAI,CAAC,YAAY;AACf,UAAQ,MAAM,uGAAuG;AACrH,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,2BAA2B,KAAK;CAChD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AACpD,KAAI,QAAQ,aAAa,KAAA,EAAW,MAAK,WAAW,QAAQ;AAC5D,KAAI,QAAQ,WAAW,KAAA,EAAW,MAAK,SAAS,QAAQ;AAExD,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,MAC5B,6BAA6B,YAAY,oBAAoB,cAC7D,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,GAAG,CAAC"}
1
+ {"version":3,"file":"criteria-update.mjs","names":[],"sources":["../../src/commands/judging/criteria-update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess, formatWarning } from \"../../output.js\"\nimport type { JudgingCriteria } from \"../../types.js\"\n\ninterface CriteriaUpdateOptions {\n name?: string\n description?: string\n maxScore?: number\n weight?: number\n category?: \"core\" | \"bonus\"\n json?: boolean\n}\n\nexport function parseCriteriaUpdateOptions(args: string[]): CriteriaUpdateOptions {\n const options: CriteriaUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--max-score\":\n options.maxScore = parseInt(args[++i], 10)\n break\n case \"--weight\":\n options.weight = parseFloat(args[++i])\n break\n case \"--category\":\n options.category = args[++i] as \"core\" | \"bonus\"\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runCriteriaUpdate(\n client: OatmealClient,\n hackathonId: string,\n criteriaId: string,\n args: string[]\n): Promise<void> {\n if (!criteriaId) {\n console.error(\"Usage: hackathon judging criteria update <hackathon-id> <criteria-id> [--name ...] [--category ...]\")\n process.exit(1)\n }\n\n const options = parseCriteriaUpdateOptions(args)\n\n if (options.maxScore !== undefined) {\n console.warn(formatWarning(\"--max-score is deprecated and has no effect in rubric mode\"))\n }\n\n if (options.weight !== undefined) {\n console.warn(formatWarning(\"--weight is deprecated and has no effect in rubric mode\"))\n }\n\n if (options.category !== undefined && options.category !== \"core\" && options.category !== \"bonus\") {\n console.error(\"Error: --category must be 'core' or 'bonus'\")\n process.exit(1)\n }\n\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.description !== undefined) body.description = options.description\n if (options.category !== undefined) body.category = options.category\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update\")\n process.exit(1)\n }\n\n const criteria = await client.patch<JudgingCriteria>(\n `/api/dashboard/hackathons/${hackathonId}/judging/criteria/${criteriaId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(criteria))\n return\n }\n\n console.log(formatSuccess(`Updated criteria \"${criteria.name}\"`))\n}\n"],"mappings":";;AAaA,SAAgB,2BAA2B,MAAuC;CAChF,MAAM,UAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,WAAW,SAAS,KAAK,EAAE,IAAI,GAAG;AAC1C;EACF,KAAK;AACH,WAAQ,SAAS,WAAW,KAAK,EAAE,GAAG;AACtC;EACF,KAAK;AACH,WAAQ,WAAW,KAAK,EAAE;AAC1B;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,kBACpB,QACA,aACA,YACA,MACe;AACf,KAAI,CAAC,YAAY;AACf,UAAQ,MAAM,sGAAsG;AACpH,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,2BAA2B,KAAK;AAEhD,KAAI,QAAQ,aAAa,KAAA,EACvB,SAAQ,KAAK,cAAc,6DAA6D,CAAC;AAG3F,KAAI,QAAQ,WAAW,KAAA,EACrB,SAAQ,KAAK,cAAc,0DAA0D,CAAC;AAGxF,KAAI,QAAQ,aAAa,KAAA,KAAa,QAAQ,aAAa,UAAU,QAAQ,aAAa,SAAS;AACjG,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,gBAAgB,KAAA,EAAW,MAAK,cAAc,QAAQ;AAClE,KAAI,QAAQ,aAAa,KAAA,EAAW,MAAK,WAAW,QAAQ;AAE5D,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,MAC5B,6BAA6B,YAAY,oBAAoB,cAC7D,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,GAAG,CAAC"}