@assistkick/create 1.0.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/src/scaffolder.d.ts +6 -1
  2. package/dist/src/scaffolder.js +20 -9
  3. package/dist/src/scaffolder.js.map +1 -1
  4. package/package.json +3 -2
  5. package/templates/{product-system → assistkick-product-system}/CLAUDE.md +4 -4
  6. package/templates/{product-system → assistkick-product-system}/package.json +5 -5
  7. package/templates/{product-system → assistkick-product-system}/packages/backend/package.json +2 -2
  8. package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/auth.ts +1 -1
  9. package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/coherence.ts +1 -1
  10. package/templates/assistkick-product-system/packages/backend/src/routes/git.ts +231 -0
  11. package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/graph.ts +3 -3
  12. package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/kanban.ts +6 -6
  13. package/templates/assistkick-product-system/packages/backend/src/routes/pipeline.ts +88 -0
  14. package/templates/assistkick-product-system/packages/backend/src/routes/terminal.ts +82 -0
  15. package/templates/{product-system → assistkick-product-system}/packages/backend/src/server.ts +23 -10
  16. package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/coherence-review.ts +4 -4
  17. package/templates/assistkick-product-system/packages/backend/src/services/github_app_service.ts +146 -0
  18. package/templates/assistkick-product-system/packages/backend/src/services/init.ts +147 -0
  19. package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/invitation_service.ts +1 -1
  20. package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/password_reset_service.ts +1 -1
  21. package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/project_service.ts +72 -1
  22. package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.test.ts +87 -0
  23. package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.ts +194 -0
  24. package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.test.ts +159 -0
  25. package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/pty_session_manager.ts +114 -39
  26. package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/terminal_ws_handler.ts +28 -14
  27. package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/user_management_service.ts +1 -1
  28. package/templates/{product-system → assistkick-product-system}/packages/frontend/package.json +1 -1
  29. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/App.tsx +1 -1
  30. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/api/client.ts +151 -0
  31. package/templates/assistkick-product-system/packages/frontend/src/components/GitRepoModal.tsx +352 -0
  32. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/KanbanView.tsx +208 -95
  33. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/ProjectSelector.tsx +17 -1
  34. package/templates/assistkick-product-system/packages/frontend/src/components/TerminalView.tsx +333 -0
  35. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/Toolbar.tsx +15 -13
  36. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/constants/graph.ts +1 -0
  37. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useProjects.ts +4 -0
  38. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/dashboard.tsx +22 -4
  39. package/templates/{product-system → assistkick-product-system}/packages/frontend/src/styles/index.css +486 -38
  40. package/templates/assistkick-product-system/packages/frontend/vite.config.ts +31 -0
  41. package/templates/assistkick-product-system/packages/shared/db/migrations/0001_vengeful_wallop.sql +1 -0
  42. package/templates/assistkick-product-system/packages/shared/db/migrations/0002_greedy_excalibur.sql +4 -0
  43. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0001_snapshot.json +826 -0
  44. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0002_snapshot.json +854 -0
  45. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/_journal.json +27 -0
  46. package/templates/{product-system → assistkick-product-system}/packages/shared/db/schema.ts +5 -0
  47. package/templates/{product-system → assistkick-product-system}/packages/shared/lib/claude-service.ts +54 -1
  48. package/templates/{product-system → assistkick-product-system}/packages/shared/lib/db.ts +1 -1
  49. package/templates/{product-system → assistkick-product-system}/packages/shared/lib/git_workflow.ts +25 -0
  50. package/templates/{product-system → assistkick-product-system}/packages/shared/lib/pipeline-state-store.ts +4 -0
  51. package/templates/{product-system → assistkick-product-system}/packages/shared/lib/pipeline.ts +329 -89
  52. package/templates/assistkick-product-system/packages/shared/lib/pipeline_orchestrator.ts +186 -0
  53. package/templates/{product-system → assistkick-product-system}/packages/shared/lib/prompt_builder.ts +2 -2
  54. package/templates/{product-system → assistkick-product-system}/packages/shared/package.json +1 -1
  55. package/templates/assistkick-product-system/packages/shared/tools/db_explorer.ts +275 -0
  56. package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_kanban.ts +2 -1
  57. package/templates/{product-system → assistkick-product-system}/packages/shared/tools/move_card.ts +3 -2
  58. package/templates/{product-system → assistkick-product-system}/packages/shared/tools/update_node.ts +2 -2
  59. package/templates/{product-system → assistkick-product-system}/tests/db_sqlite_fallback.test.ts +1 -1
  60. package/templates/{product-system → assistkick-product-system}/tests/kanban.test.ts +1 -1
  61. package/templates/{product-system → assistkick-product-system}/tests/pipeline_stats_all_cards.test.ts +1 -1
  62. package/templates/{product-system → assistkick-product-system}/tests/web_terminal.test.ts +189 -150
  63. package/templates/skills/{product-bootstrap → assistkick-bootstrap}/SKILL.md +36 -28
  64. package/templates/skills/{product-code-reviewer → assistkick-code-reviewer}/SKILL.md +26 -18
  65. package/templates/skills/assistkick-db-explorer/SKILL.md +86 -0
  66. package/templates/skills/{product-debugger → assistkick-debugger}/SKILL.md +35 -27
  67. package/templates/skills/{product-developer → assistkick-developer}/SKILL.md +40 -32
  68. package/templates/skills/{product-interview → assistkick-interview}/SKILL.md +37 -29
  69. package/templates/product-system/packages/backend/src/routes/pipeline.ts +0 -41
  70. package/templates/product-system/packages/backend/src/services/init.ts +0 -80
  71. package/templates/product-system/packages/backend/src/services/pty_session_manager.test.ts +0 -88
  72. package/templates/product-system/packages/frontend/src/components/TerminalView.tsx +0 -200
  73. package/templates/product-system/packages/frontend/vite.config.ts +0 -20
  74. package/templates/product-system/packages/shared/db/migrations/meta/_journal.json +0 -13
  75. /package/templates/{product-system → assistkick-product-system}/.env.example +0 -0
  76. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/middleware/auth_middleware.test.ts +0 -0
  77. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/middleware/auth_middleware.ts +0 -0
  78. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/projects.ts +0 -0
  79. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/routes/users.ts +0 -0
  80. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/auth_service.test.ts +0 -0
  81. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/auth_service.ts +0 -0
  82. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/email_service.ts +0 -0
  83. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/invitation_service.test.ts +0 -0
  84. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/password_reset_service.test.ts +0 -0
  85. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/project_service.test.ts +0 -0
  86. /package/templates/{product-system → assistkick-product-system}/packages/backend/src/services/user_management_service.test.ts +0 -0
  87. /package/templates/{product-system → assistkick-product-system}/packages/backend/tsconfig.json +0 -0
  88. /package/templates/{product-system → assistkick-product-system}/packages/frontend/index.html +0 -0
  89. /package/templates/{product-system → assistkick-product-system}/packages/frontend/package-lock.json +0 -0
  90. /package/templates/{product-system → assistkick-product-system}/packages/frontend/public/favicon.svg +0 -0
  91. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/api/client_projects.test.ts +0 -0
  92. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/api/client_refresh.test.ts +0 -0
  93. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/CoherenceView.tsx +0 -0
  94. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/GraphLegend.tsx +0 -0
  95. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/GraphSettings.tsx +0 -0
  96. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/GraphView.tsx +0 -0
  97. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/InviteUserDialog.tsx +0 -0
  98. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/LoginPage.tsx +0 -0
  99. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/QaIssueSheet.tsx +0 -0
  100. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/SidePanel.tsx +0 -0
  101. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/components/UsersView.tsx +0 -0
  102. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useAuth.tsx +0 -0
  103. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useGraph.ts +0 -0
  104. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useKanban.ts +0 -0
  105. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useTheme.ts +0 -0
  106. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/useToast.tsx +0 -0
  107. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/hooks/use_projects_logic.test.ts +0 -0
  108. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/main.tsx +0 -0
  109. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/accept_invitation_page.tsx +0 -0
  110. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/forgot_password_page.tsx +0 -0
  111. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/register_page.tsx +0 -0
  112. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/pages/reset_password_page.tsx +0 -0
  113. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/ProtectedRoute.tsx +0 -0
  114. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/accept_invitation.tsx +0 -0
  115. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/forgot_password.tsx +0 -0
  116. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/login.tsx +0 -0
  117. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/register.tsx +0 -0
  118. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/routes/reset_password.tsx +0 -0
  119. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/auth_validation.test.ts +0 -0
  120. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/auth_validation.ts +0 -0
  121. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/login_validation.test.ts +0 -0
  122. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/login_validation.ts +0 -0
  123. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/logout.test.ts +0 -0
  124. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/node_sizing.test.ts +0 -0
  125. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/node_sizing.ts +0 -0
  126. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/task_status.test.ts +0 -0
  127. /package/templates/{product-system → assistkick-product-system}/packages/frontend/src/utils/task_status.ts +0 -0
  128. /package/templates/{product-system → assistkick-product-system}/packages/frontend/tsconfig.json +0 -0
  129. /package/templates/{product-system → assistkick-product-system}/packages/shared/.env.example +0 -0
  130. /package/templates/{product-system → assistkick-product-system}/packages/shared/README.md +0 -0
  131. /package/templates/{product-system → assistkick-product-system}/packages/shared/db/migrate.ts +0 -0
  132. /package/templates/{product-system → assistkick-product-system}/packages/shared/db/migrations/0000_dashing_gorgon.sql +0 -0
  133. /package/templates/{product-system → assistkick-product-system}/packages/shared/db/migrations/meta/0000_snapshot.json +0 -0
  134. /package/templates/{product-system → assistkick-product-system}/packages/shared/drizzle.config.js +0 -0
  135. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/coherence.ts +0 -0
  136. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/completeness.ts +0 -0
  137. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/constants.ts +0 -0
  138. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/graph.ts +0 -0
  139. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/kanban.ts +0 -0
  140. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/markdown.ts +0 -0
  141. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/relevance_search.ts +0 -0
  142. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/session.ts +0 -0
  143. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/validator.ts +0 -0
  144. /package/templates/{product-system → assistkick-product-system}/packages/shared/lib/work_summary_parser.ts +0 -0
  145. /package/templates/{product-system → assistkick-product-system}/packages/shared/scripts/assign-project.ts +0 -0
  146. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/add_edge.ts +0 -0
  147. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/add_node.ts +0 -0
  148. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/end_session.ts +0 -0
  149. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_gaps.ts +0 -0
  150. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_node.ts +0 -0
  151. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/get_status.ts +0 -0
  152. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/migrate_to_turso.ts +0 -0
  153. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/rebuild_index.ts +0 -0
  154. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/remove_edge.ts +0 -0
  155. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/remove_node.ts +0 -0
  156. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/resolve_question.ts +0 -0
  157. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/search_nodes.ts +0 -0
  158. /package/templates/{product-system → assistkick-product-system}/packages/shared/tools/start_session.ts +0 -0
  159. /package/templates/{product-system → assistkick-product-system}/packages/shared/tsconfig.json +0 -0
  160. /package/templates/{product-system → assistkick-product-system}/pnpm-workspace.yaml +0 -0
  161. /package/templates/{product-system → assistkick-product-system}/smoke_test.ts +0 -0
  162. /package/templates/{product-system → assistkick-product-system}/tests/coherence_review.test.ts +0 -0
  163. /package/templates/{product-system → assistkick-product-system}/tests/edge_type_color_coding.test.ts +0 -0
  164. /package/templates/{product-system → assistkick-product-system}/tests/emit-tool-use-events.test.ts +0 -0
  165. /package/templates/{product-system → assistkick-product-system}/tests/feature_kind.test.ts +0 -0
  166. /package/templates/{product-system → assistkick-product-system}/tests/gap_indicators.test.ts +0 -0
  167. /package/templates/{product-system → assistkick-product-system}/tests/graceful_init.test.ts +0 -0
  168. /package/templates/{product-system → assistkick-product-system}/tests/graph_legend.test.ts +0 -0
  169. /package/templates/{product-system → assistkick-product-system}/tests/graph_settings_sheet.test.ts +0 -0
  170. /package/templates/{product-system → assistkick-product-system}/tests/hide_defined_filter.test.ts +0 -0
  171. /package/templates/{product-system → assistkick-product-system}/tests/neighborhood_focus.test.ts +0 -0
  172. /package/templates/{product-system → assistkick-product-system}/tests/node_search.test.ts +0 -0
  173. /package/templates/{product-system → assistkick-product-system}/tests/node_sizing.test.ts +0 -0
  174. /package/templates/{product-system → assistkick-product-system}/tests/node_type_toggle_filters.test.ts +0 -0
  175. /package/templates/{product-system → assistkick-product-system}/tests/node_type_visual_encoding.test.ts +0 -0
  176. /package/templates/{product-system → assistkick-product-system}/tests/pipeline-state-store.test.ts +0 -0
  177. /package/templates/{product-system → assistkick-product-system}/tests/pipeline-unit.test.ts +0 -0
  178. /package/templates/{product-system → assistkick-product-system}/tests/pipeline.test.ts +0 -0
  179. /package/templates/{product-system → assistkick-product-system}/tests/play_all.test.ts +0 -0
  180. /package/templates/{product-system → assistkick-product-system}/tests/qa_issue_sheet.test.ts +0 -0
  181. /package/templates/{product-system → assistkick-product-system}/tests/relevance_search.test.ts +0 -0
  182. /package/templates/{product-system → assistkick-product-system}/tests/search_reorder.test.ts +0 -0
  183. /package/templates/{product-system → assistkick-product-system}/tests/serve_ui.test.ts +0 -0
  184. /package/templates/{product-system → assistkick-product-system}/tests/serve_ui_drizzle.test.ts +0 -0
  185. /package/templates/{product-system → assistkick-product-system}/tests/session_context_recall.test.ts +0 -0
  186. /package/templates/{product-system → assistkick-product-system}/tests/side_panel.test.ts +0 -0
  187. /package/templates/{product-system → assistkick-product-system}/tests/spec_completeness_label.test.ts +0 -0
  188. /package/templates/{product-system → assistkick-product-system}/tests/url_routing_test.ts +0 -0
  189. /package/templates/{product-system → assistkick-product-system}/tests/user_login.test.ts +0 -0
  190. /package/templates/{product-system → assistkick-product-system}/tests/user_registration.test.ts +0 -0
  191. /package/templates/{product-system → assistkick-product-system}/tests/work_summary.test.ts +0 -0
  192. /package/templates/{product-system → assistkick-product-system}/tests/zoom_pan.test.ts +0 -0
  193. /package/templates/{product-system → assistkick-product-system}/tsconfig.json +0 -0
  194. /package/templates/skills/{product-debugger → assistkick-debugger}/references/agent-browser.md +0 -0
@@ -48,7 +48,7 @@
48
48
  box-sizing: border-box;
49
49
  }
50
50
 
51
- html, body {
51
+ html, body, #root {
52
52
  width: 100%;
53
53
  height: 100%;
54
54
  overflow: hidden;
@@ -58,6 +58,19 @@ html, body {
58
58
  color: var(--text-primary);
59
59
  }
60
60
 
61
+ .app-container {
62
+ display: flex;
63
+ flex-direction: column;
64
+ height: 100%;
65
+ overflow: hidden;
66
+ }
67
+
68
+ .main-content {
69
+ flex: 1;
70
+ overflow: hidden;
71
+ position: relative;
72
+ }
73
+
61
74
  /* Toolbar */
62
75
  .toolbar {
63
76
  display: flex;
@@ -1193,16 +1206,16 @@ html, body {
1193
1206
  padding: 16px;
1194
1207
  overflow-y: auto;
1195
1208
  flex: 1;
1196
- font-size: 12px;
1209
+ font-size: 14px;
1197
1210
  line-height: 1.6;
1198
1211
  }
1199
1212
 
1200
- .panel-body h1 { font-size: 16px; margin: 12px 0 8px; color: var(--text-primary); }
1201
- .panel-body h2 { font-size: 14px; margin: 12px 0 6px; color: var(--text-primary); }
1202
- .panel-body h3 { font-size: 13px; margin: 10px 0 4px; color: var(--text-primary); }
1203
- .panel-body p { margin: 4px 0; color: var(--text-secondary); }
1213
+ .panel-body h1 { font-size: 18px; margin: 12px 0 8px; color: var(--text-primary); }
1214
+ .panel-body h2 { font-size: 16px; margin: 12px 0 6px; color: var(--text-primary); }
1215
+ .panel-body h3 { font-size: 15px; margin: 10px 0 4px; color: var(--text-primary); }
1216
+ .panel-body p { margin: 4px 0; color: var(--text-primary); }
1204
1217
  .panel-body ul { padding-left: 20px; margin: 4px 0; }
1205
- .panel-body li { color: var(--text-secondary); margin: 2px 0; }
1218
+ .panel-body li { color: var(--text-primary); margin: 2px 0; }
1206
1219
  .panel-body code {
1207
1220
  background: var(--bg-tertiary);
1208
1221
  padding: 1px 4px;
@@ -1752,7 +1765,7 @@ html, body {
1752
1765
  .panel-task-list-toggle {
1753
1766
  background: none;
1754
1767
  border: none;
1755
- color: var(--text-secondary);
1768
+ color: var(--text-primary);
1756
1769
  font-size: 12px;
1757
1770
  font-family: var(--font-mono);
1758
1771
  cursor: pointer;
@@ -1790,10 +1803,9 @@ html, body {
1790
1803
  /* Tool call activity indicators */
1791
1804
  .kanban-tool-calls {
1792
1805
  display: flex;
1793
- flex-direction: column;
1806
+ flex-wrap: wrap;
1794
1807
  gap: 2px;
1795
- margin-top: 2px;
1796
- padding: 2px 8px;
1808
+ padding: 2px 0;
1797
1809
  }
1798
1810
 
1799
1811
  .kanban-tool-badge {
@@ -1805,6 +1817,69 @@ html, body {
1805
1817
  color: var(--accent-blue, #4dabf7);
1806
1818
  }
1807
1819
 
1820
+ /* Per-stage stats with tabs */
1821
+ .kanban-stage-stats {
1822
+ margin-top: 4px;
1823
+ border-top: 1px solid var(--border-color);
1824
+ padding-top: 2px;
1825
+ }
1826
+
1827
+ .kanban-stage-tabs {
1828
+ display: flex;
1829
+ gap: 0;
1830
+ border-bottom: 1px solid var(--border-color);
1831
+ }
1832
+
1833
+ .kanban-stage-tab {
1834
+ background: none;
1835
+ border: none;
1836
+ border-bottom: 2px solid transparent;
1837
+ color: var(--text-secondary);
1838
+ font-size: 10px;
1839
+ font-family: var(--font-mono);
1840
+ padding: 2px 8px;
1841
+ cursor: pointer;
1842
+ transition: color 0.15s, border-color 0.15s;
1843
+ }
1844
+
1845
+ .kanban-stage-tab:hover {
1846
+ color: var(--text-primary);
1847
+ }
1848
+
1849
+ .kanban-stage-tab.active {
1850
+ color: var(--accent-blue, #4dabf7);
1851
+ border-bottom-color: var(--accent-blue, #4dabf7);
1852
+ }
1853
+
1854
+ .kanban-stage-body {
1855
+ padding: 3px 4px;
1856
+ }
1857
+
1858
+ .kanban-stage-meta {
1859
+ display: flex;
1860
+ flex-wrap: wrap;
1861
+ gap: 4px;
1862
+ padding: 2px 0;
1863
+ }
1864
+
1865
+ .kanban-stage-meta-item {
1866
+ font-size: 10px;
1867
+ font-family: var(--font-mono);
1868
+ color: var(--text-secondary);
1869
+ background: rgba(255, 255, 255, 0.05);
1870
+ padding: 1px 4px;
1871
+ border-radius: 3px;
1872
+ }
1873
+
1874
+ .kanban-stage-model {
1875
+ opacity: 0.7;
1876
+ }
1877
+
1878
+ .kanban-stop-reason {
1879
+ color: var(--accent-orange, #ffa94d);
1880
+ background: rgba(255, 169, 77, 0.1);
1881
+ }
1882
+
1808
1883
  /* Work Summary (Side Panel) */
1809
1884
  .panel-work-summary {
1810
1885
  margin-top: 12px;
@@ -2752,14 +2827,174 @@ html, body {
2752
2827
  font-size: 14px;
2753
2828
  }
2754
2829
 
2755
- /* Terminal View */
2830
+ /* Terminal View — multi-session layout */
2756
2831
  .terminal-view {
2757
- flex-direction: column;
2832
+ flex-direction: row;
2758
2833
  height: 100%;
2759
2834
  width: 100%;
2835
+ overflow: hidden;
2836
+ }
2837
+
2838
+ /* Sidebar — session list */
2839
+ .terminal-sidebar {
2840
+ display: flex;
2841
+ flex-direction: column;
2842
+ width: 220px;
2843
+ min-width: 220px;
2844
+ border-right: 1px solid var(--border-color);
2845
+ background: var(--bg-secondary);
2846
+ overflow: hidden;
2847
+ }
2848
+
2849
+ .terminal-sidebar-header {
2850
+ padding: 10px 12px;
2851
+ font-size: 11px;
2852
+ font-family: var(--font-mono);
2853
+ text-transform: uppercase;
2854
+ letter-spacing: 0.08em;
2855
+ color: var(--text-muted);
2856
+ border-bottom: 1px solid var(--border-color);
2857
+ flex-shrink: 0;
2858
+ }
2859
+
2860
+ .terminal-session-list {
2861
+ flex: 1;
2862
+ overflow-y: auto;
2863
+ }
2864
+
2865
+ .terminal-no-sessions {
2866
+ padding: 16px 12px;
2867
+ font-size: 12px;
2868
+ color: var(--text-muted);
2869
+ font-family: var(--font-mono);
2870
+ }
2871
+
2872
+ .terminal-session-item {
2873
+ display: flex;
2874
+ flex-direction: column;
2875
+ padding: 8px 10px;
2876
+ cursor: pointer;
2877
+ border-bottom: 1px solid var(--border-color);
2760
2878
  position: relative;
2761
2879
  }
2762
2880
 
2881
+ .terminal-session-item:hover {
2882
+ background: var(--tab-hover-bg);
2883
+ }
2884
+
2885
+ .terminal-session-item--active {
2886
+ background: var(--tab-active-bg);
2887
+ border-left: 2px solid var(--accent);
2888
+ padding-left: 8px;
2889
+ }
2890
+
2891
+ .terminal-session-name {
2892
+ font-size: 12px;
2893
+ font-family: var(--font-mono);
2894
+ color: var(--text-primary);
2895
+ white-space: nowrap;
2896
+ overflow: hidden;
2897
+ text-overflow: ellipsis;
2898
+ padding-right: 20px;
2899
+ }
2900
+
2901
+ .terminal-session-project {
2902
+ font-size: 11px;
2903
+ color: var(--text-muted);
2904
+ font-family: var(--font-mono);
2905
+ white-space: nowrap;
2906
+ overflow: hidden;
2907
+ text-overflow: ellipsis;
2908
+ padding-right: 20px;
2909
+ margin-top: 2px;
2910
+ }
2911
+
2912
+ .terminal-session-kill {
2913
+ position: absolute;
2914
+ top: 8px;
2915
+ right: 8px;
2916
+ width: 18px;
2917
+ height: 18px;
2918
+ border: none;
2919
+ background: transparent;
2920
+ color: var(--text-muted);
2921
+ cursor: pointer;
2922
+ font-size: 11px;
2923
+ display: flex;
2924
+ align-items: center;
2925
+ justify-content: center;
2926
+ border-radius: 3px;
2927
+ padding: 0;
2928
+ line-height: 1;
2929
+ }
2930
+
2931
+ .terminal-session-kill:hover {
2932
+ background: var(--error-color);
2933
+ color: #fff;
2934
+ }
2935
+
2936
+ /* New session area at sidebar bottom */
2937
+ .terminal-new-session {
2938
+ display: flex;
2939
+ flex-direction: column;
2940
+ gap: 6px;
2941
+ padding: 10px;
2942
+ border-top: 1px solid var(--border-color);
2943
+ flex-shrink: 0;
2944
+ }
2945
+
2946
+ .terminal-project-picker {
2947
+ width: 100%;
2948
+ padding: 5px 8px;
2949
+ font-size: 12px;
2950
+ font-family: var(--font-mono);
2951
+ background: var(--bg-tertiary);
2952
+ color: var(--text-primary);
2953
+ border: 1px solid var(--border-color);
2954
+ border-radius: 4px;
2955
+ cursor: pointer;
2956
+ }
2957
+
2958
+ .terminal-new-session-btn {
2959
+ width: 100%;
2960
+ padding: 6px 8px;
2961
+ font-size: 12px;
2962
+ font-family: var(--font-mono);
2963
+ background: var(--accent);
2964
+ color: #fff;
2965
+ border: none;
2966
+ border-radius: 4px;
2967
+ cursor: pointer;
2968
+ }
2969
+
2970
+ .terminal-new-session-btn:hover:not(:disabled) {
2971
+ opacity: 0.85;
2972
+ }
2973
+
2974
+ .terminal-new-session-btn:disabled {
2975
+ opacity: 0.5;
2976
+ cursor: not-allowed;
2977
+ }
2978
+
2979
+ /* Right panel — terminal content */
2980
+ .terminal-panel {
2981
+ flex: 1;
2982
+ display: flex;
2983
+ flex-direction: column;
2984
+ min-width: 0;
2985
+ position: relative;
2986
+ }
2987
+
2988
+ .terminal-empty-state {
2989
+ flex: 1;
2990
+ display: flex;
2991
+ align-items: center;
2992
+ justify-content: center;
2993
+ color: var(--text-muted);
2994
+ font-size: 13px;
2995
+ font-family: var(--font-mono);
2996
+ }
2997
+
2763
2998
  .terminal-container {
2764
2999
  flex: 1;
2765
3000
  padding: 4px;
@@ -2780,6 +3015,7 @@ html, body {
2780
3015
  color: #1e1e2e;
2781
3016
  font-size: 13px;
2782
3017
  font-family: var(--font-mono);
3018
+ flex-shrink: 0;
2783
3019
  }
2784
3020
 
2785
3021
  .terminal-reconnect-btn {
@@ -2801,31 +3037,7 @@ html, body {
2801
3037
  color: var(--text-secondary);
2802
3038
  font-size: 13px;
2803
3039
  font-family: var(--font-mono);
2804
- }
2805
-
2806
- .terminal-overlay {
2807
- position: absolute;
2808
- inset: 0;
2809
- display: flex;
2810
- align-items: center;
2811
- justify-content: center;
2812
- background: rgba(0,0,0,0.6);
2813
- z-index: 10;
2814
- }
2815
-
2816
- .terminal-connect-btn {
2817
- padding: 12px 24px;
2818
- border: 1px solid var(--accent);
2819
- border-radius: 6px;
2820
- background: var(--accent);
2821
- color: #fff;
2822
- font-size: 14px;
2823
- font-family: var(--font-mono);
2824
- cursor: pointer;
2825
- }
2826
-
2827
- .terminal-connect-btn:hover {
2828
- opacity: 0.9;
3040
+ flex-shrink: 0;
2829
3041
  }
2830
3042
 
2831
3043
  /* Login Page */
@@ -3356,3 +3568,239 @@ html, body {
3356
3568
  font-size: 14px;
3357
3569
  padding: 12px 0;
3358
3570
  }
3571
+
3572
+ /* ===== Git Repo Modal ===== */
3573
+
3574
+ .project-selector-git-btn {
3575
+ color: var(--text-secondary);
3576
+ }
3577
+
3578
+ .project-selector-git-btn.connected {
3579
+ color: var(--accent);
3580
+ }
3581
+
3582
+ .project-selector-git-btn svg {
3583
+ display: block;
3584
+ }
3585
+
3586
+ .git-modal-overlay {
3587
+ position: fixed;
3588
+ top: 0;
3589
+ left: 0;
3590
+ right: 0;
3591
+ bottom: 0;
3592
+ background: rgba(0, 0, 0, 0.5);
3593
+ z-index: 1000;
3594
+ display: flex;
3595
+ align-items: center;
3596
+ justify-content: center;
3597
+ }
3598
+
3599
+ .git-modal {
3600
+ background: var(--bg-secondary);
3601
+ border: 1px solid var(--border-color);
3602
+ border-radius: 8px;
3603
+ width: 480px;
3604
+ max-width: 90vw;
3605
+ max-height: 80vh;
3606
+ overflow-y: auto;
3607
+ box-shadow: 0 8px 32px var(--panel-shadow);
3608
+ font-family: var(--font-mono);
3609
+ font-size: 13px;
3610
+ }
3611
+
3612
+ .git-modal-header {
3613
+ display: flex;
3614
+ justify-content: space-between;
3615
+ align-items: center;
3616
+ padding: 16px 20px 12px;
3617
+ border-bottom: 1px solid var(--border-color);
3618
+ }
3619
+
3620
+ .git-modal-header h3 {
3621
+ margin: 0;
3622
+ font-size: 14px;
3623
+ color: var(--text-primary);
3624
+ font-weight: 600;
3625
+ }
3626
+
3627
+ .git-modal-close {
3628
+ background: none;
3629
+ border: none;
3630
+ color: var(--text-secondary);
3631
+ cursor: pointer;
3632
+ font-size: 18px;
3633
+ padding: 0 4px;
3634
+ line-height: 1;
3635
+ }
3636
+
3637
+ .git-modal-close:hover {
3638
+ color: var(--text-primary);
3639
+ }
3640
+
3641
+ .git-modal-error {
3642
+ padding: 8px 20px;
3643
+ color: var(--error-color);
3644
+ font-size: 12px;
3645
+ background: rgba(255, 107, 107, 0.08);
3646
+ border-bottom: 1px solid var(--border-color);
3647
+ }
3648
+
3649
+ .git-modal-success {
3650
+ padding: 8px 20px;
3651
+ color: #69db7c;
3652
+ font-size: 12px;
3653
+ background: rgba(105, 219, 124, 0.08);
3654
+ border-bottom: 1px solid var(--border-color);
3655
+ }
3656
+
3657
+ .git-modal-tabs {
3658
+ display: flex;
3659
+ border-bottom: 1px solid var(--border-color);
3660
+ padding: 0 16px;
3661
+ }
3662
+
3663
+ .git-modal-tab {
3664
+ background: none;
3665
+ border: none;
3666
+ color: var(--text-secondary);
3667
+ cursor: pointer;
3668
+ font-family: var(--font-mono);
3669
+ font-size: 12px;
3670
+ padding: 10px 12px;
3671
+ border-bottom: 2px solid transparent;
3672
+ }
3673
+
3674
+ .git-modal-tab:hover {
3675
+ color: var(--text-primary);
3676
+ }
3677
+
3678
+ .git-modal-tab.active {
3679
+ color: var(--accent);
3680
+ border-bottom-color: var(--accent);
3681
+ }
3682
+
3683
+ .git-modal-body {
3684
+ padding: 16px 20px;
3685
+ }
3686
+
3687
+ .git-modal-loading {
3688
+ color: var(--text-muted);
3689
+ text-align: center;
3690
+ padding: 20px 0;
3691
+ }
3692
+
3693
+ .git-modal-info {
3694
+ color: var(--text-secondary);
3695
+ font-size: 12px;
3696
+ line-height: 1.5;
3697
+ margin-bottom: 12px;
3698
+ }
3699
+
3700
+ .git-status-row {
3701
+ display: flex;
3702
+ justify-content: space-between;
3703
+ padding: 6px 0;
3704
+ border-bottom: 1px solid var(--border-color);
3705
+ }
3706
+
3707
+ .git-status-label {
3708
+ color: var(--text-secondary);
3709
+ font-size: 12px;
3710
+ }
3711
+
3712
+ .git-status-value {
3713
+ color: var(--text-primary);
3714
+ font-size: 12px;
3715
+ }
3716
+
3717
+ .git-status-value.connected {
3718
+ color: #69db7c;
3719
+ }
3720
+
3721
+ .git-status-url {
3722
+ max-width: 240px;
3723
+ overflow: hidden;
3724
+ text-overflow: ellipsis;
3725
+ white-space: nowrap;
3726
+ }
3727
+
3728
+ .git-modal-label {
3729
+ display: block;
3730
+ color: var(--text-secondary);
3731
+ font-size: 11px;
3732
+ text-transform: uppercase;
3733
+ letter-spacing: 0.05em;
3734
+ margin-bottom: 6px;
3735
+ margin-top: 12px;
3736
+ }
3737
+
3738
+ .git-modal-select {
3739
+ width: 100%;
3740
+ padding: 8px 10px;
3741
+ background: var(--bg-tertiary);
3742
+ border: 1px solid var(--border-color);
3743
+ border-radius: 4px;
3744
+ color: var(--text-primary);
3745
+ font-family: var(--font-mono);
3746
+ font-size: 12px;
3747
+ }
3748
+
3749
+ .git-modal-input {
3750
+ width: 100%;
3751
+ padding: 8px 10px;
3752
+ background: var(--bg-tertiary);
3753
+ border: 1px solid var(--border-color);
3754
+ border-radius: 4px;
3755
+ color: var(--text-primary);
3756
+ font-family: var(--font-mono);
3757
+ font-size: 12px;
3758
+ box-sizing: border-box;
3759
+ }
3760
+
3761
+ .git-modal-input:focus {
3762
+ outline: none;
3763
+ border-color: var(--accent);
3764
+ }
3765
+
3766
+ .git-modal-btn {
3767
+ display: inline-block;
3768
+ padding: 8px 16px;
3769
+ border: 1px solid var(--border-color);
3770
+ border-radius: 4px;
3771
+ background: var(--bg-tertiary);
3772
+ color: var(--text-primary);
3773
+ font-family: var(--font-mono);
3774
+ font-size: 12px;
3775
+ cursor: pointer;
3776
+ margin-top: 12px;
3777
+ }
3778
+
3779
+ .git-modal-btn:hover {
3780
+ background: var(--tab-hover-bg);
3781
+ }
3782
+
3783
+ .git-modal-btn:disabled {
3784
+ opacity: 0.5;
3785
+ cursor: not-allowed;
3786
+ }
3787
+
3788
+ .git-modal-btn-primary {
3789
+ background: var(--accent);
3790
+ color: #fff;
3791
+ border-color: var(--accent);
3792
+ }
3793
+
3794
+ .git-modal-btn-primary:hover {
3795
+ opacity: 0.9;
3796
+ }
3797
+
3798
+ .git-modal-btn-danger {
3799
+ color: var(--error-color);
3800
+ border-color: var(--error-color);
3801
+ margin-top: 16px;
3802
+ }
3803
+
3804
+ .git-modal-btn-danger:hover {
3805
+ background: rgba(255, 107, 107, 0.1);
3806
+ }
@@ -0,0 +1,31 @@
1
+ import { defineConfig, loadEnv } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, resolve } from 'node:path';
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+
8
+ export default defineConfig(({ mode }) => {
9
+ const envDir = resolve(__dirname, '..', '..');
10
+ const env = loadEnv(mode, envDir, '');
11
+ const frontendPort = parseInt(env.FRONTEND_PORT || '5173', 10);
12
+ const backendPort = parseInt(env.PORT || '3000', 10);
13
+
14
+ return {
15
+ plugins: [react()],
16
+ build: {
17
+ outDir: 'dist',
18
+ emptyOutDir: true,
19
+ },
20
+ server: {
21
+ port: frontendPort,
22
+ strictPort: true,
23
+ proxy: {
24
+ '/api': {
25
+ target: `http://localhost:${backendPort}`,
26
+ ws: true,
27
+ },
28
+ },
29
+ },
30
+ };
31
+ });
@@ -0,0 +1 @@
1
+ ALTER TABLE `pipeline_state` ADD `stage_stats_json` text;
@@ -0,0 +1,4 @@
1
+ ALTER TABLE `projects` ADD `repo_url` text;--> statement-breakpoint
2
+ ALTER TABLE `projects` ADD `github_installation_id` text;--> statement-breakpoint
3
+ ALTER TABLE `projects` ADD `github_repo_full_name` text;--> statement-breakpoint
4
+ ALTER TABLE `projects` ADD `base_branch` text;