vibeman 0.0.3 → 0.0.5

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 (184) hide show
  1. package/dist/index.js +3 -3
  2. package/dist/runtime/api/.tsbuildinfo +1 -1
  3. package/dist/runtime/api/agent/agent-service.d.ts +4 -0
  4. package/dist/runtime/api/agent/agent-service.js +62 -3
  5. package/dist/runtime/api/agent/ai-providers/amp-cli-provider.d.ts +38 -0
  6. package/dist/runtime/api/agent/ai-providers/amp-cli-provider.js +268 -0
  7. package/dist/runtime/api/agent/ai-providers/codex-cli-provider.js +40 -12
  8. package/dist/runtime/api/agent/ai-providers/gemini-cli-provider.d.ts +24 -0
  9. package/dist/runtime/api/agent/ai-providers/gemini-cli-provider.js +291 -0
  10. package/dist/runtime/api/agent/ai-providers/index.d.ts +3 -3
  11. package/dist/runtime/api/agent/ai-providers/index.js +3 -1
  12. package/dist/runtime/api/agent/ai-providers/types.d.ts +5 -2
  13. package/dist/runtime/api/agent/amp-cli-provider.test.d.ts +1 -0
  14. package/dist/runtime/api/agent/amp-cli-provider.test.js +99 -0
  15. package/dist/runtime/api/agent/codex-cli-provider.test.js +10 -8
  16. package/dist/runtime/api/agent/prompt-service.js +108 -105
  17. package/dist/runtime/api/agent/prompt-service.test.js +35 -0
  18. package/dist/runtime/api/agent/routing-policy.d.ts +2 -2
  19. package/dist/runtime/api/agent/routing-policy.test.js +4 -4
  20. package/dist/runtime/api/api/routers/ai.d.ts +3 -3
  21. package/dist/runtime/api/api/routers/executions.d.ts +2 -7
  22. package/dist/runtime/api/api/routers/executions.js +2 -2
  23. package/dist/runtime/api/api/routers/provider-config.d.ts +34 -0
  24. package/dist/runtime/api/api/routers/settings.d.ts +19 -0
  25. package/dist/runtime/api/api/routers/settings.js +16 -0
  26. package/dist/runtime/api/api/routers/tasks.d.ts +9 -9
  27. package/dist/runtime/api/api/routers/workflows.d.ts +12 -12
  28. package/dist/runtime/api/api/routers/worktrees.d.ts +2 -2
  29. package/dist/runtime/api/api/trpc.d.ts +16 -16
  30. package/dist/runtime/api/lib/local-config.d.ts +94 -4
  31. package/dist/runtime/api/lib/local-config.js +16 -0
  32. package/dist/runtime/api/lib/provider-detection.d.ts +2 -0
  33. package/dist/runtime/api/lib/provider-detection.js +83 -1
  34. package/dist/runtime/api/lib/server/vibeman-info.d.ts +5 -0
  35. package/dist/runtime/api/lib/server/vibeman-info.js +85 -0
  36. package/dist/runtime/api/lib/trpc/server.d.ts +63 -33
  37. package/dist/runtime/api/persistence/execution-log-persistence.d.ts +1 -1
  38. package/dist/runtime/api/persistence/execution-log-persistence.js +19 -3
  39. package/dist/runtime/api/router.d.ts +63 -33
  40. package/dist/runtime/api/settings-service.js +31 -14
  41. package/dist/runtime/api/tasks/task-file-parser.d.ts +1 -0
  42. package/dist/runtime/api/tasks/task-file-parser.js +20 -1
  43. package/dist/runtime/api/tasks/task-updater.d.ts +62 -0
  44. package/dist/runtime/api/tasks/task-updater.js +260 -0
  45. package/dist/runtime/api/tasks/task-updater.test.d.ts +1 -0
  46. package/dist/runtime/api/tasks/task-updater.test.js +303 -0
  47. package/dist/runtime/api/types/index.d.ts +1 -1
  48. package/dist/runtime/api/types/settings.d.ts +17 -6
  49. package/dist/runtime/api/vcs/git-service.d.ts +9 -0
  50. package/dist/runtime/api/vcs/git-service.js +23 -0
  51. package/dist/runtime/api/vcs/worktree-service.d.ts +1 -1
  52. package/dist/runtime/api/vcs/worktree-service.js +22 -10
  53. package/dist/runtime/api/workflows/quality-pipeline.js +2 -1
  54. package/dist/runtime/api/workflows/vibing-orchestrator.d.ts +93 -5
  55. package/dist/runtime/api/workflows/vibing-orchestrator.js +774 -203
  56. package/dist/runtime/api/workflows/workflow-effects.d.ts +45 -0
  57. package/dist/runtime/api/workflows/workflow-effects.js +49 -0
  58. package/dist/runtime/api/workflows/workflow-reconciler.d.ts +65 -0
  59. package/dist/runtime/api/workflows/workflow-reconciler.js +226 -0
  60. package/dist/runtime/api/workflows/workflow-reducer.d.ts +26 -0
  61. package/dist/runtime/api/workflows/workflow-reducer.js +288 -0
  62. package/dist/runtime/api/workflows/workflow-reducer.test.d.ts +1 -0
  63. package/dist/runtime/api/workflows/workflow-reducer.test.js +247 -0
  64. package/dist/runtime/api/workflows/workflow-schema.d.ts +546 -0
  65. package/dist/runtime/api/workflows/workflow-schema.js +256 -0
  66. package/dist/runtime/web/.next/BUILD_ID +1 -1
  67. package/dist/runtime/web/.next/app-build-manifest.json +50 -50
  68. package/dist/runtime/web/.next/app-path-routes-manifest.json +1 -1
  69. package/dist/runtime/web/.next/build-manifest.json +14 -14
  70. package/dist/runtime/web/.next/prerender-manifest.json +3 -3
  71. package/dist/runtime/web/.next/react-loadable-manifest.json +2 -33
  72. package/dist/runtime/web/.next/required-server-files.json +5 -5
  73. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js +1 -1
  74. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route.js.nft.json +1 -1
  75. package/dist/runtime/web/.next/server/app/.vibeman/assets/images/[...path]/route_client-reference-manifest.js +1 -1
  76. package/dist/runtime/web/.next/server/app/_not-found/page.js +2 -2
  77. package/dist/runtime/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  78. package/dist/runtime/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  79. package/dist/runtime/web/.next/server/app/_not-found.html +2 -2
  80. package/dist/runtime/web/.next/server/app/_not-found.rsc +12 -12
  81. package/dist/runtime/web/.next/server/app/api/health/route.js +1 -1
  82. package/dist/runtime/web/.next/server/app/api/health/route.js.nft.json +1 -1
  83. package/dist/runtime/web/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  84. package/dist/runtime/web/.next/server/app/api/images/[...path]/route.js +1 -1
  85. package/dist/runtime/web/.next/server/app/api/images/[...path]/route.js.nft.json +1 -1
  86. package/dist/runtime/web/.next/server/app/api/images/[...path]/route_client-reference-manifest.js +1 -1
  87. package/dist/runtime/web/.next/server/app/api/upload/route.js +1 -1
  88. package/dist/runtime/web/.next/server/app/api/upload/route.js.nft.json +1 -1
  89. package/dist/runtime/web/.next/server/app/api/upload/route_client-reference-manifest.js +1 -1
  90. package/dist/runtime/web/.next/server/app/index.html +2 -2
  91. package/dist/runtime/web/.next/server/app/index.rsc +15 -15
  92. package/dist/runtime/web/.next/server/app/page.js +27 -62
  93. package/dist/runtime/web/.next/server/app/page.js.nft.json +1 -1
  94. package/dist/runtime/web/.next/server/app/page_client-reference-manifest.js +1 -1
  95. package/dist/runtime/web/.next/server/app-paths-manifest.json +1 -1
  96. package/dist/runtime/web/.next/server/chunks/210.js +1 -0
  97. package/dist/runtime/web/.next/server/chunks/291.js +18 -0
  98. package/dist/runtime/web/.next/server/chunks/552.js +22 -0
  99. package/dist/runtime/web/.next/server/chunks/780.js +1 -0
  100. package/dist/runtime/web/.next/server/chunks/905.js +6 -0
  101. package/dist/runtime/web/.next/server/chunks/98.js +1 -0
  102. package/dist/runtime/web/.next/server/middleware-build-manifest.js +1 -1
  103. package/dist/runtime/web/.next/server/middleware-react-loadable-manifest.js +1 -1
  104. package/dist/runtime/web/.next/server/pages/404.html +2 -2
  105. package/dist/runtime/web/.next/server/pages/500.html +1 -1
  106. package/dist/runtime/web/.next/server/pages/_app.js +1 -1
  107. package/dist/runtime/web/.next/server/pages/_app.js.nft.json +1 -1
  108. package/dist/runtime/web/.next/server/pages/_document.js +1 -1
  109. package/dist/runtime/web/.next/server/pages/_document.js.nft.json +1 -1
  110. package/dist/runtime/web/.next/server/pages/_error.js +9 -9
  111. package/dist/runtime/web/.next/server/pages/_error.js.nft.json +1 -1
  112. package/dist/runtime/web/.next/server/pages-manifest.json +1 -1
  113. package/dist/runtime/web/.next/server/server-reference-manifest.json +1 -1
  114. package/dist/runtime/web/.next/server/webpack-runtime.js +1 -1
  115. package/dist/runtime/web/.next/static/{5_15u1WQCxN1_eHZpldCv → LJFZk_8tvKFN_Ee4HqUuM}/_buildManifest.js +1 -1
  116. package/dist/runtime/web/.next/static/chunks/05c91ade-7d09b2b280adffd1.js +1 -0
  117. package/dist/runtime/web/.next/static/chunks/201-51bef3fa8c832e2e.js +1 -0
  118. package/dist/runtime/web/.next/static/chunks/524-89747ed9b0294f8a.js +1 -0
  119. package/dist/runtime/web/.next/static/chunks/554-8bec6e9cca6acc67.js +1 -0
  120. package/dist/runtime/web/.next/static/chunks/764.86e9503a69d45a85.js +1 -0
  121. package/dist/runtime/web/.next/static/chunks/{87c73c54-09e1ba5c70e60a51.js → 7ab4dc20-239138e0ae7af24a.js} +1 -1
  122. package/dist/runtime/web/.next/static/chunks/905-342391e3d3a3678f.js +20 -0
  123. package/dist/runtime/web/.next/static/chunks/a8a5ce16-4edea7df2d9b544a.js +79 -0
  124. package/dist/runtime/web/.next/static/chunks/{8bb4d8db-3e2aa02b0a2384b9.js → ad74d572-4c1b162e2c15acaa.js} +1 -1
  125. package/dist/runtime/web/.next/static/chunks/app/.vibeman/assets/images/[...path]/route-7b752a8641f96c1f.js +1 -0
  126. package/dist/runtime/web/.next/static/chunks/app/_not-found/page-34e66b251c2b5044.js +1 -0
  127. package/dist/runtime/web/.next/static/chunks/app/api/health/route-7b752a8641f96c1f.js +1 -0
  128. package/dist/runtime/web/.next/static/chunks/app/api/images/[...path]/route-7b752a8641f96c1f.js +1 -0
  129. package/dist/runtime/web/.next/static/chunks/app/api/upload/route-7b752a8641f96c1f.js +1 -0
  130. package/dist/runtime/web/.next/static/chunks/app/layout-df9ac93cb02b2385.js +1 -0
  131. package/dist/runtime/web/.next/static/chunks/app/page-6610743f7de5f92a.js +1 -0
  132. package/dist/runtime/web/.next/static/chunks/c25e0690-e9b798b8de667da1.js +1 -0
  133. package/dist/runtime/web/.next/static/chunks/framework-57157ec4d37f64aa.js +1 -0
  134. package/dist/runtime/web/.next/static/chunks/main-app-156cc0c60371bd78.js +1 -0
  135. package/dist/runtime/web/.next/static/chunks/main-df25d367c47b1fec.js +1 -0
  136. package/dist/runtime/web/.next/static/chunks/pages/_app-9f629a5e1131d19f.js +1 -0
  137. package/dist/runtime/web/.next/static/chunks/pages/_error-9238238274c7efcd.js +1 -0
  138. package/dist/runtime/web/.next/static/chunks/webpack-cd50e39b423d1808.js +1 -0
  139. package/dist/runtime/web/.next/static/css/4fbf378a264bd4ea.css +1 -0
  140. package/dist/runtime/web/package.json +8 -8
  141. package/dist/runtime/web/server.js +1 -1
  142. package/dist/tsconfig.tsbuildinfo +1 -1
  143. package/package.json +3 -37
  144. package/dist/runtime/api/lib/trpc/client.d.ts +0 -1
  145. package/dist/runtime/api/lib/trpc/client.js +0 -5
  146. package/dist/runtime/web/.next/server/chunks/217.js +0 -1
  147. package/dist/runtime/web/.next/server/chunks/383.js +0 -6
  148. package/dist/runtime/web/.next/server/chunks/458.js +0 -1
  149. package/dist/runtime/web/.next/server/chunks/576.js +0 -18
  150. package/dist/runtime/web/.next/server/chunks/635.js +0 -22
  151. package/dist/runtime/web/.next/server/chunks/761.js +0 -1
  152. package/dist/runtime/web/.next/server/chunks/777.js +0 -3
  153. package/dist/runtime/web/.next/server/chunks/825.js +0 -1
  154. package/dist/runtime/web/.next/server/chunks/838.js +0 -1
  155. package/dist/runtime/web/.next/server/chunks/973.js +0 -15
  156. package/dist/runtime/web/.next/static/chunks/18-15c10d3288afef2e.js +0 -1
  157. package/dist/runtime/web/.next/static/chunks/1c0ca389.537bbe362e3ffbd9.js +0 -3
  158. package/dist/runtime/web/.next/static/chunks/22747d63-ad5da0c19f4cfe41.js +0 -71
  159. package/dist/runtime/web/.next/static/chunks/355.056c2645878a799a.js +0 -1
  160. package/dist/runtime/web/.next/static/chunks/420.a5ccf151c9e2b2f1.js +0 -1
  161. package/dist/runtime/web/.next/static/chunks/439.1be0c6242fd248d5.js +0 -15
  162. package/dist/runtime/web/.next/static/chunks/440.c52e7c0f797e22b2.js +0 -1
  163. package/dist/runtime/web/.next/static/chunks/575-e2478287c27da87b.js +0 -1
  164. package/dist/runtime/web/.next/static/chunks/691.920d88c115087314.js +0 -1
  165. package/dist/runtime/web/.next/static/chunks/765-e838910065b50c3d.js +0 -1
  166. package/dist/runtime/web/.next/static/chunks/823-6f371a6e829adbba.js +0 -63
  167. package/dist/runtime/web/.next/static/chunks/891cff7f.0f71fc028f87e683.js +0 -1
  168. package/dist/runtime/web/.next/static/chunks/9af238c7-271a911d4e99ab18.js +0 -1
  169. package/dist/runtime/web/.next/static/chunks/app/.vibeman/assets/images/[...path]/route-751c9265a65409e5.js +0 -1
  170. package/dist/runtime/web/.next/static/chunks/app/_not-found/page-1cb74d1cba27d0ab.js +0 -1
  171. package/dist/runtime/web/.next/static/chunks/app/api/health/route-751c9265a65409e5.js +0 -1
  172. package/dist/runtime/web/.next/static/chunks/app/api/images/[...path]/route-751c9265a65409e5.js +0 -1
  173. package/dist/runtime/web/.next/static/chunks/app/api/upload/route-751c9265a65409e5.js +0 -1
  174. package/dist/runtime/web/.next/static/chunks/app/layout-8435322f09fd0975.js +0 -1
  175. package/dist/runtime/web/.next/static/chunks/app/page-9fe7d75095b4ccec.js +0 -1
  176. package/dist/runtime/web/.next/static/chunks/cac567b0-5b77dd12911823cd.js +0 -1
  177. package/dist/runtime/web/.next/static/chunks/framework-2518f1345b5b2806.js +0 -1
  178. package/dist/runtime/web/.next/static/chunks/main-17665e5e39de9a8a.js +0 -1
  179. package/dist/runtime/web/.next/static/chunks/main-app-c0b0f5ba4f7f9d75.js +0 -1
  180. package/dist/runtime/web/.next/static/chunks/pages/_app-d6f6b3bbc3d81ee1.js +0 -1
  181. package/dist/runtime/web/.next/static/chunks/pages/_error-75a96cf1997cc3b9.js +0 -1
  182. package/dist/runtime/web/.next/static/chunks/webpack-c8de37305b4635cf.js +0 -1
  183. package/dist/runtime/web/.next/static/css/08c950681f1a9a92.css +0 -1
  184. /package/dist/runtime/web/.next/static/{5_15u1WQCxN1_eHZpldCv → LJFZk_8tvKFN_Ee4HqUuM}/_ssgManifest.js +0 -0
@@ -1,79 +1,60 @@
1
1
  import path from 'path';
2
2
  import fs from 'fs/promises';
3
3
  import { log } from '../lib/logger.js';
4
- import { getVibeDir } from '../lib/server/project-root.js';
4
+ import { getProjectRoot, getVibeDir } from '../lib/server/project-root.js';
5
5
  // -----------------------------
6
6
  // Prompt templates (hard-coded)
7
7
  // -----------------------------
8
- const IMPROVEMENT_TEMPLATE = `The current content might be a brief description or incomplete specification. Transform it into a comprehensive, well-structured task specification using advanced reasoning.
8
+ const IMPROVEMENT_TEMPLATE = `Streamline the task spec below so it is easy to execute and maintain.
9
9
 
10
- ## Analysis Framework
10
+ ## Guidance
11
11
 
12
- First, conduct a thorough analysis:
12
+ - **IMPORTANT: Detect the language of the task content provided and respond in that SAME language for all markdown sections.** Keep enum fields (type, priority) in English, but write all descriptive content (Description, Technical Details, Implementation Notes, etc.) in the detected language.
13
+ - Judge complexity first: keep the spec compact when the work is straightforward; elaborate only when multiple systems or risks require extra direction.
14
+ - Drop low-value detail (exact file names, functions, or boilerplate such as "run tests").
15
+ - Keep every section action-focused and only include information that will change how the work is done.
13
16
 
14
- 1. **Current State Assessment**: Analyze the existing task content for clarity, completeness, and specificity
15
- 2. **Type Classification**: Evaluate if the current type ({{taskType}}) aligns with the actual work required:
16
- - **feature**: New functionality or capabilities
17
- - **bug**: Fixing defects or issues
18
- - **chore**: Maintenance, dependencies, tooling
19
- - **refactor**: Code improvement without behavior change
20
- - **test**: Adding or improving tests
21
- - **doc**: Documentation updates
17
+ If type or priority should change, surface the recommendation before the content:
18
+ **Type**: [new type with a brief reason, omit if unchanged]
19
+ **Priority**: [new priority with a brief reason, omit if unchanged]
22
20
 
23
- 3. **Priority Assessment**: Evaluate if the current priority ({{taskPriority}}) reflects the business impact and urgency:
24
- - **high**: Critical, blocking, or high business value
25
- - **medium**: Important but not urgent, moderate impact
26
- - **low**: Nice to have, minor improvements
21
+ ## Response Format
27
22
 
28
- 4. **Scope and Complexity Analysis**: Determine if the task is appropriately sized and scoped
23
+ Return JSON with:
24
+ - "type": feature | bug | chore | refactor | test | doc
25
+ - "priority": high | medium | low
26
+ - "title": optional concise title
27
+ - "content": markdown that follows the layout below (omit a leading H1 when a title is provided)
29
28
 
30
- If you recommend changes to type or priority, include them at the top of your response:
31
- **Type**: [recommended type with brief reasoning]
32
- **Priority**: [recommended priority with brief reasoning]
29
+ ## Markdown Layout
33
30
 
34
- ### Expected Content Format:
31
+ Use clear, economical language in this order.
35
32
 
36
- #### Description
37
- [Provide a clear, detailed description of what needs to be accomplished]
33
+ <TaskContentTemplate>
38
34
 
39
- #### Acceptance Criteria
40
- - [ ] [Specific, testable criterion 1]
41
- - [ ] [Specific, testable criterion 2]
42
- - [ ] [Specific, testable criterion 3]
43
- [Add more as needed]
35
+ ## Description
36
+ [Outcome in plain language. Keep it short when the task is simple.]
37
+ ## Technical Details
38
+ [Only the essential constraints, integrations, or dependencies.]
44
39
 
45
- #### Technical Details
46
- [Include implementation considerations, architecture notes, dependencies, etc.]
40
+ ## Implementation Notes
41
+ [Key tactics, risks, or decisions to highlight.]
47
42
 
48
- #### Implementation Notes
49
- [Any specific guidance, patterns to follow, potential challenges, etc.]
50
- [Split into smaller tasks and todo items if needed]
43
+ ## Recommended Steps
44
+ - Step 1
45
+ - [ ] TODO
46
+ - [ ] TODO
47
+ - Step 2
48
+ - [ ] TODO
49
+ (Provide 2-5 steps total, each with 1-3 TODO checkboxes.)
51
50
 
52
- ## Advanced Improvement Guidelines:
51
+ ## Acceptance Criteria
52
+ - [ ] Concise, verifiable results. Keep the list short but complete.
53
53
 
54
- 1. **Precision & Clarity**: Transform vague requirements into concrete, measurable, actionable items with clear success criteria
55
- 2. **Technical Depth**: Consider implementation complexity, architecture implications, and technical dependencies
56
- 3. **Project Alignment**: Ensure the task fits within the existing codebase architecture and follows established patterns
57
- 4. **Quality Assurance**: Include comprehensive testing strategies, edge cases, and validation approaches
58
- 5. **Risk Assessment**: Identify potential challenges, blockers, and mitigation strategies
59
- 6. **Cross-functional Impact**: Consider effects on other systems, teams, or user experiences
60
- 7. **Scalability & Performance**: Include considerations for performance, scalability, and maintainability
61
- 8. **Documentation**: Ensure adequate documentation and knowledge transfer requirements
62
- 9. **Scope Optimization**: Balance completeness with manageable task size for effective execution
63
- 10. **Context Preservation**: Maintain original intent while significantly enhancing detail and clarity
64
- 11. **Standards Compliance**: Follow GitHub Flavored Markdown specification and project conventions
65
- 12. **Asset Preservation**: Retain any images, diagrams, or other media from the original content
66
- 13. **Simple and focus**: Keep the task simple, don't make it too complex and over design, focus on the core functionality and core business logic
54
+ ## Implementation Summary
55
+ [Brief, auto-generated summary of changes.]
67
56
 
68
- ## Expected Output Structure
69
-
70
- Return a JSON object with:
71
- - "type": one of [feature, bug, chore, refactor, test, doc]
72
- - "priority": one of [high, medium, low]
73
- - "title": a concise, descriptive title for the task (optional, but preferred)
74
- - "content": the improved task specification in markdown format with proper JSON escaping
75
-
76
- If you include a title in the JSON response, do NOT include an H1 heading at the beginning of the content field to avoid duplication.
57
+ </TaskContentTemplate>
77
58
 
78
59
  ## Project Context
79
60
 
@@ -81,12 +62,13 @@ If you include a title in the JSON response, do NOT include an H1 heading at the
81
62
  {{projectContext}}
82
63
  </ProjectContext>
83
64
 
84
- ## Current Task Details
65
+ ## Current Task
66
+
85
67
  - **ID:** {{taskId}}
86
- - **Title:** {{taskTitle}}
87
- - **Type:** {{taskType}}
88
- - **Priority:** {{taskPriority}}
89
- - **Status:** {{taskStatus}}
68
+ - **Title:** {{taskTitle}}
69
+ - **Type:** {{taskType}}
70
+ - **Priority:** {{taskPriority}}
71
+ - **Status:** {{taskStatus}}
90
72
 
91
73
  ## Content to Improve
92
74
 
@@ -94,43 +76,24 @@ If you include a title in the JSON response, do NOT include an H1 heading at the
94
76
  {{taskContent}}
95
77
  </CurrentTaskContent>
96
78
  `;
97
- const TASK_TEMPLATE = `## Task Assignment
79
+ const TASK_TEMPLATE = `## Task Brief
98
80
 
99
- Deliver the following task.
81
+ Deliver the task by following the specification exactly as written.
100
82
 
101
83
  ## Workflow Instructions
102
84
 
103
85
  {{workflowInstructions}}
104
86
 
105
- ## Responsibilities
87
+ ## How to Work
106
88
 
107
- 1. **Analyze requirements** — study the acceptance criteria to clarify what must be delivered.
108
- 2. **Review the codebase** understand the current implementation, architecture, and coding patterns.
109
- 3. **Implement changes** add or modify code according to project conventions.
110
- 4. **Test thoroughly** write/run tests and verify that all builds succeed.
111
- 5. **Update the task file** tick off each acceptance criterion that you have completed.
112
-
113
- ## Development Guidelines
114
-
115
- - Respect existing architecture and style conventions.
116
- - Add robust error handling.
117
- - Update documentation when necessary.
118
- - Ensure all tests pass and the project builds cleanly.
119
- - Commit with a clear, descriptive message.
120
- - Create todo list to track the progress.
121
-
122
- ## Expected Deliverables
123
-
124
- - A working implementation that satisfies every requirement.
125
- - An updated task file showing completed acceptance criteria.
126
- - Clean, well-documented code.
127
- - Passing build and test results.
128
-
129
- Begin by examining the codebase; then proceed with the implementation.
130
-
131
- ---
89
+ - Start with the **Description** to internalize the expected outcome.
90
+ - Apply every constraint under **Technical Details**.
91
+ - Review **Implementation Notes** for callouts, risks, or decisions you must honor.
92
+ - Work through each group in **Recommended Steps**, checking off the TODO boxes inside the task file as you complete them.
93
+ - Do not mark the task complete until every **Acceptance Criterion** is satisfied and verified.
94
+ - Think independently and do not just rely on the task file to guide your work. You can update the task file as you work.
132
95
 
133
- ### Task Snapshot
96
+ ## Task Reference
134
97
 
135
98
  - **ID:** {{taskId}}
136
99
  - **Title:** {{taskTitle}}
@@ -138,29 +101,58 @@ Begin by examining the codebase; then proceed with the implementation.
138
101
  - **Priority:** {{taskPriority}}
139
102
  - **Status:** {{taskStatus}}
140
103
  - **Tags:** {{tagsList}}
141
-
142
104
  {{taskFilePathInfo}}
143
105
 
144
- #### Description
106
+ ## Task Specification
145
107
 
146
108
  {{taskContent}}
147
109
 
148
110
  `;
149
- const MERGE_TEMPLATE = `Goal: Merge feature branch into base without pushing to remote. Resolve conflicts safely.
111
+ const MERGE_TEMPLATE = `Goal: Merge feature branch into base branch in the main repo. Do NOT push to remote.
150
112
 
151
- Context:
113
+ ## Context
152
114
 
153
- - Repo: {{repoPath}}
115
+ - Main Repo: {{repoPath}}
154
116
  - Worktree: {{worktreePath}}
155
117
  - Feature branch: {{featureBranch}}
156
118
  - Base branch: {{baseBranch}}
157
119
 
158
- If conflicts:
120
+ ## CRITICAL INSTRUCTIONS
121
+
122
+ 1. **Do NOT run formatters, linters, or builds**
123
+ 2. **Always use \`--no-verify\` flag** to skip pre-commit hooks
124
+ 3. **Handle any uncommitted changes in main repo first**
125
+
126
+ ## Steps
127
+
128
+ \`\`\`bash
129
+ cd {{repoPath}}
130
+
131
+ # Step 1: Stash any uncommitted changes in main repo
132
+ git stash --include-untracked || true
133
+
134
+ # Step 2: Checkout base branch and update
135
+ git checkout {{baseBranch}}
136
+ git fetch origin {{baseBranch}}
137
+ git reset --hard origin/{{baseBranch}}
138
+
139
+ # Step 3: Merge feature branch into base
140
+ git merge {{featureBranch}} --no-ff --no-verify -m "Merge branch '{{featureBranch}}' into {{baseBranch}}"
159
141
 
160
- - Prefer {{featureBranch}} when changes are clearly additive or isolated.
161
- - Keep {{baseBranch}} when it contains newer logic that would be overwritten.
162
- - Integrate both sides when needed.
163
- - After each file: git add <file>
142
+ # Step 4: Restore stashed changes if any
143
+ git stash pop || true
144
+ \`\`\`
145
+
146
+ If conflicts occur during merge:
147
+ - Prefer {{featureBranch}} when changes are clearly additive
148
+ - Keep {{baseBranch}} when it contains newer logic
149
+ - After resolving: \`git add <file>\` then \`git commit --no-verify\`
150
+
151
+ ## Output Format
152
+
153
+ At the end, output exactly one of:
154
+ - MERGE_STATUS: SUCCESS
155
+ - MERGE_STATUS: FAILED
164
156
  `;
165
157
  const REVIEW_TEMPLATE = `## Code Review Task
166
158
 
@@ -295,20 +287,31 @@ export class PromptService {
295
287
  }
296
288
  async generateImprovementPrompt(task, taskData) {
297
289
  // Read project context
298
- const productOverviewPath = path.join(getVibeDir(), 'product_overview.md');
299
- let productContext = '';
290
+ const contextSections = [];
291
+ const vibeDir = getVibeDir();
292
+ const productOverviewPath = path.join(vibeDir, 'product_overview.md');
293
+ try {
294
+ await fs.access(productOverviewPath, fs.constants.F_OK);
295
+ contextSections.push(`**Product overview file:** ${productOverviewPath}\nReference this for additional product context.`);
296
+ }
297
+ catch {
298
+ log.warn('Could not read product_overview.md for improvement prompt, something went wrong with initialization', undefined, 'prompt-service');
299
+ }
300
+ const readmePath = path.join(getProjectRoot(), 'README.md');
300
301
  try {
301
- productContext = await fs.readFile(productOverviewPath, 'utf-8');
302
+ await fs.access(readmePath, fs.constants.F_OK);
303
+ contextSections.push(`**Repository README:** ${readmePath}\nReview this if you need additional project context.`);
302
304
  }
303
305
  catch {
304
- log.warn('Could not read product_overview.md for improvement prompt', undefined, 'prompt-service');
306
+ log.info('README.md not found when building improvement prompt context', { readmePath }, 'prompt-service');
305
307
  }
306
308
  // Add task file path to project context for improvement prompts
307
309
  const taskFilePath = this.generateTaskFilePath(task.id);
308
310
  if (taskFilePath && (await this.validateTaskFile(taskFilePath))) {
309
- productContext += `\n\n**Current task file location:** ${taskFilePath}`;
311
+ contextSections.push(`**Current task file location:** ${taskFilePath}`);
310
312
  log.info(`Task file path included in improvement prompt`, { taskId: task.id, path: taskFilePath }, 'prompt-service');
311
313
  }
314
+ const productContext = contextSections.join('\n\n');
312
315
  return render(IMPROVEMENT_TEMPLATE, {
313
316
  projectContext: productContext,
314
317
  taskId: task.id,
@@ -131,14 +131,49 @@ Test task content`;
131
131
  priority: 'high',
132
132
  content: 'Improved content',
133
133
  };
134
+ const productOverviewPath = path.join(TEST_DATA_DIR, 'product_overview.md');
135
+ const readmePath = path.join(TEST_DATA_DIR, 'README.md');
136
+ await fs.writeFile(productOverviewPath, 'Existing product overview content for context.', 'utf-8');
137
+ await fs.writeFile(readmePath, '# Workspace README\n', 'utf-8');
134
138
  // Create task file
135
139
  const taskFilePath = path.join(TEST_TASKS_DIR, 'IMPROVE-TASK-001.md');
136
140
  await fs.writeFile(taskFilePath, 'Task file content', 'utf-8');
137
141
  const prompt = await promptService.generateImprovementPrompt(mockTask, taskData);
142
+ expect(prompt).not.toContain('Existing product overview content for context.');
143
+ expect(prompt).toContain(`**Product overview file:** ${productOverviewPath}`);
144
+ expect(prompt).toContain('Reference this for additional product context.');
145
+ expect(prompt).toContain(`**Repository README:** ${readmePath}`);
146
+ expect(prompt).toContain('Review this if you need additional project context.');
138
147
  expect(prompt).toContain('Current task file location:');
139
148
  expect(prompt).toContain(taskFilePath);
140
149
  expect(prompt).toContain('IMPROVE-TASK-001');
141
150
  });
151
+ it('should include language preservation instructions in the prompt', async () => {
152
+ const mockTask = {
153
+ id: 'LANG-TEST-001',
154
+ title: 'Language Test Task',
155
+ type: 'feature',
156
+ status: 'backlog',
157
+ priority: 'medium',
158
+ tags: [],
159
+ content: 'Test content in any language',
160
+ created_at: '2024-09-04T12:00:00.000Z',
161
+ updated_at: '2024-09-04T12:00:00.000Z',
162
+ assignee: [],
163
+ comments: [],
164
+ };
165
+ const taskData = {
166
+ title: 'Tarea de prueba de idioma',
167
+ type: 'feature',
168
+ priority: 'high',
169
+ content: 'Contenido de prueba en español',
170
+ };
171
+ const prompt = await promptService.generateImprovementPrompt(mockTask, taskData);
172
+ // Verify the prompt contains language preservation instructions
173
+ expect(prompt).toContain('Detect the language of the task content');
174
+ expect(prompt).toContain('respond in that SAME language');
175
+ expect(prompt).toContain('Keep enum fields (type, priority) in English');
176
+ });
142
177
  });
143
178
  describe('generateReviewPrompt', () => {
144
179
  it('should include task file path in additional context', async () => {
@@ -108,7 +108,7 @@ export declare const RoutingPolicySchema: z.ZodObject<{
108
108
  }>>>;
109
109
  }, "strip", z.ZodTypeAny, {
110
110
  defaultProvider: string;
111
- operations?: Partial<Record<"execute_task" | "quality_checks" | "improve_task" | "ai_merge" | "ai_codereview", {
111
+ operations?: Partial<Record<"execute_task" | "quality_checks" | "ai_codereview" | "ai_merge" | "improve_task", {
112
112
  provider: string;
113
113
  options?: {
114
114
  temperature?: number | undefined;
@@ -120,7 +120,7 @@ export declare const RoutingPolicySchema: z.ZodObject<{
120
120
  }>> | undefined;
121
121
  }, {
122
122
  defaultProvider: string;
123
- operations?: Partial<Record<"execute_task" | "quality_checks" | "improve_task" | "ai_merge" | "ai_codereview", {
123
+ operations?: Partial<Record<"execute_task" | "quality_checks" | "ai_codereview" | "ai_merge" | "improve_task", {
124
124
  provider: string;
125
125
  options?: {
126
126
  temperature?: number | undefined;
@@ -38,12 +38,12 @@ describe('RoutingPolicyManager resolve precedence', () => {
38
38
  const rpm = new RoutingPolicyManager();
39
39
  await rpm.updatePolicy({
40
40
  operations: {
41
- ai_merge: { provider: 'codex', model: 'gpt-5' },
41
+ ai_merge: { provider: 'codex', model: 'gpt-5.1-codex' },
42
42
  },
43
43
  });
44
44
  const resolved = await rpm.resolveProviderForOperation('ai_merge');
45
45
  expect(resolved.provider).toBe('codex');
46
- expect(resolved.model).toBe('gpt-5');
46
+ expect(resolved.model).toBe('gpt-5.1-codex');
47
47
  });
48
48
  it('when override sets provider without model, does not inherit mismatched model', async () => {
49
49
  const rpm = new RoutingPolicyManager();
@@ -55,9 +55,9 @@ describe('RoutingPolicyManager resolve precedence', () => {
55
55
  });
56
56
  it('override with provider+model takes full precedence', async () => {
57
57
  const rpm = new RoutingPolicyManager();
58
- const override = { provider: 'codex', model: 'gpt-5' };
58
+ const override = { provider: 'codex', model: 'gpt-5.1-codex' };
59
59
  const resolved = await rpm.resolveProviderForOperation('execute_task', override);
60
60
  expect(resolved.provider).toBe('codex');
61
- expect(resolved.model).toBe('gpt-5');
61
+ expect(resolved.model).toBe('gpt-5.1-codex');
62
62
  });
63
63
  });
@@ -42,7 +42,7 @@ export declare function buildAIRoutes(options: {
42
42
  input: void;
43
43
  output: {
44
44
  defaultProvider: string;
45
- operations?: Partial<Record<"execute_task" | "quality_checks" | "improve_task" | "ai_merge" | "ai_codereview", {
45
+ operations?: Partial<Record<"execute_task" | "quality_checks" | "ai_codereview" | "ai_merge" | "improve_task", {
46
46
  provider: string;
47
47
  options?: {
48
48
  temperature?: number | undefined;
@@ -62,7 +62,7 @@ export declare function buildAIRoutes(options: {
62
62
  input: {
63
63
  policy: {
64
64
  defaultProvider?: string | undefined;
65
- operations?: Partial<Record<"execute_task" | "quality_checks" | "improve_task" | "ai_merge" | "ai_codereview", {
65
+ operations?: Partial<Record<"execute_task" | "quality_checks" | "ai_codereview" | "ai_merge" | "improve_task", {
66
66
  provider: string;
67
67
  options?: {
68
68
  temperature?: number | undefined;
@@ -98,7 +98,6 @@ export declare function buildAIRoutes(options: {
98
98
  */
99
99
  setOperationConfig: import("@trpc/server").TRPCMutationProcedure<{
100
100
  input: {
101
- operation: "execute_task" | "quality_checks" | "improve_task" | "ai_merge" | "ai_codereview";
102
101
  config: {
103
102
  provider: string;
104
103
  options?: {
@@ -109,6 +108,7 @@ export declare function buildAIRoutes(options: {
109
108
  model?: string | undefined;
110
109
  fallback?: string[] | undefined;
111
110
  };
111
+ operation: "execute_task" | "quality_checks" | "ai_codereview" | "ai_merge" | "improve_task";
112
112
  };
113
113
  output: {
114
114
  success: boolean;
@@ -65,20 +65,15 @@ export declare function buildExecutionRoutes({ taskService, vibingOrchestrator }
65
65
  }>;
66
66
  readonly improveTask: import("@trpc/server").TRPCMutationProcedure<{
67
67
  input: {
68
- title: string;
69
68
  type: "feature" | "bug" | "chore" | "refactor" | "test" | "doc";
70
69
  priority: "low" | "medium" | "high";
70
+ title: string;
71
71
  content: string;
72
72
  taskId: string;
73
73
  executionId?: string | undefined;
74
74
  };
75
75
  output: {
76
- type: string;
77
- priority: string;
78
- content: string;
79
- title?: string;
80
- executionId: string;
81
- selectedModel?: string;
76
+ readonly executionId: string;
82
77
  };
83
78
  meta: object;
84
79
  }>;
@@ -53,13 +53,13 @@ export function buildExecutionRoutes({ taskService, vibingOrchestrator }) {
53
53
  }))
54
54
  .mutation(async ({ input }) => {
55
55
  assertTaskActive(input.taskId);
56
- const improvement = await vibingOrchestrator.improveTaskContent(input.taskId, {
56
+ const { executionId } = await vibingOrchestrator.startTaskImprovement(input.taskId, {
57
57
  title: input.title,
58
58
  type: input.type,
59
59
  priority: input.priority,
60
60
  content: input.content,
61
61
  }, { executionId: input.executionId });
62
- return improvement;
62
+ return { executionId };
63
63
  }),
64
64
  onExecutionUpdate: publicProcedure
65
65
  .input(z.object({ executionId: z.string() }))
@@ -69,6 +69,18 @@ export declare function buildProviderConfigRoutes(): {
69
69
  lastDetected?: string | undefined;
70
70
  detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
71
71
  } | undefined;
72
+ gemini?: {
73
+ binPath?: string | undefined;
74
+ detectedPath?: string | undefined;
75
+ lastDetected?: string | undefined;
76
+ detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
77
+ } | undefined;
78
+ amp?: {
79
+ binPath?: string | undefined;
80
+ detectedPath?: string | undefined;
81
+ lastDetected?: string | undefined;
82
+ detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
83
+ } | undefined;
72
84
  };
73
85
  path: string;
74
86
  exists: boolean;
@@ -107,6 +119,16 @@ export declare function buildProviderConfigRoutes(): {
107
119
  detectedPath?: string | undefined;
108
120
  lastDetected?: string | undefined;
109
121
  detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
122
+ } | {
123
+ binPath?: string | undefined;
124
+ detectedPath?: string | undefined;
125
+ lastDetected?: string | undefined;
126
+ detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
127
+ } | {
128
+ binPath?: string | undefined;
129
+ detectedPath?: string | undefined;
130
+ lastDetected?: string | undefined;
131
+ detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
110
132
  } | undefined;
111
133
  cached: {
112
134
  available: boolean;
@@ -154,6 +176,18 @@ export declare function buildProviderConfigRouteHandlers(): {
154
176
  lastDetected?: string | undefined;
155
177
  detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
156
178
  } | undefined;
179
+ gemini?: {
180
+ binPath?: string | undefined;
181
+ detectedPath?: string | undefined;
182
+ lastDetected?: string | undefined;
183
+ detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
184
+ } | undefined;
185
+ amp?: {
186
+ binPath?: string | undefined;
187
+ detectedPath?: string | undefined;
188
+ lastDetected?: string | undefined;
189
+ detectionMethod?: "explicit" | "PATH" | "common-location" | undefined;
190
+ } | undefined;
157
191
  };
158
192
  path: string;
159
193
  exists: boolean;
@@ -2,6 +2,25 @@
2
2
  * tRPC routes for settings management
3
3
  */
4
4
  export declare function buildSettingsRoutes(): {
5
+ /**
6
+ * Get current project information
7
+ */
8
+ getProjectInfo: import("@trpc/server").TRPCQueryProcedure<{
9
+ input: void;
10
+ output: {
11
+ name: string;
12
+ path: string;
13
+ };
14
+ meta: object;
15
+ }>;
16
+ /**
17
+ * Get Vibeman application information
18
+ */
19
+ getVibemanInfo: import("@trpc/server").TRPCQueryProcedure<{
20
+ input: void;
21
+ output: import("../../lib/server/vibeman-info.js").VibemanInfo;
22
+ meta: object;
23
+ }>;
5
24
  /**
6
25
  * Get current settings
7
26
  */
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * tRPC routes for settings management
3
3
  */
4
+ import path from 'path';
4
5
  import { z } from 'zod';
5
6
  import { publicProcedure } from '../trpc.js';
6
7
  import { getSettingsService } from '../../settings-service.js';
7
8
  import { QualityPipeline } from '../../workflows/quality-pipeline.js';
8
9
  import { getProjectRoot } from '../../lib/server/project-root.js';
10
+ import { getVibemanInfo } from '../../lib/server/vibeman-info.js';
9
11
  // Input validation schemas
10
12
  const UpdateSettingsInputSchema = z.array(z.object({
11
13
  path: z.array(z.string().min(1)),
@@ -16,6 +18,20 @@ export function buildSettingsRoutes() {
16
18
  // Initialize settings service on first router build
17
19
  settingsService.initialize().catch(console.error);
18
20
  return {
21
+ /**
22
+ * Get current project information
23
+ */
24
+ getProjectInfo: publicProcedure.query(async () => {
25
+ const root = getProjectRoot();
26
+ const name = path.basename(root);
27
+ return { name, path: root };
28
+ }),
29
+ /**
30
+ * Get Vibeman application information
31
+ */
32
+ getVibemanInfo: publicProcedure.query(async () => {
33
+ return getVibemanInfo();
34
+ }),
19
35
  /**
20
36
  * Get current settings
21
37
  */
@@ -3,11 +3,11 @@ import type { GitService } from '../../vcs/git-service.js';
3
3
  export declare function buildTaskRoutes(taskService: TaskService, gitService?: GitService): {
4
4
  readonly listTasks: import("@trpc/server").TRPCQueryProcedure<{
5
5
  input: {
6
- status?: "review" | "in-progress" | "backlog" | "done" | undefined;
7
6
  type?: "feature" | "bug" | "chore" | "refactor" | "test" | "doc" | undefined;
8
- tags?: string[] | undefined;
7
+ status?: "backlog" | "in-progress" | "review" | "done" | undefined;
9
8
  priority?: "low" | "medium" | "high" | undefined;
10
9
  search?: string | undefined;
10
+ tags?: string[] | undefined;
11
11
  includeDeleted?: boolean | undefined;
12
12
  onlyDeleted?: boolean | undefined;
13
13
  } | undefined;
@@ -23,15 +23,15 @@ export declare function buildTaskRoutes(taskService: TaskService, gitService?: G
23
23
  }>;
24
24
  readonly createTask: import("@trpc/server").TRPCMutationProcedure<{
25
25
  input: {
26
- title: string;
27
26
  type: "feature" | "bug" | "chore" | "refactor" | "test" | "doc";
27
+ title: string;
28
28
  content: string;
29
- status?: "review" | "in-progress" | "backlog" | "done" | undefined;
29
+ status?: "backlog" | "in-progress" | "review" | "done" | undefined;
30
+ priority?: "low" | "medium" | "high" | undefined;
30
31
  id?: string | undefined;
31
32
  tags?: string[] | undefined;
32
33
  due_date?: string | undefined;
33
34
  assignee?: string[] | undefined;
34
- priority?: "low" | "medium" | "high" | undefined;
35
35
  comments?: string[] | undefined;
36
36
  };
37
37
  output: import("../../types/index.js").Task;
@@ -40,13 +40,13 @@ export declare function buildTaskRoutes(taskService: TaskService, gitService?: G
40
40
  readonly updateTask: import("@trpc/server").TRPCMutationProcedure<{
41
41
  input: {
42
42
  id: string;
43
- status?: "review" | "in-progress" | "backlog" | "done" | undefined;
44
- title?: string | undefined;
45
43
  type?: "feature" | "bug" | "chore" | "refactor" | "test" | "doc" | undefined;
44
+ status?: "backlog" | "in-progress" | "review" | "done" | undefined;
45
+ priority?: "low" | "medium" | "high" | undefined;
46
+ title?: string | undefined;
46
47
  tags?: string[] | undefined;
47
48
  due_date?: string | undefined;
48
49
  assignee?: string[] | undefined;
49
- priority?: "low" | "medium" | "high" | undefined;
50
50
  comments?: string[] | undefined;
51
51
  content?: string | undefined;
52
52
  deleted_at?: string | undefined;
@@ -65,7 +65,7 @@ export declare function buildTaskRoutes(taskService: TaskService, gitService?: G
65
65
  }>;
66
66
  readonly moveTask: import("@trpc/server").TRPCMutationProcedure<{
67
67
  input: {
68
- status: "review" | "in-progress" | "backlog" | "done";
68
+ status: "backlog" | "in-progress" | "review" | "done";
69
69
  id: string;
70
70
  };
71
71
  output: import("../../types/index.js").Task;