@jonit-dev/night-watch-cli 1.7.9 → 1.7.11

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 (350) hide show
  1. package/LICENSE +1 -1
  2. package/dist/cli.js +3 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/dashboard/tab-config.d.ts.map +1 -1
  5. package/dist/commands/dashboard/tab-config.js +9 -1
  6. package/dist/commands/dashboard/tab-config.js.map +1 -1
  7. package/dist/commands/doctor.d.ts.map +1 -1
  8. package/dist/commands/doctor.js +3 -0
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/init.d.ts.map +1 -1
  11. package/dist/commands/init.js +131 -19
  12. package/dist/commands/init.js.map +1 -1
  13. package/dist/commands/install.d.ts +4 -0
  14. package/dist/commands/install.d.ts.map +1 -1
  15. package/dist/commands/install.js +24 -0
  16. package/dist/commands/install.js.map +1 -1
  17. package/dist/commands/qa.d.ts +30 -0
  18. package/dist/commands/qa.d.ts.map +1 -0
  19. package/dist/commands/qa.js +159 -0
  20. package/dist/commands/qa.js.map +1 -0
  21. package/dist/commands/review.d.ts +5 -0
  22. package/dist/commands/review.d.ts.map +1 -1
  23. package/dist/commands/review.js +40 -0
  24. package/dist/commands/review.js.map +1 -1
  25. package/dist/commands/run.d.ts +11 -0
  26. package/dist/commands/run.d.ts.map +1 -1
  27. package/dist/commands/run.js +56 -1
  28. package/dist/commands/run.js.map +1 -1
  29. package/dist/commands/status.d.ts.map +1 -1
  30. package/dist/commands/status.js +3 -0
  31. package/dist/commands/status.js.map +1 -1
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +155 -1
  34. package/dist/config.js.map +1 -1
  35. package/dist/constants.d.ts +20 -1
  36. package/dist/constants.d.ts.map +1 -1
  37. package/dist/constants.js +40 -0
  38. package/dist/constants.js.map +1 -1
  39. package/dist/server/index.d.ts.map +1 -1
  40. package/dist/server/index.js +47 -5
  41. package/dist/server/index.js.map +1 -1
  42. package/dist/shared/types.d.ts +223 -0
  43. package/dist/shared/types.d.ts.map +1 -0
  44. package/dist/shared/types.js +7 -0
  45. package/dist/shared/types.js.map +1 -0
  46. package/dist/src/agents/soul-compiler.d.ts +11 -0
  47. package/dist/src/agents/soul-compiler.d.ts.map +1 -0
  48. package/dist/src/agents/soul-compiler.js +103 -0
  49. package/dist/src/agents/soul-compiler.js.map +1 -0
  50. package/dist/src/board/factory.d.ts +3 -0
  51. package/dist/src/board/factory.d.ts.map +1 -0
  52. package/dist/src/board/factory.js +10 -0
  53. package/dist/src/board/factory.js.map +1 -0
  54. package/dist/src/board/providers/github-graphql.d.ts +16 -0
  55. package/dist/src/board/providers/github-graphql.d.ts.map +1 -0
  56. package/dist/src/board/providers/github-graphql.js +43 -0
  57. package/dist/src/board/providers/github-graphql.js.map +1 -0
  58. package/dist/src/board/providers/github-projects.d.ts +51 -0
  59. package/dist/src/board/providers/github-projects.d.ts.map +1 -0
  60. package/dist/src/board/providers/github-projects.js +672 -0
  61. package/dist/src/board/providers/github-projects.js.map +1 -0
  62. package/dist/src/board/types.d.ts +60 -0
  63. package/dist/src/board/types.d.ts.map +1 -0
  64. package/dist/src/board/types.js +4 -0
  65. package/dist/src/board/types.js.map +1 -0
  66. package/dist/src/cli.d.ts +3 -0
  67. package/dist/src/cli.d.ts.map +1 -0
  68. package/dist/src/cli.js +80 -0
  69. package/dist/src/cli.js.map +1 -0
  70. package/dist/src/commands/board.d.ts +9 -0
  71. package/dist/src/commands/board.d.ts.map +1 -0
  72. package/dist/src/commands/board.js +294 -0
  73. package/dist/src/commands/board.js.map +1 -0
  74. package/dist/src/commands/cancel.d.ts +46 -0
  75. package/dist/src/commands/cancel.d.ts.map +1 -0
  76. package/dist/src/commands/cancel.js +241 -0
  77. package/dist/src/commands/cancel.js.map +1 -0
  78. package/dist/src/commands/dashboard/tab-actions.d.ts +10 -0
  79. package/dist/src/commands/dashboard/tab-actions.d.ts.map +1 -0
  80. package/dist/src/commands/dashboard/tab-actions.js +245 -0
  81. package/dist/src/commands/dashboard/tab-actions.js.map +1 -0
  82. package/dist/src/commands/dashboard/tab-config.d.ts +21 -0
  83. package/dist/src/commands/dashboard/tab-config.d.ts.map +1 -0
  84. package/dist/src/commands/dashboard/tab-config.js +829 -0
  85. package/dist/src/commands/dashboard/tab-config.js.map +1 -0
  86. package/dist/src/commands/dashboard/tab-logs.d.ts +10 -0
  87. package/dist/src/commands/dashboard/tab-logs.d.ts.map +1 -0
  88. package/dist/src/commands/dashboard/tab-logs.js +178 -0
  89. package/dist/src/commands/dashboard/tab-logs.js.map +1 -0
  90. package/dist/src/commands/dashboard/tab-schedules.d.ts +21 -0
  91. package/dist/src/commands/dashboard/tab-schedules.d.ts.map +1 -0
  92. package/dist/src/commands/dashboard/tab-schedules.js +304 -0
  93. package/dist/src/commands/dashboard/tab-schedules.js.map +1 -0
  94. package/dist/src/commands/dashboard/tab-status.d.ts +32 -0
  95. package/dist/src/commands/dashboard/tab-status.d.ts.map +1 -0
  96. package/dist/src/commands/dashboard/tab-status.js +421 -0
  97. package/dist/src/commands/dashboard/tab-status.js.map +1 -0
  98. package/dist/src/commands/dashboard/types.d.ts +43 -0
  99. package/dist/src/commands/dashboard/types.d.ts.map +1 -0
  100. package/dist/src/commands/dashboard/types.js +5 -0
  101. package/dist/src/commands/dashboard/types.js.map +1 -0
  102. package/dist/src/commands/dashboard.d.ts +11 -0
  103. package/dist/src/commands/dashboard.d.ts.map +1 -0
  104. package/dist/src/commands/dashboard.js +239 -0
  105. package/dist/src/commands/dashboard.js.map +1 -0
  106. package/dist/src/commands/doctor.d.ts +16 -0
  107. package/dist/src/commands/doctor.d.ts.map +1 -0
  108. package/dist/src/commands/doctor.js +202 -0
  109. package/dist/src/commands/doctor.js.map +1 -0
  110. package/dist/src/commands/history.d.ts +7 -0
  111. package/dist/src/commands/history.d.ts.map +1 -0
  112. package/dist/src/commands/history.js +56 -0
  113. package/dist/src/commands/history.js.map +1 -0
  114. package/dist/src/commands/init.d.ts +25 -0
  115. package/dist/src/commands/init.d.ts.map +1 -0
  116. package/dist/src/commands/init.js +543 -0
  117. package/dist/src/commands/init.js.map +1 -0
  118. package/dist/src/commands/install.d.ts +48 -0
  119. package/dist/src/commands/install.d.ts.map +1 -0
  120. package/dist/src/commands/install.js +303 -0
  121. package/dist/src/commands/install.js.map +1 -0
  122. package/dist/src/commands/logs.d.ts +15 -0
  123. package/dist/src/commands/logs.d.ts.map +1 -0
  124. package/dist/src/commands/logs.js +104 -0
  125. package/dist/src/commands/logs.js.map +1 -0
  126. package/dist/src/commands/prd-state.d.ts +12 -0
  127. package/dist/src/commands/prd-state.d.ts.map +1 -0
  128. package/dist/src/commands/prd-state.js +47 -0
  129. package/dist/src/commands/prd-state.js.map +1 -0
  130. package/dist/src/commands/prd.d.ts +24 -0
  131. package/dist/src/commands/prd.d.ts.map +1 -0
  132. package/dist/src/commands/prd.js +283 -0
  133. package/dist/src/commands/prd.js.map +1 -0
  134. package/dist/src/commands/prds.d.ts +13 -0
  135. package/dist/src/commands/prds.d.ts.map +1 -0
  136. package/dist/src/commands/prds.js +196 -0
  137. package/dist/src/commands/prds.js.map +1 -0
  138. package/dist/src/commands/prs.d.ts +14 -0
  139. package/dist/src/commands/prs.d.ts.map +1 -0
  140. package/dist/src/commands/prs.js +106 -0
  141. package/dist/src/commands/prs.js.map +1 -0
  142. package/dist/src/commands/qa.d.ts +30 -0
  143. package/dist/src/commands/qa.d.ts.map +1 -0
  144. package/dist/src/commands/qa.js +159 -0
  145. package/dist/src/commands/qa.js.map +1 -0
  146. package/dist/src/commands/retry.d.ts +9 -0
  147. package/dist/src/commands/retry.d.ts.map +1 -0
  148. package/dist/src/commands/retry.js +72 -0
  149. package/dist/src/commands/retry.js.map +1 -0
  150. package/dist/src/commands/review.d.ts +35 -0
  151. package/dist/src/commands/review.d.ts.map +1 -0
  152. package/dist/src/commands/review.js +252 -0
  153. package/dist/src/commands/review.js.map +1 -0
  154. package/dist/src/commands/run.d.ts +61 -0
  155. package/dist/src/commands/run.d.ts.map +1 -0
  156. package/dist/src/commands/run.js +364 -0
  157. package/dist/src/commands/run.js.map +1 -0
  158. package/dist/src/commands/serve.d.ts +7 -0
  159. package/dist/src/commands/serve.d.ts.map +1 -0
  160. package/dist/src/commands/serve.js +27 -0
  161. package/dist/src/commands/serve.js.map +1 -0
  162. package/dist/src/commands/slice.d.ts +26 -0
  163. package/dist/src/commands/slice.d.ts.map +1 -0
  164. package/dist/src/commands/slice.js +175 -0
  165. package/dist/src/commands/slice.js.map +1 -0
  166. package/dist/src/commands/state.d.ts +8 -0
  167. package/dist/src/commands/state.d.ts.map +1 -0
  168. package/dist/src/commands/state.js +56 -0
  169. package/dist/src/commands/state.js.map +1 -0
  170. package/dist/src/commands/status.d.ts +14 -0
  171. package/dist/src/commands/status.d.ts.map +1 -0
  172. package/dist/src/commands/status.js +147 -0
  173. package/dist/src/commands/status.js.map +1 -0
  174. package/dist/src/commands/uninstall.d.ts +25 -0
  175. package/dist/src/commands/uninstall.d.ts.map +1 -0
  176. package/dist/src/commands/uninstall.js +141 -0
  177. package/dist/src/commands/uninstall.js.map +1 -0
  178. package/dist/src/commands/update.d.ts +21 -0
  179. package/dist/src/commands/update.d.ts.map +1 -0
  180. package/dist/src/commands/update.js +87 -0
  181. package/dist/src/commands/update.js.map +1 -0
  182. package/dist/src/config.d.ts +23 -0
  183. package/dist/src/config.d.ts.map +1 -0
  184. package/dist/src/config.js +629 -0
  185. package/dist/src/config.js.map +1 -0
  186. package/dist/src/constants.d.ts +60 -0
  187. package/dist/src/constants.d.ts.map +1 -0
  188. package/dist/src/constants.js +118 -0
  189. package/dist/src/constants.js.map +1 -0
  190. package/dist/src/server/index.d.ts +23 -0
  191. package/dist/src/server/index.d.ts.map +1 -0
  192. package/dist/src/server/index.js +1642 -0
  193. package/dist/src/server/index.js.map +1 -0
  194. package/dist/src/slack/channel-manager.d.ts +32 -0
  195. package/dist/src/slack/channel-manager.d.ts.map +1 -0
  196. package/dist/src/slack/channel-manager.js +128 -0
  197. package/dist/src/slack/channel-manager.js.map +1 -0
  198. package/dist/src/slack/client.d.ts +63 -0
  199. package/dist/src/slack/client.d.ts.map +1 -0
  200. package/dist/src/slack/client.js +151 -0
  201. package/dist/src/slack/client.js.map +1 -0
  202. package/dist/src/slack/deliberation.d.ts +45 -0
  203. package/dist/src/slack/deliberation.d.ts.map +1 -0
  204. package/dist/src/slack/deliberation.js +539 -0
  205. package/dist/src/slack/deliberation.js.map +1 -0
  206. package/dist/src/slack/index.d.ts +6 -0
  207. package/dist/src/slack/index.d.ts.map +1 -0
  208. package/dist/src/slack/index.js +5 -0
  209. package/dist/src/slack/index.js.map +1 -0
  210. package/dist/src/slack/interaction-listener.d.ts +47 -0
  211. package/dist/src/slack/interaction-listener.d.ts.map +1 -0
  212. package/dist/src/slack/interaction-listener.js +216 -0
  213. package/dist/src/slack/interaction-listener.js.map +1 -0
  214. package/dist/src/storage/json-state-migrator.d.ts +24 -0
  215. package/dist/src/storage/json-state-migrator.d.ts.map +1 -0
  216. package/dist/src/storage/json-state-migrator.js +197 -0
  217. package/dist/src/storage/json-state-migrator.js.map +1 -0
  218. package/dist/src/storage/repositories/index.d.ts +25 -0
  219. package/dist/src/storage/repositories/index.d.ts.map +1 -0
  220. package/dist/src/storage/repositories/index.js +43 -0
  221. package/dist/src/storage/repositories/index.js.map +1 -0
  222. package/dist/src/storage/repositories/interfaces.d.ts +59 -0
  223. package/dist/src/storage/repositories/interfaces.d.ts.map +1 -0
  224. package/dist/src/storage/repositories/interfaces.js +6 -0
  225. package/dist/src/storage/repositories/interfaces.js.map +1 -0
  226. package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts +27 -0
  227. package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts.map +1 -0
  228. package/dist/src/storage/repositories/sqlite/agent-persona-repository.js +569 -0
  229. package/dist/src/storage/repositories/sqlite/agent-persona-repository.js.map +1 -0
  230. package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts +21 -0
  231. package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts.map +1 -0
  232. package/dist/src/storage/repositories/sqlite/execution-history-repository.js +94 -0
  233. package/dist/src/storage/repositories/sqlite/execution-history-repository.js.map +1 -0
  234. package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts +17 -0
  235. package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts.map +1 -0
  236. package/dist/src/storage/repositories/sqlite/prd-state-repository.js +74 -0
  237. package/dist/src/storage/repositories/sqlite/prd-state-repository.js.map +1 -0
  238. package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts +17 -0
  239. package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts.map +1 -0
  240. package/dist/src/storage/repositories/sqlite/project-registry-repository.js +43 -0
  241. package/dist/src/storage/repositories/sqlite/project-registry-repository.js.map +1 -0
  242. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts +14 -0
  243. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +1 -0
  244. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js +47 -0
  245. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js.map +1 -0
  246. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts +20 -0
  247. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts.map +1 -0
  248. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js +88 -0
  249. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js.map +1 -0
  250. package/dist/src/storage/sqlite/client.d.ts +23 -0
  251. package/dist/src/storage/sqlite/client.d.ts.map +1 -0
  252. package/dist/src/storage/sqlite/client.js +47 -0
  253. package/dist/src/storage/sqlite/client.js.map +1 -0
  254. package/dist/src/storage/sqlite/migrations.d.ts +11 -0
  255. package/dist/src/storage/sqlite/migrations.d.ts.map +1 -0
  256. package/dist/src/storage/sqlite/migrations.js +94 -0
  257. package/dist/src/storage/sqlite/migrations.js.map +1 -0
  258. package/dist/src/templates/prd-template.d.ts +11 -0
  259. package/dist/src/templates/prd-template.d.ts.map +1 -0
  260. package/dist/src/templates/prd-template.js +166 -0
  261. package/dist/src/templates/prd-template.js.map +1 -0
  262. package/dist/src/templates/slicer-prompt.d.ts +54 -0
  263. package/dist/src/templates/slicer-prompt.d.ts.map +1 -0
  264. package/dist/src/templates/slicer-prompt.js +163 -0
  265. package/dist/src/templates/slicer-prompt.js.map +1 -0
  266. package/dist/src/types.d.ts +127 -0
  267. package/dist/src/types.d.ts.map +1 -0
  268. package/dist/src/types.js +5 -0
  269. package/dist/src/types.js.map +1 -0
  270. package/dist/src/utils/checks.d.ts +55 -0
  271. package/dist/src/utils/checks.d.ts.map +1 -0
  272. package/dist/src/utils/checks.js +246 -0
  273. package/dist/src/utils/checks.js.map +1 -0
  274. package/dist/src/utils/config-writer.d.ts +16 -0
  275. package/dist/src/utils/config-writer.d.ts.map +1 -0
  276. package/dist/src/utils/config-writer.js +45 -0
  277. package/dist/src/utils/config-writer.js.map +1 -0
  278. package/dist/src/utils/crontab.d.ts +62 -0
  279. package/dist/src/utils/crontab.d.ts.map +1 -0
  280. package/dist/src/utils/crontab.js +168 -0
  281. package/dist/src/utils/crontab.js.map +1 -0
  282. package/dist/src/utils/execution-history.d.ts +54 -0
  283. package/dist/src/utils/execution-history.d.ts.map +1 -0
  284. package/dist/src/utils/execution-history.js +80 -0
  285. package/dist/src/utils/execution-history.js.map +1 -0
  286. package/dist/src/utils/github.d.ts +40 -0
  287. package/dist/src/utils/github.d.ts.map +1 -0
  288. package/dist/src/utils/github.js +126 -0
  289. package/dist/src/utils/github.js.map +1 -0
  290. package/dist/src/utils/notify.d.ts +63 -0
  291. package/dist/src/utils/notify.d.ts.map +1 -0
  292. package/dist/src/utils/notify.js +389 -0
  293. package/dist/src/utils/notify.js.map +1 -0
  294. package/dist/src/utils/prd-states.d.ts +16 -0
  295. package/dist/src/utils/prd-states.d.ts.map +1 -0
  296. package/dist/src/utils/prd-states.js +28 -0
  297. package/dist/src/utils/prd-states.js.map +1 -0
  298. package/dist/src/utils/registry.d.ts +45 -0
  299. package/dist/src/utils/registry.d.ts.map +1 -0
  300. package/dist/src/utils/registry.js +86 -0
  301. package/dist/src/utils/registry.js.map +1 -0
  302. package/dist/src/utils/roadmap-parser.d.ts +45 -0
  303. package/dist/src/utils/roadmap-parser.d.ts.map +1 -0
  304. package/dist/src/utils/roadmap-parser.js +136 -0
  305. package/dist/src/utils/roadmap-parser.js.map +1 -0
  306. package/dist/src/utils/roadmap-scanner.d.ts +92 -0
  307. package/dist/src/utils/roadmap-scanner.d.ts.map +1 -0
  308. package/dist/src/utils/roadmap-scanner.js +349 -0
  309. package/dist/src/utils/roadmap-scanner.js.map +1 -0
  310. package/dist/src/utils/roadmap-state.d.ts +90 -0
  311. package/dist/src/utils/roadmap-state.d.ts.map +1 -0
  312. package/dist/src/utils/roadmap-state.js +154 -0
  313. package/dist/src/utils/roadmap-state.js.map +1 -0
  314. package/dist/src/utils/script-result.d.ts +12 -0
  315. package/dist/src/utils/script-result.d.ts.map +1 -0
  316. package/dist/src/utils/script-result.js +46 -0
  317. package/dist/src/utils/script-result.js.map +1 -0
  318. package/dist/src/utils/shell.d.ts +27 -0
  319. package/dist/src/utils/shell.d.ts.map +1 -0
  320. package/dist/src/utils/shell.js +64 -0
  321. package/dist/src/utils/shell.js.map +1 -0
  322. package/dist/src/utils/status-data.d.ts +148 -0
  323. package/dist/src/utils/status-data.d.ts.map +1 -0
  324. package/dist/src/utils/status-data.js +593 -0
  325. package/dist/src/utils/status-data.js.map +1 -0
  326. package/dist/src/utils/ui.d.ts +55 -0
  327. package/dist/src/utils/ui.d.ts.map +1 -0
  328. package/dist/src/utils/ui.js +121 -0
  329. package/dist/src/utils/ui.js.map +1 -0
  330. package/dist/types.d.ts +43 -1
  331. package/dist/types.d.ts.map +1 -1
  332. package/dist/utils/notify.d.ts.map +1 -1
  333. package/dist/utils/notify.js +18 -0
  334. package/dist/utils/notify.js.map +1 -1
  335. package/dist/utils/status-data.d.ts +4 -0
  336. package/dist/utils/status-data.d.ts.map +1 -1
  337. package/dist/utils/status-data.js +13 -3
  338. package/dist/utils/status-data.js.map +1 -1
  339. package/package.json +3 -1
  340. package/scripts/night-watch-cron.sh +50 -2
  341. package/scripts/night-watch-helpers.sh +54 -2
  342. package/scripts/night-watch-pr-reviewer-cron.sh +79 -1
  343. package/scripts/night-watch-qa-cron.sh +269 -0
  344. package/templates/night-watch-qa.md +157 -0
  345. package/templates/night-watch.config.json +14 -1
  346. package/web/dist/assets/index-BtxQU4oX.css +1 -0
  347. package/web/dist/assets/index-CsNIryJz.js +473 -0
  348. package/web/dist/index.html +2 -2
  349. package/web/dist/assets/index-C64sy08d.js +0 -360
  350. package/web/dist/assets/index-DzoZeo_Y.css +0 -1
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Dashboard command for Night Watch CLI
3
+ * Tabbed TUI with Status, Config, Schedules, Actions, and Logs tabs
4
+ */
5
+ import blessed from "blessed";
6
+ import { loadConfig } from "../config.js";
7
+ import { fetchStatusSnapshot } from "../utils/status-data.js";
8
+ import { createStatusTab } from "./dashboard/tab-status.js";
9
+ import { createConfigTab } from "./dashboard/tab-config.js";
10
+ import { createSchedulesTab } from "./dashboard/tab-schedules.js";
11
+ import { createActionsTab } from "./dashboard/tab-actions.js";
12
+ import { createLogsTab } from "./dashboard/tab-logs.js";
13
+ // Re-export render functions for backward compatibility (used by tests)
14
+ export { renderPrdPane, renderProcessPane, renderPrPane, renderLogPane, } from "./dashboard/tab-status.js";
15
+ /**
16
+ * Show a temporary flash message overlay
17
+ */
18
+ function showMessage(screen, text, type, durationMs = 2000) {
19
+ const colors = { success: "green", error: "red", info: "cyan" };
20
+ const msgBox = blessed.box({
21
+ top: "center",
22
+ left: "center",
23
+ width: Math.min(60, text.length + 6),
24
+ height: 3,
25
+ content: `{center}${text}{/center}`,
26
+ tags: true,
27
+ border: { type: "line" },
28
+ style: { border: { fg: colors[type] }, fg: "white", bg: "black" },
29
+ });
30
+ screen.append(msgBox);
31
+ screen.render();
32
+ setTimeout(() => {
33
+ msgBox.destroy();
34
+ screen.render();
35
+ }, durationMs);
36
+ }
37
+ export function dashboardCommand(program) {
38
+ program
39
+ .command("dashboard")
40
+ .description("Live terminal dashboard")
41
+ .option("--interval <seconds>", "Refresh interval in seconds", "10")
42
+ .action(async (options) => {
43
+ const projectDir = process.cwd();
44
+ let config = loadConfig(projectDir);
45
+ // Create blessed screen
46
+ const screen = blessed.screen({
47
+ smartCSR: true,
48
+ title: "Night Watch Dashboard",
49
+ fullUnicode: true,
50
+ });
51
+ // --- Layout ---
52
+ // Header: row 0, height 1
53
+ const headerBox = blessed.box({
54
+ top: 0,
55
+ left: 0,
56
+ width: "100%",
57
+ height: 1,
58
+ content: "{center}Night Watch Dashboard{/center}",
59
+ tags: true,
60
+ style: { fg: "cyan", bold: true },
61
+ });
62
+ // Tab bar: row 1, height 1
63
+ const tabBar = blessed.box({
64
+ top: 1,
65
+ left: 0,
66
+ width: "100%",
67
+ height: 1,
68
+ tags: true,
69
+ style: { fg: "white", bg: "black" },
70
+ content: "",
71
+ });
72
+ // Content area: rows 2..n-2
73
+ const contentArea = blessed.box({
74
+ top: 2,
75
+ left: 0,
76
+ width: "100%",
77
+ height: "100%-4",
78
+ });
79
+ // Footer: bottom row
80
+ const footerBox = blessed.box({
81
+ bottom: 0,
82
+ left: 0,
83
+ width: "100%",
84
+ height: 1,
85
+ content: "",
86
+ tags: true,
87
+ style: { fg: "white", bg: "blue" },
88
+ });
89
+ screen.append(headerBox);
90
+ screen.append(tabBar);
91
+ screen.append(contentArea);
92
+ screen.append(footerBox);
93
+ // --- Create tabs ---
94
+ const tabs = [
95
+ createStatusTab(),
96
+ createConfigTab(),
97
+ createSchedulesTab(),
98
+ createActionsTab(),
99
+ createLogsTab(),
100
+ ];
101
+ // Append all tab containers to content area
102
+ for (const tab of tabs) {
103
+ contentArea.append(tab.container);
104
+ }
105
+ // --- State ---
106
+ let activeTabIndex = 0;
107
+ let isEditing = false;
108
+ let snapshot = fetchStatusSnapshot(projectDir, config);
109
+ // --- Tab context ---
110
+ const ctx = {
111
+ screen,
112
+ projectDir,
113
+ config,
114
+ snapshot,
115
+ reloadConfig: () => {
116
+ config = loadConfig(projectDir);
117
+ ctx.config = config;
118
+ return config;
119
+ },
120
+ refreshSnapshot: () => {
121
+ snapshot = fetchStatusSnapshot(projectDir, config);
122
+ ctx.snapshot = snapshot;
123
+ return snapshot;
124
+ },
125
+ setFooter: (text) => {
126
+ footerBox.setContent(text);
127
+ },
128
+ showMessage: (text, type, durationMs) => {
129
+ showMessage(screen, text, type, durationMs);
130
+ },
131
+ setEditing: (editing) => {
132
+ isEditing = editing;
133
+ },
134
+ };
135
+ // --- Tab bar rendering ---
136
+ function renderTabBar() {
137
+ const parts = tabs.map((tab, idx) => {
138
+ const num = idx + 1;
139
+ if (idx === activeTabIndex) {
140
+ return `{white-bg}{black-fg} ${num}:${tab.name} {/black-fg}{/white-bg}`;
141
+ }
142
+ return ` {blue-fg}${num}:${tab.name}{/blue-fg} `;
143
+ });
144
+ tabBar.setContent(parts.join(""));
145
+ }
146
+ // --- Tab switching ---
147
+ function switchTab(newIndex) {
148
+ if (newIndex === activeTabIndex)
149
+ return;
150
+ if (newIndex < 0 || newIndex >= tabs.length)
151
+ return;
152
+ if (isEditing)
153
+ return; // Don't switch while editing
154
+ // Deactivate current tab
155
+ tabs[activeTabIndex].deactivate();
156
+ tabs[activeTabIndex].container.hide();
157
+ // Activate new tab
158
+ activeTabIndex = newIndex;
159
+ tabs[activeTabIndex].container.show();
160
+ renderTabBar();
161
+ tabs[activeTabIndex].activate(ctx);
162
+ screen.render();
163
+ }
164
+ // --- Header ---
165
+ const intervalSeconds = parseInt(options.interval, 10) || 10;
166
+ let countdown = intervalSeconds;
167
+ function updateHeader() {
168
+ headerBox.setContent(`{center}Night Watch: ${snapshot.projectName} | Provider: ${config.provider} | Last: ${snapshot.timestamp.toLocaleTimeString()} | Next: ${countdown}s{/center}`);
169
+ }
170
+ // --- Refresh ---
171
+ function refreshData() {
172
+ config = loadConfig(projectDir);
173
+ ctx.config = config;
174
+ snapshot = fetchStatusSnapshot(projectDir, config);
175
+ ctx.snapshot = snapshot;
176
+ countdown = intervalSeconds;
177
+ updateHeader();
178
+ tabs[activeTabIndex].refresh(ctx);
179
+ screen.render();
180
+ }
181
+ // --- Timer ---
182
+ const timer = setInterval(() => {
183
+ countdown--;
184
+ updateHeader();
185
+ screen.render();
186
+ if (countdown <= 0) {
187
+ refreshData();
188
+ }
189
+ }, 1000);
190
+ // --- Global keyboard handlers ---
191
+ screen.key(["q", "escape"], () => {
192
+ if (isEditing)
193
+ return;
194
+ clearInterval(timer);
195
+ for (const tab of tabs) {
196
+ tab.destroy();
197
+ }
198
+ screen.destroy();
199
+ process.exit(0);
200
+ });
201
+ screen.key(["r"], () => {
202
+ if (isEditing)
203
+ return;
204
+ refreshData();
205
+ });
206
+ // Tab switching via number keys
207
+ for (let i = 0; i < tabs.length; i++) {
208
+ const idx = i;
209
+ screen.key([String(i + 1)], () => {
210
+ if (isEditing)
211
+ return;
212
+ switchTab(idx);
213
+ });
214
+ }
215
+ // Tab cycling is handled per-tab (Status tab uses Tab for pane focus)
216
+ // Shift+Tab always cycles tabs
217
+ screen.key(["S-tab"], () => {
218
+ if (isEditing)
219
+ return;
220
+ const newIndex = (activeTabIndex - 1 + tabs.length) % tabs.length;
221
+ switchTab(newIndex);
222
+ });
223
+ // --- Initial render ---
224
+ // Show only the first tab's container
225
+ for (let i = 0; i < tabs.length; i++) {
226
+ if (i === 0) {
227
+ tabs[i].container.show();
228
+ }
229
+ else {
230
+ tabs[i].container.hide();
231
+ }
232
+ }
233
+ renderTabBar();
234
+ updateHeader();
235
+ tabs[activeTabIndex].activate(ctx);
236
+ screen.render();
237
+ });
238
+ }
239
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Doctor command for Night Watch CLI
3
+ * Validates environment setup and system health
4
+ */
5
+ import { Command } from "commander";
6
+ import { IWebhookConfig } from "../types.js";
7
+ /**
8
+ * Validate a single webhook configuration and return a list of issues.
9
+ * Returns an empty array if the webhook is valid.
10
+ */
11
+ export declare function validateWebhook(webhook: IWebhookConfig): string[];
12
+ /**
13
+ * Register the doctor command on the program
14
+ */
15
+ export declare function doctorCommand(program: Command): void;
16
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAsBhE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CAuDjE;AAiDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+IpD"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Doctor command for Night Watch CLI
3
+ * Validates environment setup and system health
4
+ */
5
+ import { loadConfig } from "../config.js";
6
+ import { header, info, label, step, success, error as uiError, warn, } from "../utils/ui.js";
7
+ import { checkConfigFile, checkCrontabAccess, checkGhCli, checkGitRepo, checkLogsDirectory, checkNodeVersion, checkPrdDirectory, checkProviderCli, } from "../utils/checks.js";
8
+ /**
9
+ * Validate a single webhook configuration and return a list of issues.
10
+ * Returns an empty array if the webhook is valid.
11
+ */
12
+ export function validateWebhook(webhook) {
13
+ const issues = [];
14
+ // Validate events
15
+ if (!webhook.events || webhook.events.length === 0) {
16
+ issues.push("No events configured");
17
+ }
18
+ else {
19
+ const validEvents = [
20
+ "run_started",
21
+ "run_succeeded",
22
+ "run_failed",
23
+ "run_timeout",
24
+ "review_completed",
25
+ "pr_auto_merged",
26
+ "rate_limit_fallback",
27
+ "qa_completed",
28
+ ];
29
+ for (const event of webhook.events) {
30
+ if (!validEvents.includes(event)) {
31
+ issues.push(`Invalid event: ${event}`);
32
+ }
33
+ }
34
+ }
35
+ // Platform-specific validation
36
+ switch (webhook.type) {
37
+ case "slack":
38
+ if (!webhook.url) {
39
+ issues.push("Missing URL");
40
+ }
41
+ else if (!webhook.url.startsWith("https://hooks.slack.com/")) {
42
+ issues.push("URL should start with https://hooks.slack.com/");
43
+ }
44
+ break;
45
+ case "discord":
46
+ if (!webhook.url) {
47
+ issues.push("Missing URL");
48
+ }
49
+ else if (!webhook.url.startsWith("https://discord.com/api/webhooks/")) {
50
+ issues.push("URL should start with https://discord.com/api/webhooks/");
51
+ }
52
+ break;
53
+ case "telegram":
54
+ if (!webhook.botToken) {
55
+ issues.push("Missing botToken");
56
+ }
57
+ if (!webhook.chatId) {
58
+ issues.push("Missing chatId");
59
+ }
60
+ break;
61
+ default:
62
+ issues.push(`Unknown webhook type: ${webhook.type}`);
63
+ }
64
+ return issues;
65
+ }
66
+ /**
67
+ * Run a single check and print the result
68
+ */
69
+ function runCheck(checkNum, total, checkName, checkFn, options) {
70
+ step(checkNum, total, `Checking ${checkName}...`);
71
+ const result = checkFn();
72
+ if (result.passed) {
73
+ success(result.message);
74
+ return { passed: true, fixed: false };
75
+ }
76
+ // Check failed
77
+ if (options.fix && result.fixable && result.fix) {
78
+ result.fix();
79
+ // Re-run check after fix
80
+ const recheckResult = checkFn();
81
+ if (recheckResult.passed) {
82
+ success(`Fixed: ${checkName}`);
83
+ return { passed: true, fixed: true };
84
+ }
85
+ else {
86
+ uiError(`Failed to fix: ${checkName}`);
87
+ return { passed: false, fixed: false };
88
+ }
89
+ }
90
+ if (result.fixable) {
91
+ warn(`${result.message} (run with --fix to auto-fix)`);
92
+ }
93
+ else {
94
+ uiError(result.message);
95
+ }
96
+ return { passed: false, fixed: false };
97
+ }
98
+ /**
99
+ * Register the doctor command on the program
100
+ */
101
+ export function doctorCommand(program) {
102
+ program
103
+ .command("doctor")
104
+ .description("Check Night Watch configuration and system health")
105
+ .option("--fix", "Automatically fix fixable issues")
106
+ .action(async (options) => {
107
+ const projectDir = process.cwd();
108
+ const config = loadConfig(projectDir);
109
+ const totalChecks = 8;
110
+ let checkNum = 1;
111
+ let passedChecks = 0;
112
+ let fixedChecks = 0;
113
+ header("Night Watch Doctor");
114
+ // Check 1: Node.js version
115
+ const nodeResult = runCheck(checkNum++, totalChecks, "Node.js version", () => checkNodeVersion(18), options);
116
+ if (nodeResult.passed)
117
+ passedChecks++;
118
+ if (nodeResult.fixed)
119
+ fixedChecks++;
120
+ // Check 2: Git repository
121
+ const gitResult = runCheck(checkNum++, totalChecks, "git repository", () => checkGitRepo(projectDir), options);
122
+ if (gitResult.passed)
123
+ passedChecks++;
124
+ if (gitResult.fixed)
125
+ fixedChecks++;
126
+ // Check 3: GitHub CLI
127
+ const ghResult = runCheck(checkNum++, totalChecks, "GitHub CLI", () => checkGhCli(), options);
128
+ if (ghResult.passed)
129
+ passedChecks++;
130
+ if (ghResult.fixed)
131
+ fixedChecks++;
132
+ // Check 4: Provider CLI
133
+ const providerResult = runCheck(checkNum++, totalChecks, "provider CLI", () => checkProviderCli(config.provider), options);
134
+ if (providerResult.passed)
135
+ passedChecks++;
136
+ if (providerResult.fixed)
137
+ fixedChecks++;
138
+ // Check 5: Config file
139
+ const configResult = runCheck(checkNum++, totalChecks, "config file", () => checkConfigFile(projectDir), options);
140
+ if (configResult.passed)
141
+ passedChecks++;
142
+ if (configResult.fixed)
143
+ fixedChecks++;
144
+ // Check 6: PRD directory
145
+ const prdResult = runCheck(checkNum++, totalChecks, "PRD directory", () => checkPrdDirectory(projectDir, config.prdDir), options);
146
+ if (prdResult.passed)
147
+ passedChecks++;
148
+ if (prdResult.fixed)
149
+ fixedChecks++;
150
+ // Check 7: Logs directory
151
+ const logsResult = runCheck(checkNum++, totalChecks, "logs directory", () => checkLogsDirectory(projectDir), options);
152
+ if (logsResult.passed)
153
+ passedChecks++;
154
+ if (logsResult.fixed)
155
+ fixedChecks++;
156
+ // Check 8: Webhook configuration
157
+ step(checkNum, totalChecks, "Checking webhook configuration...");
158
+ if (!config.notifications ||
159
+ config.notifications.webhooks.length === 0) {
160
+ info("No webhooks configured (optional)");
161
+ passedChecks++;
162
+ }
163
+ else {
164
+ let webhookErrors = 0;
165
+ for (const webhook of config.notifications.webhooks) {
166
+ const issues = validateWebhook(webhook);
167
+ if (issues.length === 0) {
168
+ success(`${webhook.type} webhook: OK`);
169
+ }
170
+ else {
171
+ for (const issue of issues) {
172
+ warn(`${webhook.type} webhook: ${issue}`);
173
+ }
174
+ webhookErrors++;
175
+ }
176
+ }
177
+ if (webhookErrors === 0) {
178
+ success(`All ${config.notifications.webhooks.length} webhook(s) valid`);
179
+ passedChecks++;
180
+ }
181
+ }
182
+ // Check crontab access (non-blocking, informational only)
183
+ const crontabResult = checkCrontabAccess();
184
+ info(crontabResult.message);
185
+ // Summary
186
+ console.log();
187
+ header("Summary");
188
+ label("Checks passed", `${passedChecks}/${totalChecks}`);
189
+ if (fixedChecks > 0) {
190
+ label("Issues fixed", `${fixedChecks}`);
191
+ }
192
+ console.log();
193
+ if (passedChecks === totalChecks) {
194
+ success("All checks passed");
195
+ }
196
+ else {
197
+ uiError("Issues found — fix errors above before running Night Watch");
198
+ process.exit(1);
199
+ }
200
+ });
201
+ }
202
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * History command — CLI interface to the execution history ledger.
3
+ * Designed for bash script integration (silent stdout, exit-code signaling).
4
+ */
5
+ import { Command } from "commander";
6
+ export declare function historyCommand(program: Command): void;
7
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/commands/history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyErD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * History command — CLI interface to the execution history ledger.
3
+ * Designed for bash script integration (silent stdout, exit-code signaling).
4
+ */
5
+ import { isInCooldown, recordExecution, } from "../utils/execution-history.js";
6
+ const VALID_OUTCOMES = [
7
+ "success",
8
+ "failure",
9
+ "timeout",
10
+ "rate_limited",
11
+ ];
12
+ export function historyCommand(program) {
13
+ const history = program
14
+ .command("history")
15
+ .description("Manage PRD execution history ledger");
16
+ history
17
+ .command("record <projectDir> <prdFile> <outcome>")
18
+ .description("Record a PRD execution result")
19
+ .option("--exit-code <n>", "Process exit code", "0")
20
+ .option("--attempt <n>", "Attempt number", "1")
21
+ .action((projectDir, prdFile, outcome, options) => {
22
+ if (!VALID_OUTCOMES.includes(outcome)) {
23
+ process.stderr.write(`Invalid outcome: ${outcome}. Must be one of: ${VALID_OUTCOMES.join(", ")}\n`);
24
+ process.exit(2);
25
+ }
26
+ const exitCode = parseInt(options.exitCode, 10);
27
+ const attempt = parseInt(options.attempt, 10);
28
+ if (isNaN(exitCode)) {
29
+ process.stderr.write(`Invalid exit code: ${options.exitCode}\n`);
30
+ process.exit(2);
31
+ }
32
+ if (isNaN(attempt) || attempt < 1) {
33
+ process.stderr.write(`Invalid attempt: ${options.attempt}\n`);
34
+ process.exit(2);
35
+ }
36
+ recordExecution(projectDir, prdFile, outcome, exitCode, attempt);
37
+ });
38
+ history
39
+ .command("check <projectDir> <prdFile>")
40
+ .description("Check if a PRD is in cooldown (exit 0 = in cooldown, exit 1 = eligible)")
41
+ .option("--cooldown <seconds>", "Cooldown period in seconds", "7200")
42
+ .action((projectDir, prdFile, options) => {
43
+ const cooldownPeriod = parseInt(options.cooldown, 10);
44
+ if (isNaN(cooldownPeriod) || cooldownPeriod < 0) {
45
+ process.stderr.write(`Invalid cooldown period: ${options.cooldown}\n`);
46
+ process.exit(2);
47
+ }
48
+ if (isInCooldown(projectDir, prdFile, cooldownPeriod)) {
49
+ process.exit(0); // in cooldown — caller should skip
50
+ }
51
+ else {
52
+ process.exit(1); // eligible — caller should proceed
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/commands/history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAEL,YAAY,EACZ,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,cAAc,GAAuB;IACzC,SAAS;IACT,SAAS;IACT,SAAS;IACT,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,qCAAqC,CAAC,CAAC;IAEtD,OAAO;SACJ,OAAO,CAAC,yCAAyC,CAAC;SAClD,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,GAAG,CAAC;SACnD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,GAAG,CAAC;SAC9C,MAAM,CACL,CACE,UAAkB,EAClB,OAAe,EACf,OAAe,EACf,OAA8C,EAC9C,EAAE;QACF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAA2B,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oBAAoB,OAAO,qBAAqB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC9E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,eAAe,CACb,UAAU,EACV,OAAO,EACP,OAA2B,EAC3B,QAAQ,EACR,OAAO,CACR,CAAC;IACJ,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,8BAA8B,CAAC;SACvC,WAAW,CACV,yEAAyE,CAC1E;SACA,MAAM,CAAC,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,CAAC;SACpE,MAAM,CACL,CACE,UAAkB,EAClB,OAAe,EACf,OAA6B,EAC7B,EAAE;QACF,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4BAA4B,OAAO,CAAC,QAAQ,IAAI,CACjD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;QACtD,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ /**
4
+ * Get the default branch name for the repository
5
+ */
6
+ export declare function getDefaultBranch(cwd: string): string;
7
+ /**
8
+ * Result of template path resolution
9
+ */
10
+ interface ITemplateResolution {
11
+ path: string;
12
+ source: "custom" | "bundled";
13
+ }
14
+ /**
15
+ * Resolve a template path with per-file fallback.
16
+ * If customTemplatesDir is non-null and the file exists there, return custom path.
17
+ * Otherwise return the bundled template path.
18
+ */
19
+ export declare function resolveTemplatePath(templateName: string, customTemplatesDir: string | null, bundledTemplatesDir: string): ITemplateResolution;
20
+ /**
21
+ * Main init command implementation
22
+ */
23
+ export declare function initCommand(program: Command): void;
24
+ export default initCommand;
25
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+IpC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiEpD;AA6CD;;GAEG;AACH,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,EACjC,mBAAmB,EAAE,MAAM,GAC1B,mBAAmB,CAQrB;AAsFD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqUlD;AAED,eAAe,WAAW,CAAC"}