@jixo/cli 0.3.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/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +74 -0
- package/dist/cli.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 +30 -0
- package/dist/commands/doctor/config.js.map +1 -0
- package/dist/commands/doctor/doctor.d.ts +18 -0
- package/dist/commands/doctor/doctor.d.ts.map +1 -0
- package/dist/commands/doctor/doctor.js +125 -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 +19 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/doctor/types.d.ts +30 -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/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +57 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/prompts/list.d.ts +2 -0
- package/dist/commands/prompts/list.d.ts.map +1 -0
- package/dist/commands/prompts/list.js +14 -0
- package/dist/commands/prompts/list.js.map +1 -0
- package/dist/commands/prompts/upgrade.d.ts +4 -0
- package/dist/commands/prompts/upgrade.d.ts.map +1 -0
- package/dist/commands/prompts/upgrade.js +17 -0
- package/dist/commands/prompts/upgrade.js.map +1 -0
- package/dist/commands/run.d.ts +5 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +36 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/tasks/ai-tools.d.ts +268 -0
- package/dist/commands/tasks/ai-tools.d.ts.map +1 -0
- package/dist/commands/tasks/ai-tools.js +64 -0
- package/dist/commands/tasks/ai-tools.js.map +1 -0
- package/dist/commands/tasks/model-providers.d.ts +9 -0
- package/dist/commands/tasks/model-providers.d.ts.map +1 -0
- package/dist/commands/tasks/model-providers.js +53 -0
- package/dist/commands/tasks/model-providers.js.map +1 -0
- package/dist/commands/tasks/run-ai-task.d.ts +4 -0
- package/dist/commands/tasks/run-ai-task.d.ts.map +1 -0
- package/dist/commands/tasks/run-ai-task.js +246 -0
- package/dist/commands/tasks/run-ai-task.js.map +1 -0
- package/dist/commands/tasks/run-ai.d.ts +278 -0
- package/dist/commands/tasks/run-ai.d.ts.map +1 -0
- package/dist/commands/tasks/run-ai.js +179 -0
- package/dist/commands/tasks/run-ai.js.map +1 -0
- package/dist/commands/tasks/run.d.ts +5 -0
- package/dist/commands/tasks/run.d.ts.map +1 -0
- package/dist/commands/tasks/run.js +46 -0
- package/dist/commands/tasks/run.js.map +1 -0
- package/dist/commands/upgrade.d.ts +4 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +17 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/config.d.ts +206 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/env.d.ts +17 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +26 -0
- package/dist/env.js.map +1 -0
- package/dist/helper/find-changes.d.ts +3 -0
- package/dist/helper/find-changes.d.ts.map +1 -0
- package/dist/helper/find-changes.js +106 -0
- package/dist/helper/find-changes.js.map +1 -0
- package/dist/helper/find-changes.test.d.ts +2 -0
- package/dist/helper/find-changes.test.d.ts.map +1 -0
- package/dist/helper/find-changes.test.js +22 -0
- package/dist/helper/find-changes.test.js.map +1 -0
- package/dist/helper/prompts-loader.d.ts +5 -0
- package/dist/helper/prompts-loader.d.ts.map +1 -0
- package/dist/helper/prompts-loader.js +28 -0
- package/dist/helper/prompts-loader.js.map +1 -0
- package/dist/helper/prompts.d.ts +3 -0
- package/dist/helper/prompts.d.ts.map +1 -0
- package/dist/helper/prompts.js +28 -0
- package/dist/helper/prompts.js.map +1 -0
- package/dist/helper/resolve-ai-tasks.d.ts +25 -0
- package/dist/helper/resolve-ai-tasks.d.ts.map +1 -0
- package/dist/helper/resolve-ai-tasks.js +91 -0
- package/dist/helper/resolve-ai-tasks.js.map +1 -0
- package/dist/helper/run-ai.d.ts +12 -0
- package/dist/helper/run-ai.d.ts.map +1 -0
- package/dist/helper/run-ai.js +179 -0
- package/dist/helper/run-ai.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.json +29 -0
- package/package.json +47 -0
- package/prompts/i18n.md +108 -0
- package/prompts/readme-writer.md +120 -0
- package/prompts/user.md +88 -0
- package/prompts/writer.md +13 -0
- package/scripts/gen-prompts.ts +27 -0
- package/src/cli.ts +96 -0
- package/src/commands/doctor/config.ts +30 -0
- package/src/commands/doctor/doctor.test.ts +17 -0
- package/src/commands/doctor/doctor.ts +151 -0
- package/src/commands/doctor/index.ts +21 -0
- package/src/commands/doctor/types.ts +39 -0
- package/src/commands/init.ts +64 -0
- package/src/commands/prompts/list.ts +14 -0
- package/src/commands/prompts/upgrade.ts +16 -0
- package/src/commands/tasks/ai-tools.ts +65 -0
- package/src/commands/tasks/model-providers.ts +54 -0
- package/src/commands/tasks/run-ai-task.ts +263 -0
- package/src/commands/tasks/run.ts +52 -0
- package/src/config.ts +39 -0
- package/src/env.ts +32 -0
- package/src/helper/find-changes.test.ts +23 -0
- package/src/helper/find-changes.ts +109 -0
- package/src/helper/prompts-loader.ts +33 -0
- package/src/helper/resolve-ai-tasks.ts +126 -0
- package/src/index.ts +8 -0
- package/src/prompts.json +29 -0
- package/tsconfig.json +15 -0
- package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
import { FileEntry, gray, red, walkFiles } from "@gaubee/nodekit";
|
2
|
+
import { execSync } from "node:child_process";
|
3
|
+
import path from "node:path";
|
4
|
+
export async function findChangedFilesSinceCommit(messagePattern, cwd = ".") {
|
5
|
+
let repoPath = cwd;
|
6
|
+
try {
|
7
|
+
// č·å Git ä»åŗä½ē½®ļ¼åę¶ē”®äæåØ Git ä»åŗäøčæč”
|
8
|
+
repoPath = execSync("git rev-parse --show-toplevel", { cwd, encoding: "utf8", stdio: "pipe" }).toString().trim();
|
9
|
+
}
|
10
|
+
catch (e) {
|
11
|
+
return [...walkFiles(repoPath)];
|
12
|
+
}
|
13
|
+
const gitCommandOptions = { cwd: repoPath, encoding: "utf8", stdio: "pipe" }; // stdio: 'pipe' to access stdout/stderr on error
|
14
|
+
let baseCommitForDiff = null;
|
15
|
+
try {
|
16
|
+
// 1. ę¾å°å
å«ē¹å®ę č®°ēęę° commit SHA
|
17
|
+
// ä½æēØ --fixed-strings ę„精甮å¹é
å符串 "@jixo"ļ¼čäøęÆä½äøŗę£å蔨达å¼
|
18
|
+
const targetCommitSha = execSync(`git log --grep="${messagePattern}" --fixed-strings -n 1 --pretty=format:%H`, gitCommandOptions).toString().trim();
|
19
|
+
if (targetCommitSha) {
|
20
|
+
console.log(`Found target commit SHA: ${targetCommitSha} for message pattern: "${messagePattern}"`);
|
21
|
+
baseCommitForDiff = targetCommitSha;
|
22
|
+
}
|
23
|
+
else {
|
24
|
+
console.warn(gray(`No commit found with message pattern: "${messagePattern}". Only uncommitted changes will be listed if any.`));
|
25
|
+
}
|
26
|
+
}
|
27
|
+
catch (error) {
|
28
|
+
// git log --grep éåøøåØę²”ęå¹é
ę¶čæå空č¾åŗåéåŗē 0ć
|
29
|
+
// å¦ęčæéåŗéļ¼åÆč½ęÆę“äø„éēé®é¢ć
|
30
|
+
const gitError = error;
|
31
|
+
console.warn(red(`Could not determine base commit with pattern "${messagePattern}". Only uncommitted changes will be listed. Details:`));
|
32
|
+
console.error(gitError.message);
|
33
|
+
}
|
34
|
+
const changedFiles = new Set();
|
35
|
+
// 2. ååŗä»čÆ„ commit ä¹åå° HEAD (ęę°å·²ęäŗ¤) ēęęåę“ęä»¶
|
36
|
+
if (baseCommitForDiff) {
|
37
|
+
try {
|
38
|
+
const committedChangesOutput = execSync(`git diff ${baseCommitForDiff} HEAD --name-only`, gitCommandOptions).toString().trim();
|
39
|
+
if (committedChangesOutput) {
|
40
|
+
committedChangesOutput.split("\n").forEach((file) => {
|
41
|
+
if (file.trim())
|
42
|
+
changedFiles.add(file.trim());
|
43
|
+
});
|
44
|
+
}
|
45
|
+
}
|
46
|
+
catch (error) {
|
47
|
+
const gitError = error;
|
48
|
+
// `git diff` åØęå·®å¼ę¶éåŗē äøŗ1ļ¼ę å·®å¼ę¶äøŗ0ćexecSync é»č®¤åØé0ę¶ęéć
|
49
|
+
if (gitError.status === 1 && gitError.stdout) {
|
50
|
+
// ęå·®å¼
|
51
|
+
const output = gitError.stdout ?? "";
|
52
|
+
if (output) {
|
53
|
+
output.split("\n").forEach((file) => {
|
54
|
+
if (file.trim())
|
55
|
+
changedFiles.add(file.trim());
|
56
|
+
});
|
57
|
+
}
|
58
|
+
}
|
59
|
+
else if (gitError.status !== 0) {
|
60
|
+
// å
¶ä»é误
|
61
|
+
console.error(`Error getting committed changes since ${baseCommitForDiff}: ${gitError.stderr || gitError.message}`);
|
62
|
+
}
|
63
|
+
// status 0 (ę å·®å¼) 蔨示沔ęč¾åŗļ¼ęÆę£åøøę
åµ
|
64
|
+
}
|
65
|
+
}
|
66
|
+
// 3. ååŗå·„ä½åŗäøęŖęäŗ¤ēåę“ęä»¶
|
67
|
+
const uncommittedCommands = [
|
68
|
+
{ cmd: "git diff --name-only --cached", desc: "staged changes" }, // å·²ęå
|
69
|
+
{ cmd: "git diff --name-only", desc: "unstaged changes" }, // ęŖęå (对ęÆå·„ä½åŗåęååŗ)
|
70
|
+
{ cmd: "git ls-files --others --exclude-standard", desc: "untracked files" }, // ęŖč·čøŖ
|
71
|
+
];
|
72
|
+
for (const item of uncommittedCommands) {
|
73
|
+
try {
|
74
|
+
const output = execSync(item.cmd, gitCommandOptions).toString().trim();
|
75
|
+
if (output) {
|
76
|
+
output.split("\n").forEach((file) => {
|
77
|
+
if (file.trim())
|
78
|
+
changedFiles.add(file.trim());
|
79
|
+
});
|
80
|
+
}
|
81
|
+
}
|
82
|
+
catch (error) {
|
83
|
+
const gitError = error;
|
84
|
+
if (item.cmd.startsWith("git diff") && gitError.status === 1 && gitError.stdout) {
|
85
|
+
// git diff ęå·®å¼
|
86
|
+
const output = gitError.stdout ?? "";
|
87
|
+
if (output) {
|
88
|
+
output.split("\n").forEach((file) => {
|
89
|
+
if (file.trim())
|
90
|
+
changedFiles.add(file.trim());
|
91
|
+
});
|
92
|
+
}
|
93
|
+
}
|
94
|
+
else if (gitError.status !== 0 && !(item.cmd.startsWith("git diff") && gitError.status === 1)) {
|
95
|
+
// å
¶ä»é误
|
96
|
+
// åÆ¹äŗ ls-filesļ¼å¦ęåŗéļ¼ä¹č®°å½
|
97
|
+
console.error(`Error getting ${item.desc}: ${gitError.stderr || gitError.message}`);
|
98
|
+
}
|
99
|
+
// `git ls-files` åØę²”ęęä»¶ę¶éåŗē äøŗ0ļ¼č¾åŗäøŗē©ŗć
|
100
|
+
// `git diff` åØę²”ęå·®å¼ę¶éåŗē äøŗ0ļ¼č¾åŗäøŗē©ŗć
|
101
|
+
}
|
102
|
+
}
|
103
|
+
// čæåēøåƹäŗä»åŗę ¹ē®å½ēęä»¶č·Æå¾
|
104
|
+
return [...changedFiles].map((filepath) => new FileEntry(path.resolve(repoPath, filepath), { cwd: repoPath }));
|
105
|
+
}
|
106
|
+
//# sourceMappingURL=find-changes.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"find-changes.js","sourceRoot":"","sources":["../../src/helper/find-changes.ts"],"names":[],"mappings":"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","sourcesContent":["import {FileEntry, gray, red, walkFiles} from \"@gaubee/nodekit\";\nimport {type ExecException, execSync} from \"node:child_process\";\nimport path from \"node:path\";\n\ninterface GitError extends ExecException {\n status?: number | null;\n // stderr?: Buffer | string;\n // stdout?: Buffer | string;\n}\n\nexport async function findChangedFilesSinceCommit(messagePattern: string, cwd: string = \".\"): Promise<FileEntry[]> {\n let repoPath = cwd;\n try {\n // č·å Git ä»åŗä½ē½®ļ¼åę¶ē”®äæåØ Git ä»åŗäøčæč”\n repoPath = execSync(\"git rev-parse --show-toplevel\", {cwd, encoding: \"utf8\", stdio: \"pipe\"}).toString().trim();\n } catch (e) {\n return [...walkFiles(repoPath)];\n }\n const gitCommandOptions = {cwd: repoPath, encoding: \"utf8\" as BufferEncoding, stdio: \"pipe\" as \"pipe\"}; // stdio: 'pipe' to access stdout/stderr on error\n\n let baseCommitForDiff: string | null = null;\n\n try {\n // 1. ę¾å°å
å«ē¹å®ę č®°ēęę° commit SHA\n // ä½æēØ --fixed-strings ę„精甮å¹é
å符串 \"@jixo\"ļ¼čäøęÆä½äøŗę£å蔨达å¼\n const targetCommitSha = execSync(`git log --grep=\"${messagePattern}\" --fixed-strings -n 1 --pretty=format:%H`, gitCommandOptions).toString().trim();\n\n if (targetCommitSha) {\n console.log(`Found target commit SHA: ${targetCommitSha} for message pattern: \"${messagePattern}\"`);\n baseCommitForDiff = targetCommitSha;\n } else {\n console.warn(gray(`No commit found with message pattern: \"${messagePattern}\". Only uncommitted changes will be listed if any.`));\n }\n } catch (error) {\n // git log --grep éåøøåØę²”ęå¹é
ę¶čæå空č¾åŗåéåŗē 0ć\n // å¦ęčæéåŗéļ¼åÆč½ęÆę“äø„éēé®é¢ć\n const gitError = error as GitError;\n console.warn(red(`Could not determine base commit with pattern \"${messagePattern}\". Only uncommitted changes will be listed. Details:`));\n console.error(gitError.message);\n }\n\n const changedFiles = new Set<string>();\n\n // 2. ååŗä»čÆ„ commit ä¹åå° HEAD (ęę°å·²ęäŗ¤) ēęęåę“ęä»¶\n if (baseCommitForDiff) {\n try {\n const committedChangesOutput = execSync(`git diff ${baseCommitForDiff} HEAD --name-only`, gitCommandOptions).toString().trim();\n if (committedChangesOutput) {\n committedChangesOutput.split(\"\\n\").forEach((file) => {\n if (file.trim()) changedFiles.add(file.trim());\n });\n }\n } catch (error) {\n const gitError = error as GitError;\n // `git diff` åØęå·®å¼ę¶éåŗē äøŗ1ļ¼ę å·®å¼ę¶äøŗ0ćexecSync é»č®¤åØé0ę¶ęéć\n if (gitError.status === 1 && gitError.stdout) {\n // ęå·®å¼\n const output = gitError.stdout ?? \"\";\n if (output) {\n output.split(\"\\n\").forEach((file) => {\n if (file.trim()) changedFiles.add(file.trim());\n });\n }\n } else if (gitError.status !== 0) {\n // å
¶ä»é误\n console.error(`Error getting committed changes since ${baseCommitForDiff}: ${gitError.stderr || gitError.message}`);\n }\n // status 0 (ę å·®å¼) 蔨示沔ęč¾åŗļ¼ęÆę£åøøę
åµ\n }\n }\n\n // 3. ååŗå·„ä½åŗäøęŖęäŗ¤ēåę“ęä»¶\n const uncommittedCommands = [\n {cmd: \"git diff --name-only --cached\", desc: \"staged changes\"}, // å·²ęå\n {cmd: \"git diff --name-only\", desc: \"unstaged changes\"}, // ęŖęå (对ęÆå·„ä½åŗåęååŗ)\n {cmd: \"git ls-files --others --exclude-standard\", desc: \"untracked files\"}, // ęŖč·čøŖ\n ];\n\n for (const item of uncommittedCommands) {\n try {\n const output = execSync(item.cmd, gitCommandOptions).toString().trim();\n if (output) {\n output.split(\"\\n\").forEach((file) => {\n if (file.trim()) changedFiles.add(file.trim());\n });\n }\n } catch (error) {\n const gitError = error as GitError;\n if (item.cmd.startsWith(\"git diff\") && gitError.status === 1 && gitError.stdout) {\n // git diff ęå·®å¼\n const output = gitError.stdout ?? \"\";\n if (output) {\n output.split(\"\\n\").forEach((file) => {\n if (file.trim()) changedFiles.add(file.trim());\n });\n }\n } else if (gitError.status !== 0 && !(item.cmd.startsWith(\"git diff\") && gitError.status === 1)) {\n // å
¶ä»é误\n // åÆ¹äŗ ls-filesļ¼å¦ęåŗéļ¼ä¹č®°å½\n console.error(`Error getting ${item.desc}: ${gitError.stderr || gitError.message}`);\n }\n // `git ls-files` åØę²”ęęä»¶ę¶éåŗē äøŗ0ļ¼č¾åŗäøŗē©ŗć\n // `git diff` åØę²”ęå·®å¼ę¶éåŗē äøŗ0ļ¼č¾åŗäøŗē©ŗć\n }\n }\n\n // čæåēøåƹäŗä»åŗę ¹ē®å½ēęä»¶č·Æå¾\n return [...changedFiles].map((filepath) => new FileEntry(path.resolve(repoPath, filepath), {cwd: repoPath}));\n}\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"find-changes.test.d.ts","sourceRoot":"","sources":["../../src/helper/find-changes.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { import_meta_ponyfill } from "import-meta-ponyfill";
|
2
|
+
import path from "node:path";
|
3
|
+
import { findChangedFilesSinceCommit } from "./find-changes.js";
|
4
|
+
// --- 使ēØē¤ŗä¾ ---
|
5
|
+
async function test() {
|
6
|
+
const messagePattern = "@jixo"; // ä½ č¦ęē“¢ē commit message å
容
|
7
|
+
const repoDir = "."; // Git ä»åŗēč·Æå¾ļ¼é»č®¤äøŗå½åē®å½
|
8
|
+
console.log(`Searching for changes since commit with message containing "${messagePattern}" in ${path.resolve(repoDir)}...`);
|
9
|
+
const files = await findChangedFilesSinceCommit(messagePattern, repoDir);
|
10
|
+
if (files.length > 0) {
|
11
|
+
console.log("\nChanged files (relative to git root):");
|
12
|
+
}
|
13
|
+
else {
|
14
|
+
console.log("\nNo changed files found based on the criteria.");
|
15
|
+
}
|
16
|
+
return files;
|
17
|
+
}
|
18
|
+
if (import_meta_ponyfill(import.meta).main) {
|
19
|
+
const files = await test();
|
20
|
+
console.log(files.map((file) => file.path));
|
21
|
+
}
|
22
|
+
//# sourceMappingURL=find-changes.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"find-changes.test.js","sourceRoot":"","sources":["../../src/helper/find-changes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,2BAA2B,EAAC,MAAM,mBAAmB,CAAC;AAE9D,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,0BAA0B;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,oBAAoB;IAEzC,OAAO,CAAC,GAAG,CAAC,+DAA+D,cAAc,QAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7H,MAAM,KAAK,GAAG,MAAM,2BAA2B,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAEzE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["import {import_meta_ponyfill} from \"import-meta-ponyfill\";\nimport path from \"node:path\";\nimport {findChangedFilesSinceCommit} from \"./find-changes.js\";\n\n// --- 使ēØē¤ŗä¾ ---\nasync function test() {\n const messagePattern = \"@jixo\"; // ä½ č¦ęē“¢ē commit message å
容\n const repoDir = \".\"; // Git ä»åŗēč·Æå¾ļ¼é»č®¤äøŗå½åē®å½\n\n console.log(`Searching for changes since commit with message containing \"${messagePattern}\" in ${path.resolve(repoDir)}...`);\n const files = await findChangedFilesSinceCommit(messagePattern, repoDir);\n\n if (files.length > 0) {\n console.log(\"\\nChanged files (relative to git root):\");\n } else {\n console.log(\"\\nNo changed files found based on the criteria.\");\n }\n return files;\n}\nif (import_meta_ponyfill(import.meta).main) {\n const files = await test();\n console.log(files.map((file) => file.path));\n}\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import type { ModelMessage } from "ai";
|
2
|
+
import defaultPrompts from "../prompts.json";
|
3
|
+
export declare const getPromptConfigs: import("@gaubee/util").FuncRemember<() => typeof defaultPrompts, void | ((this: unknown) => any)>;
|
4
|
+
export declare const getModelMessage: (agents: string[]) => ModelMessage[];
|
5
|
+
//# sourceMappingURL=prompts-loader.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"prompts-loader.d.ts","sourceRoot":"","sources":["../../src/helper/prompts-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,IAAI,CAAC;AAErC,OAAO,cAAc,MAAM,iBAAiB,CAAqB;AAGjE,eAAO,MAAM,gBAAgB,4CAAqB,OAAO,cAAc,kCAMrE,CAAC;AAIH,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,mBAc/C,CAAC"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import { createResolverByRootFile } from "@gaubee/node";
|
2
|
+
import { readJson } from "@gaubee/nodekit";
|
3
|
+
import { func_remember } from "@gaubee/util";
|
4
|
+
import fs from "node:fs";
|
5
|
+
import defaultPrompts from "../prompts.json" with { type: "json" };
|
6
|
+
const rootResolver = createResolverByRootFile(import.meta.url);
|
7
|
+
export const getPromptConfigs = func_remember(() => {
|
8
|
+
const download_prompts_json_filepath = rootResolver("prompts.json");
|
9
|
+
if (fs.existsSync(download_prompts_json_filepath)) {
|
10
|
+
return readJson(download_prompts_json_filepath);
|
11
|
+
}
|
12
|
+
return defaultPrompts;
|
13
|
+
});
|
14
|
+
export const getModelMessage = (agents) => {
|
15
|
+
const promptConfigs = getPromptConfigs();
|
16
|
+
const modelMessage = [];
|
17
|
+
const names = agents.slice();
|
18
|
+
for (const name of names) {
|
19
|
+
const promptConfig = name in promptConfigs ? Reflect.get(promptConfigs, name) : null;
|
20
|
+
if (!promptConfig) {
|
21
|
+
continue;
|
22
|
+
}
|
23
|
+
modelMessage.unshift({ role: "system", content: promptConfig.content });
|
24
|
+
names.push(...promptConfig.data.parent);
|
25
|
+
}
|
26
|
+
return modelMessage;
|
27
|
+
};
|
28
|
+
//# sourceMappingURL=prompts-loader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"prompts-loader.js","sourceRoot":"","sources":["../../src/helper/prompts-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAC;AACtD,OAAO,EAAC,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,cAAc,MAAM,iBAAiB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AACjE,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC,GAA0B,EAAE;IACxE,MAAM,8BAA8B,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAgB,EAAE,EAAE;IAClD,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,IAAI,IAAI,aAAa,CAAC,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAsB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3G,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC","sourcesContent":["import {createResolverByRootFile} from \"@gaubee/node\";\nimport {readJson} from \"@gaubee/nodekit\";\nimport {func_remember} from \"@gaubee/util\";\nimport type {ModelMessage} from \"ai\";\nimport fs from \"node:fs\";\nimport defaultPrompts from \"../prompts.json\" with {type: \"json\"};\nconst rootResolver = createResolverByRootFile(import.meta.url);\n\nexport const getPromptConfigs = func_remember((): typeof defaultPrompts => {\n const download_prompts_json_filepath = rootResolver(\"prompts.json\");\n if (fs.existsSync(download_prompts_json_filepath)) {\n return readJson(download_prompts_json_filepath);\n }\n return defaultPrompts;\n});\ntype PromptConfigs = typeof defaultPrompts;\ntype PromptItemConfig = PromptConfigs[keyof PromptConfigs];\n\nexport const getModelMessage = (agents: string[]) => {\n const promptConfigs = getPromptConfigs();\n const modelMessage: ModelMessage[] = [];\n const names = agents.slice();\n for (const name of names) {\n const promptConfig = name in promptConfigs ? (Reflect.get(promptConfigs, name) as PromptItemConfig) : null;\n if (!promptConfig) {\n continue;\n }\n modelMessage.unshift({role: \"system\", content: promptConfig.content});\n names.push(...promptConfig.data.parent);\n }\n\n return modelMessage;\n};\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/helper/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,IAAI,CAAC;AAerC,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,mBAc/C,CAAC"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import { createResolverByRootFile } from "@gaubee/node";
|
2
|
+
import { readJson } from "@gaubee/nodekit";
|
3
|
+
import { func_remember } from "@gaubee/util";
|
4
|
+
import fs from "node:fs";
|
5
|
+
import defaultPrompts from "../prompts.json" with { type: "json" };
|
6
|
+
const rootResolver = createResolverByRootFile(import.meta.url);
|
7
|
+
const getPromptConfigs = func_remember(() => {
|
8
|
+
const download_prompts_json_filepath = rootResolver("prompts.json");
|
9
|
+
if (fs.existsSync(download_prompts_json_filepath)) {
|
10
|
+
return readJson(download_prompts_json_filepath);
|
11
|
+
}
|
12
|
+
return defaultPrompts;
|
13
|
+
});
|
14
|
+
export const getModelMessage = (agents) => {
|
15
|
+
const promptConfigs = getPromptConfigs();
|
16
|
+
const modelMessage = [];
|
17
|
+
const names = agents.slice();
|
18
|
+
for (const name of names) {
|
19
|
+
const promptConfig = name in promptConfigs ? Reflect.get(promptConfigs, name) : null;
|
20
|
+
if (!promptConfig) {
|
21
|
+
continue;
|
22
|
+
}
|
23
|
+
modelMessage.unshift({ role: "system", content: promptConfig.content });
|
24
|
+
names.push(...promptConfig.data.parent);
|
25
|
+
}
|
26
|
+
return modelMessage;
|
27
|
+
};
|
28
|
+
//# sourceMappingURL=prompts.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/helper/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAC;AACtD,OAAO,EAAC,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,cAAc,MAAM,iBAAiB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AACjE,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/D,MAAM,gBAAgB,GAAG,aAAa,CAAC,GAA0B,EAAE;IACjE,MAAM,8BAA8B,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAgB,EAAE,EAAE;IAClD,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,IAAI,IAAI,aAAa,CAAC,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAsB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3G,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC","sourcesContent":["import {createResolverByRootFile} from \"@gaubee/node\";\nimport {readJson} from \"@gaubee/nodekit\";\nimport {func_remember} from \"@gaubee/util\";\nimport type {ModelMessage} from \"ai\";\nimport fs from \"node:fs\";\nimport defaultPrompts from \"../prompts.json\" with {type: \"json\"};\nconst rootResolver = createResolverByRootFile(import.meta.url);\n\nconst getPromptConfigs = func_remember((): typeof defaultPrompts => {\n const download_prompts_json_filepath = rootResolver(\"prompts.json\");\n if (fs.existsSync(download_prompts_json_filepath)) {\n return readJson(download_prompts_json_filepath);\n }\n return defaultPrompts;\n});\ntype PromptConfigs = typeof defaultPrompts;\ntype PromptItemConfig = PromptConfigs[keyof PromptConfigs];\n\nexport const getModelMessage = (agents: string[]) => {\n const promptConfigs = getPromptConfigs();\n const modelMessage: ModelMessage[] = [];\n const names = agents.slice();\n for (const name of names) {\n const promptConfig = name in promptConfigs ? (Reflect.get(promptConfigs, name) as PromptItemConfig) : null;\n if (!promptConfig) {\n continue;\n }\n modelMessage.unshift({role: \"system\", content: promptConfig.content});\n names.push(...promptConfig.data.parent);\n }\n\n return modelMessage;\n};\n"]}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { type JixoConfig } from "../config.js";
|
2
|
+
/**
|
3
|
+
* å° config.tasks å段转åęå
·ä½ē ai-tasks äæ”ęÆ
|
4
|
+
* @param cwd
|
5
|
+
* @param config_tasks
|
6
|
+
* @returns
|
7
|
+
*/
|
8
|
+
export declare const resolveAiTasks: (cwd: string, config_tasks: JixoConfig["tasks"]) => ({
|
9
|
+
data: {
|
10
|
+
[key: string]: any;
|
11
|
+
};
|
12
|
+
content: string;
|
13
|
+
} & {
|
14
|
+
name: string;
|
15
|
+
cwd: string;
|
16
|
+
dir: string;
|
17
|
+
agents: string[];
|
18
|
+
model: string;
|
19
|
+
useMemory: string;
|
20
|
+
useLog: string;
|
21
|
+
log: string;
|
22
|
+
startTime: string;
|
23
|
+
})[];
|
24
|
+
export type AiTask = ReturnType<typeof resolveAiTasks>[number];
|
25
|
+
//# sourceMappingURL=resolve-ai-tasks.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"resolve-ai-tasks.d.ts","sourceRoot":"","sources":["../../src/helper/resolve-ai-tasks.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,KAAK,UAAU,EAAC,MAAM,cAAc,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,EAAE,cAAc,UAAU,CAAC,OAAO,CAAC;UAGnE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC;aACjB,MAAM;;UAGT,MAAM;SACP,MAAM;SACN,MAAM;YACH,MAAM,EAAE;WACT,MAAM;eACF,MAAM;YACT,MAAM;SACT,MAAM;eACA,MAAM;IA+FpB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
@@ -0,0 +1,91 @@
|
|
1
|
+
import { matter, normalizeFilePath, readMarkdown, walkFiles, writeMarkdown } from "@gaubee/nodekit";
|
2
|
+
import fs from "node:fs";
|
3
|
+
import path from "node:path";
|
4
|
+
import { match, P } from "ts-pattern";
|
5
|
+
import z from "zod";
|
6
|
+
import {} from "../config.js";
|
7
|
+
/**
|
8
|
+
* å° config.tasks å段转åęå
·ä½ē ai-tasks äæ”ęÆ
|
9
|
+
* @param cwd
|
10
|
+
* @param config_tasks
|
11
|
+
* @returns
|
12
|
+
*/
|
13
|
+
export const resolveAiTasks = (cwd, config_tasks) => {
|
14
|
+
const config_tasks_arr = Array.isArray(config_tasks) ? config_tasks : [config_tasks];
|
15
|
+
const tasks = [];
|
16
|
+
const addTask = (ai_task, options) => {
|
17
|
+
const { name: inner_task_name, dir: _task_dir = cwd } = ai_task.data;
|
18
|
+
const task_dir = normalizeFilePath(path.resolve(cwd, _task_dir));
|
19
|
+
const task_name = inner_task_name || options.defaultName;
|
20
|
+
const useMemory = ai_task.data.useMemory || task_name;
|
21
|
+
const useLog = ai_task.data.useLog || task_name;
|
22
|
+
const log_filepath = path.join(cwd, `.jixo/${useLog}.log.md`);
|
23
|
+
if (!fs.existsSync(log_filepath)) {
|
24
|
+
writeMarkdown(log_filepath, ``, {
|
25
|
+
createTime: new Date().toISOString(),
|
26
|
+
updateTime: new Date().toISOString(),
|
27
|
+
});
|
28
|
+
}
|
29
|
+
tasks.push({
|
30
|
+
...ai_task,
|
31
|
+
name: task_name,
|
32
|
+
cwd: cwd,
|
33
|
+
dir: task_dir,
|
34
|
+
agents: match(z.union([z.string(), z.string().array()]).safeParse(ai_task.data.agents))
|
35
|
+
.with({ success: true, data: P.select() }, (agents) => {
|
36
|
+
return Array.isArray(agents) ? agents : agents.split(/\s+/);
|
37
|
+
})
|
38
|
+
.otherwise(() => []),
|
39
|
+
model: match(z.string().safeParse(ai_task.data.model))
|
40
|
+
.with({ success: true, data: P.select() }, (model) => model)
|
41
|
+
.otherwise(() => ""),
|
42
|
+
useMemory,
|
43
|
+
useLog,
|
44
|
+
log: fs.readFileSync(log_filepath, "utf-8"),
|
45
|
+
startTime: new Date().toISOString(),
|
46
|
+
});
|
47
|
+
};
|
48
|
+
for (const config_task of config_tasks_arr) {
|
49
|
+
match(config_task)
|
50
|
+
.with({
|
51
|
+
type: "dir",
|
52
|
+
dirname: P.string.select(),
|
53
|
+
}, (dirname) => {
|
54
|
+
for (const entry of walkFiles(path.resolve(cwd, dirname), {
|
55
|
+
matchFile(entry) {
|
56
|
+
return entry.name.endsWith(".task.md");
|
57
|
+
},
|
58
|
+
})) {
|
59
|
+
addTask(readMarkdown(entry.path), {
|
60
|
+
defaultName: entry.name.slice(0, -".task.md".length),
|
61
|
+
});
|
62
|
+
}
|
63
|
+
})
|
64
|
+
.with({
|
65
|
+
type: "file",
|
66
|
+
filename: P.string.select("filename"),
|
67
|
+
name: P.string.select("name").optional(),
|
68
|
+
}, (m) => {
|
69
|
+
addTask(readMarkdown(m.filename), {
|
70
|
+
defaultName: m.name ?? m.filename.slice(0, -".task.md".length),
|
71
|
+
});
|
72
|
+
})
|
73
|
+
.with(P.string.select(), (mdContent) => {
|
74
|
+
addTask(matter(mdContent), {
|
75
|
+
defaultName: `${tasks.length + 1}`,
|
76
|
+
});
|
77
|
+
})
|
78
|
+
.with({
|
79
|
+
type: "prompt",
|
80
|
+
content: P.string.select("content"),
|
81
|
+
name: P.string.select("name").optional(),
|
82
|
+
}, (m) => {
|
83
|
+
addTask(matter(m.content), {
|
84
|
+
defaultName: m.name ?? `${tasks.length + 1}`,
|
85
|
+
});
|
86
|
+
})
|
87
|
+
.exhaustive();
|
88
|
+
}
|
89
|
+
return tasks;
|
90
|
+
};
|
91
|
+
//# sourceMappingURL=resolve-ai-tasks.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"resolve-ai-tasks.js","sourceRoot":"","sources":["../../src/helper/resolve-ai-tasks.ts"],"names":[],"mappings":"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","sourcesContent":["import {matter, normalizeFilePath, readMarkdown, walkFiles, writeMarkdown} from \"@gaubee/nodekit\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {match, P} from \"ts-pattern\";\nimport z from \"zod\";\nimport {type JixoConfig} from \"../config.js\";\n\n/**\n * å° config.tasks å段转åęå
·ä½ē ai-tasks äæ”ęÆ\n * @param cwd\n * @param config_tasks\n * @returns\n */\nexport const resolveAiTasks = (cwd: string, config_tasks: JixoConfig[\"tasks\"]) => {\n const config_tasks_arr = Array.isArray(config_tasks) ? config_tasks : [config_tasks];\n type TaskBase = {\n data: {[key: string]: any};\n content: string;\n };\n type AiTask = TaskBase & {\n name: string;\n cwd: string;\n dir: string;\n agents: string[];\n model: string;\n useMemory: string;\n useLog: string;\n log: string;\n startTime: string;\n };\n const tasks: AiTask[] = [];\n const addTask = (\n ai_task: TaskBase,\n options: {\n defaultName: string;\n },\n ) => {\n const {name: inner_task_name, dir: _task_dir = cwd} = ai_task.data;\n const task_dir = normalizeFilePath(path.resolve(cwd, _task_dir));\n\n const task_name = inner_task_name || options.defaultName;\n const useMemory = ai_task.data.useMemory || task_name;\n const useLog = ai_task.data.useLog || task_name;\n\n const log_filepath = path.join(cwd, `.jixo/${useLog}.log.md`);\n if (!fs.existsSync(log_filepath)) {\n writeMarkdown(log_filepath, ``, {\n createTime: new Date().toISOString(),\n updateTime: new Date().toISOString(),\n });\n }\n\n tasks.push({\n ...ai_task,\n name: task_name,\n cwd: cwd,\n dir: task_dir,\n agents: match(z.union([z.string(), z.string().array()]).safeParse(ai_task.data.agents))\n .with({success: true, data: P.select()}, (agents) => {\n return Array.isArray(agents) ? agents : agents.split(/\\s+/);\n })\n .otherwise(() => []),\n model: match(z.string().safeParse(ai_task.data.model))\n .with({success: true, data: P.select()}, (model) => model)\n .otherwise(() => \"\"),\n useMemory,\n useLog,\n log: fs.readFileSync(log_filepath, \"utf-8\"),\n startTime: new Date().toISOString(),\n });\n };\n\n for (const config_task of config_tasks_arr) {\n match(config_task)\n .with(\n {\n type: \"dir\",\n dirname: P.string.select(),\n },\n (dirname) => {\n for (const entry of walkFiles(path.resolve(cwd, dirname), {\n matchFile(entry) {\n return entry.name.endsWith(\".task.md\");\n },\n })) {\n addTask(readMarkdown(entry.path), {\n defaultName: entry.name.slice(0, -\".task.md\".length),\n });\n }\n },\n )\n .with(\n {\n type: \"file\",\n filename: P.string.select(\"filename\"),\n name: P.string.select(\"name\").optional(),\n },\n (m) => {\n addTask(readMarkdown(m.filename), {\n defaultName: m.name ?? m.filename.slice(0, -\".task.md\".length),\n });\n },\n )\n .with(P.string.select(), (mdContent) => {\n addTask(matter(mdContent), {\n defaultName: `${tasks.length + 1}`,\n });\n })\n .with(\n {\n type: \"prompt\",\n content: P.string.select(\"content\"),\n name: P.string.select(\"name\").optional(),\n },\n (m) => {\n addTask(matter(m.content), {\n defaultName: m.name ?? `${tasks.length + 1}`,\n });\n },\n )\n .exhaustive();\n }\n return tasks;\n};\n\nexport type AiTask = ReturnType<typeof resolveAiTasks>[number];\n"]}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { FileEntry } from "@gaubee/nodekit";
|
2
|
+
import type { AiTask } from "./resolve-ai-tasks.js";
|
3
|
+
export declare const providers: {
|
4
|
+
readonly deepseek: import("@ai-sdk/deepseek").DeepSeekProvider;
|
5
|
+
readonly anthropic: import("@ai-sdk/anthropic").AnthropicProvider;
|
6
|
+
readonly google: import("@ai-sdk/google").GoogleGenerativeAIProvider;
|
7
|
+
readonly openai: import("@ai-sdk/openai").OpenAIProvider;
|
8
|
+
readonly xai: import("@ai-sdk/xai").XaiProvider;
|
9
|
+
readonly deepinfra: import("@ai-sdk/deepinfra").DeepInfraProvider;
|
10
|
+
};
|
11
|
+
export declare const runAiTask: (ai_task: AiTask, allFiles: FileEntry[], changedFiles: FileEntry[]) => Promise<void>;
|
12
|
+
//# sourceMappingURL=run-ai.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"run-ai.d.ts","sourceRoot":"","sources":["../../src/helper/run-ai.ts"],"names":[],"mappings":"AAMA,OAAO,EAAO,SAAS,EAAuB,MAAM,iBAAiB,CAAC;AAOtE,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,uBAAuB,CAAC;AAGlD,eAAO,MAAM,SAAS;;;;;;;CA2CpB,CAAC;AAsEH,eAAO,MAAM,SAAS,GAAU,SAAS,MAAM,EAAE,UAAU,SAAS,EAAE,EAAE,cAAc,SAAS,EAAE,kBAyDhG,CAAC"}
|
@@ -0,0 +1,179 @@
|
|
1
|
+
import { createAnthropic } from "@ai-sdk/anthropic";
|
2
|
+
import { createDeepInfra } from "@ai-sdk/deepinfra";
|
3
|
+
import { createDeepSeek } from "@ai-sdk/deepseek";
|
4
|
+
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
5
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
6
|
+
import { createXai } from "@ai-sdk/xai";
|
7
|
+
import { cyan, FileEntry, gray, green, spinner } from "@gaubee/nodekit";
|
8
|
+
import { func_lazy, func_remember, map_get_or_put_async, obj_lazify } from "@gaubee/util";
|
9
|
+
import { experimental_createMCPClient as createMCPClient, streamText } from "ai";
|
10
|
+
import { Experimental_StdioMCPTransport } from "ai/mcp-stdio";
|
11
|
+
import { match, P } from "ts-pattern";
|
12
|
+
import { safeEnv } from "../env.js";
|
13
|
+
import { getModelMessage, getPromptConfigs } from "./prompts-loader.js";
|
14
|
+
// const wrapper = (provider:)
|
15
|
+
export const providers = obj_lazify({
|
16
|
+
get deepseek() {
|
17
|
+
return createDeepSeek({
|
18
|
+
baseURL: safeEnv.JIXO_DEEPSEEK_BASE_URL || undefined,
|
19
|
+
apiKey: safeEnv.JIXO_DEEPSEEK_API_KEY,
|
20
|
+
});
|
21
|
+
},
|
22
|
+
get anthropic() {
|
23
|
+
// const bashTool = anthropic.tools.bash_20250124({
|
24
|
+
// execute: async ({command, restart}) => execSync(command).toString(),
|
25
|
+
// });
|
26
|
+
const provider = createAnthropic({
|
27
|
+
baseURL: safeEnv.JIXO_ANTHROPIC_BASE_URL || undefined,
|
28
|
+
apiKey: safeEnv.JIXO_ANTHROPIC_API_KEY,
|
29
|
+
});
|
30
|
+
return provider;
|
31
|
+
},
|
32
|
+
get google() {
|
33
|
+
return createGoogleGenerativeAI({
|
34
|
+
baseURL: safeEnv.JIXO_GOOGLE_BASE_URL || undefined,
|
35
|
+
apiKey: safeEnv.JIXO_GOOGLE_API_KEY,
|
36
|
+
});
|
37
|
+
},
|
38
|
+
get openai() {
|
39
|
+
return createOpenAI({
|
40
|
+
baseURL: safeEnv.JIXO_OPENAI_BASE_URL || undefined,
|
41
|
+
apiKey: safeEnv.JIXO_OPENAI_API_KEY,
|
42
|
+
organization: safeEnv.JIXO_OPENAI_ORGANIZATION || undefined,
|
43
|
+
});
|
44
|
+
},
|
45
|
+
get xai() {
|
46
|
+
return createXai({
|
47
|
+
baseURL: safeEnv.JIXO_XAI_BASE_URL || undefined,
|
48
|
+
apiKey: safeEnv.JIXO_XAI_API_KEY,
|
49
|
+
});
|
50
|
+
},
|
51
|
+
get deepinfra() {
|
52
|
+
return createDeepInfra({
|
53
|
+
baseURL: safeEnv.JIXO_DEEPINFRA_BASE_URL || undefined,
|
54
|
+
apiKey: safeEnv.JIXO_DEEPINFRA_API_KEY,
|
55
|
+
});
|
56
|
+
},
|
57
|
+
});
|
58
|
+
const getModel = (model) => {
|
59
|
+
return match(model)
|
60
|
+
.with(P.string.startsWith("deepseek-"), (model) => providers.deepseek(model))
|
61
|
+
.otherwise(() => {
|
62
|
+
if (safeEnv.JIXO_DEEPSEEK_API_KEY) {
|
63
|
+
return providers.deepseek("deepseek-chat");
|
64
|
+
}
|
65
|
+
if (safeEnv.JIXO_GOOGLE_API_KEY) {
|
66
|
+
return providers.google("gemini-2.5-pro-preview-05-06");
|
67
|
+
}
|
68
|
+
if (safeEnv.JIXO_OPENAI_API_KEY) {
|
69
|
+
return providers.openai("o3-mini");
|
70
|
+
}
|
71
|
+
if (safeEnv.JIXO_ANTHROPIC_API_KEY) {
|
72
|
+
return providers.anthropic("claude-4-sonnet-20250514");
|
73
|
+
}
|
74
|
+
if (safeEnv.JIXO_XAI_API_KEY) {
|
75
|
+
return providers.xai("grok-3-beta");
|
76
|
+
}
|
77
|
+
if (safeEnv.JIXO_DEEPINFRA_API_KEY) {
|
78
|
+
return providers.deepinfra("meta-llama/Meta-Llama-3.1-405B-Instruct");
|
79
|
+
}
|
80
|
+
return providers.deepseek("deepseek-reasoner");
|
81
|
+
});
|
82
|
+
};
|
83
|
+
const tools = {
|
84
|
+
fileSystem: func_lazy(() => {
|
85
|
+
const map = new Map();
|
86
|
+
return (cwd) => {
|
87
|
+
return map_get_or_put_async(map, cwd, async () => {
|
88
|
+
const mcpClient = await createMCPClient({
|
89
|
+
transport: new Experimental_StdioMCPTransport({
|
90
|
+
command: "pnpx",
|
91
|
+
args: ["@modelcontextprotocol/server-filesystem", cwd],
|
92
|
+
}),
|
93
|
+
});
|
94
|
+
const tools = await mcpClient.tools();
|
95
|
+
return tools;
|
96
|
+
});
|
97
|
+
};
|
98
|
+
}),
|
99
|
+
fetch: func_remember(async () => {
|
100
|
+
const mcpClient = await createMCPClient({
|
101
|
+
transport: new Experimental_StdioMCPTransport({
|
102
|
+
command: "uvx",
|
103
|
+
args: ["mcp-server-fetch"],
|
104
|
+
}),
|
105
|
+
});
|
106
|
+
const tools = await mcpClient.tools();
|
107
|
+
return tools;
|
108
|
+
}),
|
109
|
+
git: func_lazy(() => {
|
110
|
+
const map = new Map();
|
111
|
+
return (repo) => {
|
112
|
+
return map_get_or_put_async(map, repo, async () => {
|
113
|
+
const mcpClient = await createMCPClient({
|
114
|
+
transport: new Experimental_StdioMCPTransport({
|
115
|
+
command: "uvx",
|
116
|
+
args: ["mcp-server-git", "--repository", repo],
|
117
|
+
}),
|
118
|
+
});
|
119
|
+
const tools = await mcpClient.tools();
|
120
|
+
return tools;
|
121
|
+
});
|
122
|
+
};
|
123
|
+
}),
|
124
|
+
};
|
125
|
+
export const runAiTask = async (ai_task, allFiles, changedFiles) => {
|
126
|
+
const model = getModel(ai_task.model);
|
127
|
+
const modelMessage = getModelMessage(ai_task.agents);
|
128
|
+
modelMessage.push(
|
129
|
+
//
|
130
|
+
{
|
131
|
+
role: "system",
|
132
|
+
content: getPromptConfigs()
|
133
|
+
.base.content //
|
134
|
+
.replaceAll("{{task.name}}", ai_task.name)
|
135
|
+
.replaceAll("{{task.memory}}", ai_task.memory)
|
136
|
+
.replaceAll("{{task.content}}", ai_task.content)
|
137
|
+
.replaceAll("{{allFiles}}", allFiles.map((file) => `- ${file.path}`).join("\n"))
|
138
|
+
.replaceAll("{{changedFiles}}", changedFiles.map((file) => `- ${file.path}`).join("\n")),
|
139
|
+
});
|
140
|
+
// console.log("QAQ modelMessage", modelMessage);
|
141
|
+
// return;
|
142
|
+
const result = streamText({
|
143
|
+
model: model,
|
144
|
+
prompt: modelMessage,
|
145
|
+
tools: {
|
146
|
+
...(await tools.fileSystem(ai_task.cwd)),
|
147
|
+
// ...(await tools.fetch()),
|
148
|
+
// ...(await tools.git(ai_task.cwd)),
|
149
|
+
},
|
150
|
+
onChunk: ({ chunk }) => {
|
151
|
+
if (chunk.type === "reasoning") {
|
152
|
+
if (reasoning === "") {
|
153
|
+
loading.prefixText = "š¤ ";
|
154
|
+
loading.text = "";
|
155
|
+
}
|
156
|
+
reasoning += chunk.text;
|
157
|
+
loading.text = gray(reasoning.split("\n").slice(-3).join("\n"));
|
158
|
+
}
|
159
|
+
},
|
160
|
+
});
|
161
|
+
const loading = spinner(`Connecting To ${model.provider}...`);
|
162
|
+
loading.prefixText = "ā³ ";
|
163
|
+
loading.start();
|
164
|
+
let reasoning = "";
|
165
|
+
let fulltext = "";
|
166
|
+
for await (const text of result.textStream) {
|
167
|
+
if (fulltext === "") {
|
168
|
+
loading.prefixText = "š¤ ";
|
169
|
+
loading.text = "";
|
170
|
+
}
|
171
|
+
fulltext += text;
|
172
|
+
loading.text = fulltext;
|
173
|
+
}
|
174
|
+
loading.stopAndPersist({
|
175
|
+
suffixText: green(`\nā
${cyan(`[${ai_task.name}]`)} Completed\n`),
|
176
|
+
});
|
177
|
+
console.log("QAQ done", result.text);
|
178
|
+
};
|
179
|
+
//# sourceMappingURL=run-ai.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"run-ai.js","sourceRoot":"","sources":["../../src/helper/run-ai.ts"],"names":[],"mappings":"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","sourcesContent":["import {createAnthropic} from \"@ai-sdk/anthropic\";\nimport {createDeepInfra} from \"@ai-sdk/deepinfra\";\nimport {createDeepSeek} from \"@ai-sdk/deepseek\";\nimport {createGoogleGenerativeAI} from \"@ai-sdk/google\";\nimport {createOpenAI} from \"@ai-sdk/openai\";\nimport {createXai} from \"@ai-sdk/xai\";\nimport {cyan, FileEntry, gray, green, spinner} from \"@gaubee/nodekit\";\nimport {func_lazy, func_remember, map_get_or_put_async, obj_lazify} from \"@gaubee/util\";\nimport {experimental_createMCPClient as createMCPClient, streamText, type ModelMessage, type ToolSet} from \"ai\";\nimport {Experimental_StdioMCPTransport} from \"ai/mcp-stdio\";\nimport {match, P} from \"ts-pattern\";\nimport {safeEnv} from \"../env.js\";\nimport {getModelMessage, getPromptConfigs} from \"./prompts-loader.js\";\nimport type {AiTask} from \"./resolve-ai-tasks.js\";\n\n// const wrapper = (provider:)\nexport const providers = obj_lazify({\n get deepseek() {\n return createDeepSeek({\n baseURL: safeEnv.JIXO_DEEPSEEK_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_DEEPSEEK_API_KEY,\n });\n },\n get anthropic() {\n // const bashTool = anthropic.tools.bash_20250124({\n // execute: async ({command, restart}) => execSync(command).toString(),\n // });\n\n const provider = createAnthropic({\n baseURL: safeEnv.JIXO_ANTHROPIC_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_ANTHROPIC_API_KEY,\n });\n return provider;\n },\n get google() {\n return createGoogleGenerativeAI({\n baseURL: safeEnv.JIXO_GOOGLE_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_GOOGLE_API_KEY,\n });\n },\n get openai() {\n return createOpenAI({\n baseURL: safeEnv.JIXO_OPENAI_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_OPENAI_API_KEY,\n organization: safeEnv.JIXO_OPENAI_ORGANIZATION || undefined,\n });\n },\n get xai() {\n return createXai({\n baseURL: safeEnv.JIXO_XAI_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_XAI_API_KEY,\n });\n },\n get deepinfra() {\n return createDeepInfra({\n baseURL: safeEnv.JIXO_DEEPINFRA_BASE_URL || undefined,\n apiKey: safeEnv.JIXO_DEEPINFRA_API_KEY,\n });\n },\n});\nconst getModel = (model?: string) => {\n return match(model)\n .with(P.string.startsWith(\"deepseek-\"), (model) => providers.deepseek(model))\n .otherwise(() => {\n if (safeEnv.JIXO_DEEPSEEK_API_KEY) {\n return providers.deepseek(\"deepseek-chat\");\n }\n if (safeEnv.JIXO_GOOGLE_API_KEY) {\n return providers.google(\"gemini-2.5-pro-preview-05-06\");\n }\n if (safeEnv.JIXO_OPENAI_API_KEY) {\n return providers.openai(\"o3-mini\");\n }\n if (safeEnv.JIXO_ANTHROPIC_API_KEY) {\n return providers.anthropic(\"claude-4-sonnet-20250514\");\n }\n if (safeEnv.JIXO_XAI_API_KEY) {\n return providers.xai(\"grok-3-beta\");\n }\n if (safeEnv.JIXO_DEEPINFRA_API_KEY) {\n return providers.deepinfra(\"meta-llama/Meta-Llama-3.1-405B-Instruct\");\n }\n return providers.deepseek(\"deepseek-reasoner\");\n });\n};\n\nconst tools = {\n fileSystem: func_lazy(() => {\n const map = new Map<string, ToolSet>();\n return (cwd: string) => {\n return map_get_or_put_async(map, cwd, async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"pnpx\",\n args: [\"@modelcontextprotocol/server-filesystem\", cwd],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n });\n };\n }),\n fetch: func_remember(async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"uvx\",\n args: [\"mcp-server-fetch\"],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n }),\n git: func_lazy(() => {\n const map = new Map<string, ToolSet>();\n\n return (repo: string) => {\n return map_get_or_put_async(map, repo, async () => {\n const mcpClient = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: \"uvx\",\n args: [\"mcp-server-git\", \"--repository\", repo],\n }),\n });\n const tools = await mcpClient.tools();\n return tools;\n });\n };\n }),\n};\nexport const runAiTask = async (ai_task: AiTask, allFiles: FileEntry[], changedFiles: FileEntry[]) => {\n const model = getModel(ai_task.model);\n\n const modelMessage: ModelMessage[] = getModelMessage(ai_task.agents);\n modelMessage.push(\n //\n {\n role: \"system\",\n content: getPromptConfigs()\n .base.content //\n .replaceAll(\"{{task.name}}\", ai_task.name)\n .replaceAll(\"{{task.memory}}\", ai_task.memory)\n .replaceAll(\"{{task.content}}\", ai_task.content)\n .replaceAll(\"{{allFiles}}\", allFiles.map((file) => `- ${file.path}`).join(\"\\n\"))\n .replaceAll(\"{{changedFiles}}\", changedFiles.map((file) => `- ${file.path}`).join(\"\\n\")),\n },\n );\n // console.log(\"QAQ modelMessage\", modelMessage);\n // return;\n const result = streamText({\n model: model,\n prompt: modelMessage,\n tools: {\n ...(await tools.fileSystem(ai_task.cwd)),\n // ...(await tools.fetch()),\n // ...(await tools.git(ai_task.cwd)),\n },\n onChunk: ({chunk}) => {\n if (chunk.type === \"reasoning\") {\n if (reasoning === \"\") {\n loading.prefixText = \"š¤ \";\n loading.text = \"\";\n }\n reasoning += chunk.text;\n loading.text = gray(reasoning.split(\"\\n\").slice(-3).join(\"\\n\"));\n }\n },\n });\n const loading = spinner.default(`Connecting To ${model.provider}...`);\n loading.prefixText = \"ā³ \";\n loading.start();\n let reasoning = \"\";\n let fulltext = \"\";\n for await (const text of result.textStream) {\n if (fulltext === \"\") {\n loading.prefixText = \"š¤ \";\n loading.text = \"\";\n }\n fulltext += text;\n loading.text = fulltext;\n }\n\n loading.stopAndPersist({\n suffixText: green(`\\nā
${cyan(`[${ai_task.name}]`)} Completed\\n`),\n });\n\n console.log(\"QAQ done\", result.text);\n};\n"]}
|
package/dist/index.d.ts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|