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
package/.env.example ADDED
@@ -0,0 +1,20 @@
1
+ # Vibe Kanban Environment Variables
2
+ # Copy this file to .env and customize as needed
3
+
4
+ # Build-time variables (used during 'pnpm run build')
5
+ #GITHUB_CLIENT_ID=
6
+ #POSTHOG_API_KEY=
7
+ #POSTHOG_API_ENDPOINT=
8
+
9
+ # Runtime variables (used when application starts)
10
+ BACKEND_PORT=8887
11
+ FRONTEND_PORT=3333
12
+ HOST=127.0.0.1
13
+ DISABLE_WORKTREE_ORPHAN_CLEANUP=
14
+
15
+ # MCP SSE Server Configuration
16
+ MCP_SSE_PORT=8889
17
+ MCP_SSE_REQUIRED=true
18
+
19
+ # Log Level Configuration
20
+ RUST_LOG=info
@@ -0,0 +1,29 @@
1
+ name: 'Setup Node.js and pnpm'
2
+ description: 'Sets up Node.js and pnpm with caching'
3
+
4
+ runs:
5
+ using: 'composite'
6
+ steps:
7
+ - name: Setup Node.js
8
+ uses: actions/setup-node@v4
9
+ with:
10
+ node-version: ${{ env.NODE_VERSION }}
11
+ registry-url: 'https://registry.npmjs.org'
12
+
13
+ - name: Setup pnpm
14
+ uses: pnpm/action-setup@v4
15
+ with:
16
+ version: ${{ env.PNPM_VERSION }}
17
+
18
+ - name: Get pnpm store directory
19
+ shell: bash
20
+ run: |
21
+ echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
22
+
23
+ - name: Setup pnpm cache
24
+ uses: actions/cache@v4
25
+ with:
26
+ path: ${{ env.STORE_PATH }}
27
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
28
+ restore-keys: |
29
+ ${{ runner.os }}-pnpm-store-
@@ -0,0 +1,470 @@
1
+ name: Create GitHub Pre-Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version_type:
7
+ description: "Version bump type"
8
+ required: true
9
+ default: "patch"
10
+ type: choice
11
+ options:
12
+ - patch
13
+ - minor
14
+ - major
15
+ - prerelease
16
+
17
+ concurrency:
18
+ group: release-${{ github.ref_name }} # allow concurrent prerelease from different branches
19
+ cancel-in-progress: true
20
+
21
+ permissions:
22
+ contents: write
23
+ packages: write
24
+ pull-requests: write
25
+
26
+ env:
27
+ NODE_VERSION: 22
28
+ PNPM_VERSION: 10.8.1
29
+ RUST_TOOLCHAIN: nightly-2025-05-18
30
+
31
+ jobs:
32
+ bump-version:
33
+ runs-on: ubuntu-22.04
34
+ outputs:
35
+ new_tag: ${{ steps.version.outputs.new_tag }}
36
+ new_version: ${{ steps.version.outputs.new_version }}
37
+ branch_suffix: ${{ steps.branch.outputs.suffix }}
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+ with:
41
+ token: ${{ secrets.GITHUB_TOKEN }}
42
+ ssh-key: ${{ secrets.DEPLOY_KEY }}
43
+
44
+ - name: Setup Node
45
+ uses: ./.github/actions/setup-node
46
+
47
+ - name: Cache cargo-edit
48
+ uses: actions/cache@v3
49
+ id: cache-cargo-edit
50
+ with:
51
+ path: ~/.cargo/bin/cargo-set-version
52
+ key: cargo-edit-${{ runner.os }}-${{ env.RUST_TOOLCHAIN }}
53
+
54
+ - name: Install cargo-edit
55
+ if: steps.cache-cargo-edit.outputs.cache-hit != 'true'
56
+ run: cargo install cargo-edit
57
+
58
+ - name: Generate branch suffix
59
+ id: branch
60
+ run: |
61
+ branch_name="${{ github.ref_name }}"
62
+ # Get last 6 characters of branch name, remove all special chars (including dashes)
63
+ suffix=$(echo "$branch_name" | tail -c 7 | sed 's/[^a-zA-Z0-9]//g' | tr '[:upper:]' '[:lower:]')
64
+ echo "Branch: $branch_name"
65
+ echo "Suffix: $suffix"
66
+ echo "suffix=$suffix" >> $GITHUB_OUTPUT
67
+
68
+ - name: Determine and update versions
69
+ id: version
70
+ run: |
71
+ # Get the latest version from npm registry
72
+ latest_npm_version=$(npm view vibe-kanban version 2>/dev/null || echo "0.0.0")
73
+ echo "Latest npm version: $latest_npm_version"
74
+
75
+ timestamp=$(date +%Y%m%d%H%M%S)
76
+
77
+ # Update root package.json based on npm version, not current package.json
78
+ if [[ "${{ github.event.inputs.version_type }}" == "prerelease" ]]; then
79
+ # For prerelease, use current package.json version and add branch suffix
80
+ npm version prerelease --preid="${{ steps.branch.outputs.suffix }}" --no-git-tag-version
81
+
82
+ new_version=$(node -p "require('./package.json').version")
83
+ new_tag="v${new_version}.${timestamp}"
84
+ else
85
+ # For regular releases, use npm version and bump it
86
+ npm version $latest_npm_version --no-git-tag-version --allow-same-version
87
+ npm version ${{ github.event.inputs.version_type }} --no-git-tag-version
88
+
89
+ new_version=$(node -p "require('./package.json').version")
90
+ new_tag="v${new_version}-${timestamp}"
91
+ fi
92
+
93
+ # Update npx-cli package.json to match
94
+ cd npx-cli
95
+ npm version $new_version --no-git-tag-version --allow-same-version
96
+ cd ..
97
+
98
+ cd backend && cargo set-version "$new_version"
99
+
100
+ echo "New version: $new_version"
101
+ echo "new_version=$new_version" >> $GITHUB_OUTPUT
102
+ echo "new_tag=$new_tag" >> $GITHUB_OUTPUT
103
+
104
+ - name: Commit changes and create tag
105
+ run: |
106
+ git config --local user.email "action@github.com"
107
+ git config --local user.name "GitHub Action"
108
+ git add package.json package-lock.json npx-cli/package.json backend/Cargo.toml
109
+ git commit -m "chore: bump version to ${{ steps.version.outputs.new_version }}"
110
+ git tag -a ${{ steps.version.outputs.new_tag }} -m "Release ${{ steps.version.outputs.new_tag }}"
111
+ git push
112
+ git push --tags
113
+
114
+ build-frontend:
115
+ needs: bump-version
116
+ runs-on: ubuntu-22.04
117
+ steps:
118
+ - uses: actions/checkout@v4
119
+ with:
120
+ ref: ${{ needs.bump-version.outputs.new_tag }}
121
+
122
+ - name: Setup Node
123
+ uses: ./.github/actions/setup-node
124
+
125
+ - name: Install dependencies
126
+ run: pnpm install
127
+
128
+ - name: Lint frontend
129
+ run: cd frontend && npm run lint
130
+
131
+ - name: Type check frontend
132
+ run: cd frontend && npx tsc --noEmit
133
+
134
+ - name: Build frontend
135
+ run: cd frontend && npm run build
136
+ env:
137
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
138
+
139
+ - name: Create Sentry release
140
+ uses: getsentry/action-release@v3
141
+ env:
142
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
143
+ SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
144
+ SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
145
+ with:
146
+ release: ${{ needs.bump-version.outputs.new_version }}
147
+ environment: production
148
+ sourcemaps: "./frontend/dist"
149
+ ignore_missing: true
150
+
151
+ - name: Upload frontend artifact
152
+ uses: actions/upload-artifact@v4
153
+ with:
154
+ name: frontend-dist
155
+ path: frontend/dist/
156
+ retention-days: 1
157
+
158
+ build-backend:
159
+ needs: [bump-version, build-frontend]
160
+ runs-on: ${{ matrix.os }}
161
+ strategy:
162
+ # Platform matrix - keep target/name in sync with package-npx-cli job
163
+ matrix:
164
+ include:
165
+ - target: x86_64-unknown-linux-gnu
166
+ os: ubuntu-22.04
167
+ name: linux-x64
168
+ - target: x86_64-pc-windows-msvc
169
+ os: windows-latest-l
170
+ name: windows-x64
171
+ - target: x86_64-apple-darwin
172
+ os: macos-13
173
+ name: macos-x64
174
+ - target: aarch64-apple-darwin
175
+ os: macos-14
176
+ name: macos-arm64
177
+ - target: aarch64-pc-windows-msvc
178
+ os: windows-latest-l
179
+ name: windows-arm64
180
+ - target: aarch64-unknown-linux-gnu
181
+ os: ubuntu-22.04
182
+ name: linux-arm64
183
+ steps:
184
+ - uses: actions/checkout@v4
185
+ with:
186
+ ref: ${{ needs.bump-version.outputs.new_tag }}
187
+
188
+ - name: Install Rust toolchain
189
+ uses: dtolnay/rust-toolchain@stable
190
+ with:
191
+ toolchain: ${{ env.RUST_TOOLCHAIN }}
192
+ targets: ${{ matrix.target }}
193
+ components: rustfmt, clippy
194
+
195
+ - name: Cache Rust dependencies
196
+ uses: Swatinem/rust-cache@v2
197
+ with:
198
+ workspaces: "."
199
+ prefix-key: "cache-v1.0"
200
+ key: ${{ matrix.target }}_${{ matrix.os }}
201
+ cache-on-failure: true
202
+ shared-key: "shared"
203
+ cache-all-crates: true
204
+
205
+ - name: Download frontend artifact
206
+ uses: actions/download-artifact@v4
207
+ with:
208
+ name: frontend-dist
209
+ path: frontend/dist/
210
+
211
+ - name: Install system dependencies (Linux)
212
+ if: matrix.os == 'ubuntu-22.04'
213
+ run: |
214
+ sudo apt-get update
215
+ sudo apt-get install -y pkg-config libssl-dev
216
+
217
+ - name: Install ARM64 cross-compilation dependencies (Linux)
218
+ if: matrix.os == 'ubuntu-22.04' && matrix.target == 'aarch64-unknown-linux-gnu'
219
+ run: |
220
+ sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-dev-arm64-cross
221
+
222
+ - name: Build backend for target
223
+ run: |
224
+ cargo build --release --target ${{ matrix.target }} -p vibe-kanban
225
+ cargo build --release --target ${{ matrix.target }} --bin mcp_task_server
226
+ env:
227
+ CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: ${{ matrix.target == 'aarch64-unknown-linux-gnu' && 'aarch64-linux-gnu-gcc' || '' }}
228
+ POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
229
+ POSTHOG_API_ENDPOINT: ${{ secrets.POSTHOG_API_ENDPOINT }}
230
+
231
+ - name: Setup Sentry CLI
232
+ uses: matbour/setup-sentry-cli@v2
233
+ with:
234
+ token: ${{ secrets.SENTRY_AUTH_TOKEN }}
235
+ organization: ${{ secrets.SENTRY_ORG }}
236
+ project: ${{ secrets.SENTRY_PROJECT }}
237
+ version: 2.21.2
238
+
239
+ - name: Upload source maps to Sentry
240
+ run: sentry-cli debug-files upload --include-sources target/${{ matrix.target }}/release
241
+
242
+ - name: Prepare binaries (non-macOS)
243
+ if: runner.os != 'macOS'
244
+ shell: bash
245
+ run: |
246
+ mkdir -p dist
247
+ if [[ "${{ matrix.os }}" == "windows-latest-l" ]]; then
248
+ cp target/${{ matrix.target }}/release/vibe-kanban.exe dist/vibe-kanban-${{ matrix.name }}.exe
249
+ cp target/${{ matrix.target }}/release/mcp_task_server.exe dist/vibe-kanban-mcp-${{ matrix.name }}.exe
250
+ else
251
+ cp target/${{ matrix.target }}/release/vibe-kanban dist/vibe-kanban-${{ matrix.name }}
252
+ cp target/${{ matrix.target }}/release/mcp_task_server dist/vibe-kanban-mcp-${{ matrix.name }}
253
+ fi
254
+
255
+ # Code signing for macOS only
256
+ - name: Prepare Apple certificate (macOS)
257
+ if: runner.os == 'macOS'
258
+ run: |
259
+ echo "${{ secrets.APPLE_CERTIFICATE_P12_BASE64 }}" | base64 --decode > certificate.p12
260
+
261
+ - name: Write API Key to file
262
+ if: runner.os == 'macOS'
263
+ env:
264
+ API_KEY: ${{ secrets.APP_STORE_API_KEY }}
265
+ run: echo $API_KEY > app_store_key.json
266
+
267
+ - name: Sign main binary (macOS)
268
+ if: runner.os == 'macOS'
269
+ uses: indygreg/apple-code-sign-action@v1
270
+ with:
271
+ input_path: target/${{ matrix.target }}/release/vibe-kanban
272
+ output_path: vibe-kanban
273
+ p12_file: certificate.p12
274
+ p12_password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
275
+ sign: true
276
+ sign_args: "--code-signature-flags=runtime"
277
+
278
+ - name: Package main binary (macOS)
279
+ if: runner.os == 'macOS'
280
+ run: zip vibe-kanban.zip vibe-kanban
281
+
282
+ - name: Notarize signed binary (macOS)
283
+ if: runner.os == 'macOS'
284
+ uses: indygreg/apple-code-sign-action@v1
285
+ continue-on-error: true
286
+ with:
287
+ input_path: vibe-kanban.zip
288
+ sign: false
289
+ notarize: true
290
+ app_store_connect_api_key_json_file: app_store_key.json
291
+
292
+ - name: Sign MCP binary (macOS)
293
+ if: runner.os == 'macOS'
294
+ uses: indygreg/apple-code-sign-action@v1
295
+ with:
296
+ input_path: target/${{ matrix.target }}/release/mcp_task_server
297
+ output_path: vibe-kanban-mcp
298
+ p12_file: certificate.p12
299
+ p12_password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
300
+ sign: true
301
+ sign_args: "--code-signature-flags=runtime"
302
+
303
+ - name: Package MCP binary (macOS)
304
+ if: runner.os == 'macOS'
305
+ run: zip vibe-kanban-mcp.zip vibe-kanban-mcp
306
+
307
+ - name: Notarize signed MCP binary (macOS)
308
+ if: runner.os == 'macOS'
309
+ uses: indygreg/apple-code-sign-action@v1
310
+ continue-on-error: true
311
+ with:
312
+ input_path: vibe-kanban-mcp.zip
313
+ sign: false
314
+ notarize: true
315
+ app_store_connect_api_key_json_file: app_store_key.json
316
+
317
+ - name: Prepare signed binaries (macOS)
318
+ if: runner.os == 'macOS'
319
+ run: |
320
+ mkdir -p dist
321
+ cp vibe-kanban.zip dist/vibe-kanban-${{ matrix.name }}.zip
322
+ cp vibe-kanban-mcp.zip dist/vibe-kanban-mcp-${{ matrix.name }}.zip
323
+
324
+ - name: Clean up certificates (macOS)
325
+ if: runner.os == 'macOS'
326
+ run: |
327
+ rm -f certificate.p12
328
+ rm -rf private_keys/
329
+
330
+ - name: Upload binary artifact
331
+ uses: actions/upload-artifact@v4
332
+ with:
333
+ name: backend-binary-${{ matrix.name }}
334
+ path: dist/
335
+ retention-days: 1
336
+
337
+ package-npx-cli:
338
+ needs: [bump-version, build-frontend, build-backend]
339
+ runs-on: ubuntu-22.04
340
+ strategy:
341
+ # NOTE: This matrix must be kept in sync with build-backend job above
342
+ # GitHub Actions doesn't support YAML anchors, so duplication is unavoidable
343
+ matrix:
344
+ include:
345
+ - target: x86_64-unknown-linux-gnu
346
+ name: linux-x64
347
+ binary: vibe-kanban
348
+ mcp_binary: vibe-kanban-mcp
349
+ - target: x86_64-pc-windows-msvc
350
+ name: windows-x64
351
+ binary: vibe-kanban.exe
352
+ mcp_binary: vibe-kanban-mcp.exe
353
+ - target: x86_64-apple-darwin
354
+ name: macos-x64
355
+ binary: vibe-kanban
356
+ mcp_binary: vibe-kanban-mcp
357
+ - target: aarch64-apple-darwin
358
+ name: macos-arm64
359
+ binary: vibe-kanban
360
+ mcp_binary: vibe-kanban-mcp
361
+ - target: aarch64-pc-windows-msvc
362
+ name: windows-arm64
363
+ binary: vibe-kanban.exe
364
+ mcp_binary: vibe-kanban-mcp.exe
365
+ - target: aarch64-unknown-linux-gnu
366
+ name: linux-arm64
367
+ binary: vibe-kanban
368
+ mcp_binary: vibe-kanban-mcp
369
+ steps:
370
+ - uses: actions/checkout@v4
371
+ with:
372
+ ref: ${{ needs.bump-version.outputs.new_tag }}
373
+
374
+ - name: Download frontend artifact
375
+ uses: actions/download-artifact@v4
376
+ with:
377
+ name: frontend-dist
378
+ path: frontend/dist/
379
+
380
+ - name: Download backend binary artifact
381
+ uses: actions/download-artifact@v4
382
+ with:
383
+ name: backend-binary-${{ matrix.name }}
384
+ path: dist/
385
+
386
+ - name: List downloaded artifacts
387
+ run: |
388
+ echo "Downloaded backend binaries:"
389
+ find dist/
390
+
391
+ - name: Create platform package
392
+ if: matrix.name != 'macos-arm64' && matrix.name != 'macos-x64'
393
+ run: |
394
+ mkdir -p npx-cli/dist/${{ matrix.name }}
395
+ mkdir vibe-kanban-${{ matrix.name }}
396
+ mkdir vibe-kanban-mcp-${{ matrix.name }}
397
+
398
+ cp dist/vibe-kanban-${{ matrix.name }}* vibe-kanban-${{ matrix.name }}/${{ matrix.binary }}
399
+ cp dist/vibe-kanban-mcp-${{ matrix.name }}* vibe-kanban-mcp-${{ matrix.name }}/${{ matrix.mcp_binary }}
400
+
401
+ zip -j npx-cli/dist/${{ matrix.name }}/vibe-kanban.zip vibe-kanban-${{ matrix.name }}/${{ matrix.binary }}
402
+ zip -j npx-cli/dist/${{ matrix.name }}/vibe-kanban-mcp.zip vibe-kanban-mcp-${{ matrix.name }}/${{ matrix.mcp_binary }}
403
+
404
+ - name: Create platform package (macOS)
405
+ if: matrix.name == 'macos-arm64' || matrix.name == 'macos-x64'
406
+ run: |
407
+ mkdir -p npx-cli/dist/${{ matrix.name }}
408
+ mkdir vibe-kanban-${{ matrix.name }}
409
+ cp dist/vibe-kanban-${{ matrix.name }}* npx-cli/dist/${{ matrix.name }}/vibe-kanban.zip
410
+ cp dist/vibe-kanban-mcp-${{ matrix.name }}* npx-cli/dist/${{ matrix.name }}/vibe-kanban-mcp.zip
411
+
412
+ - name: Upload platform package artifact
413
+ uses: actions/upload-artifact@v4
414
+ with:
415
+ name: npx-platform-${{ matrix.name }}
416
+ path: npx-cli/dist/
417
+ retention-days: 1
418
+
419
+ create-prerelease:
420
+ needs: [bump-version, build-frontend, build-backend, package-npx-cli]
421
+ runs-on: ubuntu-22.04
422
+ steps:
423
+ - uses: actions/checkout@v4
424
+ with:
425
+ ref: ${{ needs.bump-version.outputs.new_tag }}
426
+
427
+ - name: Download frontend artifact
428
+ uses: actions/download-artifact@v4
429
+ with:
430
+ name: frontend-dist
431
+ path: frontend/dist/
432
+
433
+ - name: Download backend npx-cli zips
434
+ uses: actions/download-artifact@v4
435
+ with:
436
+ pattern: npx-platform-*
437
+ path: npx-cli/dist/
438
+ merge-multiple: true
439
+
440
+ - name: List downloaded artifacts
441
+ run: |
442
+ echo "Backend dist:"
443
+ find npx-cli/dist
444
+ echo "Frontend dist:"
445
+ find frontend/dist
446
+
447
+ - name: Zip frontend
448
+ run: |
449
+ mkdir vibe-kanban-${{ needs.bump-version.outputs.new_tag }}
450
+ mv frontend/dist vibe-kanban-${{ needs.bump-version.outputs.new_tag }}
451
+ zip -r vibe-kanban-${{ needs.bump-version.outputs.new_tag }}.zip vibe-kanban-${{ needs.bump-version.outputs.new_tag }}
452
+
453
+ - name: Setup Node for npm pack
454
+ uses: ./.github/actions/setup-node
455
+
456
+ - name: Pack
457
+ run: |
458
+ cd npx-cli
459
+ npm pack
460
+
461
+ - name: Create GitHub Pre-Release
462
+ uses: softprops/action-gh-release@v2
463
+ with:
464
+ tag_name: ${{ needs.bump-version.outputs.new_tag }}
465
+ name: Pre-release ${{ needs.bump-version.outputs.new_tag }}
466
+ prerelease: true
467
+ generate_release_notes: true
468
+ files: |
469
+ vibe-kanban-${{ needs.bump-version.outputs.new_tag }}.zip
470
+ npx-cli/vibe-kanban-*.tgz
@@ -0,0 +1,145 @@
1
+ name: Publish to npm
2
+
3
+ on:
4
+ release:
5
+ types: [released]
6
+ workflow_dispatch:
7
+ inputs:
8
+ tag_name:
9
+ description: "Release tag (e.g., v1.2.3)"
10
+ required: true
11
+ release_id:
12
+ description: "GitHub release ID"
13
+ required: true
14
+
15
+ concurrency:
16
+ group: publish
17
+ cancel-in-progress: true
18
+
19
+ permissions:
20
+ contents: write
21
+ packages: write
22
+
23
+ env:
24
+ NODE_VERSION: 22
25
+ PNPM_VERSION: 10.8.1
26
+
27
+ jobs:
28
+ publish:
29
+ runs-on: ubuntu-latest
30
+ # Only run if this was converted from a pre-release
31
+ if: github.event.release.prerelease == false
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ with:
35
+ ref: ${{ github.event.release.tag_name || inputs.tag_name }}
36
+
37
+ - name: Setup Node
38
+ uses: ./.github/actions/setup-node
39
+
40
+ - name: Configure npm authentication
41
+ run: |
42
+ echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc
43
+
44
+ - name: Download release assets
45
+ uses: actions/github-script@v7
46
+ env:
47
+ RELEASE_ID: ${{ inputs.release_id }}
48
+ with:
49
+ script: |
50
+ const fs = require('fs');
51
+ const path = require('path');
52
+
53
+ const releaseId = context.payload.release?.id || process.env.RELEASE_ID;
54
+ console.log("releaseId:", releaseId);
55
+
56
+ if (!releaseId) {
57
+ core.setFailed('No release ID found.');
58
+ return;
59
+ }
60
+
61
+ const release = await github.rest.repos.getRelease({
62
+ owner: context.repo.owner,
63
+ repo: context.repo.repo,
64
+ release_id: releaseId
65
+ });
66
+
67
+ // Find the .tgz file
68
+ const tgzAsset = release.data.assets.find(asset => asset.name.endsWith('.tgz'));
69
+
70
+ if (!tgzAsset) {
71
+ core.setFailed('No .tgz file found in release assets');
72
+ return;
73
+ }
74
+
75
+ // Download the asset
76
+ const response = await github.rest.repos.getReleaseAsset({
77
+ owner: context.repo.owner,
78
+ repo: context.repo.repo,
79
+ asset_id: tgzAsset.id,
80
+ headers: {
81
+ Accept: 'application/octet-stream'
82
+ }
83
+ });
84
+
85
+ // Save to npx-cli directory
86
+ const filePath = path.join('npx-cli', tgzAsset.name);
87
+ fs.writeFileSync(filePath, Buffer.from(response.data));
88
+
89
+ console.log(`Downloaded ${tgzAsset.name} to ${filePath}`);
90
+
91
+ // Set output for next step
92
+ core.setOutput('package-file', filePath);
93
+ core.setOutput('package-name', tgzAsset.name);
94
+
95
+ - name: Verify package integrity
96
+ id: verify
97
+ run: |
98
+ cd npx-cli
99
+
100
+ # List files to confirm download
101
+ ls -la *.tgz
102
+
103
+ # Verify the package can be read
104
+ npm pack --dry-run || echo "Note: This is expected to show differences since we're using the pre-built package"
105
+
106
+ # Extract package name from the downloaded file
107
+ PACKAGE_FILE=$(ls *.tgz | head -n1)
108
+ echo "package-file=$PACKAGE_FILE" >> $GITHUB_OUTPUT
109
+
110
+ - name: Publish to npm
111
+ run: |
112
+ cd npx-cli
113
+
114
+ # Publish the exact same package that was tested
115
+ PACKAGE_FILE="${{ steps.verify.outputs.package-file }}"
116
+
117
+ echo "Publishing $PACKAGE_FILE to npm..."
118
+ npm publish "$PACKAGE_FILE"
119
+
120
+ echo "✅ Successfully published to npm!"
121
+ env:
122
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
123
+
124
+ - name: Update release description
125
+ uses: actions/github-script@v7
126
+ env:
127
+ RELEASE_ID: ${{ inputs.release_id }}
128
+ with:
129
+ script: |
130
+ const releaseId = context.payload.release?.id || process.env.RELEASE_ID;;
131
+
132
+ // Fetch the release to get the current body
133
+ const release = await github.rest.repos.getRelease({
134
+ owner: context.repo.owner,
135
+ repo: context.repo.repo,
136
+ release_id: releaseId
137
+ });
138
+
139
+ const currentBody = release.data.body || '';
140
+ await github.rest.repos.updateRelease({
141
+ owner: context.repo.owner,
142
+ repo: context.repo.repo,
143
+ release_id: releaseId,
144
+ body: currentBody + '\n\n✅ **Published to npm registry**'
145
+ });