testeranto 0.200.0 → 0.202.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 (376) hide show
  1. package/README.md +26 -1
  2. package/bundle.js +3 -2
  3. package/design-editor/DesignEditor.tsx +40 -241
  4. package/dist/common/design-editor/DesignEditor.js +33 -198
  5. package/dist/common/src/App.js +158 -16
  6. package/dist/common/src/PM/PM_WithBuild.js +135 -0
  7. package/dist/common/src/PM/PM_WithEslintAndTsc.js +79 -67
  8. package/dist/common/src/PM/PM_WithGit.js +517 -0
  9. package/dist/common/src/PM/PM_WithProcesses.js +519 -0
  10. package/dist/common/src/PM/PM_WithWebSocket.js +535 -0
  11. package/dist/common/src/PM/base.js +62 -0
  12. package/dist/common/src/PM/main.js +533 -1676
  13. package/dist/common/src/PM/metafileOutputs.js +78 -0
  14. package/dist/common/src/PM/node.js +0 -6
  15. package/dist/common/src/PM/pure.js +0 -8
  16. package/dist/common/src/PM/types.js +1 -0
  17. package/dist/common/src/PM/utils.js +210 -0
  18. package/dist/common/src/PM/web.js +0 -6
  19. package/dist/common/src/ReportServer.js +0 -10
  20. package/dist/common/src/ReportServerLib.js +0 -140
  21. package/dist/common/src/components/pure/AppFrame.js +68 -56
  22. package/dist/common/src/components/pure/ArtifactTree.js +80 -0
  23. package/dist/common/src/components/pure/BuildLogViewer.js +106 -0
  24. package/dist/common/src/components/pure/DebugEnv.js +30 -0
  25. package/dist/common/src/components/pure/FileTree.js +34 -0
  26. package/dist/common/src/components/pure/FileTreeItem.js +29 -0
  27. package/dist/common/src/components/pure/GitHubLoginButton.js +18 -0
  28. package/dist/common/src/components/pure/GitIntegrationView.js +342 -0
  29. package/dist/common/src/components/pure/ProcessManager.js +1 -0
  30. package/dist/common/src/components/pure/ProcessManagerView.js +73 -74
  31. package/dist/common/src/components/pure/ProjectPageView.js +4 -117
  32. package/dist/common/src/components/pure/Settings.js +121 -0
  33. package/dist/common/src/components/pure/Settings.test.js +34 -0
  34. package/dist/common/src/components/pure/SignIn.js +22 -0
  35. package/dist/common/src/components/pure/SingleProcessView.js +166 -213
  36. package/dist/common/src/components/pure/TestPageView.js +113 -368
  37. package/dist/common/src/components/pure/TestPageView_utils.js +117 -0
  38. package/dist/common/src/components/pure/TestTable.js +33 -0
  39. package/dist/common/src/components/pure/ToastNotification.js +14 -0
  40. package/dist/common/src/components/pure/UserProfile.js +27 -0
  41. package/dist/common/src/components/stateful/AuthCallbackPage.js +51 -0
  42. package/dist/common/src/components/stateful/FeaturesReporter.js +2 -1
  43. package/dist/common/src/components/stateful/FileTree.js +58 -39
  44. package/dist/common/src/components/stateful/GitIntegrationPage.js +12 -0
  45. package/dist/common/src/components/stateful/ProcessManagerPage.js +13 -15
  46. package/dist/common/src/components/stateful/ProjectPage.js +6 -5
  47. package/dist/common/src/components/stateful/ProjectsPage.js +17 -19
  48. package/dist/common/src/components/stateful/SingleProcessPage.js +16 -26
  49. package/dist/common/src/components/stateful/TestPage.js +7 -5
  50. package/dist/common/src/hooks/useGitMode.js +21 -0
  51. package/dist/common/src/lib/BaseSuite.test/mock.js +15 -8
  52. package/dist/common/src/lib/BaseSuite.test/test.js +56 -80
  53. package/dist/common/src/lib/Tiposkripto.js +24 -0
  54. package/dist/common/src/lib/Tiposkripto.test/MockTiposkripto.js +154 -10
  55. package/dist/common/src/lib/Tiposkripto.test/Tiposkripto.adapter.js +6 -12
  56. package/dist/common/src/lib/Tiposkripto.test/Tiposkripto.implementation.js +63 -23
  57. package/dist/common/src/lib/Tiposkripto.test/Tiposkripto.specification.js +14 -6
  58. package/dist/common/src/lib/pmProxy.test/specification.js +167 -52
  59. package/dist/common/src/services/FileService.js +505 -0
  60. package/dist/common/src/services/GitHubAuthService.js +184 -0
  61. package/dist/common/src/testeranto.js +38 -97
  62. package/dist/common/src/utils/api.js +12 -8
  63. package/dist/common/src/utils/gitTest.js +27 -0
  64. package/dist/common/src/utils.js +23 -13
  65. package/dist/common/testeranto.config.js +21 -17
  66. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  67. package/dist/module/design-editor/DesignEditor.js +33 -199
  68. package/dist/module/src/App.js +121 -15
  69. package/dist/module/src/PM/PM_WithBuild.js +128 -0
  70. package/dist/module/src/PM/PM_WithEslintAndTsc.js +79 -67
  71. package/dist/module/src/PM/PM_WithGit.js +477 -0
  72. package/dist/module/src/PM/PM_WithProcesses.js +479 -0
  73. package/dist/module/src/PM/PM_WithWebSocket.js +528 -0
  74. package/dist/module/src/PM/base.js +62 -0
  75. package/dist/module/src/PM/main.js +533 -1676
  76. package/dist/module/src/PM/metafileOutputs.js +78 -0
  77. package/dist/module/src/PM/node.js +0 -6
  78. package/dist/module/src/PM/pure.js +0 -8
  79. package/dist/module/src/PM/types.js +1 -1
  80. package/dist/module/src/PM/utils.js +196 -0
  81. package/dist/module/src/PM/web.js +0 -6
  82. package/dist/module/src/ReportServer.js +1 -9
  83. package/dist/module/src/ReportServerLib.js +1 -134
  84. package/dist/module/src/components/pure/AppFrame.js +66 -24
  85. package/dist/module/src/components/pure/ArtifactTree.js +80 -0
  86. package/dist/module/src/components/pure/BuildLogViewer.js +99 -0
  87. package/dist/module/src/components/pure/DebugEnv.js +23 -0
  88. package/dist/module/src/components/pure/FileTree.js +27 -0
  89. package/dist/module/src/components/pure/FileTreeItem.js +22 -0
  90. package/dist/module/src/components/pure/GitHubLoginButton.js +11 -0
  91. package/dist/module/src/components/pure/GitIntegrationView.js +305 -0
  92. package/dist/module/src/components/pure/ProcessManager.js +1 -0
  93. package/dist/module/src/components/pure/ProcessManagerView.js +74 -75
  94. package/dist/module/src/components/pure/ProjectPageView.js +5 -118
  95. package/dist/module/src/components/pure/Settings.js +84 -0
  96. package/dist/module/src/components/pure/Settings.test.js +29 -0
  97. package/dist/module/src/components/pure/SignIn.js +15 -0
  98. package/dist/module/src/components/pure/SingleProcessView.js +130 -214
  99. package/dist/module/src/components/pure/TestPageView.js +97 -352
  100. package/dist/module/src/components/pure/TestPageView_utils.js +109 -0
  101. package/dist/module/src/components/pure/TestTable.js +26 -0
  102. package/dist/module/src/components/pure/ToastNotification.js +7 -0
  103. package/dist/module/src/components/pure/UserProfile.js +20 -0
  104. package/dist/module/src/components/stateful/AuthCallbackPage.js +14 -0
  105. package/dist/module/src/components/stateful/FeaturesReporter.js +2 -1
  106. package/dist/module/src/components/stateful/FileTree.js +59 -33
  107. package/dist/module/src/components/stateful/GitIntegrationPage.js +5 -0
  108. package/dist/module/src/components/stateful/ProcessManagerPage.js +13 -15
  109. package/dist/module/src/components/stateful/ProjectPage.js +6 -5
  110. package/dist/module/src/components/stateful/ProjectsPage.js +16 -18
  111. package/dist/module/src/components/stateful/SingleProcessPage.js +16 -26
  112. package/dist/module/src/components/stateful/TestPage.js +8 -6
  113. package/dist/module/src/hooks/useGitMode.js +17 -0
  114. package/dist/module/src/lib/BaseSuite.test/mock.js +15 -8
  115. package/dist/module/src/lib/BaseSuite.test/test.js +56 -80
  116. package/dist/module/src/lib/Tiposkripto.js +24 -0
  117. package/dist/module/src/lib/Tiposkripto.test/MockTiposkripto.js +154 -10
  118. package/dist/module/src/lib/Tiposkripto.test/Tiposkripto.adapter.js +6 -12
  119. package/dist/module/src/lib/Tiposkripto.test/Tiposkripto.implementation.js +63 -23
  120. package/dist/module/src/lib/Tiposkripto.test/Tiposkripto.specification.js +14 -6
  121. package/dist/module/src/lib/pmProxy.test/specification.js +167 -52
  122. package/dist/module/src/services/FileService.js +468 -0
  123. package/dist/module/src/services/GitHubAuthService.js +180 -0
  124. package/dist/module/src/testeranto.js +38 -97
  125. package/dist/module/src/utils/api.js +10 -7
  126. package/dist/module/src/utils/gitTest.js +23 -0
  127. package/dist/module/src/utils.js +21 -12
  128. package/dist/module/testeranto.config.js +21 -17
  129. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  130. package/dist/prebuild/App.css +94 -121
  131. package/dist/prebuild/App.js +44601 -11225
  132. package/dist/prebuild/testeranto.mjs +4106 -0
  133. package/dist/types/design-editor/DesignEditor.d.ts +1 -18
  134. package/dist/types/src/App.d.ts +18 -0
  135. package/dist/types/src/PM/PM_WithBuild.d.ts +13 -0
  136. package/dist/types/src/PM/PM_WithEslintAndTsc.d.ts +2 -4
  137. package/dist/types/src/PM/PM_WithGit.d.ts +27 -0
  138. package/dist/types/src/PM/PM_WithProcesses.d.ts +29 -0
  139. package/dist/types/src/PM/PM_WithWebSocket.d.ts +108 -0
  140. package/dist/types/src/PM/base.d.ts +1 -1
  141. package/dist/types/src/PM/index.d.ts +0 -2
  142. package/dist/types/src/PM/main.d.ts +6 -77
  143. package/dist/types/src/PM/metafileOutputs.d.ts +0 -0
  144. package/dist/types/src/PM/node.d.ts +0 -2
  145. package/dist/types/src/PM/pure.d.ts +0 -2
  146. package/dist/types/src/PM/types.d.ts +118 -0
  147. package/dist/types/src/PM/utils.d.ts +35 -0
  148. package/dist/types/src/PM/web.d.ts +0 -2
  149. package/dist/types/src/Pure.d.ts +6 -1
  150. package/dist/types/src/ReportServer.d.ts +0 -1
  151. package/dist/types/src/ReportServerLib.d.ts +0 -1
  152. package/dist/types/src/Types.d.ts +1 -0
  153. package/dist/types/src/components/pure/ArtifactTree.d.ts +0 -0
  154. package/dist/types/src/components/pure/BuildLogViewer.d.ts +7 -0
  155. package/dist/types/src/components/pure/DebugEnv.d.ts +2 -0
  156. package/dist/types/src/components/pure/FileTree.d.ts +6 -0
  157. package/dist/types/src/components/pure/FileTreeItem.d.ts +8 -0
  158. package/dist/types/src/components/pure/GitHubLoginButton.d.ts +8 -0
  159. package/dist/types/src/components/pure/GitIntegrationView.d.ts +1 -0
  160. package/dist/types/src/components/pure/Settings.d.ts +1 -0
  161. package/dist/types/src/components/pure/Settings.test.d.ts +1 -0
  162. package/dist/types/src/components/pure/SignIn.d.ts +1 -0
  163. package/dist/types/src/components/pure/SingleProcessView.d.ts +10 -0
  164. package/dist/types/src/components/pure/TestPageView.d.ts +2 -1
  165. package/dist/types/src/components/pure/TestPageView_utils.d.ts +23 -0
  166. package/dist/types/src/components/pure/TestTable.d.ts +16 -0
  167. package/dist/types/src/components/pure/ToastNotification.d.ts +6 -0
  168. package/dist/types/src/components/pure/UserProfile.d.ts +2 -0
  169. package/dist/types/src/components/stateful/AuthCallbackPage.d.ts +2 -0
  170. package/dist/types/src/components/stateful/FileTree.d.ts +0 -8
  171. package/dist/types/src/components/stateful/GitIntegrationPage.d.ts +1 -0
  172. package/dist/types/src/hooks/useGitMode.d.ts +7 -0
  173. package/dist/types/src/lib/BaseSuite.test/mock.d.ts +2 -2
  174. package/dist/types/src/lib/BaseSuite.test/test.d.ts +4 -3
  175. package/dist/types/src/lib/Tiposkripto.d.ts +2 -0
  176. package/dist/types/src/lib/Tiposkripto.test/MockTiposkripto.d.ts +3 -0
  177. package/dist/types/src/lib/Tiposkripto.test/Tiposkripto.types.d.ts +5 -0
  178. package/dist/types/src/lib/index.d.ts +6 -0
  179. package/dist/types/src/services/FileService.d.ts +34 -0
  180. package/dist/types/src/services/GitHubAuthService.d.ts +32 -0
  181. package/dist/types/src/utils/api.d.ts +1 -0
  182. package/dist/types/src/utils/gitTest.d.ts +11 -0
  183. package/dist/types/src/utils.d.ts +3 -3
  184. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  185. package/example/__pycache__/Calculator.cpython-313.pyc +0 -0
  186. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/README.md +187 -0
  187. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_given.go +163 -0
  188. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_suite.go +85 -0
  189. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_then.go +21 -0
  190. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_when.go +21 -0
  191. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/golingvu.go +554 -0
  192. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/test_adapter.go +33 -0
  193. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/types.go +72 -0
  194. package/example/vendor/modules.txt +5 -0
  195. package/git-integration-plan.md +395 -0
  196. package/package.json +26 -14
  197. package/src/App.tsx +169 -18
  198. package/src/PM/PM_WithBuild.ts +171 -0
  199. package/src/PM/PM_WithEslintAndTsc.ts +109 -86
  200. package/src/PM/PM_WithGit.ts +585 -0
  201. package/src/PM/PM_WithProcesses.ts +639 -0
  202. package/src/PM/PM_WithWebSocket.ts +631 -0
  203. package/src/PM/base.ts +63 -1
  204. package/src/PM/index.ts +8 -5
  205. package/src/PM/main.ts +672 -2050
  206. package/src/PM/metafileOutputs.ts +90 -0
  207. package/src/PM/node.ts +18 -18
  208. package/src/PM/pure.ts +5 -13
  209. package/src/PM/types.ts +145 -0
  210. package/src/PM/utils.ts +256 -0
  211. package/src/PM/web.ts +8 -8
  212. package/src/README.md +122 -0
  213. package/src/ReportServer.ts +0 -12
  214. package/src/ReportServerLib.ts +0 -147
  215. package/src/Types.ts +1 -0
  216. package/src/app.scss +14 -164
  217. package/src/components/pure/AppFrame.tsx +237 -71
  218. package/src/components/pure/ArtifactTree.tsx +82 -0
  219. package/src/components/pure/BuildLogViewer.tsx +168 -0
  220. package/src/components/pure/DebugEnv.tsx +30 -0
  221. package/src/components/pure/FileTree.tsx +58 -0
  222. package/src/components/pure/FileTreeItem.tsx +49 -0
  223. package/src/components/pure/GitHubLoginButton.tsx +31 -0
  224. package/src/components/pure/GitIntegrationView.tsx +443 -0
  225. package/src/components/pure/ProcessManager.tsx +6 -5
  226. package/src/components/pure/ProcessManagerView.tsx +162 -166
  227. package/src/components/pure/ProjectPageView.tsx +6 -224
  228. package/src/components/pure/Settings.test.tsx +34 -0
  229. package/src/components/pure/Settings.tsx +163 -0
  230. package/src/components/pure/SignIn.tsx +33 -0
  231. package/src/components/pure/SingleProcessView.tsx +231 -235
  232. package/src/components/pure/TestPageView.test/specification.ts +1 -0
  233. package/src/components/pure/TestPageView.tsx +317 -826
  234. package/src/components/pure/TestPageView_utils.tsx +285 -0
  235. package/src/components/pure/TestTable.tsx +88 -0
  236. package/src/components/pure/ToastNotification.tsx +19 -0
  237. package/src/components/pure/UserProfile.tsx +44 -0
  238. package/src/components/stateful/AuthCallbackPage.tsx +21 -0
  239. package/src/components/stateful/FeaturesReporter.tsx +3 -1
  240. package/src/components/stateful/FileTree.tsx +58 -58
  241. package/src/components/stateful/GitIntegrationPage.tsx +8 -0
  242. package/src/components/stateful/ProcessManagerPage.tsx +13 -17
  243. package/src/components/stateful/ProjectPage.tsx +6 -5
  244. package/src/components/stateful/ProjectsPage.tsx +17 -19
  245. package/src/components/stateful/SVGEditor/CircleForm.tsx +68 -0
  246. package/src/components/stateful/SVGEditor/GroupForm.tsx +56 -0
  247. package/src/components/stateful/SVGEditor/RectForm.tsx +74 -0
  248. package/src/components/stateful/SVGEditor/SVGAttributeField.tsx +29 -0
  249. package/src/components/stateful/SVGEditor/SVGAttributesEditor.tsx +73 -0
  250. package/src/components/stateful/SVGEditor/SVGEditorControls.tsx +45 -0
  251. package/src/components/stateful/SVGEditor/SVGElementForm.tsx +45 -0
  252. package/src/components/stateful/SVGEditor/SVGPreview.tsx +225 -0
  253. package/src/components/stateful/SVGEditor/SVGTextEditor.tsx +166 -0
  254. package/src/components/stateful/SVGEditor/SVGTree.tsx +159 -0
  255. package/src/components/stateful/SVGEditor/SVGTypes.ts +36 -0
  256. package/src/components/stateful/SVGEditor/svg.xsd.xml +3038 -0
  257. package/src/components/stateful/SVGEditorPage.tsx +503 -0
  258. package/src/components/stateful/SingleProcessPage.tsx +18 -31
  259. package/src/components/stateful/TestPage.tsx +25 -22
  260. package/src/golingvu/golingvu.go +38 -2
  261. package/src/hooks/useGitMode.ts +20 -0
  262. package/src/lib/BaseSuite.test/mock.ts +16 -10
  263. package/src/lib/BaseSuite.test/test.ts +144 -103
  264. package/src/lib/Tiposkripto.test/MockTiposkripto.ts +178 -14
  265. package/src/lib/Tiposkripto.test/Tiposkripto.adapter.ts +9 -14
  266. package/src/lib/Tiposkripto.test/Tiposkripto.implementation.ts +78 -38
  267. package/src/lib/Tiposkripto.test/Tiposkripto.specification.ts +51 -9
  268. package/src/lib/Tiposkripto.test/Tiposkripto.types.ts +5 -0
  269. package/src/lib/Tiposkripto.ts +27 -0
  270. package/src/lib/index.ts +7 -0
  271. package/src/lib/pmProxy.test/specification.ts +168 -166
  272. package/src/pitono/PM/__pycache__/python.cpython-313.pyc +0 -0
  273. package/src/pitono/__pycache__/Pitono.cpython-313.pyc +0 -0
  274. package/src/pitono/__pycache__/__init__.cpython-313.pyc +0 -0
  275. package/src/pitono/__pycache__/base_given.cpython-313.pyc +0 -0
  276. package/src/pitono/__pycache__/base_suite.cpython-313.pyc +0 -0
  277. package/src/pitono/__pycache__/base_then.cpython-313.pyc +0 -0
  278. package/src/pitono/__pycache__/base_when.cpython-313.pyc +0 -0
  279. package/src/pitono/__pycache__/core_generator.cpython-313.pyc +0 -0
  280. package/src/pitono/__pycache__/simple_adapter.cpython-313.pyc +0 -0
  281. package/src/pitono/__pycache__/types.cpython-313.pyc +0 -0
  282. package/src/services/FileService.ts +542 -0
  283. package/src/services/GitHubAuthService.ts +240 -0
  284. package/src/testeranto.ts +62 -140
  285. package/src/utils/api.ts +15 -13
  286. package/src/utils/gitTest.ts +29 -0
  287. package/src/utils.ts +21 -12
  288. package/testeranto/App.css +94 -121
  289. package/testeranto/App.js +44601 -11225
  290. package/testeranto/bundles/golang/core/Calculator.golingvu.go +53 -0
  291. package/testeranto/bundles/golang/core/Calculator.golingvu.golingvu.go +53 -0
  292. package/testeranto/bundles/node/core/chunk-RIM6RECA.mjs +1170 -0
  293. package/testeranto/bundles/node/core/chunk-VXVF7WFO.mjs +4321 -0
  294. package/testeranto/bundles/node/core/example/Calculator.test.mjs +503 -0
  295. package/testeranto/bundles/node/core/src/lib/BaseSuite.test/node.test.mjs +94 -1231
  296. package/testeranto/bundles/node/core/src/lib/TipoSkripto.test/TipoSkripto.mjs +574 -0
  297. package/testeranto/bundles/node/core/src/lib/pmProxy.test/index.mjs +482 -0
  298. package/testeranto/bundles/pure/core/chunk-XYOCRDEQ.mjs +1080 -0
  299. package/testeranto/bundles/pure/core/src/Pure.test.mjs +410 -0
  300. package/testeranto/bundles/pure/core/src/lib/BaseSuite.test/pure.test.mjs +93 -1146
  301. package/testeranto/bundles/python/core/Calculator.pitono.test.py +24 -0
  302. package/testeranto/bundles/python/core/test_example.py +24 -0
  303. package/testeranto/bundles/web/core/MPLUSRounded1c-Black-O75GP5JI.ttf +0 -0
  304. package/testeranto/bundles/web/core/MPLUSRounded1c-Bold-R524Q5BH.ttf +0 -0
  305. package/testeranto/bundles/web/core/MPLUSRounded1c-ExtraBold-C6GRMYVT.ttf +0 -0
  306. package/testeranto/bundles/web/core/MPLUSRounded1c-Light-WKN65Y2C.ttf +0 -0
  307. package/testeranto/bundles/web/core/MPLUSRounded1c-Medium-ZC4DWL7C.ttf +0 -0
  308. package/testeranto/bundles/web/core/MPLUSRounded1c-Regular-DT6EKZ3S.ttf +0 -0
  309. package/testeranto/bundles/web/core/MPLUSRounded1c-Thin-YWDNVG6M.ttf +0 -0
  310. package/testeranto/bundles/web/core/chunk-DFRN4SYZ.mjs +2297 -0
  311. package/testeranto/bundles/web/core/chunk-JMDLMADH.mjs +27996 -0
  312. package/testeranto/bundles/web/core/chunk-LQMU5NCG.mjs +3082 -0
  313. package/testeranto/bundles/web/core/chunk-Q5TONB2Z.mjs +6874 -0
  314. package/testeranto/bundles/web/core/src/components/pure/FeaturesReporterView.test/index.mjs +164 -0
  315. package/testeranto/bundles/web/core/src/components/pure/ModalContent.test/index.css +11697 -0
  316. package/testeranto/bundles/web/core/src/components/pure/ModalContent.test/index.mjs +336 -0
  317. package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.css +11697 -0
  318. package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.mjs +517 -0
  319. package/testeranto/bundles/web/core/src/lib/BaseSuite.test/web.test.mjs +107 -1134
  320. package/testeranto/metafiles/golang/core.json +3 -3
  321. package/testeranto/metafiles/node/core.json +474 -31
  322. package/testeranto/metafiles/pure/core.json +144 -28
  323. package/testeranto/metafiles/python/core.json +11 -0
  324. package/testeranto/metafiles/web/core.json +15829 -45
  325. package/testeranto/reports/core/config.json +40 -0
  326. package/testeranto/reports/core/src/Pure.test/pure/exit.log +0 -0
  327. package/testeranto/reports/core/src/Pure.test/pure/lint_errors.txt +0 -0
  328. package/testeranto/reports/core/src/Pure.test/pure/prompt.txt +14 -0
  329. package/testeranto/reports/core/src/Pure.test/pure/type_errors.txt +73 -0
  330. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/debug.log +0 -0
  331. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/error.log +91 -0
  332. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/exit.log +1 -0
  333. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/info.log +2 -0
  334. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/tests.json +68 -0
  335. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/warn.log +0 -0
  336. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/debug.log +0 -0
  337. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/error.log +30 -0
  338. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/exit.log +1 -0
  339. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/info.log +2 -0
  340. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/tests.json +88 -0
  341. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/warn.log +0 -0
  342. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +0 -6
  343. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/prompt.txt +0 -11
  344. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/stdout.log +1 -0
  345. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/tests.json +1 -1
  346. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/type_errors.txt +35 -38
  347. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +0 -2
  348. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +0 -10
  349. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +40 -38
  350. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/tests.json +1 -1
  351. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/exit.log +1 -0
  352. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/lint_errors.txt +0 -0
  353. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/message.txt +17 -0
  354. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/prompt.txt +17 -0
  355. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stderr.log +55 -0
  356. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stdout.log +191 -0
  357. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/type_errors.txt +71 -0
  358. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/exit.log +1 -0
  359. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/lint_errors.txt +15 -0
  360. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/message.txt +17 -0
  361. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/prompt.txt +17 -0
  362. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stderr.log +20 -0
  363. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stdout.log +4 -0
  364. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/type_errors.txt +49 -0
  365. package/testeranto/reports/core/summary.json +34 -6
  366. package/testeranto.config.ts +26 -20
  367. package/tsc.log +141 -91
  368. package/tsconfig.json +6 -2
  369. package/dist/prebuild/ReportServer.mjs +0 -227
  370. package/dist/prebuild/mothership/index.mjs +0 -22
  371. package/dist/types/design-editor/server.d.ts +0 -1
  372. package/testeranto/bundles/web/core/src/lib/BaseSuite.test/web.test.html +0 -15
  373. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/lint_errors.txt +0 -2
  374. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/prompt.txt +0 -25
  375. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/type_errors.txt +0 -56
  376. /package/testeranto/reports/core/src/{lib/BaseSuite.test/web.test/web → Pure.test/pure}/message.txt +0 -0
@@ -0,0 +1,585 @@
1
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
2
+ /* eslint-disable no-async-promise-executor */
3
+ /* eslint-disable @typescript-eslint/no-explicit-any */
4
+ /* eslint-disable @typescript-eslint/no-unused-vars */
5
+
6
+ import url from "url";
7
+ import http from "http";
8
+
9
+ import { IBuiltConfig } from "../Types.js";
10
+
11
+ import { PM_WithEslintAndTsc } from "./PM_WithEslintAndTsc.js";
12
+ import {
13
+ FileStatus,
14
+ FileChange,
15
+ RemoteStatus,
16
+ } from "../services/FileService.js";
17
+
18
+ export abstract class PM_WithGit extends PM_WithEslintAndTsc {
19
+ gitWatchTimeout: NodeJS.Timeout | null = null;
20
+ gitWatcher: any = null;
21
+
22
+ constructor(configs: IBuiltConfig, name: string, mode: "once" | "dev") {
23
+ super(configs, name, mode);
24
+ }
25
+
26
+ // Override requestHandler to add Git-specific endpoints
27
+ requestHandler(req: http.IncomingMessage, res: http.ServerResponse) {
28
+ const parsedUrl = url.parse(req.url || "/");
29
+ const pathname = parsedUrl.pathname || "/";
30
+
31
+ // Handle Git API endpoints
32
+ if (pathname?.startsWith("/api/git/")) {
33
+ this.handleGitApi(req, res);
34
+ return;
35
+ }
36
+
37
+ if (pathname === "/api/auth/github/token" && req.method === "POST") {
38
+ this.handleGitHubTokenExchange(req, res);
39
+ return;
40
+ }
41
+
42
+ // Handle GitHub OAuth callback
43
+ if (pathname === "/auth/github/callback") {
44
+ // Serve the callback HTML page
45
+ const callbackHtml = `
46
+ <!DOCTYPE html>
47
+ <html>
48
+ <head>
49
+ <title>GitHub Authentication - Testeranto</title>
50
+ <script>
51
+ // Extract the code from the URL and send it to the parent window
52
+ const urlParams = new URLSearchParams(window.location.search);
53
+ const code = urlParams.get('code');
54
+ const error = urlParams.get('error');
55
+
56
+ if (code) {
57
+ window.opener.postMessage({ type: 'github-auth-callback', code }, '*');
58
+ } else if (error) {
59
+ window.opener.postMessage({ type: 'github-auth-error', error }, '*');
60
+ }
61
+ window.close();
62
+ </script>
63
+ </head>
64
+ <body>
65
+ <p>Completing authentication...</p>
66
+ </body>
67
+ </html>`;
68
+ res.writeHead(200, { "Content-Type": "text/html" });
69
+ res.end(callbackHtml);
70
+ return;
71
+ }
72
+
73
+ // Call the parent class's requestHandler for all other requests
74
+ super.requestHandler(req, res);
75
+ }
76
+
77
+ // this method is also horrible
78
+ private handleGitApi(req: http.IncomingMessage, res: http.ServerResponse) {
79
+ const parsedUrl = url.parse(req.url || "/");
80
+ const pathname = parsedUrl.pathname || "/";
81
+
82
+ // Set CORS headers
83
+ res.setHeader("Access-Control-Allow-Origin", "*");
84
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
85
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
86
+
87
+ if (req.method === "OPTIONS") {
88
+ res.writeHead(200);
89
+ res.end();
90
+ return;
91
+ }
92
+
93
+ try {
94
+ if (pathname === "/api/git/changes" && req.method === "GET") {
95
+ this.handleGitChanges(req, res);
96
+ } else if (pathname === "/api/git/status" && req.method === "GET") {
97
+ this.handleGitFileStatus(req, res);
98
+ } else if (pathname === "/api/git/commit" && req.method === "POST") {
99
+ this.handleGitCommit(req, res);
100
+ } else if (pathname === "/api/git/push" && req.method === "POST") {
101
+ this.handleGitPush(req, res);
102
+ } else if (pathname === "/api/git/pull" && req.method === "POST") {
103
+ this.handleGitPull(req, res);
104
+ } else if (pathname === "/api/git/branch" && req.method === "GET") {
105
+ this.handleGitBranch(req, res);
106
+ } else if (
107
+ pathname === "/api/git/remote-status" &&
108
+ req.method === "GET"
109
+ ) {
110
+ this.handleGitRemoteStatus(req, res);
111
+ } else {
112
+ res.writeHead(404, { "Content-Type": "application/json" });
113
+ res.end(JSON.stringify({ error: "Not found" }));
114
+ }
115
+ } catch (error) {
116
+ res.writeHead(500, { "Content-Type": "application/json" });
117
+ res.end(JSON.stringify({ error: "Internal server error" }));
118
+ }
119
+ }
120
+
121
+ private async handleGitChanges(
122
+ req: http.IncomingMessage,
123
+ res: http.ServerResponse
124
+ ) {
125
+ try {
126
+ const changes = await this.getGitChanges();
127
+ res.writeHead(200, { "Content-Type": "application/json" });
128
+ res.end(JSON.stringify(changes));
129
+ } catch (error) {
130
+ res.writeHead(500, { "Content-Type": "application/json" });
131
+ res.end(JSON.stringify({ error: "Failed to get changes" }));
132
+ }
133
+ }
134
+
135
+ private async handleGitFileStatus(
136
+ req: http.IncomingMessage,
137
+ res: http.ServerResponse
138
+ ) {
139
+ const parsedUrl = url.parse(req.url || "/");
140
+ const query = parsedUrl.query || "";
141
+ const params = new URLSearchParams(query);
142
+ const path = params.get("path");
143
+
144
+ if (!path) {
145
+ res.writeHead(400, { "Content-Type": "application/json" });
146
+ res.end(JSON.stringify({ error: "Path parameter required" }));
147
+ return;
148
+ }
149
+
150
+ try {
151
+ const status = await this.getGitFileStatus(path);
152
+ res.writeHead(200, { "Content-Type": "application/json" });
153
+ res.end(JSON.stringify(status));
154
+ } catch (error) {
155
+ res.writeHead(500, { "Content-Type": "application/json" });
156
+ res.end(JSON.stringify({ error: "Failed to get file status" }));
157
+ }
158
+ }
159
+
160
+ private async handleGitCommit(
161
+ req: http.IncomingMessage,
162
+ res: http.ServerResponse
163
+ ) {
164
+ let body = "";
165
+ req.on("data", (chunk) => {
166
+ body += chunk.toString();
167
+ });
168
+
169
+ req.on("end", async () => {
170
+ try {
171
+ const { message, description } = JSON.parse(body);
172
+ await this.executeGitCommit(message, description);
173
+ res.writeHead(200, { "Content-Type": "application/json" });
174
+ res.end(JSON.stringify({ success: true }));
175
+ } catch (error) {
176
+ res.writeHead(500, { "Content-Type": "application/json" });
177
+ res.end(JSON.stringify({ error: "Failed to commit" }));
178
+ }
179
+ });
180
+ }
181
+
182
+ private async handleGitPush(
183
+ req: http.IncomingMessage,
184
+ res: http.ServerResponse
185
+ ) {
186
+ try {
187
+ await this.executeGitPush();
188
+ res.writeHead(200, { "Content-Type": "application/json" });
189
+ res.end(JSON.stringify({ success: true }));
190
+ } catch (error) {
191
+ res.writeHead(500, { "Content-Type": "application/json" });
192
+ res.end(JSON.stringify({ error: "Failed to push" }));
193
+ }
194
+ }
195
+
196
+ private async handleGitPull(
197
+ req: http.IncomingMessage,
198
+ res: http.ServerResponse
199
+ ) {
200
+ try {
201
+ await this.executeGitPull();
202
+ res.writeHead(200, { "Content-Type": "application/json" });
203
+ res.end(JSON.stringify({ success: true }));
204
+ } catch (error) {
205
+ res.writeHead(500, { "Content-Type": "application/json" });
206
+ res.end(JSON.stringify({ error: "Failed to pull" }));
207
+ }
208
+ }
209
+
210
+ private async handleGitBranch(
211
+ req: http.IncomingMessage,
212
+ res: http.ServerResponse
213
+ ) {
214
+ try {
215
+ const branch = await this.getCurrentGitBranch();
216
+ res.writeHead(200, { "Content-Type": "text/plain" });
217
+ res.end(branch);
218
+ } catch (error) {
219
+ res.writeHead(500, { "Content-Type": "application/json" });
220
+ res.end(JSON.stringify({ error: "Failed to get branch" }));
221
+ }
222
+ }
223
+
224
+ private async handleGitHubTokenExchange(
225
+ req: http.IncomingMessage,
226
+ res: http.ServerResponse
227
+ ) {
228
+ let body = "";
229
+ req.on("data", (chunk) => {
230
+ body += chunk.toString();
231
+ });
232
+
233
+ req.on("end", async () => {
234
+ try {
235
+ const { code } = JSON.parse(body);
236
+
237
+ // Exchange code for access token
238
+ const tokenResponse = await fetch(
239
+ "https://github.com/login/oauth/access_token",
240
+ {
241
+ method: "POST",
242
+ headers: {
243
+ Accept: "application/json",
244
+ "Content-Type": "application/json",
245
+ },
246
+ body: JSON.stringify({
247
+ client_id: process.env.GITHUB_CLIENT_ID,
248
+ client_secret: process.env.GITHUB_CLIENT_SECRET,
249
+ code,
250
+ }),
251
+ }
252
+ );
253
+
254
+ const tokenData = await tokenResponse.json();
255
+
256
+ if (tokenData.error) {
257
+ res.writeHead(400, { "Content-Type": "application/json" });
258
+ res.end(JSON.stringify({ error: tokenData.error_description }));
259
+ return;
260
+ }
261
+
262
+ res.writeHead(200, { "Content-Type": "application/json" });
263
+ res.end(JSON.stringify({ access_token: tokenData.access_token }));
264
+ } catch (error) {
265
+ res.writeHead(500, { "Content-Type": "application/json" });
266
+ res.end(JSON.stringify({ error: "Failed to exchange token" }));
267
+ }
268
+ });
269
+ }
270
+
271
+ private async handleGitRemoteStatus(
272
+ req: http.IncomingMessage,
273
+ res: http.ServerResponse
274
+ ) {
275
+ try {
276
+ const status = await this.getGitRemoteStatus();
277
+ res.writeHead(200, { "Content-Type": "application/json" });
278
+ res.end(JSON.stringify(status));
279
+ } catch (error) {
280
+ res.writeHead(500, { "Content-Type": "application/json" });
281
+ res.end(JSON.stringify({ error: "Failed to get remote status" }));
282
+ }
283
+ }
284
+
285
+ private async getGitFileStatus(path: string): Promise<FileStatus> {
286
+ try {
287
+ const changes = await this.getGitChanges();
288
+ const fileChange = changes.find((change) => change.path === path);
289
+
290
+ if (fileChange) {
291
+ return { status: fileChange.status };
292
+ }
293
+ return { status: "unchanged" };
294
+ } catch (error) {
295
+ console.error("Failed to get file status:", error);
296
+ return { status: "unchanged" };
297
+ }
298
+ }
299
+
300
+ private async executeGitCommit(
301
+ message: string,
302
+ description?: string
303
+ ): Promise<void> {
304
+ try {
305
+ const { exec } = await import("child_process");
306
+
307
+ const fullMessage = description
308
+ ? `${message}\n\n${description}`
309
+ : message;
310
+
311
+ return new Promise((resolve, reject) => {
312
+ // Stage all changes first
313
+ exec("git add -A", { cwd: process.cwd() }, (error) => {
314
+ if (error) {
315
+ reject(new Error(`Failed to stage changes: ${error.message}`));
316
+ return;
317
+ }
318
+
319
+ // Commit with message
320
+ const commitCommand = `git commit -m "${fullMessage.replace(
321
+ /"/g,
322
+ '\\"'
323
+ )}"`;
324
+ exec(commitCommand, { cwd: process.cwd() }, (commitError) => {
325
+ if (commitError) {
326
+ reject(new Error(`Failed to commit: ${commitError.message}`));
327
+ return;
328
+ }
329
+
330
+ resolve();
331
+ });
332
+ });
333
+ });
334
+ } catch (error) {
335
+ throw new Error(
336
+ `Failed to execute commit: ${
337
+ error instanceof Error ? error.message : "Unknown error"
338
+ }`
339
+ );
340
+ }
341
+ }
342
+
343
+ private async executeGitPush(): Promise<void> {
344
+ try {
345
+ const { exec } = await import("child_process");
346
+
347
+ return new Promise((resolve, reject) => {
348
+ exec("git push", { cwd: process.cwd() }, (error) => {
349
+ if (error) {
350
+ reject(new Error(`Failed to push: ${error.message}`));
351
+ return;
352
+ }
353
+ resolve();
354
+ });
355
+ });
356
+ } catch (error) {
357
+ throw new Error(
358
+ `Failed to execute push: ${
359
+ error instanceof Error ? error.message : "Unknown error"
360
+ }`
361
+ );
362
+ }
363
+ }
364
+
365
+ private async executeGitPull(): Promise<void> {
366
+ try {
367
+ const { exec } = await import("child_process");
368
+
369
+ return new Promise((resolve, reject) => {
370
+ exec("git pull", { cwd: process.cwd() }, (error) => {
371
+ if (error) {
372
+ reject(new Error(`Failed to pull: ${error.message}`));
373
+ return;
374
+ }
375
+ resolve();
376
+ });
377
+ });
378
+ } catch (error) {
379
+ throw new Error(
380
+ `Failed to execute pull: ${
381
+ error instanceof Error ? error.message : "Unknown error"
382
+ }`
383
+ );
384
+ }
385
+ }
386
+
387
+ // private async sendInitialState(ws: WebSocket) {
388
+ // try {
389
+ // const changes = await this.getGitChanges();
390
+ // const status = await this.getGitRemoteStatus();
391
+ // const branch = await this.getCurrentGitBranch();
392
+
393
+ // ws.send(JSON.stringify({ type: "changes", changes }));
394
+ // ws.send(JSON.stringify({ type: "status", status }));
395
+ // ws.send(JSON.stringify({ type: "branch", branch }));
396
+ // } catch (error) {
397
+ // console.error("Error sending initial state:", error);
398
+ // ws.send(
399
+ // JSON.stringify({
400
+ // type: "error",
401
+ // message: "Failed to get Git status",
402
+ // })
403
+ // );
404
+ // }
405
+ // }
406
+
407
+ // private async refreshGitStatus() {
408
+ // try {
409
+ // const changes = await this.getGitChanges();
410
+ // const status = await this.getGitRemoteStatus();
411
+ // const branch = await this.getCurrentGitBranch();
412
+
413
+ // this.broadcast({ type: "changes", changes });
414
+ // this.broadcast({ type: "status", status });
415
+ // this.broadcast({ type: "branch", branch });
416
+ // } catch (error) {
417
+ // console.error("Error refreshing Git status:", error);
418
+ // }
419
+ // }
420
+
421
+ onBuildDone(): void {
422
+ console.log("Build processes completed");
423
+ // The builds are done, which means the files are ready to be watched
424
+ // This matches the original behavior where builds completed before PM_Main started
425
+
426
+ // Start Git watcher for development mode
427
+ this.startGitWatcher();
428
+ }
429
+
430
+ async startGitWatcher() {
431
+ console.log("Starting Git watcher for real-time updates");
432
+
433
+ // Watch for file system changes in the current directory
434
+ const watcher = (await import("fs")).watch(
435
+ process.cwd(),
436
+ { recursive: true },
437
+ async (eventType, filename) => {
438
+ if (filename && !filename.includes(".git")) {
439
+ try {
440
+ // Debounce the Git status check
441
+ clearTimeout(this.gitWatchTimeout);
442
+ this.gitWatchTimeout = setTimeout(async () => {
443
+ const changes = await this.getGitChanges();
444
+ const status = await this.getGitRemoteStatus();
445
+ const branch = await this.getCurrentGitBranch();
446
+
447
+ this.broadcast({ type: "changes", changes });
448
+ this.broadcast({ type: "status", status });
449
+ this.broadcast({ type: "branch", branch });
450
+ }, 500); // Wait 500ms after last change
451
+ } catch (error) {
452
+ console.error("Error checking Git status:", error);
453
+ }
454
+ }
455
+ }
456
+ );
457
+
458
+ // Also set up a periodic check in case file watching misses something
459
+ setInterval(async () => {
460
+ try {
461
+ const changes = await this.getGitChanges();
462
+ const status = await this.getGitRemoteStatus();
463
+ const branch = await this.getCurrentGitBranch();
464
+
465
+ this.broadcast({ type: "changes", changes });
466
+ this.broadcast({ type: "status", status });
467
+ this.broadcast({ type: "branch", branch });
468
+ } catch (error) {
469
+ console.error("Error checking Git status:", error);
470
+ }
471
+ }, 10000); // Check every 10 seconds as a fallback
472
+
473
+ this.gitWatcher = watcher;
474
+ }
475
+
476
+ private async getGitChanges(): Promise<FileChange[]> {
477
+ try {
478
+ // Use git status --porcelain to get machine-readable output
479
+ const { exec } = await import("child_process");
480
+
481
+ return new Promise((resolve, reject) => {
482
+ exec(
483
+ "git status --porcelain",
484
+ { cwd: process.cwd() },
485
+ (error, stdout, stderr) => {
486
+ if (error) {
487
+ console.error("Error getting git changes:", error);
488
+ resolve([]);
489
+ return;
490
+ }
491
+
492
+ const changes: FileChange[] = [];
493
+ const lines = stdout.trim().split("\n");
494
+
495
+ for (const line of lines) {
496
+ if (!line.trim()) continue;
497
+
498
+ // Parse git status output (XY PATH)
499
+ const status = line.substring(0, 2).trim();
500
+ const path = line.substring(3).trim();
501
+
502
+ let fileStatus: FileChange["status"] = "unchanged";
503
+
504
+ if (status.startsWith("M")) {
505
+ fileStatus = "modified";
506
+ } else if (status.startsWith("A")) {
507
+ fileStatus = "added";
508
+ } else if (status.startsWith("D")) {
509
+ fileStatus = "deleted";
510
+ } else if (status.startsWith("U") || status.includes("U")) {
511
+ fileStatus = "conflicted";
512
+ } else if (status.startsWith("??")) {
513
+ fileStatus = "added";
514
+ }
515
+
516
+ if (fileStatus !== "unchanged") {
517
+ changes.push({
518
+ path,
519
+ status: fileStatus,
520
+ });
521
+ }
522
+ }
523
+
524
+ resolve(changes);
525
+ }
526
+ );
527
+ });
528
+ } catch (error) {
529
+ console.error("Failed to get git changes:", error);
530
+ return [];
531
+ }
532
+ }
533
+
534
+ private async getGitRemoteStatus(): Promise<RemoteStatus> {
535
+ try {
536
+ const { exec } = await import("child_process");
537
+
538
+ return new Promise((resolve) => {
539
+ // Get ahead/behind status for current branch
540
+ exec(
541
+ "git rev-list --left-right --count HEAD...@{u}",
542
+ { cwd: process.cwd() },
543
+ (error, stdout, stderr) => {
544
+ if (error) {
545
+ // If there's no upstream branch, return 0 for both
546
+ resolve({ ahead: 0, behind: 0 });
547
+ return;
548
+ }
549
+
550
+ const [behind, ahead] = stdout.trim().split("\t").map(Number);
551
+ resolve({ ahead, behind });
552
+ }
553
+ );
554
+ });
555
+ } catch (error) {
556
+ console.error("Failed to get remote status:", error);
557
+ return { ahead: 0, behind: 0 };
558
+ }
559
+ }
560
+
561
+ private async getCurrentGitBranch(): Promise<string> {
562
+ try {
563
+ const { exec } = await import("child_process");
564
+
565
+ return new Promise((resolve) => {
566
+ exec(
567
+ "git branch --show-current",
568
+ { cwd: process.cwd() },
569
+ (error, stdout, stderr) => {
570
+ if (error) {
571
+ console.error("Error getting current branch:", error);
572
+ resolve("main");
573
+ return;
574
+ }
575
+
576
+ resolve(stdout.trim() || "main");
577
+ }
578
+ );
579
+ });
580
+ } catch (error) {
581
+ console.error("Failed to get current branch:", error);
582
+ return "main";
583
+ }
584
+ }
585
+ }