@mrpatronz/nexusflow 0.1.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 (212) hide show
  1. package/GETTING_STARTED.md +109 -0
  2. package/README.md +310 -0
  3. package/dist/analyzers/detect-apis.d.ts +19 -0
  4. package/dist/analyzers/detect-apis.d.ts.map +1 -0
  5. package/dist/analyzers/detect-apis.js +121 -0
  6. package/dist/analyzers/detect-apis.js.map +1 -0
  7. package/dist/analyzers/detect-deps.d.ts +30 -0
  8. package/dist/analyzers/detect-deps.d.ts.map +1 -0
  9. package/dist/analyzers/detect-deps.js +121 -0
  10. package/dist/analyzers/detect-deps.js.map +1 -0
  11. package/dist/analyzers/detect-existing.d.ts +15 -0
  12. package/dist/analyzers/detect-existing.d.ts.map +1 -0
  13. package/dist/analyzers/detect-existing.js +65 -0
  14. package/dist/analyzers/detect-existing.js.map +1 -0
  15. package/dist/analyzers/detect-ports.d.ts +20 -0
  16. package/dist/analyzers/detect-ports.d.ts.map +1 -0
  17. package/dist/analyzers/detect-ports.js +103 -0
  18. package/dist/analyzers/detect-ports.js.map +1 -0
  19. package/dist/analyzers/index.d.ts +29 -0
  20. package/dist/analyzers/index.d.ts.map +1 -0
  21. package/dist/analyzers/index.js +74 -0
  22. package/dist/analyzers/index.js.map +1 -0
  23. package/dist/analyzers/readme-summarizer.d.ts +13 -0
  24. package/dist/analyzers/readme-summarizer.d.ts.map +1 -0
  25. package/dist/analyzers/readme-summarizer.js +59 -0
  26. package/dist/analyzers/readme-summarizer.js.map +1 -0
  27. package/dist/analyzers/tech-stack.d.ts +15 -0
  28. package/dist/analyzers/tech-stack.d.ts.map +1 -0
  29. package/dist/analyzers/tech-stack.js +284 -0
  30. package/dist/analyzers/tech-stack.js.map +1 -0
  31. package/dist/commands/create.d.ts +17 -0
  32. package/dist/commands/create.d.ts.map +1 -0
  33. package/dist/commands/create.js +111 -0
  34. package/dist/commands/create.js.map +1 -0
  35. package/dist/commands/init.d.ts +10 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +50 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/list.d.ts +9 -0
  40. package/dist/commands/list.d.ts.map +1 -0
  41. package/dist/commands/list.js +32 -0
  42. package/dist/commands/list.js.map +1 -0
  43. package/dist/commands/logs.d.ts +12 -0
  44. package/dist/commands/logs.d.ts.map +1 -0
  45. package/dist/commands/logs.js +54 -0
  46. package/dist/commands/logs.js.map +1 -0
  47. package/dist/commands/open.d.ts +9 -0
  48. package/dist/commands/open.d.ts.map +1 -0
  49. package/dist/commands/open.js +49 -0
  50. package/dist/commands/open.js.map +1 -0
  51. package/dist/commands/start.d.ts +13 -0
  52. package/dist/commands/start.d.ts.map +1 -0
  53. package/dist/commands/start.js +97 -0
  54. package/dist/commands/start.js.map +1 -0
  55. package/dist/commands/status.d.ts +11 -0
  56. package/dist/commands/status.d.ts.map +1 -0
  57. package/dist/commands/status.js +47 -0
  58. package/dist/commands/status.js.map +1 -0
  59. package/dist/commands/stop.d.ts +11 -0
  60. package/dist/commands/stop.d.ts.map +1 -0
  61. package/dist/commands/stop.js +47 -0
  62. package/dist/commands/stop.js.map +1 -0
  63. package/dist/commands/ui.d.ts +13 -0
  64. package/dist/commands/ui.d.ts.map +1 -0
  65. package/dist/commands/ui.js +44 -0
  66. package/dist/commands/ui.js.map +1 -0
  67. package/dist/core/config.d.ts +32 -0
  68. package/dist/core/config.d.ts.map +1 -0
  69. package/dist/core/config.js +68 -0
  70. package/dist/core/config.js.map +1 -0
  71. package/dist/core/scanner.d.ts +18 -0
  72. package/dist/core/scanner.d.ts.map +1 -0
  73. package/dist/core/scanner.js +73 -0
  74. package/dist/core/scanner.js.map +1 -0
  75. package/dist/core/workspace.d.ts +53 -0
  76. package/dist/core/workspace.d.ts.map +1 -0
  77. package/dist/core/workspace.js +114 -0
  78. package/dist/core/workspace.js.map +1 -0
  79. package/dist/core/worktree.d.ts +27 -0
  80. package/dist/core/worktree.d.ts.map +1 -0
  81. package/dist/core/worktree.js +35 -0
  82. package/dist/core/worktree.js.map +1 -0
  83. package/dist/generators/base.d.ts +15 -0
  84. package/dist/generators/base.d.ts.map +1 -0
  85. package/dist/generators/base.js +175 -0
  86. package/dist/generators/base.js.map +1 -0
  87. package/dist/generators/claude.d.ts +17 -0
  88. package/dist/generators/claude.d.ts.map +1 -0
  89. package/dist/generators/claude.js +29 -0
  90. package/dist/generators/claude.js.map +1 -0
  91. package/dist/generators/codex.d.ts +16 -0
  92. package/dist/generators/codex.d.ts.map +1 -0
  93. package/dist/generators/codex.js +41 -0
  94. package/dist/generators/codex.js.map +1 -0
  95. package/dist/generators/copilot.d.ts +16 -0
  96. package/dist/generators/copilot.d.ts.map +1 -0
  97. package/dist/generators/copilot.js +49 -0
  98. package/dist/generators/copilot.js.map +1 -0
  99. package/dist/generators/cursor.d.ts +17 -0
  100. package/dist/generators/cursor.d.ts.map +1 -0
  101. package/dist/generators/cursor.js +37 -0
  102. package/dist/generators/cursor.js.map +1 -0
  103. package/dist/generators/index.d.ts +18 -0
  104. package/dist/generators/index.d.ts.map +1 -0
  105. package/dist/generators/index.js +95 -0
  106. package/dist/generators/index.js.map +1 -0
  107. package/dist/gui/assets/index-Cq9V485S.js +21 -0
  108. package/dist/gui/assets/index-Dh1b5gSZ.css +2 -0
  109. package/dist/gui/favicon.svg +1 -0
  110. package/dist/gui/icons.svg +24 -0
  111. package/dist/gui/index.html +18 -0
  112. package/dist/index.d.ts +11 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +169 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/orchestration/detect.d.ts +29 -0
  117. package/dist/orchestration/detect.d.ts.map +1 -0
  118. package/dist/orchestration/detect.js +292 -0
  119. package/dist/orchestration/detect.js.map +1 -0
  120. package/dist/orchestration/index.d.ts +7 -0
  121. package/dist/orchestration/index.d.ts.map +1 -0
  122. package/dist/orchestration/index.js +7 -0
  123. package/dist/orchestration/index.js.map +1 -0
  124. package/dist/orchestration/runner.d.ts +40 -0
  125. package/dist/orchestration/runner.d.ts.map +1 -0
  126. package/dist/orchestration/runner.js +242 -0
  127. package/dist/orchestration/runner.js.map +1 -0
  128. package/dist/server.d.ts +16 -0
  129. package/dist/server.d.ts.map +1 -0
  130. package/dist/server.js +419 -0
  131. package/dist/server.js.map +1 -0
  132. package/dist/types.d.ts +210 -0
  133. package/dist/types.d.ts.map +1 -0
  134. package/dist/types.js +6 -0
  135. package/dist/types.js.map +1 -0
  136. package/dist/utils/detect-ai.d.ts +21 -0
  137. package/dist/utils/detect-ai.d.ts.map +1 -0
  138. package/dist/utils/detect-ai.js +76 -0
  139. package/dist/utils/detect-ai.js.map +1 -0
  140. package/dist/utils/detect-editors.d.ts +19 -0
  141. package/dist/utils/detect-editors.d.ts.map +1 -0
  142. package/dist/utils/detect-editors.js +49 -0
  143. package/dist/utils/detect-editors.js.map +1 -0
  144. package/dist/utils/git.d.ts +27 -0
  145. package/dist/utils/git.d.ts.map +1 -0
  146. package/dist/utils/git.js +57 -0
  147. package/dist/utils/git.js.map +1 -0
  148. package/dist/utils/prompts.d.ts +27 -0
  149. package/dist/utils/prompts.d.ts.map +1 -0
  150. package/dist/utils/prompts.js +119 -0
  151. package/dist/utils/prompts.js.map +1 -0
  152. package/dist/utils/session-finder.d.ts +29 -0
  153. package/dist/utils/session-finder.d.ts.map +1 -0
  154. package/dist/utils/session-finder.js +462 -0
  155. package/dist/utils/session-finder.js.map +1 -0
  156. package/gui/README.md +73 -0
  157. package/gui/eslint.config.js +22 -0
  158. package/gui/index.html +17 -0
  159. package/gui/package-lock.json +3054 -0
  160. package/gui/package.json +33 -0
  161. package/gui/public/favicon.svg +1 -0
  162. package/gui/public/icons.svg +24 -0
  163. package/gui/src/App.css +1 -0
  164. package/gui/src/App.tsx +1949 -0
  165. package/gui/src/assets/hero.png +0 -0
  166. package/gui/src/assets/react.svg +1 -0
  167. package/gui/src/assets/vite.svg +1 -0
  168. package/gui/src/index.css +1 -0
  169. package/gui/src/main.tsx +10 -0
  170. package/gui/tsconfig.app.json +25 -0
  171. package/gui/tsconfig.json +7 -0
  172. package/gui/tsconfig.node.json +24 -0
  173. package/gui/vite.config.ts +12 -0
  174. package/package.json +48 -0
  175. package/src/analyzers/detect-apis.ts +138 -0
  176. package/src/analyzers/detect-deps.ts +138 -0
  177. package/src/analyzers/detect-existing.ts +74 -0
  178. package/src/analyzers/detect-ports.ts +110 -0
  179. package/src/analyzers/index.ts +85 -0
  180. package/src/analyzers/readme-summarizer.ts +68 -0
  181. package/src/analyzers/tech-stack.ts +255 -0
  182. package/src/commands/create.ts +142 -0
  183. package/src/commands/init.ts +58 -0
  184. package/src/commands/list.ts +46 -0
  185. package/src/commands/logs.ts +63 -0
  186. package/src/commands/open.ts +54 -0
  187. package/src/commands/start.ts +117 -0
  188. package/src/commands/status.ts +54 -0
  189. package/src/commands/stop.ts +55 -0
  190. package/src/commands/ui.ts +47 -0
  191. package/src/core/config.ts +79 -0
  192. package/src/core/scanner.ts +91 -0
  193. package/src/core/workspace.ts +149 -0
  194. package/src/core/worktree.ts +50 -0
  195. package/src/generators/base.ts +187 -0
  196. package/src/generators/claude.ts +34 -0
  197. package/src/generators/codex.ts +48 -0
  198. package/src/generators/copilot.ts +56 -0
  199. package/src/generators/cursor.ts +44 -0
  200. package/src/generators/index.ts +122 -0
  201. package/src/index.ts +178 -0
  202. package/src/orchestration/detect.ts +313 -0
  203. package/src/orchestration/index.ts +7 -0
  204. package/src/orchestration/runner.ts +279 -0
  205. package/src/server.ts +466 -0
  206. package/src/types.ts +294 -0
  207. package/src/utils/detect-ai.ts +81 -0
  208. package/src/utils/detect-editors.ts +54 -0
  209. package/src/utils/git.ts +61 -0
  210. package/src/utils/prompts.ts +135 -0
  211. package/src/utils/session-finder.ts +483 -0
  212. package/tsconfig.json +19 -0
package/dist/server.js ADDED
@@ -0,0 +1,419 @@
1
+ /**
2
+ * @module server
3
+ * Hono local web server for the NexusFlow GUI.
4
+ */
5
+ import { Hono } from 'hono';
6
+ import { serve } from '@hono/node-server';
7
+ import { serveStatic } from '@hono/node-server/serve-static';
8
+ import { cors } from 'hono/cors';
9
+ import * as fs from 'node:fs/promises';
10
+ import * as path from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { execa } from 'execa';
13
+ import { loadConfig, saveConfig, getConfigDir } from './core/config.js';
14
+ import { scanForRepos } from './core/scanner.js';
15
+ import { createWorkspace, listWorkspaces, loadFeatureConfig } from './core/workspace.js';
16
+ import { analyzeAllRepos } from './analyzers/index.js';
17
+ import { generateContextFiles } from './generators/index.js';
18
+ import { detectAIAssistants } from './utils/detect-ai.js';
19
+ import { detectEditors } from './utils/detect-editors.js';
20
+ import { findSessions, getSessionTranscript } from './utils/session-finder.js';
21
+ import { detectAllServices, detectOrchestrationTools, startServices, stopServices, loadRunningState, } from './orchestration/index.js';
22
+ // Resolve static files directory
23
+ const __filename = fileURLToPath(import.meta.url);
24
+ const __dirname = path.dirname(__filename);
25
+ // In development, the static GUI is built to dist/gui
26
+ // In production, it will be served from dist/gui as well
27
+ const guiPath = path.join(__dirname, 'gui');
28
+ export const app = new Hono();
29
+ // Enable CORS for frontend dev server
30
+ app.use('/api/*', cors());
31
+ // ─── API Endpoints ────────────────────────────────────────────────────────
32
+ // 1. Get current configuration
33
+ app.get('/api/config', async (c) => {
34
+ try {
35
+ const configPath = path.join(getConfigDir(), 'config.json');
36
+ let exists = false;
37
+ try {
38
+ await fs.access(configPath);
39
+ exists = true;
40
+ }
41
+ catch { }
42
+ const config = await loadConfig();
43
+ return c.json({ config, exists });
44
+ }
45
+ catch (error) {
46
+ const msg = error instanceof Error ? error.message : String(error);
47
+ return c.json({ error: msg }, 500);
48
+ }
49
+ });
50
+ // 2. Save configuration
51
+ app.post('/api/config', async (c) => {
52
+ try {
53
+ const newConfig = await c.req.json();
54
+ await saveConfig(newConfig);
55
+ return c.json({ success: true, config: newConfig });
56
+ }
57
+ catch (error) {
58
+ const msg = error instanceof Error ? error.message : String(error);
59
+ return c.json({ error: msg }, 500);
60
+ }
61
+ });
62
+ // 3. Scan development directory for repositories
63
+ app.get('/api/repos', async (c) => {
64
+ try {
65
+ const config = await loadConfig();
66
+ const repos = await scanForRepos(config.devDir, config.scanDepth);
67
+ return c.json(repos);
68
+ }
69
+ catch (error) {
70
+ const msg = error instanceof Error ? error.message : String(error);
71
+ return c.json({ error: msg }, 500);
72
+ }
73
+ });
74
+ // 4. List existing workspaces
75
+ app.get('/api/workspaces', async (c) => {
76
+ try {
77
+ const config = await loadConfig();
78
+ const workspaces = await listWorkspaces(config.workspacesDir);
79
+ return c.json(workspaces);
80
+ }
81
+ catch (error) {
82
+ const msg = error instanceof Error ? error.message : String(error);
83
+ return c.json({ error: msg }, 500);
84
+ }
85
+ });
86
+ // 5. Detect available AI assistants
87
+ app.get('/api/ai-detect', async (c) => {
88
+ try {
89
+ const assistants = await detectAIAssistants();
90
+ return c.json(assistants);
91
+ }
92
+ catch (error) {
93
+ const msg = error instanceof Error ? error.message : String(error);
94
+ return c.json({ error: msg }, 500);
95
+ }
96
+ });
97
+ // 6. Detect available editors
98
+ app.get('/api/editor-detect', async (c) => {
99
+ try {
100
+ const editors = await detectEditors();
101
+ return c.json(editors);
102
+ }
103
+ catch (error) {
104
+ const msg = error instanceof Error ? error.message : String(error);
105
+ return c.json({ error: msg }, 500);
106
+ }
107
+ });
108
+ // 7. Create workspace
109
+ app.post('/api/workspace', async (c) => {
110
+ try {
111
+ const body = await c.req.json();
112
+ const config = await loadConfig();
113
+ const workspacePath = path.join(config.workspacesDir, body.branchName);
114
+ const feature = {
115
+ id: body.branchName,
116
+ branchName: body.branchName,
117
+ description: body.description,
118
+ repos: body.repos.map((r) => r.path),
119
+ assistants: body.assistants,
120
+ workspacePath,
121
+ createdAt: new Date().toISOString(),
122
+ resumption: body.resumption,
123
+ };
124
+ // Create worktrees
125
+ await createWorkspace(feature, body.repos);
126
+ // Analyze repos
127
+ const analysis = await analyzeAllRepos(body.repos);
128
+ // Convert map to plain object for context generators if needed
129
+ const ctx = {
130
+ feature,
131
+ repos: body.repos,
132
+ analysis,
133
+ };
134
+ // Generate AI context files
135
+ await generateContextFiles(ctx, body.assistants, workspacePath);
136
+ return c.json({ success: true, workspacePath, feature });
137
+ }
138
+ catch (error) {
139
+ const msg = error instanceof Error ? error.message : String(error);
140
+ return c.json({ error: msg }, 500);
141
+ }
142
+ });
143
+ // 8. Open workspace in editor
144
+ app.post('/api/open-editor', async (c) => {
145
+ try {
146
+ const { workspacePath, command } = await c.req.json();
147
+ // Spawn editor process
148
+ execa(command, [workspacePath], { detached: true, stdio: 'ignore' }).unref();
149
+ return c.json({ success: true });
150
+ }
151
+ catch (error) {
152
+ const msg = error instanceof Error ? error.message : String(error);
153
+ return c.json({ error: msg }, 500);
154
+ }
155
+ });
156
+ // 9. Get status of running services in all/specific workspace
157
+ app.get('/api/workspace/:id/services', async (c) => {
158
+ try {
159
+ const id = c.req.param('id');
160
+ const config = await loadConfig();
161
+ const workspacePath = path.join(config.workspacesDir, id);
162
+ // Detect all services
163
+ const services = await detectAllServices(workspacePath);
164
+ // Detect existing tools
165
+ const tools = await detectOrchestrationTools(workspacePath);
166
+ // Get currently running services from running state
167
+ const runningState = await loadRunningState(workspacePath);
168
+ return c.json({
169
+ services,
170
+ orchestrationTools: tools,
171
+ runningState: runningState?.services || [],
172
+ });
173
+ }
174
+ catch (error) {
175
+ const msg = error instanceof Error ? error.message : String(error);
176
+ return c.json({ error: msg }, 500);
177
+ }
178
+ });
179
+ // 10. Start services in workspace
180
+ app.post('/api/workspace/:id/services/start', async (c) => {
181
+ try {
182
+ const id = c.req.param('id');
183
+ const { services } = await c.req.json();
184
+ const config = await loadConfig();
185
+ const workspacePath = path.join(config.workspacesDir, id);
186
+ const logDir = path.join(workspacePath, '.nexusflow-logs');
187
+ await startServices(services, workspacePath, logDir);
188
+ return c.json({ success: true });
189
+ }
190
+ catch (error) {
191
+ const msg = error instanceof Error ? error.message : String(error);
192
+ return c.json({ error: msg }, 500);
193
+ }
194
+ });
195
+ // 11. Stop services in workspace
196
+ app.post('/api/workspace/:id/services/stop', async (c) => {
197
+ try {
198
+ const id = c.req.param('id');
199
+ const config = await loadConfig();
200
+ const workspacePath = path.join(config.workspacesDir, id);
201
+ await stopServices(workspacePath);
202
+ return c.json({ success: true });
203
+ }
204
+ catch (error) {
205
+ const msg = error instanceof Error ? error.message : String(error);
206
+ return c.json({ error: msg }, 500);
207
+ }
208
+ });
209
+ // 12. Get service logs
210
+ app.get('/api/workspace/:id/services/logs/:serviceName', async (c) => {
211
+ try {
212
+ const id = c.req.param('id');
213
+ const serviceName = c.req.param('serviceName');
214
+ const config = await loadConfig();
215
+ const workspacePath = path.join(config.workspacesDir, id);
216
+ const logFile = path.join(workspacePath, '.nexusflow-logs', `${serviceName}.log`);
217
+ let content = '';
218
+ try {
219
+ // Read last 200 lines or 50KB
220
+ const stats = await fs.stat(logFile);
221
+ const size = stats.size;
222
+ const start = Math.max(0, size - 50000);
223
+ const fd = await fs.open(logFile, 'r');
224
+ const buffer = Buffer.alloc(size - start);
225
+ await fd.read(buffer, 0, buffer.length, start);
226
+ await fd.close();
227
+ content = buffer.toString('utf-8');
228
+ }
229
+ catch {
230
+ content = 'No logs available yet.';
231
+ }
232
+ return c.json({ logs: content });
233
+ }
234
+ catch (error) {
235
+ const msg = error instanceof Error ? error.message : String(error);
236
+ return c.json({ error: msg }, 500);
237
+ }
238
+ });
239
+ // 13. Get git changes in workspace sub-repositories
240
+ app.get('/api/workspace/:id/changes', async (c) => {
241
+ try {
242
+ const id = c.req.param('id');
243
+ const config = await loadConfig();
244
+ const workspacePath = path.join(config.workspacesDir, id);
245
+ // Load feature config to get repo paths
246
+ const feature = await loadFeatureConfig(workspacePath);
247
+ if (!feature) {
248
+ return c.json({ error: 'Workspace configuration not found.' }, 404);
249
+ }
250
+ const results = [];
251
+ // Check git status in each repo
252
+ for (const repoPath of feature.repos) {
253
+ const repoName = path.basename(repoPath);
254
+ const worktreePath = path.join(workspacePath, repoName);
255
+ try {
256
+ const { stdout } = await execa('git', ['status', '--porcelain'], { cwd: worktreePath });
257
+ const lines = stdout.split('\n').map((l) => l.trim()).filter(Boolean);
258
+ const files = lines.map((line) => {
259
+ const status = line.slice(0, 2).trim();
260
+ const file = line.slice(2).trim();
261
+ let type = 'modified';
262
+ if (status === 'A' || status === '??')
263
+ type = 'added';
264
+ else if (status === 'D')
265
+ type = 'deleted';
266
+ return { file, type, rawStatus: status };
267
+ });
268
+ results.push({
269
+ repoName,
270
+ repoPath: worktreePath,
271
+ files,
272
+ });
273
+ }
274
+ catch (error) {
275
+ results.push({
276
+ repoName,
277
+ repoPath: worktreePath,
278
+ files: [],
279
+ error: error instanceof Error ? error.message : String(error),
280
+ });
281
+ }
282
+ }
283
+ return c.json({ changes: results });
284
+ }
285
+ catch (error) {
286
+ const msg = error instanceof Error ? error.message : String(error);
287
+ return c.json({ error: msg }, 500);
288
+ }
289
+ });
290
+ // 14. Resume session in workspace (copies CLI resume command and opens editor)
291
+ app.post('/api/workspace/:id/resume', async (c) => {
292
+ try {
293
+ const id = decodeURIComponent(c.req.param('id'));
294
+ const config = await loadConfig();
295
+ const workspacePath = path.join(config.workspacesDir, id);
296
+ // Load feature config to get repo paths
297
+ const feature = await loadFeatureConfig(workspacePath);
298
+ if (!feature) {
299
+ return c.json({ error: 'Workspace configuration not found.' }, 404);
300
+ }
301
+ const body = await c.req.json().catch(() => ({}));
302
+ const targetSessionId = body.sessionId;
303
+ const targetAssistant = body.assistant;
304
+ // Find the session to resume
305
+ let resumeCommand = '';
306
+ let selectedAssistant = targetAssistant || feature.assistants[0] || 'antigravity';
307
+ let selectedSessionId = targetSessionId;
308
+ if (!selectedSessionId) {
309
+ // Find the most recent session matching this workspace
310
+ const sessions = await findSessions(workspacePath, feature.repos);
311
+ if (sessions.length > 0) {
312
+ selectedSessionId = sessions[0].id;
313
+ selectedAssistant = sessions[0].assistant;
314
+ }
315
+ }
316
+ if (selectedSessionId) {
317
+ if (selectedAssistant === 'antigravity') {
318
+ resumeCommand = `agy --conversation ${selectedSessionId}`;
319
+ }
320
+ else if (selectedAssistant === 'claude') {
321
+ resumeCommand = `claude --resume ${selectedSessionId}`;
322
+ }
323
+ else if (selectedAssistant === 'codex') {
324
+ resumeCommand = `codex resume ${selectedSessionId}`;
325
+ }
326
+ else if (selectedAssistant === 'copilot') {
327
+ resumeCommand = `copilot --resume ${selectedSessionId}`;
328
+ }
329
+ }
330
+ else {
331
+ // Fallback to continue command
332
+ if (selectedAssistant === 'antigravity') {
333
+ resumeCommand = 'agy --continue';
334
+ }
335
+ else if (selectedAssistant === 'claude') {
336
+ resumeCommand = 'claude --continue';
337
+ }
338
+ else if (selectedAssistant === 'codex') {
339
+ resumeCommand = 'codex resume --last';
340
+ }
341
+ else if (selectedAssistant === 'copilot') {
342
+ resumeCommand = 'copilot --continue';
343
+ }
344
+ else {
345
+ resumeCommand = 'agy --continue';
346
+ }
347
+ }
348
+ // Open in editor if command is provided
349
+ if (body.command) {
350
+ try {
351
+ execa(body.command, [workspacePath], { detached: true, stdio: 'ignore' }).unref();
352
+ }
353
+ catch (e) {
354
+ console.error('Failed to launch editor:', e);
355
+ }
356
+ }
357
+ return c.json({ success: true, resumeCommand, workspacePath });
358
+ }
359
+ catch (error) {
360
+ const msg = error instanceof Error ? error.message : String(error);
361
+ return c.json({ error: msg }, 500);
362
+ }
363
+ });
364
+ // 15. List past AI sessions for a workspace
365
+ app.get('/api/workspace/:id/sessions', async (c) => {
366
+ try {
367
+ const id = decodeURIComponent(c.req.param('id'));
368
+ const config = await loadConfig();
369
+ const workspacePath = path.join(config.workspacesDir, id);
370
+ const feature = await loadFeatureConfig(workspacePath);
371
+ if (!feature) {
372
+ return c.json({ error: 'Workspace configuration not found.' }, 404);
373
+ }
374
+ const sessions = await findSessions(workspacePath, feature.repos);
375
+ return c.json({ sessions });
376
+ }
377
+ catch (error) {
378
+ const msg = error instanceof Error ? error.message : String(error);
379
+ return c.json({ error: msg }, 500);
380
+ }
381
+ });
382
+ // 16. Fetch transcript for a specific AI session
383
+ app.get('/api/session/:assistant/:sessionId/transcript', async (c) => {
384
+ try {
385
+ const assistant = c.req.param('assistant');
386
+ const sessionId = c.req.param('sessionId');
387
+ const messages = await getSessionTranscript(assistant, sessionId);
388
+ return c.json({ messages });
389
+ }
390
+ catch (error) {
391
+ const msg = error instanceof Error ? error.message : String(error);
392
+ return c.json({ error: msg }, 500);
393
+ }
394
+ });
395
+ // Serve index.html explicitly on root endpoint
396
+ app.get('/', async (c) => {
397
+ try {
398
+ const html = await fs.readFile(path.join(guiPath, 'index.html'), 'utf-8');
399
+ return c.html(html);
400
+ }
401
+ catch (error) {
402
+ return c.text('GUI dashboard built assets not found. Run "npm run build" first.', 404);
403
+ }
404
+ });
405
+ // Serve static assets from GUI build folder
406
+ app.use('/*', serveStatic({ root: path.relative(process.cwd(), guiPath) }));
407
+ /**
408
+ * Starts the local GUI web server.
409
+ *
410
+ * @param port - Port to run on.
411
+ */
412
+ export function startServer(port = 3000) {
413
+ return new Promise((resolve) => {
414
+ const server = serve({ fetch: app.fetch, port }, (info) => {
415
+ resolve({ port: info.port, server });
416
+ });
417
+ });
418
+ }
419
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * @module types
3
+ * Shared interfaces and types for NexusFlow.
4
+ */
5
+ /** Supported AI assistant identifiers. */
6
+ export type AIAssistant = 'claude' | 'antigravity' | 'codex' | 'copilot' | 'cursor';
7
+ /** Top-level NexusFlow configuration stored in ~/.nexusflow/config.json. */
8
+ export interface NexusFlowConfig {
9
+ /** Semantic version of the NexusFlow config schema. */
10
+ version: string;
11
+ /** Root development directory. Default: ~/dev */
12
+ devDir: string;
13
+ /** Directory where workspaces are created. Default: ~/dev/workspaces */
14
+ workspacesDir: string;
15
+ /** The user's preferred AI assistant, or null if none chosen yet. */
16
+ defaultAssistant: AIAssistant | null;
17
+ /** How many directory levels deep to scan for git repos. Default: 2 */
18
+ scanDepth: number;
19
+ }
20
+ /** Result of probing for an AI assistant on the system. */
21
+ export interface DetectedAI {
22
+ /** Canonical assistant identifier. */
23
+ name: AIAssistant;
24
+ /** Human-readable label shown in prompts. */
25
+ displayName: string;
26
+ /** Whether the assistant's CLI was found. */
27
+ detected: boolean;
28
+ /** The CLI command that was detected (e.g. 'claude', 'antigravity'). */
29
+ command?: string;
30
+ }
31
+ /** Result of probing for a code editor on the system. */
32
+ export interface DetectedEditor {
33
+ /** Human-readable editor name. */
34
+ name: string;
35
+ /** CLI command used to launch the editor. */
36
+ command: string;
37
+ /** Whether the editor's CLI was found in PATH. */
38
+ detected: boolean;
39
+ }
40
+ /** Metadata about a discovered git repository. */
41
+ export interface RepoInfo {
42
+ /** Directory name of the repo. */
43
+ name: string;
44
+ /** Absolute path to the repo root. */
45
+ path: string;
46
+ /** Default branch — typically 'main' or 'master'. */
47
+ defaultBranch: string;
48
+ }
49
+ /** Metadata about a past AI session. */
50
+ export interface AISession {
51
+ id: string;
52
+ assistant: AIAssistant;
53
+ title: string;
54
+ createdAt: string;
55
+ updatedAt: string;
56
+ messageCount: number;
57
+ workspacePath: string;
58
+ }
59
+ /** A single chat message in a session transcript. */
60
+ export interface ChatMessage {
61
+ role: 'user' | 'assistant';
62
+ content: string;
63
+ timestamp?: string;
64
+ }
65
+ /** Configuration for resuming the active session. */
66
+ export interface ResumptionConfig {
67
+ /** The command to run verification tests. */
68
+ testCommand?: string;
69
+ /** The command to spin up dev databases/mocks/caches. */
70
+ mockCommand?: string;
71
+ /** The command to start workspace services manually if needed. */
72
+ startCommand?: string;
73
+ }
74
+ /** A feature workspace that spans one or more repos. */
75
+ export interface Feature {
76
+ /** Unique identifier — the git branch name. */
77
+ id: string;
78
+ /** Git branch name created for this feature. */
79
+ branchName: string;
80
+ /** Short human-readable description of the feature. */
81
+ description: string;
82
+ /** Absolute paths to the repos included in this feature. */
83
+ repos: string[];
84
+ /** AI assistants enabled for this feature workspace. */
85
+ assistants: AIAssistant[];
86
+ /** Absolute path to the workspace directory on disk. */
87
+ workspacePath: string;
88
+ /** ISO-8601 timestamp of when the feature was created. */
89
+ createdAt: string;
90
+ /** Resumption configuration. */
91
+ resumption?: ResumptionConfig;
92
+ }
93
+ /** Runtime context for an active workspace — now includes analysis data. */
94
+ export interface WorkspaceContext {
95
+ /** The feature definition. */
96
+ feature: Feature;
97
+ /** Full repo metadata for every repo in the feature. */
98
+ repos: RepoInfo[];
99
+ /** Analysis results for each repo (keyed by repo path). */
100
+ analysis?: Map<string, ProjectAnalysis>;
101
+ }
102
+ /** Recognized language/runtime. */
103
+ export type Language = 'typescript' | 'javascript' | 'csharp' | 'python' | 'go' | 'java' | 'rust' | 'ruby' | 'php' | 'other';
104
+ /** Recognized framework. */
105
+ export type Framework = 'react' | 'nextjs' | 'angular' | 'vue' | 'svelte' | 'express' | 'nestjs' | 'fastify' | 'hono' | 'aspnet' | 'blazor' | 'django' | 'flask' | 'fastapi' | 'gin' | 'spring' | 'rails' | 'laravel' | 'other';
106
+ /** Recognized project type. */
107
+ export type ProjectType = 'frontend' | 'backend' | 'fullstack' | 'library' | 'api' | 'cli' | 'worker' | 'other';
108
+ /** Detected tech stack for a repo. */
109
+ export interface TechStack {
110
+ languages: Language[];
111
+ frameworks: Framework[];
112
+ buildTools: string[];
113
+ projectType: ProjectType;
114
+ }
115
+ /** A detected API endpoint or route. */
116
+ export interface ApiEndpoint {
117
+ method: string;
118
+ path: string;
119
+ source?: string;
120
+ }
121
+ /** An inter-repo dependency reference. */
122
+ export interface RepoDependency {
123
+ /** Name of the dependency (npm package, NuGet package, etc.). */
124
+ name: string;
125
+ /** Type of dependency. */
126
+ type: 'npm' | 'nuget' | 'pip' | 'go' | 'other';
127
+ /** Version constraint if known. */
128
+ version?: string;
129
+ }
130
+ /** Port/service configuration detected in a repo. */
131
+ export interface ServicePort {
132
+ port: number;
133
+ protocol: 'http' | 'https' | 'grpc' | 'other';
134
+ source: string;
135
+ }
136
+ /** Full analysis result for a single project/repo. */
137
+ export interface ProjectAnalysis {
138
+ /** Repo name. */
139
+ name: string;
140
+ /** Repo path. */
141
+ path: string;
142
+ /** Detected tech stack. */
143
+ techStack: TechStack;
144
+ /** Detected API endpoints. */
145
+ endpoints: ApiEndpoint[];
146
+ /** Detected dependencies. */
147
+ dependencies: RepoDependency[];
148
+ /** Detected ports/services. */
149
+ ports: ServicePort[];
150
+ /** Summary from README.md if found. */
151
+ readmeSummary: string | null;
152
+ /** Existing AI config files found in the repo. */
153
+ existingAIConfigs: ExistingAIConfig[];
154
+ }
155
+ /** An existing AI configuration file found in a repo. */
156
+ export interface ExistingAIConfig {
157
+ /** Which assistant this config is for. */
158
+ assistant: AIAssistant | 'agents';
159
+ /** File path relative to repo root. */
160
+ relativePath: string;
161
+ /** First 500 chars of the content for context. */
162
+ contentPreview: string;
163
+ }
164
+ /** How to start a single service/project. */
165
+ export interface ServiceConfig {
166
+ /** Display name for the service. */
167
+ name: string;
168
+ /** Absolute path to the project directory. */
169
+ cwd: string;
170
+ /** The command to run (e.g., 'npm', 'dotnet', 'python'). */
171
+ command: string;
172
+ /** Arguments for the command. */
173
+ args: string[];
174
+ /** Optional port the service listens on. */
175
+ port?: number;
176
+ /** How the start command was detected. */
177
+ source: 'package.json' | 'dotnet' | 'docker-compose' | 'aspire' | 'python' | 'go' | 'makefile' | 'manual';
178
+ }
179
+ /** Detected orchestration tool in a workspace. */
180
+ export interface OrchestrationDetection {
181
+ /** Which tool was found. */
182
+ tool: 'docker-compose' | 'aspire' | 'tilt' | 'procfile' | 'makefile';
183
+ /** Path to the config file. */
184
+ configPath: string;
185
+ /** Start command for this tool. */
186
+ startCommand: string;
187
+ /** Stop command for this tool. */
188
+ stopCommand: string;
189
+ }
190
+ /** A currently running service process. */
191
+ export interface RunningService {
192
+ /** Service name. */
193
+ name: string;
194
+ /** Process ID. */
195
+ pid: number;
196
+ /** Service config used to start it. */
197
+ config: ServiceConfig;
198
+ /** Timestamp when started. */
199
+ startedAt: string;
200
+ }
201
+ /** State file saved to track running services. */
202
+ export interface RunningState {
203
+ /** Workspace path this state belongs to. */
204
+ workspacePath: string;
205
+ /** List of running services. */
206
+ services: RunningService[];
207
+ /** Timestamp when the state was last updated. */
208
+ updatedAt: string;
209
+ }
210
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}