@jonit-dev/night-watch-cli 1.7.10 → 1.7.13

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 (315) hide show
  1. package/LICENSE +1 -1
  2. package/dist/commands/dashboard/tab-config.d.ts.map +1 -1
  3. package/dist/commands/dashboard/tab-config.js +8 -1
  4. package/dist/commands/dashboard/tab-config.js.map +1 -1
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +3 -0
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/review.d.ts +4 -0
  9. package/dist/commands/review.d.ts.map +1 -1
  10. package/dist/commands/review.js +30 -0
  11. package/dist/commands/review.js.map +1 -1
  12. package/dist/commands/run.d.ts +11 -0
  13. package/dist/commands/run.d.ts.map +1 -1
  14. package/dist/commands/run.js +47 -7
  15. package/dist/commands/run.js.map +1 -1
  16. package/dist/server/index.d.ts.map +1 -1
  17. package/dist/server/index.js +43 -3
  18. package/dist/server/index.js.map +1 -1
  19. package/dist/shared/types.d.ts +223 -0
  20. package/dist/shared/types.d.ts.map +1 -0
  21. package/dist/shared/types.js +7 -0
  22. package/dist/shared/types.js.map +1 -0
  23. package/dist/src/agents/soul-compiler.d.ts +11 -0
  24. package/dist/src/agents/soul-compiler.d.ts.map +1 -0
  25. package/dist/src/agents/soul-compiler.js +103 -0
  26. package/dist/src/agents/soul-compiler.js.map +1 -0
  27. package/dist/src/board/factory.d.ts +3 -0
  28. package/dist/src/board/factory.d.ts.map +1 -0
  29. package/dist/src/board/factory.js +10 -0
  30. package/dist/src/board/factory.js.map +1 -0
  31. package/dist/src/board/providers/github-graphql.d.ts +16 -0
  32. package/dist/src/board/providers/github-graphql.d.ts.map +1 -0
  33. package/dist/src/board/providers/github-graphql.js +43 -0
  34. package/dist/src/board/providers/github-graphql.js.map +1 -0
  35. package/dist/src/board/providers/github-projects.d.ts +51 -0
  36. package/dist/src/board/providers/github-projects.d.ts.map +1 -0
  37. package/dist/src/board/providers/github-projects.js +672 -0
  38. package/dist/src/board/providers/github-projects.js.map +1 -0
  39. package/dist/src/board/types.d.ts +60 -0
  40. package/dist/src/board/types.d.ts.map +1 -0
  41. package/dist/src/board/types.js +4 -0
  42. package/dist/src/board/types.js.map +1 -0
  43. package/dist/src/cli.d.ts +3 -0
  44. package/dist/src/cli.d.ts.map +1 -0
  45. package/dist/src/cli.js +80 -0
  46. package/dist/src/cli.js.map +1 -0
  47. package/dist/src/commands/board.d.ts +9 -0
  48. package/dist/src/commands/board.d.ts.map +1 -0
  49. package/dist/src/commands/board.js +294 -0
  50. package/dist/src/commands/board.js.map +1 -0
  51. package/dist/src/commands/cancel.d.ts +46 -0
  52. package/dist/src/commands/cancel.d.ts.map +1 -0
  53. package/dist/src/commands/cancel.js +241 -0
  54. package/dist/src/commands/cancel.js.map +1 -0
  55. package/dist/src/commands/dashboard/tab-actions.d.ts +10 -0
  56. package/dist/src/commands/dashboard/tab-actions.d.ts.map +1 -0
  57. package/dist/src/commands/dashboard/tab-actions.js +245 -0
  58. package/dist/src/commands/dashboard/tab-actions.js.map +1 -0
  59. package/dist/src/commands/dashboard/tab-config.d.ts +21 -0
  60. package/dist/src/commands/dashboard/tab-config.d.ts.map +1 -0
  61. package/dist/src/commands/dashboard/tab-config.js +829 -0
  62. package/dist/src/commands/dashboard/tab-config.js.map +1 -0
  63. package/dist/src/commands/dashboard/tab-logs.d.ts +10 -0
  64. package/dist/src/commands/dashboard/tab-logs.d.ts.map +1 -0
  65. package/dist/src/commands/dashboard/tab-logs.js +178 -0
  66. package/dist/src/commands/dashboard/tab-logs.js.map +1 -0
  67. package/dist/src/commands/dashboard/tab-schedules.d.ts +21 -0
  68. package/dist/src/commands/dashboard/tab-schedules.d.ts.map +1 -0
  69. package/dist/src/commands/dashboard/tab-schedules.js +304 -0
  70. package/dist/src/commands/dashboard/tab-schedules.js.map +1 -0
  71. package/dist/src/commands/dashboard/tab-status.d.ts +32 -0
  72. package/dist/src/commands/dashboard/tab-status.d.ts.map +1 -0
  73. package/dist/src/commands/dashboard/tab-status.js +421 -0
  74. package/dist/src/commands/dashboard/tab-status.js.map +1 -0
  75. package/dist/src/commands/dashboard/types.d.ts +43 -0
  76. package/dist/src/commands/dashboard/types.d.ts.map +1 -0
  77. package/dist/src/commands/dashboard/types.js +5 -0
  78. package/dist/src/commands/dashboard/types.js.map +1 -0
  79. package/dist/src/commands/dashboard.d.ts +11 -0
  80. package/dist/src/commands/dashboard.d.ts.map +1 -0
  81. package/dist/src/commands/dashboard.js +239 -0
  82. package/dist/src/commands/dashboard.js.map +1 -0
  83. package/dist/src/commands/doctor.d.ts +16 -0
  84. package/dist/src/commands/doctor.d.ts.map +1 -0
  85. package/dist/src/commands/doctor.js +202 -0
  86. package/dist/src/commands/doctor.js.map +1 -0
  87. package/dist/src/commands/history.d.ts +7 -0
  88. package/dist/src/commands/history.d.ts.map +1 -0
  89. package/dist/src/commands/history.js +56 -0
  90. package/dist/src/commands/history.js.map +1 -0
  91. package/dist/src/commands/init.d.ts +25 -0
  92. package/dist/src/commands/init.d.ts.map +1 -0
  93. package/dist/src/commands/init.js +543 -0
  94. package/dist/src/commands/init.js.map +1 -0
  95. package/dist/src/commands/install.d.ts +48 -0
  96. package/dist/src/commands/install.d.ts.map +1 -0
  97. package/dist/src/commands/install.js +303 -0
  98. package/dist/src/commands/install.js.map +1 -0
  99. package/dist/src/commands/logs.d.ts +15 -0
  100. package/dist/src/commands/logs.d.ts.map +1 -0
  101. package/dist/src/commands/logs.js +104 -0
  102. package/dist/src/commands/logs.js.map +1 -0
  103. package/dist/src/commands/prd-state.d.ts +12 -0
  104. package/dist/src/commands/prd-state.d.ts.map +1 -0
  105. package/dist/src/commands/prd-state.js +47 -0
  106. package/dist/src/commands/prd-state.js.map +1 -0
  107. package/dist/src/commands/prd.d.ts +24 -0
  108. package/dist/src/commands/prd.d.ts.map +1 -0
  109. package/dist/src/commands/prd.js +283 -0
  110. package/dist/src/commands/prd.js.map +1 -0
  111. package/dist/src/commands/prds.d.ts +13 -0
  112. package/dist/src/commands/prds.d.ts.map +1 -0
  113. package/dist/src/commands/prds.js +196 -0
  114. package/dist/src/commands/prds.js.map +1 -0
  115. package/dist/src/commands/prs.d.ts +14 -0
  116. package/dist/src/commands/prs.d.ts.map +1 -0
  117. package/dist/src/commands/prs.js +106 -0
  118. package/dist/src/commands/prs.js.map +1 -0
  119. package/dist/src/commands/qa.d.ts +30 -0
  120. package/dist/src/commands/qa.d.ts.map +1 -0
  121. package/dist/src/commands/qa.js +159 -0
  122. package/dist/src/commands/qa.js.map +1 -0
  123. package/dist/src/commands/retry.d.ts +9 -0
  124. package/dist/src/commands/retry.d.ts.map +1 -0
  125. package/dist/src/commands/retry.js +72 -0
  126. package/dist/src/commands/retry.js.map +1 -0
  127. package/dist/src/commands/review.d.ts +35 -0
  128. package/dist/src/commands/review.d.ts.map +1 -0
  129. package/dist/src/commands/review.js +252 -0
  130. package/dist/src/commands/review.js.map +1 -0
  131. package/dist/src/commands/run.d.ts +61 -0
  132. package/dist/src/commands/run.d.ts.map +1 -0
  133. package/dist/src/commands/run.js +364 -0
  134. package/dist/src/commands/run.js.map +1 -0
  135. package/dist/src/commands/serve.d.ts +7 -0
  136. package/dist/src/commands/serve.d.ts.map +1 -0
  137. package/dist/src/commands/serve.js +27 -0
  138. package/dist/src/commands/serve.js.map +1 -0
  139. package/dist/src/commands/slice.d.ts +26 -0
  140. package/dist/src/commands/slice.d.ts.map +1 -0
  141. package/dist/src/commands/slice.js +175 -0
  142. package/dist/src/commands/slice.js.map +1 -0
  143. package/dist/src/commands/state.d.ts +8 -0
  144. package/dist/src/commands/state.d.ts.map +1 -0
  145. package/dist/src/commands/state.js +56 -0
  146. package/dist/src/commands/state.js.map +1 -0
  147. package/dist/src/commands/status.d.ts +14 -0
  148. package/dist/src/commands/status.d.ts.map +1 -0
  149. package/dist/src/commands/status.js +147 -0
  150. package/dist/src/commands/status.js.map +1 -0
  151. package/dist/src/commands/uninstall.d.ts +25 -0
  152. package/dist/src/commands/uninstall.d.ts.map +1 -0
  153. package/dist/src/commands/uninstall.js +141 -0
  154. package/dist/src/commands/uninstall.js.map +1 -0
  155. package/dist/src/commands/update.d.ts +21 -0
  156. package/dist/src/commands/update.d.ts.map +1 -0
  157. package/dist/src/commands/update.js +87 -0
  158. package/dist/src/commands/update.js.map +1 -0
  159. package/dist/src/config.d.ts +23 -0
  160. package/dist/src/config.d.ts.map +1 -0
  161. package/dist/src/config.js +629 -0
  162. package/dist/src/config.js.map +1 -0
  163. package/dist/src/constants.d.ts +60 -0
  164. package/dist/src/constants.d.ts.map +1 -0
  165. package/dist/src/constants.js +118 -0
  166. package/dist/src/constants.js.map +1 -0
  167. package/dist/src/server/index.d.ts +23 -0
  168. package/dist/src/server/index.d.ts.map +1 -0
  169. package/dist/src/server/index.js +1645 -0
  170. package/dist/src/server/index.js.map +1 -0
  171. package/dist/src/slack/channel-manager.d.ts +32 -0
  172. package/dist/src/slack/channel-manager.d.ts.map +1 -0
  173. package/dist/src/slack/channel-manager.js +128 -0
  174. package/dist/src/slack/channel-manager.js.map +1 -0
  175. package/dist/src/slack/client.d.ts +63 -0
  176. package/dist/src/slack/client.d.ts.map +1 -0
  177. package/dist/src/slack/client.js +151 -0
  178. package/dist/src/slack/client.js.map +1 -0
  179. package/dist/src/slack/deliberation.d.ts +45 -0
  180. package/dist/src/slack/deliberation.d.ts.map +1 -0
  181. package/dist/src/slack/deliberation.js +539 -0
  182. package/dist/src/slack/deliberation.js.map +1 -0
  183. package/dist/src/slack/index.d.ts +6 -0
  184. package/dist/src/slack/index.d.ts.map +1 -0
  185. package/dist/src/slack/index.js +5 -0
  186. package/dist/src/slack/index.js.map +1 -0
  187. package/dist/src/slack/interaction-listener.d.ts +53 -0
  188. package/dist/src/slack/interaction-listener.d.ts.map +1 -0
  189. package/dist/src/slack/interaction-listener.js +253 -0
  190. package/dist/src/slack/interaction-listener.js.map +1 -0
  191. package/dist/src/storage/json-state-migrator.d.ts +24 -0
  192. package/dist/src/storage/json-state-migrator.d.ts.map +1 -0
  193. package/dist/src/storage/json-state-migrator.js +197 -0
  194. package/dist/src/storage/json-state-migrator.js.map +1 -0
  195. package/dist/src/storage/repositories/index.d.ts +25 -0
  196. package/dist/src/storage/repositories/index.d.ts.map +1 -0
  197. package/dist/src/storage/repositories/index.js +43 -0
  198. package/dist/src/storage/repositories/index.js.map +1 -0
  199. package/dist/src/storage/repositories/interfaces.d.ts +59 -0
  200. package/dist/src/storage/repositories/interfaces.d.ts.map +1 -0
  201. package/dist/src/storage/repositories/interfaces.js +6 -0
  202. package/dist/src/storage/repositories/interfaces.js.map +1 -0
  203. package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts +27 -0
  204. package/dist/src/storage/repositories/sqlite/agent-persona-repository.d.ts.map +1 -0
  205. package/dist/src/storage/repositories/sqlite/agent-persona-repository.js +569 -0
  206. package/dist/src/storage/repositories/sqlite/agent-persona-repository.js.map +1 -0
  207. package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts +21 -0
  208. package/dist/src/storage/repositories/sqlite/execution-history-repository.d.ts.map +1 -0
  209. package/dist/src/storage/repositories/sqlite/execution-history-repository.js +94 -0
  210. package/dist/src/storage/repositories/sqlite/execution-history-repository.js.map +1 -0
  211. package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts +17 -0
  212. package/dist/src/storage/repositories/sqlite/prd-state-repository.d.ts.map +1 -0
  213. package/dist/src/storage/repositories/sqlite/prd-state-repository.js +74 -0
  214. package/dist/src/storage/repositories/sqlite/prd-state-repository.js.map +1 -0
  215. package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts +17 -0
  216. package/dist/src/storage/repositories/sqlite/project-registry-repository.d.ts.map +1 -0
  217. package/dist/src/storage/repositories/sqlite/project-registry-repository.js +43 -0
  218. package/dist/src/storage/repositories/sqlite/project-registry-repository.js.map +1 -0
  219. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts +14 -0
  220. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +1 -0
  221. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js +47 -0
  222. package/dist/src/storage/repositories/sqlite/roadmap-state-repository.js.map +1 -0
  223. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts +20 -0
  224. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.d.ts.map +1 -0
  225. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js +88 -0
  226. package/dist/src/storage/repositories/sqlite/slack-discussion-repository.js.map +1 -0
  227. package/dist/src/storage/sqlite/client.d.ts +23 -0
  228. package/dist/src/storage/sqlite/client.d.ts.map +1 -0
  229. package/dist/src/storage/sqlite/client.js +47 -0
  230. package/dist/src/storage/sqlite/client.js.map +1 -0
  231. package/dist/src/storage/sqlite/migrations.d.ts +11 -0
  232. package/dist/src/storage/sqlite/migrations.d.ts.map +1 -0
  233. package/dist/src/storage/sqlite/migrations.js +94 -0
  234. package/dist/src/storage/sqlite/migrations.js.map +1 -0
  235. package/dist/src/templates/prd-template.d.ts +11 -0
  236. package/dist/src/templates/prd-template.d.ts.map +1 -0
  237. package/dist/src/templates/prd-template.js +166 -0
  238. package/dist/src/templates/prd-template.js.map +1 -0
  239. package/dist/src/templates/slicer-prompt.d.ts +54 -0
  240. package/dist/src/templates/slicer-prompt.d.ts.map +1 -0
  241. package/dist/src/templates/slicer-prompt.js +163 -0
  242. package/dist/src/templates/slicer-prompt.js.map +1 -0
  243. package/dist/src/types.d.ts +127 -0
  244. package/dist/src/types.d.ts.map +1 -0
  245. package/dist/src/types.js +5 -0
  246. package/dist/src/types.js.map +1 -0
  247. package/dist/src/utils/checks.d.ts +55 -0
  248. package/dist/src/utils/checks.d.ts.map +1 -0
  249. package/dist/src/utils/checks.js +246 -0
  250. package/dist/src/utils/checks.js.map +1 -0
  251. package/dist/src/utils/config-writer.d.ts +16 -0
  252. package/dist/src/utils/config-writer.d.ts.map +1 -0
  253. package/dist/src/utils/config-writer.js +45 -0
  254. package/dist/src/utils/config-writer.js.map +1 -0
  255. package/dist/src/utils/crontab.d.ts +62 -0
  256. package/dist/src/utils/crontab.d.ts.map +1 -0
  257. package/dist/src/utils/crontab.js +168 -0
  258. package/dist/src/utils/crontab.js.map +1 -0
  259. package/dist/src/utils/execution-history.d.ts +54 -0
  260. package/dist/src/utils/execution-history.d.ts.map +1 -0
  261. package/dist/src/utils/execution-history.js +80 -0
  262. package/dist/src/utils/execution-history.js.map +1 -0
  263. package/dist/src/utils/github.d.ts +40 -0
  264. package/dist/src/utils/github.d.ts.map +1 -0
  265. package/dist/src/utils/github.js +126 -0
  266. package/dist/src/utils/github.js.map +1 -0
  267. package/dist/src/utils/notify.d.ts +63 -0
  268. package/dist/src/utils/notify.d.ts.map +1 -0
  269. package/dist/src/utils/notify.js +389 -0
  270. package/dist/src/utils/notify.js.map +1 -0
  271. package/dist/src/utils/prd-states.d.ts +16 -0
  272. package/dist/src/utils/prd-states.d.ts.map +1 -0
  273. package/dist/src/utils/prd-states.js +28 -0
  274. package/dist/src/utils/prd-states.js.map +1 -0
  275. package/dist/src/utils/registry.d.ts +45 -0
  276. package/dist/src/utils/registry.d.ts.map +1 -0
  277. package/dist/src/utils/registry.js +86 -0
  278. package/dist/src/utils/registry.js.map +1 -0
  279. package/dist/src/utils/roadmap-parser.d.ts +45 -0
  280. package/dist/src/utils/roadmap-parser.d.ts.map +1 -0
  281. package/dist/src/utils/roadmap-parser.js +136 -0
  282. package/dist/src/utils/roadmap-parser.js.map +1 -0
  283. package/dist/src/utils/roadmap-scanner.d.ts +92 -0
  284. package/dist/src/utils/roadmap-scanner.d.ts.map +1 -0
  285. package/dist/src/utils/roadmap-scanner.js +349 -0
  286. package/dist/src/utils/roadmap-scanner.js.map +1 -0
  287. package/dist/src/utils/roadmap-state.d.ts +90 -0
  288. package/dist/src/utils/roadmap-state.d.ts.map +1 -0
  289. package/dist/src/utils/roadmap-state.js +154 -0
  290. package/dist/src/utils/roadmap-state.js.map +1 -0
  291. package/dist/src/utils/script-result.d.ts +12 -0
  292. package/dist/src/utils/script-result.d.ts.map +1 -0
  293. package/dist/src/utils/script-result.js +46 -0
  294. package/dist/src/utils/script-result.js.map +1 -0
  295. package/dist/src/utils/shell.d.ts +27 -0
  296. package/dist/src/utils/shell.d.ts.map +1 -0
  297. package/dist/src/utils/shell.js +64 -0
  298. package/dist/src/utils/shell.js.map +1 -0
  299. package/dist/src/utils/status-data.d.ts +148 -0
  300. package/dist/src/utils/status-data.d.ts.map +1 -0
  301. package/dist/src/utils/status-data.js +593 -0
  302. package/dist/src/utils/status-data.js.map +1 -0
  303. package/dist/src/utils/ui.d.ts +55 -0
  304. package/dist/src/utils/ui.d.ts.map +1 -0
  305. package/dist/src/utils/ui.js +121 -0
  306. package/dist/src/utils/ui.js.map +1 -0
  307. package/package.json +3 -1
  308. package/scripts/night-watch-cron.sh +7 -0
  309. package/scripts/night-watch-helpers.sh +33 -4
  310. package/scripts/night-watch-pr-reviewer-cron.sh +11 -3
  311. package/web/dist/assets/index-BtxQU4oX.css +1 -0
  312. package/web/dist/assets/index-CzAWcldp.js +473 -0
  313. package/web/dist/index.html +2 -2
  314. package/web/dist/assets/index-BPW-7_1C.js +0 -380
  315. package/web/dist/assets/index-DVqjjJEO.css +0 -1
@@ -0,0 +1,283 @@
1
+ /**
2
+ * PRD command group - manage PRD files
3
+ */
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import * as readline from "readline";
7
+ import { loadConfig } from "../config.js";
8
+ import { CLAIM_FILE_EXTENSION } from "../constants.js";
9
+ import { renderPrdTemplate, } from "../templates/prd-template.js";
10
+ import { createTable, dim, header, info, success, error as uiError, } from "../utils/ui.js";
11
+ /**
12
+ * Slugify a name into a filename-safe string
13
+ */
14
+ export function slugify(name) {
15
+ return name
16
+ .toLowerCase()
17
+ .replace(/[^a-z0-9]+/g, "-")
18
+ .replace(/^-|-$/g, "");
19
+ }
20
+ /**
21
+ * Get the next PRD number based on existing files in the directory
22
+ */
23
+ export function getNextPrdNumber(prdDir) {
24
+ if (!fs.existsSync(prdDir))
25
+ return 1;
26
+ const files = fs
27
+ .readdirSync(prdDir)
28
+ .filter((f) => f.endsWith(".md") && f !== "NIGHT-WATCH-SUMMARY.md");
29
+ const numbers = files.map((f) => {
30
+ const match = f.match(/^(\d+)-/);
31
+ return match ? parseInt(match[1], 10) : 0;
32
+ });
33
+ return Math.max(0, ...numbers) + 1;
34
+ }
35
+ /**
36
+ * Prompt the user for a value using readline
37
+ */
38
+ function prompt(rl, question) {
39
+ return new Promise((resolve) => {
40
+ rl.question(question, (answer) => {
41
+ resolve(answer.trim());
42
+ });
43
+ });
44
+ }
45
+ /**
46
+ * Parse dependency references from PRD markdown content
47
+ */
48
+ function parseDependencies(content) {
49
+ const match = content.match(/\*\*Depends on:\*\*\s*(.+)/i) ||
50
+ content.match(/Depends on:\s*(.+)/i);
51
+ if (!match)
52
+ return [];
53
+ return match[1]
54
+ .split(",")
55
+ .map((d) => d.replace(/`/g, "").trim())
56
+ .filter(Boolean);
57
+ }
58
+ /**
59
+ * Check if a claim file is active (not stale)
60
+ */
61
+ function isClaimActive(claimPath, maxRuntime) {
62
+ try {
63
+ if (!fs.existsSync(claimPath)) {
64
+ return { active: false };
65
+ }
66
+ const content = fs.readFileSync(claimPath, "utf-8");
67
+ const claim = JSON.parse(content);
68
+ const age = Math.floor(Date.now() / 1000) - claim.timestamp;
69
+ if (age < maxRuntime) {
70
+ return { active: true, hostname: claim.hostname, pid: claim.pid };
71
+ }
72
+ return { active: false };
73
+ }
74
+ catch {
75
+ return { active: false };
76
+ }
77
+ }
78
+ /**
79
+ * Register the prd command group with the program
80
+ */
81
+ export function prdCommand(program) {
82
+ const prd = program
83
+ .command("prd")
84
+ .description("Manage PRD files");
85
+ prd
86
+ .command("create")
87
+ .description("Generate a new PRD markdown file from template")
88
+ .argument("<name>", "PRD name (used for title and filename)")
89
+ .option("-i, --interactive", "Prompt for complexity, dependencies, and phase count", false)
90
+ .option("-t, --template <path>", "Path to a custom template file")
91
+ .option("--deps <files>", "Comma-separated dependency filenames")
92
+ .option("--phases <count>", "Number of execution phases", "3")
93
+ .option("--no-number", "Skip auto-numbering prefix")
94
+ .action(async (name, options) => {
95
+ const projectDir = process.cwd();
96
+ // Load config to get prdDir
97
+ const config = loadConfig(projectDir);
98
+ const prdDir = path.join(projectDir, config.prdDir);
99
+ // Ensure the PRD directory exists
100
+ if (!fs.existsSync(prdDir)) {
101
+ fs.mkdirSync(prdDir, { recursive: true });
102
+ }
103
+ // Prepare template variables with defaults
104
+ let complexityScore = 5;
105
+ let dependsOn = [];
106
+ let phaseCount = parseInt(options.phases ?? "3", 10);
107
+ if (isNaN(phaseCount) || phaseCount < 1) {
108
+ phaseCount = 3;
109
+ }
110
+ // Parse --deps flag
111
+ if (options.deps) {
112
+ dependsOn = options.deps
113
+ .split(",")
114
+ .map((d) => d.trim())
115
+ .filter((d) => d.length > 0);
116
+ }
117
+ // Interactive mode: prompt for values
118
+ if (options.interactive) {
119
+ const rl = readline.createInterface({
120
+ input: process.stdin,
121
+ output: process.stdout,
122
+ });
123
+ try {
124
+ // Prompt for complexity
125
+ const complexityInput = await prompt(rl, "Complexity score (1-10, default 5): ");
126
+ if (complexityInput) {
127
+ const parsed = parseInt(complexityInput, 10);
128
+ if (!isNaN(parsed) && parsed >= 1 && parsed <= 10) {
129
+ complexityScore = parsed;
130
+ }
131
+ }
132
+ // Prompt for dependencies
133
+ const depsInput = await prompt(rl, "Dependencies (comma-separated filenames, or empty): ");
134
+ if (depsInput) {
135
+ dependsOn = depsInput
136
+ .split(",")
137
+ .map((d) => d.trim())
138
+ .filter((d) => d.length > 0);
139
+ }
140
+ // Prompt for phases
141
+ const phasesInput = await prompt(rl, `Number of phases (default ${phaseCount}): `);
142
+ if (phasesInput) {
143
+ const parsed = parseInt(phasesInput, 10);
144
+ if (!isNaN(parsed) && parsed >= 1) {
145
+ phaseCount = parsed;
146
+ }
147
+ }
148
+ }
149
+ finally {
150
+ rl.close();
151
+ }
152
+ }
153
+ // Determine complexity level from score
154
+ let complexityLevel;
155
+ if (complexityScore <= 3) {
156
+ complexityLevel = "LOW";
157
+ }
158
+ else if (complexityScore <= 7) {
159
+ complexityLevel = "MEDIUM";
160
+ }
161
+ else {
162
+ complexityLevel = "HIGH";
163
+ }
164
+ // Build filename
165
+ const slug = slugify(name);
166
+ let filename;
167
+ if (options.number) {
168
+ const nextNum = getNextPrdNumber(prdDir);
169
+ const padded = String(nextNum).padStart(2, "0");
170
+ filename = `${padded}-${slug}.md`;
171
+ }
172
+ else {
173
+ filename = `${slug}.md`;
174
+ }
175
+ const filePath = path.join(prdDir, filename);
176
+ // Refuse to overwrite existing files
177
+ if (fs.existsSync(filePath)) {
178
+ uiError(`File already exists: ${filePath}`);
179
+ dim("Use a different name or remove the existing file.");
180
+ process.exit(1);
181
+ }
182
+ // Load custom template if provided
183
+ let customTemplate;
184
+ if (options.template) {
185
+ const templatePath = path.resolve(options.template);
186
+ if (!fs.existsSync(templatePath)) {
187
+ uiError(`Template file not found: ${templatePath}`);
188
+ process.exit(1);
189
+ }
190
+ customTemplate = fs.readFileSync(templatePath, "utf-8");
191
+ }
192
+ // Render template
193
+ const vars = {
194
+ title: name,
195
+ dependsOn,
196
+ complexityScore,
197
+ complexityLevel,
198
+ complexityBreakdown: [],
199
+ phaseCount,
200
+ };
201
+ const content = renderPrdTemplate(vars, customTemplate);
202
+ // Write the file
203
+ fs.writeFileSync(filePath, content, "utf-8");
204
+ header("PRD Created");
205
+ success(`Created: ${filePath}`);
206
+ info(`Title: ${name}`);
207
+ dim(`Phases: ${phaseCount}`);
208
+ if (dependsOn.length > 0) {
209
+ dim(`Dependencies: ${dependsOn.join(", ")}`);
210
+ }
211
+ });
212
+ prd
213
+ .command("list")
214
+ .description("List all PRDs with status")
215
+ .option("--json", "Output as JSON")
216
+ .action(async (options) => {
217
+ const projectDir = process.cwd();
218
+ const config = loadConfig(projectDir);
219
+ const absolutePrdDir = path.join(projectDir, config.prdDir);
220
+ const doneDir = path.join(absolutePrdDir, "done");
221
+ // Scan pending PRDs
222
+ const pending = [];
223
+ if (fs.existsSync(absolutePrdDir)) {
224
+ const files = fs
225
+ .readdirSync(absolutePrdDir)
226
+ .filter((f) => f.endsWith(".md") && f !== "NIGHT-WATCH-SUMMARY.md");
227
+ for (const file of files) {
228
+ const content = fs.readFileSync(path.join(absolutePrdDir, file), "utf-8");
229
+ const deps = parseDependencies(content);
230
+ const claimPath = path.join(absolutePrdDir, file + CLAIM_FILE_EXTENSION);
231
+ const claimStatus = isClaimActive(claimPath, config.maxRuntime);
232
+ pending.push({ name: file, dependencies: deps, claimed: claimStatus.active, claimInfo: claimStatus.active ? { hostname: claimStatus.hostname, pid: claimStatus.pid } : undefined });
233
+ }
234
+ }
235
+ // Scan done PRDs
236
+ const done = [];
237
+ if (fs.existsSync(doneDir)) {
238
+ const files = fs
239
+ .readdirSync(doneDir)
240
+ .filter((f) => f.endsWith(".md"));
241
+ for (const file of files) {
242
+ const content = fs.readFileSync(path.join(doneDir, file), "utf-8");
243
+ const deps = parseDependencies(content);
244
+ done.push({ name: file, dependencies: deps });
245
+ }
246
+ }
247
+ if (options.json) {
248
+ console.log(JSON.stringify({ pending, done }, null, 2));
249
+ return;
250
+ }
251
+ header("PRD Status");
252
+ if (pending.length === 0 && done.length === 0) {
253
+ dim(" No PRDs found.");
254
+ return;
255
+ }
256
+ const table = createTable({
257
+ head: ["Name", "Status", "Dependencies"],
258
+ });
259
+ for (const prd of pending) {
260
+ const status = prd.claimed ? "claimed" : "pending";
261
+ const statusDisplay = prd.claimed && prd.claimInfo
262
+ ? `claimed (${prd.claimInfo.hostname}:${prd.claimInfo.pid})`
263
+ : status;
264
+ table.push([
265
+ prd.name,
266
+ statusDisplay,
267
+ prd.dependencies.join(", ") || "-",
268
+ ]);
269
+ }
270
+ for (const prd of done) {
271
+ table.push([
272
+ prd.name,
273
+ "done",
274
+ prd.dependencies.join(", ") || "-",
275
+ ]);
276
+ }
277
+ console.log(table.toString());
278
+ const claimedCount = pending.filter(p => p.claimed).length;
279
+ const pendingCount = pending.length - claimedCount;
280
+ info(`${pendingCount} pending, ${claimedCount} claimed, ${done.length} done`);
281
+ });
282
+ }
283
+ //# sourceMappingURL=prd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../../src/commands/prd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PRDs command for Night Watch CLI
3
+ * Lists all PRDs with their status (ready/blocked/in-progress/done) and dependencies
4
+ */
5
+ import { Command } from "commander";
6
+ export interface IPrdsOptions {
7
+ json?: boolean;
8
+ }
9
+ /**
10
+ * PRDs command implementation
11
+ */
12
+ export declare function prdsCommand(program: Command): void;
13
+ //# sourceMappingURL=prds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prds.d.ts","sourceRoot":"","sources":["../../../src/commands/prds.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuHD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmGlD"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * PRDs command for Night Watch CLI
3
+ * Lists all PRDs with their status (ready/blocked/in-progress/done) and dependencies
4
+ */
5
+ import chalk from "chalk";
6
+ import { loadConfig } from "../config.js";
7
+ import { collectPrdInfo, } from "../utils/status-data.js";
8
+ import { createTable, dim, header, } from "../utils/ui.js";
9
+ import { execSync } from "child_process";
10
+ /**
11
+ * Get open PR branch names using gh CLI
12
+ */
13
+ function getOpenPrBranches(projectDir) {
14
+ try {
15
+ execSync("git rev-parse --git-dir", {
16
+ cwd: projectDir,
17
+ encoding: "utf-8",
18
+ stdio: ["pipe", "pipe", "pipe"],
19
+ });
20
+ }
21
+ catch {
22
+ return new Set();
23
+ }
24
+ try {
25
+ execSync("which gh", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
26
+ }
27
+ catch {
28
+ return new Set();
29
+ }
30
+ try {
31
+ const output = execSync("gh pr list --state open --json headRefName", {
32
+ cwd: projectDir,
33
+ encoding: "utf-8",
34
+ stdio: ["pipe", "pipe", "pipe"],
35
+ });
36
+ const prs = JSON.parse(output);
37
+ return new Set(prs.map((pr) => pr.headRefName));
38
+ }
39
+ catch {
40
+ return new Set();
41
+ }
42
+ }
43
+ /**
44
+ * Derive a branch name from a PRD name
45
+ * Converts "01-feature-name.md" or "01-feature-name" to potential branch patterns
46
+ */
47
+ function deriveBranchPatterns(prdName, branchPrefix) {
48
+ // Remove .md extension if present
49
+ const baseName = prdName.replace(/\.md$/, "");
50
+ // Common patterns:
51
+ // 1. night-watch/01-feature-name
52
+ // 2. feat/01-feature-name
53
+ // 3. feature/01-feature-name
54
+ return [
55
+ `${branchPrefix}${baseName}`,
56
+ `feat/${baseName}`,
57
+ `feature/${baseName}`,
58
+ ];
59
+ }
60
+ /**
61
+ * Find matching PR for a PRD
62
+ */
63
+ function findMatchingPr(prdName, openPrBranches, branchPrefix) {
64
+ const patterns = deriveBranchPatterns(prdName, branchPrefix);
65
+ for (const pattern of patterns) {
66
+ // Check for exact match
67
+ if (openPrBranches.has(pattern)) {
68
+ return pattern;
69
+ }
70
+ // Check for partial match (branch might have additional suffix)
71
+ for (const branch of openPrBranches) {
72
+ if (branch === pattern || branch.startsWith(`${pattern}-`) || branch.startsWith(`${pattern}/`)) {
73
+ return branch;
74
+ }
75
+ }
76
+ }
77
+ return null;
78
+ }
79
+ /**
80
+ * Format status with color
81
+ */
82
+ function formatStatus(status) {
83
+ switch (status) {
84
+ case "ready":
85
+ return chalk.green("ready");
86
+ case "blocked":
87
+ return chalk.yellow("blocked");
88
+ case "in-progress":
89
+ return chalk.cyan("in-progress");
90
+ case "pending-review":
91
+ return chalk.magenta("pending-review");
92
+ case "done":
93
+ return chalk.dim("done");
94
+ default:
95
+ return status;
96
+ }
97
+ }
98
+ /**
99
+ * Format dependencies list
100
+ */
101
+ function formatDependencies(dependencies, unmetDependencies) {
102
+ if (dependencies.length === 0) {
103
+ return chalk.dim("-");
104
+ }
105
+ return dependencies.map((dep) => {
106
+ const isUnmet = unmetDependencies.includes(dep);
107
+ return isUnmet ? chalk.red(dep) : chalk.green(dep);
108
+ }).join(", ");
109
+ }
110
+ /**
111
+ * PRDs command implementation
112
+ */
113
+ export function prdsCommand(program) {
114
+ program
115
+ .command("prds")
116
+ .description("List all PRDs with their status and dependencies")
117
+ .option("--json", "Output as JSON")
118
+ .action(async (options) => {
119
+ try {
120
+ const projectDir = process.cwd();
121
+ const config = loadConfig(projectDir);
122
+ // Collect PRD info using existing utility
123
+ const prds = collectPrdInfo(projectDir, config.prdDir, config.maxRuntime);
124
+ // Get open PR branches for in-progress detection
125
+ const openPrBranches = getOpenPrBranches(projectDir);
126
+ // Filter out summary file and update in-progress status based on open PRs
127
+ const filteredPrds = prds.filter((prd) => !prd.name.toLowerCase().includes("night-watch-summary"));
128
+ // Update status based on open PRs
129
+ for (const prd of filteredPrds) {
130
+ if (prd.status !== "done") {
131
+ const matchingPr = findMatchingPr(prd.name, openPrBranches, config.branchPrefix);
132
+ if (matchingPr) {
133
+ prd.status = "in-progress";
134
+ prd.prBranch = matchingPr;
135
+ }
136
+ }
137
+ }
138
+ // Sort: ready first, then blocked, then in-progress, then done
139
+ const statusOrder = {
140
+ "ready": 0,
141
+ "blocked": 1,
142
+ "in-progress": 2,
143
+ "pending-review": 3,
144
+ "done": 4,
145
+ };
146
+ filteredPrds.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);
147
+ // Output as JSON if requested
148
+ if (options.json) {
149
+ const jsonOutput = filteredPrds.map((prd) => ({
150
+ name: prd.name,
151
+ status: prd.status,
152
+ dependencies: prd.dependencies,
153
+ unmetDependencies: prd.unmetDependencies,
154
+ pr: prd.prBranch || null,
155
+ }));
156
+ console.log(JSON.stringify(jsonOutput, null, 2));
157
+ return;
158
+ }
159
+ // Display header
160
+ header("PRD Status");
161
+ if (filteredPrds.length === 0) {
162
+ dim("No PRDs found.");
163
+ return;
164
+ }
165
+ // Create and populate table
166
+ const table = createTable({
167
+ head: ["Name", "Status", "Dependencies", "PR"],
168
+ colWidths: [35, 12, 40, 30],
169
+ });
170
+ for (const prd of filteredPrds) {
171
+ const prBranch = prd.prBranch;
172
+ table.push([
173
+ prd.status === "done" ? chalk.dim(prd.name) : prd.name,
174
+ formatStatus(prd.status),
175
+ formatDependencies(prd.dependencies, prd.unmetDependencies),
176
+ prBranch ? chalk.cyan(prBranch) : chalk.dim("-"),
177
+ ]);
178
+ }
179
+ console.log(table.toString());
180
+ // Summary counts
181
+ const ready = filteredPrds.filter((p) => p.status === "ready").length;
182
+ const blocked = filteredPrds.filter((p) => p.status === "blocked").length;
183
+ const inProgress = filteredPrds.filter((p) => p.status === "in-progress").length;
184
+ const pendingReview = filteredPrds.filter((p) => p.status === "pending-review").length;
185
+ const done = filteredPrds.filter((p) => p.status === "done").length;
186
+ console.log();
187
+ dim(` Ready: ${ready} | Blocked: ${blocked} | In Progress: ${inProgress} | Pending Review: ${pendingReview} | Done: ${done}`);
188
+ console.log();
189
+ }
190
+ catch (error) {
191
+ console.error(`Error listing PRDs: ${error instanceof Error ? error.message : String(error)}`);
192
+ process.exit(1);
193
+ }
194
+ });
195
+ }
196
+ //# sourceMappingURL=prds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prds.js","sourceRoot":"","sources":["../../../src/commands/prds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * PRs command for Night Watch CLI
3
+ * Lists matching PRs with their CI status and review scores
4
+ */
5
+ import { Command } from "commander";
6
+ export interface IPrsOptions {
7
+ json?: boolean;
8
+ debug?: boolean;
9
+ }
10
+ /**
11
+ * PRs command implementation
12
+ */
13
+ export declare function prsCommand(program: Command): void;
14
+ //# sourceMappingURL=prs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prs.d.ts","sourceRoot":"","sources":["../../../src/commands/prs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyEjD"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * PRs command for Night Watch CLI
3
+ * Lists matching PRs with their CI status and review scores
4
+ */
5
+ import chalk from "chalk";
6
+ import { loadConfig } from "../config.js";
7
+ import { collectPrInfo } from "../utils/status-data.js";
8
+ import { createTable, dim, header, info } from "../utils/ui.js";
9
+ /**
10
+ * Format CI status with color coding
11
+ */
12
+ function formatCiStatus(status) {
13
+ switch (status) {
14
+ case "pass":
15
+ return chalk.green("pass");
16
+ case "fail":
17
+ return chalk.red("fail");
18
+ case "pending":
19
+ return chalk.yellow("pending");
20
+ default:
21
+ return chalk.dim("unknown");
22
+ }
23
+ }
24
+ /**
25
+ * Format review score with color coding
26
+ */
27
+ function formatReviewScore(score) {
28
+ if (score === null) {
29
+ return chalk.dim("-");
30
+ }
31
+ if (score >= 80) {
32
+ return chalk.green(String(score));
33
+ }
34
+ if (score >= 60) {
35
+ return chalk.yellow(String(score));
36
+ }
37
+ return chalk.red(String(score));
38
+ }
39
+ /**
40
+ * PRs command implementation
41
+ */
42
+ export function prsCommand(program) {
43
+ program
44
+ .command("prs")
45
+ .description("List matching PRs with CI status and review scores")
46
+ .option("--json", "Output PRs as JSON")
47
+ .option("--debug", "Enable debug logging to show raw API data")
48
+ .action(async (options) => {
49
+ try {
50
+ // Enable debug mode if requested
51
+ if (options.debug) {
52
+ process.env.DEBUG_PR_DATA = "1";
53
+ }
54
+ const projectDir = process.cwd();
55
+ const config = loadConfig(projectDir);
56
+ const prs = collectPrInfo(projectDir, config.branchPatterns);
57
+ // Output as JSON if requested
58
+ if (options.json) {
59
+ const output = {
60
+ prs,
61
+ count: prs.length,
62
+ };
63
+ console.log(JSON.stringify(output, null, 2));
64
+ return;
65
+ }
66
+ // Print header
67
+ console.log();
68
+ console.log(chalk.bold.cyan("Night Watch PRs"));
69
+ console.log(chalk.dim("-".repeat(40)));
70
+ console.log();
71
+ if (prs.length === 0) {
72
+ info("No open PRs matching configured branch patterns found.");
73
+ dim(`Branch patterns: ${config.branchPatterns.join(", ")}`);
74
+ console.log();
75
+ return;
76
+ }
77
+ header(`Open PRs (${prs.length})`);
78
+ // Create and populate table
79
+ const table = createTable({
80
+ head: ["#", "Title", "Branch", "CI", "Score", "URL"],
81
+ colWidths: [6, 30, 25, 10, 8, 50],
82
+ });
83
+ for (const pr of prs) {
84
+ // Truncate title if too long
85
+ const title = pr.title.length > 27 ? pr.title.substring(0, 24) + "..." : pr.title;
86
+ // Truncate branch if too long
87
+ const branch = pr.branch.length > 22 ? pr.branch.substring(0, 19) + "..." : pr.branch;
88
+ table.push([
89
+ String(pr.number),
90
+ title,
91
+ branch,
92
+ formatCiStatus(pr.ciStatus),
93
+ formatReviewScore(pr.reviewScore),
94
+ pr.url,
95
+ ]);
96
+ }
97
+ console.log(table.toString());
98
+ console.log();
99
+ }
100
+ catch (error) {
101
+ console.error(`Error listing PRs: ${error instanceof Error ? error.message : String(error)}`);
102
+ process.exit(1);
103
+ }
104
+ });
105
+ }
106
+ //# sourceMappingURL=prs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prs.js","sourceRoot":"","sources":["../../../src/commands/prs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAW,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAOhE;;GAEG;AACH,SAAS,cAAc,CAAC,MAA2B;IACjD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC;YACE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAoB;IAC7C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC;AAUD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC;SACtC,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,iCAAiC;YACjC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC;YAClC,CAAC;YAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAE7D,8BAA8B;YAC9B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAmB;oBAC7B,GAAG;oBACH,KAAK,EAAE,GAAG,CAAC,MAAM;iBAClB,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,eAAe;YACf,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,wDAAwD,CAAC,CAAC;gBAC/D,GAAG,CAAC,oBAAoB,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,CAAC,aAAa,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YAEnC,4BAA4B;YAC5B,MAAM,KAAK,GAAG,WAAW,CAAC;gBACxB,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;gBACpD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;aAClC,CAAC,CAAC;YAEH,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,6BAA6B;gBAC7B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;gBAClF,8BAA8B;gBAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;gBAEtF,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;oBACjB,KAAK;oBACL,MAAM;oBACN,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC;oBAC3B,iBAAiB,CAAC,EAAE,CAAC,WAAW,CAAC;oBACjC,EAAE,CAAC,GAAG;iBACP,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC/E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}