From 5fb6e618e3709ef26ca96b0beddfd55ad1047ec2 Mon Sep 17 00:00:00 2001 From: lyr Date: Thu, 8 Jan 2026 08:43:24 +0800 Subject: [PATCH] Add ytd preview flag for current year --- src/index.ts | 14 +++++++++++--- src/utils/dates.ts | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 81827da..9aa666e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,12 +26,14 @@ USAGE: OPTIONS: --year Generate wrapped for a specific year (default: current year) + --ytd, -t Allow current-year year-to-date preview before launch --help, -h Show this help message --version, -v Show version number EXAMPLES: - codex-wrapped # Generate current year wrapped - codex-wrapped --year 2025 # Generate 2025 wrapped + codex-wrapped # Generate current year wrapped + codex-wrapped --year 2025 # Generate 2025 wrapped + codex-wrapped --year 2026 --ytd # Year-to-date preview for 2026 `); } @@ -41,6 +43,7 @@ async function main() { args: process.argv.slice(2), options: { year: { type: "string", short: "y" }, + ytd: { type: "boolean", short: "t" }, help: { type: "boolean", short: "h" }, version: { type: "boolean", short: "v" }, }, @@ -62,7 +65,7 @@ async function main() { const requestedYear = values.year ? parseInt(values.year, 10) : new Date().getFullYear(); - const availability = isWrappedAvailable(requestedYear); + const availability = isWrappedAvailable(requestedYear, { allowYTD: Boolean(values.ytd) }); if (!availability.available) { if (Array.isArray(availability.message)) { availability.message.forEach((line) => p.log.warn(line)); @@ -72,6 +75,11 @@ async function main() { p.cancel(); process.exit(0); } + if (availability.message && Array.isArray(availability.message)) { + availability.message.forEach((line) => p.log.info(line)); + } else if (availability.message) { + p.log.info(availability.message); + } const dataExists = await checkCodexDataExists(); if (!dataExists) { diff --git a/src/utils/dates.ts b/src/utils/dates.ts index e705b71..c0f404d 100644 --- a/src/utils/dates.ts +++ b/src/utils/dates.ts @@ -79,11 +79,16 @@ export function getIntensityLevel(count: number, maxCount: number): 0 | 1 | 2 | return 6; } -export function isWrappedAvailable(year: number): { available: boolean; message?: string | string[] } { +export function isWrappedAvailable( + year: number, + options: { allowYTD?: boolean } = {} +): { available: boolean; message?: string | string[] } { const now = new Date(); const currentYear = now.getFullYear(); const currentMonth = now.getMonth() + 1; // 1-12 const currentDay = now.getDate(); + const { allowYTD = false } = options; + const decemberLaunchDay = 20; if (year < currentYear) { return { available: true }; @@ -96,7 +101,13 @@ export function isWrappedAvailable(year: number): { available: boolean; message? }; } - const decemberLaunchDay = 20; + if (allowYTD) { + return { + available: true, + message: `Generating ${year} year-to-date preview. Full wrap unlocks December ${decemberLaunchDay}th.`, + }; + } + if (currentMonth < 12 || (currentMonth === 12 && currentDay < decemberLaunchDay)) { const daysUntil = calculateDaysUntilLaunch(now, decemberLaunchDay); return {