vibeman 0.0.5 → 0.0.6

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 (241) hide show
  1. package/dist/api.js +49 -0
  2. package/dist/cli.js +135 -0
  3. package/dist/ui/index-gnk6rhxs.js +9 -0
  4. package/dist/ui/index.html +10 -0
  5. package/dist/ui/index.js +2 -0
  6. package/package.json +10 -46
  7. package/README.md +0 -12
  8. package/dist/index.js +0 -114
  9. package/dist/runtime/api/.tsbuildinfo +0 -1
  10. package/dist/runtime/api/agent/agent-service.d.ts +0 -229
  11. package/dist/runtime/api/agent/agent-service.js +0 -963
  12. package/dist/runtime/api/agent/ai-providers/amp-cli-provider.d.ts +0 -38
  13. package/dist/runtime/api/agent/ai-providers/amp-cli-provider.js +0 -268
  14. package/dist/runtime/api/agent/ai-providers/claude-code-adapter.d.ts +0 -61
  15. package/dist/runtime/api/agent/ai-providers/claude-code-adapter.js +0 -362
  16. package/dist/runtime/api/agent/ai-providers/codex-cli-provider.d.ts +0 -36
  17. package/dist/runtime/api/agent/ai-providers/codex-cli-provider.js +0 -375
  18. package/dist/runtime/api/agent/ai-providers/gemini-cli-provider.d.ts +0 -24
  19. package/dist/runtime/api/agent/ai-providers/gemini-cli-provider.js +0 -291
  20. package/dist/runtime/api/agent/ai-providers/index.d.ts +0 -9
  21. package/dist/runtime/api/agent/ai-providers/index.js +0 -9
  22. package/dist/runtime/api/agent/ai-providers/types.d.ts +0 -185
  23. package/dist/runtime/api/agent/ai-providers/types.js +0 -5
  24. package/dist/runtime/api/agent/amp-cli-provider.test.d.ts +0 -1
  25. package/dist/runtime/api/agent/amp-cli-provider.test.js +0 -99
  26. package/dist/runtime/api/agent/codex-cli-provider.test.d.ts +0 -1
  27. package/dist/runtime/api/agent/codex-cli-provider.test.js +0 -172
  28. package/dist/runtime/api/agent/core-agent-service.d.ts +0 -119
  29. package/dist/runtime/api/agent/core-agent-service.js +0 -267
  30. package/dist/runtime/api/agent/parsers.d.ts +0 -16
  31. package/dist/runtime/api/agent/parsers.js +0 -308
  32. package/dist/runtime/api/agent/prompt-service.d.ts +0 -30
  33. package/dist/runtime/api/agent/prompt-service.js +0 -452
  34. package/dist/runtime/api/agent/prompt-service.test.d.ts +0 -1
  35. package/dist/runtime/api/agent/prompt-service.test.js +0 -265
  36. package/dist/runtime/api/agent/routing-policy.d.ts +0 -171
  37. package/dist/runtime/api/agent/routing-policy.js +0 -196
  38. package/dist/runtime/api/agent/routing-policy.test.d.ts +0 -1
  39. package/dist/runtime/api/agent/routing-policy.test.js +0 -63
  40. package/dist/runtime/api/api/router-helpers.d.ts +0 -32
  41. package/dist/runtime/api/api/router-helpers.js +0 -31
  42. package/dist/runtime/api/api/routers/ai.d.ts +0 -200
  43. package/dist/runtime/api/api/routers/ai.js +0 -396
  44. package/dist/runtime/api/api/routers/executions.d.ts +0 -93
  45. package/dist/runtime/api/api/routers/executions.js +0 -94
  46. package/dist/runtime/api/api/routers/git.d.ts +0 -45
  47. package/dist/runtime/api/api/routers/git.js +0 -35
  48. package/dist/runtime/api/api/routers/provider-config.d.ts +0 -199
  49. package/dist/runtime/api/api/routers/provider-config.js +0 -252
  50. package/dist/runtime/api/api/routers/settings.d.ts +0 -158
  51. package/dist/runtime/api/api/routers/settings.js +0 -129
  52. package/dist/runtime/api/api/routers/tasks.d.ts +0 -141
  53. package/dist/runtime/api/api/routers/tasks.js +0 -238
  54. package/dist/runtime/api/api/routers/workflows.d.ts +0 -275
  55. package/dist/runtime/api/api/routers/workflows.js +0 -311
  56. package/dist/runtime/api/api/routers/worktrees.d.ts +0 -101
  57. package/dist/runtime/api/api/routers/worktrees.js +0 -80
  58. package/dist/runtime/api/api/trpc.d.ts +0 -118
  59. package/dist/runtime/api/api/trpc.js +0 -34
  60. package/dist/runtime/api/index.d.ts +0 -9
  61. package/dist/runtime/api/index.js +0 -117
  62. package/dist/runtime/api/lib/id-generator.d.ts +0 -70
  63. package/dist/runtime/api/lib/id-generator.js +0 -123
  64. package/dist/runtime/api/lib/local-config.d.ts +0 -335
  65. package/dist/runtime/api/lib/local-config.js +0 -304
  66. package/dist/runtime/api/lib/logger.d.ts +0 -11
  67. package/dist/runtime/api/lib/logger.js +0 -188
  68. package/dist/runtime/api/lib/provider-detection.d.ts +0 -61
  69. package/dist/runtime/api/lib/provider-detection.js +0 -326
  70. package/dist/runtime/api/lib/server/agent-service-singleton.d.ts +0 -6
  71. package/dist/runtime/api/lib/server/agent-service-singleton.js +0 -27
  72. package/dist/runtime/api/lib/server/bootstrap.d.ts +0 -38
  73. package/dist/runtime/api/lib/server/bootstrap.js +0 -197
  74. package/dist/runtime/api/lib/server/git-service-singleton.d.ts +0 -6
  75. package/dist/runtime/api/lib/server/git-service-singleton.js +0 -47
  76. package/dist/runtime/api/lib/server/project-root.d.ts +0 -2
  77. package/dist/runtime/api/lib/server/project-root.js +0 -61
  78. package/dist/runtime/api/lib/server/task-service-singleton.d.ts +0 -7
  79. package/dist/runtime/api/lib/server/task-service-singleton.js +0 -58
  80. package/dist/runtime/api/lib/server/vibeman-info.d.ts +0 -5
  81. package/dist/runtime/api/lib/server/vibeman-info.js +0 -85
  82. package/dist/runtime/api/lib/server/vibing-orchestrator-singleton.d.ts +0 -7
  83. package/dist/runtime/api/lib/server/vibing-orchestrator-singleton.js +0 -57
  84. package/dist/runtime/api/lib/trpc/server.d.ts +0 -965
  85. package/dist/runtime/api/lib/trpc/server.js +0 -11
  86. package/dist/runtime/api/lib/trpc/ws-server.d.ts +0 -8
  87. package/dist/runtime/api/lib/trpc/ws-server.js +0 -33
  88. package/dist/runtime/api/persistence/database-service.d.ts +0 -14
  89. package/dist/runtime/api/persistence/database-service.js +0 -74
  90. package/dist/runtime/api/persistence/execution-log-persistence.d.ts +0 -90
  91. package/dist/runtime/api/persistence/execution-log-persistence.js +0 -426
  92. package/dist/runtime/api/persistence/execution-log-persistence.test.d.ts +0 -1
  93. package/dist/runtime/api/persistence/execution-log-persistence.test.js +0 -170
  94. package/dist/runtime/api/router.d.ts +0 -968
  95. package/dist/runtime/api/router.js +0 -34
  96. package/dist/runtime/api/settings-service.d.ts +0 -110
  97. package/dist/runtime/api/settings-service.js +0 -678
  98. package/dist/runtime/api/tasks/file-watcher.d.ts +0 -23
  99. package/dist/runtime/api/tasks/file-watcher.js +0 -88
  100. package/dist/runtime/api/tasks/task-file-parser.d.ts +0 -14
  101. package/dist/runtime/api/tasks/task-file-parser.js +0 -180
  102. package/dist/runtime/api/tasks/task-service.d.ts +0 -36
  103. package/dist/runtime/api/tasks/task-service.js +0 -173
  104. package/dist/runtime/api/tasks/task-updater.d.ts +0 -62
  105. package/dist/runtime/api/tasks/task-updater.js +0 -260
  106. package/dist/runtime/api/tasks/task-updater.test.d.ts +0 -1
  107. package/dist/runtime/api/tasks/task-updater.test.js +0 -303
  108. package/dist/runtime/api/types/index.d.ts +0 -186
  109. package/dist/runtime/api/types/index.js +0 -1
  110. package/dist/runtime/api/types/settings.d.ts +0 -105
  111. package/dist/runtime/api/types/settings.js +0 -2
  112. package/dist/runtime/api/types.d.ts +0 -2
  113. package/dist/runtime/api/types.js +0 -1
  114. package/dist/runtime/api/utils/env.d.ts +0 -6
  115. package/dist/runtime/api/utils/env.js +0 -12
  116. package/dist/runtime/api/utils/stripNextEnv.d.ts +0 -7
  117. package/dist/runtime/api/utils/stripNextEnv.js +0 -22
  118. package/dist/runtime/api/utils/title-slug.d.ts +0 -6
  119. package/dist/runtime/api/utils/title-slug.js +0 -77
  120. package/dist/runtime/api/utils/url.d.ts +0 -2
  121. package/dist/runtime/api/utils/url.js +0 -19
  122. package/dist/runtime/api/vcs/git-history-service.d.ts +0 -57
  123. package/dist/runtime/api/vcs/git-history-service.js +0 -228
  124. package/dist/runtime/api/vcs/git-service.d.ts +0 -136
  125. package/dist/runtime/api/vcs/git-service.js +0 -307
  126. package/dist/runtime/api/vcs/worktree-service.d.ts +0 -93
  127. package/dist/runtime/api/vcs/worktree-service.js +0 -518
  128. package/dist/runtime/api/vcs/worktree-service.test.d.ts +0 -1
  129. package/dist/runtime/api/vcs/worktree-service.test.js +0 -20
  130. package/dist/runtime/api/workflows/quality-pipeline.d.ts +0 -58
  131. package/dist/runtime/api/workflows/quality-pipeline.js +0 -401
  132. package/dist/runtime/api/workflows/vibing-orchestrator.d.ts +0 -406
  133. package/dist/runtime/api/workflows/vibing-orchestrator.js +0 -2462
  134. package/dist/runtime/api/workflows/workflow-effects.d.ts +0 -45
  135. package/dist/runtime/api/workflows/workflow-effects.js +0 -49
  136. package/dist/runtime/api/workflows/workflow-reconciler.d.ts +0 -65
  137. package/dist/runtime/api/workflows/workflow-reconciler.js +0 -226
  138. package/dist/runtime/api/workflows/workflow-reducer.d.ts +0 -26
  139. package/dist/runtime/api/workflows/workflow-reducer.js +0 -288
  140. package/dist/runtime/api/workflows/workflow-reducer.test.d.ts +0 -1
  141. package/dist/runtime/api/workflows/workflow-reducer.test.js +0 -247
  142. package/dist/runtime/api/workflows/workflow-schema.d.ts +0 -546
  143. package/dist/runtime/api/workflows/workflow-schema.js +0 -256
  144. package/dist/runtime/web/.next/BUILD_ID +0 -1
  145. package/dist/runtime/web/.next/app-build-manifest.json +0 -66
  146. package/dist/runtime/web/.next/app-path-routes-manifest.json +0 -8
  147. package/dist/runtime/web/.next/build-manifest.json +0 -33
  148. package/dist/runtime/web/.next/package.json +0 -1
  149. package/dist/runtime/web/.next/prerender-manifest.json +0 -61
  150. package/dist/runtime/web/.next/react-loadable-manifest.json +0 -8
  151. package/dist/runtime/web/.next/required-server-files.json +0 -334
  152. package/dist/runtime/web/.next/routes-manifest.json +0 -70
  153. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js +0 -1
  154. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js.nft.json +0 -1
  155. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route_client-reference-manifest.js +0 -1
  156. package/dist/runtime/web/.next/server/app/_not-found/page.js +0 -2
  157. package/dist/runtime/web/.next/server/app/_not-found/page.js.nft.json +0 -1
  158. package/dist/runtime/web/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  159. package/dist/runtime/web/.next/server/app/_not-found.html +0 -7
  160. package/dist/runtime/web/.next/server/app/_not-found.meta +0 -8
  161. package/dist/runtime/web/.next/server/app/_not-found.rsc +0 -22
  162. package/dist/runtime/web/.next/server/app/api/health/route.js +0 -1
  163. package/dist/runtime/web/.next/server/app/api/health/route.js.nft.json +0 -1
  164. package/dist/runtime/web/.next/server/app/api/health/route_client-reference-manifest.js +0 -1
  165. package/dist/runtime/web/.next/server/app/api/images/[...path]/route.js +0 -1
  166. package/dist/runtime/web/.next/server/app/api/images/[...path]/route.js.nft.json +0 -1
  167. package/dist/runtime/web/.next/server/app/api/images/[...path]/route_client-reference-manifest.js +0 -1
  168. package/dist/runtime/web/.next/server/app/api/upload/route.js +0 -1
  169. package/dist/runtime/web/.next/server/app/api/upload/route.js.nft.json +0 -1
  170. package/dist/runtime/web/.next/server/app/api/upload/route_client-reference-manifest.js +0 -1
  171. package/dist/runtime/web/.next/server/app/index.html +0 -7
  172. package/dist/runtime/web/.next/server/app/index.meta +0 -7
  173. package/dist/runtime/web/.next/server/app/index.rsc +0 -27
  174. package/dist/runtime/web/.next/server/app/page.js +0 -112
  175. package/dist/runtime/web/.next/server/app/page.js.nft.json +0 -1
  176. package/dist/runtime/web/.next/server/app/page_client-reference-manifest.js +0 -1
  177. package/dist/runtime/web/.next/server/app-paths-manifest.json +0 -8
  178. package/dist/runtime/web/.next/server/chunks/210.js +0 -1
  179. package/dist/runtime/web/.next/server/chunks/291.js +0 -18
  180. package/dist/runtime/web/.next/server/chunks/552.js +0 -22
  181. package/dist/runtime/web/.next/server/chunks/780.js +0 -1
  182. package/dist/runtime/web/.next/server/chunks/905.js +0 -6
  183. package/dist/runtime/web/.next/server/chunks/98.js +0 -1
  184. package/dist/runtime/web/.next/server/functions-config-manifest.json +0 -4
  185. package/dist/runtime/web/.next/server/middleware-build-manifest.js +0 -1
  186. package/dist/runtime/web/.next/server/middleware-manifest.json +0 -6
  187. package/dist/runtime/web/.next/server/middleware-react-loadable-manifest.js +0 -1
  188. package/dist/runtime/web/.next/server/next-font-manifest.js +0 -1
  189. package/dist/runtime/web/.next/server/next-font-manifest.json +0 -1
  190. package/dist/runtime/web/.next/server/pages/404.html +0 -7
  191. package/dist/runtime/web/.next/server/pages/500.html +0 -1
  192. package/dist/runtime/web/.next/server/pages/_app.js +0 -1
  193. package/dist/runtime/web/.next/server/pages/_app.js.nft.json +0 -1
  194. package/dist/runtime/web/.next/server/pages/_document.js +0 -1
  195. package/dist/runtime/web/.next/server/pages/_document.js.nft.json +0 -1
  196. package/dist/runtime/web/.next/server/pages/_error.js +0 -19
  197. package/dist/runtime/web/.next/server/pages/_error.js.nft.json +0 -1
  198. package/dist/runtime/web/.next/server/pages-manifest.json +0 -6
  199. package/dist/runtime/web/.next/server/server-reference-manifest.js +0 -1
  200. package/dist/runtime/web/.next/server/server-reference-manifest.json +0 -1
  201. package/dist/runtime/web/.next/server/webpack-runtime.js +0 -1
  202. package/dist/runtime/web/.next/static/LJFZk_8tvKFN_Ee4HqUuM/_buildManifest.js +0 -1
  203. package/dist/runtime/web/.next/static/LJFZk_8tvKFN_Ee4HqUuM/_ssgManifest.js +0 -1
  204. package/dist/runtime/web/.next/static/chunks/05c91ade-7d09b2b280adffd1.js +0 -1
  205. package/dist/runtime/web/.next/static/chunks/201-51bef3fa8c832e2e.js +0 -1
  206. package/dist/runtime/web/.next/static/chunks/524-89747ed9b0294f8a.js +0 -1
  207. package/dist/runtime/web/.next/static/chunks/554-8bec6e9cca6acc67.js +0 -1
  208. package/dist/runtime/web/.next/static/chunks/764.86e9503a69d45a85.js +0 -1
  209. package/dist/runtime/web/.next/static/chunks/7ab4dc20-239138e0ae7af24a.js +0 -1
  210. package/dist/runtime/web/.next/static/chunks/905-342391e3d3a3678f.js +0 -20
  211. package/dist/runtime/web/.next/static/chunks/a8a5ce16-4edea7df2d9b544a.js +0 -79
  212. package/dist/runtime/web/.next/static/chunks/ad74d572-4c1b162e2c15acaa.js +0 -1
  213. package/dist/runtime/web/.next/static/chunks/app/.vibeman/assets/images/[...path]/route-7b752a8641f96c1f.js +0 -1
  214. package/dist/runtime/web/.next/static/chunks/app/_not-found/page-34e66b251c2b5044.js +0 -1
  215. package/dist/runtime/web/.next/static/chunks/app/api/health/route-7b752a8641f96c1f.js +0 -1
  216. package/dist/runtime/web/.next/static/chunks/app/api/images/[...path]/route-7b752a8641f96c1f.js +0 -1
  217. package/dist/runtime/web/.next/static/chunks/app/api/upload/route-7b752a8641f96c1f.js +0 -1
  218. package/dist/runtime/web/.next/static/chunks/app/layout-df9ac93cb02b2385.js +0 -1
  219. package/dist/runtime/web/.next/static/chunks/app/page-6610743f7de5f92a.js +0 -1
  220. package/dist/runtime/web/.next/static/chunks/c25e0690-e9b798b8de667da1.js +0 -1
  221. package/dist/runtime/web/.next/static/chunks/framework-57157ec4d37f64aa.js +0 -1
  222. package/dist/runtime/web/.next/static/chunks/main-app-156cc0c60371bd78.js +0 -1
  223. package/dist/runtime/web/.next/static/chunks/main-df25d367c47b1fec.js +0 -1
  224. package/dist/runtime/web/.next/static/chunks/pages/_app-9f629a5e1131d19f.js +0 -1
  225. package/dist/runtime/web/.next/static/chunks/pages/_error-9238238274c7efcd.js +0 -1
  226. package/dist/runtime/web/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  227. package/dist/runtime/web/.next/static/chunks/webpack-cd50e39b423d1808.js +0 -1
  228. package/dist/runtime/web/.next/static/css/2728291c68f99cb1.css +0 -3
  229. package/dist/runtime/web/.next/static/css/4fbf378a264bd4ea.css +0 -1
  230. package/dist/runtime/web/.next/static/css/521bd69cc298cd1a.css +0 -1
  231. package/dist/runtime/web/.next/static/css/537e22821e101b87.css +0 -1
  232. package/dist/runtime/web/.next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  233. package/dist/runtime/web/.next/static/media/21350d82a1f187e9-s.woff2 +0 -0
  234. package/dist/runtime/web/.next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  235. package/dist/runtime/web/.next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  236. package/dist/runtime/web/.next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  237. package/dist/runtime/web/.next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  238. package/dist/runtime/web/.next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  239. package/dist/runtime/web/package.json +0 -65
  240. package/dist/runtime/web/server.js +0 -44
  241. 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
- });