@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.
- package/GETTING_STARTED.md +109 -0
- package/README.md +310 -0
- package/dist/analyzers/detect-apis.d.ts +19 -0
- package/dist/analyzers/detect-apis.d.ts.map +1 -0
- package/dist/analyzers/detect-apis.js +121 -0
- package/dist/analyzers/detect-apis.js.map +1 -0
- package/dist/analyzers/detect-deps.d.ts +30 -0
- package/dist/analyzers/detect-deps.d.ts.map +1 -0
- package/dist/analyzers/detect-deps.js +121 -0
- package/dist/analyzers/detect-deps.js.map +1 -0
- package/dist/analyzers/detect-existing.d.ts +15 -0
- package/dist/analyzers/detect-existing.d.ts.map +1 -0
- package/dist/analyzers/detect-existing.js +65 -0
- package/dist/analyzers/detect-existing.js.map +1 -0
- package/dist/analyzers/detect-ports.d.ts +20 -0
- package/dist/analyzers/detect-ports.d.ts.map +1 -0
- package/dist/analyzers/detect-ports.js +103 -0
- package/dist/analyzers/detect-ports.js.map +1 -0
- package/dist/analyzers/index.d.ts +29 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +74 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/readme-summarizer.d.ts +13 -0
- package/dist/analyzers/readme-summarizer.d.ts.map +1 -0
- package/dist/analyzers/readme-summarizer.js +59 -0
- package/dist/analyzers/readme-summarizer.js.map +1 -0
- package/dist/analyzers/tech-stack.d.ts +15 -0
- package/dist/analyzers/tech-stack.d.ts.map +1 -0
- package/dist/analyzers/tech-stack.js +284 -0
- package/dist/analyzers/tech-stack.js.map +1 -0
- package/dist/commands/create.d.ts +17 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +111 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +50 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +32 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +12 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +54 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/open.d.ts +9 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +49 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/start.d.ts +13 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +97 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +47 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +11 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +47 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/ui.d.ts +13 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +44 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/core/config.d.ts +32 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +68 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/scanner.d.ts +18 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +73 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/workspace.d.ts +53 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +114 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/core/worktree.d.ts +27 -0
- package/dist/core/worktree.d.ts.map +1 -0
- package/dist/core/worktree.js +35 -0
- package/dist/core/worktree.js.map +1 -0
- package/dist/generators/base.d.ts +15 -0
- package/dist/generators/base.d.ts.map +1 -0
- package/dist/generators/base.js +175 -0
- package/dist/generators/base.js.map +1 -0
- package/dist/generators/claude.d.ts +17 -0
- package/dist/generators/claude.d.ts.map +1 -0
- package/dist/generators/claude.js +29 -0
- package/dist/generators/claude.js.map +1 -0
- package/dist/generators/codex.d.ts +16 -0
- package/dist/generators/codex.d.ts.map +1 -0
- package/dist/generators/codex.js +41 -0
- package/dist/generators/codex.js.map +1 -0
- package/dist/generators/copilot.d.ts +16 -0
- package/dist/generators/copilot.d.ts.map +1 -0
- package/dist/generators/copilot.js +49 -0
- package/dist/generators/copilot.js.map +1 -0
- package/dist/generators/cursor.d.ts +17 -0
- package/dist/generators/cursor.d.ts.map +1 -0
- package/dist/generators/cursor.js +37 -0
- package/dist/generators/cursor.js.map +1 -0
- package/dist/generators/index.d.ts +18 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +95 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/gui/assets/index-Cq9V485S.js +21 -0
- package/dist/gui/assets/index-Dh1b5gSZ.css +2 -0
- package/dist/gui/favicon.svg +1 -0
- package/dist/gui/icons.svg +24 -0
- package/dist/gui/index.html +18 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestration/detect.d.ts +29 -0
- package/dist/orchestration/detect.d.ts.map +1 -0
- package/dist/orchestration/detect.js +292 -0
- package/dist/orchestration/detect.js.map +1 -0
- package/dist/orchestration/index.d.ts +7 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +7 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/runner.d.ts +40 -0
- package/dist/orchestration/runner.d.ts.map +1 -0
- package/dist/orchestration/runner.js +242 -0
- package/dist/orchestration/runner.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +419 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +210 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/detect-ai.d.ts +21 -0
- package/dist/utils/detect-ai.d.ts.map +1 -0
- package/dist/utils/detect-ai.js +76 -0
- package/dist/utils/detect-ai.js.map +1 -0
- package/dist/utils/detect-editors.d.ts +19 -0
- package/dist/utils/detect-editors.d.ts.map +1 -0
- package/dist/utils/detect-editors.js +49 -0
- package/dist/utils/detect-editors.js.map +1 -0
- package/dist/utils/git.d.ts +27 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +57 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/prompts.d.ts +27 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +119 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/session-finder.d.ts +29 -0
- package/dist/utils/session-finder.d.ts.map +1 -0
- package/dist/utils/session-finder.js +462 -0
- package/dist/utils/session-finder.js.map +1 -0
- package/gui/README.md +73 -0
- package/gui/eslint.config.js +22 -0
- package/gui/index.html +17 -0
- package/gui/package-lock.json +3054 -0
- package/gui/package.json +33 -0
- package/gui/public/favicon.svg +1 -0
- package/gui/public/icons.svg +24 -0
- package/gui/src/App.css +1 -0
- package/gui/src/App.tsx +1949 -0
- package/gui/src/assets/hero.png +0 -0
- package/gui/src/assets/react.svg +1 -0
- package/gui/src/assets/vite.svg +1 -0
- package/gui/src/index.css +1 -0
- package/gui/src/main.tsx +10 -0
- package/gui/tsconfig.app.json +25 -0
- package/gui/tsconfig.json +7 -0
- package/gui/tsconfig.node.json +24 -0
- package/gui/vite.config.ts +12 -0
- package/package.json +48 -0
- package/src/analyzers/detect-apis.ts +138 -0
- package/src/analyzers/detect-deps.ts +138 -0
- package/src/analyzers/detect-existing.ts +74 -0
- package/src/analyzers/detect-ports.ts +110 -0
- package/src/analyzers/index.ts +85 -0
- package/src/analyzers/readme-summarizer.ts +68 -0
- package/src/analyzers/tech-stack.ts +255 -0
- package/src/commands/create.ts +142 -0
- package/src/commands/init.ts +58 -0
- package/src/commands/list.ts +46 -0
- package/src/commands/logs.ts +63 -0
- package/src/commands/open.ts +54 -0
- package/src/commands/start.ts +117 -0
- package/src/commands/status.ts +54 -0
- package/src/commands/stop.ts +55 -0
- package/src/commands/ui.ts +47 -0
- package/src/core/config.ts +79 -0
- package/src/core/scanner.ts +91 -0
- package/src/core/workspace.ts +149 -0
- package/src/core/worktree.ts +50 -0
- package/src/generators/base.ts +187 -0
- package/src/generators/claude.ts +34 -0
- package/src/generators/codex.ts +48 -0
- package/src/generators/copilot.ts +56 -0
- package/src/generators/cursor.ts +44 -0
- package/src/generators/index.ts +122 -0
- package/src/index.ts +178 -0
- package/src/orchestration/detect.ts +313 -0
- package/src/orchestration/index.ts +7 -0
- package/src/orchestration/runner.ts +279 -0
- package/src/server.ts +466 -0
- package/src/types.ts +294 -0
- package/src/utils/detect-ai.ts +81 -0
- package/src/utils/detect-editors.ts +54 -0
- package/src/utils/git.ts +61 -0
- package/src/utils/prompts.ts +135 -0
- package/src/utils/session-finder.ts +483 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/open
|
|
3
|
+
* Re-opens an existing NexusFlow workspace in an editor.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Lets the user pick an existing workspace and open it in an editor.
|
|
7
|
+
*/
|
|
8
|
+
export declare function openCommand(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=open.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCjD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/open
|
|
3
|
+
* Re-opens an existing NexusFlow workspace in an editor.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { execa } from 'execa';
|
|
7
|
+
import { select } from '@inquirer/prompts';
|
|
8
|
+
import { loadConfig } from '../core/config.js';
|
|
9
|
+
import { listWorkspaces } from '../core/workspace.js';
|
|
10
|
+
import { detectEditors } from '../utils/detect-editors.js';
|
|
11
|
+
import { promptSelectEditor } from '../utils/prompts.js';
|
|
12
|
+
/**
|
|
13
|
+
* Lets the user pick an existing workspace and open it in an editor.
|
|
14
|
+
*/
|
|
15
|
+
export async function openCommand() {
|
|
16
|
+
const config = await loadConfig();
|
|
17
|
+
const workspaces = await listWorkspaces(config.workspacesDir);
|
|
18
|
+
if (workspaces.length === 0) {
|
|
19
|
+
console.log(chalk.yellow('\nNo workspaces found.'));
|
|
20
|
+
console.log(chalk.dim(' Run "nexusflow create" to create your first workspace.\n'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
console.log(chalk.bold.cyan('\n📂 Open Workspace\n'));
|
|
24
|
+
// Let user pick a workspace
|
|
25
|
+
const selected = await select({
|
|
26
|
+
message: 'Select a workspace to open:',
|
|
27
|
+
choices: workspaces.map((ws) => ({
|
|
28
|
+
name: `${ws.branchName} ${chalk.dim(`(${ws.repos.length} repos, ${ws.assistants.join(', ')})`)}`,
|
|
29
|
+
value: ws.workspacePath,
|
|
30
|
+
})),
|
|
31
|
+
});
|
|
32
|
+
// Let user pick an editor
|
|
33
|
+
const detectedEditors = await detectEditors();
|
|
34
|
+
const editor = await promptSelectEditor(detectedEditors);
|
|
35
|
+
if (editor) {
|
|
36
|
+
try {
|
|
37
|
+
await execa(editor.command, [selected], { stdio: 'ignore' });
|
|
38
|
+
console.log(chalk.green(`\n✅ Opened ${selected} in ${editor.name}\n`));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
console.log(chalk.yellow(`\n⚠️ Could not open editor. Navigate manually:`));
|
|
42
|
+
console.log(chalk.dim(` cd "${selected}"\n`));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(chalk.dim(`\n To navigate: cd "${selected}"\n`));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAE9D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEtD,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAChG,KAAK,EAAE,EAAE,CAAC,aAAa;SACxB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,eAAe,GAAG,MAAM,aAAa,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,eAAe,CAAC,CAAC;IAEzD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,QAAQ,OAAO,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,QAAQ,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,QAAQ,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/start
|
|
3
|
+
* Starts all services in the current or specified workspace.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Start services for a workspace.
|
|
7
|
+
* If run inside a workspace dir, auto-detects it.
|
|
8
|
+
* Otherwise, prompts user to pick one.
|
|
9
|
+
*
|
|
10
|
+
* @param workspaceArg - Optional workspace path from CLI.
|
|
11
|
+
*/
|
|
12
|
+
export declare function startCommand(workspaceArg?: string): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DvE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/start
|
|
3
|
+
* Starts all services in the current or specified workspace.
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { select, confirm } from '@inquirer/prompts';
|
|
8
|
+
import { loadConfig } from '../core/config.js';
|
|
9
|
+
import { listWorkspaces, loadFeatureConfig } from '../core/workspace.js';
|
|
10
|
+
import { detectAllServices, detectOrchestrationTools, startServices, } from '../orchestration/index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Start services for a workspace.
|
|
13
|
+
* If run inside a workspace dir, auto-detects it.
|
|
14
|
+
* Otherwise, prompts user to pick one.
|
|
15
|
+
*
|
|
16
|
+
* @param workspaceArg - Optional workspace path from CLI.
|
|
17
|
+
*/
|
|
18
|
+
export async function startCommand(workspaceArg) {
|
|
19
|
+
console.log(chalk.bold.cyan('\n▶ NexusFlow — Start Services\n'));
|
|
20
|
+
const workspacePath = await resolveWorkspace(workspaceArg);
|
|
21
|
+
if (!workspacePath)
|
|
22
|
+
return;
|
|
23
|
+
// Check for existing orchestration tools first
|
|
24
|
+
const tools = await detectOrchestrationTools(workspacePath);
|
|
25
|
+
if (tools.length > 0) {
|
|
26
|
+
console.log(chalk.cyan('Detected orchestration tools:'));
|
|
27
|
+
for (const tool of tools) {
|
|
28
|
+
console.log(` ${chalk.bold(tool.tool)} — ${chalk.dim(tool.configPath)}`);
|
|
29
|
+
console.log(` Start: ${chalk.dim(tool.startCommand)}`);
|
|
30
|
+
}
|
|
31
|
+
const useExisting = await confirm({
|
|
32
|
+
message: 'Use detected orchestration tool instead of NexusFlow runner?',
|
|
33
|
+
default: false,
|
|
34
|
+
});
|
|
35
|
+
if (useExisting) {
|
|
36
|
+
console.log(chalk.dim(`\n Run manually: ${tools[0].startCommand}\n`));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Auto-detect services
|
|
41
|
+
console.log(chalk.cyan('Detecting services...'));
|
|
42
|
+
const services = await detectAllServices(workspacePath);
|
|
43
|
+
if (services.length === 0) {
|
|
44
|
+
console.log(chalk.yellow(' No startable services found in workspace.'));
|
|
45
|
+
console.log(chalk.dim(' Make sure projects have package.json scripts, .csproj, or similar.\n'));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
console.log(chalk.green(` Found ${services.length} service(s):\n`));
|
|
49
|
+
for (const svc of services) {
|
|
50
|
+
const portStr = svc.port ? chalk.dim(` :${svc.port}`) : '';
|
|
51
|
+
console.log(` ${chalk.bold(svc.name)}${portStr} — ${chalk.dim(`${svc.command} ${svc.args.join(' ')}`)}`);
|
|
52
|
+
}
|
|
53
|
+
console.log();
|
|
54
|
+
const shouldStart = await confirm({
|
|
55
|
+
message: `Start ${services.length} service(s)?`,
|
|
56
|
+
default: true,
|
|
57
|
+
});
|
|
58
|
+
if (!shouldStart) {
|
|
59
|
+
console.log(chalk.dim(' Cancelled.\n'));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const logDir = path.join(workspacePath, '.nexusflow-logs');
|
|
63
|
+
await startServices(services, workspacePath, logDir);
|
|
64
|
+
console.log(chalk.bold.green('\n✅ Services started!\n'));
|
|
65
|
+
console.log(chalk.dim(' View logs: nexusflow logs'));
|
|
66
|
+
console.log(chalk.dim(' Stop all: nexusflow stop'));
|
|
67
|
+
console.log(chalk.dim(` Log dir: ${logDir}\n`));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolves a workspace path from argument, cwd, or user prompt.
|
|
71
|
+
*/
|
|
72
|
+
async function resolveWorkspace(workspaceArg) {
|
|
73
|
+
// If argument provided, use it
|
|
74
|
+
if (workspaceArg)
|
|
75
|
+
return workspaceArg;
|
|
76
|
+
// Check if CWD is a workspace
|
|
77
|
+
const cwdFeature = await loadFeatureConfig(process.cwd());
|
|
78
|
+
if (cwdFeature)
|
|
79
|
+
return process.cwd();
|
|
80
|
+
// Otherwise, list workspaces and let user pick
|
|
81
|
+
const config = await loadConfig();
|
|
82
|
+
const workspaces = await listWorkspaces(config.workspacesDir);
|
|
83
|
+
if (workspaces.length === 0) {
|
|
84
|
+
console.log(chalk.yellow('No workspaces found.'));
|
|
85
|
+
console.log(chalk.dim(' Run "nexusflow create" first.\n'));
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const selected = await select({
|
|
89
|
+
message: 'Select a workspace:',
|
|
90
|
+
choices: workspaces.map((ws) => ({
|
|
91
|
+
name: `${ws.branchName} ${chalk.dim(`(${ws.repos.length} repos)`)}`,
|
|
92
|
+
value: ws.workspacePath,
|
|
93
|
+
})),
|
|
94
|
+
});
|
|
95
|
+
return selected;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/status
|
|
3
|
+
* Shows the status of all services in a workspace.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Shows status of running services for a workspace.
|
|
7
|
+
*
|
|
8
|
+
* @param workspaceArg - Optional workspace path from CLI.
|
|
9
|
+
*/
|
|
10
|
+
export declare function statusCommand(workspaceArg?: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQxE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/status
|
|
3
|
+
* Shows the status of all services in a workspace.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { select } from '@inquirer/prompts';
|
|
7
|
+
import { loadConfig } from '../core/config.js';
|
|
8
|
+
import { listWorkspaces, loadFeatureConfig } from '../core/workspace.js';
|
|
9
|
+
import { getServiceStatus } from '../orchestration/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Shows status of running services for a workspace.
|
|
12
|
+
*
|
|
13
|
+
* @param workspaceArg - Optional workspace path from CLI.
|
|
14
|
+
*/
|
|
15
|
+
export async function statusCommand(workspaceArg) {
|
|
16
|
+
console.log(chalk.bold.cyan('\n📊 NexusFlow — Service Status\n'));
|
|
17
|
+
const workspacePath = await resolveWorkspace(workspaceArg);
|
|
18
|
+
if (!workspacePath)
|
|
19
|
+
return;
|
|
20
|
+
await getServiceStatus(workspacePath);
|
|
21
|
+
console.log();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolves a workspace path from argument, cwd, or user prompt.
|
|
25
|
+
*/
|
|
26
|
+
async function resolveWorkspace(workspaceArg) {
|
|
27
|
+
if (workspaceArg)
|
|
28
|
+
return workspaceArg;
|
|
29
|
+
const cwdFeature = await loadFeatureConfig(process.cwd());
|
|
30
|
+
if (cwdFeature)
|
|
31
|
+
return process.cwd();
|
|
32
|
+
const config = await loadConfig();
|
|
33
|
+
const workspaces = await listWorkspaces(config.workspacesDir);
|
|
34
|
+
if (workspaces.length === 0) {
|
|
35
|
+
console.log(chalk.yellow('No workspaces found.\n'));
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const selected = await select({
|
|
39
|
+
message: 'Select a workspace:',
|
|
40
|
+
choices: workspaces.map((ws) => ({
|
|
41
|
+
name: `${ws.branchName} ${chalk.dim(`(${ws.repos.length} repos)`)}`,
|
|
42
|
+
value: ws.workspacePath,
|
|
43
|
+
})),
|
|
44
|
+
});
|
|
45
|
+
return selected;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAoB,MAAM,2BAA2B,CAAC;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,YAAqB;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAElE,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC3D,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,YAAqB;IACnD,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,IAAI,UAAU;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAE9D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,EAAE;YACnE,KAAK,EAAE,EAAE,CAAC,aAAa;SACxB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/stop
|
|
3
|
+
* Stops all running services in the current or specified workspace.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Stop all services for a workspace.
|
|
7
|
+
*
|
|
8
|
+
* @param workspaceArg - Optional workspace path from CLI.
|
|
9
|
+
*/
|
|
10
|
+
export declare function stopCommand(workspaceArg?: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/stop
|
|
3
|
+
* Stops all running services in the current or specified workspace.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { select } from '@inquirer/prompts';
|
|
7
|
+
import { loadConfig } from '../core/config.js';
|
|
8
|
+
import { listWorkspaces, loadFeatureConfig } from '../core/workspace.js';
|
|
9
|
+
import { stopServices } from '../orchestration/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Stop all services for a workspace.
|
|
12
|
+
*
|
|
13
|
+
* @param workspaceArg - Optional workspace path from CLI.
|
|
14
|
+
*/
|
|
15
|
+
export async function stopCommand(workspaceArg) {
|
|
16
|
+
console.log(chalk.bold.cyan('\n⏹ NexusFlow — Stop Services\n'));
|
|
17
|
+
const workspacePath = await resolveWorkspace(workspaceArg);
|
|
18
|
+
if (!workspacePath)
|
|
19
|
+
return;
|
|
20
|
+
await stopServices(workspacePath);
|
|
21
|
+
console.log(chalk.bold.green('\n✅ All services stopped.\n'));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolves a workspace path from argument, cwd, or user prompt.
|
|
25
|
+
*/
|
|
26
|
+
async function resolveWorkspace(workspaceArg) {
|
|
27
|
+
if (workspaceArg)
|
|
28
|
+
return workspaceArg;
|
|
29
|
+
const cwdFeature = await loadFeatureConfig(process.cwd());
|
|
30
|
+
if (cwdFeature)
|
|
31
|
+
return process.cwd();
|
|
32
|
+
const config = await loadConfig();
|
|
33
|
+
const workspaces = await listWorkspaces(config.workspacesDir);
|
|
34
|
+
if (workspaces.length === 0) {
|
|
35
|
+
console.log(chalk.yellow('No workspaces found.\n'));
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const selected = await select({
|
|
39
|
+
message: 'Select a workspace to stop services for:',
|
|
40
|
+
choices: workspaces.map((ws) => ({
|
|
41
|
+
name: `${ws.branchName} ${chalk.dim(`(${ws.repos.length} repos)`)}`,
|
|
42
|
+
value: ws.workspacePath,
|
|
43
|
+
})),
|
|
44
|
+
});
|
|
45
|
+
return selected;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,YAAqB;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAEhE,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC3D,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,YAAqB;IACnD,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,IAAI,UAAU;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAE9D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,0CAA0C;QACnD,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,EAAE;YACnE,KAAK,EAAE,EAAE,CAAC,aAAa;SACxB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/ui
|
|
3
|
+
* Starts the Hono web server and opens the browser to the NexusFlow GUI.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Starts the local GUI server and opens the dashboard in the default browser.
|
|
7
|
+
*
|
|
8
|
+
* @param options - CLI options, including optional port.
|
|
9
|
+
*/
|
|
10
|
+
export declare function uiCommand(options: {
|
|
11
|
+
port?: string;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCzE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/ui
|
|
3
|
+
* Starts the Hono web server and opens the browser to the NexusFlow GUI.
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { exec } from 'node:child_process';
|
|
7
|
+
import { startServer } from '../server.js';
|
|
8
|
+
/**
|
|
9
|
+
* Starts the local GUI server and opens the dashboard in the default browser.
|
|
10
|
+
*
|
|
11
|
+
* @param options - CLI options, including optional port.
|
|
12
|
+
*/
|
|
13
|
+
export async function uiCommand(options) {
|
|
14
|
+
const port = options.port ? parseInt(options.port, 10) : 3000;
|
|
15
|
+
console.log(chalk.bold.cyan('\n🖥️ NexusFlow — Web Dashboard\n'));
|
|
16
|
+
console.log(chalk.dim(' Starting local server...'));
|
|
17
|
+
try {
|
|
18
|
+
const { port: actualPort } = await startServer(port);
|
|
19
|
+
const url = `http://localhost:${actualPort}`;
|
|
20
|
+
console.log(chalk.green(` ✔ Dashboard running at: ${chalk.bold(url)}`));
|
|
21
|
+
console.log(chalk.dim(' Press Ctrl+C to stop.\n'));
|
|
22
|
+
// Open url in browser
|
|
23
|
+
let openCmd = '';
|
|
24
|
+
if (process.platform === 'win32') {
|
|
25
|
+
openCmd = `start ${url}`;
|
|
26
|
+
}
|
|
27
|
+
else if (process.platform === 'darwin') {
|
|
28
|
+
openCmd = `open ${url}`;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
openCmd = `xdg-open ${url}`;
|
|
32
|
+
}
|
|
33
|
+
exec(openCmd, (err) => {
|
|
34
|
+
if (err) {
|
|
35
|
+
console.log(chalk.dim(` Could not auto-open browser. Please visit ${url} manually.`));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
41
|
+
console.error(chalk.red(` ✖ Failed to start dashboard: ${msg}`));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA0B;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,oBAAoB,UAAU,EAAE,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAEpD,sBAAsB;QACtB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,GAAG,SAAS,GAAG,EAAE,CAAC;QAC3B,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,GAAG,QAAQ,GAAG,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACpB,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,GAAG,YAAY,CAAC,CAAC,CAAC;YACzF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/config
|
|
3
|
+
* Manages NexusFlow configuration stored at ~/.nexusflow/config.json.
|
|
4
|
+
*/
|
|
5
|
+
import type { NexusFlowConfig } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Returns the absolute path to the NexusFlow config directory (~/.nexusflow).
|
|
8
|
+
*/
|
|
9
|
+
export declare function getConfigDir(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Returns a NexusFlowConfig populated with sensible defaults.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getDefaultConfig(): NexusFlowConfig;
|
|
14
|
+
/**
|
|
15
|
+
* Ensures the ~/.nexusflow directory exists, creating it if necessary.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ensureConfigDir(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Loads the NexusFlow config from disk.
|
|
20
|
+
* Returns default values when the config file does not exist yet.
|
|
21
|
+
*
|
|
22
|
+
* @returns The loaded or default configuration.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadConfig(): Promise<NexusFlowConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Persists the given configuration to ~/.nexusflow/config.json.
|
|
27
|
+
* Creates the config directory if it doesn't exist.
|
|
28
|
+
*
|
|
29
|
+
* @param config - The configuration to save.
|
|
30
|
+
*/
|
|
31
|
+
export declare function saveConfig(config: NexusFlowConfig): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQnD;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,CAQlD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CAa3D;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/config
|
|
3
|
+
* Manages NexusFlow configuration stored at ~/.nexusflow/config.json.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import * as os from 'node:os';
|
|
8
|
+
/** Name of the config directory under the user's home folder. */
|
|
9
|
+
const CONFIG_DIR_NAME = '.nexusflow';
|
|
10
|
+
/** Name of the config file. */
|
|
11
|
+
const CONFIG_FILE_NAME = 'config.json';
|
|
12
|
+
/**
|
|
13
|
+
* Returns the absolute path to the NexusFlow config directory (~/.nexusflow).
|
|
14
|
+
*/
|
|
15
|
+
export function getConfigDir() {
|
|
16
|
+
return path.join(os.homedir(), CONFIG_DIR_NAME);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Returns a NexusFlowConfig populated with sensible defaults.
|
|
20
|
+
*/
|
|
21
|
+
export function getDefaultConfig() {
|
|
22
|
+
return {
|
|
23
|
+
version: '1.0.0',
|
|
24
|
+
devDir: path.join(os.homedir(), 'dev'),
|
|
25
|
+
workspacesDir: path.join(os.homedir(), 'dev', 'workspaces'),
|
|
26
|
+
defaultAssistant: null,
|
|
27
|
+
scanDepth: 2,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Ensures the ~/.nexusflow directory exists, creating it if necessary.
|
|
32
|
+
*/
|
|
33
|
+
export async function ensureConfigDir() {
|
|
34
|
+
const configDir = getConfigDir();
|
|
35
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Loads the NexusFlow config from disk.
|
|
39
|
+
* Returns default values when the config file does not exist yet.
|
|
40
|
+
*
|
|
41
|
+
* @returns The loaded or default configuration.
|
|
42
|
+
*/
|
|
43
|
+
export async function loadConfig() {
|
|
44
|
+
const configPath = path.join(getConfigDir(), CONFIG_FILE_NAME);
|
|
45
|
+
try {
|
|
46
|
+
const raw = await fs.readFile(configPath, 'utf-8');
|
|
47
|
+
const parsed = JSON.parse(raw);
|
|
48
|
+
// Merge with defaults so newly-added keys are always present.
|
|
49
|
+
return { ...getDefaultConfig(), ...parsed };
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// File doesn't exist or is unreadable — return defaults.
|
|
53
|
+
return getDefaultConfig();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Persists the given configuration to ~/.nexusflow/config.json.
|
|
58
|
+
* Creates the config directory if it doesn't exist.
|
|
59
|
+
*
|
|
60
|
+
* @param config - The configuration to save.
|
|
61
|
+
*/
|
|
62
|
+
export async function saveConfig(config) {
|
|
63
|
+
await ensureConfigDir();
|
|
64
|
+
const configPath = path.join(getConfigDir(), CONFIG_FILE_NAME);
|
|
65
|
+
const data = JSON.stringify(config, null, 2) + '\n';
|
|
66
|
+
await fs.writeFile(configPath, data, 'utf-8');
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B,iEAAiE;AACjE,MAAM,eAAe,GAAG,YAAY,CAAC;AAErC,+BAA+B;AAC/B,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC;QACtC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC;QAC3D,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,CAAC;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;QAE3D,8DAA8D;QAC9D,OAAO,EAAE,GAAG,gBAAgB,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;QACzD,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAuB;IACtD,MAAM,eAAe,EAAE,CAAC;IAExB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACpD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/scanner
|
|
3
|
+
* Scans a development directory tree for git repositories.
|
|
4
|
+
*/
|
|
5
|
+
import type { RepoInfo } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Recursively scans {@link devDir} for directories containing a `.git`
|
|
8
|
+
* entry, up to the given {@link depth}.
|
|
9
|
+
*
|
|
10
|
+
* Skips `node_modules`, `workspaces`, and `.git` directories to keep
|
|
11
|
+
* scans fast and relevant.
|
|
12
|
+
*
|
|
13
|
+
* @param devDir - Absolute path to the root directory to scan.
|
|
14
|
+
* @param depth - Maximum directory depth to descend (0 = only devDir itself).
|
|
15
|
+
* @returns An array of discovered {@link RepoInfo} objects.
|
|
16
|
+
*/
|
|
17
|
+
export declare function scanForRepos(devDir: string, depth: number): Promise<RepoInfo[]>;
|
|
18
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,EAAE,CAAC,CAIrB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/scanner
|
|
3
|
+
* Scans a development directory tree for git repositories.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import { detectDefaultBranch, isGitRepo } from '../utils/git.js';
|
|
8
|
+
/** Directory names to skip while scanning. */
|
|
9
|
+
const IGNORED_DIRS = new Set(['node_modules', 'workspaces', '.git']);
|
|
10
|
+
/**
|
|
11
|
+
* Recursively scans {@link devDir} for directories containing a `.git`
|
|
12
|
+
* entry, up to the given {@link depth}.
|
|
13
|
+
*
|
|
14
|
+
* Skips `node_modules`, `workspaces`, and `.git` directories to keep
|
|
15
|
+
* scans fast and relevant.
|
|
16
|
+
*
|
|
17
|
+
* @param devDir - Absolute path to the root directory to scan.
|
|
18
|
+
* @param depth - Maximum directory depth to descend (0 = only devDir itself).
|
|
19
|
+
* @returns An array of discovered {@link RepoInfo} objects.
|
|
20
|
+
*/
|
|
21
|
+
export async function scanForRepos(devDir, depth) {
|
|
22
|
+
const repos = [];
|
|
23
|
+
await walk(devDir, depth, repos);
|
|
24
|
+
return repos;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Internal recursive walker.
|
|
28
|
+
*
|
|
29
|
+
* When a directory is itself a git repo it is recorded and its children are
|
|
30
|
+
* **not** descended into (a repo inside a repo is unusual and almost always
|
|
31
|
+
* unintentional).
|
|
32
|
+
*/
|
|
33
|
+
async function walk(dir, remainingDepth, results) {
|
|
34
|
+
// Check if the current directory is a git repo.
|
|
35
|
+
if (await isGitRepo(dir)) {
|
|
36
|
+
const defaultBranch = await detectDefaultBranch(dir);
|
|
37
|
+
results.push({
|
|
38
|
+
name: path.basename(dir),
|
|
39
|
+
path: dir,
|
|
40
|
+
defaultBranch,
|
|
41
|
+
});
|
|
42
|
+
// Don't recurse into a repo's subdirectories.
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (remainingDepth <= 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Read children and recurse.
|
|
49
|
+
let entries;
|
|
50
|
+
try {
|
|
51
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Permission denied or directory disappeared — skip silently.
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const tasks = [];
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (!entry.isDirectory()) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (IGNORED_DIRS.has(entry.name)) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// Skip hidden directories (except we already handle .git above).
|
|
66
|
+
if (entry.name.startsWith('.')) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
tasks.push(walk(path.join(dir, entry.name), remainingDepth - 1, results));
|
|
70
|
+
}
|
|
71
|
+
await Promise.all(tasks);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjE,8CAA8C;AAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAErE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,KAAa;IAEb,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,IAAI,CACjB,GAAW,EACX,cAAsB,EACtB,OAAmB;IAEnB,gDAAgD;IAChD,IAAI,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,aAAa;SACd,CAAC,CAAC;QACH,8CAA8C;QAC9C,OAAO;IACT,CAAC;IAED,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAmC,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;QAC9D,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QAED,iEAAiE;QACjE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
|