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
@@ -350,34 +350,34 @@ export function pullLatestFromBranch(branch, verbose, githubToken) {
350
350
  }
351
351
  }
352
352
  /**
353
- * Switch to feature branch and rebase with main
353
+ * Switch to issue branch and rebase with main
354
354
  * This should be called at the START of each phase
355
355
  *
356
- * @param featureBranch - The feature branch to switch to (e.g., "dev/feature-id")
356
+ * @param issueBranch - The issue branch to switch to (e.g., "dev/issue-id")
357
357
  * @param baseBranch - The base branch to rebase from (usually "main")
358
358
  * @param verbose - Whether to log verbose output
359
359
  * @returns Object containing the previous branch name
360
360
  */
361
361
  // eslint-disable-next-line complexity -- git branch management with rebase, conflict handling, and fallback strategies
362
- export function switchToFeatureBranchAndRebase(featureBranch, baseBranch = 'main', verbose, githubToken) {
362
+ export function switchToIssueBranchAndRebase(issueBranch, baseBranch = 'main', verbose, githubToken) {
363
363
  const previousBranch = getCurrentBranch();
364
364
  if (verbose) {
365
- logInfo(`\n🔄 Preparing feature branch: ${featureBranch}`);
365
+ logInfo(`\n🔄 Preparing issue branch: ${issueBranch}`);
366
366
  logInfo(` Current branch: ${previousBranch}`);
367
367
  }
368
- // If feature branch doesn't exist, we need to create it from base branch
369
- if (!branchExists(featureBranch)) {
368
+ // If issue branch doesn't exist, we need to create it from base branch
369
+ if (!branchExists(issueBranch)) {
370
370
  if (verbose) {
371
- logInfo(` Feature branch ${featureBranch} doesn't exist, will create from ${baseBranch}`);
371
+ logInfo(` Issue branch ${issueBranch} doesn't exist, will create from ${baseBranch}`);
372
372
  }
373
- // First, ensure we're on the base branch to create feature branch from it
373
+ // First, ensure we're on the base branch to create issue branch from it
374
374
  if (previousBranch !== baseBranch) {
375
375
  if (verbose) {
376
376
  logInfo(` Switching to ${baseBranch} first...`);
377
377
  }
378
378
  switchToBranch(baseBranch, verbose);
379
379
  }
380
- // Pull latest base branch before creating feature branch
380
+ // Pull latest base branch before creating issue branch
381
381
  try {
382
382
  if (verbose) {
383
383
  logInfo(` Pulling latest ${baseBranch}...`);
@@ -390,12 +390,12 @@ export function switchToFeatureBranchAndRebase(featureBranch, baseBranch = 'main
390
390
  }
391
391
  }
392
392
  }
393
- // Switch to feature branch (will create if doesn't exist)
393
+ // Switch to issue branch (will create if doesn't exist)
394
394
  // Default behavior now checks remote first (handles multi-clone scenarios)
395
- if (getCurrentBranch() !== featureBranch) {
396
- switchToBranch(featureBranch, verbose, { githubToken });
395
+ if (getCurrentBranch() !== issueBranch) {
396
+ switchToBranch(issueBranch, verbose, { githubToken });
397
397
  }
398
- // Sync with remote feature branch if it exists and local branch needs updating
398
+ // Sync with remote issue branch if it exists and local branch needs updating
399
399
  // This handles the case where local branch exists but is behind remote
400
400
  try {
401
401
  // Check for uncommitted changes and reset if found before any git operations
@@ -411,58 +411,58 @@ export function switchToFeatureBranchAndRebase(featureBranch, baseBranch = 'main
411
411
  encoding: 'utf-8',
412
412
  stdio: 'pipe',
413
413
  });
414
- // Check if remote feature branch exists
414
+ // Check if remote issue branch exists
415
415
  try {
416
- execSync(`git rev-parse --verify origin/${featureBranch}`, {
416
+ execSync(`git rev-parse --verify origin/${issueBranch}`, {
417
417
  encoding: 'utf-8',
418
418
  stdio: 'pipe',
419
419
  });
420
420
  // Remote branch exists, check if we need to sync
421
421
  // Get local and remote commit SHAs
422
- const localSha = execSync(`git rev-parse ${featureBranch}`, {
422
+ const localSha = execSync(`git rev-parse ${issueBranch}`, {
423
423
  encoding: 'utf-8',
424
424
  stdio: 'pipe',
425
425
  }).trim();
426
- const remoteSha = execSync(`git rev-parse origin/${featureBranch}`, {
426
+ const remoteSha = execSync(`git rev-parse origin/${issueBranch}`, {
427
427
  encoding: 'utf-8',
428
428
  stdio: 'pipe',
429
429
  }).trim();
430
430
  if (localSha !== remoteSha) {
431
431
  // Local and remote differ, reset to remote
432
432
  if (verbose) {
433
- logInfo(`📥 Syncing with remote feature branch origin/${featureBranch}...`);
433
+ logInfo(`📥 Syncing with remote issue branch origin/${issueBranch}...`);
434
434
  logInfo(` Local: ${localSha.substring(0, 7)}`);
435
435
  logInfo(` Remote: ${remoteSha.substring(0, 7)}`);
436
436
  }
437
437
  // Reset local branch to match remote branch
438
438
  // This ensures we have all commits from the remote (e.g., from another machine)
439
- execSync(`git reset --hard origin/${featureBranch}`, {
439
+ execSync(`git reset --hard origin/${issueBranch}`, {
440
440
  encoding: 'utf-8',
441
441
  stdio: 'pipe',
442
442
  });
443
443
  if (verbose) {
444
- logInfo(`✅ Synced local branch with origin/${featureBranch}`);
444
+ logInfo(`✅ Synced local branch with origin/${issueBranch}`);
445
445
  }
446
446
  }
447
447
  else if (verbose) {
448
- logInfo(`✅ Local branch is up to date with origin/${featureBranch}`);
448
+ logInfo(`✅ Local branch is up to date with origin/${issueBranch}`);
449
449
  }
450
450
  }
451
451
  catch (_e) {
452
452
  // Remote branch doesn't exist, that's fine - we'll push later
453
453
  if (verbose) {
454
- logInfo(` Remote branch origin/${featureBranch} doesn't exist yet, will create on push`);
454
+ logInfo(` Remote branch origin/${issueBranch} doesn't exist yet, will create on push`);
455
455
  }
456
456
  }
457
457
  }
458
458
  catch (_error) {
459
459
  if (verbose) {
460
- logInfo(`⚠️ Could not sync with remote feature branch, continuing with local branch`);
460
+ logInfo(`⚠️ Could not sync with remote issue branch, continuing with local branch`);
461
461
  }
462
462
  }
463
- // Rebase feature branch with latest main
463
+ // Rebase issue branch with latest main
464
464
  if (verbose) {
465
- logInfo(`📥 Rebasing ${featureBranch} with origin/${baseBranch}...`);
465
+ logInfo(`📥 Rebasing ${issueBranch} with origin/${baseBranch}...`);
466
466
  }
467
467
  try {
468
468
  // Check for uncommitted changes and reset if found
@@ -478,7 +478,7 @@ export function switchToFeatureBranchAndRebase(featureBranch, baseBranch = 'main
478
478
  stdio: verbose ? 'inherit' : 'pipe',
479
479
  });
480
480
  if (verbose) {
481
- logInfo(`✅ Successfully rebased ${featureBranch} with origin/${baseBranch}\n`);
481
+ logInfo(`✅ Successfully rebased ${issueBranch} with origin/${baseBranch}\n`);
482
482
  }
483
483
  }
484
484
  catch (error) {
@@ -492,8 +492,8 @@ export function switchToFeatureBranchAndRebase(featureBranch, baseBranch = 'main
492
492
  catch (_abortError) {
493
493
  // Rebase abort failed or wasn't needed, that's okay
494
494
  }
495
- throw new Error(`Failed to rebase ${featureBranch} with ${baseBranch}: ${error instanceof Error ? error.message : String(error)}\n` +
496
- `This usually means there are conflicts between your feature branch and main branch.\n` +
495
+ throw new Error(`Failed to rebase ${issueBranch} with ${baseBranch}: ${error instanceof Error ? error.message : String(error)}\n` +
496
+ `This usually means there are conflicts between your issue branch and main branch.\n` +
497
497
  `Please resolve conflicts manually and try again.`);
498
498
  }
499
499
  return { previousBranch };
@@ -523,7 +523,7 @@ export function returnToMainBranch(baseBranch = 'main', verbose) {
523
523
  logError(` Resetting uncommitted changes to allow branch switch.`);
524
524
  }
525
525
  // Reset uncommitted changes to allow clean branch switch
526
- // The code should already be committed on the feature branch,
526
+ // The code should already be committed on the issue branch,
527
527
  // so these changes are likely from post-commit operations
528
528
  resetUncommittedChanges(verbose);
529
529
  }
@@ -533,9 +533,9 @@ export function returnToMainBranch(baseBranch = 'main', verbose) {
533
533
  }
534
534
  }
535
535
  /**
536
- * Full phase lifecycle: switch to feature branch, rebase with main, and return a cleanup function
536
+ * Full phase lifecycle: switch to issue branch, rebase with main, and return a cleanup function
537
537
  * Usage:
538
- * const cleanup = preparePhaseGitEnvironment(featureId, baseBranch, verbose)
538
+ * const cleanup = preparePhaseGitEnvironment(issueId, baseBranch, verbose)
539
539
  * try {
540
540
  * // ... phase logic ...
541
541
  * } finally {
@@ -546,18 +546,18 @@ export function returnToMainBranch(baseBranch = 'main', verbose) {
546
546
  * is in a clean state (rebase aborted). The caller should still call the cleanup function
547
547
  * in a finally block to return to the main branch.
548
548
  *
549
- * @param featureId - The feature ID (will be used to construct branch name "dev/{featureId}")
549
+ * @param issueId - The issue ID (will be used to construct branch name "dev/{issueId}")
550
550
  * @param baseBranch - The base branch to rebase from (default: "main")
551
551
  * @param verbose - Whether to log verbose output
552
552
  * @returns Cleanup function that will return to main branch
553
553
  */
554
- export function preparePhaseGitEnvironment(featureId, baseBranch = 'main', verbose) {
555
- const featureBranch = `dev/${featureId}`;
556
- return prepareCustomBranchGitEnvironment(featureBranch, baseBranch, verbose);
554
+ export function preparePhaseGitEnvironment(issueId, baseBranch = 'main', verbose) {
555
+ const issueBranch = `dev/${issueId}`;
556
+ return prepareCustomBranchGitEnvironment(issueBranch, baseBranch, verbose);
557
557
  }
558
558
  /**
559
559
  * Full phase lifecycle with custom branch names for branch chaining support.
560
- * This allows creating a feature branch from another feature branch (not just main).
560
+ * This allows creating a issue branch from another issue branch (not just main).
561
561
  *
562
562
  * Usage:
563
563
  * const cleanup = prepareCustomBranchGitEnvironment('feat/123/2-api', 'feat/123/1-database', verbose)
@@ -567,20 +567,20 @@ export function preparePhaseGitEnvironment(featureId, baseBranch = 'main', verbo
567
567
  * cleanup()
568
568
  * }
569
569
  *
570
- * @param featureBranch - The feature branch to switch to (e.g., "feat/123/2-api")
570
+ * @param issueBranch - The issue branch to switch to (e.g., "feat/123/2-api")
571
571
  * @param baseBranch - The base branch to rebase from (e.g., "main" or "feat/123/1-database")
572
572
  * @param verbose - Whether to log verbose output
573
573
  * @returns Cleanup function that will return to main branch
574
574
  */
575
- export function prepareCustomBranchGitEnvironment(featureBranch, baseBranch = 'main', verbose) {
575
+ export function prepareCustomBranchGitEnvironment(issueBranch, baseBranch = 'main', verbose) {
576
576
  // Create cleanup function BEFORE any operations that might fail
577
- // This ensures cleanup can be called even if switchToFeatureBranchAndRebase throws
577
+ // This ensures cleanup can be called even if switchToIssueBranchAndRebase throws
578
578
  const cleanup = () => {
579
579
  returnToMainBranch('main', verbose); // Always return to main, not the baseBranch
580
580
  };
581
581
  try {
582
- // Switch to feature branch and rebase with base branch
583
- switchToFeatureBranchAndRebase(featureBranch, baseBranch, verbose);
582
+ // Switch to issue branch and rebase with base branch
583
+ switchToIssueBranchAndRebase(issueBranch, baseBranch, verbose);
584
584
  }
585
585
  catch (error) {
586
586
  // If setup fails, try to cleanup before re-throwing
@@ -600,4 +600,4 @@ export function prepareCustomBranchGitEnvironment(featureBranch, baseBranch = 'm
600
600
  return cleanup;
601
601
  }
602
602
  // Re-export async operations from separate file for backward compatibility
603
- export { prepareCustomBranchGitEnvironmentAsync, preparePhaseGitEnvironmentAsync, switchToFeatureBranchAndRebaseAsync, syncFeatBranchWithMain, } from './git-branch-manager-async.js';
603
+ export { prepareCustomBranchGitEnvironmentAsync, preparePhaseGitEnvironmentAsync, switchToIssueBranchAndRebaseAsync, syncFeatBranchWithMain, } from './git-branch-manager-async.js';
@@ -7,10 +7,10 @@ export interface DownloadedImage {
7
7
  alt: string;
8
8
  }
9
9
  /**
10
- * Set current feature ID for image downloads
10
+ * Set current issue ID for image downloads
11
11
  * Should be called at the start of pipeline execution
12
12
  */
13
- export declare function setCurrentFeatureId(featureId: string): void;
13
+ export declare function setCurrentIssueId(issueId: string): void;
14
14
  /**
15
15
  * Reset image cache (useful for testing)
16
16
  */
@@ -20,9 +20,9 @@ export declare function resetImageCache(): void;
20
20
  * Uses cache to avoid downloading same image multiple times
21
21
  *
22
22
  * @param markdown - Markdown content with image URLs
23
- * @param featureId - Feature ID for directory naming
23
+ * @param issueId - Issue ID for directory naming
24
24
  */
25
- export declare function downloadImagesForClaudeCode(markdown: string, featureId?: string): Promise<{
25
+ export declare function downloadImagesForClaudeCode(markdown: string, issueId?: string): Promise<{
26
26
  processedMarkdown: string;
27
27
  downloadedImages: DownloadedImage[];
28
28
  }>;
@@ -30,8 +30,8 @@ function detectImageExtension(url, contentType) {
30
30
  // Cache for downloaded images in current session
31
31
  // Key: image URL, Value: local path
32
32
  const imageCache = new Map();
33
- // Current feature ID for directory naming
34
- let currentFeatureId = null;
33
+ // Current issue ID for directory naming
34
+ let currentIssueId = null;
35
35
  /**
36
36
  * Generate hash from URL to use as filename
37
37
  * This ensures same URL always maps to same file
@@ -40,20 +40,20 @@ function hashUrl(url) {
40
40
  return createHash('md5').update(url).digest('hex');
41
41
  }
42
42
  /**
43
- * Get or create temp directory for current feature
43
+ * Get or create temp directory for current issue
44
44
  */
45
- function getTempDir(featureId) {
46
- return join(tmpdir(), 'claude-code-images', `feature-${featureId}`);
45
+ function getTempDir(issueId) {
46
+ return join(tmpdir(), 'claude-code-images', `issue-${issueId}`);
47
47
  }
48
48
  /**
49
- * Set current feature ID for image downloads
49
+ * Set current issue ID for image downloads
50
50
  * Should be called at the start of pipeline execution
51
51
  */
52
- export function setCurrentFeatureId(featureId) {
53
- if (currentFeatureId !== featureId) {
54
- // Clear cache when switching to different feature
52
+ export function setCurrentIssueId(issueId) {
53
+ if (currentIssueId !== issueId) {
54
+ // Clear cache when switching to different issue
55
55
  imageCache.clear();
56
- currentFeatureId = featureId;
56
+ currentIssueId = issueId;
57
57
  }
58
58
  }
59
59
  /**
@@ -61,29 +61,29 @@ export function setCurrentFeatureId(featureId) {
61
61
  */
62
62
  export function resetImageCache() {
63
63
  imageCache.clear();
64
- currentFeatureId = null;
64
+ currentIssueId = null;
65
65
  }
66
66
  /**
67
67
  * Download images from URLs to temporary directory for Claude Code to read
68
68
  * Uses cache to avoid downloading same image multiple times
69
69
  *
70
70
  * @param markdown - Markdown content with image URLs
71
- * @param featureId - Feature ID for directory naming
71
+ * @param issueId - Issue ID for directory naming
72
72
  */
73
- export async function downloadImagesForClaudeCode(markdown, featureId) {
73
+ export async function downloadImagesForClaudeCode(markdown, issueId) {
74
74
  if (!markdown) {
75
75
  return { processedMarkdown: markdown, downloadedImages: [] };
76
76
  }
77
- // Use provided featureId or fall back to currentFeatureId or timestamp
78
- const effectiveFeatureId = featureId || currentFeatureId || Date.now().toString();
77
+ // Use provided issueId or fall back to currentIssueId or timestamp
78
+ const effectiveIssueId = issueId || currentIssueId || Date.now().toString();
79
79
  // Extract all image URLs from markdown
80
80
  const imageRegex = /!\[([^\]]*)\]\(([^)]+)\)(?:\{width=\d+\})?/g;
81
81
  const matches = Array.from(markdown.matchAll(imageRegex));
82
82
  if (matches.length === 0) {
83
83
  return { processedMarkdown: markdown, downloadedImages: [] };
84
84
  }
85
- // Create temp directory for this feature
86
- const tempDir = getTempDir(effectiveFeatureId);
85
+ // Create temp directory for this issue
86
+ const tempDir = getTempDir(effectiveIssueId);
87
87
  await mkdir(tempDir, { recursive: true });
88
88
  const downloadedImages = [];
89
89
  let processedMarkdown = markdown;
@@ -2,7 +2,7 @@
2
2
  * Logging utilities for pipeline execution
3
3
  */
4
4
  import { type PipelineResult } from '../types/pipeline.js';
5
- export declare const logPipelineStart: (featureId: string, verbose?: boolean) => void;
5
+ export declare const logPipelineStart: (issueId: string, verbose?: boolean) => void;
6
6
  export declare const logPhaseResult: (result: PipelineResult, verbose?: boolean) => PipelineResult;
7
7
  export declare const logPipelineComplete: (results: readonly PipelineResult[], verbose?: boolean) => readonly PipelineResult[];
8
8
  export declare const shouldContinuePipeline: (results: readonly PipelineResult[]) => boolean;
@@ -3,9 +3,9 @@
3
3
  */
4
4
  import { logDebug, logError, logSuccess } from './logger.js';
5
5
  // Pipeline execution utilities
6
- export const logPipelineStart = (featureId, verbose) => {
7
- logDebug(`Starting complete pipeline for feature: ${featureId}`, verbose);
8
- logDebug('Pipeline phases: feature-analysis → technical-design → code-implementation → functional-testing', verbose);
6
+ export const logPipelineStart = (issueId, verbose) => {
7
+ logDebug(`Starting complete pipeline for issue: ${issueId}`, verbose);
8
+ logDebug('Pipeline phases: issue-analysis → technical-design → code-implementation → functional-testing', verbose);
9
9
  };
10
10
  export const logPhaseResult = (result, verbose) => {
11
11
  if (verbose) {
@@ -21,9 +21,9 @@ export const logPhaseResult = (result, verbose) => {
21
21
  export const logPipelineComplete = (results, verbose) => {
22
22
  if (verbose) {
23
23
  const lastResult = results[results.length - 1];
24
- const featureId = lastResult?.featureId;
24
+ const issueId = lastResult?.issueId;
25
25
  if (lastResult?.status === 'success') {
26
- logSuccess(`Complete pipeline finished successfully for feature: ${featureId}`);
26
+ logSuccess(`Complete pipeline finished successfully for issue: ${issueId}`);
27
27
  }
28
28
  else {
29
29
  logError(`Pipeline failed at ${lastResult?.phase}: ${lastResult?.message}`);
@@ -1,17 +1,17 @@
1
1
  /**
2
- * Workspace Manager - Manages the edsger working directory and feature repos
2
+ * Workspace Manager - Manages the edsger working directory and issue repos
3
3
  *
4
4
  * Handles:
5
5
  * - Detecting or creating the 'edsger' working directory
6
6
  * - Cloning repos using GitHub App installation tokens
7
- * - Using feature ID as directory name for cloned repos
8
- * - Reusing existing cloned repos for the same feature
7
+ * - Using issue ID as directory name for cloned repos
8
+ * - Reusing existing cloned repos for the same issue
9
9
  */
10
10
  export interface WorkspaceConfig {
11
11
  /** Root workspace directory path */
12
12
  rootDir: string;
13
13
  }
14
- export interface FeatureRepo {
14
+ export interface IssueRepo {
15
15
  /** Path to the cloned repo directory */
16
16
  repoPath: string;
17
17
  /** Whether the repo was freshly cloned (vs reused) */
@@ -30,28 +30,28 @@ export declare function getWorkspaceRoot(): string;
30
30
  */
31
31
  export declare function ensureWorkspaceDir(): string;
32
32
  /**
33
- * Get the directory path for a feature's repo clone
34
- * Uses the feature ID as the directory name
33
+ * Get the directory path for an issue's repo clone
34
+ * Uses the issue ID as the directory name
35
35
  */
36
- export declare function getFeatureRepoPath(workspaceRoot: string, featureId: string): string;
36
+ export declare function getIssueRepoPath(workspaceRoot: string, issueId: string): string;
37
37
  /**
38
- * Check if a feature's repo already exists locally
38
+ * Check if an issue's repo already exists locally
39
39
  */
40
- export declare function featureRepoExists(workspaceRoot: string, featureId: string): boolean;
40
+ export declare function issueRepoExists(workspaceRoot: string, issueId: string): boolean;
41
41
  /**
42
- * Clone a repository for a feature using GitHub App installation token
42
+ * Clone a repository for an issue using GitHub App installation token
43
43
  *
44
44
  * Uses `git -c credential.helper` to pass the token securely
45
45
  * instead of embedding it in the clone URL (which would be visible via `ps`).
46
46
  *
47
47
  * @param workspaceRoot - The workspace root directory
48
- * @param featureId - The feature ID (used as directory name)
48
+ * @param issueId - The issue ID (used as directory name)
49
49
  * @param owner - GitHub repo owner
50
50
  * @param repo - GitHub repo name
51
51
  * @param token - GitHub installation token
52
- * @returns FeatureRepo with the path and clone status
52
+ * @returns IssueRepo with the path and clone status
53
53
  */
54
- export declare function cloneFeatureRepo(workspaceRoot: string, featureId: string, owner: string, repo: string, token: string): FeatureRepo;
54
+ export declare function cloneIssueRepo(workspaceRoot: string, issueId: string, owner: string, repo: string, token: string): IssueRepo;
55
55
  /**
56
56
  * Loose validator for a git ref name (tag or branch) coming from callers
57
57
  * that pass data originating from external sources (GitHub API, AI output).
@@ -61,7 +61,7 @@ export declare function cloneFeatureRepo(workspaceRoot: string, featureId: strin
61
61
  */
62
62
  export declare function isSafeGitRef(ref: string): boolean;
63
63
  /**
64
- * Sync a cloned feature repo to a specific git ref — a tag or a branch.
64
+ * Sync a cloned issue repo to a specific git ref — a tag or a branch.
65
65
  *
66
66
  * Behaviour:
67
67
  * - `git fetch origin --tags --prune` brings in new tags (release tags!) and
@@ -84,12 +84,12 @@ export declare function syncRepoToRef(repoPath: string, ref: {
84
84
  branch?: string;
85
85
  }, token: string): void;
86
86
  /**
87
- * Set up a feature's repo for work (install deps, etc.)
87
+ * Set up an issue's repo for work (install deps, etc.)
88
88
  * This is called after cloning or reusing a repo
89
89
  */
90
- export declare function setupFeatureRepo(repoPath: string): void;
90
+ export declare function setupIssueRepo(repoPath: string): void;
91
91
  /**
92
- * Update the remote token for a feature repo
92
+ * Update the remote token for an issue repo
93
93
  * Used when the installation token has been refreshed
94
94
  */
95
95
  export declare function updateRepoToken(repoPath: string, owner: string, repo: string, _token: string): void;
@@ -1,11 +1,11 @@
1
1
  /**
2
- * Workspace Manager - Manages the edsger working directory and feature repos
2
+ * Workspace Manager - Manages the edsger working directory and issue repos
3
3
  *
4
4
  * Handles:
5
5
  * - Detecting or creating the 'edsger' working directory
6
6
  * - Cloning repos using GitHub App installation tokens
7
- * - Using feature ID as directory name for cloned repos
8
- * - Reusing existing cloned repos for the same feature
7
+ * - Using issue ID as directory name for cloned repos
8
+ * - Reusing existing cloned repos for the same issue
9
9
  */
10
10
  import { execFileSync, execSync } from 'child_process';
11
11
  import { existsSync, mkdirSync } from 'fs';
@@ -41,34 +41,34 @@ export function ensureWorkspaceDir() {
41
41
  return workspaceRoot;
42
42
  }
43
43
  /**
44
- * Get the directory path for a feature's repo clone
45
- * Uses the feature ID as the directory name
44
+ * Get the directory path for an issue's repo clone
45
+ * Uses the issue ID as the directory name
46
46
  */
47
- export function getFeatureRepoPath(workspaceRoot, featureId) {
48
- return join(workspaceRoot, featureId);
47
+ export function getIssueRepoPath(workspaceRoot, issueId) {
48
+ return join(workspaceRoot, issueId);
49
49
  }
50
50
  /**
51
- * Check if a feature's repo already exists locally
51
+ * Check if an issue's repo already exists locally
52
52
  */
53
- export function featureRepoExists(workspaceRoot, featureId) {
54
- const repoPath = getFeatureRepoPath(workspaceRoot, featureId);
53
+ export function issueRepoExists(workspaceRoot, issueId) {
54
+ const repoPath = getIssueRepoPath(workspaceRoot, issueId);
55
55
  return existsSync(join(repoPath, '.git'));
56
56
  }
57
57
  /**
58
- * Clone a repository for a feature using GitHub App installation token
58
+ * Clone a repository for an issue using GitHub App installation token
59
59
  *
60
60
  * Uses `git -c credential.helper` to pass the token securely
61
61
  * instead of embedding it in the clone URL (which would be visible via `ps`).
62
62
  *
63
63
  * @param workspaceRoot - The workspace root directory
64
- * @param featureId - The feature ID (used as directory name)
64
+ * @param issueId - The issue ID (used as directory name)
65
65
  * @param owner - GitHub repo owner
66
66
  * @param repo - GitHub repo name
67
67
  * @param token - GitHub installation token
68
- * @returns FeatureRepo with the path and clone status
68
+ * @returns IssueRepo with the path and clone status
69
69
  */
70
- export function cloneFeatureRepo(workspaceRoot, featureId, owner, repo, token) {
71
- const repoPath = getFeatureRepoPath(workspaceRoot, featureId);
70
+ export function cloneIssueRepo(workspaceRoot, issueId, owner, repo, token) {
71
+ const repoPath = getIssueRepoPath(workspaceRoot, issueId);
72
72
  const repoUrl = `https://github.com/${owner}/${repo}.git`;
73
73
  // Use the shared credential helper builder. Passes the installation
74
74
  // token via `git -c credential.helper=...` so it stays out of the
@@ -76,7 +76,7 @@ export function cloneFeatureRepo(workspaceRoot, featureId, owner, repo, token) {
76
76
  const gitCredentialArgs = buildCredentialArgs(token);
77
77
  // Check if already cloned
78
78
  if (existsSync(join(repoPath, '.git'))) {
79
- logInfo(`Reusing existing repo for feature ${featureId}`);
79
+ logInfo(`Reusing existing repo for issue ${issueId}`);
80
80
  // Update the remote URL (without token) and fetch using credential helper
81
81
  try {
82
82
  execSync(`git remote set-url origin "${repoUrl}"`, {
@@ -102,7 +102,7 @@ export function cloneFeatureRepo(workspaceRoot, featureId, owner, repo, token) {
102
102
  return { repoPath, freshClone: false };
103
103
  }
104
104
  // Clone fresh using credential helper
105
- logInfo(`Cloning ${owner}/${repo} for feature ${featureId}...`);
105
+ logInfo(`Cloning ${owner}/${repo} for issue ${issueId}...`);
106
106
  // Use execFileSync to avoid shell interpretation of credential helper metacharacters
107
107
  try {
108
108
  execFileSync('git', [...gitCredentialArgs, 'clone', repoUrl, repoPath], {
@@ -142,7 +142,7 @@ export function isSafeGitRef(ref) {
142
142
  return /^[A-Za-z0-9._\-+/@]+$/.test(ref);
143
143
  }
144
144
  /**
145
- * Sync a cloned feature repo to a specific git ref — a tag or a branch.
145
+ * Sync a cloned issue repo to a specific git ref — a tag or a branch.
146
146
  *
147
147
  * Behaviour:
148
148
  * - `git fetch origin --tags --prune` brings in new tags (release tags!) and
@@ -221,10 +221,10 @@ export function syncRepoToRef(repoPath, ref, token) {
221
221
  }
222
222
  }
223
223
  /**
224
- * Set up a feature's repo for work (install deps, etc.)
224
+ * Set up an issue's repo for work (install deps, etc.)
225
225
  * This is called after cloning or reusing a repo
226
226
  */
227
- export function setupFeatureRepo(repoPath) {
227
+ export function setupIssueRepo(repoPath) {
228
228
  // Check for package.json and install deps if needed
229
229
  if (existsSync(join(repoPath, 'package.json'))) {
230
230
  try {
@@ -241,7 +241,7 @@ export function setupFeatureRepo(repoPath) {
241
241
  }
242
242
  }
243
243
  /**
244
- * Update the remote token for a feature repo
244
+ * Update the remote token for an issue repo
245
245
  * Used when the installation token has been refreshed
246
246
  */
247
247
  export function updateRepoToken(repoPath, owner, repo, _token) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edsger",
3
- "version": "0.50.0",
3
+ "version": "0.52.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "edsger": "dist/index.js"
package/vitest.config.ts CHANGED
@@ -9,6 +9,10 @@ export default defineConfig({
9
9
  include: [
10
10
  'src/phases/run-sheet/__tests__/**/*.test.ts',
11
11
  'src/phases/code-refine-verification/__tests__/**/*.test.ts',
12
+ 'src/phases/find-bugs/__tests__/**/*.test.ts',
13
+ 'src/phases/find-features/__tests__/**/*.test.ts',
14
+ 'src/phases/find-smells/__tests__/**/*.test.ts',
15
+ 'src/commands/find-smells/__tests__/**/*.test.ts',
12
16
  ],
13
17
  exclude: ['dist/**', 'node_modules/**'],
14
18
  environment: 'node',
@@ -1,7 +0,0 @@
1
- /**
2
- * Unit tests for app-store API helpers.
3
- *
4
- * Tests the parsing/extraction logic that getAppStorePrimaryLocale uses
5
- * to parse MCP response data.
6
- */
7
- export {};
@@ -1,60 +0,0 @@
1
- /**
2
- * Unit tests for app-store API helpers.
3
- *
4
- * Tests the parsing/extraction logic that getAppStorePrimaryLocale uses
5
- * to parse MCP response data.
6
- */
7
- import assert from 'node:assert';
8
- import { describe, it } from 'node:test';
9
- /**
10
- * Extracts locale from an MCP response — mirrors the parsing logic
11
- * inside getAppStorePrimaryLocale without requiring network mocks.
12
- */
13
- function parseLocaleFromMcpResponse(result) {
14
- const text = result?.content?.[0]?.text || '{}';
15
- const parsed = JSON.parse(text);
16
- return parsed.locale || null;
17
- }
18
- void describe('parseLocaleFromMcpResponse', () => {
19
- void it('should return locale string when present', () => {
20
- const result = { content: [{ text: '{"locale":"en-US"}' }] };
21
- assert.strictEqual(parseLocaleFromMcpResponse(result), 'en-US');
22
- });
23
- void it('should return locale for non-English locales', () => {
24
- assert.strictEqual(parseLocaleFromMcpResponse({ content: [{ text: '{"locale":"ja"}' }] }), 'ja');
25
- assert.strictEqual(parseLocaleFromMcpResponse({
26
- content: [{ text: '{"locale":"zh-Hans"}' }],
27
- }), 'zh-Hans');
28
- assert.strictEqual(parseLocaleFromMcpResponse({ content: [{ text: '{"locale":"fr-FR"}' }] }), 'fr-FR');
29
- });
30
- void it('should return null when locale is null', () => {
31
- const result = { content: [{ text: '{"locale":null}' }] };
32
- assert.strictEqual(parseLocaleFromMcpResponse(result), null);
33
- });
34
- void it('should return null when locale is empty string', () => {
35
- const result = { content: [{ text: '{"locale":""}' }] };
36
- assert.strictEqual(parseLocaleFromMcpResponse(result), null);
37
- });
38
- void it('should return null when content array is empty', () => {
39
- const result = { content: [] };
40
- assert.strictEqual(parseLocaleFromMcpResponse(result), null);
41
- });
42
- void it('should return null when content field is missing', () => {
43
- assert.strictEqual(parseLocaleFromMcpResponse({}), null);
44
- });
45
- void it('should return null when result is null', () => {
46
- assert.strictEqual(parseLocaleFromMcpResponse(null), null);
47
- });
48
- void it('should return null when result is undefined', () => {
49
- assert.strictEqual(parseLocaleFromMcpResponse(undefined), null);
50
- });
51
- void it('should throw when text is not valid JSON', () => {
52
- assert.throws(() => {
53
- parseLocaleFromMcpResponse({ content: [{ text: 'not json' }] });
54
- });
55
- });
56
- void it('should return null when text field is missing', () => {
57
- const result = { content: [{}] };
58
- assert.strictEqual(parseLocaleFromMcpResponse(result), null);
59
- });
60
- });