@mrpatronz/nexusflow 0.2.17 → 0.2.19

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 (320) hide show
  1. package/.agents/skills/ccc/SKILL.md +71 -0
  2. package/.agents/skills/ccc/references/management.md +110 -0
  3. package/.agents/skills/ccc/references/settings.md +126 -0
  4. package/.github/dependabot.yml +52 -52
  5. package/.github/workflows/ci.yml +44 -0
  6. package/.github/workflows/dependabot-merge.yml +53 -53
  7. package/.github/workflows/release-desktop.yml +67 -0
  8. package/.github/workflows/release-npm.yml +65 -0
  9. package/.github/workflows/release-vscode.yml +61 -0
  10. package/.vscode/launch.json +17 -17
  11. package/.vscode/tasks.json +17 -17
  12. package/GETTING_STARTED.md +114 -114
  13. package/README.md +364 -336
  14. package/desktop/build-installer.js +228 -228
  15. package/desktop/build.js +118 -118
  16. package/desktop/installer/nexusflow.iss +35 -35
  17. package/desktop/neutralino.config.json +38 -38
  18. package/desktop/package-lock.json +1060 -1060
  19. package/desktop/package.json +14 -14
  20. package/dist/commands/adapter.d.ts +27 -0
  21. package/dist/commands/adapter.d.ts.map +1 -0
  22. package/dist/commands/adapter.js +318 -0
  23. package/dist/commands/adapter.js.map +1 -0
  24. package/dist/commands/add-repo.d.ts.map +1 -1
  25. package/dist/commands/add-repo.js +0 -1
  26. package/dist/commands/add-repo.js.map +1 -1
  27. package/dist/commands/commands.test.js +2 -2
  28. package/dist/commands/commands.test.js.map +1 -1
  29. package/dist/commands/config.d.ts +22 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +50 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/create.d.ts.map +1 -1
  34. package/dist/commands/create.js +14 -17
  35. package/dist/commands/create.js.map +1 -1
  36. package/dist/commands/doctor.d.ts.map +1 -1
  37. package/dist/commands/doctor.js +11 -0
  38. package/dist/commands/doctor.js.map +1 -1
  39. package/dist/commands/refresh.d.ts +1 -0
  40. package/dist/commands/refresh.d.ts.map +1 -1
  41. package/dist/commands/refresh.js +2 -14
  42. package/dist/commands/refresh.js.map +1 -1
  43. package/dist/commands/sync.d.ts.map +1 -1
  44. package/dist/commands/sync.js +36 -54
  45. package/dist/commands/sync.js.map +1 -1
  46. package/dist/commands/tui.d.ts.map +1 -1
  47. package/dist/commands/tui.js +63 -10
  48. package/dist/commands/tui.js.map +1 -1
  49. package/dist/core/adapters/local-storage.d.ts +14 -0
  50. package/dist/core/adapters/local-storage.d.ts.map +1 -0
  51. package/dist/core/adapters/local-storage.js +58 -0
  52. package/dist/core/adapters/local-storage.js.map +1 -0
  53. package/dist/core/adapters/obsidian-storage.d.ts +28 -0
  54. package/dist/core/adapters/obsidian-storage.d.ts.map +1 -0
  55. package/dist/core/adapters/obsidian-storage.js +135 -0
  56. package/dist/core/adapters/obsidian-storage.js.map +1 -0
  57. package/dist/core/adapters/registry.d.ts +8 -0
  58. package/dist/core/adapters/registry.d.ts.map +1 -0
  59. package/dist/core/adapters/registry.js +37 -0
  60. package/dist/core/adapters/registry.js.map +1 -0
  61. package/dist/core/adapters/storage.test.d.ts +2 -0
  62. package/dist/core/adapters/storage.test.d.ts.map +1 -0
  63. package/dist/core/adapters/storage.test.js +106 -0
  64. package/dist/core/adapters/storage.test.js.map +1 -0
  65. package/dist/core/adapters/vault-storage.d.ts +16 -0
  66. package/dist/core/adapters/vault-storage.d.ts.map +1 -0
  67. package/dist/core/adapters/vault-storage.js +77 -0
  68. package/dist/core/adapters/vault-storage.js.map +1 -0
  69. package/dist/core/config.d.ts.map +1 -1
  70. package/dist/core/config.js +28 -4
  71. package/dist/core/config.js.map +1 -1
  72. package/dist/core/plugins/index.d.ts +14 -0
  73. package/dist/core/plugins/index.d.ts.map +1 -0
  74. package/dist/core/plugins/index.js +2 -0
  75. package/dist/core/plugins/index.js.map +1 -0
  76. package/dist/core/plugins/loader.d.ts +2 -0
  77. package/dist/core/plugins/loader.d.ts.map +1 -0
  78. package/dist/core/plugins/loader.js +34 -0
  79. package/dist/core/plugins/loader.js.map +1 -0
  80. package/dist/core/ports/storage.d.ts +59 -0
  81. package/dist/core/ports/storage.d.ts.map +1 -0
  82. package/dist/core/ports/storage.js +10 -0
  83. package/dist/core/ports/storage.js.map +1 -0
  84. package/dist/core/storage.d.ts +10 -0
  85. package/dist/core/storage.d.ts.map +1 -0
  86. package/dist/core/storage.js +29 -0
  87. package/dist/core/storage.js.map +1 -0
  88. package/dist/core/sync.d.ts +44 -0
  89. package/dist/core/sync.d.ts.map +1 -0
  90. package/dist/core/sync.js +82 -0
  91. package/dist/core/sync.js.map +1 -0
  92. package/dist/core/workspace-state.d.ts +51 -0
  93. package/dist/core/workspace-state.d.ts.map +1 -0
  94. package/dist/core/workspace-state.js +108 -0
  95. package/dist/core/workspace-state.js.map +1 -0
  96. package/dist/core/workspace-state.test.d.ts +2 -0
  97. package/dist/core/workspace-state.test.d.ts.map +1 -0
  98. package/dist/core/workspace-state.test.js +84 -0
  99. package/dist/core/workspace-state.test.js.map +1 -0
  100. package/dist/core/workspace.d.ts.map +1 -1
  101. package/dist/core/workspace.js +110 -16
  102. package/dist/core/workspace.js.map +1 -1
  103. package/dist/generators/base.d.ts.map +1 -1
  104. package/dist/generators/base.js +80 -79
  105. package/dist/generators/base.js.map +1 -1
  106. package/dist/generators/codex.js +11 -11
  107. package/dist/generators/copilot.js +17 -17
  108. package/dist/generators/cursor.js +5 -5
  109. package/dist/generators/diff-context.d.ts +6 -0
  110. package/dist/generators/diff-context.d.ts.map +1 -0
  111. package/dist/generators/diff-context.js +68 -0
  112. package/dist/generators/diff-context.js.map +1 -0
  113. package/dist/generators/index.d.ts +1 -1
  114. package/dist/generators/index.d.ts.map +1 -1
  115. package/dist/generators/index.js +125 -68
  116. package/dist/generators/index.js.map +1 -1
  117. package/dist/generators/map-generator.d.ts.map +1 -1
  118. package/dist/generators/map-generator.js +21 -25
  119. package/dist/generators/map-generator.js.map +1 -1
  120. package/dist/generators/plan-generator.d.ts.map +1 -1
  121. package/dist/generators/plan-generator.js +3 -5
  122. package/dist/generators/plan-generator.js.map +1 -1
  123. package/dist/generators/skills-generator.js +28 -28
  124. package/dist/gui/assets/index-Bdbld6yY.css +1 -0
  125. package/dist/gui/assets/index-D8iJPvnk.js +26 -0
  126. package/dist/gui/icons.svg +24 -24
  127. package/dist/gui/index.html +18 -18
  128. package/dist/index.js +131 -20
  129. package/dist/index.js.map +1 -1
  130. package/dist/mcp/server.d.ts.map +1 -1
  131. package/dist/mcp/server.js +42 -0
  132. package/dist/mcp/server.js.map +1 -1
  133. package/dist/server.d.ts.map +1 -1
  134. package/dist/server.js +140 -56
  135. package/dist/server.js.map +1 -1
  136. package/dist/server.test.js +105 -48
  137. package/dist/server.test.js.map +1 -1
  138. package/dist/types.d.ts +38 -2
  139. package/dist/types.d.ts.map +1 -1
  140. package/dist/utils/local-ai.d.ts.map +1 -1
  141. package/dist/utils/local-ai.js +7 -3
  142. package/dist/utils/local-ai.js.map +1 -1
  143. package/dist/utils/multi-git.d.ts +33 -8
  144. package/dist/utils/multi-git.d.ts.map +1 -1
  145. package/dist/utils/multi-git.js +91 -19
  146. package/dist/utils/multi-git.js.map +1 -1
  147. package/dist/utils/multi-git.test.d.ts +2 -0
  148. package/dist/utils/multi-git.test.d.ts.map +1 -0
  149. package/dist/utils/multi-git.test.js +125 -0
  150. package/dist/utils/multi-git.test.js.map +1 -0
  151. package/dist/utils/update-check.d.ts.map +1 -1
  152. package/dist/utils/update-check.js +0 -28
  153. package/dist/utils/update-check.js.map +1 -1
  154. package/dist/utils/workflow-advisor.d.ts +16 -0
  155. package/dist/utils/workflow-advisor.d.ts.map +1 -0
  156. package/dist/utils/workflow-advisor.js +100 -0
  157. package/dist/utils/workflow-advisor.js.map +1 -0
  158. package/extension/package-lock.json +6044 -2673
  159. package/extension/package.json +117 -108
  160. package/extension/src/extension.ts +653 -631
  161. package/extension/tsconfig.json +21 -21
  162. package/gui/README.md +73 -73
  163. package/gui/e2e/dashboard.spec.ts +61 -0
  164. package/gui/e2e/wizard.spec.ts +346 -346
  165. package/gui/eslint.config.js +26 -26
  166. package/gui/index.html +17 -17
  167. package/gui/package-lock.json +3137 -3079
  168. package/gui/package.json +37 -36
  169. package/gui/playwright.config.ts +41 -41
  170. package/gui/public/icons.svg +24 -24
  171. package/gui/src/App.css +1 -1
  172. package/gui/src/App.tsx +3573 -3407
  173. package/gui/src/app/AppSidebar.tsx +69 -0
  174. package/gui/src/assets/vite.svg +1 -1
  175. package/gui/src/components/AddRepoPicker.tsx +81 -0
  176. package/gui/src/components/ui/Button.tsx +40 -0
  177. package/gui/src/components/ui/Card.tsx +6 -0
  178. package/gui/src/components/ui/EmptyState.tsx +22 -0
  179. package/gui/src/components/ui/Input.tsx +21 -0
  180. package/gui/src/components/ui/Menu.tsx +71 -0
  181. package/gui/src/components/ui/Modal.tsx +39 -0
  182. package/gui/src/components/ui/PageHeader.tsx +21 -0
  183. package/gui/src/components/ui/RepoStatusStrip.tsx +33 -0
  184. package/gui/src/components/ui/Skeleton.tsx +5 -0
  185. package/gui/src/components/ui/StatusPill.tsx +36 -0
  186. package/gui/src/components/ui/Tabs.tsx +40 -0
  187. package/gui/src/components/ui/cn.ts +4 -0
  188. package/gui/src/components/ui/index.ts +16 -0
  189. package/gui/src/features/changes/ChangesViewer.tsx +388 -388
  190. package/gui/src/features/knowledge/KnowledgeBase.tsx +84 -84
  191. package/gui/src/features/onboarding/OnboardingWizard.tsx +230 -230
  192. package/gui/src/features/plan/ImplementationPlan.tsx +32 -32
  193. package/gui/src/features/services/ServiceConsole.tsx +215 -250
  194. package/gui/src/features/sessions/SessionHistory.tsx +195 -195
  195. package/gui/src/index.css +167 -152
  196. package/gui/src/lib/status.ts +24 -0
  197. package/gui/src/main.tsx +94 -94
  198. package/gui/src/pages/DashboardPage.tsx +129 -0
  199. package/gui/src/pages/WorkspacesPage.tsx +352 -0
  200. package/gui/src/types.ts +81 -62
  201. package/gui/tsconfig.app.json +25 -25
  202. package/gui/tsconfig.json +7 -7
  203. package/gui/tsconfig.node.json +24 -24
  204. package/gui/vite.config.ts +12 -12
  205. package/package.json +55 -56
  206. package/resources/workflows/plan-implement-review.md +8 -8
  207. package/resources/workflows/research-verify.md +6 -6
  208. package/resources/workflows/solo-developer.md +3 -3
  209. package/scripts/simulate-workspaces.ts +55 -55
  210. package/skills-lock.json +11 -0
  211. package/src/analyzers/detect-apis.ts +290 -290
  212. package/src/analyzers/detect-deps.ts +315 -315
  213. package/src/analyzers/detect-existing.ts +74 -74
  214. package/src/analyzers/detect-ports.ts +110 -110
  215. package/src/analyzers/index.ts +97 -97
  216. package/src/analyzers/messaging-analyzer.ts +254 -254
  217. package/src/analyzers/readme-summarizer.ts +102 -102
  218. package/src/analyzers/run-analyzer.ts +269 -269
  219. package/src/analyzers/tech-stack.ts +283 -283
  220. package/src/commands/adapter.ts +348 -0
  221. package/src/commands/add-repo.ts +156 -157
  222. package/src/commands/commands.test.ts +156 -155
  223. package/src/commands/commit.ts +131 -131
  224. package/src/commands/config.ts +52 -0
  225. package/src/commands/create.ts +204 -207
  226. package/src/commands/desktop.ts +128 -128
  227. package/src/commands/diff.ts +125 -125
  228. package/src/commands/doctor.ts +370 -357
  229. package/src/commands/handoff.ts +266 -266
  230. package/src/commands/init.ts +134 -134
  231. package/src/commands/list.ts +46 -46
  232. package/src/commands/logs.ts +63 -63
  233. package/src/commands/mcp.ts +94 -92
  234. package/src/commands/open.ts +129 -129
  235. package/src/commands/refresh.ts +137 -147
  236. package/src/commands/remove.ts +98 -98
  237. package/src/commands/start.ts +117 -117
  238. package/src/commands/status.ts +54 -54
  239. package/src/commands/stop.ts +55 -55
  240. package/src/commands/sync.ts +125 -151
  241. package/src/commands/tui.ts +484 -424
  242. package/src/commands/ui.ts +111 -111
  243. package/src/core/adapters/local-storage.ts +66 -0
  244. package/src/core/adapters/obsidian-storage.ts +151 -0
  245. package/src/core/adapters/registry.ts +44 -0
  246. package/src/core/adapters/storage.test.ts +174 -0
  247. package/src/core/adapters/vault-storage.ts +86 -0
  248. package/src/core/config.test.ts +96 -96
  249. package/src/core/config.ts +140 -115
  250. package/src/core/graph.ts +344 -344
  251. package/src/core/plugins/index.ts +17 -0
  252. package/src/core/plugins/loader.ts +36 -0
  253. package/src/core/ports/storage.ts +71 -0
  254. package/src/core/scanner.test.ts +61 -61
  255. package/src/core/scanner.ts +91 -91
  256. package/src/core/storage.ts +37 -0
  257. package/src/core/sync.ts +121 -0
  258. package/src/core/workspace-state.test.ts +108 -0
  259. package/src/core/workspace-state.ts +130 -0
  260. package/src/core/workspace.ts +487 -380
  261. package/src/core/worktree.ts +120 -120
  262. package/src/generators/antigravity.ts +32 -32
  263. package/src/generators/base.ts +243 -240
  264. package/src/generators/claude.ts +34 -34
  265. package/src/generators/codex.ts +48 -48
  266. package/src/generators/copilot.ts +56 -56
  267. package/src/generators/cursor.ts +44 -44
  268. package/src/generators/diff-context.ts +75 -0
  269. package/src/generators/index.ts +322 -250
  270. package/src/generators/map-generator.test.ts +159 -159
  271. package/src/generators/map-generator.ts +539 -542
  272. package/src/generators/plan-generator.ts +483 -481
  273. package/src/generators/skills-generator.ts +259 -259
  274. package/src/index.ts +539 -426
  275. package/src/mcp/server.ts +338 -294
  276. package/src/orchestration/detect.ts +313 -313
  277. package/src/orchestration/index.ts +7 -7
  278. package/src/orchestration/runner.ts +283 -283
  279. package/src/server.test.ts +618 -555
  280. package/src/server.ts +1402 -1308
  281. package/src/types.ts +451 -408
  282. package/src/utils/detect-ai.test.ts +44 -44
  283. package/src/utils/detect-ai.ts +84 -84
  284. package/src/utils/detect-editors.test.ts +48 -48
  285. package/src/utils/detect-editors.ts +57 -57
  286. package/src/utils/git.test.ts +74 -74
  287. package/src/utils/git.ts +117 -117
  288. package/src/utils/local-ai.test.ts +130 -130
  289. package/src/utils/local-ai.ts +116 -111
  290. package/src/utils/multi-git.test.ts +158 -0
  291. package/src/utils/multi-git.ts +405 -313
  292. package/src/utils/prompts.ts +209 -209
  293. package/src/utils/session-finder.ts +483 -483
  294. package/src/utils/system-scanner.test.ts +89 -89
  295. package/src/utils/system-scanner.ts +96 -96
  296. package/src/utils/update-check.ts +286 -309
  297. package/src/utils/workflow-advisor.ts +118 -0
  298. package/src/utils/workflows.test.ts +114 -114
  299. package/src/utils/workflows.ts +178 -178
  300. package/tsconfig.json +19 -19
  301. package/vitest.config.ts +14 -14
  302. package/.github/workflows/release.yml +0 -112
  303. package/dist/commands/pack.d.ts +0 -7
  304. package/dist/commands/pack.d.ts.map +0 -1
  305. package/dist/commands/pack.js +0 -64
  306. package/dist/commands/pack.js.map +0 -1
  307. package/dist/core/packer.d.ts +0 -14
  308. package/dist/core/packer.d.ts.map +0 -1
  309. package/dist/core/packer.js +0 -87
  310. package/dist/core/packer.js.map +0 -1
  311. package/dist/core/packer.test.d.ts +0 -2
  312. package/dist/core/packer.test.d.ts.map +0 -1
  313. package/dist/core/packer.test.js +0 -82
  314. package/dist/core/packer.test.js.map +0 -1
  315. package/dist/gui/assets/index-Ct3qq-X4.js +0 -25
  316. package/dist/gui/assets/index-P_ZrgHXg.css +0 -1
  317. package/gui/src/features/workspace/WorkspaceList.tsx +0 -666
  318. package/src/commands/pack.ts +0 -73
  319. package/src/core/packer.test.ts +0 -99
  320. package/src/core/packer.ts +0 -107
package/src/types.ts CHANGED
@@ -1,408 +1,451 @@
1
- /**
2
- * @module types
3
- * Shared interfaces and types for NexusFlow.
4
- */
5
-
6
- /** Supported AI assistant identifiers. */
7
- export type AIAssistant = 'claude' | 'antigravity' | 'codex' | 'copilot' | 'cursor';
8
-
9
- export interface LocalLlmConfig {
10
- enabled: boolean;
11
- provider: 'ollama' | 'openai-compatible';
12
- endpoint: string;
13
- model: string;
14
- }
15
-
16
- /** Top-level NexusFlow configuration stored in ~/.nexusflow/config.json. */
17
- export interface NexusFlowConfig {
18
- /** Semantic version of the NexusFlow config schema. */
19
- version: string;
20
-
21
- /** Root development directory. Default: ~/dev */
22
- devDir: string;
23
-
24
- /** Directory where workspaces are created. Default: ~/dev/workspaces */
25
- workspacesDir: string;
26
-
27
- /** The user's preferred AI assistant, or null if none chosen yet. */
28
- defaultAssistant: AIAssistant | null;
29
-
30
- /** The user's preferred editor command, or null if none chosen yet. */
31
- defaultEditor?: string | null;
32
-
33
- /** How many directory levels deep to scan for git repos. Default: 2 */
34
- scanDepth: number;
35
-
36
- /** Global patterns to exclude when packing/analyzing repositories. */
37
- excludePatterns?: string[];
38
-
39
- /** Whether to pack codebase context into XML format. Default: true */
40
- packContextXml?: boolean;
41
-
42
- /** ISO timestamp of the last update check. */
43
- lastUpdateCheck?: string;
44
-
45
- /** The last checked latest version from NPM. */
46
- latestVersion?: string;
47
- latestDownloadUrl?: string | null;
48
- latestReleaseNotes?: string;
49
-
50
- /** Local LLM settings for delegating simple tasks. */
51
- localLlm?: LocalLlmConfig;
52
- }
53
-
54
- /** Result of probing for an AI assistant on the system. */
55
- export interface DetectedAI {
56
- /** Canonical assistant identifier. */
57
- name: AIAssistant;
58
-
59
- /** Human-readable label shown in prompts. */
60
- displayName: string;
61
-
62
- /** Whether the assistant's CLI was found. */
63
- detected: boolean;
64
-
65
- /** The CLI command that was detected (e.g. 'claude', 'antigravity'). */
66
- command?: string;
67
- }
68
-
69
- /** Result of probing for a code editor on the system. */
70
- export interface DetectedEditor {
71
- /** Human-readable editor name. */
72
- name: string;
73
-
74
- /** CLI command used to launch the editor. */
75
- command: string;
76
-
77
- /** Whether the editor's CLI was found in PATH. */
78
- detected: boolean;
79
- }
80
-
81
- /** Metadata about a discovered git repository. */
82
- export interface RepoInfo {
83
- /** Directory name of the repo. */
84
- name: string;
85
-
86
- /** Absolute path to the repo root. */
87
- path: string;
88
-
89
- /** Default branch — typically 'main' or 'master'. */
90
- defaultBranch: string;
91
- }
92
-
93
- /** Metadata about a past AI session. */
94
- export interface AISession {
95
- id: string;
96
- assistant: AIAssistant;
97
- title: string;
98
- createdAt: string;
99
- updatedAt: string;
100
- messageCount: number;
101
- workspacePath: string;
102
- }
103
-
104
- /** A single chat message in a session transcript. */
105
- export interface ChatMessage {
106
- role: 'user' | 'assistant';
107
- content: string;
108
- timestamp?: string;
109
- }
110
-
111
-
112
- /** Configuration for resuming the active session. */
113
- export interface ResumptionConfig {
114
- /** The command to run verification tests. */
115
- testCommand?: string;
116
- /** The command to spin up dev databases/mocks/caches. */
117
- mockCommand?: string;
118
- /** The command to start workspace services manually if needed. */
119
- startCommand?: string;
120
- }
121
-
122
- /** A feature workspace that spans one or more repos. */
123
- export interface Feature {
124
- /** Unique identifier — the git branch name. */
125
- id: string;
126
-
127
- /** Git branch name created for this feature. */
128
- branchName: string;
129
-
130
- /** Short human-readable description of the feature. */
131
- description: string;
132
-
133
- /** Absolute paths to the repos included in this feature. */
134
- repos: string[];
135
-
136
- /** Absolute paths to the original repositories. */
137
- originalRepos?: string[];
138
-
139
- /** AI assistants enabled for this feature workspace. */
140
- assistants: AIAssistant[];
141
-
142
- /** Absolute path to the workspace directory on disk. */
143
- workspacePath: string;
144
-
145
- /** ISO-8601 timestamp of when the feature was created. */
146
- createdAt: string;
147
-
148
- /** Resumption configuration. */
149
- resumption?: ResumptionConfig;
150
-
151
- /** Whether the Local LLM Co-processor is active for this workspace. */
152
- localLlmEnabled?: boolean;
153
-
154
- /** Custom teamwork coordination instructions for the agent team. */
155
- teamworkInstructions?: string;
156
- }
157
-
158
- /** Runtime context for an active workspace now includes analysis data. */
159
- export interface WorkspaceContext {
160
- /** The feature definition. */
161
- feature: Feature;
162
-
163
- /** Full repo metadata for every repo in the feature. */
164
- repos: RepoInfo[];
165
-
166
- /** Analysis results for each repo (keyed by repo path). */
167
- analysis?: Map<string, ProjectAnalysis>;
168
-
169
- /** The global local LLM config, to provide model context. */
170
- localLlm?: LocalLlmConfig;
171
- }
172
-
173
- // ─── Phase 2: Project Analysis Types ──────────────────────────────────────
174
-
175
- /** Recognized language/runtime. */
176
- export type Language =
177
- | 'typescript'
178
- | 'javascript'
179
- | 'csharp'
180
- | 'python'
181
- | 'go'
182
- | 'java'
183
- | 'rust'
184
- | 'ruby'
185
- | 'php'
186
- | 'other';
187
-
188
- /** Recognized framework. */
189
- export type Framework =
190
- | 'react'
191
- | 'nextjs'
192
- | 'angular'
193
- | 'vue'
194
- | 'svelte'
195
- | 'express'
196
- | 'nestjs'
197
- | 'fastify'
198
- | 'hono'
199
- | 'aspnet'
200
- | 'blazor'
201
- | 'django'
202
- | 'flask'
203
- | 'fastapi'
204
- | 'gin'
205
- | 'spring'
206
- | 'rails'
207
- | 'laravel'
208
- | 'other';
209
-
210
- /** Recognized project type. */
211
- export type ProjectType =
212
- | 'frontend'
213
- | 'backend'
214
- | 'fullstack'
215
- | 'library'
216
- | 'api'
217
- | 'cli'
218
- | 'worker'
219
- | 'other';
220
-
221
- /** Detected tech stack for a repo. */
222
- export interface TechStack {
223
- languages: Language[];
224
- frameworks: Framework[];
225
- buildTools: string[];
226
- projectType: ProjectType;
227
- }
228
-
229
- /** A detected API endpoint or route. */
230
- export interface ApiEndpoint {
231
- method: string;
232
- path: string;
233
- source?: string;
234
- }
235
-
236
- /** An inter-repo dependency reference. */
237
- export interface RepoDependency {
238
- /** Name of the dependency (npm package, NuGet package, etc.). */
239
- name: string;
240
- /** Type of dependency. */
241
- type: 'npm' | 'nuget' | 'pip' | 'go' | 'other';
242
- /** Version constraint if known. */
243
- version?: string;
244
- }
245
-
246
- /** Port/service configuration detected in a repo. */
247
- export interface ServicePort {
248
- port: number;
249
- protocol: 'http' | 'https' | 'grpc' | 'other';
250
- source: string;
251
- }
252
-
253
- /** Full analysis result for a single project/repo. */
254
- export interface ProjectAnalysis {
255
- /** Repo name. */
256
- name: string;
257
- /** Repo path. */
258
- path: string;
259
- /** Detected tech stack. */
260
- techStack: TechStack;
261
- /** Detected API endpoints. */
262
- endpoints: ApiEndpoint[];
263
- /** Detected dependencies. */
264
- dependencies: RepoDependency[];
265
- /** Detected ports/services. */
266
- ports: ServicePort[];
267
- /** Summary from README.md if found. */
268
- readmeSummary: string | null;
269
- /** Existing AI config files found in the repo. */
270
- existingAIConfigs: ExistingAIConfig[];
271
- /** Produced/published packages by this repo. */
272
- produces?: { name: string; type: 'npm' | 'nuget' | 'other'; version?: string; contributing?: string[] }[];
273
- /** NuGet feeds detected in the repo's NuGet.config files. */
274
- nugetFeeds?: { name: string; url: string }[];
275
- /** Detected messaging topology. */
276
- messaging?: MessagingTopology;
277
- /** Detected run configurations. */
278
- runConfig?: RunConfig;
279
- }
280
-
281
- export interface MessagePublisher {
282
- contractType: string;
283
- topicOrQueue: string;
284
- publisherFile: string;
285
- }
286
-
287
- export interface MessageSubscriber {
288
- contractType: string;
289
- handlerFile: string;
290
- registrationFile: string;
291
- }
292
-
293
- export interface MessagingTopology {
294
- publishers: MessagePublisher[];
295
- subscribers: MessageSubscriber[];
296
- }
297
-
298
- export interface RunConfigEntryPoint {
299
- projectPath: string;
300
- type: string;
301
- command?: string;
302
- port?: number;
303
- }
304
-
305
- export interface RunConfigDatabase {
306
- provider: string;
307
- host: string;
308
- configFile: string;
309
- }
310
-
311
- export interface RunConfigSharedInfraWarning {
312
- resource: string;
313
- host: string;
314
- configFile: string;
315
- warning: string;
316
- }
317
-
318
- export interface RunConfigSecret {
319
- file: string;
320
- lineHint: string;
321
- }
322
-
323
- export interface RunConfig {
324
- entryPoints: RunConfigEntryPoint[];
325
- databases: RunConfigDatabase[];
326
- sharedInfraWarnings: RunConfigSharedInfraWarning[];
327
- committedSecrets: RunConfigSecret[];
328
- externalDependencies: string[];
329
- }
330
-
331
- /** An existing AI configuration file found in a repo. */
332
- export interface ExistingAIConfig {
333
- /** Which assistant this config is for. */
334
- assistant: AIAssistant | 'agents';
335
- /** File path relative to repo root. */
336
- relativePath: string;
337
- /** First 500 chars of the content for context. */
338
- contentPreview: string;
339
- }
340
-
341
- // ─── Phase 3: Service Orchestration Types ─────────────────────────────────
342
-
343
- /** How to start a single service/project. */
344
- export interface ServiceConfig {
345
- /** Display name for the service. */
346
- name: string;
347
- /** Absolute path to the project directory. */
348
- cwd: string;
349
- /** The command to run (e.g., 'npm', 'dotnet', 'python'). */
350
- command: string;
351
- /** Arguments for the command. */
352
- args: string[];
353
- /** Optional port the service listens on. */
354
- port?: number;
355
- /** How the start command was detected. */
356
- source: 'package.json' | 'dotnet' | 'docker-compose' | 'aspire' | 'python' | 'go' | 'makefile' | 'manual';
357
- }
358
-
359
- /** Detected orchestration tool in a workspace. */
360
- export interface OrchestrationDetection {
361
- /** Which tool was found. */
362
- tool: 'docker-compose' | 'aspire' | 'tilt' | 'procfile' | 'makefile';
363
- /** Path to the config file. */
364
- configPath: string;
365
- /** Start command for this tool. */
366
- startCommand: string;
367
- /** Stop command for this tool. */
368
- stopCommand: string;
369
- }
370
-
371
- /** A currently running service process. */
372
- export interface RunningService {
373
- /** Service name. */
374
- name: string;
375
- /** Process ID. */
376
- pid: number;
377
- /** Service config used to start it. */
378
- config: ServiceConfig;
379
- /** Timestamp when started. */
380
- startedAt: string;
381
- }
382
-
383
- /** State file saved to track running services. */
384
- export interface RunningState {
385
- /** Workspace path this state belongs to. */
386
- workspacePath: string;
387
- /** List of running services. */
388
- services: RunningService[];
389
- /** Timestamp when the state was last updated. */
390
- updatedAt: string;
391
- }
392
-
393
- // ─── Phase 3: Dependency Graph Types ──────────────────────────────────────
394
-
395
- /** A node in the workspace dependency graph. */
396
- export interface DependencyNode {
397
- /** Repository name. */
398
- repoName: string;
399
- /** Absolute path to the repository. */
400
- repoPath: string;
401
- /** Names of repos this one depends on. */
402
- dependsOn: string[];
403
- /** Names of repos that depend on this one. */
404
- dependedOnBy: string[];
405
- }
406
-
407
- /** The full dependency graph for a workspace. */
408
- export type DependencyGraph = Map<string, DependencyNode>;
1
+ /**
2
+ * @module types
3
+ * Shared interfaces and types for NexusFlow.
4
+ */
5
+
6
+ /** Supported AI assistant identifiers. */
7
+ export type AIAssistant = 'claude' | 'antigravity' | 'codex' | 'copilot' | 'cursor';
8
+
9
+ export interface LocalLlmConfig {
10
+ enabled: boolean;
11
+ provider: 'ollama' | 'openai-compatible';
12
+ endpoint: string;
13
+ model: string;
14
+ apiKey?: string;
15
+ }
16
+
17
+ /** Top-level NexusFlow configuration stored in ~/.nexusflow/config.json. */
18
+ export interface NexusFlowConfig {
19
+ /** Semantic version of the NexusFlow config schema. */
20
+ version: string;
21
+
22
+ /** Root development directory. Default: ~/dev */
23
+ devDir: string;
24
+
25
+ /** Directory where workspaces are created. Default: ~/dev/workspaces */
26
+ workspacesDir: string;
27
+
28
+ /** The user's preferred AI assistant, or null if none chosen yet. */
29
+ defaultAssistant: AIAssistant | null;
30
+
31
+ /** The user's preferred editor command, or null if none chosen yet. */
32
+ defaultEditor?: string | null;
33
+
34
+ /** How many directory levels deep to scan for git repos. Default: 2 */
35
+ scanDepth: number;
36
+
37
+ /** Global patterns to exclude when packing/analyzing repositories. */
38
+ excludePatterns?: string[];
39
+
40
+ /** Active storage provider name. Default: 'local' */
41
+ storageProvider?: string;
42
+
43
+ /** Per-adapter settings keyed by adapter name. */
44
+ adapterConfig?: Record<string, Record<string, unknown>>;
45
+
46
+ /** List of plugin paths or npm packages to load. */
47
+ plugins?: string[];
48
+
49
+ /** ISO timestamp of the last update check. */
50
+ lastUpdateCheck?: string;
51
+
52
+ /** The last checked latest version from NPM. */
53
+ latestVersion?: string;
54
+ latestDownloadUrl?: string | null;
55
+ latestReleaseNotes?: string;
56
+
57
+ /** Local LLM settings for delegating simple tasks. */
58
+ localLlm?: LocalLlmConfig;
59
+ }
60
+
61
+ /** Result of probing for an AI assistant on the system. */
62
+ export interface DetectedAI {
63
+ /** Canonical assistant identifier. */
64
+ name: AIAssistant;
65
+
66
+ /** Human-readable label shown in prompts. */
67
+ displayName: string;
68
+
69
+ /** Whether the assistant's CLI was found. */
70
+ detected: boolean;
71
+
72
+ /** The CLI command that was detected (e.g. 'claude', 'antigravity'). */
73
+ command?: string;
74
+ }
75
+
76
+ /** Result of probing for a code editor on the system. */
77
+ export interface DetectedEditor {
78
+ /** Human-readable editor name. */
79
+ name: string;
80
+
81
+ /** CLI command used to launch the editor. */
82
+ command: string;
83
+
84
+ /** Whether the editor's CLI was found in PATH. */
85
+ detected: boolean;
86
+ }
87
+
88
+ /** Metadata about a discovered git repository. */
89
+ export interface RepoInfo {
90
+ /** Directory name of the repo. */
91
+ name: string;
92
+
93
+ /** Absolute path to the repo root. */
94
+ path: string;
95
+
96
+ /** Default branch — typically 'main' or 'master'. */
97
+ defaultBranch: string;
98
+ }
99
+
100
+ /** Metadata about a past AI session. */
101
+ export interface AISession {
102
+ id: string;
103
+ assistant: AIAssistant;
104
+ title: string;
105
+ createdAt: string;
106
+ updatedAt: string;
107
+ messageCount: number;
108
+ workspacePath: string;
109
+ }
110
+
111
+ /** A single chat message in a session transcript. */
112
+ export interface ChatMessage {
113
+ role: 'user' | 'assistant';
114
+ content: string;
115
+ timestamp?: string;
116
+ }
117
+
118
+
119
+ /** Configuration for resuming the active session. */
120
+ export interface ResumptionConfig {
121
+ /** The command to run verification tests. */
122
+ testCommand?: string;
123
+ /** The command to spin up dev databases/mocks/caches. */
124
+ mockCommand?: string;
125
+ /** The command to start workspace services manually if needed. */
126
+ startCommand?: string;
127
+ }
128
+
129
+ /** A feature workspace that spans one or more repos. */
130
+ export interface Feature {
131
+ /** Unique identifier — the git branch name. */
132
+ id: string;
133
+
134
+ /** Git branch name created for this feature. */
135
+ branchName: string;
136
+
137
+ /** Short human-readable description of the feature. */
138
+ description: string;
139
+
140
+ /** Absolute paths to the repos included in this feature. */
141
+ repos: string[];
142
+
143
+ /** Absolute paths to the original repositories. */
144
+ originalRepos?: string[];
145
+
146
+ /** AI assistants enabled for this feature workspace. */
147
+ assistants: AIAssistant[];
148
+
149
+ /** Absolute path to the workspace directory on disk. */
150
+ workspacePath: string;
151
+
152
+ /** ISO-8601 timestamp of when the feature was created. */
153
+ createdAt: string;
154
+
155
+ /** Resumption configuration. */
156
+ resumption?: ResumptionConfig;
157
+
158
+ /** Whether the Local LLM Co-processor is active for this workspace. */
159
+ localLlmEnabled?: boolean;
160
+
161
+ /** Custom teamwork coordination instructions for the agent team. */
162
+ teamworkInstructions?: string;
163
+ }
164
+
165
+ /** Runtime context for an active workspace — now includes analysis data. */
166
+ export interface WorkspaceContext {
167
+ /** The feature definition. */
168
+ feature: Feature;
169
+
170
+ /** Full repo metadata for every repo in the feature. */
171
+ repos: RepoInfo[];
172
+
173
+ /** Analysis results for each repo (keyed by repo path). */
174
+ analysis?: Map<string, ProjectAnalysis>;
175
+
176
+ /** The global local LLM config, to provide model context. */
177
+ localLlm?: LocalLlmConfig;
178
+ }
179
+
180
+ // ─── Phase 2: Project Analysis Types ──────────────────────────────────────
181
+
182
+ /** Recognized language/runtime. */
183
+ export type Language =
184
+ | 'typescript'
185
+ | 'javascript'
186
+ | 'csharp'
187
+ | 'python'
188
+ | 'go'
189
+ | 'java'
190
+ | 'rust'
191
+ | 'ruby'
192
+ | 'php'
193
+ | 'other';
194
+
195
+ /** Recognized framework. */
196
+ export type Framework =
197
+ | 'react'
198
+ | 'nextjs'
199
+ | 'angular'
200
+ | 'vue'
201
+ | 'svelte'
202
+ | 'express'
203
+ | 'nestjs'
204
+ | 'fastify'
205
+ | 'hono'
206
+ | 'aspnet'
207
+ | 'blazor'
208
+ | 'django'
209
+ | 'flask'
210
+ | 'fastapi'
211
+ | 'gin'
212
+ | 'spring'
213
+ | 'rails'
214
+ | 'laravel'
215
+ | 'other';
216
+
217
+ /** Recognized project type. */
218
+ export type ProjectType =
219
+ | 'frontend'
220
+ | 'backend'
221
+ | 'fullstack'
222
+ | 'library'
223
+ | 'api'
224
+ | 'cli'
225
+ | 'worker'
226
+ | 'other';
227
+
228
+ /** Detected tech stack for a repo. */
229
+ export interface TechStack {
230
+ languages: Language[];
231
+ frameworks: Framework[];
232
+ buildTools: string[];
233
+ projectType: ProjectType;
234
+ }
235
+
236
+ /** A detected API endpoint or route. */
237
+ export interface ApiEndpoint {
238
+ method: string;
239
+ path: string;
240
+ source?: string;
241
+ }
242
+
243
+ /** An inter-repo dependency reference. */
244
+ export interface RepoDependency {
245
+ /** Name of the dependency (npm package, NuGet package, etc.). */
246
+ name: string;
247
+ /** Type of dependency. */
248
+ type: 'npm' | 'nuget' | 'pip' | 'go' | 'other';
249
+ /** Version constraint if known. */
250
+ version?: string;
251
+ }
252
+
253
+ /** Port/service configuration detected in a repo. */
254
+ export interface ServicePort {
255
+ port: number;
256
+ protocol: 'http' | 'https' | 'grpc' | 'other';
257
+ source: string;
258
+ }
259
+
260
+ /** Full analysis result for a single project/repo. */
261
+ export interface ProjectAnalysis {
262
+ /** Repo name. */
263
+ name: string;
264
+ /** Repo path. */
265
+ path: string;
266
+ /** Detected tech stack. */
267
+ techStack: TechStack;
268
+ /** Detected API endpoints. */
269
+ endpoints: ApiEndpoint[];
270
+ /** Detected dependencies. */
271
+ dependencies: RepoDependency[];
272
+ /** Detected ports/services. */
273
+ ports: ServicePort[];
274
+ /** Summary from README.md if found. */
275
+ readmeSummary: string | null;
276
+ /** Existing AI config files found in the repo. */
277
+ existingAIConfigs: ExistingAIConfig[];
278
+ /** Produced/published packages by this repo. */
279
+ produces?: { name: string; type: 'npm' | 'nuget' | 'other'; version?: string; contributing?: string[] }[];
280
+ /** NuGet feeds detected in the repo's NuGet.config files. */
281
+ nugetFeeds?: { name: string; url: string }[];
282
+ /** Detected messaging topology. */
283
+ messaging?: MessagingTopology;
284
+ /** Detected run configurations. */
285
+ runConfig?: RunConfig;
286
+ }
287
+
288
+ export interface MessagePublisher {
289
+ contractType: string;
290
+ topicOrQueue: string;
291
+ publisherFile: string;
292
+ }
293
+
294
+ export interface MessageSubscriber {
295
+ contractType: string;
296
+ handlerFile: string;
297
+ registrationFile: string;
298
+ }
299
+
300
+ export interface MessagingTopology {
301
+ publishers: MessagePublisher[];
302
+ subscribers: MessageSubscriber[];
303
+ }
304
+
305
+ export interface RunConfigEntryPoint {
306
+ projectPath: string;
307
+ type: string;
308
+ command?: string;
309
+ port?: number;
310
+ }
311
+
312
+ export interface RunConfigDatabase {
313
+ provider: string;
314
+ host: string;
315
+ configFile: string;
316
+ }
317
+
318
+ export interface RunConfigSharedInfraWarning {
319
+ resource: string;
320
+ host: string;
321
+ configFile: string;
322
+ warning: string;
323
+ }
324
+
325
+ export interface RunConfigSecret {
326
+ file: string;
327
+ lineHint: string;
328
+ }
329
+
330
+ export interface RunConfig {
331
+ entryPoints: RunConfigEntryPoint[];
332
+ databases: RunConfigDatabase[];
333
+ sharedInfraWarnings: RunConfigSharedInfraWarning[];
334
+ committedSecrets: RunConfigSecret[];
335
+ externalDependencies: string[];
336
+ }
337
+
338
+ /** An existing AI configuration file found in a repo. */
339
+ export interface ExistingAIConfig {
340
+ /** Which assistant this config is for. */
341
+ assistant: AIAssistant | 'agents';
342
+ /** File path relative to repo root. */
343
+ relativePath: string;
344
+ /** First 500 chars of the content for context. */
345
+ contentPreview: string;
346
+ }
347
+
348
+ // ─── Phase 3: Service Orchestration Types ─────────────────────────────────
349
+
350
+ /** How to start a single service/project. */
351
+ export interface ServiceConfig {
352
+ /** Display name for the service. */
353
+ name: string;
354
+ /** Absolute path to the project directory. */
355
+ cwd: string;
356
+ /** The command to run (e.g., 'npm', 'dotnet', 'python'). */
357
+ command: string;
358
+ /** Arguments for the command. */
359
+ args: string[];
360
+ /** Optional port the service listens on. */
361
+ port?: number;
362
+ /** How the start command was detected. */
363
+ source: 'package.json' | 'dotnet' | 'docker-compose' | 'aspire' | 'python' | 'go' | 'makefile' | 'manual';
364
+ }
365
+
366
+ /** Detected orchestration tool in a workspace. */
367
+ export interface OrchestrationDetection {
368
+ /** Which tool was found. */
369
+ tool: 'docker-compose' | 'aspire' | 'tilt' | 'procfile' | 'makefile';
370
+ /** Path to the config file. */
371
+ configPath: string;
372
+ /** Start command for this tool. */
373
+ startCommand: string;
374
+ /** Stop command for this tool. */
375
+ stopCommand: string;
376
+ }
377
+
378
+ /** A currently running service process. */
379
+ export interface RunningService {
380
+ /** Service name. */
381
+ name: string;
382
+ /** Process ID. */
383
+ pid: number;
384
+ /** Service config used to start it. */
385
+ config: ServiceConfig;
386
+ /** Timestamp when started. */
387
+ startedAt: string;
388
+ }
389
+
390
+ /** State file saved to track running services. */
391
+ export interface RunningState {
392
+ /** Workspace path this state belongs to. */
393
+ workspacePath: string;
394
+ /** List of running services. */
395
+ services: RunningService[];
396
+ /** Timestamp when the state was last updated. */
397
+ updatedAt: string;
398
+ }
399
+
400
+ // ─── Per-Repo Sync State ──────────────────────────────────────────────────
401
+
402
+ /**
403
+ * Classified outcome of a sync/rebase attempt for a single repo.
404
+ * See `utils/multi-git.ts` for the meaning of each value.
405
+ */
406
+ export type SyncStatus = 'up-to-date' | 'rebased' | 'conflict' | 'stash-conflict' | 'error';
407
+
408
+ /** Persisted sync/validation state for a single repo in a workspace. */
409
+ export interface RepoSyncState {
410
+ /** Directory name of the repo. */
411
+ repoName: string;
412
+ /** ISO timestamp of the last sync attempt. */
413
+ lastSyncedAt?: string;
414
+ /** Classified result of the last sync. */
415
+ lastSyncStatus?: SyncStatus;
416
+ /** Human-readable message from the last sync. */
417
+ lastSyncMessage?: string;
418
+ /** True when the repo pulled in new commits and has not yet been re-validated. */
419
+ pendingValidation?: boolean;
420
+ /** Result of the last validation run (e.g. test/e2e), if any. */
421
+ lastValidationResult?: 'pass' | 'fail' | null;
422
+ /** ISO timestamp of the last validation run. */
423
+ lastValidatedAt?: string;
424
+ }
425
+
426
+ /** State file saved to track per-repo sync/validation status (`.nexusflow-state.json`). */
427
+ export interface WorkspaceState {
428
+ /** Workspace path this state belongs to. */
429
+ workspacePath: string;
430
+ /** Per-repo state, keyed by repo name. */
431
+ repos: Record<string, RepoSyncState>;
432
+ /** Timestamp when the state was last updated. */
433
+ updatedAt: string;
434
+ }
435
+
436
+ // ─── Phase 3: Dependency Graph Types ──────────────────────────────────────
437
+
438
+ /** A node in the workspace dependency graph. */
439
+ export interface DependencyNode {
440
+ /** Repository name. */
441
+ repoName: string;
442
+ /** Absolute path to the repository. */
443
+ repoPath: string;
444
+ /** Names of repos this one depends on. */
445
+ dependsOn: string[];
446
+ /** Names of repos that depend on this one. */
447
+ dependedOnBy: string[];
448
+ }
449
+
450
+ /** The full dependency graph for a workspace. */
451
+ export type DependencyGraph = Map<string, DependencyNode>;