edsger 0.50.0 → 0.52.0

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 (470) hide show
  1. package/.claude/settings.local.json +23 -3
  2. package/.env.local +12 -0
  3. package/README.md +25 -25
  4. package/dist/api/chat.d.ts +7 -7
  5. package/dist/api/chat.js +13 -13
  6. package/dist/api/cross-product.d.ts +10 -10
  7. package/dist/api/cross-product.js +30 -30
  8. package/dist/api/github.d.ts +5 -5
  9. package/dist/api/github.js +10 -10
  10. package/dist/api/intelligence.d.ts +3 -3
  11. package/dist/api/issues/approval-checker.d.ts +20 -0
  12. package/dist/api/{features → issues}/approval-checker.js +16 -16
  13. package/dist/api/issues/get-issue.d.ts +5 -0
  14. package/dist/api/issues/get-issue.js +21 -0
  15. package/dist/api/issues/index.d.ts +8 -0
  16. package/dist/api/issues/index.js +10 -0
  17. package/dist/api/issues/issue-utils.d.ts +23 -0
  18. package/dist/api/issues/issue-utils.js +80 -0
  19. package/dist/api/issues/status-updater.d.ts +41 -0
  20. package/dist/api/{features → issues}/status-updater.js +23 -23
  21. package/dist/api/{features → issues}/test-cases.d.ts +7 -7
  22. package/dist/api/{features → issues}/test-cases.js +12 -12
  23. package/dist/api/issues/update-issue.d.ts +20 -0
  24. package/dist/api/{features/update-feature.js → issues/update-issue.js} +22 -22
  25. package/dist/api/{features → issues}/user-stories.d.ts +5 -5
  26. package/dist/api/{features → issues}/user-stories.js +8 -8
  27. package/dist/api/products.d.ts +1 -1
  28. package/dist/api/tasks.d.ts +1 -1
  29. package/dist/api/test-reports.d.ts +2 -2
  30. package/dist/api/test-reports.js +4 -4
  31. package/dist/auth/login.js +1 -1
  32. package/dist/commands/agent-workflow/chat-worker.d.ts +7 -7
  33. package/dist/commands/agent-workflow/chat-worker.js +50 -50
  34. package/dist/commands/agent-workflow/index.d.ts +2 -2
  35. package/dist/commands/agent-workflow/index.js +3 -3
  36. package/dist/commands/agent-workflow/{feature-worker.d.ts → issue-worker.d.ts} +4 -4
  37. package/dist/commands/agent-workflow/{feature-worker.js → issue-worker.js} +12 -12
  38. package/dist/commands/agent-workflow/processor.d.ts +9 -9
  39. package/dist/commands/agent-workflow/processor.js +90 -90
  40. package/dist/commands/build/index.js +2 -2
  41. package/dist/commands/find-bugs/index.d.ts +11 -0
  42. package/dist/commands/find-bugs/index.js +39 -0
  43. package/dist/commands/find-features/index.d.ts +14 -0
  44. package/dist/commands/find-features/index.js +42 -0
  45. package/dist/commands/find-smells/index.d.ts +21 -0
  46. package/dist/commands/find-smells/index.js +65 -0
  47. package/dist/commands/init/prompts.js +1 -1
  48. package/dist/commands/init/templates.d.ts +1 -1
  49. package/dist/commands/init/templates.js +4 -4
  50. package/dist/commands/workflow/config/phase-configs.js +17 -17
  51. package/dist/commands/workflow/core/index.d.ts +1 -1
  52. package/dist/commands/workflow/core/index.js +2 -2
  53. package/dist/commands/workflow/core/issue-filter.d.ts +16 -0
  54. package/dist/commands/workflow/core/issue-filter.js +47 -0
  55. package/dist/commands/workflow/core/state-manager.d.ts +10 -10
  56. package/dist/commands/workflow/core/state-manager.js +10 -10
  57. package/dist/commands/workflow/core/workflow-logger.d.ts +9 -9
  58. package/dist/commands/workflow/core/workflow-logger.js +21 -21
  59. package/dist/commands/workflow/executors/phase-executor.d.ts +2 -2
  60. package/dist/commands/workflow/executors/phase-executor.js +32 -32
  61. package/dist/commands/workflow/issue-coordinator.d.ts +18 -0
  62. package/dist/commands/workflow/{feature-coordinator.js → issue-coordinator.js} +29 -29
  63. package/dist/commands/workflow/phase-orchestrator.d.ts +2 -2
  64. package/dist/commands/workflow/phase-orchestrator.js +82 -82
  65. package/dist/commands/workflow/processor.d.ts +7 -7
  66. package/dist/commands/workflow/processor.js +44 -44
  67. package/dist/config/{feature-status.d.ts → issue-status.d.ts} +14 -14
  68. package/dist/config/{feature-status.js → issue-status.js} +14 -14
  69. package/dist/errors/index.d.ts +6 -6
  70. package/dist/errors/index.js +11 -11
  71. package/dist/index.js +90 -1
  72. package/dist/phases/app-store-generation/context.js +6 -6
  73. package/dist/phases/app-store-generation/index.js +2 -2
  74. package/dist/phases/app-store-generation/prompts.js +2 -2
  75. package/dist/phases/autonomous/index.d.ts +3 -3
  76. package/dist/phases/autonomous/index.js +37 -37
  77. package/dist/phases/autonomous/prompts.d.ts +2 -2
  78. package/dist/phases/autonomous/prompts.js +4 -4
  79. package/dist/phases/branch-planning/context.d.ts +3 -3
  80. package/dist/phases/branch-planning/context.js +12 -12
  81. package/dist/phases/branch-planning/index.d.ts +3 -3
  82. package/dist/phases/branch-planning/index.js +32 -32
  83. package/dist/phases/branch-planning/outcome.d.ts +5 -5
  84. package/dist/phases/branch-planning/outcome.js +12 -12
  85. package/dist/phases/branch-planning/prompts.d.ts +3 -3
  86. package/dist/phases/branch-planning/prompts.js +13 -13
  87. package/dist/phases/bug-fixing/analyzer.d.ts +2 -2
  88. package/dist/phases/bug-fixing/analyzer.js +13 -13
  89. package/dist/phases/bug-fixing/context-fetcher.d.ts +3 -3
  90. package/dist/phases/bug-fixing/context-fetcher.js +18 -18
  91. package/dist/phases/bug-fixing/mcp-server.js +17 -18
  92. package/dist/phases/chat-processor/context.d.ts +5 -5
  93. package/dist/phases/chat-processor/context.js +17 -17
  94. package/dist/phases/chat-processor/index.d.ts +4 -4
  95. package/dist/phases/chat-processor/index.js +17 -17
  96. package/dist/phases/chat-processor/product-context.d.ts +3 -3
  97. package/dist/phases/chat-processor/product-context.js +16 -16
  98. package/dist/phases/chat-processor/product-prompts.d.ts +1 -1
  99. package/dist/phases/chat-processor/product-prompts.js +10 -10
  100. package/dist/phases/chat-processor/product-tools.d.ts +2 -2
  101. package/dist/phases/chat-processor/product-tools.js +33 -33
  102. package/dist/phases/chat-processor/prompts.d.ts +3 -3
  103. package/dist/phases/chat-processor/prompts.js +22 -22
  104. package/dist/phases/chat-processor/tools.js +46 -46
  105. package/dist/phases/code-implementation/branch-pr-creator.d.ts +3 -3
  106. package/dist/phases/code-implementation/branch-pr-creator.js +5 -5
  107. package/dist/phases/code-implementation/context.d.ts +3 -3
  108. package/dist/phases/code-implementation/context.js +18 -18
  109. package/dist/phases/code-implementation/index.d.ts +4 -4
  110. package/dist/phases/code-implementation/index.js +88 -88
  111. package/dist/phases/code-implementation/outcome.d.ts +3 -3
  112. package/dist/phases/code-implementation/outcome.js +6 -6
  113. package/dist/phases/code-implementation/prompts.d.ts +1 -1
  114. package/dist/phases/code-implementation/prompts.js +6 -6
  115. package/dist/phases/code-implementation-verification/agent.d.ts +3 -3
  116. package/dist/phases/code-implementation-verification/agent.js +5 -5
  117. package/dist/phases/code-implementation-verification/index.d.ts +3 -3
  118. package/dist/phases/code-implementation-verification/index.js +11 -11
  119. package/dist/phases/code-implementation-verification/prompts.d.ts +3 -3
  120. package/dist/phases/code-implementation-verification/prompts.js +7 -7
  121. package/dist/phases/code-refine/context.d.ts +8 -8
  122. package/dist/phases/code-refine/context.js +29 -29
  123. package/dist/phases/code-refine/index.d.ts +2 -2
  124. package/dist/phases/code-refine/index.js +20 -20
  125. package/dist/phases/code-refine/prompts.d.ts +1 -1
  126. package/dist/phases/code-refine/prompts.js +3 -3
  127. package/dist/phases/code-refine/refine-iteration.d.ts +1 -1
  128. package/dist/phases/code-refine/refine-iteration.js +4 -4
  129. package/dist/phases/code-refine/retry-handler.js +2 -2
  130. package/dist/phases/code-refine-verification/index.js +10 -10
  131. package/dist/phases/code-refine-verification/types.d.ts +2 -2
  132. package/dist/phases/code-review/context.d.ts +8 -8
  133. package/dist/phases/code-review/context.js +25 -25
  134. package/dist/phases/code-review/diff-utils.d.ts +1 -1
  135. package/dist/phases/code-review/diff-utils.js +1 -1
  136. package/dist/phases/code-review/index.d.ts +2 -2
  137. package/dist/phases/code-review/index.js +26 -26
  138. package/dist/phases/code-testing/analyzer.d.ts +2 -2
  139. package/dist/phases/code-testing/analyzer.js +18 -18
  140. package/dist/phases/code-testing/context-fetcher.d.ts +3 -3
  141. package/dist/phases/code-testing/context-fetcher.js +16 -16
  142. package/dist/phases/code-testing/prompts.d.ts +1 -1
  143. package/dist/phases/code-testing/prompts.js +5 -5
  144. package/dist/phases/find-bugs/index.d.ts +30 -0
  145. package/dist/phases/find-bugs/index.js +216 -0
  146. package/dist/phases/find-bugs/prompts.d.ts +22 -0
  147. package/dist/phases/find-bugs/prompts.js +101 -0
  148. package/dist/phases/find-bugs/state.d.ts +19 -0
  149. package/dist/phases/find-bugs/state.js +13 -0
  150. package/dist/phases/find-bugs/types.d.ts +21 -0
  151. package/dist/phases/find-bugs/types.js +16 -0
  152. package/dist/phases/find-features/index.d.ts +40 -0
  153. package/dist/phases/find-features/index.js +279 -0
  154. package/dist/phases/find-features/prompts.d.ts +43 -0
  155. package/dist/phases/find-features/prompts.js +138 -0
  156. package/dist/phases/find-features/state.d.ts +25 -0
  157. package/dist/phases/find-features/state.js +22 -0
  158. package/dist/phases/find-features/types.d.ts +27 -0
  159. package/dist/phases/find-features/types.js +16 -0
  160. package/dist/phases/find-shared/git.d.ts +24 -0
  161. package/dist/phases/find-shared/git.js +60 -0
  162. package/dist/phases/find-shared/mcp.d.ts +33 -0
  163. package/dist/phases/find-shared/mcp.js +69 -0
  164. package/dist/phases/find-shared/scan-state.d.ts +33 -0
  165. package/dist/phases/find-shared/scan-state.js +112 -0
  166. package/dist/phases/find-smells/index.d.ts +47 -0
  167. package/dist/phases/find-smells/index.js +278 -0
  168. package/dist/phases/find-smells/prompts.d.ts +30 -0
  169. package/dist/phases/find-smells/prompts.js +129 -0
  170. package/dist/phases/find-smells/state.d.ts +21 -0
  171. package/dist/phases/find-smells/state.js +17 -0
  172. package/dist/phases/find-smells/types.d.ts +51 -0
  173. package/dist/phases/find-smells/types.js +64 -0
  174. package/dist/phases/functional-testing/analyzer.d.ts +2 -2
  175. package/dist/phases/functional-testing/analyzer.js +40 -40
  176. package/dist/phases/functional-testing/context-fetcher.d.ts +3 -3
  177. package/dist/phases/functional-testing/context-fetcher.js +16 -16
  178. package/dist/phases/functional-testing/http-fallback.d.ts +2 -2
  179. package/dist/phases/functional-testing/http-fallback.js +9 -9
  180. package/dist/phases/functional-testing/mcp-server.js +23 -24
  181. package/dist/phases/functional-testing/prompts.d.ts +1 -1
  182. package/dist/phases/functional-testing/prompts.js +4 -4
  183. package/dist/phases/functional-testing/test-report-creator.d.ts +2 -2
  184. package/dist/phases/functional-testing/test-report-creator.js +10 -10
  185. package/dist/phases/functional-testing/test-retry-handler.js +3 -3
  186. package/dist/phases/growth-analysis/context.js +6 -6
  187. package/dist/phases/growth-analysis/index.js +2 -2
  188. package/dist/phases/growth-analysis/prompts.js +2 -2
  189. package/dist/phases/intelligence-analysis/context.js +7 -7
  190. package/dist/phases/intelligence-analysis/index.js +3 -3
  191. package/dist/phases/{feature-analysis → issue-analysis}/agent.js +1 -1
  192. package/dist/phases/issue-analysis/context.d.ts +24 -0
  193. package/dist/phases/{feature-analysis → issue-analysis}/context.js +30 -30
  194. package/dist/phases/issue-analysis/index.d.ts +8 -0
  195. package/dist/phases/{feature-analysis → issue-analysis}/index.js +29 -29
  196. package/dist/phases/issue-analysis/outcome.d.ts +40 -0
  197. package/dist/phases/{feature-analysis → issue-analysis}/outcome.js +17 -17
  198. package/dist/phases/{feature-analysis → issue-analysis}/prompts.d.ts +3 -3
  199. package/dist/phases/{feature-analysis → issue-analysis}/prompts.js +12 -12
  200. package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/agent.d.ts +2 -2
  201. package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/agent.js +1 -1
  202. package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/index.d.ts +5 -5
  203. package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/index.js +9 -9
  204. package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/prompts.d.ts +2 -2
  205. package/dist/phases/{feature-analysis-verification → issue-analysis-verification}/prompts.js +7 -7
  206. package/dist/phases/output-contracts.js +37 -37
  207. package/dist/phases/pr-execution/context.d.ts +3 -3
  208. package/dist/phases/pr-execution/context.js +14 -14
  209. package/dist/phases/pr-execution/index.d.ts +2 -2
  210. package/dist/phases/pr-execution/index.js +22 -22
  211. package/dist/phases/pr-execution/outcome.d.ts +4 -4
  212. package/dist/phases/pr-execution/outcome.js +6 -6
  213. package/dist/phases/pr-execution/prompts.d.ts +4 -4
  214. package/dist/phases/pr-execution/prompts.js +6 -6
  215. package/dist/phases/pr-resolve/checklist-learner.js +2 -2
  216. package/dist/phases/pr-review/index.d.ts +1 -1
  217. package/dist/phases/pr-review/index.js +1 -1
  218. package/dist/phases/pr-review/prompts.d.ts +1 -1
  219. package/dist/phases/pr-review/prompts.js +1 -1
  220. package/dist/phases/pr-shared/context.d.ts +3 -3
  221. package/dist/phases/pr-shared/context.js +3 -3
  222. package/dist/phases/pr-splitting/context.d.ts +3 -3
  223. package/dist/phases/pr-splitting/context.js +16 -16
  224. package/dist/phases/pr-splitting/index.d.ts +4 -4
  225. package/dist/phases/pr-splitting/index.js +29 -29
  226. package/dist/phases/pr-splitting/outcome.d.ts +3 -3
  227. package/dist/phases/pr-splitting/outcome.js +7 -7
  228. package/dist/phases/pr-splitting/prompts.d.ts +3 -3
  229. package/dist/phases/pr-splitting/prompts.js +11 -11
  230. package/dist/phases/pull-request/creator.d.ts +4 -4
  231. package/dist/phases/pull-request/creator.js +25 -25
  232. package/dist/phases/pull-request/handler.d.ts +3 -3
  233. package/dist/phases/pull-request/handler.js +16 -16
  234. package/dist/phases/release-sync/index.js +2 -2
  235. package/dist/phases/run-sheet/agent.js +1 -2
  236. package/dist/phases/run-sheet/index.js +3 -3
  237. package/dist/phases/smoke-test/index.js +2 -2
  238. package/dist/phases/technical-design/context.d.ts +3 -3
  239. package/dist/phases/technical-design/context.js +11 -11
  240. package/dist/phases/technical-design/index.d.ts +2 -2
  241. package/dist/phases/technical-design/index.js +27 -27
  242. package/dist/phases/technical-design/outcome.d.ts +4 -4
  243. package/dist/phases/technical-design/outcome.js +6 -6
  244. package/dist/phases/technical-design/prompts.d.ts +2 -2
  245. package/dist/phases/technical-design/prompts.js +10 -10
  246. package/dist/phases/technical-design-verification/agent.d.ts +3 -3
  247. package/dist/phases/technical-design-verification/agent.js +4 -4
  248. package/dist/phases/technical-design-verification/index.d.ts +4 -4
  249. package/dist/phases/technical-design-verification/index.js +12 -12
  250. package/dist/phases/technical-design-verification/prompts.d.ts +3 -3
  251. package/dist/phases/technical-design-verification/prompts.js +6 -6
  252. package/dist/phases/test-cases-analysis/context.d.ts +5 -5
  253. package/dist/phases/test-cases-analysis/context.js +18 -18
  254. package/dist/phases/test-cases-analysis/formatters.js +7 -7
  255. package/dist/phases/test-cases-analysis/index.d.ts +1 -1
  256. package/dist/phases/test-cases-analysis/index.js +21 -21
  257. package/dist/phases/test-cases-analysis/outcome.d.ts +7 -7
  258. package/dist/phases/test-cases-analysis/outcome.js +13 -13
  259. package/dist/phases/test-cases-analysis/prompts.d.ts +3 -3
  260. package/dist/phases/test-cases-analysis/prompts.js +6 -6
  261. package/dist/phases/user-stories-analysis/context.d.ts +5 -5
  262. package/dist/phases/user-stories-analysis/context.js +18 -18
  263. package/dist/phases/user-stories-analysis/formatters.js +7 -7
  264. package/dist/phases/user-stories-analysis/index.d.ts +1 -1
  265. package/dist/phases/user-stories-analysis/index.js +21 -21
  266. package/dist/phases/user-stories-analysis/outcome.d.ts +7 -7
  267. package/dist/phases/user-stories-analysis/outcome.js +13 -13
  268. package/dist/phases/user-stories-analysis/prompts.d.ts +3 -3
  269. package/dist/phases/user-stories-analysis/prompts.js +10 -10
  270. package/dist/services/audit-logs.d.ts +10 -10
  271. package/dist/services/audit-logs.js +12 -12
  272. package/dist/services/branches.d.ts +6 -6
  273. package/dist/services/branches.js +16 -16
  274. package/dist/services/checklist.d.ts +3 -3
  275. package/dist/services/checklist.js +11 -11
  276. package/dist/services/coaching/coaching-agent.js +2 -2
  277. package/dist/services/coaching/coaching-loop.d.ts +1 -1
  278. package/dist/services/coaching/coaching-loop.js +2 -2
  279. package/dist/services/coaching/phase-coaching.d.ts +2 -2
  280. package/dist/services/coaching/phase-coaching.js +3 -3
  281. package/dist/services/coaching/self-rating.js +1 -1
  282. package/dist/services/feedbacks.d.ts +4 -4
  283. package/dist/services/feedbacks.js +8 -8
  284. package/dist/services/phase-hooks/bindings-fetcher.d.ts +4 -4
  285. package/dist/services/phase-hooks/bindings-fetcher.js +8 -8
  286. package/dist/services/phase-hooks/hook-executor.js +1 -1
  287. package/dist/services/phase-hooks/hook-logging.d.ts +2 -2
  288. package/dist/services/phase-hooks/hook-logging.js +4 -4
  289. package/dist/services/phase-hooks/hook-runner.d.ts +1 -1
  290. package/dist/services/phase-hooks/hook-runner.js +4 -4
  291. package/dist/services/phase-hooks/types.d.ts +3 -3
  292. package/dist/services/phase-ratings.d.ts +7 -7
  293. package/dist/services/phase-ratings.js +8 -8
  294. package/dist/services/pull-requests.d.ts +4 -4
  295. package/dist/services/pull-requests.js +11 -11
  296. package/dist/services/skill-resolver.d.ts +1 -1
  297. package/dist/services/skill-resolver.js +1 -1
  298. package/dist/skills/phase/app-store-generation/SKILL.md +9 -9
  299. package/dist/skills/phase/autonomous/SKILL.md +2 -2
  300. package/dist/skills/phase/branch-planning/SKILL.md +12 -12
  301. package/dist/skills/phase/bug-fixing/SKILL.md +1 -1
  302. package/dist/skills/phase/code-implementation/SKILL.md +6 -6
  303. package/dist/skills/phase/code-implementation-verification/SKILL.md +3 -3
  304. package/dist/skills/phase/code-testing/SKILL.md +5 -5
  305. package/dist/skills/phase/functional-testing/SKILL.md +3 -3
  306. package/dist/skills/phase/growth-analysis/SKILL.md +8 -8
  307. package/dist/skills/phase/incremental-sync/SKILL.md +6 -6
  308. package/dist/skills/phase/intelligence-analysis/SKILL.md +7 -7
  309. package/dist/skills/phase/{feature-analysis → issue-analysis}/SKILL.md +8 -8
  310. package/dist/skills/phase/pr-execution/SKILL.md +7 -7
  311. package/dist/skills/phase/pr-splitting/SKILL.md +14 -14
  312. package/dist/skills/phase/smoke-test/SKILL.md +1 -1
  313. package/dist/skills/phase/technical-design/SKILL.md +5 -5
  314. package/dist/skills/phase/test-cases-analysis/SKILL.md +4 -4
  315. package/dist/skills/phase/user-stories-analysis/SKILL.md +13 -13
  316. package/dist/system/session-manager.d.ts +3 -3
  317. package/dist/system/session-manager.js +3 -3
  318. package/dist/system/sleep-notification.js +2 -2
  319. package/dist/system/sleep-prevention.js +1 -1
  320. package/dist/types/index.d.ts +21 -21
  321. package/dist/types/{features.d.ts → issues.d.ts} +3 -3
  322. package/dist/types/pipeline.d.ts +4 -4
  323. package/dist/updater/auto-updater.d.ts +2 -2
  324. package/dist/updater/auto-updater.js +3 -3
  325. package/dist/utils/conflict-resolver.d.ts +1 -1
  326. package/dist/utils/conflict-resolver.js +5 -5
  327. package/dist/utils/formatters.d.ts +4 -4
  328. package/dist/utils/formatters.js +29 -29
  329. package/dist/utils/git-branch-manager-async.d.ts +6 -6
  330. package/dist/utils/git-branch-manager-async.js +41 -41
  331. package/dist/utils/git-branch-manager.d.ts +11 -11
  332. package/dist/utils/git-branch-manager.js +42 -42
  333. package/dist/utils/image-downloader.d.ts +4 -4
  334. package/dist/utils/image-downloader.js +17 -17
  335. package/dist/utils/pipeline-logger.d.ts +1 -1
  336. package/dist/utils/pipeline-logger.js +5 -5
  337. package/dist/workspace/workspace-manager.d.ts +17 -17
  338. package/dist/workspace/workspace-manager.js +21 -21
  339. package/package.json +1 -1
  340. package/vitest.config.ts +4 -0
  341. package/dist/api/__tests__/app-store.test.d.ts +0 -7
  342. package/dist/api/__tests__/app-store.test.js +0 -60
  343. package/dist/api/__tests__/intelligence.test.d.ts +0 -11
  344. package/dist/api/__tests__/intelligence.test.js +0 -315
  345. package/dist/api/features/__tests__/feature-utils.test.d.ts +0 -4
  346. package/dist/api/features/__tests__/feature-utils.test.js +0 -370
  347. package/dist/api/features/__tests__/status-updater.test.d.ts +0 -4
  348. package/dist/api/features/__tests__/status-updater.test.js +0 -88
  349. package/dist/api/features/approval-checker.d.ts +0 -20
  350. package/dist/api/features/feature-utils.d.ts +0 -23
  351. package/dist/api/features/feature-utils.js +0 -80
  352. package/dist/api/features/get-feature.d.ts +0 -5
  353. package/dist/api/features/get-feature.js +0 -21
  354. package/dist/api/features/index.d.ts +0 -8
  355. package/dist/api/features/index.js +0 -10
  356. package/dist/api/features/status-updater.d.ts +0 -41
  357. package/dist/api/features/update-feature.d.ts +0 -20
  358. package/dist/commands/build/__tests__/build.test.d.ts +0 -5
  359. package/dist/commands/build/__tests__/build.test.js +0 -206
  360. package/dist/commands/build/__tests__/detect-project.test.d.ts +0 -6
  361. package/dist/commands/build/__tests__/detect-project.test.js +0 -160
  362. package/dist/commands/build/__tests__/run-build.test.d.ts +0 -6
  363. package/dist/commands/build/__tests__/run-build.test.js +0 -433
  364. package/dist/commands/intelligence/__tests__/command.test.d.ts +0 -4
  365. package/dist/commands/intelligence/__tests__/command.test.js +0 -48
  366. package/dist/commands/workflow/core/__tests__/feature-filter.test.d.ts +0 -5
  367. package/dist/commands/workflow/core/__tests__/feature-filter.test.js +0 -316
  368. package/dist/commands/workflow/core/__tests__/pipeline-evaluator.test.d.ts +0 -4
  369. package/dist/commands/workflow/core/__tests__/pipeline-evaluator.test.js +0 -397
  370. package/dist/commands/workflow/core/__tests__/state-manager.test.d.ts +0 -4
  371. package/dist/commands/workflow/core/__tests__/state-manager.test.js +0 -384
  372. package/dist/commands/workflow/core/feature-filter.d.ts +0 -16
  373. package/dist/commands/workflow/core/feature-filter.js +0 -47
  374. package/dist/commands/workflow/feature-coordinator.d.ts +0 -18
  375. package/dist/config/__tests__/config.test.d.ts +0 -4
  376. package/dist/config/__tests__/config.test.js +0 -286
  377. package/dist/config/__tests__/feature-status.test.d.ts +0 -4
  378. package/dist/config/__tests__/feature-status.test.js +0 -111
  379. package/dist/errors/__tests__/index.test.d.ts +0 -4
  380. package/dist/errors/__tests__/index.test.js +0 -349
  381. package/dist/phases/app-store-generation/__tests__/agent.test.d.ts +0 -5
  382. package/dist/phases/app-store-generation/__tests__/agent.test.js +0 -142
  383. package/dist/phases/app-store-generation/__tests__/context.test.d.ts +0 -4
  384. package/dist/phases/app-store-generation/__tests__/context.test.js +0 -284
  385. package/dist/phases/app-store-generation/__tests__/prompts.test.d.ts +0 -4
  386. package/dist/phases/app-store-generation/__tests__/prompts.test.js +0 -122
  387. package/dist/phases/app-store-generation/__tests__/screenshot-composer.test.d.ts +0 -5
  388. package/dist/phases/app-store-generation/__tests__/screenshot-composer.test.js +0 -826
  389. package/dist/phases/code-review/__tests__/diff-utils.test.js +0 -101
  390. package/dist/phases/feature-analysis/context.d.ts +0 -24
  391. package/dist/phases/feature-analysis/index.d.ts +0 -8
  392. package/dist/phases/feature-analysis/outcome.d.ts +0 -40
  393. package/dist/phases/intelligence-analysis/__tests__/context.test.d.ts +0 -4
  394. package/dist/phases/intelligence-analysis/__tests__/context.test.js +0 -192
  395. package/dist/phases/intelligence-analysis/__tests__/matching.test.d.ts +0 -13
  396. package/dist/phases/intelligence-analysis/__tests__/matching.test.js +0 -154
  397. package/dist/phases/intelligence-analysis/__tests__/orchestration.test.d.ts +0 -5
  398. package/dist/phases/intelligence-analysis/__tests__/orchestration.test.js +0 -378
  399. package/dist/phases/intelligence-analysis/__tests__/prompts.test.d.ts +0 -4
  400. package/dist/phases/intelligence-analysis/__tests__/prompts.test.js +0 -33
  401. package/dist/phases/pr-execution/__tests__/file-assigner.test.d.ts +0 -1
  402. package/dist/phases/pr-execution/__tests__/file-assigner.test.js +0 -303
  403. package/dist/phases/pr-resolve/__tests__/checklist-learner.test.d.ts +0 -1
  404. package/dist/phases/pr-resolve/__tests__/checklist-learner.test.js +0 -157
  405. package/dist/phases/pr-resolve/__tests__/prompts.test.d.ts +0 -1
  406. package/dist/phases/pr-resolve/__tests__/prompts.test.js +0 -116
  407. package/dist/phases/pr-resolve/__tests__/resolve-mapping.test.d.ts +0 -1
  408. package/dist/phases/pr-resolve/__tests__/resolve-mapping.test.js +0 -138
  409. package/dist/phases/pr-resolve/__tests__/types.test.d.ts +0 -1
  410. package/dist/phases/pr-resolve/__tests__/types.test.js +0 -43
  411. package/dist/phases/pr-resolve/__tests__/workspace.test.d.ts +0 -1
  412. package/dist/phases/pr-resolve/__tests__/workspace.test.js +0 -111
  413. package/dist/phases/pr-review/__tests__/prompts.test.d.ts +0 -1
  414. package/dist/phases/pr-review/__tests__/prompts.test.js +0 -49
  415. package/dist/phases/pr-review/__tests__/review-comments.test.d.ts +0 -1
  416. package/dist/phases/pr-review/__tests__/review-comments.test.js +0 -110
  417. package/dist/phases/pr-shared/__tests__/agent-utils.test.d.ts +0 -1
  418. package/dist/phases/pr-shared/__tests__/agent-utils.test.js +0 -91
  419. package/dist/phases/pr-shared/__tests__/context.test.d.ts +0 -1
  420. package/dist/phases/pr-shared/__tests__/context.test.js +0 -94
  421. package/dist/phases/pr-splitting/__tests__/import-dep-validator.test.d.ts +0 -1
  422. package/dist/phases/pr-splitting/__tests__/import-dep-validator.test.js +0 -331
  423. package/dist/phases/run-sheet/render.d.ts +0 -60
  424. package/dist/phases/run-sheet/render.js +0 -297
  425. package/dist/phases/smoke-test/__tests__/agent.test.d.ts +0 -4
  426. package/dist/phases/smoke-test/__tests__/agent.test.js +0 -84
  427. package/dist/phases/smoke-test/__tests__/github.test.d.ts +0 -9
  428. package/dist/phases/smoke-test/__tests__/github.test.js +0 -120
  429. package/dist/phases/smoke-test/__tests__/snapshot.test.d.ts +0 -8
  430. package/dist/phases/smoke-test/__tests__/snapshot.test.js +0 -93
  431. package/dist/phases/smoke-test/github.d.ts +0 -54
  432. package/dist/phases/smoke-test/github.js +0 -101
  433. package/dist/phases/smoke-test/snapshot.d.ts +0 -27
  434. package/dist/phases/smoke-test/snapshot.js +0 -157
  435. package/dist/services/coaching/__tests__/coaching-agent.test.d.ts +0 -1
  436. package/dist/services/coaching/__tests__/coaching-agent.test.js +0 -74
  437. package/dist/services/coaching/__tests__/coaching-loop.test.d.ts +0 -1
  438. package/dist/services/coaching/__tests__/coaching-loop.test.js +0 -59
  439. package/dist/services/coaching/__tests__/self-rating.test.d.ts +0 -1
  440. package/dist/services/coaching/__tests__/self-rating.test.js +0 -188
  441. package/dist/services/lifecycle-agent/__tests__/phase-criteria.test.d.ts +0 -4
  442. package/dist/services/lifecycle-agent/__tests__/phase-criteria.test.js +0 -133
  443. package/dist/services/lifecycle-agent/__tests__/transition-rules.test.d.ts +0 -4
  444. package/dist/services/lifecycle-agent/__tests__/transition-rules.test.js +0 -336
  445. package/dist/services/lifecycle-agent/index.d.ts +0 -24
  446. package/dist/services/lifecycle-agent/index.js +0 -25
  447. package/dist/services/lifecycle-agent/phase-criteria.d.ts +0 -57
  448. package/dist/services/lifecycle-agent/phase-criteria.js +0 -335
  449. package/dist/services/lifecycle-agent/transition-rules.d.ts +0 -60
  450. package/dist/services/lifecycle-agent/transition-rules.js +0 -184
  451. package/dist/services/lifecycle-agent/types.d.ts +0 -190
  452. package/dist/services/lifecycle-agent/types.js +0 -12
  453. package/dist/services/phase-hooks/__tests__/bindings-fetcher.test.d.ts +0 -1
  454. package/dist/services/phase-hooks/__tests__/bindings-fetcher.test.js +0 -122
  455. package/dist/services/phase-hooks/__tests__/hook-executor.test.d.ts +0 -1
  456. package/dist/services/phase-hooks/__tests__/hook-executor.test.js +0 -321
  457. package/dist/services/phase-hooks/__tests__/hook-runner.test.d.ts +0 -1
  458. package/dist/services/phase-hooks/__tests__/hook-runner.test.js +0 -261
  459. package/dist/services/phase-hooks/__tests__/plugin-loader.test.d.ts +0 -1
  460. package/dist/services/phase-hooks/__tests__/plugin-loader.test.js +0 -158
  461. package/dist/services/video/__tests__/video-pipeline.test.d.ts +0 -6
  462. package/dist/services/video/__tests__/video-pipeline.test.js +0 -249
  463. package/dist/types/features.js +0 -1
  464. package/dist/workspace/__tests__/workspace-manager.test.d.ts +0 -7
  465. package/dist/workspace/__tests__/workspace-manager.test.js +0 -52
  466. /package/dist/api/{features → issues}/batch-operations.d.ts +0 -0
  467. /package/dist/api/{features → issues}/batch-operations.js +0 -0
  468. /package/dist/phases/{feature-analysis → issue-analysis}/agent.d.ts +0 -0
  469. /package/dist/skills/phase/{feature-analysis-verification → issue-analysis-verification}/SKILL.md +0 -0
  470. /package/dist/{phases/code-review/__tests__/diff-utils.test.d.ts → types/issues.js} +0 -0
@@ -1,433 +0,0 @@
1
- /**
2
- * Integration tests for the runBuild orchestration function.
3
- * Uses dependency injection (BuildDeps) to mock external calls
4
- * while testing the full decision-making pipeline.
5
- */
6
- import assert from 'node:assert';
7
- import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
8
- import { tmpdir } from 'node:os';
9
- import { join } from 'node:path';
10
- import { afterEach, beforeEach, describe, it } from 'node:test';
11
- import { runBuild } from '../index.js';
12
- // ── Helpers ────────────────────────────────────────────────────────
13
- function createTmpDir() {
14
- const dir = join(tmpdir(), `edsger-run-build-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
15
- mkdirSync(dir, { recursive: true });
16
- return dir;
17
- }
18
- function makeAppleConfig(overrides = {}) {
19
- return {
20
- id: 'config-1',
21
- product_id: 'prod-1',
22
- store_type: 'apple_app_store',
23
- credentials: {
24
- key_id: 'KEY123',
25
- issuer_id: 'ISSUER456',
26
- private_key: '-----BEGIN PRIVATE KEY-----\ntest\n-----END PRIVATE KEY-----',
27
- },
28
- app_identifier: 'com.example.app',
29
- listings: {},
30
- screenshots: {},
31
- build_config: {},
32
- current_version: null,
33
- submission_status: 'none',
34
- submitted_at: null,
35
- released_at: null,
36
- rejection_reason: null,
37
- is_active: true,
38
- created_by: 'user-1',
39
- created_at: '2024-01-01',
40
- updated_at: '2024-01-01',
41
- ...overrides,
42
- };
43
- }
44
- function makeOptions(overrides = {}) {
45
- return {
46
- buildProductId: 'prod-1',
47
- verbose: false,
48
- ...overrides,
49
- };
50
- }
51
- const DEFAULT_PRODUCT = {
52
- id: 'prod-1',
53
- name: 'My App',
54
- description: 'A test application',
55
- };
56
- /** Default mock build plan for a React Native project */
57
- const DEFAULT_PLAN = {
58
- projectType: 'react-native',
59
- installSteps: [
60
- { cmd: 'npm', args: ['ci'], cwd: '' },
61
- { cmd: 'pod', args: ['install'], cwd: 'ios' },
62
- ],
63
- projectPath: 'ios/MyApp.xcworkspace',
64
- schemeHint: 'MyApp',
65
- reasoning: 'Mock plan',
66
- };
67
- function createMockDeps(overrides = {}) {
68
- const calls = [];
69
- const savedConfigs = [];
70
- const tmpDir = overrides.tmpDir ?? createTmpDir();
71
- // Create a fake .ipa in the export directory so the build flow completes
72
- const exportDir = join(tmpDir, 'build', 'export');
73
- mkdirSync(exportDir, { recursive: true });
74
- writeFileSync(join(exportDir, 'MyApp.ipa'), 'fake-ipa-data');
75
- // Create the AI-suggested project path so existsSync passes
76
- mkdirSync(join(tmpDir, 'ios', 'MyApp.xcworkspace'), { recursive: true });
77
- const deps = {
78
- fetchConfigs: overrides.fetchConfigs ??
79
- (async () => overrides.configs ?? [makeAppleConfig()]),
80
- fetchProduct: overrides.fetchProduct ??
81
- (async () => overrides.product ?? DEFAULT_PRODUCT),
82
- fetchGitHub: overrides.fetchGitHub ??
83
- (async () => ({
84
- configured: true,
85
- token: 'ghp_test',
86
- owner: 'org',
87
- repo: 'app',
88
- })),
89
- cloneRepo: overrides.cloneRepo ?? (() => ({ repoPath: tmpDir })),
90
- getWorkspaceRoot: overrides.getWorkspaceRoot ?? (() => tmpDir),
91
- saveBuildConfig: overrides.saveBuildConfig ??
92
- (async (_id, bc) => {
93
- savedConfigs.push(bc);
94
- return null;
95
- }),
96
- checkoutDefaultBranch: overrides.checkoutDefaultBranch ?? (() => { }),
97
- analyzeBuildPlan: overrides.analyzeBuildPlan ?? (async () => DEFAULT_PLAN),
98
- findProjects: overrides.findProjects ??
99
- (() => overrides.projects ?? [
100
- { path: 'ios/MyApp.xcworkspace', type: 'workspace' },
101
- ]),
102
- findSchemes: overrides.findSchemes ?? (() => overrides.schemes ?? ['MyApp']),
103
- runCommand: overrides.runCommand ??
104
- (async (cmd, args, opts) => {
105
- calls.push({ cmd, args, opts });
106
- }),
107
- isXcodeAvailable: overrides.isXcodeAvailable ?? (() => true),
108
- };
109
- return { deps, calls, savedConfigs };
110
- }
111
- // ── Tests ──────────────────────────────────────────────────────────
112
- describe('runBuild orchestration', () => {
113
- let tmpDir;
114
- beforeEach(() => {
115
- tmpDir = createTmpDir();
116
- });
117
- afterEach(() => {
118
- rmSync(tmpDir, { recursive: true, force: true });
119
- });
120
- // -- Error paths --
121
- it('throws when xcodebuild is not available', async () => {
122
- const { deps } = createMockDeps({
123
- tmpDir,
124
- isXcodeAvailable: () => false,
125
- });
126
- await assert.rejects(() => runBuild(makeOptions(), deps), (err) => {
127
- assert.ok(err.message.includes('xcodebuild is not available'));
128
- return true;
129
- });
130
- });
131
- it('throws when no Apple App Store config exists', async () => {
132
- const { deps } = createMockDeps({
133
- tmpDir,
134
- configs: [],
135
- });
136
- await assert.rejects(() => runBuild(makeOptions(), deps), (err) => {
137
- assert.ok(err.message.includes('No Apple App Store configuration'));
138
- return true;
139
- });
140
- });
141
- it('throws when GitHub is not configured', async () => {
142
- const { deps } = createMockDeps({
143
- tmpDir,
144
- fetchGitHub: async () => ({
145
- configured: false,
146
- message: 'No repo connected',
147
- }),
148
- });
149
- await assert.rejects(() => runBuild(makeOptions(), deps), (err) => {
150
- assert.ok(err.message.includes('GitHub not configured'));
151
- return true;
152
- });
153
- });
154
- it('throws when AI plan fails and no projects found in fallback scan', async () => {
155
- const { deps } = createMockDeps({
156
- tmpDir,
157
- analyzeBuildPlan: async () => null,
158
- projects: [],
159
- });
160
- await assert.rejects(() => runBuild(makeOptions(), deps), (err) => {
161
- assert.ok(err.message.includes('No Xcode projects found'));
162
- return true;
163
- });
164
- });
165
- it('throws when no schemes found', async () => {
166
- const { deps } = createMockDeps({
167
- tmpDir,
168
- analyzeBuildPlan: async () => ({
169
- ...DEFAULT_PLAN,
170
- schemeHint: '', // no hint → must discover
171
- }),
172
- schemes: [],
173
- });
174
- await assert.rejects(() => runBuild(makeOptions(), deps), (err) => {
175
- assert.ok(err.message.includes('No schemes found'));
176
- return true;
177
- });
178
- });
179
- // -- AI plan execution --
180
- it('executes install steps from AI plan in order', async () => {
181
- const { deps, calls } = createMockDeps({
182
- tmpDir,
183
- analyzeBuildPlan: async () => ({
184
- projectType: 'react-native',
185
- installSteps: [
186
- { cmd: 'npm', args: ['ci'], cwd: '' },
187
- { cmd: 'pod', args: ['install'], cwd: 'ios' },
188
- ],
189
- projectPath: 'ios/MyApp.xcworkspace',
190
- schemeHint: 'MyApp',
191
- reasoning: 'React Native project',
192
- }),
193
- });
194
- await runBuild(makeOptions(), deps);
195
- // Install steps should run before xcodebuild
196
- const npmIdx = calls.findIndex((c) => c.cmd === 'npm');
197
- const podIdx = calls.findIndex((c) => c.cmd === 'pod');
198
- const xcodeIdx = calls.findIndex((c) => c.cmd === 'xcodebuild');
199
- assert.ok(npmIdx >= 0, 'Expected npm call');
200
- assert.ok(podIdx >= 0, 'Expected pod call');
201
- assert.ok(xcodeIdx >= 0, 'Expected xcodebuild call');
202
- assert.ok(npmIdx < podIdx, 'npm should run before pod');
203
- assert.ok(podIdx < xcodeIdx, 'pod should run before xcodebuild');
204
- // Verify cwd
205
- assert.strictEqual(calls[npmIdx].opts?.cwd, tmpDir);
206
- assert.strictEqual(calls[podIdx].opts?.cwd, join(tmpDir, 'ios'));
207
- });
208
- it('uses AI-suggested project path and scheme', async () => {
209
- mkdirSync(join(tmpDir, 'apps', 'mobile', 'ios', 'Mobile.xcworkspace'), {
210
- recursive: true,
211
- });
212
- const { deps, calls, savedConfigs } = createMockDeps({
213
- tmpDir,
214
- analyzeBuildPlan: async () => ({
215
- projectType: 'react-native',
216
- installSteps: [],
217
- projectPath: 'apps/mobile/ios/Mobile.xcworkspace',
218
- schemeHint: 'MobileApp',
219
- reasoning: 'Monorepo — mobile app matches product',
220
- }),
221
- });
222
- await runBuild(makeOptions(), deps);
223
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
224
- assert.ok(archiveCall);
225
- assert.ok(archiveCall.args.some((a) => a.includes('apps/mobile/ios/Mobile.xcworkspace')));
226
- const schemeIdx = archiveCall.args.indexOf('-scheme');
227
- assert.strictEqual(archiveCall.args[schemeIdx + 1], 'MobileApp');
228
- // Verify persisted to DB
229
- assert.strictEqual(savedConfigs.length, 1);
230
- assert.strictEqual(savedConfigs[0].project_path, 'apps/mobile/ios/Mobile.xcworkspace');
231
- assert.strictEqual(savedConfigs[0].scheme, 'MobileApp');
232
- });
233
- it('falls back to scan when AI-suggested project path does not exist', async () => {
234
- const { deps, calls } = createMockDeps({
235
- tmpDir,
236
- analyzeBuildPlan: async () => ({
237
- ...DEFAULT_PLAN,
238
- projectPath: 'nonexistent/App.xcworkspace', // does not exist on disk
239
- }),
240
- projects: [{ path: 'ios/MyApp.xcworkspace', type: 'workspace' }],
241
- });
242
- await runBuild(makeOptions(), deps);
243
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
244
- assert.ok(archiveCall);
245
- // Should have fallen back to scanned project
246
- assert.ok(archiveCall.args.some((a) => a.includes('ios/MyApp.xcworkspace')));
247
- });
248
- it('discovers scheme via xcodebuild -list when AI has no hint', async () => {
249
- const { deps, calls } = createMockDeps({
250
- tmpDir,
251
- analyzeBuildPlan: async () => ({
252
- ...DEFAULT_PLAN,
253
- schemeHint: '', // empty → discover
254
- }),
255
- schemes: ['DiscoveredScheme'],
256
- });
257
- await runBuild(makeOptions(), deps);
258
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
259
- assert.ok(archiveCall);
260
- const schemeIdx = archiveCall.args.indexOf('-scheme');
261
- assert.strictEqual(archiveCall.args[schemeIdx + 1], 'DiscoveredScheme');
262
- });
263
- it('falls back to scan when AI returns null (no plan)', async () => {
264
- const { deps, calls } = createMockDeps({
265
- tmpDir,
266
- analyzeBuildPlan: async () => null,
267
- projects: [{ path: 'FallbackApp.xcworkspace', type: 'workspace' }],
268
- schemes: ['FallbackScheme'],
269
- });
270
- await runBuild(makeOptions(), deps);
271
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
272
- assert.ok(archiveCall);
273
- assert.ok(archiveCall.args.some((a) => a.includes('FallbackApp.xcworkspace')));
274
- const schemeIdx = archiveCall.args.indexOf('-scheme');
275
- assert.strictEqual(archiveCall.args[schemeIdx + 1], 'FallbackScheme');
276
- });
277
- it('CLI --scheme overrides AI scheme hint', async () => {
278
- const { deps, calls } = createMockDeps({ tmpDir });
279
- await runBuild(makeOptions({ scheme: 'ManualScheme' }), deps);
280
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
281
- assert.ok(archiveCall);
282
- const schemeIdx = archiveCall.args.indexOf('-scheme');
283
- assert.strictEqual(archiveCall.args[schemeIdx + 1], 'ManualScheme');
284
- });
285
- // -- Saved config paths (skip AI) --
286
- it('skips AI when project_path and scheme are saved', async () => {
287
- let aiCalled = false;
288
- const config = makeAppleConfig({
289
- build_config: { project_path: 'ios/App.xcworkspace', scheme: 'App' },
290
- });
291
- const { deps, calls } = createMockDeps({
292
- tmpDir,
293
- configs: [config],
294
- analyzeBuildPlan: async () => {
295
- aiCalled = true;
296
- return null;
297
- },
298
- });
299
- await runBuild(makeOptions(), deps);
300
- assert.ok(!aiCalled, 'AI should NOT be called when config is saved');
301
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
302
- assert.ok(archiveCall);
303
- assert.ok(archiveCall.args.some((a) => a.includes('ios/App.xcworkspace')));
304
- });
305
- it('re-runs AI on --reselect even with saved config', async () => {
306
- let aiCalled = false;
307
- const config = makeAppleConfig({
308
- build_config: {
309
- project_path: 'old/Old.xcworkspace',
310
- scheme: 'OldScheme',
311
- configuration: 'Release',
312
- },
313
- });
314
- mkdirSync(join(tmpDir, 'new', 'New.xcworkspace'), { recursive: true });
315
- const { deps, savedConfigs } = createMockDeps({
316
- tmpDir,
317
- configs: [config],
318
- analyzeBuildPlan: async () => {
319
- aiCalled = true;
320
- return {
321
- projectType: 'native',
322
- installSteps: [],
323
- projectPath: 'new/New.xcworkspace',
324
- schemeHint: 'NewScheme',
325
- reasoning: 'Redetected',
326
- };
327
- },
328
- });
329
- await runBuild(makeOptions({ reselect: true }), deps);
330
- assert.ok(aiCalled, 'AI should be called on --reselect');
331
- assert.strictEqual(savedConfigs.length, 1);
332
- assert.strictEqual(savedConfigs[0].project_path, 'new/New.xcworkspace');
333
- assert.strictEqual(savedConfigs[0].scheme, 'NewScheme');
334
- });
335
- it('does not re-save config when nothing changed', async () => {
336
- const config = makeAppleConfig({
337
- build_config: {
338
- project_path: 'ios/MyApp.xcworkspace',
339
- scheme: 'MyApp',
340
- configuration: 'Release',
341
- },
342
- });
343
- const { deps, savedConfigs } = createMockDeps({
344
- tmpDir,
345
- configs: [config],
346
- });
347
- await runBuild(makeOptions(), deps);
348
- assert.strictEqual(savedConfigs.length, 0);
349
- });
350
- // -- Archive / export / upload --
351
- it('runs full archive + export pipeline', async () => {
352
- const config = makeAppleConfig({
353
- build_config: {
354
- project_path: 'A.xcworkspace',
355
- scheme: 'A',
356
- team_id: 'TEAM1',
357
- export_method: 'app-store',
358
- },
359
- });
360
- const { deps, calls } = createMockDeps({ tmpDir, configs: [config] });
361
- await runBuild(makeOptions(), deps);
362
- const xcodeCalls = calls.filter((c) => c.cmd === 'xcodebuild');
363
- assert.strictEqual(xcodeCalls.length, 2);
364
- assert.ok(xcodeCalls[0].args.includes('archive'));
365
- assert.ok(xcodeCalls[1].args.includes('-exportArchive'));
366
- });
367
- it('passes --upload to trigger upload after build', async () => {
368
- const config = makeAppleConfig({
369
- build_config: {
370
- project_path: 'A.xcworkspace',
371
- scheme: 'A',
372
- configuration: 'Release',
373
- team_id: 'TEAM1',
374
- export_method: 'app-store',
375
- },
376
- });
377
- const { deps, calls } = createMockDeps({ tmpDir, configs: [config] });
378
- await runBuild(makeOptions({ upload: true }), deps);
379
- const uploadCall = calls.find((c) => c.cmd === 'xcrun' && c.args.includes('altool'));
380
- assert.ok(uploadCall, 'Expected xcrun altool upload call');
381
- assert.ok(uploadCall.args.includes('--upload-app'));
382
- });
383
- it('uses notarytool for macOS platform upload', async () => {
384
- const config = makeAppleConfig({
385
- build_config: {
386
- project_path: 'A.xcworkspace',
387
- scheme: 'A',
388
- configuration: 'Release',
389
- team_id: 'TEAM1',
390
- export_method: 'app-store',
391
- },
392
- });
393
- const { deps, calls } = createMockDeps({ tmpDir, configs: [config] });
394
- await runBuild(makeOptions({ upload: true, platform: 'macos' }), deps);
395
- const uploadCall = calls.find((c) => c.cmd === 'xcrun' && c.args.includes('notarytool'));
396
- assert.ok(uploadCall, 'Expected xcrun notarytool call for macOS');
397
- });
398
- it('passes platform destination to xcodebuild', async () => {
399
- const config = makeAppleConfig({
400
- build_config: { project_path: 'A.xcworkspace', scheme: 'A' },
401
- });
402
- const { deps, calls } = createMockDeps({ tmpDir, configs: [config] });
403
- await runBuild(makeOptions({ platform: 'macos' }), deps);
404
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
405
- assert.ok(archiveCall);
406
- const destIdx = archiveCall.args.indexOf('-destination');
407
- assert.strictEqual(archiveCall.args[destIdx + 1], 'generic/platform=macOS');
408
- });
409
- it('skips archive when --skipArchive is set', async () => {
410
- const config = makeAppleConfig({
411
- build_config: { project_path: 'A.xcworkspace', scheme: 'A' },
412
- });
413
- const { deps, calls } = createMockDeps({ tmpDir, configs: [config] });
414
- await runBuild(makeOptions({ skipArchive: true }), deps);
415
- const xcodeCalls = calls.filter((c) => c.cmd === 'xcodebuild');
416
- assert.strictEqual(xcodeCalls.length, 0);
417
- });
418
- it('adds DEVELOPMENT_TEAM when team_id is set', async () => {
419
- const config = makeAppleConfig({
420
- build_config: {
421
- project_path: 'A.xcworkspace',
422
- scheme: 'A',
423
- configuration: 'Release',
424
- team_id: 'TEAM123',
425
- },
426
- });
427
- const { deps, calls } = createMockDeps({ tmpDir, configs: [config] });
428
- await runBuild(makeOptions(), deps);
429
- const archiveCall = calls.find((c) => c.cmd === 'xcodebuild' && c.args.includes('archive'));
430
- assert.ok(archiveCall);
431
- assert.ok(archiveCall.args.some((a) => a === 'DEVELOPMENT_TEAM=TEAM123'));
432
- });
433
- });
@@ -1,4 +0,0 @@
1
- /**
2
- * Unit tests for intelligence command display helpers.
3
- */
4
- export {};
@@ -1,48 +0,0 @@
1
- /**
2
- * Unit tests for intelligence command display helpers.
3
- */
4
- import assert from 'node:assert';
5
- import { describe, it } from 'node:test';
6
- // ============================================================
7
- // IntelCommandOptions type validation
8
- // ============================================================
9
- void describe('IntelCommandOptions', () => {
10
- void it('should accept minimal options', () => {
11
- const opts = { productId: 'prod-001' };
12
- assert.strictEqual(opts.productId, 'prod-001');
13
- assert.strictEqual(opts.reportType, undefined);
14
- assert.strictEqual(opts.verbose, undefined);
15
- });
16
- void it('should accept full options', () => {
17
- const opts = {
18
- productId: 'prod-001',
19
- reportType: 'competitive',
20
- verbose: true,
21
- guidance: 'Focus on pricing',
22
- reportId: 'report-1',
23
- listCompetitors: false,
24
- confirmCompetitor: undefined,
25
- dismissCompetitor: undefined,
26
- };
27
- assert.strictEqual(opts.productId, 'prod-001');
28
- assert.strictEqual(opts.reportType, 'competitive');
29
- assert.strictEqual(opts.guidance, 'Focus on pricing');
30
- });
31
- void it('should accept competitor management options', () => {
32
- const listOpts = {
33
- productId: 'prod-001',
34
- listCompetitors: true,
35
- };
36
- assert.strictEqual(listOpts.listCompetitors, true);
37
- const confirmOpts = {
38
- productId: 'prod-001',
39
- confirmCompetitor: 'comp-123',
40
- };
41
- assert.strictEqual(confirmOpts.confirmCompetitor, 'comp-123');
42
- const dismissOpts = {
43
- productId: 'prod-001',
44
- dismissCompetitor: 'comp-456',
45
- };
46
- assert.strictEqual(dismissOpts.dismissCompetitor, 'comp-456');
47
- });
48
- });
@@ -1,5 +0,0 @@
1
- /**
2
- * Unit tests for feature-filter module
3
- * Pure functions for filtering and selecting features for processing
4
- */
5
- export {};