nexus-agents 2.32.0 → 2.33.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/LICENSE +0 -6
- package/dist/{adaptive-memory-SGWA4UIG.js → adaptive-memory-CHKKA4DI.js} +3 -3
- package/dist/{chunk-HWSX4JI5.js → chunk-3PNNEWR6.js} +3 -3
- package/dist/{chunk-TP5QQACR.js → chunk-3RSILLFN.js} +2 -2
- package/dist/{chunk-JXSEDHLR.js → chunk-72OMG44X.js} +2 -2
- package/dist/{chunk-QP7Y53HR.js → chunk-7GKB7LPG.js} +2 -2
- package/dist/{chunk-EIWGEXVL.js → chunk-BIZLM4CK.js} +6 -6
- package/dist/{chunk-2GOZHACL.js → chunk-DWZZZGZD.js} +2 -1
- package/dist/{chunk-3JVBRJWT.js → chunk-F3ZEU2IK.js} +6 -6
- package/dist/{chunk-YH3FMMIF.js → chunk-FBS5MCJL.js} +2 -2
- package/dist/{chunk-TBLQF7SE.js → chunk-ICFGV3HB.js} +61 -4
- package/dist/chunk-ICFGV3HB.js.map +1 -0
- package/dist/{chunk-UNUWCCIY.js → chunk-KDY5C63A.js} +2 -2
- package/dist/{chunk-OK5FZBMH.js → chunk-MI2RHGLU.js} +2 -2
- package/dist/{chunk-W3JN2MZP.js → chunk-NOITIOCN.js} +2 -2
- package/dist/{chunk-N5ENCRQR.js → chunk-SKUW2NOC.js} +2 -2
- package/dist/{chunk-LK4SJOSQ.js → chunk-SOW2AJPT.js} +26 -26
- package/dist/{chunk-YITIZY3U.js → chunk-WBMWVYOM.js} +4 -4
- package/dist/{chunk-JSW3W7XZ.js → chunk-WDNE6K4W.js} +7 -6
- package/dist/{chunk-ZIWKAQWW.js → chunk-WKBCTGLE.js} +3 -3
- package/dist/{chunk-R6OZYHZZ.js → chunk-XH6CQMDU.js} +2 -2
- package/dist/{chunk-3ADR6O6J.js → chunk-YT7REHTV.js} +2 -2
- package/dist/{chunk-U5KHQTS2.js → chunk-YYPA3CBH.js} +3 -3
- package/dist/{cli-circuit-breaker-XQGQ7FCY.js → cli-circuit-breaker-VRR5DKH3.js} +4 -4
- package/dist/cli.js +101 -20
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-LKMRPPIU.js → composite-router-E3BGQGLP.js} +2 -2
- package/dist/{consensus-vote-4BDZRQ4H.js → consensus-vote-PP4WBNZV.js} +7 -7
- package/dist/{doctor-deep-4HJAHMKX.js → doctor-deep-MVG45YNL.js} +3 -3
- package/dist/{expert-bridge-S4ZYI2RY.js → expert-bridge-SHKCEXGU.js} +3 -3
- package/dist/{factory-RYNDDZBZ.js → factory-EISLNRL5.js} +4 -4
- package/dist/{factory-WF5XJ5ID.js → factory-VJLXQYUO.js} +5 -5
- package/dist/index.d.ts +7 -1
- package/dist/index.js +20 -18
- package/dist/index.js.map +1 -1
- package/dist/{issue-triage-XW2JTD7Y.js → issue-triage-OOKMZAPK.js} +4 -4
- package/dist/{mcp-config-M6OMXTO5.js → mcp-config-4B54K5RR.js} +3 -3
- package/dist/{mobimem-J42ZSXPX.js → mobimem-OWZTGHYA.js} +2 -2
- package/dist/{repo-security-plan-7MERQOMP.js → repo-security-plan-ORAZDJYH.js} +3 -3
- package/dist/research-helpers-synthesize-EAJDTBFK.js +10 -0
- package/dist/{routing-memory-MVBPOHIV.js → routing-memory-HLNGW4BW.js} +2 -2
- package/dist/{session-memory-5PQONKGF.js → session-memory-YQPEWDFR.js} +3 -3
- package/dist/{setup-command-5SXN2V6R.js → setup-command-V5DTJMBS.js} +7 -7
- package/dist/{setup-config-N2RSHLAR.js → setup-config-FSMXLJ37.js} +3 -3
- package/dist/{weather-report-Y5KAWS5M.js → weather-report-J5EIDKVM.js} +2 -2
- package/package.json +2 -1
- package/dist/chunk-TBLQF7SE.js.map +0 -1
- package/dist/research-helpers-synthesize-6NLYMDP3.js +0 -10
- /package/dist/{adaptive-memory-SGWA4UIG.js.map → adaptive-memory-CHKKA4DI.js.map} +0 -0
- /package/dist/{chunk-HWSX4JI5.js.map → chunk-3PNNEWR6.js.map} +0 -0
- /package/dist/{chunk-TP5QQACR.js.map → chunk-3RSILLFN.js.map} +0 -0
- /package/dist/{chunk-JXSEDHLR.js.map → chunk-72OMG44X.js.map} +0 -0
- /package/dist/{chunk-QP7Y53HR.js.map → chunk-7GKB7LPG.js.map} +0 -0
- /package/dist/{chunk-EIWGEXVL.js.map → chunk-BIZLM4CK.js.map} +0 -0
- /package/dist/{chunk-2GOZHACL.js.map → chunk-DWZZZGZD.js.map} +0 -0
- /package/dist/{chunk-3JVBRJWT.js.map → chunk-F3ZEU2IK.js.map} +0 -0
- /package/dist/{chunk-YH3FMMIF.js.map → chunk-FBS5MCJL.js.map} +0 -0
- /package/dist/{chunk-UNUWCCIY.js.map → chunk-KDY5C63A.js.map} +0 -0
- /package/dist/{chunk-OK5FZBMH.js.map → chunk-MI2RHGLU.js.map} +0 -0
- /package/dist/{chunk-W3JN2MZP.js.map → chunk-NOITIOCN.js.map} +0 -0
- /package/dist/{chunk-N5ENCRQR.js.map → chunk-SKUW2NOC.js.map} +0 -0
- /package/dist/{chunk-LK4SJOSQ.js.map → chunk-SOW2AJPT.js.map} +0 -0
- /package/dist/{chunk-YITIZY3U.js.map → chunk-WBMWVYOM.js.map} +0 -0
- /package/dist/{chunk-JSW3W7XZ.js.map → chunk-WDNE6K4W.js.map} +0 -0
- /package/dist/{chunk-ZIWKAQWW.js.map → chunk-WKBCTGLE.js.map} +0 -0
- /package/dist/{chunk-R6OZYHZZ.js.map → chunk-XH6CQMDU.js.map} +0 -0
- /package/dist/{chunk-3ADR6O6J.js.map → chunk-YT7REHTV.js.map} +0 -0
- /package/dist/{chunk-U5KHQTS2.js.map → chunk-YYPA3CBH.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-XQGQ7FCY.js.map → cli-circuit-breaker-VRR5DKH3.js.map} +0 -0
- /package/dist/{composite-router-LKMRPPIU.js.map → composite-router-E3BGQGLP.js.map} +0 -0
- /package/dist/{consensus-vote-4BDZRQ4H.js.map → consensus-vote-PP4WBNZV.js.map} +0 -0
- /package/dist/{doctor-deep-4HJAHMKX.js.map → doctor-deep-MVG45YNL.js.map} +0 -0
- /package/dist/{expert-bridge-S4ZYI2RY.js.map → expert-bridge-SHKCEXGU.js.map} +0 -0
- /package/dist/{factory-RYNDDZBZ.js.map → factory-EISLNRL5.js.map} +0 -0
- /package/dist/{factory-WF5XJ5ID.js.map → factory-VJLXQYUO.js.map} +0 -0
- /package/dist/{issue-triage-XW2JTD7Y.js.map → issue-triage-OOKMZAPK.js.map} +0 -0
- /package/dist/{mcp-config-M6OMXTO5.js.map → mcp-config-4B54K5RR.js.map} +0 -0
- /package/dist/{mobimem-J42ZSXPX.js.map → mobimem-OWZTGHYA.js.map} +0 -0
- /package/dist/{repo-security-plan-7MERQOMP.js.map → repo-security-plan-ORAZDJYH.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-6NLYMDP3.js.map → research-helpers-synthesize-EAJDTBFK.js.map} +0 -0
- /package/dist/{routing-memory-MVBPOHIV.js.map → routing-memory-HLNGW4BW.js.map} +0 -0
- /package/dist/{session-memory-5PQONKGF.js.map → session-memory-YQPEWDFR.js.map} +0 -0
- /package/dist/{setup-command-5SXN2V6R.js.map → setup-command-V5DTJMBS.js.map} +0 -0
- /package/dist/{setup-config-N2RSHLAR.js.map → setup-config-FSMXLJ37.js.map} +0 -0
- /package/dist/{weather-report-Y5KAWS5M.js.map → weather-report-J5EIDKVM.js.map} +0 -0
package/LICENSE
CHANGED
|
@@ -19,9 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
This project is inspired by and incorporates concepts from claude-team-mcp,
|
|
26
|
-
which is also licensed under the MIT License. Attribution is preserved per
|
|
27
|
-
the terms of the original license.
|
|
@@ -2,9 +2,9 @@ import {
|
|
|
2
2
|
AdaptiveMemoryBackend,
|
|
3
3
|
DEFAULT_SCORING_CONFIG,
|
|
4
4
|
createAdaptiveMemory
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-72OMG44X.js";
|
|
6
6
|
import "./chunk-633WH2ML.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-DWZZZGZD.js";
|
|
8
8
|
import "./chunk-CLYZ7FWP.js";
|
|
9
9
|
import "./chunk-UP2VWCW5.js";
|
|
10
10
|
export {
|
|
@@ -12,4 +12,4 @@ export {
|
|
|
12
12
|
DEFAULT_SCORING_CONFIG,
|
|
13
13
|
createAdaptiveMemory
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=adaptive-memory-
|
|
15
|
+
//# sourceMappingURL=adaptive-memory-CHKKA4DI.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CliCircuitBreaker,
|
|
3
3
|
DEFAULT_CIRCUIT_BREAKER_CONFIG
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YT7REHTV.js";
|
|
5
5
|
import {
|
|
6
6
|
CLI_SUBPROCESS_TIMEOUTS,
|
|
7
7
|
CLI_TIMEOUTS,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
getTimeProvider,
|
|
26
26
|
isRateLimitText,
|
|
27
27
|
ok
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-DWZZZGZD.js";
|
|
29
29
|
|
|
30
30
|
// src/cli-adapters/subprocess-adapter.ts
|
|
31
31
|
import { spawn } from "child_process";
|
|
@@ -2727,4 +2727,4 @@ export {
|
|
|
2727
2727
|
isCliAvailable,
|
|
2728
2728
|
getAvailableClis
|
|
2729
2729
|
};
|
|
2730
|
-
//# sourceMappingURL=chunk-
|
|
2730
|
+
//# sourceMappingURL=chunk-3PNNEWR6.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
TASK_CATEGORIES,
|
|
3
3
|
getAdaptiveBonus,
|
|
4
4
|
getOutcomeStore
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DWZZZGZD.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/doctor-deep.ts
|
|
8
8
|
var CLI_NAMES = ["claude", "gemini", "codex", "opencode"];
|
|
@@ -106,4 +106,4 @@ export {
|
|
|
106
106
|
runDeepDiagnostics,
|
|
107
107
|
formatDeepDiagnostics
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-3RSILLFN.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
formatZodError,
|
|
12
12
|
getTimeProvider,
|
|
13
13
|
ok
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-DWZZZGZD.js";
|
|
15
15
|
|
|
16
16
|
// src/context/memory-backend-types.ts
|
|
17
17
|
import { z } from "zod";
|
|
@@ -941,4 +941,4 @@ export {
|
|
|
941
941
|
AdaptiveMemoryBackend,
|
|
942
942
|
createAdaptiveMemory
|
|
943
943
|
};
|
|
944
|
-
//# sourceMappingURL=chunk-
|
|
944
|
+
//# sourceMappingURL=chunk-72OMG44X.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ParseError,
|
|
3
3
|
SecurityError,
|
|
4
4
|
getErrorMessage
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DWZZZGZD.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/research-helpers-io.ts
|
|
8
8
|
import * as fs from "fs/promises";
|
|
@@ -928,4 +928,4 @@ export {
|
|
|
928
928
|
normalizeTopicToCanonical,
|
|
929
929
|
synthesizeResearch
|
|
930
930
|
};
|
|
931
|
-
//# sourceMappingURL=chunk-
|
|
931
|
+
//# sourceMappingURL=chunk-7GKB7LPG.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
createLogger,
|
|
3
3
|
getTimeProvider,
|
|
4
4
|
isRateLimitText
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DWZZZGZD.js";
|
|
6
6
|
|
|
7
7
|
// src/pipeline/expert-bridge.ts
|
|
8
8
|
var logger = createLogger({ component: "expert-bridge" });
|
|
@@ -12,7 +12,7 @@ var cachedMcpConfigPath = null;
|
|
|
12
12
|
async function getMcpConfigPath() {
|
|
13
13
|
if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;
|
|
14
14
|
try {
|
|
15
|
-
const { generateMcpConfig } = await import("./mcp-config-
|
|
15
|
+
const { generateMcpConfig } = await import("./mcp-config-4B54K5RR.js");
|
|
16
16
|
const config = await generateMcpConfig();
|
|
17
17
|
cachedMcpConfigPath = config.configPath;
|
|
18
18
|
return cachedMcpConfigPath;
|
|
@@ -38,13 +38,13 @@ function adaptCompositeRouter(compositeRouter) {
|
|
|
38
38
|
}
|
|
39
39
|
async function getRouter() {
|
|
40
40
|
if (cachedRouter !== null) return cachedRouter;
|
|
41
|
-
const { createAllAdapters } = await import("./factory-
|
|
42
|
-
const { createCompositeRouter } = await import("./composite-router-
|
|
41
|
+
const { createAllAdapters } = await import("./factory-EISLNRL5.js");
|
|
42
|
+
const { createCompositeRouter } = await import("./composite-router-E3BGQGLP.js");
|
|
43
43
|
const adapters = createAllAdapters();
|
|
44
44
|
if (adapters.size === 0) return null;
|
|
45
45
|
cachedRouter = adaptCompositeRouter(createCompositeRouter(adapters));
|
|
46
46
|
try {
|
|
47
|
-
const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-
|
|
47
|
+
const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-VRR5DKH3.js");
|
|
48
48
|
cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
|
|
49
49
|
} catch (error) {
|
|
50
50
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -136,4 +136,4 @@ ${prompt}`;
|
|
|
136
136
|
export {
|
|
137
137
|
executeExpert
|
|
138
138
|
};
|
|
139
|
-
//# sourceMappingURL=chunk-
|
|
139
|
+
//# sourceMappingURL=chunk-BIZLM4CK.js.map
|
|
@@ -10934,6 +10934,7 @@ export {
|
|
|
10934
10934
|
findModelsByToolCapability,
|
|
10935
10935
|
findModelsByFeature,
|
|
10936
10936
|
modelSupportsAll,
|
|
10937
|
+
calculateCost,
|
|
10937
10938
|
colors,
|
|
10938
10939
|
symbols,
|
|
10939
10940
|
writeLine,
|
|
@@ -11059,4 +11060,4 @@ export {
|
|
|
11059
11060
|
ParseError,
|
|
11060
11061
|
OrchestratorError
|
|
11061
11062
|
};
|
|
11062
|
-
//# sourceMappingURL=chunk-
|
|
11063
|
+
//# sourceMappingURL=chunk-DWZZZGZD.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-633WH2ML.js";
|
|
4
4
|
import {
|
|
5
5
|
createAllAdapters
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3PNNEWR6.js";
|
|
7
7
|
import {
|
|
8
8
|
DEFAULT_CAPABILITIES,
|
|
9
9
|
DEFAULT_MODEL_CAPABILITIES,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
ok,
|
|
16
16
|
symbols,
|
|
17
17
|
writeLine
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-DWZZZGZD.js";
|
|
19
19
|
import {
|
|
20
20
|
LEARNING_DIR,
|
|
21
21
|
OUTCOMES_FILE,
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "./chunk-CLYZ7FWP.js";
|
|
25
25
|
|
|
26
26
|
// src/version.ts
|
|
27
|
-
var VERSION = true ? "2.
|
|
27
|
+
var VERSION = true ? "2.33.0" : "dev";
|
|
28
28
|
|
|
29
29
|
// src/cli/setup-data-dir.ts
|
|
30
30
|
import { mkdirSync, existsSync as existsSync2 } from "fs";
|
|
@@ -758,7 +758,7 @@ async function runDoctorFix(result) {
|
|
|
758
758
|
writeLine2("\u2500".repeat(40));
|
|
759
759
|
let fixCount = 0;
|
|
760
760
|
if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
|
|
761
|
-
const { runSetup } = await import("./setup-command-
|
|
761
|
+
const { runSetup } = await import("./setup-command-V5DTJMBS.js");
|
|
762
762
|
const setupResult = runSetup({
|
|
763
763
|
skipMcp: true,
|
|
764
764
|
skipRules: true,
|
|
@@ -772,7 +772,7 @@ async function runDoctorFix(result) {
|
|
|
772
772
|
}
|
|
773
773
|
}
|
|
774
774
|
if (!result.configFile.found) {
|
|
775
|
-
const { runConfigInitSync } = await import("./setup-config-
|
|
775
|
+
const { runConfigInitSync } = await import("./setup-config-FSMXLJ37.js");
|
|
776
776
|
const configResult = runConfigInitSync(process.cwd(), false, false);
|
|
777
777
|
if (configResult.success && configResult.created) {
|
|
778
778
|
writeLine2(`\u2713 Generated config: ${configResult.path}`);
|
|
@@ -836,4 +836,4 @@ export {
|
|
|
836
836
|
startStdioServer,
|
|
837
837
|
closeServer
|
|
838
838
|
};
|
|
839
|
-
//# sourceMappingURL=chunk-
|
|
839
|
+
//# sourceMappingURL=chunk-F3ZEU2IK.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-BC3M4VLP.js";
|
|
4
4
|
import {
|
|
5
5
|
createLogger
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DWZZZGZD.js";
|
|
7
7
|
|
|
8
8
|
// src/mcp/tools/scanner-registry-fetcher.ts
|
|
9
9
|
import { z } from "zod";
|
|
@@ -697,4 +697,4 @@ export {
|
|
|
697
697
|
generateSecurityPlan,
|
|
698
698
|
buildPlanFromAnalysis
|
|
699
699
|
};
|
|
700
|
-
//# sourceMappingURL=chunk-
|
|
700
|
+
//# sourceMappingURL=chunk-FBS5MCJL.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runConfigInitSync
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NOITIOCN.js";
|
|
4
4
|
import {
|
|
5
5
|
VERSION,
|
|
6
6
|
initDataDirectories
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-F3ZEU2IK.js";
|
|
8
8
|
import {
|
|
9
9
|
CLI_SUBPROCESS_TIMEOUTS,
|
|
10
10
|
createLogger,
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
formatStatus,
|
|
14
14
|
getErrorMessage,
|
|
15
15
|
getTimeProvider
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-DWZZZGZD.js";
|
|
17
17
|
|
|
18
18
|
// src/cli/setup-command.ts
|
|
19
19
|
import { existsSync as existsSync4 } from "fs";
|
|
@@ -996,6 +996,57 @@ function convertAnswersToOptions(answers) {
|
|
|
996
996
|
};
|
|
997
997
|
}
|
|
998
998
|
|
|
999
|
+
// src/cli/setup-permissions.ts
|
|
1000
|
+
var SAFE_READONLY_TOOLS = [
|
|
1001
|
+
"list_experts",
|
|
1002
|
+
"list_workflows",
|
|
1003
|
+
"weather_report",
|
|
1004
|
+
"memory_query",
|
|
1005
|
+
"memory_stats",
|
|
1006
|
+
"query_trace",
|
|
1007
|
+
"research_query",
|
|
1008
|
+
"research_analyze",
|
|
1009
|
+
"research_discover",
|
|
1010
|
+
"research_synthesize",
|
|
1011
|
+
"repo_analyze",
|
|
1012
|
+
"repo_security_plan",
|
|
1013
|
+
"extract_symbols",
|
|
1014
|
+
"search_codebase"
|
|
1015
|
+
];
|
|
1016
|
+
var SAFE_EXECUTION_TOOLS = [
|
|
1017
|
+
"orchestrate",
|
|
1018
|
+
"create_expert",
|
|
1019
|
+
"execute_expert",
|
|
1020
|
+
"consensus_vote",
|
|
1021
|
+
"delegate_to_model",
|
|
1022
|
+
"run_workflow",
|
|
1023
|
+
"issue_triage",
|
|
1024
|
+
"registry_import"
|
|
1025
|
+
];
|
|
1026
|
+
function generatePermissionsSnippet(level = "all") {
|
|
1027
|
+
const tools = level === "readonly" ? [...SAFE_READONLY_TOOLS] : [...SAFE_READONLY_TOOLS, ...SAFE_EXECUTION_TOOLS];
|
|
1028
|
+
const permissions = tools.map((t) => `mcp__nexus-agents__${t}`).sort();
|
|
1029
|
+
return JSON.stringify(permissions, null, 2);
|
|
1030
|
+
}
|
|
1031
|
+
function buildPermissionsBanner(snippet) {
|
|
1032
|
+
return [
|
|
1033
|
+
"",
|
|
1034
|
+
"--- Claude Code Permissions (optional) ---",
|
|
1035
|
+
"",
|
|
1036
|
+
"To use nexus-agents MCP tools in 'don't ask' mode (autonomous/headless",
|
|
1037
|
+
"Claude Code sessions), add these entries to the `permissions.allow` array",
|
|
1038
|
+
"in your `~/.claude/settings.json`:",
|
|
1039
|
+
"",
|
|
1040
|
+
snippet,
|
|
1041
|
+
"",
|
|
1042
|
+
"Without these, each MCP tool call will prompt for approval in interactive",
|
|
1043
|
+
"mode, or be rejected outright in `dangerously-skip-permissions` mode.",
|
|
1044
|
+
"",
|
|
1045
|
+
"Reference: https://github.com/williamzujkowski/nexus-agents/issues/1945",
|
|
1046
|
+
""
|
|
1047
|
+
].join("\n");
|
|
1048
|
+
}
|
|
1049
|
+
|
|
999
1050
|
// src/cli/setup-command.ts
|
|
1000
1051
|
function writeLine2(text) {
|
|
1001
1052
|
process.stdout.write(text + "\n");
|
|
@@ -1466,6 +1517,12 @@ function printDetailSections(result) {
|
|
|
1466
1517
|
}
|
|
1467
1518
|
if (result.rulesPath !== void 0) printRulesFile(result.rulesPath);
|
|
1468
1519
|
if (result.dataDirPath !== void 0) printDataDirSection(result);
|
|
1520
|
+
printPermissionsSuggestion();
|
|
1521
|
+
}
|
|
1522
|
+
function printPermissionsSuggestion() {
|
|
1523
|
+
const snippet = generatePermissionsSnippet("all");
|
|
1524
|
+
const banner = buildPermissionsBanner(snippet);
|
|
1525
|
+
writeLine2(banner);
|
|
1469
1526
|
}
|
|
1470
1527
|
function printDataDirSection(result) {
|
|
1471
1528
|
writeLine2(formatHeader("Data Directory"));
|
|
@@ -1523,4 +1580,4 @@ export {
|
|
|
1523
1580
|
setupCommand,
|
|
1524
1581
|
setupCommandAsync
|
|
1525
1582
|
};
|
|
1526
|
-
//# sourceMappingURL=chunk-
|
|
1583
|
+
//# sourceMappingURL=chunk-ICFGV3HB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/setup-command.ts","../src/cli/setup-types.ts","../src/cli/setup-environment.ts","../src/cli/setup-mcp.ts","../src/cli/setup-rules.ts","../src/cli/setup-formatting.ts","../src/cli/setup-opencode.ts","../src/cli/setup-gemini.ts","../src/cli/setup-codex.ts","../src/cli/setup-wizard.ts","../src/cli/setup-permissions.ts"],"sourcesContent":["/* eslint-disable max-lines -- Cohesive setup command module (governance: 400-600 OK if cohesive) */\n/**\n * nexus-agents setup command\n *\n * Configures Claude CLI integration with nexus-agents MCP server.\n * Generates MCP configuration snippet and .claude/rules/nexus-agents.md.\n *\n * @module cli/setup-command\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n * (Source: Issue #425 - Interactive setup wizard)\n */\n\nimport { existsSync } from 'node:fs';\nimport type { SetupOptions, SetupResult, SetupStep, EnvironmentInfo } from './setup-types.js';\nimport { SetupOptionsSchema } from './setup-types.js';\nimport { getTimeProvider, getErrorMessage } from '../core/index.js';\nimport {\n detectEnvironment,\n generateMcpSnippet,\n generateRulesContent,\n createRulesFile,\n getRulesFilePath,\n formatStatus,\n formatHeader,\n formatCodeBlock,\n isInteractive,\n configureMcpServer,\n // Hook configuration (Issue #416)\n configureHooks,\n generateHookSnippet,\n} from './setup-helpers.js';\nimport type { McpConfigResult, HookConfigResult } from './setup-helpers.js';\nimport { initDataDirectories } from './setup-data-dir.js';\nimport type { DataDirInitResult } from './setup-data-dir.js';\nimport { runConfigInitSync } from './setup-config.js';\nimport { detectOpenCodeCli, configureOpenCode } from './setup-opencode.js';\nimport { detectGeminiCli, configureGemini } from './setup-gemini.js';\nimport { detectCodexCli, configureCodex } from './setup-codex.js';\nimport { VERSION } from '../version.js';\nimport { runWizard } from './setup-wizard.js';\nimport { generatePermissionsSnippet, buildPermissionsBanner } from './setup-permissions.js';\n\n// ============================================================================\n// Output Helpers\n// ============================================================================\n\n/**\n * Writes a line to stdout.\n */\nfunction writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n}\n\n/**\n * Writes an empty line.\n */\nfunction writeEmptyLine(): void {\n process.stdout.write('\\n');\n}\n\n/**\n * Prints MCP configuration result section.\n */\nfunction printMcpResult(mcpResult: McpConfigResult, snippet: string | undefined): void {\n writeLine(formatHeader('MCP Configuration'));\n writeLine('─'.repeat(40));\n if (mcpResult.success) {\n writeLine(mcpResult.message);\n writeLine('Run `/mcp` in Claude Code to verify.');\n } else {\n writeLine(`Failed: ${mcpResult.message}`);\n if (snippet !== undefined) {\n writeEmptyLine();\n writeLine('Manual fallback - run:');\n writeEmptyLine();\n writeLine(formatCodeBlock(`claude mcp add-json nexus-agents '${snippet}'`));\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints rules file section.\n */\nfunction printRulesFile(rulesPath: string): void {\n writeLine(formatHeader('Rules File'));\n writeLine('─'.repeat(40));\n writeLine(`Created: ${rulesPath}`);\n writeLine('Claude will now have context about nexus-agents tools.');\n writeEmptyLine();\n}\n\n/**\n * Prints hooks configuration result section.\n * (Source: Issue #416)\n */\nfunction printHooksResult(hookResult: HookConfigResult, snippet: string | undefined): void {\n writeLine(formatHeader('Hooks Configuration'));\n writeLine('─'.repeat(40));\n if (hookResult.success) {\n writeLine(hookResult.message);\n writeLine('Hooks will track sessions, metrics, and validate tool use.');\n } else {\n writeLine(`Note: ${hookResult.message}`);\n if (snippet !== undefined) {\n writeEmptyLine();\n writeLine('Manual fallback - add to ~/.claude/settings.json:');\n writeEmptyLine();\n writeLine(formatCodeBlock(snippet));\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints warnings section.\n */\nfunction printWarnings(warnings: readonly string[]): void {\n writeLine(formatHeader('Warnings'));\n writeLine('─'.repeat(40));\n for (const warning of warnings) {\n writeLine(`⚠ ${warning}`);\n }\n writeEmptyLine();\n}\n\n/**\n * Prints errors section.\n */\nfunction printErrors(errors: readonly string[]): void {\n writeLine(formatHeader('Errors'));\n writeLine('─'.repeat(40));\n for (const error of errors) {\n writeLine(`✗ ${error}`);\n }\n writeEmptyLine();\n}\n\n/**\n * Prints next steps section.\n */\nfunction printNextSteps(mcpConfigured: boolean, hasMcpSnippet: boolean): void {\n writeLine(formatHeader('Next Steps'));\n writeLine('─'.repeat(40));\n if (hasMcpSnippet && !mcpConfigured) {\n writeLine('1. Configure MCP manually (see above)');\n writeLine('2. Restart Claude Code');\n }\n writeLine('3. Run: nexus-agents doctor');\n writeLine('4. Try: nexus-agents orchestrate \"Hello World\"');\n writeEmptyLine();\n}\n\n/**\n * Prints steps with status indicators.\n */\nfunction printSteps(steps: readonly SetupStep[], verbose: boolean): void {\n for (const step of steps) {\n const status = formatStatus(step.status);\n const duration = step.durationMs !== undefined ? ` (${String(step.durationMs)}ms)` : '';\n writeLine(`${status} ${step.name}${verbose ? duration : ''}`);\n if (step.message !== undefined && (verbose || step.status === 'failed')) {\n writeLine(` ${step.message}`);\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints result summary line.\n */\nfunction printSummary(success: boolean): void {\n const summary = success ? '✓ Setup completed successfully!' : '✗ Setup completed with errors';\n writeLine(success ? `\\x1b[32m${summary}\\x1b[0m` : `\\x1b[31m${summary}\\x1b[0m`);\n writeEmptyLine();\n}\n\n// ============================================================================\n// Setup Steps\n// ============================================================================\n\n/**\n * Runs the environment detection step.\n */\nfunction runDetectionStep(projectRoot: string): { env: EnvironmentInfo; step: SetupStep } {\n const time = getTimeProvider();\n const startTime = time.now();\n const env = detectEnvironment(projectRoot);\n\n return {\n env,\n step: {\n name: 'Environment Detection',\n status: 'success',\n message: `Platform: ${env.platform}, Claude CLI: ${env.claudeCli.installed ? (env.claudeCli.version ?? 'installed') : 'not found'}`,\n durationMs: time.now() - startTime,\n },\n };\n}\n\n/** Minimum Node.js major version required. */\nconst REQUIRED_NODE_MAJOR = 22;\n\n/**\n * Runs the prerequisite validation step.\n * Checks Node.js version and warns about missing package managers.\n */\nfunction runPrerequisiteStep(): { step: SetupStep; warnings: readonly string[] } {\n const time = getTimeProvider();\n const startTime = time.now();\n const warnings: string[] = [];\n\n const version = process.version;\n const major = Number(version.slice(1).split('.')[0]);\n const nodeOk = major >= REQUIRED_NODE_MAJOR;\n\n if (!nodeOk) {\n warnings.push(\n `Node.js ${version} detected — v${String(REQUIRED_NODE_MAJOR)}.x+ required. Some features may not work.`\n );\n }\n\n const status = nodeOk ? 'success' : 'warning';\n const message = nodeOk\n ? `Node.js ${version} (meets v${String(REQUIRED_NODE_MAJOR)}.x requirement)`\n : `Node.js ${version} — v${String(REQUIRED_NODE_MAJOR)}.x+ required`;\n\n return {\n step: {\n name: 'Prerequisite Check',\n status,\n message,\n durationMs: time.now() - startTime,\n },\n warnings,\n };\n}\n\n/** MCP step result type. */\ntype McpStepResult = {\n step: SetupStep;\n snippet: string | undefined;\n mcpResult: McpConfigResult | undefined;\n};\n\n/** Creates an MCP step result. */\nfunction makeMcpResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n snippet?: string,\n mcpResult?: McpConfigResult\n): McpStepResult {\n return {\n step: {\n name: 'MCP Configuration',\n status,\n message,\n durationMs: getTimeProvider().now() - startTime,\n },\n snippet,\n mcpResult,\n };\n}\n\n/**\n * Runs the MCP configuration step.\n */\nfunction runMcpConfigStep(env: EnvironmentInfo, options: SetupOptions): McpStepResult {\n const startTime = getTimeProvider().now();\n\n if (options.skipMcp) {\n return makeMcpResult('skipped', 'Skipped (--skip-mcp)', startTime);\n }\n\n const useNpx = !env.claudeCli.installed;\n const snippet = generateMcpSnippet(useNpx);\n\n if (!env.claudeCli.installed) {\n const mcpResult: McpConfigResult = {\n success: false,\n alreadyConfigured: false,\n message: 'Claude CLI not installed',\n };\n return makeMcpResult(\n 'warning',\n 'Claude CLI not found - manual configuration required',\n startTime,\n snippet,\n mcpResult\n );\n }\n\n const mcpResult = configureMcpServer(useNpx, options.force, options.scope);\n const status = mcpResult.success\n ? mcpResult.alreadyConfigured\n ? 'skipped'\n : 'success'\n : 'failed';\n return makeMcpResult(\n status,\n mcpResult.message,\n startTime,\n mcpResult.success ? undefined : snippet,\n mcpResult\n );\n}\n\n/** Creates a rules step result. */\nfunction makeRulesResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n rulesPath?: string\n): { step: SetupStep; rulesPath: string | undefined } {\n return {\n step: { name: 'Rules File', status, message, durationMs: getTimeProvider().now() - startTime },\n rulesPath,\n };\n}\n\n/** Creates a hooks step result. */\nfunction makeHooksResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n hookResult?: HookConfigResult\n): { step: SetupStep; hookSnippet: string | undefined; hookResult: HookConfigResult | undefined } {\n return {\n step: {\n name: 'Hooks Configuration',\n status,\n message,\n durationMs: getTimeProvider().now() - startTime,\n },\n hookSnippet: hookResult?.success === false ? generateHookSnippet() : undefined,\n hookResult,\n };\n}\n\n/**\n * Runs the rules file generation step.\n */\nfunction runRulesStep(\n env: EnvironmentInfo,\n options: SetupOptions\n): { step: SetupStep; rulesPath: string | undefined } {\n const startTime = getTimeProvider().now();\n\n if (options.skipRules) {\n return makeRulesResult('skipped', 'Skipped (--skip-rules)', startTime);\n }\n\n const rulesPath = getRulesFilePath(env.projectInfo.root);\n if (existsSync(rulesPath) && !options.force) {\n return makeRulesResult(\n 'skipped',\n 'Rules file already exists (use --force to overwrite)',\n startTime\n );\n }\n\n try {\n const createdPath = createRulesFile(env.projectInfo.root, options.dryRun);\n const msg = options.dryRun ? `Would create: ${createdPath}` : `Created: ${createdPath}`;\n return makeRulesResult('success', msg, startTime, createdPath);\n } catch (error) {\n const msg = getErrorMessage(error);\n return makeRulesResult('failed', `Failed to create rules file: ${msg}`, startTime);\n }\n}\n\n/**\n * Runs the hooks configuration step.\n * (Source: Issue #416 - Setup command hook configuration)\n */\nfunction runHooksStep(\n env: EnvironmentInfo,\n options: SetupOptions\n): { step: SetupStep; hookSnippet: string | undefined; hookResult: HookConfigResult | undefined } {\n const startTime = getTimeProvider().now();\n\n if (options.skipHooks) {\n return makeHooksResult('skipped', 'Skipped (--skip-hooks)', startTime);\n }\n\n // If Claude CLI is not installed, we can't configure automatically\n if (!env.claudeCli.installed) {\n return makeHooksResult(\n 'warning',\n 'Claude CLI not found - manual hook configuration required',\n startTime,\n {\n success: false,\n alreadyConfigured: false,\n message: 'Claude CLI not installed',\n }\n );\n }\n\n // If dry-run, just report what would happen\n if (options.dryRun) {\n return makeHooksResult(\n 'success',\n 'Would configure nexus-agents hooks in Claude Code settings',\n startTime\n );\n }\n\n // Configure using Claude CLI\n const hookResult = configureHooks(options.force);\n const status = hookResult.success\n ? hookResult.alreadyConfigured\n ? 'skipped'\n : 'success'\n : 'failed';\n\n return makeHooksResult(status, hookResult.message, startTime, hookResult);\n}\n\n/**\n * Runs the OpenCode MCP configuration step (#1253).\n */\nfunction runOpenCodeStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipOpencode) {\n return {\n name: 'OpenCode MCP',\n status: 'skipped',\n message: 'Skipped (--skip-opencode)',\n durationMs: 0,\n };\n }\n const cliInfo = detectOpenCodeCli();\n if (!cliInfo.installed) {\n return {\n name: 'OpenCode MCP',\n status: 'skipped',\n message: 'OpenCode CLI not installed',\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureOpenCode(options.force, options.dryRun);\n return {\n name: 'OpenCode MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the Gemini CLI MCP configuration step (#1259).\n */\nfunction runGeminiStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipGemini) {\n return {\n name: 'Gemini MCP',\n status: 'skipped',\n message: 'Skipped (--skip-gemini)',\n durationMs: 0,\n };\n }\n const cliInfo = detectGeminiCli();\n if (!cliInfo.installed) {\n return {\n name: 'Gemini MCP',\n status: 'skipped',\n message: 'Gemini CLI not installed',\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureGemini(options.force, options.dryRun, options.scope);\n return {\n name: 'Gemini MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the data directory initialization step (#1249).\n */\nfunction runDataDirStep(options: SetupOptions): { step: SetupStep; result: DataDirInitResult } {\n const startTime = getTimeProvider().now();\n const dataDirResult = initDataDirectories(options.dryRun);\n return {\n step: {\n name: 'Data Directory',\n status: dataDirResult.success\n ? dataDirResult.created.length > 0\n ? 'success'\n : 'skipped'\n : 'failed',\n message: dataDirResult.success\n ? dataDirResult.created.length > 0\n ? `Created ${String(dataDirResult.created.length)} directories`\n : 'All directories already exist'\n : `Failed: ${dataDirResult.error ?? 'Unknown error'}`,\n durationMs: getTimeProvider().now() - startTime,\n },\n result: dataDirResult,\n };\n}\n\n/**\n * Runs the Codex CLI MCP configuration step (#1263).\n */\nfunction runCodexStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipCodex) {\n return {\n name: 'Codex MCP',\n status: 'skipped',\n message: 'Skipped (--skip-codex)',\n durationMs: 0,\n };\n }\n const cliInfo = detectCodexCli();\n if (!cliInfo.installed) {\n return {\n name: 'Codex MCP',\n status: 'skipped',\n message: 'Codex CLI not installed',\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureCodex(options.force, options.dryRun);\n return {\n name: 'Codex MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the config file generation step (#1252).\n */\nfunction runConfigStep(projectRoot: string, options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipConfig) {\n return {\n name: 'Configuration',\n status: 'skipped',\n message: 'Skipped (--skip-config)',\n durationMs: 0,\n };\n }\n const result = runConfigInitSync(projectRoot, options.force, options.dryRun);\n return {\n name: 'Configuration',\n status: result.success ? (result.created ? 'success' : 'skipped') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/** Checks a named step's status, returning a check or issue string. */\nfunction checkStepStatus(steps: readonly SetupStep[], name: string, label: string): string {\n const step = steps.find((s) => s.name === name);\n const ok = step?.status === 'success' || step?.status === 'skipped';\n return ok ? `${label} OK` : `${label} failed`;\n}\n\n/**\n * Runs post-setup validation step (#1271).\n * Checks that critical setup outcomes are in place.\n */\nfunction runValidationStep(steps: readonly SetupStep[]): SetupStep {\n const startTime = getTimeProvider().now();\n\n const mcpSteps = steps.filter((s) => s.name.includes('MCP'));\n const mcpFailed = mcpSteps.filter((s) => s.status === 'failed').length;\n const mcpCheck =\n mcpFailed > 0\n ? `${String(mcpFailed)} MCP config(s) failed`\n : `${String(mcpSteps.length)} MCP configs OK`;\n\n const results = [\n mcpCheck,\n checkStepStatus(steps, 'Data Directory', 'Data dirs'),\n checkStepStatus(steps, 'Configuration', 'Config'),\n ];\n const hasIssues = results.some((r) => r.includes('failed'));\n\n return {\n name: 'Validation',\n status: hasIssues ? 'warning' : 'success',\n message: `${results.join(', ')}. Run \\`nexus-agents doctor\\` for full health check`,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n// ============================================================================\n// Main Command Helpers\n// ============================================================================\n\n/**\n * Adds Claude CLI warnings if not installed.\n */\nfunction addClaudeCliWarnings(warnings: string[], installed: boolean): void {\n if (!installed) {\n warnings.push(\n 'Claude CLI not found. Install it with: npm install -g @anthropic-ai/claude-code'\n );\n warnings.push('The MCP snippet uses npx to run nexus-agents (works without global install).');\n }\n}\n\n/**\n * Collects errors from failed steps.\n */\nfunction collectErrors(steps: readonly SetupStep[]): string[] {\n return steps.filter((s) => s.status === 'failed').map((s) => s.message ?? `${s.name} failed`);\n}\n\n/** Result context for building final result. */\ninterface SetupResultContext {\n startTime: number;\n steps: SetupStep[];\n warnings: string[];\n mcpResult: McpConfigResult | undefined;\n snippet: string | undefined;\n hookResult: HookConfigResult | undefined;\n hookSnippet: string | undefined;\n rulesPath: string | undefined;\n dataDirResult?: DataDirInitResult;\n}\n\n/** Checks if a config result represents a new (non-existing) success. */\nfunction isNewSuccess(result: McpConfigResult | HookConfigResult | undefined): boolean {\n return result?.success === true && !result.alreadyConfigured;\n}\n\n/** Builds the final setup result from context. */\nfunction buildSetupResult(ctx: SetupResultContext): SetupResult {\n const errors = collectErrors(ctx.steps);\n return {\n success: errors.length === 0,\n steps: ctx.steps,\n warnings: ctx.warnings,\n errors,\n durationMs: getTimeProvider().now() - ctx.startTime,\n ...(isNewSuccess(ctx.mcpResult) && { mcpConfigured: true }),\n ...(ctx.snippet !== undefined && { mcpSnippet: ctx.snippet }),\n ...(isNewSuccess(ctx.hookResult) && { hooksConfigured: true }),\n ...(ctx.hookSnippet !== undefined && { hookSnippet: ctx.hookSnippet }),\n ...(ctx.rulesPath !== undefined && { rulesPath: ctx.rulesPath }),\n ...(ctx.dataDirResult !== undefined && {\n dataDirPath: ctx.dataDirResult.rootPath,\n dataDirsCreated: ctx.dataDirResult.created.length,\n }),\n };\n}\n\n// ============================================================================\n// Main Command\n// ============================================================================\n\n/**\n * Runs the setup command.\n */\nexport function runSetup(options: Partial<SetupOptions> = {}): SetupResult {\n const startTime = getTimeProvider().now();\n const parsedOptions = SetupOptionsSchema.parse(options);\n const projectRoot = process.cwd();\n\n const warnings: string[] = [];\n\n // Step 1: Environment Detection\n const { env, step: detectionStep } = runDetectionStep(projectRoot);\n addClaudeCliWarnings(warnings, env.claudeCli.installed);\n\n // Step 2: Prerequisite Validation\n const { step: prereqStep, warnings: prereqWarnings } = runPrerequisiteStep();\n warnings.push(...prereqWarnings);\n\n // Step 3: MCP Configuration\n const { step: mcpStep, snippet, mcpResult } = runMcpConfigStep(env, parsedOptions);\n\n // Step 4: Rules File\n const { step: rulesStep, rulesPath } = runRulesStep(env, parsedOptions);\n\n // Step 5: Hooks Configuration (Issue #416)\n const { step: hooksStep, hookSnippet, hookResult } = runHooksStep(env, parsedOptions);\n\n // Step 6: Data Directory Initialization (#1249)\n const { step: dataDirStep, result: dataDirResult } = runDataDirStep(parsedOptions);\n\n // Step 7: OpenCode MCP Configuration (#1253)\n const openCodeStep = runOpenCodeStep(parsedOptions);\n\n // Step 8: Gemini MCP Configuration (#1259)\n const geminiStep = runGeminiStep(parsedOptions);\n\n // Step 9: Codex MCP Configuration (#1263)\n const codexStep = runCodexStep(parsedOptions);\n\n const configStep = runConfigStep(projectRoot, parsedOptions); // Step 10\n const steps = [\n detectionStep,\n prereqStep,\n mcpStep,\n rulesStep,\n hooksStep,\n dataDirStep,\n openCodeStep,\n geminiStep,\n codexStep,\n configStep,\n ];\n steps.push(runValidationStep(steps)); // Step 11: Validation (#1271)\n\n return buildSetupResult({\n startTime,\n steps,\n warnings,\n mcpResult,\n snippet,\n hookResult,\n hookSnippet,\n rulesPath,\n dataDirResult,\n });\n}\n\n/** Prints optional detail sections (MCP, hooks, rules, data dir). */\nfunction printDetailSections(result: SetupResult): void {\n if (result.mcpSnippet !== undefined || result.mcpConfigured === true) {\n const mcpResult: McpConfigResult =\n result.mcpConfigured === true\n ? {\n success: true,\n alreadyConfigured: false,\n message: 'Added nexus-agents MCP server to Claude Code',\n }\n : { success: false, alreadyConfigured: false, message: 'Manual configuration required' };\n printMcpResult(mcpResult, result.mcpSnippet);\n }\n if (result.hookSnippet !== undefined || result.hooksConfigured === true) {\n const hookResult: HookConfigResult =\n result.hooksConfigured === true\n ? {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents hooks in Claude Code settings',\n }\n : { success: false, alreadyConfigured: false, message: 'Manual configuration required' };\n printHooksResult(hookResult, result.hookSnippet);\n }\n if (result.rulesPath !== undefined) printRulesFile(result.rulesPath);\n if (result.dataDirPath !== undefined) printDataDirSection(result);\n printPermissionsSuggestion();\n}\n\n/** Prints the Claude Code permissions suggestion (#1945). */\nfunction printPermissionsSuggestion(): void {\n const snippet = generatePermissionsSnippet('all');\n const banner = buildPermissionsBanner(snippet);\n writeLine(banner);\n}\n\n/** Prints the data directory section. */\nfunction printDataDirSection(result: SetupResult): void {\n writeLine(formatHeader('Data Directory'));\n writeLine('─'.repeat(40));\n const count = result.dataDirsCreated ?? 0;\n const msg =\n count > 0\n ? `Created ${String(count)} directories under ${result.dataDirPath ?? ''}`\n : `All directories already exist at ${result.dataDirPath ?? ''}`;\n writeLine(msg);\n writeEmptyLine();\n}\n\n/**\n * Prints the setup result.\n */\nexport function printSetupResult(result: SetupResult, verbose: boolean): void {\n writeEmptyLine();\n writeLine(formatHeader(`Nexus Agents Setup v${VERSION}`));\n writeLine('═'.repeat(40));\n writeEmptyLine();\n\n printSteps(result.steps, verbose);\n printDetailSections(result);\n\n if (result.warnings.length > 0) printWarnings(result.warnings);\n if (result.errors.length > 0) printErrors(result.errors);\n printNextSteps(result.mcpConfigured === true, result.mcpSnippet !== undefined);\n printSummary(result.success);\n}\n\n/**\n * Setup command entry point (synchronous, non-interactive).\n *\n * @returns Exit code (0 = success, 1 = failure)\n */\nexport function setupCommand(options: Partial<SetupOptions> = {}): number {\n const parsedOptions = SetupOptionsSchema.parse(options);\n\n // Check for non-interactive mode in CI\n if (!isInteractive() && !parsedOptions.nonInteractive) {\n writeLine('Non-interactive environment detected.');\n writeLine('Run with --non-interactive or set CI=true.');\n return 1;\n }\n\n const result = runSetup(options);\n printSetupResult(result, parsedOptions.verbose);\n\n return result.success ? 0 : 1;\n}\n\n/** Extended options including interactive flag. */\nexport interface SetupCommandOptions extends Partial<SetupOptions> {\n interactive?: boolean;\n}\n\n/**\n * Setup command entry point with interactive wizard support.\n * (Source: Issue #425 - Interactive setup wizard)\n *\n * @returns Exit code (0 = success, 1 = failure)\n */\nexport async function setupCommandAsync(options: SetupCommandOptions = {}): Promise<number> {\n // Run interactive wizard if requested\n if (options.interactive === true) {\n const wizardOptions = await runWizard();\n\n if (wizardOptions === undefined) {\n // User cancelled the wizard\n return 1;\n }\n\n // Merge wizard options with any existing options (wizard options take precedence)\n const mergedOptions = { ...options, ...wizardOptions };\n delete (mergedOptions as SetupCommandOptions).interactive; // Remove interactive flag\n\n const result = runSetup(mergedOptions);\n printSetupResult(result, mergedOptions.verbose ?? false);\n return result.success ? 0 : 1;\n }\n\n // Fall back to synchronous command\n return setupCommand(options);\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { generateMcpSnippet, generateRulesContent, detectEnvironment };\nexport { runWizard } from './setup-wizard.js';\nexport type { SetupOptions, SetupResult };\n// SetupCommandOptions is already exported via interface definition above\nexport type { WizardAnswers, UsageMode } from './setup-wizard.js';\n","/**\n * nexus-agents setup command types\n *\n * Type definitions for the user onboarding automation system.\n *\n * @module cli/setup-types\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { z } from 'zod';\nimport type { CommandResult } from '../core/index.js';\n\n/**\n * Setup command options schema.\n */\nexport const SetupOptionsSchema = z.object({\n /** Skip interactive prompts */\n nonInteractive: z.boolean().default(false),\n /** Overwrite existing configurations */\n force: z.boolean().default(false),\n /** Skip MCP configuration */\n skipMcp: z.boolean().default(false),\n /** Skip CLAUDE.md/rules generation */\n skipRules: z.boolean().default(false),\n /** Skip hooks configuration (Issue #416) */\n skipHooks: z.boolean().default(false),\n /** Skip config file generation (#1252) */\n skipConfig: z.boolean().default(false),\n /** Skip OpenCode MCP configuration (#1253) */\n skipOpencode: z.boolean().default(false),\n /** Skip Gemini CLI MCP configuration (#1259) */\n skipGemini: z.boolean().default(false),\n /** Skip Codex CLI MCP configuration (#1263) */\n skipCodex: z.boolean().default(false),\n /** Show what would be done without making changes */\n dryRun: z.boolean().default(false),\n /** Show detailed output */\n verbose: z.boolean().default(false),\n /** Target scope for MCP config */\n scope: z.enum(['user', 'project']).default('user'),\n});\n\nexport type SetupOptions = z.infer<typeof SetupOptionsSchema>;\n\n/**\n * Claude CLI detection result.\n */\nexport interface ClaudeCliInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n readonly configPath: string;\n readonly mcpJsonPath: string;\n}\n\n/**\n * Existing MCP configuration info.\n */\nexport interface McpConfigInfo {\n readonly exists: boolean;\n readonly path: string;\n readonly hasNexusAgents: boolean;\n readonly servers: readonly string[];\n}\n\n/**\n * MCP server configuration entry.\n */\nexport interface McpServerEntry {\n readonly command: string;\n readonly args?: readonly string[];\n readonly env?: Record<string, string>;\n}\n\n/**\n * MCP JSON configuration format.\n */\nexport interface McpJsonConfig {\n readonly mcpServers?: Record<string, McpServerEntry>;\n}\n\n/**\n * Project type detection.\n */\nexport type ProjectType =\n | 'typescript'\n | 'javascript'\n | 'python'\n | 'rust'\n | 'go'\n | 'java'\n | 'unknown';\n\n/**\n * Project information.\n */\nexport interface ProjectInfo {\n readonly root: string;\n readonly hasPackageJson: boolean;\n readonly hasClaudeMd: boolean;\n readonly hasClaudeRules: boolean;\n readonly hasNexusConfig: boolean;\n readonly projectType: ProjectType;\n readonly packageName?: string;\n}\n\n/**\n * Complete environment information.\n */\nexport interface EnvironmentInfo {\n readonly platform: NodeJS.Platform;\n readonly homeDir: string;\n readonly claudeCli: ClaudeCliInfo;\n readonly existingMcpConfig: McpConfigInfo | undefined;\n readonly projectInfo: ProjectInfo;\n}\n\n/**\n * Setup step status.\n */\nexport interface SetupStep {\n readonly name: string;\n readonly status: 'pending' | 'success' | 'skipped' | 'failed' | 'warning';\n readonly message?: string;\n readonly durationMs?: number;\n}\n\n/**\n * Setup result summary.\n * Extends CommandResult base pattern (Issue #584).\n */\nexport interface SetupResult extends CommandResult {\n /** Setup steps executed */\n readonly steps: readonly SetupStep[];\n /** MCP configuration was successful via Claude CLI */\n readonly mcpConfigured?: boolean;\n /** Fallback MCP snippet for manual configuration */\n readonly mcpSnippet?: string;\n /** Hooks configuration was successful via Claude CLI (Issue #416) */\n readonly hooksConfigured?: boolean;\n /** Fallback hook snippet for manual configuration */\n readonly hookSnippet?: string;\n readonly rulesPath?: string;\n /** Data directory path if initialized (#1249) */\n readonly dataDirPath?: string;\n /** Number of data directories created (#1249) */\n readonly dataDirsCreated?: number;\n readonly warnings: readonly string[];\n readonly errors: readonly string[];\n readonly durationMs: number;\n}\n\n/**\n * Backup information for rollback.\n */\nexport interface BackupInfo {\n readonly type: 'file';\n readonly originalPath: string;\n readonly backupPath: string;\n readonly content: string;\n}\n\n/**\n * Rollback item types.\n */\nexport type RollbackItem =\n | { type: 'file-backup'; backup: BackupInfo }\n | { type: 'file-created'; path: string }\n | { type: 'file-modified'; backup: BackupInfo };\n","/**\n * nexus-agents setup environment detection\n *\n * Environment detection helpers for Claude CLI and project setup.\n *\n * @module cli/setup-environment\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, basename } from 'node:path';\nimport { CLI_SUBPROCESS_TIMEOUTS } from '../config/timeouts.js';\nimport type {\n ClaudeCliInfo,\n McpConfigInfo,\n ProjectInfo,\n ProjectType,\n EnvironmentInfo,\n} from './setup-types.js';\n\n/**\n * Parses Claude CLI version from output.\n */\nfunction parseClaudeVersion(output: string): string | undefined {\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match?.[1];\n}\n\n/**\n * Detects if Claude CLI is installed and available.\n * Uses a 3-second timeout to avoid hanging in slow environments.\n */\nexport function detectClaudeCli(): ClaudeCliInfo {\n const configPath = join(homedir(), '.claude');\n const mcpJsonPath = join(homedir(), '.claude.json');\n\n try {\n const result = execSync('claude --version', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: CLI_SUBPROCESS_TIMEOUTS.envSetupMs,\n });\n const version = parseClaudeVersion(result);\n\n return {\n installed: true,\n version,\n configPath,\n mcpJsonPath,\n };\n } catch {\n return {\n installed: false,\n version: undefined,\n configPath,\n mcpJsonPath,\n };\n }\n}\n\n/** Extracts MCP servers from direct mcpServers key (project-scoped .mcp.json). */\nfunction extractDirectServers(config: Record<string, unknown>): string[] | undefined {\n const mcpServers = config['mcpServers'] as Record<string, unknown> | undefined;\n if (mcpServers === undefined) return undefined;\n return Object.keys(mcpServers);\n}\n\n/** Extracts MCP servers from projects key (~/.claude.json format). */\nfunction extractProjectServers(config: Record<string, unknown>): string[] | undefined {\n const projects = config['projects'] as Record<string, Record<string, unknown>> | undefined;\n if (projects === undefined) return undefined;\n const allServers = new Set<string>();\n for (const proj of Object.values(projects)) {\n const mcpServers = proj['mcpServers'] as Record<string, unknown> | undefined;\n if (mcpServers !== undefined) Object.keys(mcpServers).forEach((n) => allServers.add(n));\n }\n return [...allServers];\n}\n\n/** Builds McpConfigInfo from a server list. */\nfunction buildMcpInfo(path: string, servers: string[]): McpConfigInfo {\n return { exists: true, path, hasNexusAgents: servers.includes('nexus-agents'), servers };\n}\n\n/**\n * Detects existing MCP configuration.\n *\n * Handles two formats:\n * - `.mcp.json` (project-scoped): `{ mcpServers: { ... } }`\n * - `~/.claude.json` (user-scoped): `{ projects: { [path]: { mcpServers: { ... } } } }`\n */\nexport function detectMcpConfig(mcpJsonPath: string): McpConfigInfo | undefined {\n if (!existsSync(mcpJsonPath)) return undefined;\n try {\n const config = JSON.parse(readFileSync(mcpJsonPath, 'utf-8')) as Record<string, unknown>;\n const direct = extractDirectServers(config);\n if (direct !== undefined) return buildMcpInfo(mcpJsonPath, direct);\n const projected = extractProjectServers(config);\n if (projected !== undefined) return buildMcpInfo(mcpJsonPath, projected);\n return buildMcpInfo(mcpJsonPath, []);\n } catch {\n return buildMcpInfo(mcpJsonPath, []);\n }\n}\n\n/** Checks for TypeScript in package.json devDependencies. */\nfunction hasTypeScriptInPackageJson(root: string): boolean {\n try {\n const content = readFileSync(join(root, 'package.json'), 'utf-8');\n const parsed: unknown = JSON.parse(content);\n const pkg = parsed as Record<string, unknown>;\n const devDeps = pkg['devDependencies'] as Record<string, string> | undefined;\n return devDeps?.['typescript'] !== undefined;\n } catch {\n return false;\n }\n}\n\n/** Mapping of config files to project types. */\nconst CONFIG_FILE_TYPES: readonly [string, ProjectType][] = [\n ['tsconfig.json', 'typescript'],\n ['Cargo.toml', 'rust'],\n ['go.mod', 'go'],\n ['pyproject.toml', 'python'],\n ['setup.py', 'python'],\n ['pom.xml', 'java'],\n ['build.gradle', 'java'],\n];\n\n/**\n * Detects project type based on configuration files.\n */\nexport function detectProjectType(root: string): ProjectType {\n // Check config files\n for (const [file, type] of CONFIG_FILE_TYPES) {\n if (existsSync(join(root, file))) return type;\n }\n\n // Check package.json\n if (existsSync(join(root, 'package.json'))) {\n return hasTypeScriptInPackageJson(root) ? 'typescript' : 'javascript';\n }\n\n return 'unknown';\n}\n\n/**\n * Detects project information.\n */\nexport function detectProjectInfo(root: string): ProjectInfo {\n let packageName: string | undefined;\n\n if (existsSync(join(root, 'package.json'))) {\n try {\n const content = readFileSync(join(root, 'package.json'), 'utf-8');\n const pkg = JSON.parse(content) as Record<string, unknown>;\n const nameValue = pkg['name'];\n packageName = typeof nameValue === 'string' ? nameValue : undefined;\n } catch (parseErr: unknown) {\n // Non-critical: package.json parse failure, fall through to basename\n void parseErr;\n }\n }\n\n return {\n root,\n hasPackageJson: existsSync(join(root, 'package.json')),\n hasClaudeMd: existsSync(join(root, 'CLAUDE.md')),\n hasClaudeRules: existsSync(join(root, '.claude', 'rules')),\n hasNexusConfig: existsSync(join(root, 'nexus-agents.yaml')),\n projectType: detectProjectType(root),\n packageName: packageName ?? basename(root),\n };\n}\n\n/**\n * Detects complete environment information.\n */\nexport function detectEnvironment(projectRoot: string): EnvironmentInfo {\n const claudeCli = detectClaudeCli();\n const existingMcpConfig = detectMcpConfig(claudeCli.mcpJsonPath);\n const projectInfo = detectProjectInfo(projectRoot);\n\n return {\n platform: process.platform,\n homeDir: homedir(),\n claudeCli,\n existingMcpConfig,\n projectInfo,\n };\n}\n","/**\n * nexus-agents setup MCP configuration\n *\n * MCP configuration helpers using Claude CLI's `claude mcp` commands.\n *\n * @module cli/setup-mcp\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { execSync, execFileSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { McpJsonConfig, McpServerEntry } from './setup-types.js';\nimport { getErrorMessage } from '../core/index.js';\n\n/** MCP entry for nexus-agents */\nexport const NEXUS_AGENTS_MCP_ENTRY: McpServerEntry = {\n command: 'nexus-agents',\n args: ['--mode=server'],\n};\n\n/** MCP entry with npx for users who install globally */\nexport const NEXUS_AGENTS_MCP_NPX_ENTRY: McpServerEntry = {\n command: 'npx',\n args: ['-y', 'nexus-agents@latest', '--mode=server'],\n};\n\n/**\n * Result of MCP configuration attempt.\n */\nexport interface McpConfigResult {\n success: boolean;\n alreadyConfigured: boolean;\n message: string;\n}\n\n/**\n * Checks if nexus-agents MCP server is already configured in Claude CLI.\n */\nexport function isMcpServerConfigured(): boolean {\n try {\n const result = execSync('claude mcp get nexus-agents', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return result.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Maps scope option to Claude CLI `-s` flag value.\n */\nfunction scopeToFlag(scope: 'user' | 'project'): string {\n return scope === 'project' ? 'local' : 'user';\n}\n\n/**\n * Removes existing MCP server configuration if present.\n */\nfunction removeExistingMcpServer(scope: 'user' | 'project' = 'user'): void {\n try {\n execSync(`claude mcp remove nexus-agents -s ${scopeToFlag(scope)}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n } catch {\n // Ignore removal errors\n }\n}\n\n/**\n * Adds MCP server to Claude CLI.\n */\nfunction addMcpServer(useNpx: boolean, scope: 'user' | 'project' = 'user'): McpConfigResult {\n const entry = useNpx ? NEXUS_AGENTS_MCP_NPX_ENTRY : NEXUS_AGENTS_MCP_ENTRY;\n const jsonConfig = JSON.stringify(entry);\n const scopeLabel = scope === 'project' ? 'project' : 'global';\n\n try {\n execFileSync(\n 'claude',\n ['mcp', 'add-json', 'nexus-agents', jsonConfig, '-s', scopeToFlag(scope)],\n {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }\n );\n return {\n success: true,\n alreadyConfigured: false,\n message: `Added nexus-agents MCP server to Claude Code (${scopeLabel})`,\n };\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to add MCP server: ${errorMsg}`,\n };\n }\n}\n\n/**\n * Configures nexus-agents MCP server using Claude CLI.\n *\n * Uses `claude mcp add-json` to register the server.\n * @param scope - 'user' for global (~/.claude/mcp.json), 'project' for local (.mcp.json)\n */\nexport function configureMcpServer(\n useNpx: boolean = false,\n force: boolean = false,\n scope: 'user' | 'project' = 'user'\n): McpConfigResult {\n const isConfigured = isMcpServerConfigured();\n\n // Check if already configured\n if (!force && isConfigured) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents MCP server already configured (use --force to reconfigure)',\n };\n }\n\n // Remove existing if forcing\n if (force && isConfigured) {\n removeExistingMcpServer(scope);\n }\n\n return addMcpServer(useNpx, scope);\n}\n\n/**\n * Generates MCP configuration snippet for manual setup (fallback).\n */\nexport function generateMcpSnippet(useNpx: boolean = false): string {\n const entry = useNpx ? NEXUS_AGENTS_MCP_NPX_ENTRY : NEXUS_AGENTS_MCP_ENTRY;\n const config: McpJsonConfig = {\n mcpServers: {\n 'nexus-agents': entry,\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generates the full MCP config path based on scope.\n *\n * Claude Code uses:\n * - Project scope: `.mcp.json` in project root\n * - User scope: `~/.claude.json` (stores MCP config under `projects` key)\n */\nexport function getMcpJsonPath(scope: 'user' | 'project', projectRoot: string): string {\n if (scope === 'project') {\n return join(projectRoot, '.mcp.json');\n }\n return join(homedir(), '.claude.json');\n}\n\n// ============================================================================\n// Hook Configuration (Issue #411, #416)\n// ============================================================================\n\n/**\n * Generates hook configuration for Claude CLI settings.json.\n * (Source: Issue #411 - Claude CLI Hook Integration)\n */\nexport function generateHookConfig(): HookSettingsConfig {\n return {\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks session-start',\n },\n ],\n },\n ],\n PreToolUse: [\n {\n matcher: 'Bash',\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks pre-tool --tool Bash --validate',\n },\n ],\n },\n ],\n PostToolUse: [\n {\n matcher: '*',\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks post-tool --track-metrics',\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks stop --check-tasks',\n },\n ],\n },\n ],\n },\n };\n}\n\n/**\n * Hook command entry structure.\n */\ninterface HookCommandEntry {\n type: 'command';\n command: string;\n}\n\n/**\n * Hook matcher entry structure.\n */\ninterface HookMatcherEntry {\n matcher?: string;\n hooks: HookCommandEntry[];\n}\n\n/**\n * Hook settings configuration structure.\n */\nexport interface HookSettingsConfig {\n hooks: {\n SessionStart?: HookMatcherEntry[];\n SessionEnd?: HookMatcherEntry[];\n PreToolUse?: HookMatcherEntry[];\n PostToolUse?: HookMatcherEntry[];\n Stop?: HookMatcherEntry[];\n };\n}\n\n/**\n * Result of hook configuration attempt.\n */\nexport interface HookConfigResult {\n success: boolean;\n alreadyConfigured: boolean;\n message: string;\n}\n\n/**\n * Checks if hooks are already configured in Claude CLI settings.\n */\nexport function areHooksConfigured(): boolean {\n try {\n const result = execSync('claude config get hooks', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n // If we get output that includes nexus-agents, hooks are configured\n return result.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Reads existing hooks from Claude CLI settings.\n * Returns parsed hooks object or undefined if no hooks exist or parse fails.\n */\nexport function getExistingHooks(): HookSettingsConfig['hooks'] | undefined {\n try {\n const result = execSync('claude config get hooks', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const trimmed = result.trim();\n if (!trimmed || trimmed === 'null' || trimmed === 'undefined') {\n return undefined;\n }\n return JSON.parse(trimmed) as HookSettingsConfig['hooks'];\n } catch {\n return undefined;\n }\n}\n\n/**\n * Merges two hook arrays, combining entries without duplicating nexus-agents hooks.\n */\nfunction mergeHookArrays(\n existing: HookMatcherEntry[] | undefined,\n newHooks: HookMatcherEntry[]\n): HookMatcherEntry[] {\n if (!existing || existing.length === 0) {\n return newHooks;\n }\n\n // Filter out any existing nexus-agents hooks to avoid duplicates\n const filteredExisting = existing.filter((entry) => {\n return !entry.hooks.some((h) => h.command.startsWith('nexus-agents'));\n });\n\n // Combine existing (non-nexus) hooks with new nexus-agents hooks\n return [...filteredExisting, ...newHooks];\n}\n\n/**\n * Merges nexus-agents hooks with existing hooks configuration.\n * Preserves existing user hooks while adding/updating nexus-agents hooks.\n */\nexport function mergeHookConfigs(\n existing: HookSettingsConfig['hooks'] | undefined,\n newConfig: HookSettingsConfig['hooks']\n): HookSettingsConfig['hooks'] {\n if (!existing) {\n return newConfig;\n }\n\n const hookTypes = ['SessionStart', 'SessionEnd', 'PreToolUse', 'PostToolUse', 'Stop'] as const;\n\n const merged: HookSettingsConfig['hooks'] = {};\n\n for (const hookType of hookTypes) {\n const existingHooks = existing[hookType];\n const newHooks = newConfig[hookType];\n\n if (newHooks) {\n merged[hookType] = mergeHookArrays(existingHooks, newHooks);\n } else if (existingHooks) {\n merged[hookType] = existingHooks;\n }\n }\n\n return merged;\n}\n\n/**\n * Configures hooks in Claude CLI settings.\n * Uses `claude config set hooks` to register hook commands.\n * Merges with existing hooks instead of overwriting them (Issue #420).\n */\nexport function configureHooks(force: boolean = false): HookConfigResult {\n const isConfigured = areHooksConfigured();\n\n if (!force && isConfigured) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'Hooks already configured (use --force to reconfigure)',\n };\n }\n\n const nexusHookConfig = generateHookConfig();\n\n try {\n // Read existing hooks first to merge (Issue #420)\n const existingHooks = getExistingHooks();\n const mergedHooks = mergeHookConfigs(existingHooks, nexusHookConfig.hooks);\n\n // Use claude config set with merged hooks\n const configJson = JSON.stringify(mergedHooks);\n execFileSync('claude', ['config', 'set', 'hooks', configJson], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return {\n success: true,\n alreadyConfigured: false,\n message: existingHooks\n ? 'Merged nexus-agents hooks with existing hooks in Claude Code settings'\n : 'Configured nexus-agents hooks in Claude Code settings',\n };\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure hooks: ${errorMsg}`,\n };\n }\n}\n\n/**\n * Generates hook configuration snippet for manual setup.\n */\nexport function generateHookSnippet(): string {\n const config = generateHookConfig();\n return JSON.stringify(config, null, 2);\n}\n","/**\n * nexus-agents setup rules generation\n *\n * Rules file and backup management helpers.\n *\n * @module cli/setup-rules\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { VERSION } from '../version.js';\nimport { getTimeProvider } from '../core/index.js';\nimport type { BackupInfo } from './setup-types.js';\n\n/**\n * Generates the nexus-agents rules file content.\n */\nexport function generateRulesContent(): string {\n return `# Nexus-Agents Integration\n\nThis project uses [nexus-agents](https://github.com/williamzujkowski/nexus-agents) v${VERSION} for multi-agent orchestration.\n\n## MCP Tools Available\n\nWhen running with MCP server mode, these tools are available:\n\n| Tool | Description |\n| ---- | ----------- |\n| \\`orchestrate\\` | Task orchestration with Orchestrator coordination |\n| \\`create_expert\\` | Dynamic expert agent creation |\n| \\`run_workflow\\` | Execute workflow templates |\n| \\`delegate_to_model\\` | Route task to optimal model |\n| \\`list_experts\\` | List available expert types (discoverability) |\n| \\`list_workflows\\` | List available workflow templates |\n\n## Quick Commands\n\n\\`\\`\\`bash\n# Orchestrate a task with specialized experts\nnexus-agents orchestrate \"Implement feature X with tests\"\n\n# List available experts\nnexus-agents expert list\n\n# Run a workflow\nnexus-agents workflow list\nnexus-agents workflow run code-review --input='{\"url\": \"...\"}'\n\n# Check system health\nnexus-agents doctor\n\n# Generate config\nnexus-agents config init\n\\`\\`\\`\n\n## Usage Examples\n\n**Orchestrate a code review:**\n\\`\\`\\`\nUse nexus-agents to review this PR: https://github.com/owner/repo/pull/123\n\\`\\`\\`\n\n**Create a specialized expert:**\n\\`\\`\\`\nCreate a security expert to audit this codebase for vulnerabilities\n\\`\\`\\`\n\n**Run a workflow:**\n\\`\\`\\`\nRun the code-review workflow with the current changes\n\\`\\`\\`\n\n## Configuration\n\n- Config file: \\`./nexus-agents.yaml\\`\n- Generate config: \\`nexus-agents config init\\`\n- Check health: \\`nexus-agents doctor\\`\n\n---\n*Generated by nexus-agents setup v${VERSION}*\n`;\n}\n\n/**\n * Gets the rules file path.\n */\nexport function getRulesFilePath(projectRoot: string): string {\n return join(projectRoot, '.claude', 'rules', 'nexus-agents.md');\n}\n\n/**\n * Creates the rules file.\n */\nexport function createRulesFile(projectRoot: string, dryRun: boolean): string {\n const rulesPath = getRulesFilePath(projectRoot);\n const content = generateRulesContent();\n\n if (!dryRun) {\n const rulesDir = dirname(rulesPath);\n mkdirSync(rulesDir, { recursive: true });\n writeFileSync(rulesPath, content, 'utf-8');\n }\n\n return rulesPath;\n}\n\n/**\n * Creates a backup of a file.\n */\nexport function backupFile(filePath: string): BackupInfo {\n const content = readFileSync(filePath, 'utf-8');\n const backupPath = `${filePath}.backup.${String(getTimeProvider().now())}`;\n writeFileSync(backupPath, content, 'utf-8');\n\n return {\n type: 'file',\n originalPath: filePath,\n backupPath,\n content,\n };\n}\n\n/**\n * Restores a file from backup.\n */\nexport function restoreBackup(backup: BackupInfo): void {\n writeFileSync(backup.originalPath, backup.content, 'utf-8');\n}\n","/**\n * nexus-agents setup output formatting\n *\n * Output formatting helpers for setup command.\n * Re-exports from consolidated ansi-output.ts for backward compatibility.\n *\n * @module cli/setup-formatting\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\n// Re-export consolidated formatters from ansi-output.ts\nexport { formatStatus, formatHeader, formatCodeBlock, colors, symbols } from './ansi-output.js';\n\n/**\n * Checks if running in interactive mode.\n */\nexport function isInteractive(): boolean {\n if (!process.stdout.isTTY) return false;\n if (process.env['CI'] === 'true') return false;\n if (process.env['CONTINUOUS_INTEGRATION'] !== undefined) return false;\n return true;\n}\n","/**\n * OpenCode MCP auto-configuration for setup command.\n *\n * Detects OpenCode CLI and generates opencode.json/.jsonc with nexus-agents MCP server.\n * Supports JSONC (JSON with Comments) via `jsonc-parser` for comment-preserving writes.\n *\n * @module cli/setup-opencode\n * (Source: Issue #1253 - OpenCode MCP auto-configuration, #1255 - JSONC support)\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { join, resolve } from 'node:path';\nimport { homedir, platform } from 'node:os';\nimport { parse as jsoncParse, modify, applyEdits } from 'jsonc-parser';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\n\nconst logger = createLogger({ component: 'setup-opencode' });\n\n/** OpenCode detection result. */\nexport interface OpenCodeCliInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n}\n\n/** OpenCode MCP configuration result. */\nexport interface OpenCodeConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n readonly configPath: string;\n}\n\n/** Resolved config file info. */\nexport interface ResolvedConfig {\n readonly path: string;\n readonly isJsonc: boolean;\n readonly exists: boolean;\n}\n\n/**\n * Detects OpenCode CLI installation.\n */\nexport function detectOpenCodeCli(): OpenCodeCliInfo {\n try {\n const cmd = platform() === 'win32' ? 'where' : 'which';\n execFileSync(cmd, ['opencode'], { timeout: 3000, stdio: 'pipe' });\n } catch {\n return { installed: false, version: undefined };\n }\n\n try {\n const output = execFileSync('opencode', ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n const match = /(\\d+\\.\\d+\\.\\d+)/.exec(output);\n return { installed: true, version: match?.[1] };\n } catch {\n return { installed: true, version: undefined };\n }\n}\n\n/**\n * Resolves the OpenCode config directory path.\n * OpenCode uses ~/.config/opencode/ on Linux/macOS.\n */\nfunction getOpenCodeConfigDir(): string {\n return join(homedir(), '.config', 'opencode');\n}\n\n/**\n * Resolves the path for nexus-agents CLI command.\n * Uses `npx nexus-agents` for portability.\n */\nfunction getNexusCommand(): readonly string[] {\n return ['npx', 'nexus-agents', '--mode=server'];\n}\n\nconst NEXUS_MCP_ENTRY = {\n type: 'local',\n command: getNexusCommand(),\n enabled: true,\n};\n\n/**\n * Resolves the OpenCode config file in a directory.\n * Prefers .jsonc over .json (matching OpenCode's own priority).\n */\nexport function resolveOpenCodeConfig(dir: string): ResolvedConfig {\n const jsoncPath = join(dir, 'opencode.jsonc');\n if (existsSync(jsoncPath)) {\n return { path: jsoncPath, isJsonc: true, exists: true };\n }\n const jsonPath = join(dir, 'opencode.json');\n if (existsSync(jsonPath)) {\n return { path: jsonPath, isJsonc: false, exists: true };\n }\n return { path: jsonPath, isJsonc: false, exists: false };\n}\n\n/** Checks if nexus-agents is already configured in an existing config. */\nfunction isAlreadyConfigured(resolved: ResolvedConfig): boolean {\n if (!resolved.exists) return false;\n try {\n const raw = readFileSync(resolved.path, 'utf-8');\n const config = jsoncParse(raw) as Record<string, unknown> | null;\n const mcp = config?.['mcp'] as Record<string, unknown> | undefined;\n return mcp?.['nexus-agents'] !== undefined;\n } catch {\n logger.debug('Failed to parse existing OpenCode config, will overwrite');\n return false;\n }\n}\n\n/** Writes nexus-agents MCP entry using comment-preserving edits for JSONC. */\nfunction writeJsoncConfig(configPath: string, raw: string): void {\n let result = raw;\n result = applyEdits(result, modify(result, ['mcp', 'nexus-agents'], NEXUS_MCP_ENTRY, {}));\n result = applyEdits(result, modify(result, ['$schema'], 'https://opencode.ai/config.json', {}));\n writeFileSync(configPath, result, 'utf-8');\n}\n\n/** Writes nexus-agents MCP entry as plain JSON for new configs. */\nfunction writeJsonConfig(configPath: string): void {\n const config = {\n $schema: 'https://opencode.ai/config.json',\n mcp: { 'nexus-agents': NEXUS_MCP_ENTRY },\n };\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/** Writes the merged config with nexus-agents MCP entry. */\nfunction writeOpenCodeConfig(configDir: string, resolved: ResolvedConfig): void {\n if (!existsSync(configDir)) mkdirSync(configDir, { recursive: true });\n\n if (resolved.exists) {\n const raw = readFileSync(resolved.path, 'utf-8');\n writeJsoncConfig(resolved.path, raw);\n } else {\n writeJsonConfig(resolved.path);\n }\n}\n\n/** Options for configureOpenCode. */\nexport interface ConfigureOpenCodeOptions {\n readonly force: boolean;\n readonly dryRun: boolean;\n readonly projectRoot?: string;\n}\n\n/** Validates projectRoot to prevent path traversal (CWE-22). */\nfunction validateProjectRoot(projectRoot: string): string {\n const resolved = resolve(projectRoot);\n if (!existsSync(resolved)) {\n throw new Error(`Project root does not exist: ${resolved}`);\n }\n return resolved;\n}\n\n/**\n * Configures OpenCode with nexus-agents MCP server.\n * Supports both global (~/.config/opencode/) and project-local configs.\n */\nexport function configureOpenCode(\n force: boolean,\n dryRun: boolean,\n options?: ConfigureOpenCodeOptions\n): OpenCodeConfigResult {\n try {\n return configureOpenCodeInner(force, dryRun, options);\n } catch (error: unknown) {\n const fallbackPath = join(getOpenCodeConfigDir(), 'opencode.json');\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure OpenCode: ${getErrorMessage(error)}`,\n configPath: fallbackPath,\n };\n }\n}\n\nfunction configureOpenCodeInner(\n force: boolean,\n dryRun: boolean,\n options?: ConfigureOpenCodeOptions\n): OpenCodeConfigResult {\n const configDir =\n options?.projectRoot !== undefined\n ? validateProjectRoot(options.projectRoot)\n : getOpenCodeConfigDir();\n const resolved = resolveOpenCodeConfig(configDir);\n\n if (isAlreadyConfigured(resolved) && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in OpenCode',\n configPath: resolved.path,\n };\n }\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: `Would configure nexus-agents MCP in ${resolved.path}`,\n configPath: resolved.path,\n };\n }\n writeOpenCodeConfig(configDir, resolved);\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in OpenCode',\n configPath: resolved.path,\n };\n}\n","/**\n * Gemini CLI MCP auto-configuration for setup command.\n *\n * Detects Gemini CLI and configures ~/.gemini/settings.json with nexus-agents MCP server.\n *\n * @module cli/setup-gemini\n * (Source: Issue #1259 - Gemini CLI MCP auto-configuration)\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport { homedir, platform } from 'node:os';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\n\nconst logger = createLogger({ component: 'setup-gemini' });\n\n/** Gemini CLI detection result. */\nexport interface GeminiCliInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n}\n\n/** Gemini MCP configuration result. */\nexport interface GeminiConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n readonly configPath: string;\n}\n\n/** Gemini MCP server entry format. */\ninterface GeminiMcpEntry {\n readonly command: string;\n readonly args: readonly string[];\n readonly timeout: number;\n}\n\n/**\n * Detects Gemini CLI installation.\n */\nexport function detectGeminiCli(): GeminiCliInfo {\n try {\n const cmd = platform() === 'win32' ? 'where' : 'which';\n execFileSync(cmd, ['gemini'], { timeout: 3000, stdio: 'pipe' });\n } catch {\n return { installed: false, version: undefined };\n }\n\n try {\n const output = execFileSync('gemini', ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n const match = /(\\d+\\.\\d+\\.\\d+)/.exec(output);\n return { installed: true, version: match?.[1] };\n } catch {\n return { installed: true, version: undefined };\n }\n}\n\n/** Resolves the Gemini config directory path based on scope. */\nfunction getGeminiConfigDir(scope: 'user' | 'project', projectRoot?: string): string {\n if (scope === 'project' && projectRoot !== undefined) {\n return join(projectRoot, '.gemini');\n }\n return join(homedir(), '.gemini');\n}\n\n/** Returns the nexus-agents MCP entry for Gemini settings.json. */\nfunction getNexusMcpEntry(): GeminiMcpEntry {\n return {\n command: 'npx',\n args: ['nexus-agents', '--mode=server'],\n timeout: 30000,\n };\n}\n\n/** Checks if nexus-agents is already configured in settings.json. */\nfunction isAlreadyConfigured(configPath: string): boolean {\n if (!existsSync(configPath)) return false;\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n const servers = config['mcpServers'] as Record<string, unknown> | undefined;\n return servers?.['nexus-agents'] !== undefined;\n } catch {\n logger.debug('Failed to parse existing Gemini settings.json, will overwrite');\n return false;\n }\n}\n\n/** Reads existing config or returns empty object. */\nfunction readExistingConfig(configPath: string): Record<string, unknown> {\n if (!existsSync(configPath)) return {};\n try {\n return JSON.parse(readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\n/** Writes the merged config with nexus-agents MCP entry. */\nfunction writeGeminiConfig(configDir: string, configPath: string): void {\n if (!existsSync(configDir)) mkdirSync(configDir, { recursive: true });\n const config = readExistingConfig(configPath);\n const servers = (config['mcpServers'] ?? {}) as Record<string, unknown>;\n servers['nexus-agents'] = getNexusMcpEntry();\n config['mcpServers'] = servers;\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Configures Gemini CLI with nexus-agents MCP server.\n *\n * @param force - Force reconfiguration even if already configured\n * @param dryRun - Preview changes without writing\n * @param scope - 'user' for global (~/.gemini/), 'project' for project-local (.gemini/)\n * @param projectRoot - Project root directory (required for project scope)\n */\nexport function configureGemini(\n force: boolean,\n dryRun: boolean,\n scope: 'user' | 'project' = 'user',\n projectRoot?: string\n): GeminiConfigResult {\n const configDir = getGeminiConfigDir(scope, projectRoot);\n const configPath = join(configDir, 'settings.json');\n\n if (isAlreadyConfigured(configPath) && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in Gemini CLI',\n configPath,\n };\n }\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: `Would configure nexus-agents MCP in ${configPath}`,\n configPath,\n };\n }\n try {\n writeGeminiConfig(configDir, configPath);\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in Gemini CLI',\n configPath,\n };\n } catch (error: unknown) {\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure Gemini: ${getErrorMessage(error)}`,\n configPath,\n };\n }\n}\n","/**\n * Codex CLI MCP auto-configuration for setup command.\n *\n * Detects Codex CLI and registers nexus-agents MCP server\n * using `codex mcp add` CLI command.\n *\n * @module cli/setup-codex\n * (Source: Issue #1263 - Codex CLI MCP auto-configuration)\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { platform } from 'node:os';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\n\nconst logger = createLogger({ component: 'setup-codex' });\n\n/** Codex CLI detection result. */\nexport interface CodexCliInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n}\n\n/** Codex MCP configuration result. */\nexport interface CodexConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n}\n\n/**\n * Detects Codex CLI installation.\n */\nexport function detectCodexCli(): CodexCliInfo {\n try {\n const cmd = platform() === 'win32' ? 'where' : 'which';\n execFileSync(cmd, ['codex'], { timeout: 3000, stdio: 'pipe' });\n } catch {\n return { installed: false, version: undefined };\n }\n\n try {\n const output = execFileSync('codex', ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n const match = /(\\d+\\.\\d+\\.\\d+)/.exec(output);\n return { installed: true, version: match?.[1] };\n } catch {\n return { installed: true, version: undefined };\n }\n}\n\n/**\n * Checks if nexus-agents is already configured in Codex MCP.\n */\nfunction isAlreadyConfigured(): boolean {\n try {\n const output = execFileSync('codex', ['mcp', 'list'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n return output.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Removes existing nexus-agents MCP configuration from Codex.\n */\nfunction removeExisting(): void {\n try {\n execFileSync('codex', ['mcp', 'remove', 'nexus-agents'], {\n timeout: 5000,\n stdio: 'pipe',\n });\n } catch {\n logger.debug('Failed to remove existing Codex MCP config (may not exist)');\n }\n}\n\n/**\n * Adds nexus-agents MCP server to Codex CLI.\n *\n * Uses: codex mcp add nexus-agents -- npx nexus-agents --mode=server\n */\nfunction addMcpServer(): CodexConfigResult {\n try {\n execFileSync(\n 'codex',\n ['mcp', 'add', 'nexus-agents', '--', 'npx', 'nexus-agents', '--mode=server'],\n {\n timeout: 10000,\n stdio: 'pipe',\n }\n );\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in Codex CLI',\n };\n } catch (error: unknown) {\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure Codex: ${getErrorMessage(error)}`,\n };\n }\n}\n\n/**\n * Configures Codex CLI with nexus-agents MCP server.\n */\nexport function configureCodex(force: boolean, dryRun: boolean): CodexConfigResult {\n if (isAlreadyConfigured() && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in Codex CLI',\n };\n }\n\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Would configure nexus-agents MCP in Codex CLI',\n };\n }\n\n if (force && isAlreadyConfigured()) {\n removeExisting();\n }\n\n return addMcpServer();\n}\n","/**\n * nexus-agents setup interactive wizard\n *\n * Guided setup experience for configuring nexus-agents with Claude CLI.\n * Uses Node.js readline for terminal prompts without external dependencies.\n *\n * @module cli/setup-wizard\n * (Source: Issue #425 - Interactive setup wizard)\n */\n\nimport { createInterface, type Interface } from 'node:readline';\nimport { formatHeader, formatStatus, isInteractive } from './setup-formatting.js';\nimport type { SetupOptions } from './setup-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Usage mode selection. */\nexport type UsageMode = 'claude-desktop' | 'claude-cli' | 'standalone' | 'all';\n\n/** Wizard answers collected from user. */\nexport interface WizardAnswers {\n usageMode: UsageMode;\n hasApiKeys: boolean;\n configDirectory: string;\n confirmProceed: boolean;\n}\n\n/** Wizard state during execution. */\ninterface WizardState {\n currentStep: number;\n totalSteps: number;\n answers: Partial<WizardAnswers>;\n}\n\n// ============================================================================\n// Readline Helpers\n// ============================================================================\n\n/**\n * Creates a readline interface for prompting.\n */\nfunction createReadline(): Interface {\n return createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\n/**\n * Prompts for input and returns the answer.\n */\nasync function promptInput(rl: Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Prompts for a yes/no confirmation.\n */\nasync function promptConfirm(\n rl: Interface,\n question: string,\n defaultValue = true\n): Promise<boolean> {\n const defaultHint = defaultValue ? '[Y/n]' : '[y/N]';\n const answer = await promptInput(rl, `${question} ${defaultHint}: `);\n\n if (answer === '') return defaultValue;\n return answer.toLowerCase().startsWith('y');\n}\n\n/**\n * Prints options for selection prompt.\n */\nfunction printOptions(\n options: readonly { value: string; label: string }[],\n defaultIndex: number\n): void {\n for (let i = 0; i < options.length; i++) {\n const option = options[i];\n const marker = i === defaultIndex ? '>' : ' ';\n const label = option?.label ?? '';\n writeLine(` ${marker} ${String(i + 1)}. ${label}`);\n }\n}\n\n/**\n * Gets value from options at index with fallback.\n */\nfunction getOptionValue(\n options: readonly { value: string; label: string }[],\n index: number,\n fallbackIndex: number\n): string {\n const option = options[index];\n if (option !== undefined) {\n return option.value;\n }\n const fallback = options[fallbackIndex];\n return fallback?.value ?? '';\n}\n\n/**\n * Prompts for a selection from a list of options.\n */\nasync function promptSelect(\n rl: Interface,\n question: string,\n options: readonly { value: string; label: string }[],\n defaultIndex = 0\n): Promise<string> {\n writeLine('\\n' + question);\n printOptions(options, defaultIndex);\n\n const answer = await promptInput(rl, `\\nChoice [1-${String(options.length)}]: `);\n\n if (answer === '') {\n return getOptionValue(options, defaultIndex, 0);\n }\n\n const index = parseInt(answer, 10) - 1;\n if (index >= 0 && index < options.length) {\n return getOptionValue(options, index, 0);\n }\n\n return getOptionValue(options, defaultIndex, 0);\n}\n\n// ============================================================================\n// Output Helpers\n// ============================================================================\n\n/** Writes a line to stdout. */\nfunction writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n}\n\n/** Writes an empty line. */\nfunction writeEmptyLine(): void {\n process.stdout.write('\\n');\n}\n\n/** Prints the wizard header. */\nfunction printWizardHeader(): void {\n writeEmptyLine();\n writeLine(formatHeader('Nexus Agents Setup Wizard'));\n writeLine('='.repeat(40));\n writeLine('This wizard will help you configure nexus-agents.');\n writeEmptyLine();\n}\n\n/** Prints step progress. */\nfunction printStepProgress(state: WizardState, stepName: string): void {\n writeLine(\n `\\n${formatHeader(`Step ${String(state.currentStep)}/${String(state.totalSteps)}: ${stepName}`)}`\n );\n writeLine('-'.repeat(40));\n}\n\n/** Prints completion message. */\nfunction printCompletion(): void {\n writeEmptyLine();\n writeLine(formatStatus('success') + ' Wizard completed! Running setup...');\n writeEmptyLine();\n}\n\n// ============================================================================\n// Wizard Steps\n// ============================================================================\n\n/** Usage mode options. */\nconst USAGE_MODE_OPTIONS: readonly { value: UsageMode; label: string }[] = [\n { value: 'claude-cli', label: 'Claude CLI (terminal-based development)' },\n { value: 'claude-desktop', label: 'Claude Desktop (GUI application)' },\n { value: 'standalone', label: 'Standalone CLI (without Claude integration)' },\n { value: 'all', label: 'All of the above' },\n];\n\n/**\n * Step 1: Ask how the user plans to use nexus-agents.\n */\nasync function askUsageMode(rl: Interface, state: WizardState): Promise<UsageMode> {\n printStepProgress(state, 'Usage Mode');\n writeLine('How will you use nexus-agents?');\n\n const answer = await promptSelect(rl, '', USAGE_MODE_OPTIONS, 0);\n\n return answer as UsageMode;\n}\n\n/**\n * Step 2: Ask about API key configuration.\n */\nasync function askApiKeys(rl: Interface, state: WizardState): Promise<boolean> {\n printStepProgress(state, 'API Keys');\n writeLine('nexus-agents works best with API keys configured.');\n writeLine('Supported providers: Anthropic (Claude), OpenAI, Google (Gemini)');\n writeEmptyLine();\n\n const hasKeys = await promptConfirm(rl, 'Do you have at least one API key configured?', false);\n\n if (!hasKeys) {\n writeEmptyLine();\n writeLine('No worries! You can configure API keys later:');\n writeLine(' - ANTHROPIC_API_KEY for Claude');\n writeLine(' - OPENAI_API_KEY for OpenAI/Codex');\n writeLine(' - GOOGLE_AI_API_KEY for Gemini');\n writeLine('\\nRun `nexus-agents doctor` to check your configuration.');\n }\n\n return hasKeys;\n}\n\n/**\n * Step 3: Ask about configuration directory.\n */\nasync function askConfigDirectory(rl: Interface, state: WizardState): Promise<string> {\n printStepProgress(state, 'Configuration');\n writeLine('Where should nexus-agents store its configuration?');\n writeEmptyLine();\n\n const defaultDir = process.cwd();\n const answer = await promptInput(rl, `Directory [${defaultDir}]: `);\n\n return answer || defaultDir;\n}\n\n/**\n * Step 4: Confirm and proceed.\n */\nasync function askConfirmation(\n rl: Interface,\n state: WizardState,\n answers: Partial<WizardAnswers>\n): Promise<boolean> {\n printStepProgress(state, 'Confirmation');\n writeLine('Setup will configure the following:');\n writeEmptyLine();\n\n const modeLabel =\n USAGE_MODE_OPTIONS.find((o) => o.value === answers.usageMode)?.label ?? 'Unknown';\n const apiKeyStatus = answers.hasApiKeys === true ? 'Configured' : 'Not yet configured';\n const configDir = answers.configDirectory ?? process.cwd();\n writeLine(` Usage mode: ${modeLabel}`);\n writeLine(` API keys: ${apiKeyStatus}`);\n writeLine(` Config directory: ${configDir}`);\n writeEmptyLine();\n\n const skipMcp = answers.usageMode === 'standalone';\n if (!skipMcp) {\n writeLine('Will configure:');\n writeLine(' - MCP server for Claude integration');\n writeLine(' - Rules file (.claude/rules/nexus-agents.md)');\n writeLine(' - Hooks for session tracking');\n } else {\n writeLine('Will configure:');\n writeLine(' - Rules file (.claude/rules/nexus-agents.md)');\n writeLine(' - (Skipping MCP/hooks - not needed for standalone mode)');\n }\n\n writeEmptyLine();\n return promptConfirm(rl, 'Proceed with setup?', true);\n}\n\n// ============================================================================\n// Wizard Runner\n// ============================================================================\n\n/**\n * Runs the interactive setup wizard.\n *\n * @returns Setup options based on wizard answers, or undefined if cancelled\n */\nexport async function runWizard(): Promise<Partial<SetupOptions> | undefined> {\n // Check if interactive mode is available\n if (!isInteractive()) {\n writeLine('Interactive mode not available (TTY required).');\n writeLine('Use --non-interactive flag for automated setup.');\n return undefined;\n }\n\n const rl = createReadline();\n\n try {\n printWizardHeader();\n\n const state: WizardState = {\n currentStep: 1,\n totalSteps: 4,\n answers: {},\n };\n\n // Step 1: Usage mode\n state.answers.usageMode = await askUsageMode(rl, state);\n state.currentStep++;\n\n // Step 2: API keys\n state.answers.hasApiKeys = await askApiKeys(rl, state);\n state.currentStep++;\n\n // Step 3: Config directory\n state.answers.configDirectory = await askConfigDirectory(rl, state);\n state.currentStep++;\n\n // Step 4: Confirmation\n state.answers.confirmProceed = await askConfirmation(rl, state, state.answers);\n state.currentStep++;\n\n if (!state.answers.confirmProceed) {\n writeEmptyLine();\n writeLine('Setup cancelled.');\n return undefined;\n }\n\n printCompletion();\n\n // Convert wizard answers to setup options\n return convertAnswersToOptions(state.answers as WizardAnswers);\n } finally {\n rl.close();\n }\n}\n\n/**\n * Converts wizard answers to setup options.\n */\nfunction convertAnswersToOptions(answers: WizardAnswers): Partial<SetupOptions> {\n const isStandalone = answers.usageMode === 'standalone';\n\n return {\n // Skip MCP and hooks for standalone mode\n skipMcp: isStandalone,\n skipHooks: isStandalone,\n // Always create rules file\n skipRules: false,\n // Use user scope for Claude CLI/Desktop, project for standalone\n scope: isStandalone ? 'project' : 'user',\n // Non-interactive since we collected all info\n nonInteractive: true,\n // Show verbose output to explain what's happening\n verbose: true,\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { isInteractive };\n","/**\n * Claude Code permissions snippet generator (#1945).\n *\n * In \"don't ask\" permission mode, Claude Code hard-rejects MCP tool calls\n * that aren't in the allowlist. For nexus-agents to be usable for agentic\n * dogfooding (orchestrate, create_expert, consensus_vote), the tools must\n * be pre-approved in ~/.claude/settings.json.\n *\n * This module generates a recommended snippet for users to paste into\n * their settings.json. We do NOT auto-write permissions — that would be\n * a security footgun.\n *\n * @module cli/setup-permissions\n */\n\n/** MCP tool names that are safe to pre-approve (read-only or idempotent). */\nconst SAFE_READONLY_TOOLS = [\n 'list_experts',\n 'list_workflows',\n 'weather_report',\n 'memory_query',\n 'memory_stats',\n 'query_trace',\n 'research_query',\n 'research_analyze',\n 'research_discover',\n 'research_synthesize',\n 'repo_analyze',\n 'repo_security_plan',\n 'extract_symbols',\n 'search_codebase',\n] as const;\n\n/** MCP tools that execute tasks but are commonly used for dogfooding. */\nconst SAFE_EXECUTION_TOOLS = [\n 'orchestrate',\n 'create_expert',\n 'execute_expert',\n 'consensus_vote',\n 'delegate_to_model',\n 'run_workflow',\n 'issue_triage',\n 'registry_import',\n] as const;\n\nexport type PermissionLevel = 'readonly' | 'all';\n\n/**\n * Generate a JSON snippet of recommended permissions for Claude Code's\n * `~/.claude/settings.json` to pre-approve nexus-agents MCP tools.\n *\n * Users paste this into the `permissions.allow` array.\n */\nexport function generatePermissionsSnippet(level: PermissionLevel = 'all'): string {\n const tools =\n level === 'readonly'\n ? [...SAFE_READONLY_TOOLS]\n : [...SAFE_READONLY_TOOLS, ...SAFE_EXECUTION_TOOLS];\n\n const permissions = tools.map((t) => `mcp__nexus-agents__${t}`).sort();\n return JSON.stringify(permissions, null, 2);\n}\n\n/**\n * Return a human-readable banner explaining the permissions snippet,\n * for inclusion in `nexus-agents setup` output.\n */\nexport function buildPermissionsBanner(snippet: string): string {\n return [\n '',\n '--- Claude Code Permissions (optional) ---',\n '',\n \"To use nexus-agents MCP tools in 'don't ask' mode (autonomous/headless\",\n 'Claude Code sessions), add these entries to the `permissions.allow` array',\n 'in your `~/.claude/settings.json`:',\n '',\n snippet,\n '',\n 'Without these, each MCP tool call will prompt for approval in interactive',\n 'mode, or be rejected outright in `dangerously-skip-permissions` mode.',\n '',\n 'Reference: https://github.com/williamzujkowski/nexus-agents/issues/1945',\n '',\n ].join('\\n');\n}\n"],"mappings":"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","names":["existsSync","execSync","homedir","join","execSync","execSync","readFileSync","join","join","existsSync","readFileSync","writeFileSync","mkdirSync","execFileSync","join","homedir","execFileSync","join","homedir","existsSync","readFileSync","writeFileSync","mkdirSync","existsSync","readFileSync","writeFileSync","mkdirSync","execFileSync","join","homedir","platform","logger","platform","execFileSync","join","homedir","isAlreadyConfigured","existsSync","readFileSync","mkdirSync","writeFileSync","execFileSync","platform","logger","platform","execFileSync","isAlreadyConfigured","addMcpServer","resolve","writeLine","writeEmptyLine","mcpResult","existsSync"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createLogger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-DWZZZGZD.js";
|
|
4
4
|
|
|
5
5
|
// src/swe-bench/mcp-config.ts
|
|
6
6
|
import { writeFile, mkdtemp, rm } from "fs/promises";
|
|
@@ -58,4 +58,4 @@ export {
|
|
|
58
58
|
generateMcpConfig,
|
|
59
59
|
getDefaultAllowedTools
|
|
60
60
|
};
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
61
|
+
//# sourceMappingURL=chunk-KDY5C63A.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
err,
|
|
4
4
|
getErrorMessage,
|
|
5
5
|
ok
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DWZZZGZD.js";
|
|
7
7
|
|
|
8
8
|
// src/scm/types.ts
|
|
9
9
|
var ScmError = class extends Error {
|
|
@@ -243,4 +243,4 @@ export {
|
|
|
243
243
|
ScmError,
|
|
244
244
|
GitHubProvider
|
|
245
245
|
};
|
|
246
|
-
//# sourceMappingURL=chunk-
|
|
246
|
+
//# sourceMappingURL=chunk-MI2RHGLU.js.map
|