hub-launch 1.0.3

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 (331) hide show
  1. package/CHANGELOG.md +144 -0
  2. package/README.md +195 -0
  3. package/bin/hublaunch +20 -0
  4. package/dist/commands/checkout.d.ts +7 -0
  5. package/dist/commands/checkout.d.ts.map +1 -0
  6. package/dist/commands/checkout.js +164 -0
  7. package/dist/commands/checkout.js.map +1 -0
  8. package/dist/commands/clean.d.ts +7 -0
  9. package/dist/commands/clean.d.ts.map +1 -0
  10. package/dist/commands/clean.js +206 -0
  11. package/dist/commands/clean.js.map +1 -0
  12. package/dist/commands/close.d.ts +7 -0
  13. package/dist/commands/close.d.ts.map +1 -0
  14. package/dist/commands/close.js +109 -0
  15. package/dist/commands/close.js.map +1 -0
  16. package/dist/commands/create.d.ts +7 -0
  17. package/dist/commands/create.d.ts.map +1 -0
  18. package/dist/commands/create.js +367 -0
  19. package/dist/commands/create.js.map +1 -0
  20. package/dist/commands/diff.d.ts +7 -0
  21. package/dist/commands/diff.d.ts.map +1 -0
  22. package/dist/commands/diff.js +98 -0
  23. package/dist/commands/diff.js.map +1 -0
  24. package/dist/commands/execute.d.ts +7 -0
  25. package/dist/commands/execute.d.ts.map +1 -0
  26. package/dist/commands/execute.js +376 -0
  27. package/dist/commands/execute.js.map +1 -0
  28. package/dist/commands/init.d.ts +8 -0
  29. package/dist/commands/init.d.ts.map +1 -0
  30. package/dist/commands/init.js +1243 -0
  31. package/dist/commands/init.js.map +1 -0
  32. package/dist/commands/interactive.d.ts +12 -0
  33. package/dist/commands/interactive.d.ts.map +1 -0
  34. package/dist/commands/interactive.js +1071 -0
  35. package/dist/commands/interactive.js.map +1 -0
  36. package/dist/commands/launch.d.ts +16 -0
  37. package/dist/commands/launch.d.ts.map +1 -0
  38. package/dist/commands/launch.js +684 -0
  39. package/dist/commands/launch.js.map +1 -0
  40. package/dist/commands/login.d.ts +40 -0
  41. package/dist/commands/login.d.ts.map +1 -0
  42. package/dist/commands/login.js +469 -0
  43. package/dist/commands/login.js.map +1 -0
  44. package/dist/commands/logs.d.ts +22 -0
  45. package/dist/commands/logs.d.ts.map +1 -0
  46. package/dist/commands/logs.js +105 -0
  47. package/dist/commands/logs.js.map +1 -0
  48. package/dist/commands/merge.d.ts +7 -0
  49. package/dist/commands/merge.d.ts.map +1 -0
  50. package/dist/commands/merge.js +240 -0
  51. package/dist/commands/merge.js.map +1 -0
  52. package/dist/commands/preview.d.ts +7 -0
  53. package/dist/commands/preview.d.ts.map +1 -0
  54. package/dist/commands/preview.js +160 -0
  55. package/dist/commands/preview.js.map +1 -0
  56. package/dist/commands/project.d.ts +18 -0
  57. package/dist/commands/project.d.ts.map +1 -0
  58. package/dist/commands/project.js +352 -0
  59. package/dist/commands/project.js.map +1 -0
  60. package/dist/commands/respond.d.ts +7 -0
  61. package/dist/commands/respond.d.ts.map +1 -0
  62. package/dist/commands/respond.js +112 -0
  63. package/dist/commands/respond.js.map +1 -0
  64. package/dist/commands/setPriority.d.ts +7 -0
  65. package/dist/commands/setPriority.d.ts.map +1 -0
  66. package/dist/commands/setPriority.js +112 -0
  67. package/dist/commands/setPriority.js.map +1 -0
  68. package/dist/commands/track.d.ts +7 -0
  69. package/dist/commands/track.d.ts.map +1 -0
  70. package/dist/commands/track.js +140 -0
  71. package/dist/commands/track.js.map +1 -0
  72. package/dist/commands/upload.d.ts +21 -0
  73. package/dist/commands/upload.d.ts.map +1 -0
  74. package/dist/commands/upload.js +145 -0
  75. package/dist/commands/upload.js.map +1 -0
  76. package/dist/commands/view.d.ts +7 -0
  77. package/dist/commands/view.d.ts.map +1 -0
  78. package/dist/commands/view.js +168 -0
  79. package/dist/commands/view.js.map +1 -0
  80. package/dist/commands/watch.d.ts +7 -0
  81. package/dist/commands/watch.d.ts.map +1 -0
  82. package/dist/commands/watch.js +438 -0
  83. package/dist/commands/watch.js.map +1 -0
  84. package/dist/commands/worktree.d.ts +7 -0
  85. package/dist/commands/worktree.d.ts.map +1 -0
  86. package/dist/commands/worktree.js +122 -0
  87. package/dist/commands/worktree.js.map +1 -0
  88. package/dist/config/command-names.d.ts +16 -0
  89. package/dist/config/command-names.d.ts.map +1 -0
  90. package/dist/config/command-names.js +17 -0
  91. package/dist/config/command-names.js.map +1 -0
  92. package/dist/config/constants.d.ts +12 -0
  93. package/dist/config/constants.d.ts.map +1 -0
  94. package/dist/config/constants.js +12 -0
  95. package/dist/config/constants.js.map +1 -0
  96. package/dist/config/index.d.ts +47 -0
  97. package/dist/config/index.d.ts.map +1 -0
  98. package/dist/config/index.js +175 -0
  99. package/dist/config/index.js.map +1 -0
  100. package/dist/index.d.ts +3 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +148 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/services/api/HulaApiClient.d.ts +170 -0
  105. package/dist/services/api/HulaApiClient.d.ts.map +1 -0
  106. package/dist/services/api/HulaApiClient.js +233 -0
  107. package/dist/services/api/HulaApiClient.js.map +1 -0
  108. package/dist/services/diff/DiffService.d.ts +44 -0
  109. package/dist/services/diff/DiffService.d.ts.map +1 -0
  110. package/dist/services/diff/DiffService.js +126 -0
  111. package/dist/services/diff/DiffService.js.map +1 -0
  112. package/dist/services/editor/EditorService.d.ts +53 -0
  113. package/dist/services/editor/EditorService.d.ts.map +1 -0
  114. package/dist/services/editor/EditorService.js +161 -0
  115. package/dist/services/editor/EditorService.js.map +1 -0
  116. package/dist/services/git/GitService.d.ts +124 -0
  117. package/dist/services/git/GitService.d.ts.map +1 -0
  118. package/dist/services/git/GitService.js +423 -0
  119. package/dist/services/git/GitService.js.map +1 -0
  120. package/dist/services/git/WorktreeService.d.ts +144 -0
  121. package/dist/services/git/WorktreeService.d.ts.map +1 -0
  122. package/dist/services/git/WorktreeService.js +505 -0
  123. package/dist/services/git/WorktreeService.js.map +1 -0
  124. package/dist/services/github/ActionsService.d.ts +66 -0
  125. package/dist/services/github/ActionsService.d.ts.map +1 -0
  126. package/dist/services/github/ActionsService.js +114 -0
  127. package/dist/services/github/ActionsService.js.map +1 -0
  128. package/dist/services/github/AssetUploadService.d.ts +103 -0
  129. package/dist/services/github/AssetUploadService.d.ts.map +1 -0
  130. package/dist/services/github/AssetUploadService.js +299 -0
  131. package/dist/services/github/AssetUploadService.js.map +1 -0
  132. package/dist/services/github/BatchCopilotDetectionService.d.ts +58 -0
  133. package/dist/services/github/BatchCopilotDetectionService.d.ts.map +1 -0
  134. package/dist/services/github/BatchCopilotDetectionService.js +321 -0
  135. package/dist/services/github/BatchCopilotDetectionService.js.map +1 -0
  136. package/dist/services/github/CopilotDetectionService.d.ts +40 -0
  137. package/dist/services/github/CopilotDetectionService.d.ts.map +1 -0
  138. package/dist/services/github/CopilotDetectionService.js +280 -0
  139. package/dist/services/github/CopilotDetectionService.js.map +1 -0
  140. package/dist/services/github/CopilotService.d.ts +27 -0
  141. package/dist/services/github/CopilotService.d.ts.map +1 -0
  142. package/dist/services/github/CopilotService.js +249 -0
  143. package/dist/services/github/CopilotService.js.map +1 -0
  144. package/dist/services/github/DeploymentDetectionService.d.ts +38 -0
  145. package/dist/services/github/DeploymentDetectionService.d.ts.map +1 -0
  146. package/dist/services/github/DeploymentDetectionService.js +104 -0
  147. package/dist/services/github/DeploymentDetectionService.js.map +1 -0
  148. package/dist/services/github/GithubAppService.d.ts +40 -0
  149. package/dist/services/github/GithubAppService.d.ts.map +1 -0
  150. package/dist/services/github/GithubAppService.js +187 -0
  151. package/dist/services/github/GithubAppService.js.map +1 -0
  152. package/dist/services/github/IssueService.d.ts +65 -0
  153. package/dist/services/github/IssueService.d.ts.map +1 -0
  154. package/dist/services/github/IssueService.js +231 -0
  155. package/dist/services/github/IssueService.js.map +1 -0
  156. package/dist/services/github/LabelService.d.ts +36 -0
  157. package/dist/services/github/LabelService.d.ts.map +1 -0
  158. package/dist/services/github/LabelService.js +122 -0
  159. package/dist/services/github/LabelService.js.map +1 -0
  160. package/dist/services/github/PRService.d.ts +77 -0
  161. package/dist/services/github/PRService.d.ts.map +1 -0
  162. package/dist/services/github/PRService.js +287 -0
  163. package/dist/services/github/PRService.js.map +1 -0
  164. package/dist/services/github/ProjectService.d.ts +144 -0
  165. package/dist/services/github/ProjectService.d.ts.map +1 -0
  166. package/dist/services/github/ProjectService.js +804 -0
  167. package/dist/services/github/ProjectService.js.map +1 -0
  168. package/dist/services/hooks/HookExecutor.d.ts +66 -0
  169. package/dist/services/hooks/HookExecutor.d.ts.map +1 -0
  170. package/dist/services/hooks/HookExecutor.js +227 -0
  171. package/dist/services/hooks/HookExecutor.js.map +1 -0
  172. package/dist/services/hooks/index.d.ts +2 -0
  173. package/dist/services/hooks/index.d.ts.map +1 -0
  174. package/dist/services/hooks/index.js +2 -0
  175. package/dist/services/hooks/index.js.map +1 -0
  176. package/dist/services/logs/LogFormatterService.d.ts +17 -0
  177. package/dist/services/logs/LogFormatterService.d.ts.map +1 -0
  178. package/dist/services/logs/LogFormatterService.js +35 -0
  179. package/dist/services/logs/LogFormatterService.js.map +1 -0
  180. package/dist/services/logs/TempFileService.d.ts +27 -0
  181. package/dist/services/logs/TempFileService.d.ts.map +1 -0
  182. package/dist/services/logs/TempFileService.js +90 -0
  183. package/dist/services/logs/TempFileService.js.map +1 -0
  184. package/dist/services/logs/index.d.ts +3 -0
  185. package/dist/services/logs/index.d.ts.map +1 -0
  186. package/dist/services/logs/index.js +4 -0
  187. package/dist/services/logs/index.js.map +1 -0
  188. package/dist/services/plan/PlanService.d.ts +70 -0
  189. package/dist/services/plan/PlanService.d.ts.map +1 -0
  190. package/dist/services/plan/PlanService.js +211 -0
  191. package/dist/services/plan/PlanService.js.map +1 -0
  192. package/dist/services/polling/GitHubDirectPollingAdapter.d.ts +16 -0
  193. package/dist/services/polling/GitHubDirectPollingAdapter.d.ts.map +1 -0
  194. package/dist/services/polling/GitHubDirectPollingAdapter.js +87 -0
  195. package/dist/services/polling/GitHubDirectPollingAdapter.js.map +1 -0
  196. package/dist/services/polling/HulaServerPollingAdapter.d.ts +23 -0
  197. package/dist/services/polling/HulaServerPollingAdapter.d.ts.map +1 -0
  198. package/dist/services/polling/HulaServerPollingAdapter.js +78 -0
  199. package/dist/services/polling/HulaServerPollingAdapter.js.map +1 -0
  200. package/dist/services/polling/IStatusPollingAdapter.d.ts +29 -0
  201. package/dist/services/polling/IStatusPollingAdapter.d.ts.map +1 -0
  202. package/dist/services/polling/IStatusPollingAdapter.js +2 -0
  203. package/dist/services/polling/IStatusPollingAdapter.js.map +1 -0
  204. package/dist/services/polling/StatusPollingAdapterFactory.d.ts +14 -0
  205. package/dist/services/polling/StatusPollingAdapterFactory.d.ts.map +1 -0
  206. package/dist/services/polling/StatusPollingAdapterFactory.js +41 -0
  207. package/dist/services/polling/StatusPollingAdapterFactory.js.map +1 -0
  208. package/dist/services/polling/index.d.ts +5 -0
  209. package/dist/services/polling/index.d.ts.map +1 -0
  210. package/dist/services/polling/index.js +5 -0
  211. package/dist/services/polling/index.js.map +1 -0
  212. package/dist/services/preview/PreviewService.d.ts +86 -0
  213. package/dist/services/preview/PreviewService.d.ts.map +1 -0
  214. package/dist/services/preview/PreviewService.js +439 -0
  215. package/dist/services/preview/PreviewService.js.map +1 -0
  216. package/dist/services/tracking/ProjectTrackingAdapter.d.ts +41 -0
  217. package/dist/services/tracking/ProjectTrackingAdapter.d.ts.map +1 -0
  218. package/dist/services/tracking/ProjectTrackingAdapter.js +230 -0
  219. package/dist/services/tracking/ProjectTrackingAdapter.js.map +1 -0
  220. package/dist/services/tracking/RemoteTrackingAdapter.d.ts +62 -0
  221. package/dist/services/tracking/RemoteTrackingAdapter.d.ts.map +1 -0
  222. package/dist/services/tracking/RemoteTrackingAdapter.js +242 -0
  223. package/dist/services/tracking/RemoteTrackingAdapter.js.map +1 -0
  224. package/dist/services/tracking/TrackingAdapterFactory.d.ts +25 -0
  225. package/dist/services/tracking/TrackingAdapterFactory.d.ts.map +1 -0
  226. package/dist/services/tracking/TrackingAdapterFactory.js +55 -0
  227. package/dist/services/tracking/TrackingAdapterFactory.js.map +1 -0
  228. package/dist/services/tracking/TrackingService.d.ts +104 -0
  229. package/dist/services/tracking/TrackingService.d.ts.map +1 -0
  230. package/dist/services/tracking/TrackingService.js +256 -0
  231. package/dist/services/tracking/TrackingService.js.map +1 -0
  232. package/dist/services/tracking/UntrackedIssuesService.d.ts +20 -0
  233. package/dist/services/tracking/UntrackedIssuesService.d.ts.map +1 -0
  234. package/dist/services/tracking/UntrackedIssuesService.js +148 -0
  235. package/dist/services/tracking/UntrackedIssuesService.js.map +1 -0
  236. package/dist/services/tracking/local-file-migration.d.ts +16 -0
  237. package/dist/services/tracking/local-file-migration.d.ts.map +1 -0
  238. package/dist/services/tracking/local-file-migration.js +86 -0
  239. package/dist/services/tracking/local-file-migration.js.map +1 -0
  240. package/dist/templates/planning-instructions.md +752 -0
  241. package/dist/templates/proceed-instructions.md +453 -0
  242. package/dist/templates/scripts/hula-fix-commit.sh +110 -0
  243. package/dist/templates/scripts/hula-fix-setup.sh +145 -0
  244. package/dist/templates/scripts/hula-launch-run.sh +89 -0
  245. package/dist/templates/scripts/hula-merge-local.sh +138 -0
  246. package/dist/templates/scripts/hula-merge-remote.sh +74 -0
  247. package/dist/templates/scripts/hula-read-config.sh +38 -0
  248. package/dist/templates/scripts/hula-verify-gather.sh +135 -0
  249. package/dist/templates/scripts/hula-verify-post.sh +84 -0
  250. package/dist/templates/skills/hula-confirm/SKILL.md +361 -0
  251. package/dist/templates/skills/hula-create/SKILL.md +211 -0
  252. package/dist/templates/skills/hula-fix/SKILL.md +224 -0
  253. package/dist/templates/skills/hula-launch/SKILL.md +159 -0
  254. package/dist/templates/skills/hula-log/SKILL.md +105 -0
  255. package/dist/templates/skills/hula-merge/SKILL.md +387 -0
  256. package/dist/templates/skills/hula-plan/SKILL.md +148 -0
  257. package/dist/templates/skills/hula-upload/SKILL.md +115 -0
  258. package/dist/templates/skills/hula-verify/SKILL.md +754 -0
  259. package/dist/types/common.schema.d.ts +46 -0
  260. package/dist/types/common.schema.d.ts.map +1 -0
  261. package/dist/types/common.schema.js +60 -0
  262. package/dist/types/common.schema.js.map +1 -0
  263. package/dist/types/config.schema.d.ts +443 -0
  264. package/dist/types/config.schema.d.ts.map +1 -0
  265. package/dist/types/config.schema.js +126 -0
  266. package/dist/types/config.schema.js.map +1 -0
  267. package/dist/types/index.d.ts +6 -0
  268. package/dist/types/index.d.ts.map +1 -0
  269. package/dist/types/index.js +7 -0
  270. package/dist/types/index.js.map +1 -0
  271. package/dist/types/issue.schema.d.ts +136 -0
  272. package/dist/types/issue.schema.d.ts.map +1 -0
  273. package/dist/types/issue.schema.js +49 -0
  274. package/dist/types/issue.schema.js.map +1 -0
  275. package/dist/types/pr.schema.d.ts +118 -0
  276. package/dist/types/pr.schema.d.ts.map +1 -0
  277. package/dist/types/pr.schema.js +40 -0
  278. package/dist/types/pr.schema.js.map +1 -0
  279. package/dist/types/tracking.schema.d.ts +340 -0
  280. package/dist/types/tracking.schema.d.ts.map +1 -0
  281. package/dist/types/tracking.schema.js +56 -0
  282. package/dist/types/tracking.schema.js.map +1 -0
  283. package/dist/utils/browser-launcher.d.ts +60 -0
  284. package/dist/utils/browser-launcher.d.ts.map +1 -0
  285. package/dist/utils/browser-launcher.js +263 -0
  286. package/dist/utils/browser-launcher.js.map +1 -0
  287. package/dist/utils/cache.d.ts +44 -0
  288. package/dist/utils/cache.d.ts.map +1 -0
  289. package/dist/utils/cache.js +94 -0
  290. package/dist/utils/cache.js.map +1 -0
  291. package/dist/utils/config-parser.d.ts +16 -0
  292. package/dist/utils/config-parser.d.ts.map +1 -0
  293. package/dist/utils/config-parser.js +210 -0
  294. package/dist/utils/config-parser.js.map +1 -0
  295. package/dist/utils/editor.d.ts +21 -0
  296. package/dist/utils/editor.d.ts.map +1 -0
  297. package/dist/utils/editor.js +213 -0
  298. package/dist/utils/editor.js.map +1 -0
  299. package/dist/utils/git-utils.d.ts +5 -0
  300. package/dist/utils/git-utils.d.ts.map +1 -0
  301. package/dist/utils/git-utils.js +18 -0
  302. package/dist/utils/git-utils.js.map +1 -0
  303. package/dist/utils/github-cli.d.ts +62 -0
  304. package/dist/utils/github-cli.d.ts.map +1 -0
  305. package/dist/utils/github-cli.js +492 -0
  306. package/dist/utils/github-cli.js.map +1 -0
  307. package/dist/utils/logger.d.ts +45 -0
  308. package/dist/utils/logger.d.ts.map +1 -0
  309. package/dist/utils/logger.js +118 -0
  310. package/dist/utils/logger.js.map +1 -0
  311. package/dist/utils/open-url.d.ts +19 -0
  312. package/dist/utils/open-url.d.ts.map +1 -0
  313. package/dist/utils/open-url.js +37 -0
  314. package/dist/utils/open-url.js.map +1 -0
  315. package/dist/utils/project-resolver.d.ts +13 -0
  316. package/dist/utils/project-resolver.d.ts.map +1 -0
  317. package/dist/utils/project-resolver.js +35 -0
  318. package/dist/utils/project-resolver.js.map +1 -0
  319. package/dist/utils/prompts.d.ts +80 -0
  320. package/dist/utils/prompts.d.ts.map +1 -0
  321. package/dist/utils/prompts.js +326 -0
  322. package/dist/utils/prompts.js.map +1 -0
  323. package/dist/utils/shell.d.ts +54 -0
  324. package/dist/utils/shell.d.ts.map +1 -0
  325. package/dist/utils/shell.js +152 -0
  326. package/dist/utils/shell.js.map +1 -0
  327. package/dist/utils/validators.d.ts +32 -0
  328. package/dist/utils/validators.d.ts.map +1 -0
  329. package/dist/utils/validators.js +64 -0
  330. package/dist/utils/validators.js.map +1 -0
  331. package/package.json +73 -0
@@ -0,0 +1,352 @@
1
+ import { logger } from '../utils/logger.js';
2
+ import { ProjectService } from '../services/github/ProjectService.js';
3
+ import { getRepoInfo } from '../utils/github-cli.js';
4
+ import { PROJECT_FIELD_OPTIONS } from '../types/common.schema.js';
5
+ import inquirer from 'inquirer';
6
+ import { readFile, writeFile } from 'fs/promises';
7
+ import { join } from 'path';
8
+ import { getRepoRoot } from '../utils/shell.js';
9
+ /**
10
+ * Project command - Setup and manage GitHub Projects V2 integration
11
+ */
12
+ export function projectCommand(program, config) {
13
+ const projectCmd = program
14
+ .command('project')
15
+ .description('Manage GitHub Projects V2 integration');
16
+ projectCmd
17
+ .command('setup')
18
+ .description('Configure GitHub Projects integration')
19
+ .action(async () => {
20
+ try {
21
+ await executeProjectSetup(config);
22
+ }
23
+ catch (error) {
24
+ logger.error('Failed to setup project:');
25
+ logger.error(error instanceof Error ? error.message : String(error));
26
+ process.exit(1);
27
+ }
28
+ });
29
+ projectCmd
30
+ .command('status')
31
+ .description('Show project integration status')
32
+ .action(async () => {
33
+ try {
34
+ await showProjectStatus(config);
35
+ }
36
+ catch (error) {
37
+ logger.error('Failed to show status:');
38
+ logger.error(error instanceof Error ? error.message : String(error));
39
+ process.exit(1);
40
+ }
41
+ });
42
+ }
43
+ /**
44
+ * Run project setup flow and return configuration values
45
+ * This can be called from both 'project setup' and 'init' commands
46
+ * Returns null if setup is cancelled or fails
47
+ */
48
+ export async function runProjectSetupFlow() {
49
+ try {
50
+ const projectService = new ProjectService();
51
+ // Ensure GitHub CLI has project scope
52
+ const hasScope = await projectService.ensureProjectScope();
53
+ if (!hasScope) {
54
+ logger.error('Could not configure project scope. Please run: gh auth refresh -s project');
55
+ return null;
56
+ }
57
+ logger.blank();
58
+ // Get repository info
59
+ const repo = await getRepoInfo();
60
+ logger.info(`Repository: ${repo.owner}/${repo.name}`);
61
+ logger.blank();
62
+ // Ask if user wants to create new or use existing project
63
+ const { action } = await inquirer.prompt([
64
+ {
65
+ type: 'list',
66
+ name: 'action',
67
+ message: 'What would you like to do?',
68
+ choices: [
69
+ { name: 'Create new project', value: 'create' },
70
+ { name: 'Use existing project', value: 'existing' },
71
+ ],
72
+ },
73
+ ]);
74
+ let projectNumber;
75
+ let projectOwner;
76
+ if (action === 'create') {
77
+ // Ask which account to create project under
78
+ const { createUnder } = await inquirer.prompt([
79
+ {
80
+ type: 'list',
81
+ name: 'createUnder',
82
+ message: 'Create project under which GitHub account?',
83
+ choices: [
84
+ { name: `Repository owner (${repo.owner})`, value: repo.owner },
85
+ { name: 'My personal account', value: 'personal' },
86
+ { name: 'Enter manually', value: 'manual' },
87
+ ],
88
+ },
89
+ ]);
90
+ if (createUnder === 'personal') {
91
+ // Get authenticated user
92
+ const { runGh } = await import('../utils/github-cli.js');
93
+ const userInfo = await runGh(['api', 'user', '--jq', '.login']);
94
+ projectOwner = userInfo.trim();
95
+ }
96
+ else if (createUnder === 'manual') {
97
+ const { manualOwner } = await inquirer.prompt([
98
+ {
99
+ type: 'input',
100
+ name: 'manualOwner',
101
+ message: 'Enter GitHub username or organization:',
102
+ validate: (input) => input.trim().length > 0 || 'Username is required',
103
+ },
104
+ ]);
105
+ projectOwner = manualOwner.trim();
106
+ }
107
+ else {
108
+ projectOwner = repo.owner;
109
+ }
110
+ // Create new project
111
+ projectNumber = await projectService.createProject(projectOwner);
112
+ logger.blank();
113
+ }
114
+ else {
115
+ // Ask which account the project is under
116
+ const { searchUnder } = await inquirer.prompt([
117
+ {
118
+ type: 'list',
119
+ name: 'searchUnder',
120
+ message: 'Search for project under which GitHub account?',
121
+ choices: [
122
+ { name: `Repository owner (${repo.owner})`, value: repo.owner },
123
+ { name: 'My personal account', value: 'personal' },
124
+ { name: 'Enter manually', value: 'manual' },
125
+ ],
126
+ },
127
+ ]);
128
+ if (searchUnder === 'personal') {
129
+ // Get authenticated user
130
+ const { runGh } = await import('../utils/github-cli.js');
131
+ const userInfo = await runGh(['api', 'user', '--jq', '.login']);
132
+ projectOwner = userInfo.trim();
133
+ }
134
+ else if (searchUnder === 'manual') {
135
+ const { manualOwner } = await inquirer.prompt([
136
+ {
137
+ type: 'input',
138
+ name: 'manualOwner',
139
+ message: 'Enter GitHub username or organization:',
140
+ validate: (input) => input.trim().length > 0 || 'Username is required',
141
+ },
142
+ ]);
143
+ projectOwner = manualOwner.trim();
144
+ }
145
+ else {
146
+ projectOwner = repo.owner;
147
+ }
148
+ // Find existing project or create
149
+ const existingProject = await projectService.findExistingProject(projectOwner);
150
+ if (existingProject !== null) {
151
+ const { useExisting } = await inquirer.prompt([
152
+ {
153
+ type: 'confirm',
154
+ name: 'useExisting',
155
+ message: `Found existing project #${existingProject}. Use this project?`,
156
+ default: true,
157
+ },
158
+ ]);
159
+ if (useExisting) {
160
+ projectNumber = existingProject;
161
+ }
162
+ else {
163
+ projectNumber = await projectService.createProject(projectOwner);
164
+ }
165
+ }
166
+ else {
167
+ logger.warning(`No existing 'HubLaunch Issue Tracking' project found under ${projectOwner}.`);
168
+ const { enterManually } = await inquirer.prompt([
169
+ {
170
+ type: 'confirm',
171
+ name: 'enterManually',
172
+ message: 'Do you want to enter a project number manually?',
173
+ default: false,
174
+ },
175
+ ]);
176
+ if (enterManually) {
177
+ const { manualProjectNumber } = await inquirer.prompt([
178
+ {
179
+ type: 'input',
180
+ name: 'manualProjectNumber',
181
+ message: 'Enter project number:',
182
+ validate: (input) => {
183
+ const num = parseInt(input, 10);
184
+ return ((!isNaN(num) && num > 0) ||
185
+ 'Please enter a valid project number');
186
+ },
187
+ },
188
+ ]);
189
+ projectNumber = parseInt(manualProjectNumber, 10);
190
+ }
191
+ else {
192
+ const { createNew } = await inquirer.prompt([
193
+ {
194
+ type: 'confirm',
195
+ name: 'createNew',
196
+ message: 'Create new project?',
197
+ default: true,
198
+ },
199
+ ]);
200
+ if (!createNew) {
201
+ logger.info('Setup cancelled.');
202
+ return null;
203
+ }
204
+ projectNumber = await projectService.createProject(projectOwner);
205
+ }
206
+ }
207
+ }
208
+ logger.blank();
209
+ logger.info('Getting project ID...');
210
+ const projectId = await projectService.getProjectId(projectOwner, projectNumber);
211
+ logger.success(`Project ID: ${projectId}`);
212
+ // Create required fields
213
+ logger.blank();
214
+ logger.info('Setting up project fields...');
215
+ await createProjectFields(projectService, projectOwner, projectNumber, projectId);
216
+ logger.blank();
217
+ // Ask about auto-sync
218
+ const { enableAutoSync } = await inquirer.prompt([
219
+ {
220
+ type: 'confirm',
221
+ name: 'enableAutoSync',
222
+ message: 'Enable automatic sync to GitHub Projects?',
223
+ default: false,
224
+ },
225
+ ]);
226
+ return {
227
+ projectNumber,
228
+ projectId,
229
+ projectOwner,
230
+ enableAutoSync,
231
+ };
232
+ }
233
+ catch (error) {
234
+ logger.error('Project setup failed:');
235
+ logger.error(error instanceof Error ? error.message : String(error));
236
+ return null;
237
+ }
238
+ }
239
+ /**
240
+ * Execute project setup command
241
+ */
242
+ async function executeProjectSetup(_config) {
243
+ logger.section('GitHub Projects V2 Setup');
244
+ const result = await runProjectSetupFlow();
245
+ if (!result) {
246
+ logger.warning('Project setup was not completed.');
247
+ process.exit(1);
248
+ }
249
+ const { projectNumber, projectId, enableAutoSync } = result;
250
+ // Update config file
251
+ logger.blank();
252
+ logger.info('Updating configuration...');
253
+ await updateConfigFile(projectNumber, projectId, enableAutoSync);
254
+ logger.blank();
255
+ logger.section('Setup Complete!');
256
+ logger.info(`Project Number: ${projectNumber}`);
257
+ logger.info(`Project ID: ${projectId}`);
258
+ logger.info(`Auto-sync: ${enableAutoSync ? 'enabled' : 'disabled'}`);
259
+ logger.blank();
260
+ const repo = await getRepoInfo();
261
+ logger.info(`View project: https://github.com/orgs/${repo.owner}/projects/${projectNumber}`);
262
+ logger.blank();
263
+ if (!enableAutoSync) {
264
+ logger.warning('Auto-sync is disabled. Issues will be tracked locally.');
265
+ logger.info('To enable auto-sync, set projectAutoSync: true in .hublaunch/hublaunch.config.ts');
266
+ }
267
+ else {
268
+ logger.success('Auto-sync is enabled. All tracked issues will sync to GitHub Projects.');
269
+ }
270
+ }
271
+ /**
272
+ * Create required project fields
273
+ */
274
+ async function createProjectFields(projectService, owner, projectNumber, projectId) {
275
+ // Ensure Tracking Name field
276
+ await projectService.ensureTrackingNameField(owner, projectNumber);
277
+ logger.blank();
278
+ // Create trackingStatus field if it doesn't exist
279
+ await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'trackingStatus', PROJECT_FIELD_OPTIONS.TRACKING_STATUS);
280
+ logger.blank();
281
+ // Create priority field if it doesn't exist
282
+ await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'priority', PROJECT_FIELD_OPTIONS.PRIORITY);
283
+ logger.blank();
284
+ // Create OwnerIsTracking field (true/false for whether owner is tracking)
285
+ await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'OwnerIsTracking', ['true', 'false']);
286
+ logger.blank();
287
+ // Create AssigneeIsFollowing field (true/false for whether assignee is following)
288
+ await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'AssigneeIsFollowing', ['true', 'false']);
289
+ }
290
+ /**
291
+ * Update config file with project settings
292
+ * Directly updates hublaunch.config.js with proper JavaScript object syntax
293
+ */
294
+ async function updateConfigFile(projectNumber, projectId, enableAutoSync) {
295
+ const repoRoot = await getRepoRoot();
296
+ const configPath = join(repoRoot, '.hublaunch', 'hublaunch.config.js');
297
+ // Read the current config file
298
+ let content = await readFile(configPath, 'utf-8');
299
+ // Update projectNumber
300
+ if (content.includes('projectNumber:')) {
301
+ // Replace existing projectNumber line (commented or uncommented, with number or undefined)
302
+ content = content.replace(/\/\/\s*projectNumber:\s*(?:\d+|undefined),?|projectNumber:\s*\d+,?/, `projectNumber: ${projectNumber},`);
303
+ }
304
+ else {
305
+ // Add projectNumber after the config object opening
306
+ content = content.replace(/(export const config[^{]*{)/, `$1\n projectNumber: ${projectNumber},`);
307
+ }
308
+ // Update projectId
309
+ if (content.includes('projectId:')) {
310
+ // Replace existing projectId line (commented or uncommented, with string or undefined)
311
+ content = content.replace(/\/\/\s*projectId:\s*(?:['"][^'"]+['"]|undefined),?|projectId:\s*['"][^'"]+['"],?/, `projectId: '${projectId}',`);
312
+ }
313
+ else {
314
+ // Add projectId after projectNumber
315
+ content = content.replace(/(projectNumber:\s*\d+,)/, `$1\n projectId: '${projectId}',`);
316
+ }
317
+ // Update projectAutoSync
318
+ if (content.includes('projectAutoSync:')) {
319
+ // Replace existing projectAutoSync line (commented or uncommented)
320
+ content = content.replace(/\/\/\s*projectAutoSync:\s*(?:true|false),?|projectAutoSync:\s*(?:true|false),?/, `projectAutoSync: ${enableAutoSync},`);
321
+ }
322
+ else {
323
+ // Add projectAutoSync after projectId
324
+ content = content.replace(/(projectId:\s*['"][^'"]+['"],)/, `$1\n projectAutoSync: ${enableAutoSync},`);
325
+ }
326
+ // Write the updated config back
327
+ await writeFile(configPath, content, 'utf-8');
328
+ logger.success('Configuration updated in .hublaunch/hublaunch.config.js');
329
+ }
330
+ /**
331
+ * Show project integration status
332
+ */
333
+ async function showProjectStatus(config) {
334
+ logger.section('GitHub Projects Integration Status');
335
+ if (!config.projectNumber || !config.projectId) {
336
+ logger.warning('Not configured');
337
+ logger.info("Run 'hub-launch project setup' to configure");
338
+ return;
339
+ }
340
+ const repo = await getRepoInfo();
341
+ logger.info(`Project Number: ${config.projectNumber}`);
342
+ logger.info(`Project ID: ${config.projectId}`);
343
+ logger.info(`Auto-sync: ${config.projectAutoSync ? 'enabled' : 'disabled'}`);
344
+ logger.blank();
345
+ logger.info(`URL: https://github.com/orgs/${repo.owner}/projects/${config.projectNumber}`);
346
+ logger.blank();
347
+ if (!config.projectAutoSync) {
348
+ logger.warning('Auto-sync is disabled. Issues are tracked locally only.');
349
+ logger.info('To enable: set projectAutoSync: true in .hublaunch/hublaunch.config.ts');
350
+ }
351
+ }
352
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Command } from "commander";
2
+ import type { Config } from "../types/index.js";
3
+ /**
4
+ * Respond command - Respond to Copilot on an issue
5
+ */
6
+ export declare function respondCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=respond.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkBrE"}
@@ -0,0 +1,112 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { PRService } from "../services/github/PRService.js";
3
+ import { IssueService } from "../services/github/IssueService.js";
4
+ import { TrackingService, } from "../services/tracking/TrackingService.js";
5
+ import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
6
+ import { searchSelect, UserCancelledError } from "../utils/prompts.js";
7
+ /**
8
+ * Respond command - Respond to Copilot on an issue
9
+ */
10
+ export function respondCommand(program, config) {
11
+ program
12
+ .command("respond [issueNumber]")
13
+ .description("Respond to Copilot on an issue")
14
+ .option("--message <text>", "Message to send (skips editor)")
15
+ .action(async (issueNumber, options) => {
16
+ try {
17
+ await executeRespond(config, issueNumber, options);
18
+ }
19
+ catch (error) {
20
+ if (error instanceof UserCancelledError) {
21
+ logger.info('\nCancelled.');
22
+ process.exit(0);
23
+ }
24
+ logger.error("Failed to respond:");
25
+ logger.error(error instanceof Error ? error.message : String(error));
26
+ process.exit(1);
27
+ }
28
+ });
29
+ }
30
+ async function executeRespond(config, issueNumberArg, options) {
31
+ logger.section("Respond to Copilot");
32
+ // Initialize services
33
+ const prService = new PRService();
34
+ const issueService = new IssueService();
35
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
36
+ // Get issue number
37
+ let issueNumber;
38
+ if (issueNumberArg) {
39
+ issueNumber = parseInt(issueNumberArg, 10);
40
+ if (isNaN(issueNumber)) {
41
+ throw new Error(`Invalid issue number: ${issueNumberArg}`);
42
+ }
43
+ }
44
+ else {
45
+ // Show tracked issues and let user select
46
+ const trackedIssues = await trackingService.getAll();
47
+ if (trackedIssues.length === 0) {
48
+ throw new Error("No tracked issues found. Run 'hublaunch track' first.");
49
+ }
50
+ const choices = trackedIssues
51
+ .filter((issue) => issue.number !== undefined)
52
+ .map((issue) => ({
53
+ name: `#${issue.number} - ${issue.name}`,
54
+ value: issue.number.toString(),
55
+ }));
56
+ const selected = await searchSelect("Select issue to respond to:", choices);
57
+ issueNumber = parseInt(selected, 10);
58
+ }
59
+ // Check if there's a PR for this issue
60
+ const pr = await prService.getByIssue(issueNumber);
61
+ if (!pr) {
62
+ logger.error(`No PR found for issue #${issueNumber}. Copilot responses must be posted to PRs.`);
63
+ throw new Error("No PR found for this issue");
64
+ }
65
+ const targetNumber = pr.number;
66
+ logger.info(`Responding to PR #${targetNumber}...`);
67
+ logger.blank();
68
+ // Get message - let user choose compose mode
69
+ let message = options.message;
70
+ if (!message) {
71
+ // Import compose functions
72
+ const { selectComposeMode, openEditorForMessage, composeInTerminal, } = await import("../utils/editor.js");
73
+ // Ask user how they want to compose
74
+ const mode = await selectComposeMode();
75
+ if (!mode) {
76
+ // User cancelled
77
+ logger.warning("Message composition cancelled");
78
+ return;
79
+ }
80
+ logger.blank();
81
+ // Compose based on selected mode
82
+ if (mode === "editor") {
83
+ const editorMessage = await openEditorForMessage(config, "@copilot ");
84
+ if (!editorMessage) {
85
+ logger.warning("Message composition cancelled");
86
+ return;
87
+ }
88
+ message = editorMessage;
89
+ }
90
+ else {
91
+ // Terminal mode
92
+ const terminalMessage = await composeInTerminal("@copilot ");
93
+ if (!terminalMessage) {
94
+ logger.warning("Message composition cancelled");
95
+ return;
96
+ }
97
+ message = terminalMessage;
98
+ }
99
+ logger.blank();
100
+ }
101
+ // Ensure @copilot prefix
102
+ if (!message.trim().startsWith("@copilot")) {
103
+ message = `@copilot ${message}`;
104
+ }
105
+ logger.info("Posting comment...");
106
+ // Post comment to PR
107
+ await issueService.addComment(targetNumber, message);
108
+ logger.blank();
109
+ logger.success(`✓ Comment posted to PR #${targetNumber}`);
110
+ logger.blank();
111
+ }
112
+ //# sourceMappingURL=respond.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Command } from "commander";
2
+ import type { Config } from "../types/index.js";
3
+ /**
4
+ * SetPriority command - Set priority label for tracked issue
5
+ */
6
+ export declare function setPriorityCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=setPriority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setPriority.d.ts","sourceRoot":"","sources":["../../src/commands/setPriority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAC;AAK1D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBzE"}
@@ -0,0 +1,112 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { TrackingService, } from "../services/tracking/TrackingService.js";
3
+ import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
4
+ import { searchSelect, selectPriority, UserCancelledError } from "../utils/prompts.js";
5
+ import { DEFAULT_PRIORITY_LEVELS } from "../types/index.js";
6
+ import { HulaApiClient } from "../services/api/HulaApiClient.js";
7
+ /**
8
+ * SetPriority command - Set priority label for tracked issue
9
+ */
10
+ export function setPriorityCommand(program, config) {
11
+ program
12
+ .command("setPriority [issueNumber] [priority]")
13
+ .description("Set priority label for tracked issue")
14
+ .action(async (issueNumber, priority) => {
15
+ try {
16
+ await executeSetPriority(config, issueNumber, priority);
17
+ }
18
+ catch (error) {
19
+ if (error instanceof UserCancelledError) {
20
+ logger.info('\nCancelled.');
21
+ process.exit(0);
22
+ }
23
+ logger.error("Failed to set priority:");
24
+ logger.error(error instanceof Error ? error.message : String(error));
25
+ process.exit(1);
26
+ }
27
+ });
28
+ }
29
+ async function executeSetPriority(config, issueNumberArg, priorityArg) {
30
+ logger.section("Set Issue Priority");
31
+ // Validate config
32
+ if (!config.hulaProjectUrl || !config.hulaApiKey) {
33
+ throw new Error('Hula project URL and API key are required. Run "hula init" to configure.');
34
+ }
35
+ // Initialize services
36
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
37
+ const apiClient = new HulaApiClient({
38
+ baseUrl: config.hulaProjectUrl,
39
+ apiKey: config.hulaApiKey,
40
+ });
41
+ // Get issue number
42
+ let issueNumber;
43
+ if (issueNumberArg) {
44
+ issueNumber = parseInt(issueNumberArg, 10);
45
+ if (isNaN(issueNumber)) {
46
+ throw new Error(`Invalid issue number: ${issueNumberArg}`);
47
+ }
48
+ }
49
+ else {
50
+ // Show tracked issues and let user select
51
+ const trackedIssues = await trackingService.getAll();
52
+ if (trackedIssues.length === 0) {
53
+ throw new Error("No tracked issues found. Run 'hublaunch track' first.");
54
+ }
55
+ const choices = trackedIssues
56
+ .filter((issue) => issue.number !== undefined)
57
+ .map((issue) => ({
58
+ name: `#${issue.number} - ${issue.name}`,
59
+ value: issue.number.toString(),
60
+ }));
61
+ const selected = await searchSelect("Select issue to set priority:", choices);
62
+ issueNumber = parseInt(selected, 10);
63
+ }
64
+ // Get tracked issue
65
+ const trackedIssue = await trackingService.getByNumber(issueNumber);
66
+ if (!trackedIssue) {
67
+ throw new Error(`Issue #${issueNumber} is not tracked. Run 'hula track ${issueNumber}' first.`);
68
+ }
69
+ // Get current priority from tracked issue
70
+ if (trackedIssue.priority) {
71
+ const currentLevel = DEFAULT_PRIORITY_LEVELS.find((level) => level.name === trackedIssue.priority);
72
+ if (currentLevel) {
73
+ logger.info(`Current priority: ${currentLevel.emoji} ${trackedIssue.priority}`);
74
+ }
75
+ }
76
+ else {
77
+ logger.info("Current priority: None");
78
+ }
79
+ logger.blank();
80
+ // Get priority
81
+ let priority;
82
+ if (priorityArg) {
83
+ // Validate priority
84
+ const validPriorities = DEFAULT_PRIORITY_LEVELS.map((level) => level.name);
85
+ if (!validPriorities.includes(priorityArg)) {
86
+ throw new Error(`Invalid priority: ${priorityArg}. Valid priorities: ${validPriorities.join(", ")}`);
87
+ }
88
+ priority = priorityArg;
89
+ }
90
+ else {
91
+ // Interactive selection
92
+ priority = await selectPriority("Select new priority:", DEFAULT_PRIORITY_LEVELS);
93
+ }
94
+ const priorityLevel = DEFAULT_PRIORITY_LEVELS.find((level) => level.name === priority);
95
+ if (!priorityLevel) {
96
+ throw new Error(`Invalid priority: ${priority}`);
97
+ }
98
+ // Update priority via hula-project API
99
+ logger.info(`Setting priority to ${priorityLevel.emoji} ${priority}...`);
100
+ // Get the server-side plan ID
101
+ const issues = await apiClient.listPlans();
102
+ const serverIssue = issues.plans.find((i) => i.issueNumber === issueNumber);
103
+ if (!serverIssue) {
104
+ throw new Error(`Plan #${issueNumber} not found on server`);
105
+ }
106
+ await apiClient.updatePlanPriority(serverIssue.id, priority);
107
+ logger.success(`✓ Priority updated successfully`);
108
+ logger.blank();
109
+ logger.success("✨ Priority updated successfully!");
110
+ logger.blank();
111
+ }
112
+ //# sourceMappingURL=setPriority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setPriority.js","sourceRoot":"","sources":["../../src/commands/setPriority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Command } from 'commander';
2
+ import type { Config } from '../types/index.js';
3
+ /**
4
+ * Track command - Add existing GitHub issues to tracking
5
+ */
6
+ export declare function trackCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/commands/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,KAAK,EAAE,MAAM,EAA+B,MAAM,mBAAmB,CAAC;AAQ7E;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBnE"}