chofex-cli 0.1.190 → 0.1.192

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 (3) hide show
  1. package/README.md +6 -3
  2. package/dist/index.js +120 -55
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -51,9 +51,12 @@ Acceptance creates a default badge from the Clerk profile visible to reviewers.
51
51
  while separately collecting the legal full name and venue details required for attendance. After confirmation,
52
52
  `chofex badge regenerate` can also update those public fields and the QR
53
53
  destination without changing the submitted application.
54
- The technical challenges do not block submission, but every challenge winner must submit
55
- an application before being accepted. Top results receive a direct pass; other
56
- scores give organizers another review metric.
54
+ The technical challenges do not block application submission, but they are
55
+ mandatory for admission. An application does not reserve a seat; organizers
56
+ select the strongest engineers from challenge rankings. Broken Agent requires a
57
+ participant-only browser handoff with passkey user verification before each
58
+ official evaluation. Every challenge slug resolves to the current server
59
+ version; legacy attempts do not count toward admission.
57
60
 
58
61
  The public ranking is read-only at `https://hacktheandes.com/challenges`.
59
62
 
package/dist/index.js CHANGED
@@ -58554,6 +58554,7 @@ var runWith2 = (command, config) => {
58554
58554
  // ../../packages/challenges-contract/src/index.ts
58555
58555
  var blackBoxChallengeSlug = "black-box";
58556
58556
  var brokenAgentChallengeSlug = "broken-agent";
58557
+ var challengeAdmissionNotice = "Los challenges técnicos son obligatorios para competir por un cupo. Enviar la postulación solo crea tu candidatura: no reserva una plaza. Siempre compites en la versión vigente; los intentos legacy no cuentan. Los mejores resultados de los rankings serán seleccionados para el evento.";
58557
58558
  var challengeCatalog = [
58558
58559
  {
58559
58560
  slug: blackBoxChallengeSlug,
@@ -58836,6 +58837,7 @@ var ChallengeCatalogItemSchema = exports_Schema.Struct({
58836
58837
  playable: exports_Schema.Boolean,
58837
58838
  open: exports_Schema.Boolean,
58838
58839
  closed: exports_Schema.optional(exports_Schema.Boolean),
58840
+ challengeVersion: exports_Schema.optional(exports_Schema.String),
58839
58841
  rankingPath: exports_Schema.String
58840
58842
  });
58841
58843
  var ChallengeEvaluationSummarySchema = exports_Schema.Struct({
@@ -58853,6 +58855,11 @@ var ChallengeEvaluationSummarySchema = exports_Schema.Struct({
58853
58855
  breakdown: exports_Schema.optional(ChallengeScoreSchema.fields.breakdown)
58854
58856
  });
58855
58857
  var ChallengeAttemptViewSchema = exports_Schema.Struct({
58858
+ admission: exports_Schema.optional(exports_Schema.Struct({
58859
+ challengesMandatory: exports_Schema.Literal(true),
58860
+ selectionBasis: exports_Schema.Literal("challenge_rankings"),
58861
+ notice: exports_Schema.String
58862
+ })),
58856
58863
  challenge: ChallengeCatalogItemSchema,
58857
58864
  progress: ParticipantChallengeProgressSchema,
58858
58865
  observations: exports_Schema.Array(ChallengeObservationSchema),
@@ -58918,6 +58925,11 @@ var ChallengeRankingSchema = exports_Schema.Struct({
58918
58925
  competitorCount: exports_Schema.Number
58919
58926
  });
58920
58927
  var ChallengeCatalogSchema = exports_Schema.Struct({
58928
+ admission: exports_Schema.optional(exports_Schema.Struct({
58929
+ challengesMandatory: exports_Schema.Literal(true),
58930
+ selectionBasis: exports_Schema.Literal("challenge_rankings"),
58931
+ notice: exports_Schema.String
58932
+ })),
58921
58933
  challenges: exports_Schema.Array(ChallengeCatalogItemSchema)
58922
58934
  });
58923
58935
 
@@ -59267,7 +59279,12 @@ var PictureUploadCompletionSchema = exports_Schema.Struct({
59267
59279
  });
59268
59280
  var RegistrationResultSchema = exports_Schema.Struct({
59269
59281
  registration: RegistrationViewSchema,
59270
- requirements: RegistrationRequirementsSchema
59282
+ requirements: RegistrationRequirementsSchema,
59283
+ admission: exports_Schema.optional(exports_Schema.Struct({
59284
+ challengesMandatory: exports_Schema.Literal(true),
59285
+ selectionBasis: exports_Schema.Literal("challenge_rankings"),
59286
+ notice: exports_Schema.String
59287
+ }))
59271
59288
  });
59272
59289
  var CreatedRegistrationSchema = RegistrationResultSchema;
59273
59290
  var ApiSuccessSchema = (data) => exports_Schema.Struct({
@@ -59942,7 +59959,12 @@ var challengeParticipationNotice = (title, opensAt, closesAt, now3 = new Date) =
59942
59959
  return challengeLaunchNotice(title, opensAt, now3);
59943
59960
  };
59944
59961
  var challengeListText = (catalog) => {
59945
- const lines2 = [`${eventName} challenges`, ""];
59962
+ const lines2 = [
59963
+ `${eventName} challenges`,
59964
+ "",
59965
+ catalog.admission?.notice ?? challengeAdmissionNotice,
59966
+ ""
59967
+ ];
59946
59968
  for (const challenge of catalog.challenges) {
59947
59969
  let state = `abre ${formatChallengeOpeningInPeru(challenge.opensAt)}`;
59948
59970
  if (challenge.closed) {
@@ -59955,6 +59977,9 @@ var challengeListText = (catalog) => {
59955
59977
  const playable = challenge.playable ? "" : " (próximamente)";
59956
59978
  lines2.push(`${challenge.code} ${challenge.theme} — ${challenge.title}${playable}`);
59957
59979
  lines2.push(` ${challenge.coreSkill} · ${challenge.formatLabel} · ${state}`);
59980
+ if (challenge.challengeVersion) {
59981
+ lines2.push(` Versión vigente: ${challenge.challengeVersion}`);
59982
+ }
59958
59983
  lines2.push(` Ranking: ${challenge.rankingPath}`);
59959
59984
  lines2.push("");
59960
59985
  }
@@ -59979,6 +60004,10 @@ var challengeShowText = (attempt) => {
59979
60004
  `${challenge.title.toUpperCase()} — CASO #${challenge.code}`,
59980
60005
  challenge.summary,
59981
60006
  "",
60007
+ attempt.admission?.notice ?? challengeAdmissionNotice,
60008
+ "",
60009
+ `VERSIÓN VIGENTE: ${challenge.challengeVersion ?? "administrada por el servidor"}`,
60010
+ "",
59982
60011
  `ESTADO DEL CASO: ${caseStatus2}`,
59983
60012
  "",
59984
60013
  "Los tests públicos están verdes. Tu trabajo es hacer que el scheduler sea confiable bajo condiciones de producción.",
@@ -60011,6 +60040,10 @@ var challengeShowText = (attempt) => {
60011
60040
  `${challenge.title.toUpperCase()} — CASE #${challenge.code}`,
60012
60041
  challenge.summary,
60013
60042
  "",
60043
+ attempt.admission?.notice ?? challengeAdmissionNotice,
60044
+ "",
60045
+ `CURRENT VERSION: ${challenge.challengeVersion ?? "server-managed"}`,
60046
+ "",
60014
60047
  `CASE STATUS: ${caseStatus}`,
60015
60048
  "",
60016
60049
  "Your job is to replace the machine, not merely guess its next answer.",
@@ -60205,31 +60238,17 @@ var challengeTestText = (result3) => {
60205
60238
  `);
60206
60239
  };
60207
60240
  var challengeEvaluateText = (result3) => {
60208
- if (result3.breakdown) {
60209
- const executionCost = result3.executionCost ?? result3.runtimeMs;
60210
- const capabilityLines = [
60211
- ["Comportamiento base", result3.breakdown.coreBehavior],
60212
- ["Persistencia", result3.breakdown.persistence],
60213
- ["Concurrencia", result3.breakdown.concurrency],
60214
- ["Recuperación", result3.breakdown.failureRecovery],
60215
- ["Idempotencia", result3.breakdown.idempotency],
60216
- ["Sin regresiones", result3.breakdown.regressionSafety],
60217
- ["Rendimiento", result3.breakdown.performance]
60218
- ];
60241
+ if (result3.rankingPath === "/challenges/broken-agent") {
60219
60242
  const lines3 = [
60220
60243
  "VEREDICTO OFICIAL — BROKEN AGENT — PREPARACIÓN PARA PRODUCCIÓN",
60221
- `Puntaje ${(result3.accuracy * 100).toFixed(2)} / ${result3.sampleSize}`,
60222
- `Costo determinístico ${executionCost} ops`,
60223
- "",
60224
- "Puntajes por capacidad",
60225
- ...capabilityLines.map(([label, score]) => `${label.padEnd(20)}${score.earned.toFixed(2)} / ${score.available}`)
60244
+ `Puntaje ${(result3.accuracy * 100).toFixed(2)} / ${result3.sampleSize}`
60226
60245
  ];
60227
60246
  if (result3.rank !== undefined) {
60228
60247
  lines3.push(`Puesto #${result3.rank}`);
60229
60248
  }
60230
60249
  lines3.push(`Evaluaciones oficiales restantes ${result3.evaluationsRemaining} / ${result3.evaluationsLimit}`, "", result3.shareText, "", "Siguiente: consulta el ranking", " chofex challenge ranking --challenge broken-agent");
60231
60250
  if (result3.evaluationsRemaining > 0) {
60232
- lines3.push("", "El evaluador reporta capacidades, no casos ocultos individuales. Razona antes de volver a enviar.", " chofex challenge test --challenge broken-agent --source ./scheduler.js");
60251
+ lines3.push("", "El veredicto es un solo puntaje. No dice qué caso falló. Razona antes de volver a enviar.", " chofex challenge test --challenge broken-agent --source ./scheduler.js");
60233
60252
  }
60234
60253
  return lines3.join(`
60235
60254
  `);
@@ -60265,16 +60284,14 @@ var challengeRankingText = (ranking, now3 = new Date) => {
60265
60284
  `);
60266
60285
  }
60267
60286
  if (ranking.challenge.slug === "broken-agent") {
60268
- lines2.push("Psto Puntaje Puntos Costo Nombre");
60287
+ lines2.push("Psto Puntaje Puntos Nombre");
60269
60288
  for (const entry of ranking.entries.slice(0, 20)) {
60270
60289
  const rank = String(entry.rank).padStart(4, " ");
60271
60290
  const accuracy = percent(entry.accuracy).padStart(8, " ");
60272
60291
  const points = `${entry.exactCount}/${entry.sampleSize}`.padStart(11, " ");
60273
- const executionCost = entry.executionCost ?? entry.runtimeMs;
60274
- const runtime = `${executionCost}ops`.padStart(8, " ");
60275
60292
  const profileLinks = [entry.githubUrl, entry.linkedInUrl].filter(Boolean);
60276
60293
  const participant = [entry.displayName, ...profileLinks].join(" ");
60277
- lines2.push(`${rank} ${accuracy} ${points} ${runtime} ${participant}`);
60294
+ lines2.push(`${rank} ${accuracy} ${points} ${participant}`);
60278
60295
  }
60279
60296
  return lines2.join(`
60280
60297
  `);
@@ -60500,6 +60517,10 @@ contra escenarios ocultos. Las herramientas de AI están permitidas, pero este e
60500
60517
  un challenge de colaboración: el agente implementa y el participante toma las
60501
60518
  decisiones de ingeniería.
60502
60519
 
60520
+ Los challenges técnicos son obligatorios para competir por un cupo. Enviar la
60521
+ postulación solo crea tu candidatura: no reserva una plaza. Los mejores
60522
+ resultados de los rankings serán seleccionados para el evento.
60523
+
60503
60524
  ## Protocolo humano–agente
60504
60525
 
60505
60526
  No le pidas al agente que resuelva todo en silencio. Antes de modificar el
@@ -60541,6 +60562,13 @@ explicar, debatir y guardar tus respuestas, pero no puede elegir el foco, invent
60541
60562
  tu razonamiento ni tomar la decisión de release por ti. Si cambias
60542
60563
  \`scheduler.js\`, vuelve a revisar la evidencia antes de reemplazar el review.
60543
60564
 
60565
+ La primera ejecución de \`challenge evaluate\` crea un enlace corto de
60566
+ aprobación y **no consume** una evaluación. Abre ese enlace personalmente,
60567
+ revisa el review vinculado al SHA-256 exacto y confirma con Face ID, Touch ID,
60568
+ Windows Hello, PIN del dispositivo o una llave de seguridad. Después repite el
60569
+ mismo comando para ejecutar la evaluación oficial. Cada evaluación requiere una
60570
+ aprobación nueva; la sesión OAuth del CLI no puede aprobarla.
60571
+
60544
60572
  ## Contrato normativo
60545
60573
 
60546
60574
  \`createScheduler({ store, clock, execute, workerId })\` devuelve:
@@ -60575,13 +60603,13 @@ tu razonamiento ni tomar la decisión de release por ti. Si cambias
60575
60603
  - El store sobrevive nuevas instancias del scheduler y reinicios del proceso.
60576
60604
  - Varios workers, incluso instancias que reutilizan un \`workerId\` después de
60577
60605
  reiniciar, pueden llamar \`runDue()\` contra el mismo store.
60578
- - \`runDue()\` intenta una vez cada job vencido al inicio de esa llamada. Un job
60579
- que falla queda pendiente para una llamada posterior y no bloquea otros jobs.
60580
- - Cada ejecución debe reclamarse atómicamente antes de llamar al executor. El
60581
- claim dura 30 segundos y necesita una identidad única distinta de
60582
- \`workerId\`. Cuando \`clock.now()\` alcanza el deadline, otro worker puede
60583
- reclamarlo. Un worker obsoleto nunca puede completar ni reabrir un claim más
60584
- nuevo.
60606
+ - \`runDue()\` reclama un job antes de llamar al executor. Un job que falla
60607
+ queda pendiente para una llamada posterior y no bloquea otros jobs.
60608
+ - Cada ejecución debe reclamarse atómicamente. El claim dura 30 segundos.
60609
+ Cuando \`clock.now()\` alcanza ese deadline, otro worker puede reclamar el
60610
+ job. Un worker que ya no es dueño del claim, incluido un proceso que vuelve
60611
+ con el mismo \`workerId\`, no puede completarlo, marcarlo como fallido ni
60612
+ reabrirlo.
60585
60613
  - Un intento se cuenta al reclamar el job. Después de 3 ejecuciones fallidas el
60586
60614
  job queda failed.
60587
60615
  - \`execute(job)\` puede fallar antes o después de aplicar el efecto. El adapter
@@ -60598,24 +60626,13 @@ ofrece operaciones síncronas \`get(id)\`, \`put(job)\`, \`delete(id)\` y
60598
60626
 
60599
60627
  ## Evaluación
60600
60628
 
60601
- El evaluador usa variantes determinísticas por participante para probar el
60602
- contrato bajo concurrencia, reinicios, fallas, idempotencia, compatibilidad y
60603
- carga. Reporta puntajes por capacidad, no casos ocultos individuales.
60604
-
60605
- - Comportamiento base: 10 puntos
60606
- - Persistencia: 15 puntos
60607
- - Concurrencia: 20 puntos
60608
- - Recuperación ante fallas: 20 puntos
60609
- - Idempotencia: 15 puntos
60610
- - Seguridad contra regresiones: 15 puntos
60611
- - Rendimiento: 5 puntos, solo si la carga termina correctamente y sin perder
60612
- seguridad de concurrencia
60629
+ El evaluador usa variantes determinísticas por participante. El veredicto
60630
+ oficial es un solo puntaje sobre 100. No incluye casos ocultos, un desglose por
60631
+ capacidad ni un costo de ejecución.
60613
60632
 
60614
60633
  El ranking exige una postulación enviada o revisada. Ordena por puntaje total,
60615
- menos evaluaciones oficiales, costo determinístico de ejecución y hora del mejor
60616
- envío. El costo es \`transacciones + ceil(jobs recorridos por tx.list / 10)\` en
60617
- una carga equivalente para todos; no usa tiempo de servidor. Todos los puntajes
60618
- válidos aparecen en el ranking.
60634
+ luego por menos evaluaciones oficiales y, al final, por la hora del mejor
60635
+ envío. Todos los puntajes válidos aparecen en el ranking.
60619
60636
  `;
60620
60637
  var brokenAgentPublicTestSource = `const test = require("node:test");
60621
60638
  const assert = require("node:assert/strict");
@@ -60821,7 +60838,7 @@ var root = exports_Command.make("chofex").pipe(exports_Command.withSharedFlags({
60821
60838
  apiUrl: exports_Flag.string(rootValueFlagNames.apiUrl).pipe(exports_Flag.withDefault(config.apiUrl), exports_Flag.withDescription("Chofex API base URL")),
60822
60839
  output: exports_Flag.choice(rootValueFlagNames.output, ["human", "json"]).pipe(exports_Flag.withDefault("human"), exports_Flag.withDescription("Output format")),
60823
60840
  token: exports_Flag.string(rootValueFlagNames.token).pipe(exports_Flag.optional, exports_Flag.withDescription("Clerk OAuth token (prefer CHOFEX_TOKEN to avoid shell history)"))
60824
- }), exports_Command.withDescription(`Register for and manage your ${eventName} application`));
60841
+ }), exports_Command.withDescription(`Apply to ${eventName} and compete for a seat through the mandatory technical challenges`));
60825
60842
 
60826
60843
  // src/output.ts
60827
60844
  var printJson = (value3) => exports_Effect.sync(() => {
@@ -60900,8 +60917,14 @@ var requirementsText = (result3) => {
60900
60917
  if (requirements.stage === "draft") {
60901
60918
  return `Application draft in progress.${registrationPartsText(result3)}`;
60902
60919
  }
60903
- if (requirements.stage === "review")
60904
- return "No action needed while your application is reviewed.";
60920
+ if (requirements.stage === "review") {
60921
+ return [
60922
+ "Application received. A seat has not been assigned.",
60923
+ result3.admission?.notice ?? challengeAdmissionNotice,
60924
+ "Next command: chofex challenge"
60925
+ ].join(`
60926
+ `);
60927
+ }
60905
60928
  let feedback = "";
60906
60929
  const rejectionReason = requirements.rejectionReason ?? registration.rejectionReason;
60907
60930
  if (rejectionReason) {
@@ -60960,9 +60983,11 @@ var challengeQuickstart = {
60960
60983
  ],
60961
60984
  mission: "Audita scheduler.js, conserva createScheduler(dependencies) y haz que el sistema cumpla el contrato de producción.",
60962
60985
  rules: [
60986
+ "Los challenges son obligatorios: enviar la postulación no reserva un cupo.",
60987
+ "Los mejores resultados de los rankings serán seleccionados para el evento.",
60963
60988
  "Tienes 5 evaluaciones oficiales contra variantes ocultas y determinísticas por participante.",
60964
60989
  "Los tests locales y públicos son ilimitados.",
60965
- "Gana el puntaje total; los empates usan menos evaluaciones, costo determinístico y hora del mejor envío.",
60990
+ "Gana el puntaje total; los empates usan menos evaluaciones y la hora del mejor envío.",
60966
60991
  "Las herramientas de AI están permitidas, pero el participante toma las decisiones de ingeniería."
60967
60992
  ],
60968
60993
  workflow: [
@@ -61016,12 +61041,24 @@ var challengeQuickstart = {
61016
61041
  },
61017
61042
  {
61018
61043
  step: 9,
61019
- action: "Solicita un veredicto oculto",
61044
+ action: "Crea el handoff de evaluación",
61020
61045
  command: "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json",
61021
- note: "Úsalo solo cuando enviarías la implementación a producción."
61046
+ note: "Devuelve un enlace de aprobación sin consumir una evaluación oficial."
61022
61047
  },
61023
61048
  {
61024
61049
  step: 10,
61050
+ action: "El participante aprueba en el navegador",
61051
+ command: "Abre approvalUrl personalmente",
61052
+ note: "Revisa el razonamiento y confirma con Face ID, Touch ID, Windows Hello, PIN o llave de seguridad. El agente no puede completar este paso."
61053
+ },
61054
+ {
61055
+ step: 11,
61056
+ action: "Solicita el veredicto oculto",
61057
+ command: "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json",
61058
+ note: "Repite el mismo comando antes de que venza la aprobación; recién entonces consume una evaluación."
61059
+ },
61060
+ {
61061
+ step: 12,
61025
61062
  action: "Consulta el ranking",
61026
61063
  command: "chofex challenge ranking --challenge broken-agent",
61027
61064
  note: "Se revela el 1 de octubre a las 15:00, hora de Perú."
@@ -61074,6 +61111,34 @@ var optionalString = (name, description) => exports_Flag.string(name).pipe(expor
61074
61111
  var challengeFlag = exports_Flag.string("challenge").pipe(exports_Flag.withDefault(defaultChallengeSlug), exports_Flag.withDescription("Challenge slug (default: broken-agent)"));
61075
61112
  var sourceFlag = optionalString("source", "JavaScript challenge solution file");
61076
61113
  var reviewFlag = optionalString("review", "Participant-authored Broken Agent engineering review JSON");
61114
+ var evaluationErrorText = (error2) => {
61115
+ if (error2.code !== "HUMAN_APPROVAL_REQUIRED")
61116
+ return;
61117
+ if (!error2.details || typeof error2.details !== "object")
61118
+ return;
61119
+ const details = error2.details;
61120
+ if (typeof details.approvalUrl !== "string")
61121
+ return;
61122
+ let retryCommand = "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json";
61123
+ if (typeof details.retryCommand === "string") {
61124
+ retryCommand = details.retryCommand;
61125
+ }
61126
+ const lines2 = [
61127
+ "INTERVENCIÓN DEL PARTICIPANTE REQUERIDA",
61128
+ "La evaluación todavía no consumió un intento.",
61129
+ "",
61130
+ "El participante debe abrir personalmente este enlace, revisar sus respuestas y aprobar con Face ID, Touch ID, Windows Hello, PIN o llave de seguridad:",
61131
+ ` ${details.approvalUrl}`,
61132
+ "",
61133
+ "Después de aprobar, repite:",
61134
+ ` ${retryCommand}`
61135
+ ];
61136
+ if (typeof details.expiresAt === "string") {
61137
+ lines2.push("", `La aprobación vence: ${details.expiresAt}`);
61138
+ }
61139
+ return lines2.join(`
61140
+ `);
61141
+ };
61077
61142
  var inputFlag = optionalString("input", "JSON file, or - for stdin");
61078
61143
  var formatFlag = exports_Flag.choice("format", ["table", "json", "csv"]).pipe(exports_Flag.withDefault("table"), exports_Flag.withDescription("Notebook format"));
61079
61144
  var numberFromOption = (value3) => {
@@ -61270,8 +61335,8 @@ var evaluateCommand = exports_Command.make("evaluate", { challenge: challengeFla
61270
61335
  const solution = yield* challengeEvaluationInput(exports_Option.getOrUndefined(source), exports_Option.getOrUndefined(review), challenge);
61271
61336
  return yield* evaluateChallenge({ apiUrl: options.apiUrl, token }, challenge, solution);
61272
61337
  });
61273
- yield* execute(options.output, operation, challengeEvaluateText);
61274
- })).pipe(exports_Command.withDescription("Score a solution on hidden cases. This consumes one limited official evaluation. Requires sign-in."), exports_Command.withExamples([
61338
+ yield* execute(options.output, operation, challengeEvaluateText, evaluationErrorText);
61339
+ })).pipe(exports_Command.withDescription("Score a solution on hidden cases. Broken Agent requires participant browser approval before a limited evaluation is consumed."), exports_Command.withExamples([
61275
61340
  {
61276
61341
  command: "chofex challenge evaluate --challenge broken-agent --source ./scheduler.js --review ./review.json",
61277
61342
  description: "Consume una evaluación oficial cuando tu solución esté lista"
@@ -61332,7 +61397,7 @@ var challengeCommand = exports_Command.make("challenge", {}, exports_Effect.fn("
61332
61397
  return;
61333
61398
  }
61334
61399
  yield* exports_Console.log(challengeQuickstartText(participationState, launchNotice));
61335
- })).pipe(exports_Command.withDescription("Compite en challenges técnicos. Ejecuta el comando sin subcomandos para abrir la guía del challenge actual."), exports_Command.withExamples([
61400
+ })).pipe(exports_Command.withDescription("Compite en challenges técnicos obligatorios por un cupo. Ejecuta el comando sin subcomandos para abrir la guía del challenge actual."), exports_Command.withExamples([
61336
61401
  {
61337
61402
  command: "chofex challenge",
61338
61403
  description: "Abre la guía de Broken Agent"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chofex-cli",
3
- "version": "0.1.190",
3
+ "version": "0.1.192",
4
4
  "description": "Command-line client for Hack the Andes",
5
5
  "type": "module",
6
6
  "bin": {