@nbtca/prompt 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +44 -0
  2. package/SECURITY.md +47 -0
  3. package/dist/app/app.js +202 -0
  4. package/dist/app/chrome.js +104 -0
  5. package/dist/app/fields/list-field.js +174 -0
  6. package/dist/app/fields/text-field.js +38 -0
  7. package/dist/app/frame.js +48 -0
  8. package/dist/app/keys.js +20 -0
  9. package/dist/app/tabs.js +11 -0
  10. package/dist/app/view.js +1 -0
  11. package/dist/app/views/docs-render.js +82 -0
  12. package/dist/app/views/docs.js +457 -0
  13. package/dist/app/views/events-render.js +111 -0
  14. package/dist/app/views/events.js +228 -0
  15. package/dist/app/views/home.js +236 -0
  16. package/dist/app/views/schedule-grid-cursor.js +52 -0
  17. package/dist/app/views/schedule-render.js +317 -0
  18. package/dist/app/views/schedule.js +472 -0
  19. package/dist/app/views/settings-render.js +53 -0
  20. package/dist/app/views/settings.js +153 -0
  21. package/dist/auth/cookie-transport.js +222 -0
  22. package/dist/auth/errors.js +18 -0
  23. package/dist/auth/nbt-auth.js +239 -0
  24. package/dist/auth/session-store.js +118 -0
  25. package/dist/config/paths.js +22 -2
  26. package/dist/core/canvas.js +23 -0
  27. package/dist/core/capabilities.js +42 -0
  28. package/dist/core/components/confirm.js +75 -0
  29. package/dist/core/components/input-session.js +24 -0
  30. package/dist/core/components/menu.js +122 -0
  31. package/dist/core/components/messages.js +16 -0
  32. package/dist/core/components/note.js +18 -0
  33. package/dist/core/components/painter.js +26 -0
  34. package/dist/core/components/screen.js +18 -0
  35. package/dist/core/components/spinner.js +47 -0
  36. package/dist/core/components/text-input.js +98 -0
  37. package/dist/core/logo.js +40 -15
  38. package/dist/core/menu.js +30 -13
  39. package/dist/core/motion.js +86 -0
  40. package/dist/core/text.js +127 -5
  41. package/dist/core/theme.js +61 -0
  42. package/dist/core/transitions.js +19 -0
  43. package/dist/core/ui.js +5 -29
  44. package/dist/features/calendar-heatmap.js +29 -27
  45. package/dist/features/calendar-query.js +50 -0
  46. package/dist/features/calendar.js +192 -111
  47. package/dist/features/docs.js +382 -128
  48. package/dist/features/links.js +7 -5
  49. package/dist/features/schedule-query.js +47 -0
  50. package/dist/features/schedule-render.js +574 -0
  51. package/dist/features/schedule-store.js +73 -0
  52. package/dist/features/schedule-view.js +260 -0
  53. package/dist/features/settings.js +43 -33
  54. package/dist/features/status.js +37 -13
  55. package/dist/features/student-timetable.js +346 -0
  56. package/dist/features/update.js +16 -8
  57. package/dist/i18n/locales/en.json +162 -17
  58. package/dist/i18n/locales/zh.json +164 -19
  59. package/dist/index.js +59 -5
  60. package/dist/logo/ca-dotmatrix-large.txt +26 -0
  61. package/dist/logo/ca-dotmatrix-small.txt +12 -0
  62. package/dist/logo/ca-dotmatrix.txt +18 -16
  63. package/dist/logo/ca-logo.png +0 -0
  64. package/dist/main.js +33 -13
  65. package/package.json +10 -7
@@ -8,23 +8,30 @@
8
8
  "error": "错误",
9
9
  "success": "成功",
10
10
  "goodbye": "再见!",
11
- "current": "当前"
11
+ "current": "当前",
12
+ "moreAbove": "上方还有 {count} 项",
13
+ "moreBelow": "下方还有 {count} 项"
12
14
  },
13
15
  "menu": {
14
16
  "events": "活动",
15
- "eventsDesc": "近期活动安排",
17
+ "eventsDesc": "",
16
18
  "docs": "文档",
17
19
  "docsDesc": "知识库",
18
20
  "status": "状态",
19
- "statusDesc": "服务健康检查",
21
+ "statusDesc": "在线状态",
22
+ "timetable": "我的课表",
23
+ "timetableDesc": "登录教务、查询学期并导出 ICS",
20
24
  "links": "链接",
21
- "linksDesc": "官网、GitHub、路线图",
25
+ "linksDesc": "官网 · GitHub · 路线图",
22
26
  "settings": "设置",
23
- "settingsDesc": "语言、主题、关于",
24
- "chooseAction": "选择一个操作"
27
+ "settingsDesc": "语言 · 主题 · 关于",
28
+ "chooseAction": "nbtca",
29
+ "hintMove": "移动",
30
+ "hintOpen": "打开",
31
+ "hintQuit": "退出"
25
32
  },
26
33
  "about": {
27
- "title": "关于 NBTCA",
34
+ "title": "关于",
28
35
  "project": "项目",
29
36
  "version": "版本",
30
37
  "description": "描述",
@@ -58,19 +65,35 @@
58
65
  "pastEvents": "历史活动",
59
66
  "pastEventsDesc": "近期活动记录",
60
67
  "noPastEvents": "最近 30 天内暂无历史活动",
61
- "viewPastDetail": "选择活动查看详情:"
68
+ "viewPastDetail": "选择活动查看详情:",
69
+ "next": "下一场",
70
+ "recentActivity": "近期动态",
71
+ "inPrefix": "还有",
72
+ "startingNow": "即将开始",
73
+ "thisWeek": "本周",
74
+ "thisMonth": "本月",
75
+ "search": "搜索",
76
+ "searchPrompt": "搜索活动",
77
+ "searchPlaceholder": "关键词…",
78
+ "searchNoResults": "没有匹配的活动",
79
+ "exportIcs": "导出 .ics",
80
+ "exportSuccess": "已保存",
81
+ "exportError": "无法写入 .ics 文件",
82
+ "recurringLabel": "循环"
62
83
  },
63
84
  "docs": {
64
85
  "loading": "正在加载文档列表...",
65
86
  "loadingDir": "正在加载目录",
66
- "categoryTutorial": "教程",
87
+ "categoryAbout": "认识 NBTCA",
88
+ "categoryGuide": "指南",
67
89
  "categoryRepairLogs": "维修日记",
68
90
  "categoryEvents": "活动文档",
69
- "categoryProcess": "流程文档",
70
- "categoryRepair": "维修相关",
71
- "categoryArchived": "归档文档",
91
+ "categoryConcepts": "参考",
92
+ "categoryRepair": "维修",
93
+ "categoryArchived": "归档",
72
94
  "categoryReadme": "项目说明 (README)",
73
- "chooseCategory": "选择文档分类:",
95
+ "overviewLabel": "总览",
96
+ "chooseCategory": "文档",
74
97
  "refreshCache": "刷新缓存",
75
98
  "cacheCleared": "文档缓存已清除",
76
99
  "usingCachedData": "网络不可用,使用缓存数据",
@@ -79,7 +102,7 @@
79
102
  "emptyDir": "该目录为空",
80
103
  "upToParent": "返回上级目录",
81
104
  "returnToMenu": "返回主菜单",
82
- "backToList": "返回文档列表",
105
+ "backToList": "返回",
83
106
  "reread": "重新阅读文档",
84
107
  "openBrowser": "在浏览器中打开",
85
108
  "loadError": "无法加载目录",
@@ -93,8 +116,9 @@
93
116
  "browserErrorHint": "请手动访问: https://docs.nbtca.space",
94
117
  "retry": "是否重试?",
95
118
  "tocTitle": "目录",
96
- "tableHint": "表格在浏览器中效果更佳",
97
- "endOfDocument": "文档结束 - 按 q 退出",
119
+ "tableHint": "图表与表格在浏览器中效果更佳",
120
+ "mermaidHint": "在浏览器中查看图表",
121
+ "endOfDocument": "文档结束 · q 退出 · / 搜索",
98
122
  "githubRateLimited": "GitHub API 速率限制已达上限,将在 {time} 重置。",
99
123
  "githubForbidden": "GitHub API 拒绝访问 (403)。",
100
124
  "githubTokenHint": "提示: 设置 GITHUB_TOKEN 环境变量可获得更高的速率限制。",
@@ -105,10 +129,13 @@
105
129
  "searching": "正在搜索文档...",
106
130
  "searchResults": "个结果",
107
131
  "searchNoResults": "未找到匹配的文档",
108
- "loadingFile": "正在加载"
132
+ "loadingFile": "正在加载",
133
+ "readerLinksTitle": "跳转到",
134
+ "readerLinksHint": "链接",
135
+ "readerNoLinks": "本页没有指向其他文档的链接"
109
136
  },
110
137
  "links": {
111
- "choose": "打开链接:",
138
+ "choose": "链接",
112
139
  "website": "官方网站",
113
140
  "github": "GitHub",
114
141
  "roadmap": "路线图",
@@ -149,6 +176,114 @@
149
176
  "watchJsonConflict": "--watch 不能和 --json 同时使用。",
150
177
  "intervalNeedsWatch": "--interval 需要配合 --watch 使用。"
151
178
  },
179
+ "timetable": {
180
+ "menuTitle": "我的课表",
181
+ "actionExport": "导出 ICS",
182
+ "actionTerms": "查看学期",
183
+ "actionLogin": "登录或刷新会话",
184
+ "actionLogout": "退出登录",
185
+ "actionStatus": "登录状态",
186
+ "termPrompt": "学期代码",
187
+ "termPromptHint": "留空使用当前学期,例如 2026:3",
188
+ "unknownCommand": "未知课表命令。可用:login、logout、status、terms、export。",
189
+ "loggedOut": "本地登录状态已清除。",
190
+ "savedStatus": "已保存登录状态{account}。",
191
+ "noSavedStatus": "没有保存的登录状态。",
192
+ "loginSaved": "登录验证成功,状态已保存。",
193
+ "loginOneShot": "登录验证成功;本次未保存登录状态。",
194
+ "loginWillSave": "成功后将保存本地登录状态(承载凭据);如不希望保存,请使用 --one-shot。",
195
+ "sessionRefreshFailed": "操作已完成,但未能刷新本地登录状态的有效期。",
196
+ "candidateTerms": "教务候选学期(不代表每个学期都有个人课表):",
197
+ "semesterNumber": "第{number}学期",
198
+ "expiredRelogin": "已保存的登录状态过期,请重新登录。",
199
+ "studentId": "学号",
200
+ "studentIdHint": "仅发送给学校统一认证",
201
+ "password": "密码",
202
+ "passwordHint": "输入内容不会显示或保存",
203
+ "weekOne": "第一教学周周一(YYYY-MM-DD)",
204
+ "weekOneHint": "教务响应不含开学日期,请按官方校历确认",
205
+ "exported": "已导出 {count} 条课程安排到 {file}",
206
+ "warnings": "有 {count} 条数据未能完整解析;请导入后核对。",
207
+ "unresolvedPractice": "有 {count} 条实践安排缺少已确认的星期/节次,未写入 ICS。",
208
+ "calendarName": "{year}{semester}课表",
209
+ "invalidOption": "选项 {flag} 不适用于当前课表命令。",
210
+ "invalidArguments": "课表命令参数过多;可用:login、logout、status、terms、export。",
211
+ "noSession": "当前没有可用登录状态;请在交互终端运行 `nbtca schedule login`。",
212
+ "invalidCredentials": "学号或密码不正确。",
213
+ "accountLocked": "账户暂时被锁定,请稍后再试或通过学校页面处理。",
214
+ "accountInactive": "账户尚未激活,请先通过学校官方页面激活。",
215
+ "challenge": "学校要求滑块或其他浏览器验证,本次 CLI 登录已安全中止。",
216
+ "sessionExpired": "登录状态已过期,请重新登录。",
217
+ "timeout": "学校服务响应超时。",
218
+ "network": "无法连接学校服务。",
219
+ "untrustedUrl": "学校返回了未授权的登录跳转,已安全中止。",
220
+ "httpError": "学校登录服务返回了错误状态。",
221
+ "loginChanged": "学校登录页结构已经变化,当前版本未提交凭据。",
222
+ "unexpectedResponse": "登录后未能确认有效的教务会话。",
223
+ "missingDates": "教务响应没有可用日期,请用 --week-one=YYYY-MM-DD 指定第一周周一。",
224
+ "missingPeriod": "教务响应缺少课程节次时间,无法安全导出。",
225
+ "termMismatch": "教务系统返回了不同学期,请重试。",
226
+ "invalidData": "课表数据格式暂时无法识别。",
227
+ "unknownTerm": "未知学期;请先运行 `nbtca schedule terms`。",
228
+ "noTerms": "教务系统没有返回可用学期。",
229
+ "currentTermUnknown": "教务没有标出唯一的当前学期;请用 --term=学年:代码 指定。",
230
+ "genericError": "课表操作失败。",
231
+ "hubToday": "今日",
232
+ "hubWeek": "本周",
233
+ "hubSwitchTerm": "切换学期",
234
+ "hubExport": "导出 .ics",
235
+ "hubLogout": "退出登录",
236
+ "hubUnresolved": "待处理事项",
237
+ "unresolvedTitle": "待处理事项",
238
+ "unresolvedEmpty": "没有待处理事项",
239
+ "unresolvedUnknownItem": "未命名安排",
240
+ "nextClass": "下一节",
241
+ "noClassToday": "今天没有课",
242
+ "noNextClass": "没有即将开始的课",
243
+ "nowLabel": "进行中",
244
+ "weekLabel": "第",
245
+ "promptWeekOne": "第一周周一 (YYYY-MM-DD)",
246
+ "menuEntry": "课表",
247
+ "semester1": "第一学期",
248
+ "semester2": "第二学期",
249
+ "weekLabel2": "第 {week} 周",
250
+ "academicYearSuffix": "{year}学年",
251
+ "onBreak": "假期中 · {title}",
252
+ "publicUnavailable": "校历数据暂不可用",
253
+ "daysUntilBreak": "距离{title}还有 {days} 天",
254
+ "publicLoginAction": "登录查看我的课表",
255
+ "publicLoginHint": "登录后可导出课表 (.ics)",
256
+ "weekOneAutoFailed": "未能从校历自动推算学期第一周,请手动确认一次",
257
+ "weekdayMon": "一",
258
+ "weekdayTue": "二",
259
+ "weekdayWed": "三",
260
+ "weekdayThu": "四",
261
+ "weekdayFri": "五",
262
+ "weekdaySat": "六",
263
+ "weekdaySun": "日",
264
+ "todayHeading": "今日 · 周{weekday} · 第{week}教学周",
265
+ "classDone": "已结束",
266
+ "classLive": "进行中",
267
+ "minutesRemaining": "还剩 {minutes} 分钟",
268
+ "timelineEnd": "无",
269
+ "termNotStarted": "本学期尚未开始",
270
+ "termStartsIn": "{date} 开学 · 还有 {days} 天",
271
+ "hubTermDensity": "学期活跃度",
272
+ "termDensityTitle": "学期活跃度",
273
+ "termDensityThisWeek": "本周",
274
+ "weekOverviewTitle": "本周概览",
275
+ "weekAheadClasses": "课程",
276
+ "weekAheadBusy": "较满",
277
+ "weekAheadFree": "较空",
278
+ "weekAheadNone": "无",
279
+ "termPreviewWeek": "第一周预览",
280
+ "hubFullGrid": "完整课表",
281
+ "detailTime": "时间",
282
+ "detailLocation": "地点",
283
+ "detailTeacher": "教师",
284
+ "detailWeeks": "周次",
285
+ "teacherSeparator": "、"
286
+ },
152
287
  "theme": {
153
288
  "current": "当前主题设置",
154
289
  "chooseAction": "设置",
@@ -165,12 +300,13 @@
165
300
  "updated": "主题设置已更新",
166
301
  "updatedSessionOnly": "主题设置仅在当前会话生效(无法写入配置文件)",
167
302
  "reset": "主题设置已重置",
303
+ "resetLabel": "重置",
168
304
  "resetSessionOnly": "主题设置仅在当前会话重置(无法写入配置文件)",
169
305
  "usage": "用法: nbtca theme | nbtca theme icon <auto|ascii|unicode> | nbtca theme color <auto|on|off> | nbtca theme reset",
170
306
  "invalidValue": "无效取值,可选:"
171
307
  },
172
308
  "language": {
173
- "selectLanguage": "选择语言:",
309
+ "selectLanguage": "语言",
174
310
  "zh": "简体中文",
175
311
  "en": "English",
176
312
  "changed": "语言已切换",
@@ -195,11 +331,15 @@
195
331
  "cmdTheme": "查看或设置主题",
196
332
  "cmdLang": "设置语言",
197
333
  "cmdUpdate": "检查更新",
334
+ "cmdSchedule": "个人课表登录、学期查询与 ICS 导出",
198
335
  "flagVersion": "显示版本号",
199
336
  "flagHelp": "显示帮助",
200
337
  "flagOpen": "在浏览器中打开(URL 命令)",
201
338
  "flagJson": "JSON 输出(events, status)",
202
339
  "flagToday": "仅显示今日(events)",
340
+ "flagWeek": "本周活动",
341
+ "flagMonth": "本月活动",
342
+ "flagSearch": "按关键词过滤活动",
203
343
  "flagNext": "限制为前 N 个(events)",
204
344
  "flagWatch": "实时刷新(status)",
205
345
  "flagInterval": "刷新间隔(status --watch)",
@@ -208,6 +348,11 @@
208
348
  "flagHeatmap": "活动热力图 (events)",
209
349
  "flagPlain": "禁用颜色",
210
350
  "flagNoLogo": "跳过 Logo",
351
+ "flagOneShot": "不读取或保存登录状态",
352
+ "flagNoSave": "--one-shot 的别名",
353
+ "flagTerm": "选择学年学期(例如 2026:3)",
354
+ "flagOutput": "ICS 输出路径",
355
+ "flagWeekOne": "第一教学周周一(教务未返回日期时使用)",
211
356
  "unknownCommand": "未知命令: {command}",
212
357
  "unknownCommandHint": "运行 `nbtca --help` 查看可用命令。",
213
358
  "unknownFlag": "未知选项: {flag}",
package/dist/index.js CHANGED
@@ -15,6 +15,7 @@ import { setLanguage, t, fmt } from './i18n/index.js';
15
15
  import { clearScreen, handleGracefulExit } from './core/ui.js';
16
16
  import { APP_INFO, URLS } from './config/data.js';
17
17
  import { runUpdateCheck } from './features/update.js';
18
+ import { runStudentTimetableCommand } from './features/student-timetable.js';
18
19
  const ACTION_ALIASES = {
19
20
  events: 'events',
20
21
  event: 'events',
@@ -36,8 +37,11 @@ const URL_ACTIONS = {
36
37
  github: URLS.github,
37
38
  roadmap: URLS.roadmap
38
39
  };
39
- const KNOWN_FLAGS = new Set(['--help', '--version', '--open', '--json', '--plain', '--no-logo', '--watch', '--today', '--heatmap']);
40
- const KNOWN_FLAG_PREFIXES = ['--interval=', '--timeout=', '--retries=', '--next='];
40
+ const KNOWN_FLAGS = new Set([
41
+ '--help', '--version', '--open', '--json', '--plain', '--no-logo', '--watch', '--today', '--heatmap',
42
+ '--week', '--month', '--one-shot', '--no-save',
43
+ ]);
44
+ const KNOWN_FLAG_PREFIXES = ['--interval=', '--timeout=', '--retries=', '--next=', '--search=', '--term=', '--output=', '--week-one='];
41
45
  const STATUS_WATCH_INTERVAL_MIN = 3;
42
46
  const STATUS_WATCH_INTERVAL_MAX = 300;
43
47
  const STATUS_TIMEOUT_MIN = 1000;
@@ -75,6 +79,11 @@ function getAllowedFlagsFor(command) {
75
79
  return allowed;
76
80
  if (command === 'theme')
77
81
  return allowed;
82
+ if (command === 'schedule' || command === 'timetable') {
83
+ allowed.add('--one-shot');
84
+ allowed.add('--no-save');
85
+ return allowed;
86
+ }
78
87
  const action = ACTION_ALIASES[command];
79
88
  if (!action)
80
89
  return allowed;
@@ -83,6 +92,8 @@ function getAllowedFlagsFor(command) {
83
92
  allowed.add('--json');
84
93
  allowed.add('--today');
85
94
  allowed.add('--heatmap');
95
+ allowed.add('--week');
96
+ allowed.add('--month');
86
97
  return allowed;
87
98
  case 'status':
88
99
  allowed.add('--json');
@@ -103,9 +114,12 @@ function getAllowedFlagsFor(command) {
103
114
  function getAllowedFlagPrefixesFor(command) {
104
115
  if (!command)
105
116
  return [];
117
+ if (command === 'schedule' || command === 'timetable') {
118
+ return ['--term=', '--output=', '--week-one='];
119
+ }
106
120
  const action = ACTION_ALIASES[command];
107
121
  if (action === 'events')
108
- return ['--next='];
122
+ return ['--next=', '--search='];
109
123
  if (action === 'status')
110
124
  return ['--interval=', '--timeout=', '--retries='];
111
125
  return [];
@@ -149,6 +163,8 @@ function printHelp() {
149
163
  console.log(` events ${trans.menu.eventsDesc}`);
150
164
  console.log(` docs ${trans.menu.docsDesc}`);
151
165
  console.log(` status ${trans.menu.statusDesc}`);
166
+ console.log(' schedule <login|logout|status|terms|export>');
167
+ console.log(` ${c.cmdSchedule}`);
152
168
  console.log(` website ${c.cmdWebsite}`);
153
169
  console.log(` github ${c.cmdGithub}`);
154
170
  console.log(` roadmap ${c.cmdRoadmap}`);
@@ -164,6 +180,9 @@ function printHelp() {
164
180
  console.log(` --json ${c.flagJson}`);
165
181
  console.log(` --heatmap ${c.flagHeatmap}`);
166
182
  console.log(` --today ${c.flagToday}`);
183
+ console.log(` --week ${c.flagWeek}`);
184
+ console.log(` --month ${c.flagMonth}`);
185
+ console.log(` --search=<q> ${c.flagSearch}`);
167
186
  console.log(` --next=<n> ${c.flagNext}`);
168
187
  console.log(` --watch ${c.flagWatch}`);
169
188
  console.log(` --interval=<s> ${c.flagInterval}`);
@@ -171,6 +190,11 @@ function printHelp() {
171
190
  console.log(` --retries=<n> ${c.flagRetries}`);
172
191
  console.log(` --plain ${c.flagPlain}`);
173
192
  console.log(` --no-logo ${c.flagNoLogo}`);
193
+ console.log(` --one-shot ${c.flagOneShot}`);
194
+ console.log(` --no-save ${c.flagNoSave}`);
195
+ console.log(` --term=<year:code> ${c.flagTerm}`);
196
+ console.log(` --output=<path> ${c.flagOutput}`);
197
+ console.log(` --week-one=<date> ${c.flagWeekOne}`);
174
198
  }
175
199
  async function runEventsCommand(flags) {
176
200
  if (flags.has('--heatmap')) {
@@ -184,7 +208,26 @@ async function runEventsCommand(flags) {
184
208
  }
185
209
  return;
186
210
  }
187
- let events = await fetchEvents();
211
+ const { weekRange, monthRange } = await import('./features/calendar-query.js');
212
+ const { fetchInRange } = await import('./features/calendar.js');
213
+ const now0 = new Date();
214
+ let events;
215
+ if (flags.has('--week')) {
216
+ const r = weekRange(now0);
217
+ events = await fetchInRange(r.start, r.end);
218
+ }
219
+ else if (flags.has('--month')) {
220
+ const r = monthRange(now0);
221
+ events = await fetchInRange(r.start, r.end);
222
+ }
223
+ else {
224
+ events = await fetchEvents();
225
+ }
226
+ const searchFlag = Array.from(flags).find(f => f.startsWith('--search='));
227
+ if (searchFlag) {
228
+ const q = searchFlag.slice('--search='.length).toLowerCase();
229
+ events = events.filter(e => `${e.title} ${e.location}`.toLowerCase().includes(q));
230
+ }
188
231
  if (flags.has('--today')) {
189
232
  const now = new Date();
190
233
  events = events.filter(e => {
@@ -357,6 +400,17 @@ async function runCommandMode(argv) {
357
400
  await runUpdateCheck();
358
401
  return;
359
402
  }
403
+ if (command === 'schedule' || command === 'timetable') {
404
+ if (args.length > 1) {
405
+ console.error(chalk.red(t().timetable.invalidArguments));
406
+ process.exitCode = 1;
407
+ return;
408
+ }
409
+ const exitCode = await runStudentTimetableCommand(args[0], { flags });
410
+ if (exitCode !== 0)
411
+ process.exitCode = exitCode;
412
+ return;
413
+ }
360
414
  const action = ACTION_ALIASES[command];
361
415
  if (!action) {
362
416
  const cliT = t().cli;
@@ -390,7 +444,7 @@ async function runCommandMode(argv) {
390
444
  return;
391
445
  }
392
446
  if (action === 'about') {
393
- const { note } = await import('@clack/prompts');
447
+ const { note } = await import('./core/components/note.js');
394
448
  const { padEndV } = await import('./core/text.js');
395
449
  const pad = 12;
396
450
  const row = (label, value) => `${chalk.dim(padEndV(label, pad))}${value}`;
@@ -0,0 +1,26 @@
1
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⡶⠶⠾⠟⠛⠛⠛⠛⠻⠷⠶⢶⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
2
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⠾⠛⢩⠥⠀⠤⡄⡔⡖⡆⡖⡆⡆⡄⡖⣠⣄⣀⠈⠉⠛⠷⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
3
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡶⠟⠉⠀⠀⠀⠘⠤⠂⢑⣁⣁⣥⣤⣧⣤⣤⣤⣁⣁⡀⠃⠀⠴⢿⢀⣀⠉⠛⢶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
4
+ ⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠉⡰⣄⢛⠆⢂⣠⡴⠶⠛⠋⠉⠁⠀⠀⠀⠀⠀⠀⠈⠉⠙⠛⠶⢦⣌⡐⠃⣰⡂⣀⠉⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀
5
+ ⠀⠀⠀⠀⠀⢀⣴⠟⠁⠠⣮⡣⠈⣡⡶⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢶⣄⡘⠴⡡⢄⠈⠻⣦⡀⠀⠀⠀⠀⠀
6
+ ⠀⠀⠀⠀⢠⡾⠃⣐⢤⡀⢉⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⡁⠔⣣⡄⠘⢷⡄⠀⠀⠀⠀
7
+ ⠀⠀⠀⣰⡟⠀⡄⠨⠇⣠⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣆⠙⡥⣂⠄⢻⣆⠀⠀⠀
8
+ ⠀⠀⣰⡟⠀⢖⣪⢁⣼⣯⠴⠖⠚⠛⠛⠛⠓⠒⠦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⠴⠖⠒⠛⠛⠒⠲⠶⢤⣀⠀⠙⣧⡈⣕⣲⠀⢻⣆⠀⠀
9
+ ⠀⢰⡟⠠⢌⡱⣠⡞⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠢⡀⠀⠀⠀⠀⣠⠞⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠓⢦⡈⢷⡀⢒⡣⠀⢻⡆⠀
10
+ ⠀⣿⠁⠬⠕⣶⣿⣿⣿⣆⠀⢀⣠⡤⠤⠤⠤⢤⣀⡀⠀⠀⠙⣆⠀⠀⣼⣿⣿⣷⡄⠀⢀⣀⣤⠤⠤⢤⣄⣀⠀⠀⠀⠳⡜⣧⠀⡀⢀⠈⣿⠀
11
+ ⢸⡏⠠⠤⡄⢿⣿⣿⣿⣿⠞⠋⠁⠀⠀⠀⠀⠀⠀⠙⠦⣀⠀⣸⠀⠀⣿⣿⣿⣿⣷⠞⠋⠁⠀⠀⠀⠀⠀⠈⠓⢤⡀⠀⣷⢹⡆⢓⣪⣄⢹⡇
12
+ ⣾⠇⢠⠵⠁⣼⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠀⠀⠉⠛⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠁⠈⣧⠀⣀⣀⠸⣷
13
+ ⣿⠀⢨⡤⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠴⠥⠀⣿
14
+ ⣿⠀⠈⠉⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⣉⣏⠀⣿
15
+ ⢿⡆⠈⠴⠒⢿⡀⠀⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⠀⠀⢀⡟⠠⠤⢴⢰⡿
16
+ ⢸⣇⠀⠯⠍⠻⣇⠀⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠇⠀⠀⣸⠇⠀⠀⠈⣸⡇
17
+ ⠀⣿⡀⠸⠩⠂⢻⡄⠈⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⠀⠀⢠⡟⠀⠤⣠⢀⣿⠀
18
+ ⠀⠸⣧⠐⢨⠁⡄⢷⡀⠈⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⠁⠀⢀⡾⠁⢏⡱⠈⣼⠇⠀
19
+ ⠀⠀⠹⣧⠈⢩⢒⡈⢻⡄⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠞⠀⠀⢠⡟⢡⠦⣄⠀⣼⠏⠀⠀
20
+ ⠀⠀⠀⠹⣧⡀⠡⣊⠄⠙⣦⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⠀⢀⣴⠏⠰⣺⠉⢀⣼⠏⠀⠀⠀
21
+ ⠀⠀⠀⠀⠘⢷⡌⠁⠤⢇⢈⠻⣦⡀⠈⠓⢦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡴⠛⠁⠀⢀⣴⠟⢡⡢⡀⠀⢠⡾⠃⠀⠀⠀⠀
22
+ ⠀⠀⠀⠀⠀⠈⠻⣦⡀⠑⢋⠔⠀⠙⠶⣄⡀⠈⠙⠛⠶⠦⣤⣤⣤⣤⣤⣤⣤⠴⠶⠚⠉⠁⠀⢀⣠⠶⠋⣁⠈⠳⠍⢀⣴⠟⠁⠀⠀⠀⠀⠀
23
+ ⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⣀⠀⠴⢱⢲⠈⠙⠓⠶⣤⣄⣀⡀⠀⠀⠀⠀⠀⠀⢀⣀⣠⣤⠶⠞⠋⠥⡰⣘⢌⠂⣀⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀
24
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠷⣦⣀⠁⠀⠎⡔⡔⢢⠈⢉⢉⡛⠛⠛⠛⠛⠛⢉⡉⡅⡄⢂⢂⠀⠓⠃⣀⣴⠾⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
25
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⢶⣤⣀⡈⠁⠃⠆⠠⠆⠶⠇⠕⠇⠼⠐⠙⠸⠈⢁⣀⣤⡶⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
26
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠷⠶⢶⣦⣤⣤⣤⣤⣴⡶⠶⠾⠛⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
@@ -0,0 +1,12 @@
1
+ ⠀⠀⠀⠀⠀⠀⣠⠤⠒⠊⠉⢉⢉⢉⡑⠒⠤⣄⠀⠀⠀⠀⠀⠀
2
+ ⠀⠀⠀⢀⠔⠉⠄⣀⠥⠒⠒⠊⠐⠒⠒⠤⣁⠢⡉⠢⡀⠀⠀⠀
3
+ ⠀⠀⡔⢁⢈⠔⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠢⡀⡈⢢⠀⠀
4
+ ⠀⡞⠠⢠⠇⠒⠒⠒⠂⢄⠀⠀⠀⡠⠄⠒⠒⠂⠤⡘⡄⢀⢳⠀
5
+ ⡸⠀⢺⣷⣆⠤⠐⠒⠠⠀⠱⠀⣾⣶⡠⠄⠐⠀⠄⠈⠺⡄⡀⢇
6
+ ⡇⠀⠸⠉⠁⠀⠀⠀⠀⠀⠉⠀⠉⠉⠀⠀⠀⠀⠀⠈⠁⠇⠀⢸
7
+ ⡇⠠⢰⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡆⠙⢸
8
+ ⢱⠐⠉⡄⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠇⢠⠃⠀⡎
9
+ ⠀⢧⠠⠘⡌⠢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠊⢠⢃⠄⡼⠀
10
+ ⠀⠀⠣⡀⢨⠢⣈⠢⢄⣀⠀⠀⠀⢀⣀⠤⠊⣀⠔⡡⢉⠜⠀⠀
11
+ ⠀⠀⠀⠈⠢⣐⠀⢉⡒⠤⠬⠍⠩⠤⠤⠒⠉⠀⣀⠔⠁⠀⠀⠀
12
+ ⠀⠀⠀⠀⠀⠀⠙⠒⠤⢅⣀⣀⣁⣈⡨⠤⠒⠋⠀⠀⠀⠀⠀⠀
@@ -1,16 +1,18 @@
1
- ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⡶⢞⢛⣛⣛⣛⣛⣛⡳⠶⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀
2
- ⠀⠀⠀⠀⠀⢀⣤⠾⡋⠁⠘⢽⣛⣿⣯⣿⣭⣯⣿⣛⡁⢴⣮⡝⠷⣤⡀⠀⠀⠀⠀⠀
3
- ⠀⠀⠀⢀⣴⢟⣵⡿⣻⡵⠞⠋⠉⠀⠀⠀⠀⠀⠀⠉⠙⠳⢮⣟⢷⣎⡻⣦⡀⠀⠀⠀
4
- ⠀⠀⣠⡟⣵⡦⣩⠞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣝⢿⣎⣻⣄⠀⠀
5
- ⠀⣰⠏⣼⣎⣾⡥⠶⠶⠶⠶⢤⣀⠀⠀⠀⠀⠀⣠⡤⠶⠶⠶⠦⣄⡈⢷⣻⣯⠹⣆⠀
6
- ⢰⣟⣾⣿⣾⣥⠀⢀⣀⣀⣀⡀⠈⠳⡄⠀⣴⣯⣅⠀⢀⣀⣀⣀⠀⠙⢮⣷⡹⣃⢻⡆
7
- ⣾⢱⣬⣿⣿⣿⠟⠋⠉⠀⠈⠉⠳⣄⣿⠐⣿⣿⣿⠞⠉⠉⠉⠉⠙⢦⣀⡟⣧⠿⠬⣷
8
- ⣿⢸⡅⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⢰⣶⣿
9
- ⣿⢨⣁⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⢸⢿⣿
10
- ⢿⡸⣿⢿⡄⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠃⢠⡟⠈⢉⡿
11
- ⠸⣧⢷⣏⢷⠘⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠀⡾⣭⡷⣿⠇
12
- ⠀⠹⣎⢽⣎⢷⡘⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠋⢀⡾⣵⡦⣰⠏⠀
13
- ⠀⠀⠙⣧⡻⣷⣝⢦⡙⠲⣤⣀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡴⠋⢁⡴⣫⣌⢛⣼⠋⠀⠀
14
- ⠀⠀⠀⠈⠻⣮⡿⣡⣽⡳⢤⣍⡙⠓⠒⠶⠖⠒⠛⢉⣡⡤⣞⣫⣦⢙⣵⠟⠁⠀⠀⠀
15
- ⠀⠀⠀⠀⠀⠈⠛⢷⣍⡁⠷⣞⣭⣟⣟⣟⣛⢛⣿⣭⣵⠆⢛⣩⡷⠛⠁⠀⠀⠀⠀⠀
16
- ⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠶⢯⣭⣭⣭⣭⣭⣭⡽⠶⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
1
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⠤⠶⠒⠛⠛⢛⠛⠛⠛⠒⠶⠤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
2
+ ⠀⠀⠀⠀⠀⠀⠀⣠⡴⠚⠉⠀⢎⠔⠕⢃⣊⣐⣋⣚⣃⠛⠄⢀⣴⢉⠓⢦⣄⠀⠀⠀⠀⠀⠀⠀
3
+ ⠀⠀⠀⠀⠀⣠⠞⢁⠂⠲⣀⡤⠖⠚⠉⠉⠀⠀⠀⠀⠉⠉⠓⠲⢬⣘⠰⠂⠈⠳⣄⠀⠀⠀⠀⠀
4
+ ⠀⠀⠀⣠⠞⢁⠈⢕⡠⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠓⢬⡡⠡⠈⠳⣄⠀⠀⠀
5
+ ⠀⠀⣰⠋⢄⠑⣠⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣌⠪⡂⠙⣆⠀⠀
6
+ ⠀⣰⠃⠸⠁⡼⠓⠋⠉⠁⠀⠉⠉⠒⢄⠀⠀⠀⠀⢀⠴⠒⠉⠉⠉⠉⠉⠒⢤⡈⢧⠈⠃⠘⣆⠀
7
+ ⢠⡇⠴⢫⣾⣶⣆⠀⣀⠤⠤⠤⢄⡀⠀⠑⡄⠀⣴⣷⣦⠀⢀⣀⠤⠤⢄⡀⠀⠈⢎⣇⢈⢀⢸⡄
8
+ ⣼⠀⠒⢸⣿⣿⠟⠉⠀⠀⠀⠀⠀⠈⠢⠤⠇⠀⢿⣿⡿⠋⠁⠀⠀⠀⠀⠈⠑⢄⡸⢸⡌⠑⠂⣧
9
+ ⣿⢀⣉⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠠⠂⣿
10
+ ⣿⠀⣉⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠫⠅⣿
11
+ ⢻⠀⣕⠺⡇⠸⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠇⠀⢸⠃⠉⠁⡟
12
+ ⠘⡇⠨⡅⢹⡀⢣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⠀⢀⡏⣀⠤⢸⠃
13
+ ⠀⠹⡄⠪⡂⠳⡀⠳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡜⠁⢀⡞⣀⠀⢠⠏⠀
14
+ ⠀⠀⠹⣄⢩⡢⡙⢄⠈⠢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⠊⠀⣠⠋⢔⠄⣡⠏⠀⠀
15
+ ⠀⠀⠀⠙⢦⡀⢢⢆⠑⢤⡈⠑⠦⢄⣀⡀⠀⠀⠀⠀⣀⣠⠤⠒⠉⢀⡤⠚⢕⠵⢀⡴⠋⠀⠀⠀
16
+ ⠀⠀⠀⠀⠀⠙⢦⡁⠠⠀⡌⠓⠦⢤⣀⣉⠉⠉⠉⠉⣀⣀⡤⠴⠚⢉⢔⠕⢀⡴⠋⠀⠀⠀⠀⠀
17
+ ⠀⠀⠀⠀⠀⠀⠀⠙⠳⢤⣀⠂⠱⠄⢄⠈⣍⢍⣭⢩⢁⣤⠢⠞⠀⣉⡤⠞⠋⠀⠀⠀⠀⠀⠀⠀
18
+ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠒⠶⠤⣤⣤⣥⣬⣤⣤⠤⠶⠒⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Binary file
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
1
- import { printLogo } from './core/logo.js';
1
+ import { runStartup } from './core/logo.js';
2
2
  import { clearScreen, handleGracefulExit } from './core/ui.js';
3
3
  import { showMainMenu } from './core/menu.js';
4
4
  import { c } from './core/theme.js';
@@ -12,19 +12,39 @@ export async function main(options = {}) {
12
12
  clearScreen();
13
13
  }
14
14
  if (!options.skipLogo) {
15
- printLogo();
15
+ await runStartup();
16
+ }
17
+ // Fire update check in background; events fetch provides natural wait time.
18
+ // Its own AbortController is tied to whichever path finishes first, so a
19
+ // still-in-flight request never keeps the process alive after we're done
20
+ // with (or have stopped caring about) its result.
21
+ const updateAbort = new AbortController();
22
+ const updatePromise = checkForUpdate(updateAbort.signal);
23
+ if (process.stdin.isTTY && process.stdout.isTTY) {
24
+ // Launch app shell for interactive terminals
25
+ const { runApp } = await import('./app/app.js');
26
+ await runApp();
27
+ updateAbort.abort();
28
+ }
29
+ else {
30
+ // Classic path for non-TTY (CI, pipes, redirects)
31
+ await showEventsPreview();
32
+ try {
33
+ const line = (await import('./features/schedule-view.js')).peekNextClassLine();
34
+ if (line)
35
+ console.log(line);
36
+ }
37
+ catch { /* best effort */ }
38
+ // Update check is very likely done by now; give it a short window if not
39
+ const updateMsg = await Promise.race([
40
+ updatePromise,
41
+ new Promise(r => setTimeout(r, 100, null)),
42
+ ]);
43
+ updateAbort.abort();
44
+ if (updateMsg)
45
+ console.log(c.warn(updateMsg));
46
+ await showMainMenu();
16
47
  }
17
- // Fire update check in background; events fetch provides natural wait time
18
- const updatePromise = checkForUpdate();
19
- await showEventsPreview();
20
- // Update check is very likely done by now; give it a short window if not
21
- const updateMsg = await Promise.race([
22
- updatePromise,
23
- new Promise(r => setTimeout(r, 100, null)),
24
- ]);
25
- if (updateMsg)
26
- console.log(c.warn(updateMsg));
27
- await showMainMenu();
28
48
  }
29
49
  catch (err) {
30
50
  handleGracefulExit(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nbtca/prompt",
3
- "version": "1.3.1",
3
+ "version": "1.4.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -14,6 +14,7 @@
14
14
  "dist",
15
15
  "bin/nbtca-welcome.js",
16
16
  "README.md",
17
+ "SECURITY.md",
17
18
  "LICENSE"
18
19
  ],
19
20
  "scripts": {
@@ -38,21 +39,23 @@
38
39
  "interactive"
39
40
  ],
40
41
  "dependencies": {
41
- "@clack/prompts": "^1.2.0",
42
- "@nbtca/docs": "^0.2.0",
43
- "@nbtca/nbtcal": "^0.3.0",
42
+ "@nbtca/docs": "^0.2.2",
43
+ "@nbtca/nbtcal": "^0.3.5",
44
44
  "chalk": "^5.6.2",
45
+ "cheerio": "1.0.0",
46
+ "fetch-cookie": "^3.2.0",
45
47
  "gradient-string": "^3.0.0",
46
48
  "marked": "^15.0.12",
47
49
  "marked-terminal": "^7.0.0",
48
- "open": "^11.0.0"
50
+ "open": "^11.0.0",
51
+ "tough-cookie": "^6.0.2"
49
52
  },
50
53
  "devDependencies": {
51
54
  "@types/gradient-string": "^1.1.6",
52
55
  "@types/node": "^22.19.17",
53
56
  "tsx": "^4.21.0",
54
57
  "typescript": "^5.9.3",
55
- "vitest": "^3.2.4"
58
+ "vitest": "^3.2.7"
56
59
  },
57
60
  "engines": {
58
61
  "node": ">=20.12.0"
@@ -64,7 +67,7 @@
64
67
  },
65
68
  "repository": {
66
69
  "type": "git",
67
- "url": "https://github.com/nbtca/prompt.git"
70
+ "url": "git+https://github.com/nbtca/prompt.git"
68
71
  },
69
72
  "bugs": {
70
73
  "url": "https://github.com/nbtca/prompt/issues"