@jixo/cli 0.23.5 → 0.23.6
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/bundle/index.js +114 -124
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +83 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/daemon.d.ts +5 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +20 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/doctor/config.d.ts +3 -0
- package/dist/commands/doctor/config.d.ts.map +1 -0
- package/dist/commands/doctor/config.js +17 -0
- package/dist/commands/doctor/config.js.map +1 -0
- package/dist/commands/doctor/doctor.d.ts +3 -0
- package/dist/commands/doctor/doctor.d.ts.map +1 -0
- package/dist/commands/doctor/doctor.js +158 -0
- package/dist/commands/doctor/doctor.js.map +1 -0
- package/dist/commands/doctor/doctor.test.d.ts +2 -0
- package/dist/commands/doctor/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor/doctor.test.js +14 -0
- package/dist/commands/doctor/doctor.test.js.map +1 -0
- package/dist/commands/doctor/index.d.ts +2 -0
- package/dist/commands/doctor/index.d.ts.map +1 -0
- package/dist/commands/doctor/index.js +8 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/doctor/types.d.ts +45 -0
- package/dist/commands/doctor/types.d.ts.map +1 -0
- package/dist/commands/doctor/types.js +3 -0
- package/dist/commands/doctor/types.js.map +1 -0
- package/dist/commands/google-aistudio.d.ts.map +1 -1
- package/dist/commands/google-aistudio.js +12 -3
- package/dist/commands/google-aistudio.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +40 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/tasks/run.d.ts +10 -0
- package/dist/commands/tasks/run.d.ts.map +1 -0
- package/dist/commands/tasks/run.js +44 -0
- package/dist/commands/tasks/run.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/env.d.ts +6 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +16 -0
- package/dist/env.js.map +1 -0
- package/dist/prompts.json +14 -2
- package/package.json +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { blue, cyan, green, red, spinner, yellow } from "@gaubee/nodekit";
|
|
2
|
+
import { iter_map_not_null } from "@gaubee/util";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import semver from "semver";
|
|
5
|
+
import { safeEnv } from "../../env.js";
|
|
6
|
+
const CHECK_MARK = green("✔");
|
|
7
|
+
const CROSS_MARK = red("✖");
|
|
8
|
+
const WARN_MARK = yellow("⚠");
|
|
9
|
+
async function executeCommand(command) {
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
try {
|
|
12
|
+
const stdout = execSync(command, { encoding: "utf8", stdio: "pipe" });
|
|
13
|
+
resolve({ stdout, stderr: "" });
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
resolve({ stdout: "", stderr: e.stderr || "", error: e });
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async function checkServiceHealth(id, displayName, hint) {
|
|
21
|
+
const result = {
|
|
22
|
+
id,
|
|
23
|
+
displayName,
|
|
24
|
+
exists: false,
|
|
25
|
+
meetsVersionRequirement: false,
|
|
26
|
+
isOptional: false,
|
|
27
|
+
message: "",
|
|
28
|
+
installationHint: hint,
|
|
29
|
+
};
|
|
30
|
+
const url = `${safeEnv.JIXO_CORE_URL}/jixo/v1/health`;
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(3000) });
|
|
33
|
+
if (response.ok) {
|
|
34
|
+
result.exists = true;
|
|
35
|
+
result.meetsVersionRequirement = true;
|
|
36
|
+
result.message = `Service is running and healthy at ${url}`;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
result.message = `Service responded with status ${response.status} at ${url}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
result.message = `Could not connect to service at ${url}. Is it running?`;
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
export async function runDoctor(config, enableLog = true) {
|
|
48
|
+
const LOG_TITLE = "Running Environment Doctor 🏥\n\n";
|
|
49
|
+
const logger = spinner(LOG_TITLE);
|
|
50
|
+
if (enableLog) {
|
|
51
|
+
logger.start();
|
|
52
|
+
}
|
|
53
|
+
const results = [];
|
|
54
|
+
let overallSuccess = true;
|
|
55
|
+
let overallWarn = false;
|
|
56
|
+
const tool_logs = [];
|
|
57
|
+
for (const [index, tool] of config.entries()) {
|
|
58
|
+
const TOOL_LOG_TITLE = `${blue(`[${tool.id}]`)} ${cyan(tool.displayName)}`;
|
|
59
|
+
const SUCCESS_MARK = () => CHECK_MARK;
|
|
60
|
+
const FAIL_MARK = () => {
|
|
61
|
+
overallWarn = true;
|
|
62
|
+
return tool.optional ? WARN_MARK : CROSS_MARK;
|
|
63
|
+
};
|
|
64
|
+
const setToolLog = (update) => {
|
|
65
|
+
const log = update(tool_logs[index] ?? "");
|
|
66
|
+
tool_logs[index] = (Array.isArray(log) ? iter_map_not_null(log, (v) => (v ? v : null)) : [log]).map((line) => " " + line).join("\n");
|
|
67
|
+
logger.text = LOG_TITLE + tool_logs.join("\n");
|
|
68
|
+
};
|
|
69
|
+
setToolLog(() => `Checking ${TOOL_LOG_TITLE}... `);
|
|
70
|
+
let tool_log = [];
|
|
71
|
+
let result;
|
|
72
|
+
if (!tool.versionCommand) {
|
|
73
|
+
// Custom check logic for services
|
|
74
|
+
result = await checkServiceHealth(tool.id, tool.displayName, tool.installationHint);
|
|
75
|
+
if (result.exists) {
|
|
76
|
+
tool_log = [`${SUCCESS_MARK()} ${TOOL_LOG_TITLE}`, ` ${green(result.message)}`];
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
tool_log = [`${FAIL_MARK()} ${TOOL_LOG_TITLE}`, ` ${red(result.message)}`, tool.installationHint && ` ${yellow("Hint:")} ${tool.installationHint}`];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Original command-based check logic
|
|
84
|
+
result = {
|
|
85
|
+
id: tool.id,
|
|
86
|
+
displayName: tool.displayName,
|
|
87
|
+
exists: false,
|
|
88
|
+
meetsVersionRequirement: false,
|
|
89
|
+
isOptional: !!tool.optional,
|
|
90
|
+
message: "",
|
|
91
|
+
requiredVersion: tool.minVersion,
|
|
92
|
+
installationHint: tool.installationHint,
|
|
93
|
+
};
|
|
94
|
+
const execResult = await executeCommand(tool.versionCommand);
|
|
95
|
+
if (execResult.error || execResult.stderr.includes("command not found") || execResult.stderr.includes("not recognized")) {
|
|
96
|
+
result.exists = false;
|
|
97
|
+
result.message = `'${tool.id}' command not found or failed to execute.`;
|
|
98
|
+
tool_log = [`${FAIL_MARK()} ${TOOL_LOG_TITLE}`, ` ${red(result.message)}`, tool.installationHint && ` ${yellow("Hint:")} ${tool.installationHint}`];
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
result.exists = true;
|
|
102
|
+
const output = execResult.stdout.trim();
|
|
103
|
+
const match = output.match(tool.versionParseRegex);
|
|
104
|
+
if (match && match[1]) {
|
|
105
|
+
result.version = semver.clean(match[1]) || undefined;
|
|
106
|
+
if (result.version) {
|
|
107
|
+
if (tool.minVersion) {
|
|
108
|
+
if (semver.gte(result.version, tool.minVersion)) {
|
|
109
|
+
result.meetsVersionRequirement = true;
|
|
110
|
+
result.message = `Version ${result.version} satisfies >=${tool.minVersion}.`;
|
|
111
|
+
tool_log.push(`${SUCCESS_MARK()} ${TOOL_LOG_TITLE} (v${result.version})`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
result.meetsVersionRequirement = false;
|
|
115
|
+
result.message = `Version ${result.version} is older than required >=${tool.minVersion}.`;
|
|
116
|
+
tool_log.push(`${FAIL_MARK()} ${TOOL_LOG_TITLE} (v${result.version} - required: >=${tool.minVersion})`);
|
|
117
|
+
if (tool.installationHint) {
|
|
118
|
+
tool_log.push(` ${yellow("Hint:")} ${tool.installationHint}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
result.meetsVersionRequirement = true;
|
|
124
|
+
result.message = `Found version ${result.version}. No minimum version specified.`;
|
|
125
|
+
tool_log.push(`${SUCCESS_MARK()} ${TOOL_LOG_TITLE} (v${result.version} - existence check only)`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
result.meetsVersionRequirement = false;
|
|
130
|
+
result.message = `Could not parse a valid version string from output: "${output}".`;
|
|
131
|
+
tool_log.push(`${FAIL_MARK()} ${TOOL_LOG_TITLE}`);
|
|
132
|
+
tool_log.push(` ${red(result.message)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
result.meetsVersionRequirement = false;
|
|
137
|
+
result.message = `Could not parse version from output: "${output}".`;
|
|
138
|
+
tool_log.push(`${FAIL_MARK()} ${TOOL_LOG_TITLE}`);
|
|
139
|
+
tool_log.push(` ${red(result.message)}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
setToolLog(() => tool_log);
|
|
144
|
+
results.push(result);
|
|
145
|
+
if (!result.meetsVersionRequirement && !result.isOptional) {
|
|
146
|
+
overallSuccess = false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const LOG_SUMMERY = `${overallSuccess ? (overallWarn ? "⚠️ " : "✅") : "💊"} JIXO Environment Doctor 🏥\n\n`;
|
|
150
|
+
logger.stopAndPersist({
|
|
151
|
+
text: LOG_SUMMERY + tool_logs.join("\n") + "\n",
|
|
152
|
+
});
|
|
153
|
+
return {
|
|
154
|
+
overallSuccess,
|
|
155
|
+
results,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/doctor/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import {blue, cyan, green, red, spinner, yellow} from \"@gaubee/nodekit\";\nimport {iter_map_not_null} from \"@gaubee/util\";\nimport {execSync} from \"node:child_process\";\nimport semver from \"semver\";\nimport {safeEnv} from \"../../env.js\";\nimport type {DoctorConfig, DoctorReport, ToolCheckResult} from \"./types.js\";\n\nconst CHECK_MARK = green(\"✔\");\nconst CROSS_MARK = red(\"✖\");\nconst WARN_MARK = yellow(\"⚠\");\n\nasync function executeCommand(command: string): Promise<{stdout: string; stderr: string; error?: Error}> {\n return new Promise((resolve) => {\n try {\n const stdout = execSync(command, {encoding: \"utf8\", stdio: \"pipe\"});\n resolve({stdout, stderr: \"\"});\n } catch (e: any) {\n resolve({stdout: \"\", stderr: e.stderr || \"\", error: e});\n }\n });\n}\n\nasync function checkServiceHealth(id: string, displayName: string, hint?: string): Promise<ToolCheckResult> {\n const result: ToolCheckResult = {\n id,\n displayName,\n exists: false,\n meetsVersionRequirement: false,\n isOptional: false,\n message: \"\",\n installationHint: hint,\n };\n\n const url = `${safeEnv.JIXO_CORE_URL}/jixo/v1/health`;\n try {\n const response = await fetch(url, {signal: AbortSignal.timeout(3000)});\n if (response.ok) {\n result.exists = true;\n result.meetsVersionRequirement = true;\n result.message = `Service is running and healthy at ${url}`;\n } else {\n result.message = `Service responded with status ${response.status} at ${url}`;\n }\n } catch (e) {\n result.message = `Could not connect to service at ${url}. Is it running?`;\n }\n return result;\n}\n\nexport async function runDoctor(config: DoctorConfig, enableLog: boolean = true): Promise<DoctorReport> {\n const LOG_TITLE = \"Running Environment Doctor 🏥\\n\\n\";\n const logger = spinner(LOG_TITLE);\n if (enableLog) {\n logger.start();\n }\n\n const results: ToolCheckResult[] = [];\n let overallSuccess = true;\n let overallWarn = false;\n\n const tool_logs: string[] = [];\n\n for (const [index, tool] of config.entries()) {\n const TOOL_LOG_TITLE = `${blue(`[${tool.id}]`)} ${cyan(tool.displayName)}`;\n const SUCCESS_MARK = () => CHECK_MARK;\n const FAIL_MARK = () => {\n overallWarn = true;\n return tool.optional ? WARN_MARK : CROSS_MARK;\n };\n const setToolLog = (update: (cur: string) => string | (string | undefined | null)[]) => {\n const log = update(tool_logs[index] ?? \"\");\n tool_logs[index] = (Array.isArray(log) ? iter_map_not_null(log, (v) => (v ? v : null)) : [log]).map((line) => \" \" + line).join(\"\\n\");\n logger.text = LOG_TITLE + tool_logs.join(\"\\n\");\n };\n setToolLog(() => `Checking ${TOOL_LOG_TITLE}... `);\n let tool_log: (string | undefined | null)[] = [];\n\n let result: ToolCheckResult;\n\n if (!tool.versionCommand) {\n // Custom check logic for services\n result = await checkServiceHealth(tool.id, tool.displayName, tool.installationHint);\n if (result.exists) {\n tool_log = [`${SUCCESS_MARK()} ${TOOL_LOG_TITLE}`, ` ${green(result.message)}`];\n } else {\n tool_log = [`${FAIL_MARK()} ${TOOL_LOG_TITLE}`, ` ${red(result.message)}`, tool.installationHint && ` ${yellow(\"Hint:\")} ${tool.installationHint}`];\n }\n } else {\n // Original command-based check logic\n result = {\n id: tool.id,\n displayName: tool.displayName,\n exists: false,\n meetsVersionRequirement: false,\n isOptional: !!tool.optional,\n message: \"\",\n requiredVersion: tool.minVersion,\n installationHint: tool.installationHint,\n };\n const execResult = await executeCommand(tool.versionCommand);\n\n if (execResult.error || execResult.stderr.includes(\"command not found\") || execResult.stderr.includes(\"not recognized\")) {\n result.exists = false;\n result.message = `'${tool.id}' command not found or failed to execute.`;\n tool_log = [`${FAIL_MARK()} ${TOOL_LOG_TITLE}`, ` ${red(result.message)}`, tool.installationHint && ` ${yellow(\"Hint:\")} ${tool.installationHint}`];\n } else {\n result.exists = true;\n const output = execResult.stdout.trim();\n const match = output.match(tool.versionParseRegex!);\n\n if (match && match[1]) {\n result.version = semver.clean(match[1]) || undefined;\n if (result.version) {\n if (tool.minVersion) {\n if (semver.gte(result.version, tool.minVersion)) {\n result.meetsVersionRequirement = true;\n result.message = `Version ${result.version} satisfies >=${tool.minVersion}.`;\n tool_log.push(`${SUCCESS_MARK()} ${TOOL_LOG_TITLE} (v${result.version})`);\n } else {\n result.meetsVersionRequirement = false;\n result.message = `Version ${result.version} is older than required >=${tool.minVersion}.`;\n tool_log.push(`${FAIL_MARK()} ${TOOL_LOG_TITLE} (v${result.version} - required: >=${tool.minVersion})`);\n if (tool.installationHint) {\n tool_log.push(` ${yellow(\"Hint:\")} ${tool.installationHint}`);\n }\n }\n } else {\n result.meetsVersionRequirement = true;\n result.message = `Found version ${result.version}. No minimum version specified.`;\n tool_log.push(`${SUCCESS_MARK()} ${TOOL_LOG_TITLE} (v${result.version} - existence check only)`);\n }\n } else {\n result.meetsVersionRequirement = false;\n result.message = `Could not parse a valid version string from output: \"${output}\".`;\n tool_log.push(`${FAIL_MARK()} ${TOOL_LOG_TITLE}`);\n tool_log.push(` ${red(result.message)}`);\n }\n } else {\n result.meetsVersionRequirement = false;\n result.message = `Could not parse version from output: \"${output}\".`;\n tool_log.push(`${FAIL_MARK()} ${TOOL_LOG_TITLE}`);\n tool_log.push(` ${red(result.message)}`);\n }\n }\n }\n\n setToolLog(() => tool_log);\n\n results.push(result);\n if (!result.meetsVersionRequirement && !result.isOptional) {\n overallSuccess = false;\n }\n }\n\n const LOG_SUMMERY = `${overallSuccess ? (overallWarn ? \"⚠️ \" : \"✅\") : \"💊\"} JIXO Environment Doctor 🏥\\n\\n`;\n logger.stopAndPersist({\n text: LOG_SUMMERY + tool_logs.join(\"\\n\") + \"\\n\",\n });\n\n return {\n overallSuccess,\n results,\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/doctor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Example Usage (e.g., in an index.ts or app.ts)
|
|
2
|
+
import { myDoctorConfig } from "./config.js"; // Assuming config.ts
|
|
3
|
+
import { runDoctor } from "./doctor.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
await runDoctor(myDoctorConfig);
|
|
6
|
+
// console.log("\n\n--- Structured Report ---");
|
|
7
|
+
// console.log(JSON.stringify(report, null, 2));
|
|
8
|
+
// if (!report.overallSuccess) {
|
|
9
|
+
// console.error(bgRed(white("\nCritical environment checks failed. Please fix the issues above before proceeding.")));
|
|
10
|
+
// // process.exit(1); // Optionally exit if critical checks fail
|
|
11
|
+
// }
|
|
12
|
+
}
|
|
13
|
+
main().catch(console.error);
|
|
14
|
+
//# sourceMappingURL=doctor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/commands/doctor/doctor.test.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC,CAAC,qBAAqB;AACjE,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC;IAChC,kDAAkD;IAClD,kDAAkD;IAElD,kCAAkC;IAClC,2HAA2H;IAC3H,qEAAqE;IACrE,MAAM;AACR,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC","sourcesContent":["// Example Usage (e.g., in an index.ts or app.ts)\n\nimport {myDoctorConfig} from \"./config.js\"; // Assuming config.ts\nimport {runDoctor} from \"./doctor.js\";\n\nasync function main() {\n await runDoctor(myDoctorConfig);\n // console.log(\"\\n\\n--- Structured Report ---\");\n // console.log(JSON.stringify(report, null, 2));\n\n // if (!report.overallSuccess) {\n // console.error(bgRed(white(\"\\nCritical environment checks failed. Please fix the issues above before proceeding.\")));\n // // process.exit(1); // Optionally exit if critical checks fail\n // }\n}\n\nmain().catch(console.error);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM,mDAAmC,OAAO,kHAG3D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { func_remember } from "@gaubee/util";
|
|
2
|
+
import { myDoctorConfig } from "./config.js";
|
|
3
|
+
import { runDoctor } from "./doctor.js";
|
|
4
|
+
export const doctor = func_remember(async (enableLog = true) => {
|
|
5
|
+
const report = await runDoctor(myDoctorConfig, enableLog);
|
|
6
|
+
return report;
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,YAAqB,IAAI,EAAE,EAAE;IACtE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,CAAC","sourcesContent":["import {func_remember} from \"@gaubee/util\";\nimport {myDoctorConfig} from \"./config.js\";\nimport {runDoctor} from \"./doctor.js\";\n\nexport const doctor = func_remember(async (enableLog: boolean = true) => {\n const report = await runDoctor(myDoctorConfig, enableLog);\n return report;\n});\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface ToolCheckConfig {
|
|
2
|
+
/** A unique identifier for this check (e.g., 'pnpm', 'uvx-cli') */
|
|
3
|
+
id: string;
|
|
4
|
+
/** User-friendly name for display purposes (e.g., "PNPM Package Manager") */
|
|
5
|
+
displayName: string;
|
|
6
|
+
/** The command to execute to get the version (e.g., "pnpm --version") */
|
|
7
|
+
versionCommand?: string;
|
|
8
|
+
/**
|
|
9
|
+
* A regular expression to parse the version string from the command's output.
|
|
10
|
+
* It MUST have at least one capturing group, which should capture the version string.
|
|
11
|
+
* Example: For "pnpm 10.11.0", regex could be /pnpm\s+([\d.]+)/ or simply /([\d.]+)/
|
|
12
|
+
*/
|
|
13
|
+
versionParseRegex?: RegExp;
|
|
14
|
+
/**
|
|
15
|
+
* The minimum required version (Semantic Versioning string).
|
|
16
|
+
* If undefined, only existence is checked.
|
|
17
|
+
*/
|
|
18
|
+
minVersion?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional: A hint or URL for installation if the tool is missing or version is too low.
|
|
21
|
+
*/
|
|
22
|
+
installationHint?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Optional: If true, a failure for this tool won't cause the overall doctor check to fail.
|
|
25
|
+
* It will still be reported. Defaults to false.
|
|
26
|
+
*/
|
|
27
|
+
optional?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export type DoctorConfig = ToolCheckConfig[];
|
|
30
|
+
export interface ToolCheckResult {
|
|
31
|
+
id: string;
|
|
32
|
+
displayName: string;
|
|
33
|
+
exists: boolean;
|
|
34
|
+
version?: string;
|
|
35
|
+
requiredVersion?: string;
|
|
36
|
+
meetsVersionRequirement: boolean;
|
|
37
|
+
isOptional: boolean;
|
|
38
|
+
message: string;
|
|
39
|
+
installationHint?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface DoctorReport {
|
|
42
|
+
overallSuccess: boolean;
|
|
43
|
+
results: ToolCheckResult[];
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IAEX,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IAEpB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/doctor/types.ts"],"names":[],"mappings":"AAAA,2CAA2C","sourcesContent":["// types.ts (or directly in your doctor.ts)\n\nexport interface ToolCheckConfig {\n /** A unique identifier for this check (e.g., 'pnpm', 'uvx-cli') */\n id: string;\n\n /** User-friendly name for display purposes (e.g., \"PNPM Package Manager\") */\n displayName: string;\n\n /** The command to execute to get the version (e.g., \"pnpm --version\") */\n versionCommand?: string;\n\n /**\n * A regular expression to parse the version string from the command's output.\n * It MUST have at least one capturing group, which should capture the version string.\n * Example: For \"pnpm 10.11.0\", regex could be /pnpm\\s+([\\d.]+)/ or simply /([\\d.]+)/\n */\n versionParseRegex?: RegExp;\n\n /**\n * The minimum required version (Semantic Versioning string).\n * If undefined, only existence is checked.\n */\n minVersion?: string;\n\n /**\n * Optional: A hint or URL for installation if the tool is missing or version is too low.\n */\n installationHint?: string;\n\n /**\n * Optional: If true, a failure for this tool won't cause the overall doctor check to fail.\n * It will still be reported. Defaults to false.\n */\n optional?: boolean;\n}\n\nexport type DoctorConfig = ToolCheckConfig[];\n\nexport interface ToolCheckResult {\n id: string;\n displayName: string;\n exists: boolean;\n version?: string; // Actual version found\n requiredVersion?: string; // From config\n meetsVersionRequirement: boolean; // True if version >= minVersion or if minVersion not set & exists\n isOptional: boolean;\n message: string;\n installationHint?: string;\n}\n\nexport interface DoctorReport {\n overallSuccess: boolean;\n results: ToolCheckResult[];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-aistudio.d.ts","sourceRoot":"","sources":["../../src/commands/google-aistudio.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,aAAa,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"google-aistudio.d.ts","sourceRoot":"","sources":["../../src/commands/google-aistudio.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,aAAa,EAAC,MAAM,OAAO,CAAC;AAgGpD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAiB/D,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { prompts } from "@gaubee/nodekit";
|
|
1
2
|
import { doGoogleAiStudioAutomation, doInit, doSync } from "@jixo/dev/google-aistudio";
|
|
2
|
-
import path from "node:path";
|
|
3
3
|
// 定义 'sync' 子命令
|
|
4
4
|
const syncCommand = {
|
|
5
5
|
command: "sync [path]",
|
|
@@ -54,7 +54,6 @@ const initCommand = {
|
|
|
54
54
|
.positional("dir", {
|
|
55
55
|
describe: "Directory for aistudio input/output contents",
|
|
56
56
|
type: "string",
|
|
57
|
-
default: path.resolve(process.cwd(), ".ai"),
|
|
58
57
|
})
|
|
59
58
|
.option("force", {
|
|
60
59
|
alias: "F",
|
|
@@ -62,7 +61,17 @@ const initCommand = {
|
|
|
62
61
|
describe: "override exits files",
|
|
63
62
|
}),
|
|
64
63
|
handler: async (argv) => {
|
|
65
|
-
|
|
64
|
+
let { dir } = argv;
|
|
65
|
+
if (dir == null) {
|
|
66
|
+
dir = await prompts.input({
|
|
67
|
+
message: "No directory specified. Do you want to use the default '.ai' directory?",
|
|
68
|
+
default: ".ai", // 默认值为 Yes
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
doInit({
|
|
72
|
+
...argv,
|
|
73
|
+
dir,
|
|
74
|
+
});
|
|
66
75
|
},
|
|
67
76
|
};
|
|
68
77
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-aistudio.js","sourceRoot":"","sources":["../../src/commands/google-aistudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,0BAA0B,EAAE,MAAM,EAAE,MAAM,EAAqC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"google-aistudio.js","sourceRoot":"","sources":["../../src/commands/google-aistudio.ts"],"names":[],"mappings":"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","sourcesContent":["import {prompts} from \"@gaubee/nodekit\";\nimport {doGoogleAiStudioAutomation, doInit, doSync, type InitOptions, type SyncOptions} from \"@jixo/dev/google-aistudio\";\nimport type {Arguments, CommandModule} from \"yargs\";\n\n// 定义 yargs builder 所需的参数接口\ninterface SyncArgs {\n path?: string;\n watch?: boolean;\n outDir?: string;\n}\n\n// 定义 'sync' 子命令\nconst syncCommand: CommandModule<object, SyncArgs> = {\n command: \"sync [path]\",\n aliases: [\"S\", \"s\"],\n describe: \"Sync with aistudio.google.com contents\",\n builder: (yargs) =>\n yargs\n .positional(\"path\", {\n describe: \"Directory or file path to sync\",\n type: \"string\",\n default: process.cwd(),\n })\n .option(\"watch\", {\n alias: \"W\",\n type: \"boolean\",\n describe: \"Watch for file changes and sync automatically\",\n default: false,\n })\n .option(\"outDir\", {\n alias: \"O\",\n type: \"string\",\n describe: \"Specify the output directory for generated markdown files\",\n }),\n handler: async (argv: Arguments<SyncArgs>) => {\n // 将 yargs 的解析结果适配为 doSync 函数期望的格式。\n // 关键是 yargs 的位置参数是命名好的 (argv.path),而 doSync\n // 期望它在 `_` 数组的第一个位置。\n const optionsForDoSync: SyncOptions = {\n ...argv,\n _: [argv.path as string],\n };\n doSync(optionsForDoSync);\n },\n};\n\ninterface BrowserArgs {\n dir?: string;\n}\n\nconst browserCommand: CommandModule<object, BrowserArgs> = {\n command: \"browser [dir]\",\n aliases: [\"B\", \"b\"],\n describe: \"browser-kit for aistudio.google.com\",\n builder: (yargs) =>\n yargs.positional(\"dir\", {\n describe: \"Directory for aistudio output contents\",\n type: \"string\",\n default: process.cwd(),\n }),\n handler: async (argv) => {\n doGoogleAiStudioAutomation(argv.dir);\n },\n};\ninterface InitOptions {\n dir?: string;\n force?: boolean;\n}\nconst initCommand: CommandModule<object, InitOptions> = {\n command: \"init [dir]\",\n aliases: [\"i\", \"I\"],\n describe: \"init an browser-kit directory for aistudio.google.com\",\n builder: (yargs) =>\n yargs\n .positional(\"dir\", {\n describe: \"Directory for aistudio input/output contents\",\n type: \"string\",\n })\n .option(\"force\", {\n alias: \"F\",\n type: \"boolean\",\n describe: \"override exits files\",\n }),\n handler: async (argv) => {\n let {dir} = argv;\n if (dir == null) {\n dir = await prompts.input({\n message: \"No directory specified. Do you want to use the default '.ai' directory?\",\n default: \".ai\", // 默认值为 Yes\n });\n }\n doInit({\n ...argv,\n dir,\n });\n },\n};\n\n/**\n * @jixo/cli google-aistudio\n *\n * Group of commands for interacting with Google AI Studio.\n */\nexport const googleAistudioCommand: CommandModule<object, object> = {\n command: \"google-aistudio <command>\",\n aliases: [\"GO\", \"Go\", \"go\"],\n describe: \"Commands for Google AI Studio integration\",\n builder: (yargs) => {\n // 将 syncCommand 注册为 google-aistudio 的子命令\n return (\n yargs\n .command(syncCommand)\n .command(browserCommand)\n .command(initCommand)\n //\n .demandCommand(1, \"You must provide a sub-command for 'google-aistudio'.\")\n );\n },\n // 这个 handler 理论上不会被执行,因为 yargs 会要求一个子命令\n handler: () => {},\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SA8B/B,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { writeText } from "@gaubee/nodekit";
|
|
2
|
+
import { str_trim_indent } from "@gaubee/util";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
export const init = (dir) => {
|
|
6
|
+
// Create .jixo directory
|
|
7
|
+
const jixoDir = path.join(dir, ".jixo");
|
|
8
|
+
fs.mkdirSync(jixoDir, { recursive: true });
|
|
9
|
+
// Create .jixo.env file
|
|
10
|
+
const jixoEnvFilepath = path.join(dir, ".jixo.env");
|
|
11
|
+
if (!fs.existsSync(jixoEnvFilepath)) {
|
|
12
|
+
writeText(jixoEnvFilepath, str_trim_indent(`
|
|
13
|
+
# JIXO Core Service Configuration
|
|
14
|
+
JIXO_CORE_URL=http://localhost:4111
|
|
15
|
+
JIXO_API_KEY=
|
|
16
|
+
|
|
17
|
+
# LLM Provider API Keys (to be used by jixo-core)
|
|
18
|
+
# ANTHROPIC_API_KEY=
|
|
19
|
+
# GOOGLE_API_KEY=
|
|
20
|
+
# OPENAI_API_KEY=
|
|
21
|
+
`));
|
|
22
|
+
console.log(`✅ Created configuration template at: ${jixoEnvFilepath}`);
|
|
23
|
+
}
|
|
24
|
+
// Update root .gitignore
|
|
25
|
+
const gitignoreFilepath = path.join(dir, ".gitignore");
|
|
26
|
+
addRulesToGitIgnore(gitignoreFilepath, [".jixo.env", ".jixo/memory/"]);
|
|
27
|
+
console.log(`✅ Updated .gitignore`);
|
|
28
|
+
console.log("\nJIXO initialized successfully!");
|
|
29
|
+
};
|
|
30
|
+
const addRulesToGitIgnore = (gitignoreFilepath, rules) => {
|
|
31
|
+
const existingRules = fs.existsSync(gitignoreFilepath) ? fs.readFileSync(gitignoreFilepath, "utf-8").split("\n") : [];
|
|
32
|
+
let changed = false;
|
|
33
|
+
const newRules = rules.filter((rule) => !existingRules.includes(rule));
|
|
34
|
+
if (newRules.length > 0) {
|
|
35
|
+
fs.appendFileSync(gitignoreFilepath, "\n# JIXO\n" + newRules.join("\n") + "\n");
|
|
36
|
+
changed = true;
|
|
37
|
+
}
|
|
38
|
+
return changed;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;IAClC,yBAAyB;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAEzC,wBAAwB;IACxB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,SAAS,CACP,eAAe,EACf,eAAe,CAAC;;;;;;;;;OASf,CAAC,CACH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,wCAAwC,eAAe,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,yBAAyB;IACzB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACvD,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,iBAAyB,EAAE,KAAe,EAAE,EAAE;IACzE,MAAM,aAAa,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtH,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAChF,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import {writeText} from \"@gaubee/nodekit\";\nimport {str_trim_indent} from \"@gaubee/util\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport const init = (dir: string) => {\n // Create .jixo directory\n const jixoDir = path.join(dir, \".jixo\");\n fs.mkdirSync(jixoDir, {recursive: true});\n\n // Create .jixo.env file\n const jixoEnvFilepath = path.join(dir, \".jixo.env\");\n if (!fs.existsSync(jixoEnvFilepath)) {\n writeText(\n jixoEnvFilepath,\n str_trim_indent(`\n # JIXO Core Service Configuration\n JIXO_CORE_URL=http://localhost:4111\n JIXO_API_KEY=\n\n # LLM Provider API Keys (to be used by jixo-core)\n # ANTHROPIC_API_KEY=\n # GOOGLE_API_KEY=\n # OPENAI_API_KEY=\n `),\n );\n console.log(`✅ Created configuration template at: ${jixoEnvFilepath}`);\n }\n\n // Update root .gitignore\n const gitignoreFilepath = path.join(dir, \".gitignore\");\n addRulesToGitIgnore(gitignoreFilepath, [\".jixo.env\", \".jixo/memory/\"]);\n console.log(`✅ Updated .gitignore`);\n\n console.log(\"\\nJIXO initialized successfully!\");\n};\n\nconst addRulesToGitIgnore = (gitignoreFilepath: string, rules: string[]) => {\n const existingRules = fs.existsSync(gitignoreFilepath) ? fs.readFileSync(gitignoreFilepath, \"utf-8\").split(\"\\n\") : [];\n let changed = false;\n const newRules = rules.filter((rule) => !existingRules.includes(rule));\n\n if (newRules.length > 0) {\n fs.appendFileSync(gitignoreFilepath, \"\\n# JIXO\\n\" + newRules.join(\"\\n\") + \"\\n\");\n changed = true;\n }\n return changed;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,GAAG,GAAU,SAAS,UAAU,kBA0C5C,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { cyan, green, red, yellow } from "@gaubee/nodekit";
|
|
2
|
+
import { safeEnv } from "../../env.js";
|
|
3
|
+
export const run = async (options) => {
|
|
4
|
+
const { jobGoal, workDir, maxLoops, jobName, gitCommit } = options;
|
|
5
|
+
const coreUrl = safeEnv.JIXO_CORE_URL;
|
|
6
|
+
const apiKey = safeEnv.JIXO_API_KEY;
|
|
7
|
+
console.log(cyan(`🚀 Starting JIXO job...`));
|
|
8
|
+
console.log(` - Goal: ${jobGoal}`);
|
|
9
|
+
console.log(` - Target: ${coreUrl}`);
|
|
10
|
+
try {
|
|
11
|
+
const response = await fetch(`${coreUrl}/jixo/v1/jobs`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: {
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
Authorization: `Bearer ${apiKey}`,
|
|
16
|
+
},
|
|
17
|
+
body: JSON.stringify({
|
|
18
|
+
jobGoal,
|
|
19
|
+
workspaceDir: workDir, // Updated field name
|
|
20
|
+
maxLoops,
|
|
21
|
+
jobName,
|
|
22
|
+
gitCommit,
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
const errorBody = await response.text();
|
|
27
|
+
throw new Error(`Failed to start job. Server responded with ${response.status}: ${errorBody}`);
|
|
28
|
+
}
|
|
29
|
+
const result = await response.json();
|
|
30
|
+
console.log(green(`✅ Job successfully started with Run ID: ${result.runId}`));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof TypeError && error.message.includes("fetch failed")) {
|
|
34
|
+
console.error(red("\n❌ Error: Could not connect to the JIXO Core service."));
|
|
35
|
+
console.error(yellow(` Please ensure the core service is running at ${coreUrl}.`));
|
|
36
|
+
console.error(yellow(` You can start it by running 'jixo daemon start' or running the core package directly.`));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.error(red("\n❌ An unexpected error occurred:"), error);
|
|
40
|
+
}
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAC,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAUrC,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,OAAmB,EAAE,EAAE;IAC/C,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,eAAe,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO;gBACP,YAAY,EAAE,OAAO,EAAE,qBAAqB;gBAC5C,QAAQ;gBACR,OAAO;gBACP,SAAS;aACV,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,2CAA2C,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,OAAO,GAAG,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,0FAA0F,CAAC,CAAC,CAAC;QACpH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {cyan, green, red, yellow} from \"@gaubee/nodekit\";\nimport {safeEnv} from \"../../env.js\";\n\ninterface RunOptions {\n jobGoal: string;\n workDir: string;\n maxLoops: number;\n jobName?: string;\n gitCommit?: boolean;\n}\n\nexport const run = async (options: RunOptions) => {\n const {jobGoal, workDir, maxLoops, jobName, gitCommit} = options;\n const coreUrl = safeEnv.JIXO_CORE_URL;\n const apiKey = safeEnv.JIXO_API_KEY;\n\n console.log(cyan(`🚀 Starting JIXO job...`));\n console.log(` - Goal: ${jobGoal}`);\n console.log(` - Target: ${coreUrl}`);\n\n try {\n const response = await fetch(`${coreUrl}/jixo/v1/jobs`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n jobGoal,\n workspaceDir: workDir, // Updated field name\n maxLoops,\n jobName,\n gitCommit,\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to start job. Server responded with ${response.status}: ${errorBody}`);\n }\n\n const result = await response.json();\n console.log(green(`✅ Job successfully started with Run ID: ${result.runId}`));\n } catch (error) {\n if (error instanceof TypeError && error.message.includes(\"fetch failed\")) {\n console.error(red(\"\\n❌ Error: Could not connect to the JIXO Core service.\"));\n console.error(yellow(` Please ensure the core service is running at ${coreUrl}.`));\n console.error(yellow(` You can start it by running 'jixo daemon start' or running the core package directly.`));\n } else {\n console.error(red(\"\\n❌ An unexpected error occurred:\"), error);\n }\n process.exit(1);\n }\n};\n"]}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import z from "zod";
|
|
2
|
+
declare const zJixoConfig: z.ZodObject<{
|
|
3
|
+
coreUrl: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
coreUrl: string;
|
|
6
|
+
}, {
|
|
7
|
+
coreUrl?: string | undefined;
|
|
8
|
+
}>;
|
|
9
|
+
export type JixoConfig = z.output<typeof zJixoConfig>;
|
|
10
|
+
export declare const defineConfig: (config: Partial<JixoConfig>) => {
|
|
11
|
+
coreUrl: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const loadConfig: (dir: string) => Promise<JixoConfig>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,QAAA,MAAM,WAAW;;;;;;EAEf,CAAC;AAMH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,YAAY,GAAI,QAAQ,OAAO,CAAC,UAAU,CAAC;;CAEvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,UAAU,CAOhE,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
2
|
+
import { defu } from "defu";
|
|
3
|
+
import z from "zod";
|
|
4
|
+
const DEFAULT_CORE_URL = "http://localhost:4111";
|
|
5
|
+
const zJixoConfig = z.object({
|
|
6
|
+
coreUrl: z.string().url().optional().default(DEFAULT_CORE_URL),
|
|
7
|
+
});
|
|
8
|
+
const defaultConfig = {
|
|
9
|
+
coreUrl: DEFAULT_CORE_URL,
|
|
10
|
+
};
|
|
11
|
+
export const defineConfig = (config) => {
|
|
12
|
+
return zJixoConfig.parse(config);
|
|
13
|
+
};
|
|
14
|
+
export const loadConfig = async (dir) => {
|
|
15
|
+
const explorer = cosmiconfig("jixo", {
|
|
16
|
+
searchStrategy: "global",
|
|
17
|
+
});
|
|
18
|
+
const loaded = await explorer.search(dir);
|
|
19
|
+
// Use Zod to parse the loaded config, which applies defaults if properties are missing.
|
|
20
|
+
return defu(zJixoConfig.parse(loaded?.config || {}), defaultConfig);
|
|
21
|
+
};
|
|
22
|
+
console.log(defineConfig({}));
|
|
23
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAC1B,OAAO,CAAC,MAAM,KAAK,CAAC;AACpB,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACjD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,aAAa,GAAe;IAChC,OAAO,EAAE,gBAAgB;CAC1B,CAAC;AAIF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAA2B,EAAE,EAAE;IAC1D,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,GAAW,EAAuB,EAAE;IACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE;QACnC,cAAc,EAAE,QAAQ;KACzB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1C,wFAAwF;IACxF,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACtE,CAAC,CAAC;AACF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC","sourcesContent":["import {cosmiconfig} from \"cosmiconfig\";\nimport {defu} from \"defu\";\nimport z from \"zod\";\nconst DEFAULT_CORE_URL = \"http://localhost:4111\";\nconst zJixoConfig = z.object({\n coreUrl: z.string().url().optional().default(DEFAULT_CORE_URL),\n});\n\nconst defaultConfig: JixoConfig = {\n coreUrl: DEFAULT_CORE_URL,\n};\n\nexport type JixoConfig = z.output<typeof zJixoConfig>;\n\nexport const defineConfig = (config: Partial<JixoConfig>) => {\n return zJixoConfig.parse(config);\n};\n\nexport const loadConfig = async (dir: string): Promise<JixoConfig> => {\n const explorer = cosmiconfig(\"jixo\", {\n searchStrategy: \"global\",\n });\n const loaded = await explorer.search(dir);\n // Use Zod to parse the loaded config, which applies defaults if properties are missing.\n return defu(zJixoConfig.parse(loaded?.config || {}), defaultConfig);\n};\nconsole.log(defineConfig({}));\n"]}
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,SAKtC,CAAC;AAKF,eAAO,MAAM,OAAO;;;GAGlB,CAAC"}
|
package/dist/env.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineEnv } from "@gaubee/node";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export const loadJixoEnv = (dir) => {
|
|
5
|
+
const cwdJixoEnvFilepath = path.join(dir, ".jixo.env");
|
|
6
|
+
if (fs.existsSync(cwdJixoEnvFilepath)) {
|
|
7
|
+
process.loadEnvFile(cwdJixoEnvFilepath);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
// Load environment from the current working directory when the module is imported.
|
|
11
|
+
loadJixoEnv(process.cwd());
|
|
12
|
+
export const safeEnv = defineEnv("JIXO", {
|
|
13
|
+
CORE_URL: "http://localhost:4111",
|
|
14
|
+
API_KEY: "",
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE;IACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AAEF,mFAAmF;AACnF,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE;IACvC,QAAQ,EAAE,uBAAuB;IACjC,OAAO,EAAE,EAAE;CACZ,CAAC,CAAC","sourcesContent":["import {defineEnv} from \"@gaubee/node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport const loadJixoEnv = (dir: string) => {\n const cwdJixoEnvFilepath = path.join(dir, \".jixo.env\");\n if (fs.existsSync(cwdJixoEnvFilepath)) {\n process.loadEnvFile(cwdJixoEnvFilepath);\n }\n};\n\n// Load environment from the current working directory when the module is imported.\nloadJixoEnv(process.cwd());\n\nexport const safeEnv = defineEnv(\"JIXO\", {\n CORE_URL: \"http://localhost:4111\",\n API_KEY: \"\",\n});\n"]}
|