@jixo/cli 0.12.0 → 0.20.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.
Files changed (117) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +17 -95
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/apply.d.ts +9 -0
  6. package/dist/commands/apply.d.ts.map +1 -0
  7. package/dist/commands/apply.js +59 -0
  8. package/dist/commands/apply.js.map +1 -0
  9. package/dist/commands/gen.d.ts +9 -0
  10. package/dist/commands/gen.d.ts.map +1 -0
  11. package/dist/commands/gen.js +43 -0
  12. package/dist/commands/gen.js.map +1 -0
  13. package/dist/commands/google-aistudio.d.ts +8 -0
  14. package/dist/commands/google-aistudio.d.ts.map +1 -0
  15. package/dist/commands/google-aistudio.js +51 -0
  16. package/dist/commands/google-aistudio.js.map +1 -0
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -4
  20. package/dist/index.js.map +1 -1
  21. package/package.json +4 -25
  22. package/dist/commands/doctor/config.d.ts +0 -3
  23. package/dist/commands/doctor/config.d.ts.map +0 -1
  24. package/dist/commands/doctor/config.js +0 -30
  25. package/dist/commands/doctor/config.js.map +0 -1
  26. package/dist/commands/doctor/doctor.d.ts +0 -18
  27. package/dist/commands/doctor/doctor.d.ts.map +0 -1
  28. package/dist/commands/doctor/doctor.js +0 -125
  29. package/dist/commands/doctor/doctor.js.map +0 -1
  30. package/dist/commands/doctor/doctor.test.d.ts +0 -2
  31. package/dist/commands/doctor/doctor.test.d.ts.map +0 -1
  32. package/dist/commands/doctor/doctor.test.js +0 -14
  33. package/dist/commands/doctor/doctor.test.js.map +0 -1
  34. package/dist/commands/doctor/index.d.ts +0 -2
  35. package/dist/commands/doctor/index.d.ts.map +0 -1
  36. package/dist/commands/doctor/index.js +0 -19
  37. package/dist/commands/doctor/index.js.map +0 -1
  38. package/dist/commands/doctor/types.d.ts +0 -30
  39. package/dist/commands/doctor/types.d.ts.map +0 -1
  40. package/dist/commands/doctor/types.js +0 -3
  41. package/dist/commands/doctor/types.js.map +0 -1
  42. package/dist/commands/init.d.ts +0 -2
  43. package/dist/commands/init.d.ts.map +0 -1
  44. package/dist/commands/init.js +0 -63
  45. package/dist/commands/init.js.map +0 -1
  46. package/dist/commands/prompts/list.d.ts +0 -2
  47. package/dist/commands/prompts/list.d.ts.map +0 -1
  48. package/dist/commands/prompts/list.js +0 -14
  49. package/dist/commands/prompts/list.js.map +0 -1
  50. package/dist/commands/prompts/upgrade.d.ts +0 -4
  51. package/dist/commands/prompts/upgrade.d.ts.map +0 -1
  52. package/dist/commands/prompts/upgrade.js +0 -17
  53. package/dist/commands/prompts/upgrade.js.map +0 -1
  54. package/dist/commands/tasks/AiTaskTui.d.ts +0 -22
  55. package/dist/commands/tasks/AiTaskTui.d.ts.map +0 -1
  56. package/dist/commands/tasks/AiTaskTui.js +0 -52
  57. package/dist/commands/tasks/AiTaskTui.js.map +0 -1
  58. package/dist/commands/tasks/ai-tasl-tui.d.ts +0 -22
  59. package/dist/commands/tasks/ai-tasl-tui.d.ts.map +0 -1
  60. package/dist/commands/tasks/ai-tasl-tui.js +0 -53
  61. package/dist/commands/tasks/ai-tasl-tui.js.map +0 -1
  62. package/dist/commands/tasks/ai-tools.d.ts +0 -811
  63. package/dist/commands/tasks/ai-tools.d.ts.map +0 -1
  64. package/dist/commands/tasks/ai-tools.js +0 -140
  65. package/dist/commands/tasks/ai-tools.js.map +0 -1
  66. package/dist/commands/tasks/model-providers.d.ts +0 -13
  67. package/dist/commands/tasks/model-providers.d.ts.map +0 -1
  68. package/dist/commands/tasks/model-providers.js +0 -84
  69. package/dist/commands/tasks/model-providers.js.map +0 -1
  70. package/dist/commands/tasks/run-ai-task.d.ts +0 -4
  71. package/dist/commands/tasks/run-ai-task.d.ts.map +0 -1
  72. package/dist/commands/tasks/run-ai-task.js +0 -343
  73. package/dist/commands/tasks/run-ai-task.js.map +0 -1
  74. package/dist/commands/tasks/run.d.ts +0 -7
  75. package/dist/commands/tasks/run.d.ts.map +0 -1
  76. package/dist/commands/tasks/run.js +0 -91
  77. package/dist/commands/tasks/run.js.map +0 -1
  78. package/dist/config.d.ts +0 -206
  79. package/dist/config.d.ts.map +0 -1
  80. package/dist/config.js +0 -35
  81. package/dist/config.js.map +0 -1
  82. package/dist/env.d.ts +0 -17
  83. package/dist/env.d.ts.map +0 -1
  84. package/dist/env.js +0 -26
  85. package/dist/env.js.map +0 -1
  86. package/dist/helper/ai-retry-error.d.ts +0 -3
  87. package/dist/helper/ai-retry-error.d.ts.map +0 -1
  88. package/dist/helper/ai-retry-error.js +0 -108
  89. package/dist/helper/ai-retry-error.js.map +0 -1
  90. package/dist/helper/find-changes.d.ts +0 -3
  91. package/dist/helper/find-changes.d.ts.map +0 -1
  92. package/dist/helper/find-changes.js +0 -113
  93. package/dist/helper/find-changes.js.map +0 -1
  94. package/dist/helper/find-changes.test.d.ts +0 -2
  95. package/dist/helper/find-changes.test.d.ts.map +0 -1
  96. package/dist/helper/find-changes.test.js +0 -22
  97. package/dist/helper/find-changes.test.js.map +0 -1
  98. package/dist/helper/handle-ai-error.d.ts +0 -5
  99. package/dist/helper/handle-ai-error.d.ts.map +0 -1
  100. package/dist/helper/handle-ai-error.js +0 -122
  101. package/dist/helper/handle-ai-error.js.map +0 -1
  102. package/dist/helper/logger.d.ts +0 -3
  103. package/dist/helper/logger.d.ts.map +0 -1
  104. package/dist/helper/logger.js +0 -26
  105. package/dist/helper/logger.js.map +0 -1
  106. package/dist/helper/parse-progress.d.ts +0 -2
  107. package/dist/helper/parse-progress.d.ts.map +0 -1
  108. package/dist/helper/parse-progress.js +0 -28
  109. package/dist/helper/parse-progress.js.map +0 -1
  110. package/dist/helper/prompts-loader.d.ts +0 -11
  111. package/dist/helper/prompts-loader.d.ts.map +0 -1
  112. package/dist/helper/prompts-loader.js +0 -28
  113. package/dist/helper/prompts-loader.js.map +0 -1
  114. package/dist/helper/resolve-ai-tasks.d.ts +0 -42
  115. package/dist/helper/resolve-ai-tasks.d.ts.map +0 -1
  116. package/dist/helper/resolve-ai-tasks.js +0 -162
  117. package/dist/helper/resolve-ai-tasks.js.map +0 -1
@@ -1,113 +0,0 @@
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}". All files (includes uncommitted changes) will be listed.`));
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}". All files (includes uncommitted changes) will be listed. Details:`));
32
- console.error(gitError.message);
33
- }
34
- if (!baseCommitForDiff) {
35
- return execSync("git ls-tree HEAD --name-only -r", { cwd, encoding: "utf8", stdio: "pipe" })
36
- .toString()
37
- .trim()
38
- .split("\n")
39
- .map((filepath) => {
40
- return new FileEntry(path.join(cwd, filepath), { cwd });
41
- });
42
- }
43
- const changedFiles = new Set();
44
- // 2. 列出从该 commit 之后到 HEAD (最新已提交) 的所有变更文件
45
- try {
46
- const committedChangesOutput = execSync(`git diff ${baseCommitForDiff} HEAD --name-only`, gitCommandOptions).toString().trim();
47
- if (committedChangesOutput) {
48
- committedChangesOutput.split("\n").forEach((file) => {
49
- if (file.trim())
50
- changedFiles.add(file.trim());
51
- });
52
- }
53
- }
54
- catch (error) {
55
- const gitError = error;
56
- // `git diff` 在有差异时退出码为1,无差异时为0。execSync 默认在非0时抛错。
57
- if (gitError.status === 1 && gitError.stdout) {
58
- // 有差异
59
- const output = gitError.stdout ?? "";
60
- if (output) {
61
- output.split("\n").forEach((file) => {
62
- if (file.trim())
63
- changedFiles.add(file.trim());
64
- });
65
- }
66
- }
67
- else if (gitError.status !== 0) {
68
- // 其他错误
69
- console.error(`Error getting committed changes since ${baseCommitForDiff}: ${gitError.stderr || gitError.message}`);
70
- }
71
- // status 0 (无差异) 表示没有输出,是正常情况
72
- }
73
- // 3. 列出工作区中未提交的变更文件
74
- const uncommittedCommands = [
75
- { cmd: "git diff --name-only --cached", desc: "staged changes" }, // 已暂存
76
- { cmd: "git diff --name-only", desc: "unstaged changes" }, // 未暂存 (对比工作区和暂存区)
77
- { cmd: "git ls-files --others --exclude-standard", desc: "untracked files" }, // 未跟踪
78
- ];
79
- for (const item of uncommittedCommands) {
80
- try {
81
- const output = execSync(item.cmd, gitCommandOptions).toString().trim();
82
- if (output) {
83
- output.split("\n").forEach((file) => {
84
- if (file.trim())
85
- changedFiles.add(file.trim());
86
- });
87
- }
88
- }
89
- catch (error) {
90
- const gitError = error;
91
- if (item.cmd.startsWith("git diff") && gitError.status === 1 && gitError.stdout) {
92
- // git diff 有差异
93
- const output = gitError.stdout ?? "";
94
- if (output) {
95
- output.split("\n").forEach((file) => {
96
- if (file.trim())
97
- changedFiles.add(file.trim());
98
- });
99
- }
100
- }
101
- else if (gitError.status !== 0 && !(item.cmd.startsWith("git diff") && gitError.status === 1)) {
102
- // 其他错误
103
- // 对于 ls-files,如果出错,也记录
104
- console.error(`Error getting ${item.desc}: ${gitError.stderr || gitError.message}`);
105
- }
106
- // `git ls-files` 在没有文件时退出码为0,输出为空。
107
- // `git diff` 在没有差异时退出码为0,输出为空。
108
- }
109
- }
110
- // 返回相对于仓库根目录的文件路径
111
- return [...changedFiles].map((filepath) => new FileEntry(path.resolve(repoPath, filepath), { cwd: repoPath }));
112
- }
113
- //# sourceMappingURL=find-changes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-changes.js","sourceRoot":"","sources":["../../src/helper/find-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAqB,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAChE,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,cAAsB,EAAE,MAAc,GAAG;IACzF,IAAI,QAAQ,GAAG,GAAG,CAAC;IACnB,IAAI,CAAC;QACH,8BAA8B;QAC9B,QAAQ,GAAG,QAAQ,CAAC,+BAA+B,EAAE,EAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;IACjH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,iBAAiB,GAAG,EAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAwB,EAAE,KAAK,EAAE,MAAgB,EAAC,CAAC,CAAC,iDAAiD;IAEzJ,IAAI,iBAAiB,GAAkB,IAAI,CAAC;IAE5C,IAAI,CAAC;QACH,4BAA4B;QAC5B,iDAAiD;QACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,mBAAmB,cAAc,2CAA2C,EAAE,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAEpJ,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,4BAA4B,eAAe,0BAA0B,cAAc,GAAG,CAAC,CAAC;YACpG,iBAAiB,GAAG,eAAe,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,cAAc,6DAA6D,CAAC,CAAC,CAAC;QAC5I,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,qCAAqC;QACrC,oBAAoB;QACpB,MAAM,QAAQ,GAAG,KAAiB,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,iDAAiD,cAAc,sEAAsE,CAAC,CAAC,CAAC;QACzJ,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,iCAAiC,EAAE,EAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAC,CAAC;aACvF,QAAQ,EAAE;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAC,GAAG,EAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,0CAA0C;IAE1C,IAAI,CAAC;QACH,MAAM,sBAAsB,GAAG,QAAQ,CAAC,YAAY,iBAAiB,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAC/H,IAAI,sBAAsB,EAAE,CAAC;YAC3B,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClD,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAiB,CAAC;QACnC,kDAAkD;QAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM;YACN,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClC,IAAI,IAAI,CAAC,IAAI,EAAE;wBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO;YACP,OAAO,CAAC,KAAK,CAAC,yCAAyC,iBAAiB,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACtH,CAAC;QACD,8BAA8B;IAChC,CAAC;IACD,oBAAoB;IACpB,MAAM,mBAAmB,GAAG;QAC1B,EAAC,GAAG,EAAE,+BAA+B,EAAE,IAAI,EAAE,gBAAgB,EAAC,EAAE,MAAM;QACtE,EAAC,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,kBAAkB,EAAC,EAAE,kBAAkB;QAC3E,EAAC,GAAG,EAAE,0CAA0C,EAAE,IAAI,EAAE,iBAAiB,EAAC,EAAE,MAAM;KACnF,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YACvE,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClC,IAAI,IAAI,CAAC,IAAI,EAAE;wBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAiB,CAAC;YACnC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAChF,eAAe;gBACf,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;gBACrC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBAClC,IAAI,IAAI,CAAC,IAAI,EAAE;4BAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjD,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAChG,OAAO;gBACP,uBAAuB;gBACvB,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,mCAAmC;YACnC,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAC,GAAG,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC;AAC/G,CAAC","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}\". All files (includes uncommitted changes) will be listed.`));\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}\". All files (includes uncommitted changes) will be listed. Details:`));\n console.error(gitError.message);\n }\n if (!baseCommitForDiff) {\n return execSync(\"git ls-tree HEAD --name-only -r\", {cwd, encoding: \"utf8\", stdio: \"pipe\"})\n .toString()\n .trim()\n .split(\"\\n\")\n .map((filepath) => {\n return new FileEntry(path.join(cwd, filepath), {cwd});\n });\n }\n\n const changedFiles = new Set<string>();\n\n // 2. 列出从该 commit 之后到 HEAD (最新已提交) 的所有变更文件\n\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 // 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"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=find-changes.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-changes.test.d.ts","sourceRoot":"","sources":["../../src/helper/find-changes.test.ts"],"names":[],"mappings":""}
@@ -1,22 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,5 +0,0 @@
1
- import { type Spinner } from "@gaubee/nodekit";
2
- type Loading = Pick<Spinner, "prefixText" | "text">;
3
- export declare const handleError: (error: unknown, loading: Loading) => Promise<true | undefined>;
4
- export {};
5
- //# sourceMappingURL=handle-ai-error.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-ai-error.d.ts","sourceRoot":"","sources":["../../src/helper/handle-ai-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,OAAO,EAAC,MAAM,iBAAiB,CAAC;AAMhE,KAAK,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;AAEpD,eAAO,MAAM,WAAW,GAAU,OAAO,OAAO,EAAE,SAAS,OAAO,8BAOjE,CAAC"}
@@ -1,122 +0,0 @@
1
- import { gray, red, yellow } from "@gaubee/nodekit";
2
- import { delay } from "@gaubee/util";
3
- import { APICallError, RetryError } from "ai";
4
- import ms from "ms";
5
- import { match } from "ts-pattern";
6
- import z from "zod";
7
- export const handleError = async (error, loading) => {
8
- for (const handle of [handleAPICallError, handleRetryError]) {
9
- const matched = await handle(error, loading);
10
- if (matched) {
11
- return true;
12
- }
13
- }
14
- };
15
- const handleRetryError = async (error, loading) => {
16
- if (!RetryError.isInstance(error)) {
17
- return;
18
- }
19
- for (const inner_error of error.errors) {
20
- const matched = await handleAPICallError(inner_error, loading);
21
- if (matched) {
22
- return true;
23
- }
24
- }
25
- };
26
- const handleAPICallError = async (error, loading) => {
27
- if (!APICallError.isInstance(error)) {
28
- return;
29
- }
30
- try {
31
- if (error.isRetryable) {
32
- const safeData = geminiErrorSchema.safeParse(JSON.parse(error.responseBody));
33
- if (!safeData.success) {
34
- throw safeData.error;
35
- }
36
- const retryDetail = safeData.data.error.details.find((d) => "retryDelay" in d);
37
- if (retryDetail) {
38
- const retryDelay = ms(retryDetail.retryDelay);
39
- if (typeof retryDelay === "number") {
40
- await waitRetryDelay(loading, retryDelay, (loading.text = yellow(error.message)));
41
- return true;
42
- }
43
- }
44
- }
45
- else {
46
- const safeData = commonErrorSchema.safeParse(error.data);
47
- if (!safeData.success) {
48
- throw safeData.error;
49
- }
50
- await match(safeData.data.error)
51
- /// 余额不足
52
- .with({ message: "Insufficient Balance" }, async () => {
53
- /// 30s重试
54
- await waitRetryDelay(loading, 1000 * 30, (loading.text = red("Insufficient Balance") + "\n" + red(error.url)));
55
- })
56
- .otherwise(() => {
57
- throw error;
58
- });
59
- return true;
60
- }
61
- }
62
- catch {
63
- console.error("\nQAQ unknown error", error);
64
- }
65
- };
66
- const commonErrorSchema = z.object({
67
- error: z.object({
68
- message: z.string(),
69
- type: z.string(),
70
- param: z.any(),
71
- code: z.string(),
72
- }),
73
- });
74
- const geminiErrorSchema = z.object({
75
- error: z.object({
76
- code: z.number(),
77
- message: z.string(),
78
- status: z.string(),
79
- details: z.array(z.union([
80
- z.object({
81
- "@type": z.string(),
82
- violations: z.array(z.object({
83
- quotaMetric: z.string(),
84
- quotaId: z.string(),
85
- quotaDimensions: z.object({
86
- location: z.string(),
87
- model: z.string(),
88
- }),
89
- quotaValue: z.string(),
90
- })),
91
- }),
92
- z.object({
93
- "@type": z.string(),
94
- links: z.array(z.object({ description: z.string(), url: z.string() })),
95
- }),
96
- z.object({ "@type": z.string(), retryDelay: z.string() }),
97
- ])),
98
- }),
99
- });
100
- const waitRetryDelay = async (loading, retryDelay, message) => {
101
- const { prefixText, text } = loading;
102
- let remainingDelay = retryDelay;
103
- const tickInterval = 1000;
104
- const tick = () => {
105
- loading.prefixText = "⏲️ ";
106
- loading.text = [
107
- //
108
- message,
109
- " " + gray("─".repeat(Math.max(4, process.stdout.columns - 2))),
110
- `Retrying in ${ms(remainingDelay)}...`,
111
- ].join("\n");
112
- remainingDelay -= tickInterval;
113
- };
114
- tick();
115
- const ti = setInterval(tick, tickInterval);
116
- await delay(retryDelay);
117
- clearInterval(ti);
118
- // 回滚
119
- loading.prefixText = prefixText;
120
- loading.text = text;
121
- };
122
- //# sourceMappingURL=handle-ai-error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handle-ai-error.js","sourceRoot":"","sources":["../../src/helper/handle-ai-error.ts"],"names":[],"mappings":"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","sourcesContent":["import {gray, red, yellow, type Spinner} from \"@gaubee/nodekit\";\r\nimport {delay} from \"@gaubee/util\";\r\nimport {APICallError, RetryError} from \"ai\";\r\nimport ms from \"ms\";\r\nimport {match} from \"ts-pattern\";\r\nimport z from \"zod\";\r\ntype Loading = Pick<Spinner, \"prefixText\" | \"text\">;\r\n\r\nexport const handleError = async (error: unknown, loading: Loading) => {\r\n for (const handle of [handleAPICallError, handleRetryError]) {\r\n const matched = await handle(error, loading);\r\n if (matched) {\r\n return true;\r\n }\r\n }\r\n};\r\n\r\nconst handleRetryError = async (error: unknown, loading: Loading) => {\r\n if (!RetryError.isInstance(error)) {\r\n return;\r\n }\r\n for (const inner_error of error.errors) {\r\n const matched = await handleAPICallError(inner_error, loading);\r\n if (matched) {\r\n return true;\r\n }\r\n }\r\n};\r\n\r\nconst handleAPICallError = async (error: unknown, loading: Loading) => {\r\n if (!APICallError.isInstance(error)) {\r\n return;\r\n }\r\n try {\r\n if (error.isRetryable) {\r\n const safeData = geminiErrorSchema.safeParse(JSON.parse(error.responseBody!));\r\n if (!safeData.success) {\r\n throw safeData.error;\r\n }\r\n const retryDetail = safeData.data.error.details.find((d) => \"retryDelay\" in d);\r\n if (retryDetail) {\r\n const retryDelay = ms(retryDetail.retryDelay as ms.StringValue);\r\n\r\n if (typeof retryDelay === \"number\") {\r\n await waitRetryDelay(loading, retryDelay, (loading.text = yellow(error.message)));\r\n return true;\r\n }\r\n }\r\n } else {\r\n const safeData = commonErrorSchema.safeParse(error.data);\r\n if (!safeData.success) {\r\n throw safeData.error;\r\n }\r\n await match(safeData.data.error)\r\n /// 余额不足\r\n .with({message: \"Insufficient Balance\"}, async () => {\r\n /// 30s重试\r\n await waitRetryDelay(loading, 1000 * 30, (loading.text = red(\"Insufficient Balance\") + \"\\n\" + red(error.url)));\r\n })\r\n .otherwise(() => {\r\n throw error;\r\n });\r\n return true;\r\n }\r\n } catch {\r\n console.error(\"\\nQAQ unknown error\", error);\r\n }\r\n};\r\n\r\nconst commonErrorSchema = z.object({\r\n error: z.object({\r\n message: z.string(),\r\n type: z.string(),\r\n param: z.any(),\r\n code: z.string(),\r\n }),\r\n});\r\n\r\nconst geminiErrorSchema = z.object({\r\n error: z.object({\r\n code: z.number(),\r\n message: z.string(),\r\n status: z.string(),\r\n details: z.array(\r\n z.union([\r\n z.object({\r\n \"@type\": z.string(),\r\n violations: z.array(\r\n z.object({\r\n quotaMetric: z.string(),\r\n quotaId: z.string(),\r\n quotaDimensions: z.object({\r\n location: z.string(),\r\n model: z.string(),\r\n }),\r\n quotaValue: z.string(),\r\n }),\r\n ),\r\n }),\r\n z.object({\r\n \"@type\": z.string(),\r\n links: z.array(z.object({description: z.string(), url: z.string()})),\r\n }),\r\n z.object({\"@type\": z.string(), retryDelay: z.string()}),\r\n ]),\r\n ),\r\n }),\r\n});\r\n\r\nconst waitRetryDelay = async (loading: Loading, retryDelay: number, message: string) => {\r\n const {prefixText, text} = loading;\r\n let remainingDelay = retryDelay;\r\n const tickInterval = 1000;\r\n const tick = () => {\r\n loading.prefixText = \"⏲️ \";\r\n loading.text = [\r\n //\r\n message,\r\n \" \" + gray(\"─\".repeat(Math.max(4, process.stdout.columns - 2))),\r\n `Retrying in ${ms(remainingDelay)}...`,\r\n ].join(\"\\n\");\r\n remainingDelay -= tickInterval;\r\n };\r\n tick();\r\n\r\n const ti = setInterval(tick, tickInterval);\r\n await delay(retryDelay);\r\n clearInterval(ti);\r\n\r\n // 回滚\r\n loading.prefixText = prefixText;\r\n loading.text = text;\r\n};\r\n"]}
@@ -1,3 +0,0 @@
1
- import createDebug from "debug";
2
- export { createDebug };
3
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/helper/logger.ts"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,OAAO,CAAC;AAuBhC,OAAO,EAAC,WAAW,EAAC,CAAC"}
@@ -1,26 +0,0 @@
1
- import { gray, red } from "@gaubee/nodekit";
2
- import { AISDKError } from "ai";
3
- import createDebug from "debug";
4
- createDebug.formatters.y = (v) => {
5
- return JSON.stringify(v, (_k, v) => {
6
- if (typeof v === "string") {
7
- let slice_len = 0;
8
- if (v.length > 200) {
9
- slice_len = 50;
10
- }
11
- if (v.length > 100) {
12
- slice_len = 30;
13
- }
14
- if (slice_len > 0) {
15
- return `<string:${v.length}>${v.slice(0, slice_len)}${gray("...")}${v.slice(-slice_len)}`;
16
- }
17
- return v;
18
- }
19
- if (AISDKError.isInstance(v)) {
20
- return red(v.message);
21
- }
22
- return v;
23
- });
24
- };
25
- export { createDebug };
26
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/helper/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAE,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,UAAU,EAAC,MAAM,IAAI,CAAC;AAC9B,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACjC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACnB,SAAS,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACnB,SAAS,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,OAAO,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5F,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AACF,OAAO,EAAC,WAAW,EAAC,CAAC","sourcesContent":["import {gray, red} from \"@gaubee/nodekit\";\nimport {AISDKError} from \"ai\";\nimport createDebug from \"debug\";\n\ncreateDebug.formatters.y = (v) => {\n return JSON.stringify(v, (_k, v) => {\n if (typeof v === \"string\") {\n let slice_len = 0;\n if (v.length > 200) {\n slice_len = 50;\n }\n if (v.length > 100) {\n slice_len = 30;\n }\n if (slice_len > 0) {\n return `<string:${v.length}>${v.slice(0, slice_len)}${gray(\"...\")}${v.slice(-slice_len)}`;\n }\n return v;\n }\n if (AISDKError.isInstance(v)) {\n return red(v.message);\n }\n return v;\n });\n};\nexport {createDebug};\n"]}
@@ -1,2 +0,0 @@
1
- export declare const parseProgress: (p: unknown) => number;
2
- //# sourceMappingURL=parse-progress.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse-progress.d.ts","sourceRoot":"","sources":["../../src/helper/parse-progress.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,WAuBvC,CAAC"}
@@ -1,28 +0,0 @@
1
- import { math_clamp } from "@gaubee/util";
2
- export const parseProgress = (p) => {
3
- let progress = 0;
4
- switch (typeof p) {
5
- case "number": {
6
- progress = p;
7
- break;
8
- }
9
- case "string": {
10
- const p_str = p.trim();
11
- if (p_str.endsWith("%")) {
12
- progress = +p_str.slice(0, -1) / 100;
13
- }
14
- else {
15
- progress = +p_str;
16
- }
17
- break;
18
- }
19
- }
20
- if (Number.isFinite(progress)) {
21
- progress = math_clamp(progress, 0, 1);
22
- }
23
- else {
24
- progress = 0;
25
- }
26
- return progress;
27
- };
28
- //# sourceMappingURL=parse-progress.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse-progress.js","sourceRoot":"","sources":["../../src/helper/parse-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAU,EAAE,EAAE;IAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,QAAQ,OAAO,CAAC,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,CAAC,KAAK,CAAC;YACpB,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC","sourcesContent":["import {math_clamp} from \"@gaubee/util\";\n\nexport const parseProgress = (p: unknown) => {\n let progress = 0;\n switch (typeof p) {\n case \"number\": {\n progress = p;\n break;\n }\n case \"string\": {\n const p_str = p.trim();\n if (p_str.endsWith(\"%\")) {\n progress = +p_str.slice(0, -1) / 100;\n } else {\n progress = +p_str;\n }\n break;\n }\n }\n if (Number.isFinite(progress)) {\n progress = math_clamp(progress, 0, 1);\n } else {\n progress = 0;\n }\n return progress;\n};\n"]}
@@ -1,11 +0,0 @@
1
- import defaultPrompts from "../prompts.json";
2
- export declare const getAllPromptConfigs: import("@gaubee/util").FuncRemember<() => typeof defaultPrompts, void | ((this: unknown) => any)>;
3
- export type PromptConfigs = typeof defaultPrompts;
4
- export type PromptItemConfig = PromptConfigs[keyof PromptConfigs];
5
- /**
6
- * 所有的技能信息
7
- * key: skill-name
8
- * value: skill-description
9
- */
10
- export declare const getAllSkillMap: import("@gaubee/util").FuncRemember<() => Record<string, string>, void | ((this: unknown) => any)>;
11
- //# sourceMappingURL=prompts-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompts-loader.d.ts","sourceRoot":"","sources":["../../src/helper/prompts-loader.ts"],"names":[],"mappings":"AAIA,OAAO,cAAc,MAAM,iBAAiB,CAAqB;AAGjE,eAAO,MAAM,mBAAmB,4CAAqB,OAAO,cAAc,kCAMxE,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC;AAClD,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,aAAa,CAAC,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,cAAc,oGAWzB,CAAC"}
@@ -1,28 +0,0 @@
1
- import { createResolverByRootFile } from "@gaubee/node";
2
- import { readJson } from "@gaubee/nodekit";
3
- import { func_remember, obj_props } 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 getAllPromptConfigs = 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
- /**
15
- * 所有的技能信息
16
- * key: skill-name
17
- * value: skill-description
18
- */
19
- export const getAllSkillMap = func_remember(() => {
20
- const configs = getAllPromptConfigs();
21
- const skills = obj_props(configs).filter((key) => key.endsWith(".skill"));
22
- const allSkillMap = skills.reduce((tree, skill) => {
23
- tree[skill] = configs[skill].content.split("\n")[0];
24
- return tree;
25
- }, Object.create(null));
26
- return allSkillMap;
27
- });
28
- //# sourceMappingURL=prompts-loader.js.map
@@ -1 +0,0 @@
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,EAAE,SAAS,EAAC,MAAM,cAAc,CAAC;AACtD,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,mBAAmB,GAAG,aAAa,CAAC,GAA0B,EAAE;IAC3E,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;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,EAAE;IAC/C,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC/B,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC,EACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAA2B,CAC9C,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC,CAAC","sourcesContent":["import {createResolverByRootFile} from \"@gaubee/node\";\nimport {readJson} from \"@gaubee/nodekit\";\nimport {func_remember, obj_props} from \"@gaubee/util\";\nimport fs from \"node:fs\";\nimport defaultPrompts from \"../prompts.json\" with {type: \"json\"};\nconst rootResolver = createResolverByRootFile(import.meta.url);\n\nexport const getAllPromptConfigs = 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});\nexport type PromptConfigs = typeof defaultPrompts;\nexport type PromptItemConfig = PromptConfigs[keyof PromptConfigs];\n\n/**\n * 所有的技能信息\n * key: skill-name\n * value: skill-description\n */\nexport const getAllSkillMap = func_remember(() => {\n const configs = getAllPromptConfigs();\n const skills = obj_props(configs).filter((key) => key.endsWith(\".skill\"));\n const allSkillMap = skills.reduce(\n (tree, skill) => {\n tree[skill] = configs[skill].content.split(\"\\n\")[0];\n return tree;\n },\n Object.create(null) as Record<string, string>,\n );\n return allSkillMap;\n});\n"]}
@@ -1,42 +0,0 @@
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"], current_job_loop_count: number) => ({
9
- data: {
10
- [key: string]: any;
11
- };
12
- content: string;
13
- } & Readonly<{
14
- runner: string;
15
- jobName: string;
16
- loopCount: number;
17
- filepath: string;
18
- exitCode: number | null;
19
- exitReason: string;
20
- exit: (code: number, reason: string) => void;
21
- cwd: string;
22
- dirs: string[];
23
- agents: string[];
24
- model: string;
25
- startTime: string;
26
- maxTurns: number;
27
- otherRunners: string[];
28
- log: Readonly<{
29
- name: string;
30
- filepath: string;
31
- content: string;
32
- data: {
33
- [key: string]: any;
34
- };
35
- createTime: string;
36
- preUpdateTime: string;
37
- preProgress: number;
38
- }>;
39
- reloadLog: () => void;
40
- }>)[];
41
- export type AiTask = ReturnType<typeof resolveAiTasks>[number];
42
- //# sourceMappingURL=resolve-ai-tasks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-ai-tasks.d.ts","sourceRoot":"","sources":["../../src/helper/resolve-ai-tasks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,KAAK,UAAU,EAAC,MAAM,cAAc,CAAC;AAK7C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,EAAE,cAAc,UAAU,CAAC,OAAO,CAAC,EAAE,wBAAwB,MAAM;UAGnG;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC;aACjB,MAAM;;YAIL,MAAM;aACL,MAAM;eACJ,MAAM;cACP,MAAM;cACN,MAAM,GAAG,IAAI;gBACX,MAAM;UACZ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI;SAEvC,MAAM;UACL,MAAM,EAAE;YACN,MAAM,EAAE;WACT,MAAM;eACF,MAAM;cACP,MAAM;kBACF,MAAM,EAAE;SAEjB,QAAQ,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE;YAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAC,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;eACS,MAAM,IAAI;KA0K1B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC"}