automagik-forge 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/.cargo/config.toml +13 -0
  2. package/.claude/commands/commit.md +376 -0
  3. package/.claude/commands/prompt.md +871 -0
  4. package/.env.example +20 -0
  5. package/.github/actions/setup-node/action.yml +29 -0
  6. package/.github/images/automagik-logo.png +0 -0
  7. package/.github/workflows/pre-release.yml +470 -0
  8. package/.github/workflows/publish.yml +145 -0
  9. package/.github/workflows/test.yml +63 -0
  10. package/.mcp.json +57 -0
  11. package/AGENT.md +40 -0
  12. package/CLAUDE.md +40 -0
  13. package/CODE-OF-CONDUCT.md +89 -0
  14. package/Cargo.toml +19 -0
  15. package/Dockerfile +43 -0
  16. package/LICENSE +201 -0
  17. package/Makefile +97 -0
  18. package/README.md +447 -143
  19. package/backend/.sqlx/query-01b7e2bac1261d8be3d03c03df3e5220590da6c31c77f161074fc62752d63881.json +12 -0
  20. package/backend/.sqlx/query-03f2b02ba6dc5ea2b3cf6b1004caea0ad6bcc10ebd63f441d321a389f026e263.json +12 -0
  21. package/backend/.sqlx/query-0923b77d137a29fc54d399a873ff15fc4af894490bc65a4d344a7575cb0d8643.json +12 -0
  22. package/backend/.sqlx/query-0f808bcdb63c5f180836e448dd64c435c51758b2fc54a52ce9e67495b1ab200e.json +68 -0
  23. package/backend/.sqlx/query-1268afe9ca849daa6722e3df7ca8e9e61f0d37052e782bb5452ab8e1018d9b63.json +12 -0
  24. package/backend/.sqlx/query-1b082630a9622f8667ee7a9aba2c2d3176019a68c6bb83d33008594821415a57.json +12 -0
  25. package/backend/.sqlx/query-1c7b06ba1e112abf6b945a2ff08a0b40ec23f3738c2e7399f067b558cf8d490e.json +12 -0
  26. package/backend/.sqlx/query-1f619f01f46859a64ded531dd0ef61abacfe62e758abe7030a6aa745140b95ca.json +104 -0
  27. package/backend/.sqlx/query-1fca1ce14b4b20205364cd1f1f45ebe1d2e30cd745e59e189d56487b5639dfbb.json +12 -0
  28. package/backend/.sqlx/query-212828320e8d871ab9d83705a040b23bcf0393dc7252177fc539a74657f578ef.json +32 -0
  29. package/backend/.sqlx/query-290ce5c152be8d36e58ff42570f9157beb07ab9e77a03ec6fc30b4f56f9b8f6b.json +56 -0
  30. package/backend/.sqlx/query-2b471d2c2e8ffbe0cd42d2a91b814c0d79f9d09200f147e3cea33ba4ce673c8a.json +68 -0
  31. package/backend/.sqlx/query-354a48c705bb9bb2048c1b7f10fcb714e23f9db82b7a4ea6932486197b2ede6a.json +92 -0
  32. package/backend/.sqlx/query-36c9e3dd10648e94b949db5c91a774ecb1e10a899ef95da74066eccedca4d8b2.json +12 -0
  33. package/backend/.sqlx/query-36e4ba7bbd81b402d5a20b6005755eafbb174c8dda442081823406ac32809a94.json +56 -0
  34. package/backend/.sqlx/query-3a5b3c98a55ca183ab20c74708e3d7e579dda37972c059e7515c4ceee4bd8dd3.json +62 -0
  35. package/backend/.sqlx/query-3d0a1cabf2a52e9d90cdfd29c509ca89aeb448d0c1d2446c65cd43db40735e86.json +62 -0
  36. package/backend/.sqlx/query-3d6bd16fbce59efe30b7f67ea342e0e4ea6d1432389c02468ad79f1f742d4031.json +56 -0
  37. package/backend/.sqlx/query-4049ca413b285a05aca6b25385e9c8185575f01e9069e4e8581aa45d713f612f.json +32 -0
  38. package/backend/.sqlx/query-412bacd3477d86369082e90f52240407abce436cb81292d42b2dbe1e5c18eea1.json +104 -0
  39. package/backend/.sqlx/query-417a8b1ff4e51de82aea0159a3b97932224dc325b23476cb84153d690227fd8b.json +62 -0
  40. package/backend/.sqlx/query-461cc1b0bb6fd909afc9dd2246e8526b3771cfbb0b22ae4b5d17b51af587b9e2.json +56 -0
  41. package/backend/.sqlx/query-58408c7a8cdeeda0bef359f1f9bd91299a339dc2b191462fc58c9736a56d5227.json +92 -0
  42. package/backend/.sqlx/query-5a886026d75d515c01f347cc203c8d99dd04c61dc468e2e4c5aa548436d13834.json +62 -0
  43. package/backend/.sqlx/query-5b902137b11022d2e1a5c4f6a9c83fec1a856c6a710aff831abd2382ede76b43.json +12 -0
  44. package/backend/.sqlx/query-5ed1238e52e59bb5f76c0f153fd99a14093f7ce2585bf9843585608f17ec575b.json +104 -0
  45. package/backend/.sqlx/query-6e8b860b14decfc2227dc57213f38442943d3fbef5c8418fd6b634c6e0f5e2ea.json +104 -0
  46. package/backend/.sqlx/query-6ec414276994c4ccb2433eaa5b1b342168557d17ddf5a52dac84cb1b59b9de8f.json +68 -0
  47. package/backend/.sqlx/query-6ecfa16d0cf825aacf233544b5baf151e9adfdca26c226ad71020d291fd802d5.json +62 -0
  48. package/backend/.sqlx/query-72509d252c39fce77520aa816cb2acbc1fb35dc2605e7be893610599b2427f2e.json +62 -0
  49. package/backend/.sqlx/query-75239b2da188f749707d77f3c1544332ca70db3d6d6743b2601dc0d167536437.json +62 -0
  50. package/backend/.sqlx/query-83d10e29f8478aff33434f9ac67068e013b888b953a2657e2bb72a6f619d04f2.json +50 -0
  51. package/backend/.sqlx/query-8610803360ea18b9b9d078a6981ea56abfbfe84e6354fc1d5ae4c622e01410ed.json +68 -0
  52. package/backend/.sqlx/query-86d03eb70eef39c59296416867f2ee66c9f7cd8b7f961fbda2f89fc0a1c442c2.json +12 -0
  53. package/backend/.sqlx/query-87d0feb5a6b442bad9c60068ea7569599cc6fc91a0e2692ecb42e93b03201b9d.json +68 -0
  54. package/backend/.sqlx/query-8a67b3b3337248f06a57bdf8a908f7ef23177431eaed82dc08c94c3e5944340e.json +12 -0
  55. package/backend/.sqlx/query-8f01ebd64bdcde6a090479f14810d73ba23020e76fd70854ac57f2da251702c3.json +12 -0
  56. package/backend/.sqlx/query-90fd607fcb2dca72239ff25e618e21e174b195991eaa33722cbf5f76da84cfab.json +62 -0
  57. package/backend/.sqlx/query-92e8bdbcd80c5ff3db7a35cf79492048803ef305cbdef0d0a1fe5dc881ca8c71.json +104 -0
  58. package/backend/.sqlx/query-93a1605f90e9672dad29b472b6ad85fa9a55ea3ffa5abcb8724b09d61be254ca.json +20 -0
  59. package/backend/.sqlx/query-9472c8fb477958167f5fae40b85ac44252468c5226b2cdd7770f027332eed6d7.json +104 -0
  60. package/backend/.sqlx/query-96036c4f9e0f48bdc5a4a4588f0c5f288ac7aaa5425cac40fc33f337e1a351f2.json +56 -0
  61. package/backend/.sqlx/query-9edb2c01e91fd0f0fe7b56e988c7ae0393150f50be3f419a981e035c0121dfc7.json +104 -0
  62. package/backend/.sqlx/query-a157cf00616f703bfba21927f1eb1c9eec2a81c02da15f66efdba0b6c375de1b.json +26 -0
  63. package/backend/.sqlx/query-a31fff84f3b8e532fd1160447d89d700f06ae08821fee00c9a5b60492b05259c.json +62 -0
  64. package/backend/.sqlx/query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json +12 -0
  65. package/backend/.sqlx/query-a6d2961718dbc3b1a925e549f49a159c561bef58c105529275f274b27e2eba5b.json +104 -0
  66. package/backend/.sqlx/query-a9e93d5b09b29faf66e387e4d7596a792d81e75c4d3726e83c2963e8d7c9b56f.json +104 -0
  67. package/backend/.sqlx/query-ac5247c8d7fb86e4650c4b0eb9420031614c831b7b085083bac20c1af314c538.json +12 -0
  68. package/backend/.sqlx/query-afef9467be74c411c4cb119a8b2b1aea53049877dfc30cc60b486134ba4b4c9f.json +68 -0
  69. package/backend/.sqlx/query-b2b2c6b4d0b1a347b5c4cb63c3a46a265d4db53be9554989a814b069d0af82f2.json +62 -0
  70. package/backend/.sqlx/query-c50d2ff0b12e5bcc81e371089ee2d007e233e7db93aefba4fef08e7aa68f5ab7.json +20 -0
  71. package/backend/.sqlx/query-c614e6056b244ca07f1b9d44e7edc9d5819225c6f8d9e077070c6e518a17f50b.json +12 -0
  72. package/backend/.sqlx/query-c67259be8bf4ee0cfd32167b2aa3b7fe9192809181a8171bf1c2d6df731967ae.json +12 -0
  73. package/backend/.sqlx/query-d2d0a1b985ebbca6a2b3e882a221a219f3199890fa640afc946ef1a792d6d8de.json +12 -0
  74. package/backend/.sqlx/query-d30aa5786757f32bf2b9c5fe51a45e506c71c28c5994e430d9b0546adb15ffa2.json +20 -0
  75. package/backend/.sqlx/query-d3b9ea1de1576af71b312924ce7f4ea8ae5dbe2ac138ea3b4470f2d5cd734846.json +12 -0
  76. package/backend/.sqlx/query-ed8456646fa69ddd412441955f06ff22bfb790f29466450735e0b8bb1bc4ec94.json +12 -0
  77. package/backend/Cargo.toml +71 -0
  78. package/backend/build.rs +32 -0
  79. package/backend/migrations/20250617183714_init.sql +44 -0
  80. package/backend/migrations/20250620212427_execution_processes.sql +25 -0
  81. package/backend/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql +28 -0
  82. package/backend/migrations/20250621120000_relate_activities_to_execution_processes.sql +23 -0
  83. package/backend/migrations/20250623120000_executor_sessions.sql +17 -0
  84. package/backend/migrations/20250623130000_add_executor_type_to_execution_processes.sql +4 -0
  85. package/backend/migrations/20250625000000_add_dev_script_to_projects.sql +4 -0
  86. package/backend/migrations/20250701000000_add_branch_to_task_attempts.sql +2 -0
  87. package/backend/migrations/20250701000001_add_pr_tracking_to_task_attempts.sql +5 -0
  88. package/backend/migrations/20250701120000_add_assistant_message_to_executor_sessions.sql +2 -0
  89. package/backend/migrations/20250708000000_add_base_branch_to_task_attempts.sql +2 -0
  90. package/backend/migrations/20250709000000_add_worktree_deleted_flag.sql +2 -0
  91. package/backend/migrations/20250710000000_add_setup_completion.sql +3 -0
  92. package/backend/migrations/20250715154859_add_task_templates.sql +25 -0
  93. package/backend/migrations/20250716143725_add_default_templates.sql +174 -0
  94. package/backend/migrations/20250716161432_update_executor_names_to_kebab_case.sql +20 -0
  95. package/backend/migrations/20250716170000_add_parent_task_to_tasks.sql +7 -0
  96. package/backend/migrations/20250717000000_drop_task_attempt_activities.sql +9 -0
  97. package/backend/migrations/20250719000000_add_cleanup_script_to_projects.sql +2 -0
  98. package/backend/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql +25 -0
  99. package/backend/migrations/20250723000000_add_wish_to_tasks.sql +7 -0
  100. package/backend/migrations/20250724000000_remove_unique_wish_constraint.sql +5 -0
  101. package/backend/scripts/toast-notification.ps1 +23 -0
  102. package/backend/sounds/abstract-sound1.wav +0 -0
  103. package/backend/sounds/abstract-sound2.wav +0 -0
  104. package/backend/sounds/abstract-sound3.wav +0 -0
  105. package/backend/sounds/abstract-sound4.wav +0 -0
  106. package/backend/sounds/cow-mooing.wav +0 -0
  107. package/backend/sounds/phone-vibration.wav +0 -0
  108. package/backend/sounds/rooster.wav +0 -0
  109. package/backend/src/app_state.rs +218 -0
  110. package/backend/src/bin/generate_types.rs +189 -0
  111. package/backend/src/bin/mcp_task_server.rs +191 -0
  112. package/backend/src/execution_monitor.rs +1193 -0
  113. package/backend/src/executor.rs +1053 -0
  114. package/backend/src/executors/amp.rs +697 -0
  115. package/backend/src/executors/ccr.rs +91 -0
  116. package/backend/src/executors/charm_opencode.rs +113 -0
  117. package/backend/src/executors/claude.rs +887 -0
  118. package/backend/src/executors/cleanup_script.rs +124 -0
  119. package/backend/src/executors/dev_server.rs +53 -0
  120. package/backend/src/executors/echo.rs +79 -0
  121. package/backend/src/executors/gemini/config.rs +67 -0
  122. package/backend/src/executors/gemini/streaming.rs +363 -0
  123. package/backend/src/executors/gemini.rs +765 -0
  124. package/backend/src/executors/mod.rs +23 -0
  125. package/backend/src/executors/opencode_ai.rs +113 -0
  126. package/backend/src/executors/setup_script.rs +130 -0
  127. package/backend/src/executors/sst_opencode/filter.rs +184 -0
  128. package/backend/src/executors/sst_opencode/tools.rs +139 -0
  129. package/backend/src/executors/sst_opencode.rs +756 -0
  130. package/backend/src/lib.rs +45 -0
  131. package/backend/src/main.rs +324 -0
  132. package/backend/src/mcp/mod.rs +1 -0
  133. package/backend/src/mcp/task_server.rs +850 -0
  134. package/backend/src/middleware/mod.rs +3 -0
  135. package/backend/src/middleware/model_loaders.rs +242 -0
  136. package/backend/src/models/api_response.rs +36 -0
  137. package/backend/src/models/config.rs +375 -0
  138. package/backend/src/models/execution_process.rs +430 -0
  139. package/backend/src/models/executor_session.rs +225 -0
  140. package/backend/src/models/mod.rs +12 -0
  141. package/backend/src/models/project.rs +356 -0
  142. package/backend/src/models/task.rs +345 -0
  143. package/backend/src/models/task_attempt.rs +1214 -0
  144. package/backend/src/models/task_template.rs +146 -0
  145. package/backend/src/openapi.rs +93 -0
  146. package/backend/src/routes/auth.rs +297 -0
  147. package/backend/src/routes/config.rs +385 -0
  148. package/backend/src/routes/filesystem.rs +228 -0
  149. package/backend/src/routes/health.rs +16 -0
  150. package/backend/src/routes/mod.rs +9 -0
  151. package/backend/src/routes/projects.rs +562 -0
  152. package/backend/src/routes/stream.rs +244 -0
  153. package/backend/src/routes/task_attempts.rs +1172 -0
  154. package/backend/src/routes/task_templates.rs +229 -0
  155. package/backend/src/routes/tasks.rs +353 -0
  156. package/backend/src/services/analytics.rs +216 -0
  157. package/backend/src/services/git_service.rs +1321 -0
  158. package/backend/src/services/github_service.rs +307 -0
  159. package/backend/src/services/mod.rs +13 -0
  160. package/backend/src/services/notification_service.rs +263 -0
  161. package/backend/src/services/pr_monitor.rs +214 -0
  162. package/backend/src/services/process_service.rs +940 -0
  163. package/backend/src/utils/path.rs +96 -0
  164. package/backend/src/utils/shell.rs +19 -0
  165. package/backend/src/utils/text.rs +24 -0
  166. package/backend/src/utils/worktree_manager.rs +578 -0
  167. package/backend/src/utils.rs +125 -0
  168. package/backend/test.db +0 -0
  169. package/build-npm-package.sh +61 -0
  170. package/dev_assets_seed/config.json +19 -0
  171. package/frontend/.eslintrc.json +25 -0
  172. package/frontend/.prettierrc.json +8 -0
  173. package/frontend/components.json +17 -0
  174. package/frontend/index.html +19 -0
  175. package/frontend/package-lock.json +7321 -0
  176. package/frontend/package.json +61 -0
  177. package/frontend/postcss.config.js +6 -0
  178. package/frontend/public/android-chrome-192x192.png +0 -0
  179. package/frontend/public/android-chrome-512x512.png +0 -0
  180. package/frontend/public/apple-touch-icon.png +0 -0
  181. package/frontend/public/automagik-forge-logo-dark.svg +3 -0
  182. package/frontend/public/automagik-forge-logo.svg +3 -0
  183. package/frontend/public/automagik-forge-screenshot-overview.png +0 -0
  184. package/frontend/public/favicon-16x16.png +0 -0
  185. package/frontend/public/favicon-32x32.png +0 -0
  186. package/frontend/public/favicon.ico +0 -0
  187. package/frontend/public/site.webmanifest +1 -0
  188. package/frontend/public/viba-kanban-favicon.png +0 -0
  189. package/frontend/src/App.tsx +157 -0
  190. package/frontend/src/components/DisclaimerDialog.tsx +106 -0
  191. package/frontend/src/components/GitHubLoginDialog.tsx +314 -0
  192. package/frontend/src/components/OnboardingDialog.tsx +185 -0
  193. package/frontend/src/components/PrivacyOptInDialog.tsx +130 -0
  194. package/frontend/src/components/ProvidePatDialog.tsx +98 -0
  195. package/frontend/src/components/TaskTemplateManager.tsx +336 -0
  196. package/frontend/src/components/config-provider.tsx +119 -0
  197. package/frontend/src/components/context/TaskDetailsContextProvider.tsx +470 -0
  198. package/frontend/src/components/context/taskDetailsContext.ts +125 -0
  199. package/frontend/src/components/keyboard-shortcuts-demo.tsx +35 -0
  200. package/frontend/src/components/layout/navbar.tsx +86 -0
  201. package/frontend/src/components/logo.tsx +44 -0
  202. package/frontend/src/components/projects/ProjectCard.tsx +155 -0
  203. package/frontend/src/components/projects/project-detail.tsx +251 -0
  204. package/frontend/src/components/projects/project-form-fields.tsx +238 -0
  205. package/frontend/src/components/projects/project-form.tsx +301 -0
  206. package/frontend/src/components/projects/project-list.tsx +200 -0
  207. package/frontend/src/components/projects/projects-page.tsx +20 -0
  208. package/frontend/src/components/tasks/BranchSelector.tsx +169 -0
  209. package/frontend/src/components/tasks/DeleteFileConfirmationDialog.tsx +94 -0
  210. package/frontend/src/components/tasks/EditorSelectionDialog.tsx +119 -0
  211. package/frontend/src/components/tasks/TaskCard.tsx +154 -0
  212. package/frontend/src/components/tasks/TaskDetails/CollapsibleToolbar.tsx +33 -0
  213. package/frontend/src/components/tasks/TaskDetails/DiffCard.tsx +109 -0
  214. package/frontend/src/components/tasks/TaskDetails/DiffChunkSection.tsx +135 -0
  215. package/frontend/src/components/tasks/TaskDetails/DiffFile.tsx +296 -0
  216. package/frontend/src/components/tasks/TaskDetails/DiffTab.tsx +32 -0
  217. package/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx +392 -0
  218. package/frontend/src/components/tasks/TaskDetails/LogsTab/Conversation.tsx +256 -0
  219. package/frontend/src/components/tasks/TaskDetails/LogsTab/ConversationEntry.tsx +56 -0
  220. package/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx +92 -0
  221. package/frontend/src/components/tasks/TaskDetails/LogsTab/Prompt.tsx +22 -0
  222. package/frontend/src/components/tasks/TaskDetails/LogsTab/SetupScriptRunning.tsx +49 -0
  223. package/frontend/src/components/tasks/TaskDetails/LogsTab.tsx +186 -0
  224. package/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx +288 -0
  225. package/frontend/src/components/tasks/TaskDetails/RelatedTasksTab.tsx +216 -0
  226. package/frontend/src/components/tasks/TaskDetails/TabNavigation.tsx +93 -0
  227. package/frontend/src/components/tasks/TaskDetailsHeader.tsx +169 -0
  228. package/frontend/src/components/tasks/TaskDetailsPanel.tsx +126 -0
  229. package/frontend/src/components/tasks/TaskDetailsToolbar.tsx +302 -0
  230. package/frontend/src/components/tasks/TaskFollowUpSection.tsx +130 -0
  231. package/frontend/src/components/tasks/TaskFormDialog.tsx +400 -0
  232. package/frontend/src/components/tasks/TaskKanbanBoard.tsx +180 -0
  233. package/frontend/src/components/tasks/Toolbar/CreateAttempt.tsx +259 -0
  234. package/frontend/src/components/tasks/Toolbar/CreatePRDialog.tsx +243 -0
  235. package/frontend/src/components/tasks/Toolbar/CurrentAttempt.tsx +899 -0
  236. package/frontend/src/components/tasks/index.ts +2 -0
  237. package/frontend/src/components/theme-provider.tsx +82 -0
  238. package/frontend/src/components/theme-toggle.tsx +36 -0
  239. package/frontend/src/components/ui/alert.tsx +59 -0
  240. package/frontend/src/components/ui/auto-expanding-textarea.tsx +70 -0
  241. package/frontend/src/components/ui/badge.tsx +36 -0
  242. package/frontend/src/components/ui/button.tsx +56 -0
  243. package/frontend/src/components/ui/card.tsx +86 -0
  244. package/frontend/src/components/ui/checkbox.tsx +44 -0
  245. package/frontend/src/components/ui/chip.tsx +25 -0
  246. package/frontend/src/components/ui/dialog.tsx +124 -0
  247. package/frontend/src/components/ui/dropdown-menu.tsx +198 -0
  248. package/frontend/src/components/ui/file-search-textarea.tsx +292 -0
  249. package/frontend/src/components/ui/folder-picker.tsx +279 -0
  250. package/frontend/src/components/ui/input.tsx +25 -0
  251. package/frontend/src/components/ui/label.tsx +24 -0
  252. package/frontend/src/components/ui/loader.tsx +26 -0
  253. package/frontend/src/components/ui/markdown-renderer.tsx +75 -0
  254. package/frontend/src/components/ui/select.tsx +160 -0
  255. package/frontend/src/components/ui/separator.tsx +31 -0
  256. package/frontend/src/components/ui/shadcn-io/kanban/index.tsx +185 -0
  257. package/frontend/src/components/ui/table.tsx +117 -0
  258. package/frontend/src/components/ui/tabs.tsx +53 -0
  259. package/frontend/src/components/ui/textarea.tsx +22 -0
  260. package/frontend/src/components/ui/tooltip.tsx +28 -0
  261. package/frontend/src/hooks/useNormalizedConversation.ts +440 -0
  262. package/frontend/src/index.css +225 -0
  263. package/frontend/src/lib/api.ts +630 -0
  264. package/frontend/src/lib/keyboard-shortcuts.ts +266 -0
  265. package/frontend/src/lib/responsive-config.ts +70 -0
  266. package/frontend/src/lib/types.ts +39 -0
  267. package/frontend/src/lib/utils.ts +10 -0
  268. package/frontend/src/main.tsx +50 -0
  269. package/frontend/src/pages/McpServers.tsx +418 -0
  270. package/frontend/src/pages/Settings.tsx +610 -0
  271. package/frontend/src/pages/project-tasks.tsx +575 -0
  272. package/frontend/src/pages/projects.tsx +18 -0
  273. package/frontend/src/vite-env.d.ts +1 -0
  274. package/frontend/tailwind.config.js +125 -0
  275. package/frontend/tsconfig.json +26 -0
  276. package/frontend/tsconfig.node.json +10 -0
  277. package/frontend/vite.config.ts +33 -0
  278. package/npx-cli/README.md +159 -0
  279. package/npx-cli/automagik-forge-0.0.55.tgz +0 -0
  280. package/npx-cli/automagik-forge-0.1.0.tgz +0 -0
  281. package/{dist/linux-x64/automagik-forge.zip → npx-cli/automagik-forge-0.1.10.tgz} +0 -0
  282. package/npx-cli/package.json +17 -0
  283. package/npx-cli/vibe-kanban-0.0.55.tgz +0 -0
  284. package/package.json +23 -13
  285. package/pnpm-workspace.yaml +2 -0
  286. package/rust-toolchain.toml +11 -0
  287. package/rustfmt.toml +3 -0
  288. package/scripts/load-env.js +43 -0
  289. package/scripts/mcp_test.js +374 -0
  290. package/scripts/prepare-db.js +45 -0
  291. package/scripts/setup-dev-environment.js +274 -0
  292. package/scripts/start-mcp-sse.js +70 -0
  293. package/scripts/test-debug.js +32 -0
  294. package/scripts/test-mcp-sse.js +138 -0
  295. package/scripts/test-simple.js +44 -0
  296. package/scripts/test-wish-final.js +179 -0
  297. package/scripts/test-wish-system.js +221 -0
  298. package/shared/types.ts +182 -0
  299. package/test-npm-package.sh +42 -0
  300. package/dist/linux-x64/automagik-forge-mcp.zip +0 -0
  301. /package/{bin → npx-cli/bin}/cli.js +0 -0
@@ -0,0 +1,62 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "SELECT id as \"id!: Uuid\", name, git_repo_path, setup_script, dev_script, cleanup_script, created_at as \"created_at!: DateTime<Utc>\", updated_at as \"updated_at!: DateTime<Utc>\" FROM projects ORDER BY created_at DESC",
4
+ "describe": {
5
+ "columns": [
6
+ {
7
+ "name": "id!: Uuid",
8
+ "ordinal": 0,
9
+ "type_info": "Blob"
10
+ },
11
+ {
12
+ "name": "name",
13
+ "ordinal": 1,
14
+ "type_info": "Text"
15
+ },
16
+ {
17
+ "name": "git_repo_path",
18
+ "ordinal": 2,
19
+ "type_info": "Text"
20
+ },
21
+ {
22
+ "name": "setup_script",
23
+ "ordinal": 3,
24
+ "type_info": "Text"
25
+ },
26
+ {
27
+ "name": "dev_script",
28
+ "ordinal": 4,
29
+ "type_info": "Text"
30
+ },
31
+ {
32
+ "name": "cleanup_script",
33
+ "ordinal": 5,
34
+ "type_info": "Text"
35
+ },
36
+ {
37
+ "name": "created_at!: DateTime<Utc>",
38
+ "ordinal": 6,
39
+ "type_info": "Text"
40
+ },
41
+ {
42
+ "name": "updated_at!: DateTime<Utc>",
43
+ "ordinal": 7,
44
+ "type_info": "Text"
45
+ }
46
+ ],
47
+ "parameters": {
48
+ "Right": 0
49
+ },
50
+ "nullable": [
51
+ true,
52
+ false,
53
+ false,
54
+ true,
55
+ true,
56
+ true,
57
+ false,
58
+ false
59
+ ]
60
+ },
61
+ "hash": "b2b2c6b4d0b1a347b5c4cb63c3a46a265d4db53be9554989a814b069d0af82f2"
62
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "SELECT id as \"id!: Uuid\" FROM tasks WHERE id = $1 AND project_id = $2",
4
+ "describe": {
5
+ "columns": [
6
+ {
7
+ "name": "id!: Uuid",
8
+ "ordinal": 0,
9
+ "type_info": "Blob"
10
+ }
11
+ ],
12
+ "parameters": {
13
+ "Right": 2
14
+ },
15
+ "nullable": [
16
+ true
17
+ ]
18
+ },
19
+ "hash": "c50d2ff0b12e5bcc81e371089ee2d007e233e7db93aefba4fef08e7aa68f5ab7"
20
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "DELETE FROM tasks WHERE id = $1 AND project_id = $2",
4
+ "describe": {
5
+ "columns": [],
6
+ "parameters": {
7
+ "Right": 2
8
+ },
9
+ "nullable": []
10
+ },
11
+ "hash": "c614e6056b244ca07f1b9d44e7edc9d5819225c6f8d9e077070c6e518a17f50b"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "UPDATE execution_processes \n SET status = $1, exit_code = $2, completed_at = $3, updated_at = datetime('now') \n WHERE id = $4",
4
+ "describe": {
5
+ "columns": [],
6
+ "parameters": {
7
+ "Right": 4
8
+ },
9
+ "nullable": []
10
+ },
11
+ "hash": "c67259be8bf4ee0cfd32167b2aa3b7fe9192809181a8171bf1c2d6df731967ae"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "UPDATE tasks SET status = $3, updated_at = CURRENT_TIMESTAMP WHERE id = $1 AND project_id = $2",
4
+ "describe": {
5
+ "columns": [],
6
+ "parameters": {
7
+ "Right": 3
8
+ },
9
+ "nullable": []
10
+ },
11
+ "hash": "d2d0a1b985ebbca6a2b3e882a221a219f3199890fa640afc946ef1a792d6d8de"
12
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "\n SELECT COUNT(*) as \"count!: i64\"\n FROM projects\n WHERE id = $1\n ",
4
+ "describe": {
5
+ "columns": [
6
+ {
7
+ "name": "count!: i64",
8
+ "ordinal": 0,
9
+ "type_info": "Integer"
10
+ }
11
+ ],
12
+ "parameters": {
13
+ "Right": 1
14
+ },
15
+ "nullable": [
16
+ false
17
+ ]
18
+ },
19
+ "hash": "d30aa5786757f32bf2b9c5fe51a45e506c71c28c5994e430d9b0546adb15ffa2"
20
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "UPDATE executor_sessions \n SET prompt = $1, updated_at = datetime('now') \n WHERE id = $2",
4
+ "describe": {
5
+ "columns": [],
6
+ "parameters": {
7
+ "Right": 2
8
+ },
9
+ "nullable": []
10
+ },
11
+ "hash": "d3b9ea1de1576af71b312924ce7f4ea8ae5dbe2ac138ea3b4470f2d5cd734846"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "db_name": "SQLite",
3
+ "query": "UPDATE execution_processes SET stdout = COALESCE(stdout, '') || $1, updated_at = datetime('now') WHERE id = $2",
4
+ "describe": {
5
+ "columns": [],
6
+ "parameters": {
7
+ "Right": 2
8
+ },
9
+ "nullable": []
10
+ },
11
+ "hash": "ed8456646fa69ddd412441955f06ff22bfb790f29466450735e0b8bb1bc4ec94"
12
+ }
@@ -0,0 +1,71 @@
1
+ [package]
2
+ name = "automagik-forge"
3
+ version = "0.1.13"
4
+ edition = "2021"
5
+ default-run = "automagik-forge"
6
+ build = "build.rs"
7
+
8
+ [lib]
9
+ name = "automagik_forge"
10
+ path = "src/lib.rs"
11
+
12
+ [lints.clippy]
13
+ uninlined-format-args = "allow"
14
+
15
+ [dependencies]
16
+ tokio = { workspace = true }
17
+ tokio-util = { version = "0.7" }
18
+ axum = { workspace = true }
19
+ tower-http = { workspace = true }
20
+ serde = { workspace = true }
21
+ serde_json = { workspace = true }
22
+ anyhow = { workspace = true }
23
+ tracing = { workspace = true }
24
+ tracing-subscriber = { workspace = true }
25
+ sqlx = { version = "0.8.6", features = ["runtime-tokio-rustls", "sqlite", "chrono", "uuid"] }
26
+ chrono = { version = "0.4", features = ["serde"] }
27
+ uuid = { version = "1.0", features = ["v4", "serde"] }
28
+ ts-rs = { version = "9.0", features = ["uuid-impl", "chrono-impl", "no-serde-warnings"] }
29
+ dirs = "5.0"
30
+ xdg = "3.0"
31
+ git2 = "0.18"
32
+ async-trait = "0.1"
33
+ libc = "0.2"
34
+ rust-embed = "8.2"
35
+ mime_guess = "2.0"
36
+ directories = "6.0.0"
37
+ open = "5.3.2"
38
+ pathdiff = "0.2.1"
39
+ ignore = "0.4"
40
+ command-group = { version = "5.0", features = ["with-tokio"] }
41
+ nix = { version = "0.29", features = ["signal", "process"] }
42
+ openssl-sys = { workspace = true }
43
+ rmcp = { version = "0.3.0", features = ["server", "transport-io", "transport-sse-server"] }
44
+ schemars = "0.8"
45
+ regex = "1.11.1"
46
+ notify-rust = "4.11"
47
+ octocrab = "0.44"
48
+ os_info = "3.12.0"
49
+ sentry = { version = "0.41.0", features = ["anyhow", "backtrace", "panic", "debug-images"] }
50
+ sentry-tower = "0.41.0"
51
+ sentry-tracing = { version = "0.41.0", features = ["backtrace"] }
52
+ reqwest = { version = "0.11", features = ["json"] }
53
+ strip-ansi-escapes = "0.2.1"
54
+ urlencoding = "2.1.3"
55
+ lazy_static = "1.4"
56
+ futures-util = "0.3"
57
+ async-stream = "0.3"
58
+ json-patch = "2.0"
59
+ dotenvy = "0.15"
60
+ utoipa = { version = "5.1.0", features = ["axum_extras", "chrono", "uuid"] }
61
+ utoipa-axum = { version = "0.1.0" }
62
+ utoipa-swagger-ui = { version = "8.0.0", features = ["axum"] }
63
+
64
+ [dev-dependencies]
65
+ tempfile = "3.8"
66
+ tower = { version = "0.4", features = ["util"] }
67
+
68
+ [build-dependencies]
69
+ dotenv = "0.15"
70
+ ts-rs = { version = "9.0", features = ["uuid-impl", "chrono-impl", "no-serde-warnings"] }
71
+
@@ -0,0 +1,32 @@
1
+ use std::{fs, path::Path};
2
+
3
+ fn main() {
4
+ dotenv::dotenv().ok();
5
+
6
+ if let Ok(api_key) = std::env::var("POSTHOG_API_KEY") {
7
+ println!("cargo:rustc-env=POSTHOG_API_KEY={}", api_key);
8
+ }
9
+ if let Ok(api_endpoint) = std::env::var("POSTHOG_API_ENDPOINT") {
10
+ println!("cargo:rustc-env=POSTHOG_API_ENDPOINT={}", api_endpoint);
11
+ }
12
+ if let Ok(api_key) = std::env::var("GITHUB_APP_ID") {
13
+ println!("cargo:rustc-env=GITHUB_APP_ID={}", api_key);
14
+ }
15
+ if let Ok(api_endpoint) = std::env::var("GITHUB_APP_CLIENT_ID") {
16
+ println!("cargo:rustc-env=GITHUB_APP_CLIENT_ID={}", api_endpoint);
17
+ }
18
+
19
+ // Create frontend/dist directory if it doesn't exist
20
+ let dist_path = Path::new("../frontend/dist");
21
+ if !dist_path.exists() {
22
+ println!("cargo:warning=Creating dummy frontend/dist directory for compilation");
23
+ fs::create_dir_all(dist_path).unwrap();
24
+
25
+ // Create a dummy index.html
26
+ let dummy_html = r#"<!DOCTYPE html>
27
+ <html><head><title>Build frontend first</title></head>
28
+ <body><h1>Please build the frontend</h1></body></html>"#;
29
+
30
+ fs::write(dist_path.join("index.html"), dummy_html).unwrap();
31
+ }
32
+ }
@@ -0,0 +1,44 @@
1
+ PRAGMA foreign_keys = ON;
2
+
3
+ CREATE TABLE projects (
4
+ id BLOB PRIMARY KEY,
5
+ name TEXT NOT NULL,
6
+ git_repo_path TEXT NOT NULL DEFAULT '' UNIQUE,
7
+ setup_script TEXT DEFAULT '',
8
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
9
+ updated_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec'))
10
+ );
11
+
12
+ CREATE TABLE tasks (
13
+ id BLOB PRIMARY KEY,
14
+ project_id BLOB NOT NULL,
15
+ title TEXT NOT NULL,
16
+ description TEXT,
17
+ status TEXT NOT NULL DEFAULT 'todo'
18
+ CHECK (status IN ('todo','inprogress','done','cancelled','inreview')),
19
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
20
+ updated_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
21
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
22
+ );
23
+
24
+ CREATE TABLE task_attempts (
25
+ id BLOB PRIMARY KEY,
26
+ task_id BLOB NOT NULL,
27
+ worktree_path TEXT NOT NULL,
28
+ merge_commit TEXT,
29
+ executor TEXT,
30
+ stdout TEXT,
31
+ stderr TEXT,
32
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
33
+ updated_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
34
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
35
+ );
36
+
37
+ CREATE TABLE task_attempt_activities (
38
+ id BLOB PRIMARY KEY,
39
+ task_attempt_id BLOB NOT NULL,
40
+ status TEXT NOT NULL DEFAULT 'init'
41
+ CHECK (status IN ('init','setuprunning','setupcomplete','setupfailed','executorrunning','executorcomplete','executorfailed','paused')), note TEXT,
42
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
43
+ FOREIGN KEY (task_attempt_id) REFERENCES task_attempts(id) ON DELETE CASCADE
44
+ );
@@ -0,0 +1,25 @@
1
+ PRAGMA foreign_keys = ON;
2
+
3
+ CREATE TABLE execution_processes (
4
+ id BLOB PRIMARY KEY,
5
+ task_attempt_id BLOB NOT NULL,
6
+ process_type TEXT NOT NULL DEFAULT 'setupscript'
7
+ CHECK (process_type IN ('setupscript','codingagent','devserver')),
8
+ status TEXT NOT NULL DEFAULT 'running'
9
+ CHECK (status IN ('running','completed','failed','killed')),
10
+ command TEXT NOT NULL,
11
+ args TEXT, -- JSON array of arguments
12
+ working_directory TEXT NOT NULL,
13
+ stdout TEXT,
14
+ stderr TEXT,
15
+ exit_code INTEGER,
16
+ started_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
17
+ completed_at TEXT,
18
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
19
+ updated_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
20
+ FOREIGN KEY (task_attempt_id) REFERENCES task_attempts(id) ON DELETE CASCADE
21
+ );
22
+
23
+ CREATE INDEX idx_execution_processes_task_attempt_id ON execution_processes(task_attempt_id);
24
+ CREATE INDEX idx_execution_processes_status ON execution_processes(status);
25
+ CREATE INDEX idx_execution_processes_type ON execution_processes(process_type);
@@ -0,0 +1,28 @@
1
+ PRAGMA foreign_keys = ON;
2
+
3
+ -- Remove stdout and stderr columns from task_attempts table
4
+ -- These are now tracked in the execution_processes table for better granularity
5
+
6
+ -- SQLite doesn't support DROP COLUMN directly, so we need to recreate the table
7
+ -- First, create a new table without stdout and stderr
8
+ CREATE TABLE task_attempts_new (
9
+ id BLOB PRIMARY KEY,
10
+ task_id BLOB NOT NULL,
11
+ worktree_path TEXT NOT NULL,
12
+ merge_commit TEXT,
13
+ executor TEXT,
14
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
15
+ updated_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
16
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
17
+ );
18
+
19
+ -- Copy data from old table to new table (excluding stdout and stderr)
20
+ INSERT INTO task_attempts_new (id, task_id, worktree_path, merge_commit, executor, created_at, updated_at)
21
+ SELECT id, task_id, worktree_path, merge_commit, executor, created_at, updated_at
22
+ FROM task_attempts;
23
+
24
+ -- Drop the old table
25
+ DROP TABLE task_attempts;
26
+
27
+ -- Rename the new table to the original name
28
+ ALTER TABLE task_attempts_new RENAME TO task_attempts;
@@ -0,0 +1,23 @@
1
+ -- Migration to relate task_attempt_activities to execution_processes instead of task_attempts
2
+ -- This migration will:
3
+ -- 1. Drop and recreate the task_attempt_activities table with execution_process_id
4
+ -- 2. Clear existing data as it cannot be migrated meaningfully
5
+
6
+ -- Drop the existing table (this will wipe existing activity data)
7
+ DROP TABLE IF EXISTS task_attempt_activities;
8
+
9
+ -- Create the new table structure with execution_process_id foreign key
10
+ CREATE TABLE task_attempt_activities (
11
+ id TEXT PRIMARY KEY,
12
+ execution_process_id TEXT NOT NULL REFERENCES execution_processes(id) ON DELETE CASCADE,
13
+ status TEXT NOT NULL,
14
+ note TEXT,
15
+ created_at DATETIME NOT NULL DEFAULT (datetime('now')),
16
+ FOREIGN KEY (execution_process_id) REFERENCES execution_processes(id) ON DELETE CASCADE
17
+ );
18
+
19
+ -- Create index for efficient lookups by execution_process_id
20
+ CREATE INDEX idx_task_attempt_activities_execution_process_id ON task_attempt_activities(execution_process_id);
21
+
22
+ -- Create index for efficient lookups by created_at for ordering
23
+ CREATE INDEX idx_task_attempt_activities_created_at ON task_attempt_activities(created_at);
@@ -0,0 +1,17 @@
1
+ PRAGMA foreign_keys = ON;
2
+
3
+ CREATE TABLE executor_sessions (
4
+ id BLOB PRIMARY KEY,
5
+ task_attempt_id BLOB NOT NULL,
6
+ execution_process_id BLOB NOT NULL,
7
+ session_id TEXT, -- External session ID from Claude/Amp
8
+ prompt TEXT, -- The prompt sent to the executor
9
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
10
+ updated_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
11
+ FOREIGN KEY (task_attempt_id) REFERENCES task_attempts(id) ON DELETE CASCADE,
12
+ FOREIGN KEY (execution_process_id) REFERENCES execution_processes(id) ON DELETE CASCADE
13
+ );
14
+
15
+ CREATE INDEX idx_executor_sessions_task_attempt_id ON executor_sessions(task_attempt_id);
16
+ CREATE INDEX idx_executor_sessions_execution_process_id ON executor_sessions(execution_process_id);
17
+ CREATE INDEX idx_executor_sessions_session_id ON executor_sessions(session_id);
@@ -0,0 +1,4 @@
1
+ PRAGMA foreign_keys = ON;
2
+
3
+ -- Add executor_type column to execution_processes table
4
+ ALTER TABLE execution_processes ADD COLUMN executor_type TEXT;
@@ -0,0 +1,4 @@
1
+ PRAGMA foreign_keys = ON;
2
+
3
+ -- Add dev_script column to projects table
4
+ ALTER TABLE projects ADD COLUMN dev_script TEXT DEFAULT '';
@@ -0,0 +1,2 @@
1
+ -- Add branch column to task_attempts table
2
+ ALTER TABLE task_attempts ADD COLUMN branch TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,5 @@
1
+ -- Add PR tracking fields to task_attempts table
2
+ ALTER TABLE task_attempts ADD COLUMN pr_url TEXT;
3
+ ALTER TABLE task_attempts ADD COLUMN pr_number INTEGER;
4
+ ALTER TABLE task_attempts ADD COLUMN pr_status TEXT; -- open, closed, merged
5
+ ALTER TABLE task_attempts ADD COLUMN pr_merged_at DATETIME;
@@ -0,0 +1,2 @@
1
+ -- Add summary column to executor_sessions table
2
+ ALTER TABLE executor_sessions ADD COLUMN summary TEXT;
@@ -0,0 +1,2 @@
1
+ -- Add base_branch column to task_attempts table with default value
2
+ ALTER TABLE task_attempts ADD COLUMN base_branch TEXT NOT NULL DEFAULT 'main';
@@ -0,0 +1,2 @@
1
+ -- Add worktree_deleted flag to track when worktrees are cleaned up
2
+ ALTER TABLE task_attempts ADD COLUMN worktree_deleted BOOLEAN NOT NULL DEFAULT FALSE;
@@ -0,0 +1,3 @@
1
+ -- Add setup completion tracking to task_attempts table
2
+ -- This enables automatic setup script execution for recreated worktrees
3
+ ALTER TABLE task_attempts ADD COLUMN setup_completed_at DATETIME;
@@ -0,0 +1,25 @@
1
+ -- Add task templates tables
2
+ CREATE TABLE task_templates (
3
+ id BLOB PRIMARY KEY,
4
+ project_id BLOB, -- NULL for global templates
5
+ title TEXT NOT NULL,
6
+ description TEXT,
7
+ template_name TEXT NOT NULL, -- Display name for the template
8
+ created_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
9
+ updated_at TEXT NOT NULL DEFAULT (datetime('now', 'subsec')),
10
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
11
+ );
12
+
13
+ -- Add index for faster queries
14
+ CREATE INDEX idx_task_templates_project_id ON task_templates(project_id);
15
+
16
+ -- Add unique constraints to prevent duplicate template names within same scope
17
+ -- For project-specific templates: unique within each project
18
+ CREATE UNIQUE INDEX idx_task_templates_unique_name_project
19
+ ON task_templates(project_id, template_name)
20
+ WHERE project_id IS NOT NULL;
21
+
22
+ -- For global templates: unique across all global templates
23
+ CREATE UNIQUE INDEX idx_task_templates_unique_name_global
24
+ ON task_templates(template_name)
25
+ WHERE project_id IS NULL;
@@ -0,0 +1,174 @@
1
+ -- Add default global templates
2
+
3
+ -- 1. Bug Analysis template
4
+ INSERT INTO task_templates (
5
+ id,
6
+ project_id,
7
+ title,
8
+ description,
9
+ template_name,
10
+ created_at,
11
+ updated_at
12
+ ) VALUES (
13
+ randomblob(16),
14
+ NULL, -- Global template
15
+ 'Analyze codebase for potential bugs and issues',
16
+ 'Perform a comprehensive analysis of the project codebase to identify potential bugs, code smells, and areas of improvement.
17
+
18
+ ## Analysis Checklist:
19
+
20
+ ### 1. Static Code Analysis
21
+ - [ ] Run linting tools to identify syntax and style issues
22
+ - [ ] Check for unused variables, imports, and dead code
23
+ - [ ] Identify potential type errors or mismatches
24
+ - [ ] Look for deprecated API usage
25
+
26
+ ### 2. Common Bug Patterns
27
+ - [ ] Check for null/undefined reference errors
28
+ - [ ] Identify potential race conditions
29
+ - [ ] Look for improper error handling
30
+ - [ ] Check for resource leaks (memory, file handles, connections)
31
+ - [ ] Identify potential security vulnerabilities (XSS, SQL injection, etc.)
32
+
33
+ ### 3. Code Quality Issues
34
+ - [ ] Identify overly complex functions (high cyclomatic complexity)
35
+ - [ ] Look for code duplication
36
+ - [ ] Check for missing or inadequate input validation
37
+ - [ ] Identify hardcoded values that should be configurable
38
+
39
+ ### 4. Testing Gaps
40
+ - [ ] Identify untested code paths
41
+ - [ ] Check for missing edge case tests
42
+ - [ ] Look for inadequate error scenario testing
43
+
44
+ ### 5. Performance Concerns
45
+ - [ ] Identify potential performance bottlenecks
46
+ - [ ] Check for inefficient algorithms or data structures
47
+ - [ ] Look for unnecessary database queries or API calls
48
+
49
+ ## Deliverables:
50
+ 1. Prioritized list of identified issues
51
+ 2. Recommendations for fixes
52
+ 3. Estimated effort for addressing each issue',
53
+ 'Bug Analysis',
54
+ datetime('now', 'subsec'),
55
+ datetime('now', 'subsec')
56
+ );
57
+
58
+ -- 2. Unit Test template
59
+ INSERT INTO task_templates (
60
+ id,
61
+ project_id,
62
+ title,
63
+ description,
64
+ template_name,
65
+ created_at,
66
+ updated_at
67
+ ) VALUES (
68
+ randomblob(16),
69
+ NULL, -- Global template
70
+ 'Add unit tests for [component/function]',
71
+ 'Write unit tests to improve code coverage and ensure reliability.
72
+
73
+ ## Unit Testing Checklist
74
+
75
+ ### 1. Identify What to Test
76
+ - [ ] Run coverage report to find untested functions
77
+ - [ ] List the specific functions/methods to test
78
+ - [ ] Note current coverage percentage
79
+
80
+ ### 2. Write Tests
81
+ - [ ] Test the happy path (expected behavior)
82
+ - [ ] Test edge cases (empty inputs, boundaries)
83
+ - [ ] Test error cases (invalid inputs, exceptions)
84
+ - [ ] Mock external dependencies
85
+ - [ ] Use descriptive test names
86
+
87
+ ### 3. Test Quality
88
+ - [ ] Each test focuses on one behavior
89
+ - [ ] Tests can run independently
90
+ - [ ] No hardcoded values that might change
91
+ - [ ] Clear assertions that verify the behavior
92
+
93
+ ## Examples to Cover:
94
+ - Normal inputs → Expected outputs
95
+ - Empty/null inputs → Proper handling
96
+ - Invalid inputs → Error cases
97
+ - Boundary values → Edge case behavior
98
+
99
+ ## Goal
100
+ Achieve at least 80% coverage for the target component
101
+
102
+ ## Deliverables
103
+ 1. New test file(s) with comprehensive unit tests
104
+ 2. Updated coverage report
105
+ 3. All tests passing',
106
+ 'Add Unit Tests',
107
+ datetime('now', 'subsec'),
108
+ datetime('now', 'subsec')
109
+ );
110
+
111
+ -- 3. Code Refactoring template
112
+ INSERT INTO task_templates (
113
+ id,
114
+ project_id,
115
+ title,
116
+ description,
117
+ template_name,
118
+ created_at,
119
+ updated_at
120
+ ) VALUES (
121
+ randomblob(16),
122
+ NULL, -- Global template
123
+ 'Refactor [component/module] for better maintainability',
124
+ 'Improve code structure and maintainability without changing functionality.
125
+
126
+ ## Refactoring Checklist
127
+
128
+ ### 1. Identify Refactoring Targets
129
+ - [ ] Run code analysis tools (linters, complexity analyzers)
130
+ - [ ] Identify code smells (long methods, duplicate code, large classes)
131
+ - [ ] Check for outdated patterns or deprecated approaches
132
+ - [ ] Review areas with frequent bugs or changes
133
+
134
+ ### 2. Plan the Refactoring
135
+ - [ ] Define clear goals (what to improve and why)
136
+ - [ ] Ensure tests exist for current functionality
137
+ - [ ] Create a backup branch
138
+ - [ ] Break down into small, safe steps
139
+
140
+ ### 3. Common Refactoring Actions
141
+ - [ ] Extract methods from long functions
142
+ - [ ] Remove duplicate code (DRY principle)
143
+ - [ ] Rename variables/functions for clarity
144
+ - [ ] Simplify complex conditionals
145
+ - [ ] Extract constants from magic numbers/strings
146
+ - [ ] Group related functionality into modules
147
+ - [ ] Remove dead code
148
+
149
+ ### 4. Maintain Functionality
150
+ - [ ] Run tests after each change
151
+ - [ ] Keep changes small and incremental
152
+ - [ ] Commit frequently with clear messages
153
+ - [ ] Verify no behavior has changed
154
+
155
+ ### 5. Code Quality Improvements
156
+ - [ ] Apply consistent formatting
157
+ - [ ] Update to modern syntax/features
158
+ - [ ] Improve error handling
159
+ - [ ] Add type annotations (if applicable)
160
+
161
+ ## Success Criteria
162
+ - All tests still pass
163
+ - Code is more readable and maintainable
164
+ - No new bugs introduced
165
+ - Performance not degraded
166
+
167
+ ## Deliverables
168
+ 1. Refactored code with improved structure
169
+ 2. All tests passing
170
+ 3. Brief summary of changes made',
171
+ 'Code Refactoring',
172
+ datetime('now', 'subsec'),
173
+ datetime('now', 'subsec')
174
+ );