@agi-ventures-canada/hackathon-cli 0.1.0 → 0.1.2

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 (77) hide show
  1. package/dist/_chunks/assign.mjs +1 -1
  2. package/dist/_chunks/assign.mjs.map +1 -1
  3. package/dist/_chunks/assignments-delete.mjs +1 -1
  4. package/dist/_chunks/assignments-delete.mjs.map +1 -1
  5. package/dist/_chunks/calculate.mjs +1 -1
  6. package/dist/_chunks/calculate.mjs.map +1 -1
  7. package/dist/_chunks/cancel.mjs +1 -1
  8. package/dist/_chunks/cancel.mjs.map +1 -1
  9. package/dist/_chunks/config.mjs +5 -5
  10. package/dist/_chunks/config.mjs.map +1 -1
  11. package/dist/_chunks/constants.mjs +2 -2
  12. package/dist/_chunks/constants.mjs.map +1 -1
  13. package/dist/_chunks/create.mjs.map +1 -1
  14. package/dist/_chunks/create3.mjs.map +1 -1
  15. package/dist/_chunks/create4.mjs.map +1 -1
  16. package/dist/_chunks/create5.mjs.map +1 -1
  17. package/dist/_chunks/create6.mjs.map +1 -1
  18. package/dist/_chunks/criteria-create.mjs.map +1 -1
  19. package/dist/_chunks/criteria-delete.mjs +1 -1
  20. package/dist/_chunks/criteria-delete.mjs.map +1 -1
  21. package/dist/_chunks/criteria-update.mjs +1 -1
  22. package/dist/_chunks/criteria-update.mjs.map +1 -1
  23. package/dist/_chunks/delete.mjs +1 -1
  24. package/dist/_chunks/delete.mjs.map +1 -1
  25. package/dist/_chunks/delete2.mjs +1 -1
  26. package/dist/_chunks/delete2.mjs.map +1 -1
  27. package/dist/_chunks/delete3.mjs +1 -1
  28. package/dist/_chunks/delete3.mjs.map +1 -1
  29. package/dist/_chunks/delete4.mjs +1 -1
  30. package/dist/_chunks/delete4.mjs.map +1 -1
  31. package/dist/_chunks/delete5.mjs +1 -1
  32. package/dist/_chunks/delete5.mjs.map +1 -1
  33. package/dist/_chunks/get.mjs +1 -1
  34. package/dist/_chunks/get.mjs.map +1 -1
  35. package/dist/_chunks/get2.mjs +1 -1
  36. package/dist/_chunks/get2.mjs.map +1 -1
  37. package/dist/_chunks/get3.mjs +2 -2
  38. package/dist/_chunks/get3.mjs.map +1 -1
  39. package/dist/_chunks/get4.mjs +1 -1
  40. package/dist/_chunks/get4.mjs.map +1 -1
  41. package/dist/_chunks/invitations-cancel.mjs +1 -1
  42. package/dist/_chunks/invitations-cancel.mjs.map +1 -1
  43. package/dist/_chunks/judges-remove.mjs +1 -1
  44. package/dist/_chunks/judges-remove.mjs.map +1 -1
  45. package/dist/_chunks/login.mjs +4 -4
  46. package/dist/_chunks/login.mjs.map +1 -1
  47. package/dist/_chunks/org.mjs +1 -1
  48. package/dist/_chunks/org.mjs.map +1 -1
  49. package/dist/_chunks/publish.mjs +1 -1
  50. package/dist/_chunks/publish.mjs.map +1 -1
  51. package/dist/_chunks/resolve.mjs +1 -4
  52. package/dist/_chunks/resolve.mjs.map +1 -1
  53. package/dist/_chunks/result.mjs +1 -1
  54. package/dist/_chunks/result.mjs.map +1 -1
  55. package/dist/_chunks/results.mjs +1 -1
  56. package/dist/_chunks/results.mjs.map +1 -1
  57. package/dist/_chunks/submissions.mjs +1 -1
  58. package/dist/_chunks/submissions.mjs.map +1 -1
  59. package/dist/_chunks/unassign.mjs +1 -1
  60. package/dist/_chunks/unassign.mjs.map +1 -1
  61. package/dist/_chunks/unpublish.mjs +1 -1
  62. package/dist/_chunks/unpublish.mjs.map +1 -1
  63. package/dist/_chunks/update-check.mjs +70 -0
  64. package/dist/_chunks/update-check.mjs.map +1 -0
  65. package/dist/_chunks/update.mjs +3 -3
  66. package/dist/_chunks/update.mjs.map +1 -1
  67. package/dist/_chunks/update2.mjs +1 -1
  68. package/dist/_chunks/update2.mjs.map +1 -1
  69. package/dist/_chunks/update3.mjs +1 -1
  70. package/dist/_chunks/update3.mjs.map +1 -1
  71. package/dist/_chunks/update4.mjs +1 -1
  72. package/dist/_chunks/update4.mjs.map +1 -1
  73. package/dist/_chunks/update5.mjs +49 -0
  74. package/dist/_chunks/update5.mjs.map +1 -0
  75. package/dist/cli.mjs +32 -15
  76. package/dist/cli.mjs.map +1 -1
  77. package/package.json +3 -3
@@ -26,15 +26,15 @@ function parseLoginOptions(args) {
26
26
  }
27
27
  async function runLogin(args) {
28
28
  const options = parseLoginOptions(args);
29
- const baseUrl = options.baseUrl ?? "https://oatmeal.app";
30
- if (loadConfig() && !options.yes && !options.apiKey && !process.env.OATMEAL_API_KEY) {
29
+ const baseUrl = options.baseUrl ?? "https://getoatmeal.com";
30
+ if (loadConfig() && !options.yes && !options.apiKey && !process.env.HACKATHON_API_KEY) {
31
31
  const overwrite = await p.confirm({ message: "You are already logged in. Overwrite existing config?" });
32
32
  if (p.isCancel(overwrite) || !overwrite) {
33
33
  p.log.info("Login cancelled.");
34
34
  return;
35
35
  }
36
36
  }
37
- const key = options.apiKey ?? process.env.OATMEAL_API_KEY;
37
+ const key = options.apiKey ?? process.env.HACKATHON_API_KEY;
38
38
  if (key) {
39
39
  await validateAndSaveKey(key, baseUrl);
40
40
  return;
@@ -100,7 +100,7 @@ async function validateAndSaveKey(apiKey, baseUrl) {
100
100
  keyId: whoami.keyId,
101
101
  scopes: whoami.scopes
102
102
  });
103
- p.log.success(`Logged in! Key saved to ~/.oatmeal/config.json`);
103
+ p.log.success(`Logged in! Key saved to ~/.hackathon/config.json`);
104
104
  p.log.info(`Tenant: ${whoami.tenantId}`);
105
105
  p.log.info(`Scopes: ${whoami.scopes.join(", ")}`);
106
106
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"login.mjs","names":[],"sources":["../../src/commands/login.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { execSync } from \"node:child_process\"\nimport * as p from \"@clack/prompts\"\nimport { OatmealClient } from \"../client.js\"\nimport { loadConfig, saveConfig } from \"../config.js\"\nimport { AUTH_TIMEOUT_MS, DEFAULT_BASE_URL, POLL_INTERVAL_MS } from \"../constants.js\"\nimport type { CliConfig, WhoAmIResponse } from \"../types.js\"\n\ninterface LoginOptions {\n apiKey?: string\n noBrowser?: boolean\n baseUrl?: string\n yes?: boolean\n}\n\nexport function parseLoginOptions(args: string[]): LoginOptions {\n const options: LoginOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--api-key\":\n options.apiKey = args[++i]\n break\n case \"--no-browser\":\n options.noBrowser = true\n break\n case \"--base-url\":\n options.baseUrl = args[++i]\n break\n case \"--yes\":\n case \"-y\":\n options.yes = true\n break\n }\n }\n return options\n}\n\nexport async function runLogin(args: string[]): Promise<void> {\n const options = parseLoginOptions(args)\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL\n\n const existingConfig = loadConfig()\n if (existingConfig && !options.yes && !options.apiKey && !process.env.OATMEAL_API_KEY) {\n const overwrite = await p.confirm({\n message: \"You are already logged in. Overwrite existing config?\",\n })\n if (p.isCancel(overwrite) || !overwrite) {\n p.log.info(\"Login cancelled.\")\n return\n }\n }\n\n const key = options.apiKey ?? process.env.OATMEAL_API_KEY\n if (key) {\n await validateAndSaveKey(key, baseUrl)\n return\n }\n\n if (options.noBrowser || !process.stdout.isTTY) {\n const pastedKey = await p.password({ message: \"Paste your API key:\" })\n if (p.isCancel(pastedKey)) {\n p.log.info(\"Login cancelled.\")\n return\n }\n await validateAndSaveKey(pastedKey, baseUrl)\n return\n }\n\n const deviceToken = randomBytes(32).toString(\"hex\")\n const authUrl = `${baseUrl}/cli-auth?token=${deviceToken}`\n\n p.log.info(`Opening browser to sign in...`)\n p.log.info(authUrl)\n\n try {\n openBrowser(authUrl)\n } catch {\n p.log.warn(\"Could not open browser. Visit the URL above manually.\")\n }\n\n const spinner = p.spinner()\n spinner.start(\"Waiting for authentication...\")\n\n try {\n const apiKey = await pollForKey(baseUrl, deviceToken)\n spinner.stop(\"Authenticated!\")\n await validateAndSaveKey(apiKey, baseUrl)\n } catch (error) {\n spinner.stop(\"Authentication failed.\")\n throw error\n }\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform\n const cmd =\n platform === \"darwin\"\n ? \"open\"\n : platform === \"win32\"\n ? \"start\"\n : \"xdg-open\"\n execSync(`${cmd} \"${url}\"`, { stdio: \"ignore\" })\n}\n\nasync function pollForKey(baseUrl: string, deviceToken: string): Promise<string> {\n const client = new OatmealClient({ baseUrl })\n const start = Date.now()\n\n while (Date.now() - start < AUTH_TIMEOUT_MS) {\n const result = await client.get<{ status: string; apiKey?: string }>(\n \"/api/public/cli-auth/poll\",\n { params: { token: deviceToken } }\n )\n\n if (result.status === \"complete\" && result.apiKey) {\n return result.apiKey\n }\n\n if (result.status === \"expired\") {\n throw new Error(\"Authentication session expired. Please try again.\")\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n\n throw new Error(\"Authentication timed out after 5 minutes. Please try again.\")\n}\n\nasync function validateAndSaveKey(apiKey: string, baseUrl: string): Promise<void> {\n const client = new OatmealClient({ baseUrl, apiKey })\n\n const spinner = p.spinner()\n spinner.start(\"Validating API key...\")\n\n try {\n const whoami = await client.get<WhoAmIResponse>(\"/api/v1/whoami\")\n spinner.stop(\"Key validated!\")\n\n const config: CliConfig = {\n apiKey,\n baseUrl,\n tenantId: whoami.tenantId,\n keyId: whoami.keyId,\n scopes: whoami.scopes,\n }\n\n saveConfig(config)\n\n p.log.success(`Logged in! Key saved to ~/.oatmeal/config.json`)\n p.log.info(`Tenant: ${whoami.tenantId}`)\n p.log.info(`Scopes: ${whoami.scopes.join(\", \")}`)\n } catch (error) {\n spinner.stop(\"Validation failed.\")\n throw error\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"login.mjs","names":[],"sources":["../../src/commands/login.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { execSync } from \"node:child_process\"\nimport * as p from \"@clack/prompts\"\nimport { OatmealClient } from \"../client.js\"\nimport { loadConfig, saveConfig } from \"../config.js\"\nimport { AUTH_TIMEOUT_MS, DEFAULT_BASE_URL, POLL_INTERVAL_MS } from \"../constants.js\"\nimport type { CliConfig, WhoAmIResponse } from \"../types.js\"\n\ninterface LoginOptions {\n apiKey?: string\n noBrowser?: boolean\n baseUrl?: string\n yes?: boolean\n}\n\nexport function parseLoginOptions(args: string[]): LoginOptions {\n const options: LoginOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--api-key\":\n options.apiKey = args[++i]\n break\n case \"--no-browser\":\n options.noBrowser = true\n break\n case \"--base-url\":\n options.baseUrl = args[++i]\n break\n case \"--yes\":\n case \"-y\":\n options.yes = true\n break\n }\n }\n return options\n}\n\nexport async function runLogin(args: string[]): Promise<void> {\n const options = parseLoginOptions(args)\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL\n\n const existingConfig = loadConfig()\n if (existingConfig && !options.yes && !options.apiKey && !process.env.HACKATHON_API_KEY) {\n const overwrite = await p.confirm({\n message: \"You are already logged in. Overwrite existing config?\",\n })\n if (p.isCancel(overwrite) || !overwrite) {\n p.log.info(\"Login cancelled.\")\n return\n }\n }\n\n const key = options.apiKey ?? process.env.HACKATHON_API_KEY\n if (key) {\n await validateAndSaveKey(key, baseUrl)\n return\n }\n\n if (options.noBrowser || !process.stdout.isTTY) {\n const pastedKey = await p.password({ message: \"Paste your API key:\" })\n if (p.isCancel(pastedKey)) {\n p.log.info(\"Login cancelled.\")\n return\n }\n await validateAndSaveKey(pastedKey, baseUrl)\n return\n }\n\n const deviceToken = randomBytes(32).toString(\"hex\")\n const authUrl = `${baseUrl}/cli-auth?token=${deviceToken}`\n\n p.log.info(`Opening browser to sign in...`)\n p.log.info(authUrl)\n\n try {\n openBrowser(authUrl)\n } catch {\n p.log.warn(\"Could not open browser. Visit the URL above manually.\")\n }\n\n const spinner = p.spinner()\n spinner.start(\"Waiting for authentication...\")\n\n try {\n const apiKey = await pollForKey(baseUrl, deviceToken)\n spinner.stop(\"Authenticated!\")\n await validateAndSaveKey(apiKey, baseUrl)\n } catch (error) {\n spinner.stop(\"Authentication failed.\")\n throw error\n }\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform\n const cmd =\n platform === \"darwin\"\n ? \"open\"\n : platform === \"win32\"\n ? \"start\"\n : \"xdg-open\"\n execSync(`${cmd} \"${url}\"`, { stdio: \"ignore\" })\n}\n\nasync function pollForKey(baseUrl: string, deviceToken: string): Promise<string> {\n const client = new OatmealClient({ baseUrl })\n const start = Date.now()\n\n while (Date.now() - start < AUTH_TIMEOUT_MS) {\n const result = await client.get<{ status: string; apiKey?: string }>(\n \"/api/public/cli-auth/poll\",\n { params: { token: deviceToken } }\n )\n\n if (result.status === \"complete\" && result.apiKey) {\n return result.apiKey\n }\n\n if (result.status === \"expired\") {\n throw new Error(\"Authentication session expired. Please try again.\")\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n\n throw new Error(\"Authentication timed out after 5 minutes. Please try again.\")\n}\n\nasync function validateAndSaveKey(apiKey: string, baseUrl: string): Promise<void> {\n const client = new OatmealClient({ baseUrl, apiKey })\n\n const spinner = p.spinner()\n spinner.start(\"Validating API key...\")\n\n try {\n const whoami = await client.get<WhoAmIResponse>(\"/api/v1/whoami\")\n spinner.stop(\"Key validated!\")\n\n const config: CliConfig = {\n apiKey,\n baseUrl,\n tenantId: whoami.tenantId,\n keyId: whoami.keyId,\n scopes: whoami.scopes,\n }\n\n saveConfig(config)\n\n p.log.success(`Logged in! Key saved to ~/.hackathon/config.json`)\n p.log.info(`Tenant: ${whoami.tenantId}`)\n p.log.info(`Scopes: ${whoami.scopes.join(\", \")}`)\n } catch (error) {\n spinner.stop(\"Validation failed.\")\n throw error\n }\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { n as formatJson, t as formatDetail } from "../cli.mjs";
2
2
  //#region src/commands/browse/org.ts
3
3
  async function runBrowseOrg(client, slug, options) {
4
4
  if (!slug) {
5
- console.error("Usage: oatmeal browse org <slug>");
5
+ console.error("Usage: hackathon browse org <slug>");
6
6
  process.exit(1);
7
7
  }
8
8
  const data = await client.get(`/api/public/orgs/${encodeURIComponent(slug)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"org.mjs","names":[],"sources":["../../src/commands/browse/org.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatDetail, formatJson } from \"../../output.js\"\nimport type { OrgProfile } from \"../../types.js\"\n\nexport async function runBrowseOrg(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: oatmeal browse org <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<OrgProfile>(\n `/api/public/orgs/${encodeURIComponent(slug)}`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n console.log(\n formatDetail([\n { label: \"Name\", value: data.name },\n { label: \"Slug\", value: data.slug },\n { label: \"Description\", value: data.description },\n { label: \"Hackathons\", value: String(data.hackathon_count ?? 0) },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,aACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,mCAAmC;AACjD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,oBAAoB,mBAAmB,KAAK,GAC7C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,SAAQ,IACN,aAAa;EACX;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAe,OAAO,KAAK;GAAa;EACjD;GAAE,OAAO;GAAc,OAAO,OAAO,KAAK,mBAAmB,EAAA;;EAC9D,CAAC,CACH"}
1
+ {"version":3,"file":"org.mjs","names":[],"sources":["../../src/commands/browse/org.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatDetail, formatJson } from \"../../output.js\"\nimport type { OrgProfile } from \"../../types.js\"\n\nexport async function runBrowseOrg(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse org <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<OrgProfile>(\n `/api/public/orgs/${encodeURIComponent(slug)}`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n console.log(\n formatDetail([\n { label: \"Name\", value: data.name },\n { label: \"Slug\", value: data.slug },\n { label: \"Description\", value: data.description },\n { label: \"Hackathons\", value: String(data.hackathon_count ?? 0) },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,aACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,qCAAqC;AACnD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,oBAAoB,mBAAmB,KAAK,GAC7C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,SAAQ,IACN,aAAa;EACX;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAe,OAAO,KAAK;GAAa;EACjD;GAAE,OAAO;GAAc,OAAO,OAAO,KAAK,mBAAmB,EAAA;;EAC9D,CAAC,CACH"}
@@ -3,7 +3,7 @@ import * as p from "@clack/prompts";
3
3
  //#region src/commands/results/publish.ts
4
4
  async function runResultsPublish(client, hackathonId, options) {
5
5
  if (!hackathonId) {
6
- console.error("Usage: oatmeal results publish <hackathon-id>");
6
+ console.error("Usage: hackathon results publish <hackathon-id>");
7
7
  process.exit(1);
8
8
  }
9
9
  if (!options.yes) {
@@ -1 +1 @@
1
- {"version":3,"file":"publish.mjs","names":[],"sources":["../../src/commands/results/publish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsPublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage: oatmeal results publish <hackathon-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({\n message: \"Publish results? This will make them visible to participants.\",\n })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/results/publish`)\n console.log(formatSuccess(\"Results published\"))\n}\n"],"mappings":";;;AAIA,eAAsB,kBACpB,QACA,aACA,SACe;AACf,KAAI,CAAC,aAAa;AAChB,UAAQ,MAAM,gDAAgD;AAC9D,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAC9B,SAAS,iEACV,CAAC;AACF,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,KAAK,6BAA6B,YAAY,kBAAkB;AAC7E,SAAQ,IAAI,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"publish.mjs","names":[],"sources":["../../src/commands/results/publish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsPublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage: hackathon results publish <hackathon-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({\n message: \"Publish results? This will make them visible to participants.\",\n })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/results/publish`)\n console.log(formatSuccess(\"Results published\"))\n}\n"],"mappings":";;;AAIA,eAAsB,kBACpB,QACA,aACA,SACe;AACf,KAAI,CAAC,aAAa;AAChB,UAAQ,MAAM,kDAAkD;AAChE,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAC9B,SAAS,iEACV,CAAC;AACF,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,KAAK,6BAA6B,YAAY,kBAAkB;AAC7E,SAAQ,IAAI,cAAc,oBAAoB,CAAC"}
@@ -2,10 +2,7 @@
2
2
  const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3
3
  async function resolveHackathonId(client, idOrSlug) {
4
4
  if (UUID_REGEX.test(idOrSlug)) return idOrSlug;
5
- const match = (await client.get("/api/dashboard/hackathons", { params: {
6
- q: idOrSlug,
7
- limit: 1
8
- } })).hackathons?.find((h) => h.slug === idOrSlug);
5
+ const match = (await client.get("/api/dashboard/hackathons", { params: { q: idOrSlug } })).hackathons?.find((h) => h.slug === idOrSlug);
9
6
  if (!match) throw new Error(`Hackathon not found: "${idOrSlug}". Use a UUID or exact slug.`);
10
7
  return match.id;
11
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.mjs","names":[],"sources":["../../src/commands/hackathons/resolve.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function resolveHackathonId(\n client: OatmealClient,\n idOrSlug: string\n): Promise<string> {\n if (UUID_REGEX.test(idOrSlug)) {\n return idOrSlug\n }\n\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\", {\n params: { q: idOrSlug, limit: 1 },\n })\n\n const match = data.hackathons?.find((h) => h.slug === idOrSlug)\n if (!match) {\n throw new Error(`Hackathon not found: \"${idOrSlug}\". Use a UUID or exact slug.`)\n }\n\n return match.id\n}\n"],"mappings":";AAGA,MAAM,aAAa;AAEnB,eAAsB,mBACpB,QACA,UACiB;AACjB,KAAI,WAAW,KAAK,SAAS,CAC3B,QAAO;CAOT,MAAM,SAJO,MAAM,OAAO,IAAiC,6BAA6B,EACtF,QAAQ;EAAE,GAAG;EAAU,OAAO;EAAG,EAClC,CAAC,EAEiB,YAAY,MAAM,MAAM,EAAE,SAAS,SAAS;AAC/D,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yBAAyB,SAAS,8BAA8B;AAGlF,QAAO,MAAM"}
1
+ {"version":3,"file":"resolve.mjs","names":[],"sources":["../../src/commands/hackathons/resolve.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function resolveHackathonId(\n client: OatmealClient,\n idOrSlug: string\n): Promise<string> {\n if (UUID_REGEX.test(idOrSlug)) {\n return idOrSlug\n }\n\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\", {\n params: { q: idOrSlug },\n })\n\n const match = data.hackathons?.find((h) => h.slug === idOrSlug)\n if (!match) {\n throw new Error(`Hackathon not found: \"${idOrSlug}\". Use a UUID or exact slug.`)\n }\n\n return match.id\n}\n"],"mappings":";AAGA,MAAM,aAAa;AAEnB,eAAsB,mBACpB,QACA,UACiB;AACjB,KAAI,WAAW,KAAK,SAAS,CAC3B,QAAO;CAOT,MAAM,SAJO,MAAM,OAAO,IAAiC,6BAA6B,EACtF,QAAQ,EAAE,GAAG,UAAU,EACxB,CAAC,EAEiB,YAAY,MAAM,MAAM,EAAE,SAAS,SAAS;AAC/D,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yBAAyB,SAAS,8BAA8B;AAGlF,QAAO,MAAM"}
@@ -15,7 +15,7 @@ function parseJobResultOptions(args) {
15
15
  }
16
16
  async function runJobsResult(client, jobId, args) {
17
17
  if (!jobId) {
18
- console.error("Usage: oatmeal jobs result <job-id>");
18
+ console.error("Usage: hackathon jobs result <job-id>");
19
19
  process.exit(1);
20
20
  }
21
21
  if (parseJobResultOptions(args).poll) {
@@ -1 +1 @@
1
- {"version":3,"file":"result.mjs","names":[],"sources":["../../src/commands/jobs/result.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson } from \"../../output.js\"\nimport { POLL_INTERVAL_MS } from \"../../constants.js\"\n\ninterface JobResultOptions {\n poll?: boolean\n json?: boolean\n}\n\nexport function parseJobResultOptions(args: string[]): JobResultOptions {\n const options: JobResultOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--poll\":\n options.poll = true\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJobsResult(\n client: OatmealClient,\n jobId: string,\n args: string[]\n): Promise<void> {\n if (!jobId) {\n console.error(\"Usage: oatmeal jobs result <job-id>\")\n process.exit(1)\n }\n\n const options = parseJobResultOptions(args)\n\n if (options.poll) {\n let attempts = 0\n const maxAttempts = 60\n while (attempts < maxAttempts) {\n const result = await client.get<{ status: string; result?: unknown }>(\n `/api/v1/jobs/${jobId}/result`\n )\n if (result.status === \"completed\" || result.result) {\n console.log(formatJson(result))\n return\n }\n console.error(`Job still running (attempt ${++attempts}/${maxAttempts})...`)\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n console.error(\"Timed out waiting for job result.\")\n process.exit(1)\n }\n\n const result = await client.get<{ status: string; result?: unknown }>(\n `/api/v1/jobs/${jobId}/result`\n )\n\n if (result.status !== \"completed\" && !result.result) {\n console.log(`Job is still ${result.status}. Use --poll to wait for completion.`)\n return\n }\n\n console.log(formatJson(result))\n}\n"],"mappings":";;;AASA,SAAgB,sBAAsB,MAAkC;CACtE,MAAM,UAA4B,EAAE;AACpC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO;AACf;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,cACpB,QACA,OACA,MACe;AACf,KAAI,CAAC,OAAO;AACV,UAAQ,MAAM,sCAAsC;AACpD,UAAQ,KAAK,EAAE;;AAKjB,KAFgB,sBAAsB,KAAK,CAE/B,MAAM;EAChB,IAAI,WAAW;EACf,MAAM,cAAc;AACpB,SAAO,WAAW,aAAa;GAC7B,MAAM,SAAS,MAAM,OAAO,IAC1B,gBAAgB,MAAM,SACvB;AACD,OAAI,OAAO,WAAW,eAAe,OAAO,QAAQ;AAClD,YAAQ,IAAI,WAAW,OAAO,CAAC;AAC/B;;AAEF,WAAQ,MAAM,8BAA8B,EAAE,SAAS,GAAG,YAAY,MAAM;AAC5E,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,iBAAiB,CAAC;;AAEvE,UAAQ,MAAM,oCAAoC;AAClD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,MAAM,OAAO,IAC1B,gBAAgB,MAAM,SACvB;AAED,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ;AACnD,UAAQ,IAAI,gBAAgB,OAAO,OAAO,sCAAsC;AAChF;;AAGF,SAAQ,IAAI,WAAW,OAAO,CAAC"}
1
+ {"version":3,"file":"result.mjs","names":[],"sources":["../../src/commands/jobs/result.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson } from \"../../output.js\"\nimport { POLL_INTERVAL_MS } from \"../../constants.js\"\n\ninterface JobResultOptions {\n poll?: boolean\n json?: boolean\n}\n\nexport function parseJobResultOptions(args: string[]): JobResultOptions {\n const options: JobResultOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--poll\":\n options.poll = true\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJobsResult(\n client: OatmealClient,\n jobId: string,\n args: string[]\n): Promise<void> {\n if (!jobId) {\n console.error(\"Usage: hackathon jobs result <job-id>\")\n process.exit(1)\n }\n\n const options = parseJobResultOptions(args)\n\n if (options.poll) {\n let attempts = 0\n const maxAttempts = 60\n while (attempts < maxAttempts) {\n const result = await client.get<{ status: string; result?: unknown }>(\n `/api/v1/jobs/${jobId}/result`\n )\n if (result.status === \"completed\" || result.result) {\n console.log(formatJson(result))\n return\n }\n console.error(`Job still running (attempt ${++attempts}/${maxAttempts})...`)\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n console.error(\"Timed out waiting for job result.\")\n process.exit(1)\n }\n\n const result = await client.get<{ status: string; result?: unknown }>(\n `/api/v1/jobs/${jobId}/result`\n )\n\n if (result.status !== \"completed\" && !result.result) {\n console.log(`Job is still ${result.status}. Use --poll to wait for completion.`)\n return\n }\n\n console.log(formatJson(result))\n}\n"],"mappings":";;;AASA,SAAgB,sBAAsB,MAAkC;CACtE,MAAM,UAA4B,EAAE;AACpC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO;AACf;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,cACpB,QACA,OACA,MACe;AACf,KAAI,CAAC,OAAO;AACV,UAAQ,MAAM,wCAAwC;AACtD,UAAQ,KAAK,EAAE;;AAKjB,KAFgB,sBAAsB,KAAK,CAE/B,MAAM;EAChB,IAAI,WAAW;EACf,MAAM,cAAc;AACpB,SAAO,WAAW,aAAa;GAC7B,MAAM,SAAS,MAAM,OAAO,IAC1B,gBAAgB,MAAM,SACvB;AACD,OAAI,OAAO,WAAW,eAAe,OAAO,QAAQ;AAClD,YAAQ,IAAI,WAAW,OAAO,CAAC;AAC/B;;AAEF,WAAQ,MAAM,8BAA8B,EAAE,SAAS,GAAG,YAAY,MAAM;AAC5E,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,iBAAiB,CAAC;;AAEvE,UAAQ,MAAM,oCAAoC;AAClD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,MAAM,OAAO,IAC1B,gBAAgB,MAAM,SACvB;AAED,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ;AACnD,UAAQ,IAAI,gBAAgB,OAAO,OAAO,sCAAsC;AAChF;;AAGF,SAAQ,IAAI,WAAW,OAAO,CAAC"}
@@ -2,7 +2,7 @@ import { i as formatTable, n as formatJson } from "../cli.mjs";
2
2
  //#region src/commands/browse/results.ts
3
3
  async function runBrowseResults(client, slug, options) {
4
4
  if (!slug) {
5
- console.error("Usage: oatmeal browse results <slug>");
5
+ console.error("Usage: hackathon browse results <slug>");
6
6
  process.exit(1);
7
7
  }
8
8
  const data = await client.get(`/api/public/hackathons/${encodeURIComponent(slug)}/results`);
@@ -1 +1 @@
1
- {"version":3,"file":"results.mjs","names":[],"sources":["../../src/commands/browse/results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { ResultsData } from \"../../types.js\"\n\nexport async function runBrowseResults(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: oatmeal browse results <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<ResultsData>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/results`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.published) {\n console.log(\"Results have not been published yet.\")\n return\n }\n\n if (!data.rankings?.length) {\n console.log(\"No rankings available.\")\n return\n }\n\n console.log(\n formatTable(data.rankings, [\n { key: \"rank\", label: \"#\" },\n { key: \"submission_name\", label: \"Submission\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"total_score\", label: \"Score\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,iBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,uCAAuC;AACrD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,UACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,WAAW;AACnB,UAAQ,IAAI,uCAAuC;AACnD;;AAGF,KAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,UAAQ,IAAI,yBAAyB;AACrC;;AAGF,SAAQ,IACN,YAAY,KAAK,UAAU;EACzB;GAAE,KAAK;GAAQ,OAAO;GAAK;EAC3B;GAAE,KAAK;GAAmB,OAAO;GAAc;EAC/C;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
1
+ {"version":3,"file":"results.mjs","names":[],"sources":["../../src/commands/browse/results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { ResultsData } from \"../../types.js\"\n\nexport async function runBrowseResults(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse results <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<ResultsData>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/results`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.published) {\n console.log(\"Results have not been published yet.\")\n return\n }\n\n if (!data.rankings?.length) {\n console.log(\"No rankings available.\")\n return\n }\n\n console.log(\n formatTable(data.rankings, [\n { key: \"rank\", label: \"#\" },\n { key: \"submission_name\", label: \"Submission\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"total_score\", label: \"Score\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,iBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,yCAAyC;AACvD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,UACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,WAAW;AACnB,UAAQ,IAAI,uCAAuC;AACnD;;AAGF,KAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,UAAQ,IAAI,yBAAyB;AACrC;;AAGF,SAAQ,IACN,YAAY,KAAK,UAAU;EACzB;GAAE,KAAK;GAAQ,OAAO;GAAK;EAC3B;GAAE,KAAK;GAAmB,OAAO;GAAc;EAC/C;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
@@ -2,7 +2,7 @@ import { i as formatTable, n as formatJson } from "../cli.mjs";
2
2
  //#region src/commands/browse/submissions.ts
3
3
  async function runBrowseSubmissions(client, slug, options) {
4
4
  if (!slug) {
5
- console.error("Usage: oatmeal browse submissions <slug>");
5
+ console.error("Usage: hackathon browse submissions <slug>");
6
6
  process.exit(1);
7
7
  }
8
8
  const data = await client.get(`/api/public/hackathons/${encodeURIComponent(slug)}/submissions`);
@@ -1 +1 @@
1
- {"version":3,"file":"submissions.mjs","names":[],"sources":["../../src/commands/browse/submissions.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Submission } from \"../../types.js\"\n\nexport async function runBrowseSubmissions(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: oatmeal browse submissions <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<{ submissions: Submission[] }>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/submissions`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.submissions?.length) {\n console.log(\"No submissions found.\")\n return\n }\n\n console.log(\n formatTable(data.submissions, [\n { key: \"name\", label: \"Name\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"submitted_at\", label: \"Submitted\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,qBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,2CAA2C;AACzD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,cACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,aAAa,QAAQ;AAC7B,UAAQ,IAAI,wBAAwB;AACpC;;AAGF,SAAQ,IACN,YAAY,KAAK,aAAa;EAC5B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAgB,OAAO;;EAC/B,CAAC,CACH"}
1
+ {"version":3,"file":"submissions.mjs","names":[],"sources":["../../src/commands/browse/submissions.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Submission } from \"../../types.js\"\n\nexport async function runBrowseSubmissions(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse submissions <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<{ submissions: Submission[] }>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/submissions`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.submissions?.length) {\n console.log(\"No submissions found.\")\n return\n }\n\n console.log(\n formatTable(data.submissions, [\n { key: \"name\", label: \"Name\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"submitted_at\", label: \"Submitted\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,qBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,6CAA6C;AAC3D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,cACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,aAAa,QAAQ;AAC7B,UAAQ,IAAI,wBAAwB;AACpC;;AAGF,SAAQ,IACN,YAAY,KAAK,aAAa;EAC5B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAgB,OAAO;;EAC/B,CAAC,CACH"}
@@ -3,7 +3,7 @@ import * as p from "@clack/prompts";
3
3
  //#region src/commands/prizes/unassign.ts
4
4
  async function runPrizesUnassign(client, hackathonId, prizeId, submissionId, options) {
5
5
  if (!prizeId || !submissionId) {
6
- console.error("Usage: oatmeal prizes unassign <hackathon-id> <prize-id> <submission-id>");
6
+ console.error("Usage: hackathon prizes unassign <hackathon-id> <prize-id> <submission-id>");
7
7
  process.exit(1);
8
8
  }
9
9
  if (!options.yes) {
@@ -1 +1 @@
1
- {"version":3,"file":"unassign.mjs","names":[],"sources":["../../src/commands/prizes/unassign.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runPrizesUnassign(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n submissionId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!prizeId || !submissionId) {\n console.error(\"Usage: oatmeal prizes unassign <hackathon-id> <prize-id> <submission-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({ message: `Unassign prize ${prizeId} from submission ${submissionId}?` })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.delete(\n `/api/dashboard/hackathons/${hackathonId}/prizes/${prizeId}/assign/${submissionId}`\n )\n console.log(formatSuccess(`Unassigned prize ${prizeId}`))\n}\n"],"mappings":";;;AAIA,eAAsB,kBACpB,QACA,aACA,SACA,cACA,SACe;AACf,KAAI,CAAC,WAAW,CAAC,cAAc;AAC7B,UAAQ,MAAM,2EAA2E;AACzF,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,kBAAkB,QAAQ,mBAAmB,aAAa,IAAI,CAAC;AAC1G,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,OACX,6BAA6B,YAAY,UAAU,QAAQ,UAAU,eACtE;AACD,SAAQ,IAAI,cAAc,oBAAoB,UAAU,CAAC"}
1
+ {"version":3,"file":"unassign.mjs","names":[],"sources":["../../src/commands/prizes/unassign.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runPrizesUnassign(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n submissionId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!prizeId || !submissionId) {\n console.error(\"Usage: hackathon prizes unassign <hackathon-id> <prize-id> <submission-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({ message: `Unassign prize ${prizeId} from submission ${submissionId}?` })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.delete(\n `/api/dashboard/hackathons/${hackathonId}/prizes/${prizeId}/assign/${submissionId}`\n )\n console.log(formatSuccess(`Unassigned prize ${prizeId}`))\n}\n"],"mappings":";;;AAIA,eAAsB,kBACpB,QACA,aACA,SACA,cACA,SACe;AACf,KAAI,CAAC,WAAW,CAAC,cAAc;AAC7B,UAAQ,MAAM,6EAA6E;AAC3F,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,kBAAkB,QAAQ,mBAAmB,aAAa,IAAI,CAAC;AAC1G,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,OACX,6BAA6B,YAAY,UAAU,QAAQ,UAAU,eACtE;AACD,SAAQ,IAAI,cAAc,oBAAoB,UAAU,CAAC"}
@@ -3,7 +3,7 @@ import * as p from "@clack/prompts";
3
3
  //#region src/commands/results/unpublish.ts
4
4
  async function runResultsUnpublish(client, hackathonId, options) {
5
5
  if (!hackathonId) {
6
- console.error("Usage: oatmeal results unpublish <hackathon-id>");
6
+ console.error("Usage: hackathon results unpublish <hackathon-id>");
7
7
  process.exit(1);
8
8
  }
9
9
  if (!options.yes) {
@@ -1 +1 @@
1
- {"version":3,"file":"unpublish.mjs","names":[],"sources":["../../src/commands/results/unpublish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsUnpublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage: oatmeal results unpublish <hackathon-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({ message: \"Unpublish results?\" })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/results/unpublish`)\n console.log(formatSuccess(\"Results unpublished\"))\n}\n"],"mappings":";;;AAIA,eAAsB,oBACpB,QACA,aACA,SACe;AACf,KAAI,CAAC,aAAa;AAChB,UAAQ,MAAM,kDAAkD;AAChE,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,sBAAsB,CAAC;AAClE,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,KAAK,6BAA6B,YAAY,oBAAoB;AAC/E,SAAQ,IAAI,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"unpublish.mjs","names":[],"sources":["../../src/commands/results/unpublish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsUnpublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage: hackathon results unpublish <hackathon-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({ message: \"Unpublish results?\" })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/results/unpublish`)\n console.log(formatSuccess(\"Results unpublished\"))\n}\n"],"mappings":";;;AAIA,eAAsB,oBACpB,QACA,aACA,SACe;AACf,KAAI,CAAC,aAAa;AAChB,UAAQ,MAAM,oDAAoD;AAClE,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,sBAAsB,CAAC;AAClE,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,KAAK,6BAA6B,YAAY,oBAAoB;AAC/E,SAAQ,IAAI,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { n as CONFIG_DIR, s as VERSION } from "./constants.mjs";
2
+ import { join } from "node:path";
3
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
4
+ //#region src/update-check.ts
5
+ const PACKAGE_NAME = "@agi-ventures-canada/hackathon-cli";
6
+ const CHECK_FILE = join(CONFIG_DIR, "update-check.json");
7
+ const CHECK_INTERVAL_MS = 14400 * 1e3;
8
+ function readCache() {
9
+ if (!existsSync(CHECK_FILE)) return null;
10
+ try {
11
+ return JSON.parse(readFileSync(CHECK_FILE, "utf-8"));
12
+ } catch {
13
+ return null;
14
+ }
15
+ }
16
+ function writeCache(data) {
17
+ try {
18
+ writeFileSync(CHECK_FILE, JSON.stringify(data) + "\n", { mode: 384 });
19
+ } catch {}
20
+ }
21
+ async function fetchLatestVersion() {
22
+ try {
23
+ const controller = new AbortController();
24
+ const timeout = setTimeout(() => controller.abort(), 3e3);
25
+ const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, { signal: controller.signal });
26
+ clearTimeout(timeout);
27
+ if (!res.ok) return null;
28
+ return (await res.json()).version ?? null;
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+ function compareVersions(a, b) {
34
+ const pa = a.split(".").map(Number);
35
+ const pb = b.split(".").map(Number);
36
+ for (let i = 0; i < 3; i++) {
37
+ if ((pa[i] ?? 0) < (pb[i] ?? 0)) return -1;
38
+ if ((pa[i] ?? 0) > (pb[i] ?? 0)) return 1;
39
+ }
40
+ return 0;
41
+ }
42
+ async function checkForUpdate() {
43
+ const cache = readCache();
44
+ const now = Date.now();
45
+ if (cache && now - cache.lastChecked < CHECK_INTERVAL_MS) {
46
+ if (compareVersions("0.1.0", cache.latestVersion) < 0) return {
47
+ current: VERSION,
48
+ latest: cache.latestVersion
49
+ };
50
+ return null;
51
+ }
52
+ const latest = await fetchLatestVersion();
53
+ if (!latest) return null;
54
+ writeCache({
55
+ lastChecked: now,
56
+ latestVersion: latest
57
+ });
58
+ if (compareVersions("0.1.0", latest) < 0) return {
59
+ current: VERSION,
60
+ latest
61
+ };
62
+ return null;
63
+ }
64
+ function formatUpdateNotice(info) {
65
+ return `\nUpdate available: ${info.current} → ${info.latest}\nRun \`hackathon update\` to update`;
66
+ }
67
+ //#endregion
68
+ export { checkForUpdate, formatUpdateNotice };
69
+
70
+ //# sourceMappingURL=update-check.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.mjs","names":[],"sources":["../../src/update-check.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { CONFIG_DIR, VERSION } from \"./constants.js\"\n\nconst PACKAGE_NAME = \"@agi-ventures-canada/hackathon-cli\"\nconst CHECK_FILE = join(CONFIG_DIR, \"update-check.json\")\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000 // 4 hours\n\ninterface UpdateCheckCache {\n lastChecked: number\n latestVersion: string\n}\n\nfunction readCache(): UpdateCheckCache | null {\n if (!existsSync(CHECK_FILE)) return null\n try {\n return JSON.parse(readFileSync(CHECK_FILE, \"utf-8\")) as UpdateCheckCache\n } catch {\n return null\n }\n}\n\nfunction writeCache(data: UpdateCheckCache): void {\n try {\n writeFileSync(CHECK_FILE, JSON.stringify(data) + \"\\n\", { mode: 0o600 })\n } catch {\n // Silently ignore write failures\n }\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 3000)\n const res = await fetch(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n { signal: controller.signal }\n )\n clearTimeout(timeout)\n if (!res.ok) return null\n const data = (await res.json()) as { version?: string }\n return data.version ?? null\n } catch {\n return null\n }\n}\n\nfunction compareVersions(a: string, b: string): number {\n const pa = a.split(\".\").map(Number)\n const pb = b.split(\".\").map(Number)\n for (let i = 0; i < 3; i++) {\n if ((pa[i] ?? 0) < (pb[i] ?? 0)) return -1\n if ((pa[i] ?? 0) > (pb[i] ?? 0)) return 1\n }\n return 0\n}\n\nexport interface UpdateInfo {\n current: string\n latest: string\n}\n\nexport async function checkForUpdate(): Promise<UpdateInfo | null> {\n const cache = readCache()\n const now = Date.now()\n\n if (cache && now - cache.lastChecked < CHECK_INTERVAL_MS) {\n if (compareVersions(VERSION, cache.latestVersion) < 0) {\n return { current: VERSION, latest: cache.latestVersion }\n }\n return null\n }\n\n const latest = await fetchLatestVersion()\n if (!latest) return null\n\n writeCache({ lastChecked: now, latestVersion: latest })\n\n if (compareVersions(VERSION, latest) < 0) {\n return { current: VERSION, latest }\n }\n return null\n}\n\nexport function formatUpdateNotice(info: UpdateInfo): string {\n return `\\nUpdate available: ${info.current} → ${info.latest}\\nRun \\`hackathon update\\` to update`\n}\n"],"mappings":";;;;AAIA,MAAM,eAAe;AACrB,MAAM,aAAa,KAAK,YAAY,oBAAoB;AACxD,MAAM,oBAAoB,QAAc;AAOxC,SAAS,YAAqC;AAC5C,KAAI,CAAC,WAAW,WAAW,CAAE,QAAO;AACpC,KAAI;AACF,SAAO,KAAK,MAAM,aAAa,YAAY,QAAQ,CAAC;SAC9C;AACN,SAAO;;;AAIX,SAAS,WAAW,MAA8B;AAChD,KAAI;AACF,gBAAc,YAAY,KAAK,UAAU,KAAK,GAAG,MAAM,EAAE,MAAM,KAAO,CAAC;SACjE;;AAKV,eAAe,qBAA6C;AAC1D,KAAI;EACF,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;EAC1D,MAAM,MAAM,MAAM,MAChB,8BAA8B,aAAa,UAC3C,EAAE,QAAQ,WAAW,QAAQ,CAC9B;AACD,eAAa,QAAQ;AACrB,MAAI,CAAC,IAAI,GAAI,QAAO;AAEpB,UADc,MAAM,IAAI,MAAM,EAClB,WAAW;SACjB;AACN,SAAO;;;AAIX,SAAS,gBAAgB,GAAW,GAAmB;CACrD,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO;CACnC,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,OAAK,GAAG,MAAM,MAAM,GAAG,MAAM,GAAI,QAAO;AACxC,OAAK,GAAG,MAAM,MAAM,GAAG,MAAM,GAAI,QAAO;;AAE1C,QAAO;;AAQT,eAAsB,iBAA6C;CACjE,MAAM,QAAQ,WAAW;CACzB,MAAM,MAAM,KAAK,KAAK;AAEtB,KAAI,SAAS,MAAM,MAAM,cAAc,mBAAmB;AACxD,MAAI,gBAAA,SAAyB,MAAM,cAAc,GAAG,EAClD,QAAO;GAAE,SAAS;GAAS,QAAQ,MAAM;GAAe;AAE1D,SAAO;;CAGT,MAAM,SAAS,MAAM,oBAAoB;AACzC,KAAI,CAAC,OAAQ,QAAO;AAEpB,YAAW;EAAE,aAAa;EAAK,eAAe;EAAQ,CAAC;AAEvD,KAAI,gBAAA,SAAyB,OAAO,GAAG,EACrC,QAAO;EAAE,SAAS;EAAS;EAAQ;AAErC,QAAO;;AAGT,SAAgB,mBAAmB,MAA0B;AAC3D,QAAO,uBAAuB,KAAK,QAAQ,KAAK,KAAK,OAAO"}
@@ -21,7 +21,7 @@ function parseUpdateOptions(args) {
21
21
  }
22
22
  async function runHackathonsUpdate(client, idOrSlug, args) {
23
23
  if (!idOrSlug) {
24
- console.error("Usage: oatmeal hackathons update <id-or-slug> [--name ...] [--slug ...] [--description ...]");
24
+ console.error("Usage: hackathon events update <id-or-slug> [--name ...] [--slug ...] [--description ...]");
25
25
  process.exit(1);
26
26
  }
27
27
  const options = parseUpdateOptions(args);
@@ -34,12 +34,12 @@ async function runHackathonsUpdate(client, idOrSlug, args) {
34
34
  console.error("Error: provide at least one field to update (--name, --slug, --description)");
35
35
  process.exit(1);
36
36
  }
37
- const hackathon = await client.patch(`/api/dashboard/hackathons/${id}`, body);
37
+ const hackathon = await client.patch(`/api/dashboard/hackathons/${id}/settings`, body);
38
38
  if (options.json) {
39
39
  console.log(formatJson(hackathon));
40
40
  return;
41
41
  }
42
- console.log(formatSuccess(`Updated hackathon "${hackathon.name}"`));
42
+ console.log(formatSuccess(`Updated hackathon "${hackathon.name ?? id}"`));
43
43
  }
44
44
  //#endregion
45
45
  export { runHackathonsUpdate };
@@ -1 +1 @@
1
- {"version":3,"file":"update.mjs","names":[],"sources":["../../src/commands/hackathons/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\nimport { resolveHackathonId } from \"./resolve.js\"\n\ninterface UpdateOptions {\n name?: string\n slug?: string\n description?: string\n json?: boolean\n}\n\nexport function parseUpdateOptions(args: string[]): UpdateOptions {\n const options: UpdateOptions = {}\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 \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsUpdate(\n client: OatmealClient,\n idOrSlug: string,\n args: string[]\n): Promise<void> {\n if (!idOrSlug) {\n console.error(\"Usage: oatmeal hackathons update <id-or-slug> [--name ...] [--slug ...] [--description ...]\")\n process.exit(1)\n }\n\n const options = parseUpdateOptions(args)\n const id = await resolveHackathonId(client, idOrSlug)\n\n const body: Record<string, string> = {}\n if (options.name) body.name = options.name\n if (options.slug) body.slug = options.slug\n if (options.description) body.description = options.description\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update (--name, --slug, --description)\")\n process.exit(1)\n }\n\n const hackathon = await client.patch<Hackathon>(`/api/dashboard/hackathons/${id}`, body)\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Updated hackathon \"${hackathon.name}\"`))\n}\n"],"mappings":";;;AAYA,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,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,oBACpB,QACA,UACA,MACe;AACf,KAAI,CAAC,UAAU;AACb,UAAQ,MAAM,8FAA8F;AAC5G,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,mBAAmB,KAAK;CACxC,MAAM,KAAK,MAAM,mBAAmB,QAAQ,SAAS;CAErD,MAAM,OAA+B,EAAE;AACvC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AAEpD,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8EAA8E;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,YAAY,MAAM,OAAO,MAAiB,6BAA6B,MAAM,KAAK;AAExF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,SAAQ,IAAI,cAAc,sBAAsB,UAAU,KAAK,GAAG,CAAC"}
1
+ {"version":3,"file":"update.mjs","names":[],"sources":["../../src/commands/hackathons/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\nimport { resolveHackathonId } from \"./resolve.js\"\n\ninterface UpdateOptions {\n name?: string\n slug?: string\n description?: string\n json?: boolean\n}\n\nexport function parseUpdateOptions(args: string[]): UpdateOptions {\n const options: UpdateOptions = {}\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 \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsUpdate(\n client: OatmealClient,\n idOrSlug: string,\n args: string[]\n): Promise<void> {\n if (!idOrSlug) {\n console.error(\"Usage: hackathon events update <id-or-slug> [--name ...] [--slug ...] [--description ...]\")\n process.exit(1)\n }\n\n const options = parseUpdateOptions(args)\n const id = await resolveHackathonId(client, idOrSlug)\n\n const body: Record<string, string> = {}\n if (options.name) body.name = options.name\n if (options.slug) body.slug = options.slug\n if (options.description) body.description = options.description\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update (--name, --slug, --description)\")\n process.exit(1)\n }\n\n const hackathon = await client.patch<Hackathon>(`/api/dashboard/hackathons/${id}/settings`, body)\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Updated hackathon \"${hackathon.name ?? id}\"`))\n}\n"],"mappings":";;;AAYA,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,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,oBACpB,QACA,UACA,MACe;AACf,KAAI,CAAC,UAAU;AACb,UAAQ,MAAM,4FAA4F;AAC1G,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,mBAAmB,KAAK;CACxC,MAAM,KAAK,MAAM,mBAAmB,QAAQ,SAAS;CAErD,MAAM,OAA+B,EAAE;AACvC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AAEpD,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8EAA8E;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,YAAY,MAAM,OAAO,MAAiB,6BAA6B,GAAG,YAAY,KAAK;AAEjG,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,SAAQ,IAAI,cAAc,sBAAsB,UAAU,QAAQ,GAAG,GAAG,CAAC"}
@@ -20,7 +20,7 @@ function parseJudgeDisplayUpdateOptions(args) {
20
20
  }
21
21
  async function runJudgeDisplayUpdate(client, hackathonId, profileId, args) {
22
22
  if (!profileId) {
23
- console.error("Usage: oatmeal judge-display update <hackathon-id> <profile-id> [--name ...]");
23
+ console.error("Usage: hackathon judge-display update <hackathon-id> <profile-id> [--name ...]");
24
24
  process.exit(1);
25
25
  }
26
26
  const options = parseJudgeDisplayUpdateOptions(args);
@@ -1 +1 @@
1
- {"version":3,"file":"update2.mjs","names":[],"sources":["../../src/commands/judge-display/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { JudgeDisplayProfile } from \"../../types.js\"\n\ninterface JudgeDisplayUpdateOptions {\n name?: string\n title?: string\n bio?: string\n json?: boolean\n}\n\nexport function parseJudgeDisplayUpdateOptions(args: string[]): JudgeDisplayUpdateOptions {\n const options: JudgeDisplayUpdateOptions = {}\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 \"--title\":\n options.title = args[++i]\n break\n case \"--bio\":\n options.bio = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJudgeDisplayUpdate(\n client: OatmealClient,\n hackathonId: string,\n profileId: string,\n args: string[]\n): Promise<void> {\n if (!profileId) {\n console.error(\"Usage: oatmeal judge-display update <hackathon-id> <profile-id> [--name ...]\")\n process.exit(1)\n }\n\n const options = parseJudgeDisplayUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.title) body.title = options.title\n if (options.bio) body.bio = options.bio\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 profile = await client.patch<JudgeDisplayProfile>(\n `/api/dashboard/hackathons/${hackathonId}/judges/display/${profileId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(profile))\n return\n }\n\n console.log(formatSuccess(`Updated judge display profile \"${profile.name}\"`))\n}\n"],"mappings":";;AAWA,SAAgB,+BAA+B,MAA2C;CACxF,MAAM,UAAqC,EAAE;AAC7C,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,MAAM,KAAK,EAAE;AACrB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,sBACpB,QACA,aACA,WACA,MACe;AACf,KAAI,CAAC,WAAW;AACd,UAAQ,MAAM,+EAA+E;AAC7F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,+BAA+B,KAAK;CACpD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AACxC,KAAI,QAAQ,IAAK,MAAK,MAAM,QAAQ;AAEpC,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,MAAM,OAAO,MAC3B,6BAA6B,YAAY,kBAAkB,aAC3D,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,QAAQ,CAAC;AAChC;;AAGF,SAAQ,IAAI,cAAc,kCAAkC,QAAQ,KAAK,GAAG,CAAC"}
1
+ {"version":3,"file":"update2.mjs","names":[],"sources":["../../src/commands/judge-display/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { JudgeDisplayProfile } from \"../../types.js\"\n\ninterface JudgeDisplayUpdateOptions {\n name?: string\n title?: string\n bio?: string\n json?: boolean\n}\n\nexport function parseJudgeDisplayUpdateOptions(args: string[]): JudgeDisplayUpdateOptions {\n const options: JudgeDisplayUpdateOptions = {}\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 \"--title\":\n options.title = args[++i]\n break\n case \"--bio\":\n options.bio = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJudgeDisplayUpdate(\n client: OatmealClient,\n hackathonId: string,\n profileId: string,\n args: string[]\n): Promise<void> {\n if (!profileId) {\n console.error(\"Usage: hackathon judge-display update <hackathon-id> <profile-id> [--name ...]\")\n process.exit(1)\n }\n\n const options = parseJudgeDisplayUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.title) body.title = options.title\n if (options.bio) body.bio = options.bio\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 profile = await client.patch<JudgeDisplayProfile>(\n `/api/dashboard/hackathons/${hackathonId}/judges/display/${profileId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(profile))\n return\n }\n\n console.log(formatSuccess(`Updated judge display profile \"${profile.name}\"`))\n}\n"],"mappings":";;AAWA,SAAgB,+BAA+B,MAA2C;CACxF,MAAM,UAAqC,EAAE;AAC7C,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,MAAM,KAAK,EAAE;AACrB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,sBACpB,QACA,aACA,WACA,MACe;AACf,KAAI,CAAC,WAAW;AACd,UAAQ,MAAM,iFAAiF;AAC/F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,+BAA+B,KAAK;CACpD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AACxC,KAAI,QAAQ,IAAK,MAAK,MAAM,QAAQ;AAEpC,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,MAAM,OAAO,MAC3B,6BAA6B,YAAY,kBAAkB,aAC3D,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,QAAQ,CAAC;AAChC;;AAGF,SAAQ,IAAI,cAAc,kCAAkC,QAAQ,KAAK,GAAG,CAAC"}
@@ -23,7 +23,7 @@ function parsePrizeUpdateOptions(args) {
23
23
  }
24
24
  async function runPrizesUpdate(client, hackathonId, prizeId, args) {
25
25
  if (!prizeId) {
26
- console.error("Usage: oatmeal prizes update <hackathon-id> <prize-id> [--name ...]");
26
+ console.error("Usage: hackathon prizes update <hackathon-id> <prize-id> [--name ...]");
27
27
  process.exit(1);
28
28
  }
29
29
  const options = parsePrizeUpdateOptions(args);
@@ -1 +1 @@
1
- {"version":3,"file":"update3.mjs","names":[],"sources":["../../src/commands/prizes/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Prize } from \"../../types.js\"\n\ninterface PrizeUpdateOptions {\n name?: string\n description?: string\n type?: string\n value?: string\n json?: boolean\n}\n\nexport function parsePrizeUpdateOptions(args: string[]): PrizeUpdateOptions {\n const options: PrizeUpdateOptions = {}\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 \"--type\":\n options.type = args[++i]\n break\n case \"--value\":\n options.value = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runPrizesUpdate(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n args: string[]\n): Promise<void> {\n if (!prizeId) {\n console.error(\"Usage: oatmeal prizes update <hackathon-id> <prize-id> [--name ...]\")\n process.exit(1)\n }\n\n const options = parsePrizeUpdateOptions(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.type) body.type = options.type\n if (options.value) body.value = options.value\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 prize = await client.patch<Prize>(\n `/api/dashboard/hackathons/${hackathonId}/prizes/${prizeId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(prize))\n return\n }\n\n console.log(formatSuccess(`Updated prize \"${prize.name}\"`))\n}\n"],"mappings":";;AAYA,SAAgB,wBAAwB,MAAoC;CAC1E,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,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,gBACpB,QACA,aACA,SACA,MACe;AACf,KAAI,CAAC,SAAS;AACZ,UAAQ,MAAM,sEAAsE;AACpF,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,wBAAwB,KAAK;CAC7C,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AACpD,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AAExC,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,QAAQ,MAAM,OAAO,MACzB,6BAA6B,YAAY,UAAU,WACnD,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,MAAM,CAAC;AAC9B;;AAGF,SAAQ,IAAI,cAAc,kBAAkB,MAAM,KAAK,GAAG,CAAC"}
1
+ {"version":3,"file":"update3.mjs","names":[],"sources":["../../src/commands/prizes/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Prize } from \"../../types.js\"\n\ninterface PrizeUpdateOptions {\n name?: string\n description?: string\n type?: string\n value?: string\n json?: boolean\n}\n\nexport function parsePrizeUpdateOptions(args: string[]): PrizeUpdateOptions {\n const options: PrizeUpdateOptions = {}\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 \"--type\":\n options.type = args[++i]\n break\n case \"--value\":\n options.value = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runPrizesUpdate(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n args: string[]\n): Promise<void> {\n if (!prizeId) {\n console.error(\"Usage: hackathon prizes update <hackathon-id> <prize-id> [--name ...]\")\n process.exit(1)\n }\n\n const options = parsePrizeUpdateOptions(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.type) body.type = options.type\n if (options.value) body.value = options.value\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 prize = await client.patch<Prize>(\n `/api/dashboard/hackathons/${hackathonId}/prizes/${prizeId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(prize))\n return\n }\n\n console.log(formatSuccess(`Updated prize \"${prize.name}\"`))\n}\n"],"mappings":";;AAYA,SAAgB,wBAAwB,MAAoC;CAC1E,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,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,gBACpB,QACA,aACA,SACA,MACe;AACf,KAAI,CAAC,SAAS;AACZ,UAAQ,MAAM,wEAAwE;AACtF,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,wBAAwB,KAAK;CAC7C,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AACpD,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AAExC,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,QAAQ,MAAM,OAAO,MACzB,6BAA6B,YAAY,UAAU,WACnD,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,MAAM,CAAC;AAC9B;;AAGF,SAAQ,IAAI,cAAc,kBAAkB,MAAM,KAAK,GAAG,CAAC"}
@@ -23,7 +23,7 @@ function parseScheduleUpdateOptions(args) {
23
23
  }
24
24
  async function runSchedulesUpdate(client, scheduleId, args) {
25
25
  if (!scheduleId) {
26
- console.error("Usage: oatmeal schedules update <schedule-id> [--name ...] [--cron ...]");
26
+ console.error("Usage: hackathon schedules update <schedule-id> [--name ...] [--cron ...]");
27
27
  process.exit(1);
28
28
  }
29
29
  const options = parseScheduleUpdateOptions(args);
@@ -1 +1 @@
1
- {"version":3,"file":"update4.mjs","names":[],"sources":["../../src/commands/schedules/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\ninterface ScheduleUpdateOptions {\n name?: string\n cron?: string\n enabled?: boolean\n json?: boolean\n}\n\nexport function parseScheduleUpdateOptions(args: string[]): ScheduleUpdateOptions {\n const options: ScheduleUpdateOptions = {}\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 \"--cron\":\n options.cron = args[++i]\n break\n case \"--enable\":\n options.enabled = true\n break\n case \"--disable\":\n options.enabled = false\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runSchedulesUpdate(\n client: OatmealClient,\n scheduleId: string,\n args: string[]\n): Promise<void> {\n if (!scheduleId) {\n console.error(\"Usage: oatmeal schedules update <schedule-id> [--name ...] [--cron ...]\")\n process.exit(1)\n }\n\n const options = parseScheduleUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.cron) body.cron_expression = options.cron\n if (options.enabled !== undefined) body.enabled = options.enabled\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 schedule = await client.patch<Schedule>(\n `/api/dashboard/schedules/${scheduleId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(schedule))\n return\n }\n\n console.log(formatSuccess(`Updated schedule \"${schedule.name}\"`))\n}\n"],"mappings":";;AAWA,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,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,mBACpB,QACA,YACA,MACe;AACf,KAAI,CAAC,YAAY;AACf,UAAQ,MAAM,0EAA0E;AACxF,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,2BAA2B,KAAK;CAChD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,kBAAkB,QAAQ;AACjD,KAAI,QAAQ,YAAY,KAAA,EAAW,MAAK,UAAU,QAAQ;AAE1D,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,MAC5B,4BAA4B,cAC5B,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":"update4.mjs","names":[],"sources":["../../src/commands/schedules/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\ninterface ScheduleUpdateOptions {\n name?: string\n cron?: string\n enabled?: boolean\n json?: boolean\n}\n\nexport function parseScheduleUpdateOptions(args: string[]): ScheduleUpdateOptions {\n const options: ScheduleUpdateOptions = {}\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 \"--cron\":\n options.cron = args[++i]\n break\n case \"--enable\":\n options.enabled = true\n break\n case \"--disable\":\n options.enabled = false\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runSchedulesUpdate(\n client: OatmealClient,\n scheduleId: string,\n args: string[]\n): Promise<void> {\n if (!scheduleId) {\n console.error(\"Usage: hackathon schedules update <schedule-id> [--name ...] [--cron ...]\")\n process.exit(1)\n }\n\n const options = parseScheduleUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.cron) body.cron_expression = options.cron\n if (options.enabled !== undefined) body.enabled = options.enabled\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 schedule = await client.patch<Schedule>(\n `/api/dashboard/schedules/${scheduleId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(schedule))\n return\n }\n\n console.log(formatSuccess(`Updated schedule \"${schedule.name}\"`))\n}\n"],"mappings":";;AAWA,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,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,mBACpB,QACA,YACA,MACe;AACf,KAAI,CAAC,YAAY;AACf,UAAQ,MAAM,4EAA4E;AAC1F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,2BAA2B,KAAK;CAChD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,kBAAkB,QAAQ;AACjD,KAAI,QAAQ,YAAY,KAAA,EAAW,MAAK,UAAU,QAAQ;AAE1D,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,MAC5B,4BAA4B,cAC5B,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,GAAG,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { s as VERSION } from "./constants.mjs";
2
+ import { checkForUpdate } from "./update-check.mjs";
3
+ import pc from "picocolors";
4
+ import { execSync } from "node:child_process";
5
+ //#region src/commands/update.ts
6
+ const PKG = "@agi-ventures-canada/hackathon-cli";
7
+ function detectPackageManager() {
8
+ const execPath = process.env.npm_execpath ?? process.env._ ?? "";
9
+ if (/bun/.test(execPath)) return {
10
+ cmd: "bun",
11
+ install: `bun install -g ${PKG}@latest`
12
+ };
13
+ if (/pnpm/.test(execPath)) return {
14
+ cmd: "pnpm",
15
+ install: `pnpm add -g ${PKG}@latest`
16
+ };
17
+ if (/yarn/.test(execPath)) return {
18
+ cmd: "yarn",
19
+ install: `yarn global add ${PKG}@latest`
20
+ };
21
+ return {
22
+ cmd: "npm",
23
+ install: `npm install -g ${PKG}@latest`
24
+ };
25
+ }
26
+ async function runUpdate() {
27
+ console.log(`Current version: ${VERSION}`);
28
+ console.log("Checking for updates...");
29
+ const update = await checkForUpdate();
30
+ if (!update) {
31
+ console.log(pc.green("Already up to date."));
32
+ return;
33
+ }
34
+ const pm = detectPackageManager();
35
+ console.log(`New version available: ${update.latest}`);
36
+ console.log(`Updating via ${pm.cmd}...`);
37
+ try {
38
+ execSync(pm.install, { stdio: "inherit" });
39
+ console.log(pc.green(`\nUpdated to ${update.latest}`));
40
+ } catch {
41
+ console.error(pc.red("Update failed. Try manually:"));
42
+ console.error(` ${pm.install}`);
43
+ process.exit(1);
44
+ }
45
+ }
46
+ //#endregion
47
+ export { runUpdate };
48
+
49
+ //# sourceMappingURL=update5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update5.mjs","names":[],"sources":["../../src/commands/update.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport pc from \"picocolors\"\nimport { VERSION } from \"../constants.js\"\nimport { checkForUpdate } from \"../update-check.js\"\n\nconst PKG = \"@agi-ventures-canada/hackathon-cli\"\n\nfunction detectPackageManager(): { cmd: string; install: string } {\n const execPath = process.env.npm_execpath ?? process.env._ ?? \"\"\n if (/bun/.test(execPath)) return { cmd: \"bun\", install: `bun install -g ${PKG}@latest` }\n if (/pnpm/.test(execPath)) return { cmd: \"pnpm\", install: `pnpm add -g ${PKG}@latest` }\n if (/yarn/.test(execPath)) return { cmd: \"yarn\", install: `yarn global add ${PKG}@latest` }\n return { cmd: \"npm\", install: `npm install -g ${PKG}@latest` }\n}\n\nexport async function runUpdate(): Promise<void> {\n console.log(`Current version: ${VERSION}`)\n console.log(\"Checking for updates...\")\n\n const update = await checkForUpdate()\n if (!update) {\n console.log(pc.green(\"Already up to date.\"))\n return\n }\n\n const pm = detectPackageManager()\n console.log(`New version available: ${update.latest}`)\n console.log(`Updating via ${pm.cmd}...`)\n\n try {\n execSync(pm.install, { stdio: \"inherit\" })\n console.log(pc.green(`\\nUpdated to ${update.latest}`))\n } catch {\n console.error(pc.red(\"Update failed. Try manually:\"))\n console.error(` ${pm.install}`)\n process.exit(1)\n }\n}\n"],"mappings":";;;;;AAKA,MAAM,MAAM;AAEZ,SAAS,uBAAyD;CAChE,MAAM,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,IAAI,KAAK;AAC9D,KAAI,MAAM,KAAK,SAAS,CAAE,QAAO;EAAE,KAAK;EAAO,SAAS,kBAAkB,IAAI;EAAU;AACxF,KAAI,OAAO,KAAK,SAAS,CAAE,QAAO;EAAE,KAAK;EAAQ,SAAS,eAAe,IAAI;EAAU;AACvF,KAAI,OAAO,KAAK,SAAS,CAAE,QAAO;EAAE,KAAK;EAAQ,SAAS,mBAAmB,IAAI;EAAU;AAC3F,QAAO;EAAE,KAAK;EAAO,SAAS,kBAAkB,IAAI;EAAU;;AAGhE,eAAsB,YAA2B;AAC/C,SAAQ,IAAI,oBAAoB,UAAU;AAC1C,SAAQ,IAAI,0BAA0B;CAEtC,MAAM,SAAS,MAAM,gBAAgB;AACrC,KAAI,CAAC,QAAQ;AACX,UAAQ,IAAI,GAAG,MAAM,sBAAsB,CAAC;AAC5C;;CAGF,MAAM,KAAK,sBAAsB;AACjC,SAAQ,IAAI,0BAA0B,OAAO,SAAS;AACtD,SAAQ,IAAI,gBAAgB,GAAG,IAAI,KAAK;AAExC,KAAI;AACF,WAAS,GAAG,SAAS,EAAE,OAAO,WAAW,CAAC;AAC1C,UAAQ,IAAI,GAAG,MAAM,gBAAgB,OAAO,SAAS,CAAC;SAChD;AACN,UAAQ,MAAM,GAAG,IAAI,+BAA+B,CAAC;AACrD,UAAQ,MAAM,KAAK,GAAG,UAAU;AAChC,UAAQ,KAAK,EAAE"}