vibeman 0.0.5 → 0.0.7

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 (239) hide show
  1. package/dist/api.js +43 -0
  2. package/dist/index.js +227 -104
  3. package/dist/ui/assets/index-C_kQPI1m.js +9 -0
  4. package/dist/ui/index.html +12 -0
  5. package/package.json +13 -46
  6. package/README.md +0 -12
  7. package/dist/runtime/api/.tsbuildinfo +0 -1
  8. package/dist/runtime/api/agent/agent-service.d.ts +0 -229
  9. package/dist/runtime/api/agent/agent-service.js +0 -963
  10. package/dist/runtime/api/agent/ai-providers/amp-cli-provider.d.ts +0 -38
  11. package/dist/runtime/api/agent/ai-providers/amp-cli-provider.js +0 -268
  12. package/dist/runtime/api/agent/ai-providers/claude-code-adapter.d.ts +0 -61
  13. package/dist/runtime/api/agent/ai-providers/claude-code-adapter.js +0 -362
  14. package/dist/runtime/api/agent/ai-providers/codex-cli-provider.d.ts +0 -36
  15. package/dist/runtime/api/agent/ai-providers/codex-cli-provider.js +0 -375
  16. package/dist/runtime/api/agent/ai-providers/gemini-cli-provider.d.ts +0 -24
  17. package/dist/runtime/api/agent/ai-providers/gemini-cli-provider.js +0 -291
  18. package/dist/runtime/api/agent/ai-providers/index.d.ts +0 -9
  19. package/dist/runtime/api/agent/ai-providers/index.js +0 -9
  20. package/dist/runtime/api/agent/ai-providers/types.d.ts +0 -185
  21. package/dist/runtime/api/agent/ai-providers/types.js +0 -5
  22. package/dist/runtime/api/agent/amp-cli-provider.test.d.ts +0 -1
  23. package/dist/runtime/api/agent/amp-cli-provider.test.js +0 -99
  24. package/dist/runtime/api/agent/codex-cli-provider.test.d.ts +0 -1
  25. package/dist/runtime/api/agent/codex-cli-provider.test.js +0 -172
  26. package/dist/runtime/api/agent/core-agent-service.d.ts +0 -119
  27. package/dist/runtime/api/agent/core-agent-service.js +0 -267
  28. package/dist/runtime/api/agent/parsers.d.ts +0 -16
  29. package/dist/runtime/api/agent/parsers.js +0 -308
  30. package/dist/runtime/api/agent/prompt-service.d.ts +0 -30
  31. package/dist/runtime/api/agent/prompt-service.js +0 -452
  32. package/dist/runtime/api/agent/prompt-service.test.d.ts +0 -1
  33. package/dist/runtime/api/agent/prompt-service.test.js +0 -265
  34. package/dist/runtime/api/agent/routing-policy.d.ts +0 -171
  35. package/dist/runtime/api/agent/routing-policy.js +0 -196
  36. package/dist/runtime/api/agent/routing-policy.test.d.ts +0 -1
  37. package/dist/runtime/api/agent/routing-policy.test.js +0 -63
  38. package/dist/runtime/api/api/router-helpers.d.ts +0 -32
  39. package/dist/runtime/api/api/router-helpers.js +0 -31
  40. package/dist/runtime/api/api/routers/ai.d.ts +0 -200
  41. package/dist/runtime/api/api/routers/ai.js +0 -396
  42. package/dist/runtime/api/api/routers/executions.d.ts +0 -93
  43. package/dist/runtime/api/api/routers/executions.js +0 -94
  44. package/dist/runtime/api/api/routers/git.d.ts +0 -45
  45. package/dist/runtime/api/api/routers/git.js +0 -35
  46. package/dist/runtime/api/api/routers/provider-config.d.ts +0 -199
  47. package/dist/runtime/api/api/routers/provider-config.js +0 -252
  48. package/dist/runtime/api/api/routers/settings.d.ts +0 -158
  49. package/dist/runtime/api/api/routers/settings.js +0 -129
  50. package/dist/runtime/api/api/routers/tasks.d.ts +0 -141
  51. package/dist/runtime/api/api/routers/tasks.js +0 -238
  52. package/dist/runtime/api/api/routers/workflows.d.ts +0 -275
  53. package/dist/runtime/api/api/routers/workflows.js +0 -311
  54. package/dist/runtime/api/api/routers/worktrees.d.ts +0 -101
  55. package/dist/runtime/api/api/routers/worktrees.js +0 -80
  56. package/dist/runtime/api/api/trpc.d.ts +0 -118
  57. package/dist/runtime/api/api/trpc.js +0 -34
  58. package/dist/runtime/api/index.d.ts +0 -9
  59. package/dist/runtime/api/index.js +0 -117
  60. package/dist/runtime/api/lib/id-generator.d.ts +0 -70
  61. package/dist/runtime/api/lib/id-generator.js +0 -123
  62. package/dist/runtime/api/lib/local-config.d.ts +0 -335
  63. package/dist/runtime/api/lib/local-config.js +0 -304
  64. package/dist/runtime/api/lib/logger.d.ts +0 -11
  65. package/dist/runtime/api/lib/logger.js +0 -188
  66. package/dist/runtime/api/lib/provider-detection.d.ts +0 -61
  67. package/dist/runtime/api/lib/provider-detection.js +0 -326
  68. package/dist/runtime/api/lib/server/agent-service-singleton.d.ts +0 -6
  69. package/dist/runtime/api/lib/server/agent-service-singleton.js +0 -27
  70. package/dist/runtime/api/lib/server/bootstrap.d.ts +0 -38
  71. package/dist/runtime/api/lib/server/bootstrap.js +0 -197
  72. package/dist/runtime/api/lib/server/git-service-singleton.d.ts +0 -6
  73. package/dist/runtime/api/lib/server/git-service-singleton.js +0 -47
  74. package/dist/runtime/api/lib/server/project-root.d.ts +0 -2
  75. package/dist/runtime/api/lib/server/project-root.js +0 -61
  76. package/dist/runtime/api/lib/server/task-service-singleton.d.ts +0 -7
  77. package/dist/runtime/api/lib/server/task-service-singleton.js +0 -58
  78. package/dist/runtime/api/lib/server/vibeman-info.d.ts +0 -5
  79. package/dist/runtime/api/lib/server/vibeman-info.js +0 -85
  80. package/dist/runtime/api/lib/server/vibing-orchestrator-singleton.d.ts +0 -7
  81. package/dist/runtime/api/lib/server/vibing-orchestrator-singleton.js +0 -57
  82. package/dist/runtime/api/lib/trpc/server.d.ts +0 -965
  83. package/dist/runtime/api/lib/trpc/server.js +0 -11
  84. package/dist/runtime/api/lib/trpc/ws-server.d.ts +0 -8
  85. package/dist/runtime/api/lib/trpc/ws-server.js +0 -33
  86. package/dist/runtime/api/persistence/database-service.d.ts +0 -14
  87. package/dist/runtime/api/persistence/database-service.js +0 -74
  88. package/dist/runtime/api/persistence/execution-log-persistence.d.ts +0 -90
  89. package/dist/runtime/api/persistence/execution-log-persistence.js +0 -426
  90. package/dist/runtime/api/persistence/execution-log-persistence.test.d.ts +0 -1
  91. package/dist/runtime/api/persistence/execution-log-persistence.test.js +0 -170
  92. package/dist/runtime/api/router.d.ts +0 -968
  93. package/dist/runtime/api/router.js +0 -34
  94. package/dist/runtime/api/settings-service.d.ts +0 -110
  95. package/dist/runtime/api/settings-service.js +0 -678
  96. package/dist/runtime/api/tasks/file-watcher.d.ts +0 -23
  97. package/dist/runtime/api/tasks/file-watcher.js +0 -88
  98. package/dist/runtime/api/tasks/task-file-parser.d.ts +0 -14
  99. package/dist/runtime/api/tasks/task-file-parser.js +0 -180
  100. package/dist/runtime/api/tasks/task-service.d.ts +0 -36
  101. package/dist/runtime/api/tasks/task-service.js +0 -173
  102. package/dist/runtime/api/tasks/task-updater.d.ts +0 -62
  103. package/dist/runtime/api/tasks/task-updater.js +0 -260
  104. package/dist/runtime/api/tasks/task-updater.test.d.ts +0 -1
  105. package/dist/runtime/api/tasks/task-updater.test.js +0 -303
  106. package/dist/runtime/api/types/index.d.ts +0 -186
  107. package/dist/runtime/api/types/index.js +0 -1
  108. package/dist/runtime/api/types/settings.d.ts +0 -105
  109. package/dist/runtime/api/types/settings.js +0 -2
  110. package/dist/runtime/api/types.d.ts +0 -2
  111. package/dist/runtime/api/types.js +0 -1
  112. package/dist/runtime/api/utils/env.d.ts +0 -6
  113. package/dist/runtime/api/utils/env.js +0 -12
  114. package/dist/runtime/api/utils/stripNextEnv.d.ts +0 -7
  115. package/dist/runtime/api/utils/stripNextEnv.js +0 -22
  116. package/dist/runtime/api/utils/title-slug.d.ts +0 -6
  117. package/dist/runtime/api/utils/title-slug.js +0 -77
  118. package/dist/runtime/api/utils/url.d.ts +0 -2
  119. package/dist/runtime/api/utils/url.js +0 -19
  120. package/dist/runtime/api/vcs/git-history-service.d.ts +0 -57
  121. package/dist/runtime/api/vcs/git-history-service.js +0 -228
  122. package/dist/runtime/api/vcs/git-service.d.ts +0 -136
  123. package/dist/runtime/api/vcs/git-service.js +0 -307
  124. package/dist/runtime/api/vcs/worktree-service.d.ts +0 -93
  125. package/dist/runtime/api/vcs/worktree-service.js +0 -518
  126. package/dist/runtime/api/vcs/worktree-service.test.d.ts +0 -1
  127. package/dist/runtime/api/vcs/worktree-service.test.js +0 -20
  128. package/dist/runtime/api/workflows/quality-pipeline.d.ts +0 -58
  129. package/dist/runtime/api/workflows/quality-pipeline.js +0 -401
  130. package/dist/runtime/api/workflows/vibing-orchestrator.d.ts +0 -406
  131. package/dist/runtime/api/workflows/vibing-orchestrator.js +0 -2462
  132. package/dist/runtime/api/workflows/workflow-effects.d.ts +0 -45
  133. package/dist/runtime/api/workflows/workflow-effects.js +0 -49
  134. package/dist/runtime/api/workflows/workflow-reconciler.d.ts +0 -65
  135. package/dist/runtime/api/workflows/workflow-reconciler.js +0 -226
  136. package/dist/runtime/api/workflows/workflow-reducer.d.ts +0 -26
  137. package/dist/runtime/api/workflows/workflow-reducer.js +0 -288
  138. package/dist/runtime/api/workflows/workflow-reducer.test.d.ts +0 -1
  139. package/dist/runtime/api/workflows/workflow-reducer.test.js +0 -247
  140. package/dist/runtime/api/workflows/workflow-schema.d.ts +0 -546
  141. package/dist/runtime/api/workflows/workflow-schema.js +0 -256
  142. package/dist/runtime/web/.next/BUILD_ID +0 -1
  143. package/dist/runtime/web/.next/app-build-manifest.json +0 -66
  144. package/dist/runtime/web/.next/app-path-routes-manifest.json +0 -8
  145. package/dist/runtime/web/.next/build-manifest.json +0 -33
  146. package/dist/runtime/web/.next/package.json +0 -1
  147. package/dist/runtime/web/.next/prerender-manifest.json +0 -61
  148. package/dist/runtime/web/.next/react-loadable-manifest.json +0 -8
  149. package/dist/runtime/web/.next/required-server-files.json +0 -334
  150. package/dist/runtime/web/.next/routes-manifest.json +0 -70
  151. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js +0 -1
  152. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js.nft.json +0 -1
  153. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route_client-reference-manifest.js +0 -1
  154. package/dist/runtime/web/.next/server/app/_not-found/page.js +0 -2
  155. package/dist/runtime/web/.next/server/app/_not-found/page.js.nft.json +0 -1
  156. package/dist/runtime/web/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  157. package/dist/runtime/web/.next/server/app/_not-found.html +0 -7
  158. package/dist/runtime/web/.next/server/app/_not-found.meta +0 -8
  159. package/dist/runtime/web/.next/server/app/_not-found.rsc +0 -22
  160. package/dist/runtime/web/.next/server/app/api/health/route.js +0 -1
  161. package/dist/runtime/web/.next/server/app/api/health/route.js.nft.json +0 -1
  162. package/dist/runtime/web/.next/server/app/api/health/route_client-reference-manifest.js +0 -1
  163. package/dist/runtime/web/.next/server/app/api/images/[...path]/route.js +0 -1
  164. package/dist/runtime/web/.next/server/app/api/images/[...path]/route.js.nft.json +0 -1
  165. package/dist/runtime/web/.next/server/app/api/images/[...path]/route_client-reference-manifest.js +0 -1
  166. package/dist/runtime/web/.next/server/app/api/upload/route.js +0 -1
  167. package/dist/runtime/web/.next/server/app/api/upload/route.js.nft.json +0 -1
  168. package/dist/runtime/web/.next/server/app/api/upload/route_client-reference-manifest.js +0 -1
  169. package/dist/runtime/web/.next/server/app/index.html +0 -7
  170. package/dist/runtime/web/.next/server/app/index.meta +0 -7
  171. package/dist/runtime/web/.next/server/app/index.rsc +0 -27
  172. package/dist/runtime/web/.next/server/app/page.js +0 -112
  173. package/dist/runtime/web/.next/server/app/page.js.nft.json +0 -1
  174. package/dist/runtime/web/.next/server/app/page_client-reference-manifest.js +0 -1
  175. package/dist/runtime/web/.next/server/app-paths-manifest.json +0 -8
  176. package/dist/runtime/web/.next/server/chunks/210.js +0 -1
  177. package/dist/runtime/web/.next/server/chunks/291.js +0 -18
  178. package/dist/runtime/web/.next/server/chunks/552.js +0 -22
  179. package/dist/runtime/web/.next/server/chunks/780.js +0 -1
  180. package/dist/runtime/web/.next/server/chunks/905.js +0 -6
  181. package/dist/runtime/web/.next/server/chunks/98.js +0 -1
  182. package/dist/runtime/web/.next/server/functions-config-manifest.json +0 -4
  183. package/dist/runtime/web/.next/server/middleware-build-manifest.js +0 -1
  184. package/dist/runtime/web/.next/server/middleware-manifest.json +0 -6
  185. package/dist/runtime/web/.next/server/middleware-react-loadable-manifest.js +0 -1
  186. package/dist/runtime/web/.next/server/next-font-manifest.js +0 -1
  187. package/dist/runtime/web/.next/server/next-font-manifest.json +0 -1
  188. package/dist/runtime/web/.next/server/pages/404.html +0 -7
  189. package/dist/runtime/web/.next/server/pages/500.html +0 -1
  190. package/dist/runtime/web/.next/server/pages/_app.js +0 -1
  191. package/dist/runtime/web/.next/server/pages/_app.js.nft.json +0 -1
  192. package/dist/runtime/web/.next/server/pages/_document.js +0 -1
  193. package/dist/runtime/web/.next/server/pages/_document.js.nft.json +0 -1
  194. package/dist/runtime/web/.next/server/pages/_error.js +0 -19
  195. package/dist/runtime/web/.next/server/pages/_error.js.nft.json +0 -1
  196. package/dist/runtime/web/.next/server/pages-manifest.json +0 -6
  197. package/dist/runtime/web/.next/server/server-reference-manifest.js +0 -1
  198. package/dist/runtime/web/.next/server/server-reference-manifest.json +0 -1
  199. package/dist/runtime/web/.next/server/webpack-runtime.js +0 -1
  200. package/dist/runtime/web/.next/static/LJFZk_8tvKFN_Ee4HqUuM/_buildManifest.js +0 -1
  201. package/dist/runtime/web/.next/static/LJFZk_8tvKFN_Ee4HqUuM/_ssgManifest.js +0 -1
  202. package/dist/runtime/web/.next/static/chunks/05c91ade-7d09b2b280adffd1.js +0 -1
  203. package/dist/runtime/web/.next/static/chunks/201-51bef3fa8c832e2e.js +0 -1
  204. package/dist/runtime/web/.next/static/chunks/524-89747ed9b0294f8a.js +0 -1
  205. package/dist/runtime/web/.next/static/chunks/554-8bec6e9cca6acc67.js +0 -1
  206. package/dist/runtime/web/.next/static/chunks/764.86e9503a69d45a85.js +0 -1
  207. package/dist/runtime/web/.next/static/chunks/7ab4dc20-239138e0ae7af24a.js +0 -1
  208. package/dist/runtime/web/.next/static/chunks/905-342391e3d3a3678f.js +0 -20
  209. package/dist/runtime/web/.next/static/chunks/a8a5ce16-4edea7df2d9b544a.js +0 -79
  210. package/dist/runtime/web/.next/static/chunks/ad74d572-4c1b162e2c15acaa.js +0 -1
  211. package/dist/runtime/web/.next/static/chunks/app/.vibeman/assets/images/[...path]/route-7b752a8641f96c1f.js +0 -1
  212. package/dist/runtime/web/.next/static/chunks/app/_not-found/page-34e66b251c2b5044.js +0 -1
  213. package/dist/runtime/web/.next/static/chunks/app/api/health/route-7b752a8641f96c1f.js +0 -1
  214. package/dist/runtime/web/.next/static/chunks/app/api/images/[...path]/route-7b752a8641f96c1f.js +0 -1
  215. package/dist/runtime/web/.next/static/chunks/app/api/upload/route-7b752a8641f96c1f.js +0 -1
  216. package/dist/runtime/web/.next/static/chunks/app/layout-df9ac93cb02b2385.js +0 -1
  217. package/dist/runtime/web/.next/static/chunks/app/page-6610743f7de5f92a.js +0 -1
  218. package/dist/runtime/web/.next/static/chunks/c25e0690-e9b798b8de667da1.js +0 -1
  219. package/dist/runtime/web/.next/static/chunks/framework-57157ec4d37f64aa.js +0 -1
  220. package/dist/runtime/web/.next/static/chunks/main-app-156cc0c60371bd78.js +0 -1
  221. package/dist/runtime/web/.next/static/chunks/main-df25d367c47b1fec.js +0 -1
  222. package/dist/runtime/web/.next/static/chunks/pages/_app-9f629a5e1131d19f.js +0 -1
  223. package/dist/runtime/web/.next/static/chunks/pages/_error-9238238274c7efcd.js +0 -1
  224. package/dist/runtime/web/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  225. package/dist/runtime/web/.next/static/chunks/webpack-cd50e39b423d1808.js +0 -1
  226. package/dist/runtime/web/.next/static/css/2728291c68f99cb1.css +0 -3
  227. package/dist/runtime/web/.next/static/css/4fbf378a264bd4ea.css +0 -1
  228. package/dist/runtime/web/.next/static/css/521bd69cc298cd1a.css +0 -1
  229. package/dist/runtime/web/.next/static/css/537e22821e101b87.css +0 -1
  230. package/dist/runtime/web/.next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  231. package/dist/runtime/web/.next/static/media/21350d82a1f187e9-s.woff2 +0 -0
  232. package/dist/runtime/web/.next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  233. package/dist/runtime/web/.next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  234. package/dist/runtime/web/.next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  235. package/dist/runtime/web/.next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  236. package/dist/runtime/web/.next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  237. package/dist/runtime/web/package.json +0 -65
  238. package/dist/runtime/web/server.js +0 -44
  239. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1
- export {};
@@ -1,247 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { reduce, computeNextAction, createInitialState } from './workflow-reducer.js';
3
- const defaultConfig = {
4
- autoQualityChecks: true,
5
- requireHumanApproval: true,
6
- aiCodeReview: true,
7
- stepByStepMode: false,
8
- autoCommit: false,
9
- retryPolicy: { maxImplementationAttempts: 3 },
10
- };
11
- function createTestState(overrides = {}) {
12
- const base = createInitialState('wf-test-1', 'task-test-1', defaultConfig);
13
- return { ...base, ...overrides, config: { ...base.config, ...overrides.config } };
14
- }
15
- describe('workflow-reducer', () => {
16
- describe('reduce()', () => {
17
- describe('START event', () => {
18
- it('transitions from draft to implementing', () => {
19
- const state = createTestState({ phase: 'draft' });
20
- const event = { type: 'START' };
21
- const result = reduce(state, event);
22
- expect(result.state.phase).toBe('implementing');
23
- expect(result.effects).toContainEqual({ type: 'EXECUTE_IMPLEMENTATION' });
24
- expect(result.effects).toContainEqual({ type: 'SAVE_WORKFLOW' });
25
- });
26
- it('does nothing if already implementing', () => {
27
- const state = createTestState({ phase: 'implementing' });
28
- const event = { type: 'START' };
29
- const result = reduce(state, event);
30
- expect(result.state.phase).toBe('implementing');
31
- expect(result.effects).toHaveLength(0);
32
- });
33
- });
34
- describe('IMPL_SUCCESS event', () => {
35
- it('transitions from implementing to validating', () => {
36
- const state = createTestState({ phase: 'implementing' });
37
- const event = { type: 'IMPL_SUCCESS', executionId: 'exec-1' };
38
- const result = reduce(state, event);
39
- expect(result.state.phase).toBe('validating');
40
- expect(result.state.executionIds.implementing).toContain('exec-1');
41
- });
42
- it('triggers validation in non-step-by-step mode', () => {
43
- const state = createTestState({ phase: 'implementing' });
44
- const event = { type: 'IMPL_SUCCESS' };
45
- const result = reduce(state, event);
46
- expect(result.effects).toContainEqual({ type: 'EXECUTE_VALIDATION' });
47
- });
48
- it('does not trigger validation in step-by-step mode', () => {
49
- const state = createTestState({
50
- phase: 'implementing',
51
- config: { ...defaultConfig, stepByStepMode: true },
52
- });
53
- const event = { type: 'IMPL_SUCCESS' };
54
- const result = reduce(state, event);
55
- expect(result.effects).not.toContainEqual({ type: 'EXECUTE_VALIDATION' });
56
- });
57
- });
58
- describe('IMPL_FAIL event', () => {
59
- it('retries if under max attempts', () => {
60
- const state = createTestState({
61
- phase: 'implementing',
62
- attempts: { implementing: 0 },
63
- });
64
- const event = { type: 'IMPL_FAIL', error: 'Test error', canRetry: true };
65
- const result = reduce(state, event);
66
- expect(result.state.phase).toBe('implementing');
67
- expect(result.state.attempts.implementing).toBe(1);
68
- expect(result.state.rerunContext?.reason).toBe('Test error');
69
- });
70
- it('fails if max attempts exceeded', () => {
71
- const state = createTestState({
72
- phase: 'implementing',
73
- attempts: { implementing: 2 },
74
- });
75
- const event = { type: 'IMPL_FAIL', error: 'Test error', canRetry: true };
76
- const result = reduce(state, event);
77
- expect(result.state.terminalStatus).toBe('failed');
78
- expect(result.state.error).toBe('Test error');
79
- });
80
- it('fails immediately if canRetry is false', () => {
81
- const state = createTestState({
82
- phase: 'implementing',
83
- attempts: { implementing: 0 },
84
- });
85
- const event = { type: 'IMPL_FAIL', error: 'Test error', canRetry: false };
86
- const result = reduce(state, event);
87
- expect(result.state.terminalStatus).toBe('failed');
88
- });
89
- });
90
- describe('VALID_SUCCESS event', () => {
91
- it('transitions to approved when AI review is enabled', () => {
92
- const state = createTestState({
93
- phase: 'validating',
94
- config: { ...defaultConfig, aiCodeReview: true },
95
- });
96
- const event = {
97
- type: 'VALID_SUCCESS',
98
- results: { overall: true, timestamp: new Date().toISOString(), details: {}, outputs: {} },
99
- };
100
- const result = reduce(state, event);
101
- expect(result.state.phase).toBe('approved');
102
- expect(result.state.qualityResults?.overall).toBe(true);
103
- });
104
- it('transitions to merging when no approval needed', () => {
105
- const state = createTestState({
106
- phase: 'validating',
107
- config: { ...defaultConfig, aiCodeReview: false, requireHumanApproval: false },
108
- });
109
- const event = {
110
- type: 'VALID_SUCCESS',
111
- results: { overall: true, timestamp: new Date().toISOString(), details: {}, outputs: {} },
112
- };
113
- const result = reduce(state, event);
114
- expect(result.state.phase).toBe('merging');
115
- });
116
- });
117
- describe('PAUSE event', () => {
118
- it('sets terminal status to paused from any active phase', () => {
119
- const state = createTestState({ phase: 'implementing' });
120
- const event = { type: 'PAUSE' };
121
- const result = reduce(state, event);
122
- expect(result.state.terminalStatus).toBe('paused');
123
- expect(result.effects).toContainEqual({ type: 'STOP_EXECUTION' });
124
- });
125
- });
126
- describe('RESUME event', () => {
127
- it('clears terminal status and restores phase', () => {
128
- const state = createTestState({
129
- phase: 'implementing',
130
- terminalStatus: 'paused',
131
- });
132
- const event = { type: 'RESUME' };
133
- const result = reduce(state, event);
134
- expect(result.state.terminalStatus).toBeNull();
135
- expect(result.state.phase).toBe('implementing');
136
- });
137
- });
138
- describe('APPROVE event', () => {
139
- it('transitions from approved to merging', () => {
140
- const state = createTestState({ phase: 'approved' });
141
- const event = { type: 'APPROVE' };
142
- const result = reduce(state, event);
143
- expect(result.state.phase).toBe('merging');
144
- });
145
- });
146
- describe('REJECT event', () => {
147
- it('transitions from approved back to implementing', () => {
148
- const state = createTestState({ phase: 'approved' });
149
- const event = { type: 'REJECT', feedback: 'Please fix X' };
150
- const result = reduce(state, event);
151
- expect(result.state.phase).toBe('implementing');
152
- expect(result.state.rerunContext?.feedback).toBe('Please fix X');
153
- });
154
- });
155
- describe('MERGE_SUCCESS event', () => {
156
- it('transitions from merging to done', () => {
157
- const state = createTestState({ phase: 'merging' });
158
- const event = {
159
- type: 'MERGE_SUCCESS',
160
- prUrl: 'https://github.com/pr/1',
161
- prNumber: 1,
162
- };
163
- const result = reduce(state, event);
164
- expect(result.state.phase).toBe('done');
165
- expect(result.state.links.prUrl).toBe('https://github.com/pr/1');
166
- expect(result.state.links.prNumber).toBe(1);
167
- expect(result.state.endTime).toBeDefined();
168
- });
169
- });
170
- describe('RETRY event', () => {
171
- it('returns to implementing from failed state', () => {
172
- const state = createTestState({
173
- phase: 'implementing',
174
- terminalStatus: 'failed',
175
- });
176
- const event = { type: 'RETRY' };
177
- const result = reduce(state, event);
178
- expect(result.state.phase).toBe('implementing');
179
- expect(result.state.terminalStatus).toBeNull();
180
- expect(result.effects).toContainEqual({ type: 'EXECUTE_IMPLEMENTATION' });
181
- });
182
- });
183
- });
184
- describe('computeNextAction()', () => {
185
- it('returns implementing for draft phase', () => {
186
- const state = createTestState({ phase: 'draft' });
187
- const action = computeNextAction(state);
188
- expect(action).toEqual({ action: 'implementing' });
189
- });
190
- it('returns validating for validating phase', () => {
191
- const state = createTestState({ phase: 'validating' });
192
- const action = computeNextAction(state);
193
- expect(action).toEqual({ action: 'validating' });
194
- });
195
- it('returns ai-reviewing for approved phase with aiCodeReview enabled and no result', () => {
196
- const state = createTestState({
197
- phase: 'approved',
198
- config: { ...defaultConfig, aiCodeReview: true },
199
- });
200
- const action = computeNextAction(state);
201
- expect(action).toEqual({ action: 'ai-reviewing' });
202
- });
203
- it('returns awaiting-approval for approved phase with humanApproval required', () => {
204
- const state = createTestState({
205
- phase: 'approved',
206
- config: { ...defaultConfig, aiCodeReview: false, requireHumanApproval: true },
207
- });
208
- const action = computeNextAction(state);
209
- expect(action).toEqual({ action: 'awaiting-approval' });
210
- });
211
- it('returns merging for approved phase without approval requirements', () => {
212
- const state = createTestState({
213
- phase: 'approved',
214
- config: { ...defaultConfig, aiCodeReview: false, requireHumanApproval: false },
215
- });
216
- const action = computeNextAction(state);
217
- expect(action).toEqual({ action: 'merging' });
218
- });
219
- it('returns none for done phase', () => {
220
- const state = createTestState({ phase: 'done' });
221
- const action = computeNextAction(state);
222
- expect(action).toEqual({ action: 'none', reason: 'Workflow completed' });
223
- });
224
- it('returns implementing with feedback for paused state', () => {
225
- const state = createTestState({
226
- phase: 'implementing',
227
- terminalStatus: 'paused',
228
- rerunContext: { reason: 'test', feedback: 'Fix the bug' },
229
- });
230
- const action = computeNextAction(state);
231
- expect(action).toEqual({ action: 'implementing', feedback: 'Fix the bug' });
232
- });
233
- it('returns implementing with error for failed state', () => {
234
- const state = createTestState({
235
- phase: 'implementing',
236
- terminalStatus: 'failed',
237
- failureContext: {
238
- atPhase: 'implementing',
239
- error: 'Build failed',
240
- timestamp: new Date().toISOString(),
241
- },
242
- });
243
- const action = computeNextAction(state);
244
- expect(action).toEqual({ action: 'implementing', feedback: 'Build failed' });
245
- });
246
- });
247
- });