@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.
- package/README.md +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +17 -95
- package/dist/cli.js.map +1 -1
- package/dist/commands/apply.d.ts +9 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +59 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/gen.d.ts +9 -0
- package/dist/commands/gen.d.ts.map +1 -0
- package/dist/commands/gen.js +43 -0
- package/dist/commands/gen.js.map +1 -0
- package/dist/commands/google-aistudio.d.ts +8 -0
- package/dist/commands/google-aistudio.d.ts.map +1 -0
- package/dist/commands/google-aistudio.js +51 -0
- package/dist/commands/google-aistudio.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/package.json +4 -25
- package/dist/commands/doctor/config.d.ts +0 -3
- package/dist/commands/doctor/config.d.ts.map +0 -1
- package/dist/commands/doctor/config.js +0 -30
- package/dist/commands/doctor/config.js.map +0 -1
- package/dist/commands/doctor/doctor.d.ts +0 -18
- package/dist/commands/doctor/doctor.d.ts.map +0 -1
- package/dist/commands/doctor/doctor.js +0 -125
- package/dist/commands/doctor/doctor.js.map +0 -1
- package/dist/commands/doctor/doctor.test.d.ts +0 -2
- package/dist/commands/doctor/doctor.test.d.ts.map +0 -1
- package/dist/commands/doctor/doctor.test.js +0 -14
- package/dist/commands/doctor/doctor.test.js.map +0 -1
- package/dist/commands/doctor/index.d.ts +0 -2
- package/dist/commands/doctor/index.d.ts.map +0 -1
- package/dist/commands/doctor/index.js +0 -19
- package/dist/commands/doctor/index.js.map +0 -1
- package/dist/commands/doctor/types.d.ts +0 -30
- package/dist/commands/doctor/types.d.ts.map +0 -1
- package/dist/commands/doctor/types.js +0 -3
- package/dist/commands/doctor/types.js.map +0 -1
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -63
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/prompts/list.d.ts +0 -2
- package/dist/commands/prompts/list.d.ts.map +0 -1
- package/dist/commands/prompts/list.js +0 -14
- package/dist/commands/prompts/list.js.map +0 -1
- package/dist/commands/prompts/upgrade.d.ts +0 -4
- package/dist/commands/prompts/upgrade.d.ts.map +0 -1
- package/dist/commands/prompts/upgrade.js +0 -17
- package/dist/commands/prompts/upgrade.js.map +0 -1
- package/dist/commands/tasks/AiTaskTui.d.ts +0 -22
- package/dist/commands/tasks/AiTaskTui.d.ts.map +0 -1
- package/dist/commands/tasks/AiTaskTui.js +0 -52
- package/dist/commands/tasks/AiTaskTui.js.map +0 -1
- package/dist/commands/tasks/ai-tasl-tui.d.ts +0 -22
- package/dist/commands/tasks/ai-tasl-tui.d.ts.map +0 -1
- package/dist/commands/tasks/ai-tasl-tui.js +0 -53
- package/dist/commands/tasks/ai-tasl-tui.js.map +0 -1
- package/dist/commands/tasks/ai-tools.d.ts +0 -811
- package/dist/commands/tasks/ai-tools.d.ts.map +0 -1
- package/dist/commands/tasks/ai-tools.js +0 -140
- package/dist/commands/tasks/ai-tools.js.map +0 -1
- package/dist/commands/tasks/model-providers.d.ts +0 -13
- package/dist/commands/tasks/model-providers.d.ts.map +0 -1
- package/dist/commands/tasks/model-providers.js +0 -84
- package/dist/commands/tasks/model-providers.js.map +0 -1
- package/dist/commands/tasks/run-ai-task.d.ts +0 -4
- package/dist/commands/tasks/run-ai-task.d.ts.map +0 -1
- package/dist/commands/tasks/run-ai-task.js +0 -343
- package/dist/commands/tasks/run-ai-task.js.map +0 -1
- package/dist/commands/tasks/run.d.ts +0 -7
- package/dist/commands/tasks/run.d.ts.map +0 -1
- package/dist/commands/tasks/run.js +0 -91
- package/dist/commands/tasks/run.js.map +0 -1
- package/dist/config.d.ts +0 -206
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -35
- package/dist/config.js.map +0 -1
- package/dist/env.d.ts +0 -17
- package/dist/env.d.ts.map +0 -1
- package/dist/env.js +0 -26
- package/dist/env.js.map +0 -1
- package/dist/helper/ai-retry-error.d.ts +0 -3
- package/dist/helper/ai-retry-error.d.ts.map +0 -1
- package/dist/helper/ai-retry-error.js +0 -108
- package/dist/helper/ai-retry-error.js.map +0 -1
- package/dist/helper/find-changes.d.ts +0 -3
- package/dist/helper/find-changes.d.ts.map +0 -1
- package/dist/helper/find-changes.js +0 -113
- package/dist/helper/find-changes.js.map +0 -1
- package/dist/helper/find-changes.test.d.ts +0 -2
- package/dist/helper/find-changes.test.d.ts.map +0 -1
- package/dist/helper/find-changes.test.js +0 -22
- package/dist/helper/find-changes.test.js.map +0 -1
- package/dist/helper/handle-ai-error.d.ts +0 -5
- package/dist/helper/handle-ai-error.d.ts.map +0 -1
- package/dist/helper/handle-ai-error.js +0 -122
- package/dist/helper/handle-ai-error.js.map +0 -1
- package/dist/helper/logger.d.ts +0 -3
- package/dist/helper/logger.d.ts.map +0 -1
- package/dist/helper/logger.js +0 -26
- package/dist/helper/logger.js.map +0 -1
- package/dist/helper/parse-progress.d.ts +0 -2
- package/dist/helper/parse-progress.d.ts.map +0 -1
- package/dist/helper/parse-progress.js +0 -28
- package/dist/helper/parse-progress.js.map +0 -1
- package/dist/helper/prompts-loader.d.ts +0 -11
- package/dist/helper/prompts-loader.d.ts.map +0 -1
- package/dist/helper/prompts-loader.js +0 -28
- package/dist/helper/prompts-loader.js.map +0 -1
- package/dist/helper/resolve-ai-tasks.d.ts +0 -42
- package/dist/helper/resolve-ai-tasks.d.ts.map +0 -1
- package/dist/helper/resolve-ai-tasks.js +0 -162
- package/dist/helper/resolve-ai-tasks.js.map +0 -1
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { matter, normalizeFilePath, readMarkdown, walkFiles, writeMarkdown } from "@gaubee/nodekit";
|
|
2
|
-
import { str_trim_indent } from "@gaubee/util";
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { match, P } from "ts-pattern";
|
|
6
|
-
import { uuidv7 } from "uuidv7";
|
|
7
|
-
import z from "zod";
|
|
8
|
-
import {} from "../config.js";
|
|
9
|
-
import { parseProgress } from "./parse-progress.js";
|
|
10
|
-
const process_runner_uuid_prefix = uuidv7();
|
|
11
|
-
/**
|
|
12
|
-
* 将 config.tasks 字段转化成具体的 ai-tasks 信息
|
|
13
|
-
* @param cwd
|
|
14
|
-
* @param config_tasks
|
|
15
|
-
* @returns
|
|
16
|
-
*/
|
|
17
|
-
export const resolveAiTasks = (cwd, config_tasks, current_job_loop_count) => {
|
|
18
|
-
const config_tasks_arr = Array.isArray(config_tasks) ? config_tasks : [config_tasks];
|
|
19
|
-
const tasks = [];
|
|
20
|
-
const addTask = (ai_task, options) => {
|
|
21
|
-
const { name: inner_task_name } = ai_task.data;
|
|
22
|
-
const task_dir = match(z.union([z.string(), z.string().array()]).safeParse(ai_task.data.dirs ?? ai_task.data.dir))
|
|
23
|
-
.with({ success: true }, (it) => {
|
|
24
|
-
const dirList = Array.isArray(it.data) ? it.data : [it.data];
|
|
25
|
-
return dirList.map((dir) => normalizeFilePath(path.resolve(cwd, dir)));
|
|
26
|
-
})
|
|
27
|
-
.otherwise(() => []);
|
|
28
|
-
if (task_dir.length === 0) {
|
|
29
|
-
task_dir.push(cwd);
|
|
30
|
-
}
|
|
31
|
-
const job_name = inner_task_name || options.defaultName;
|
|
32
|
-
const useLog = ai_task.data.useLog || job_name;
|
|
33
|
-
const log = {
|
|
34
|
-
name: useLog,
|
|
35
|
-
filepath: path.join(cwd, `.jixo/${useLog}.log.md`),
|
|
36
|
-
content: "",
|
|
37
|
-
data: {},
|
|
38
|
-
get createTime() {
|
|
39
|
-
return log.data.createTime ?? startTime;
|
|
40
|
-
},
|
|
41
|
-
get preUpdateTime() {
|
|
42
|
-
return log.data.updateTime ?? startTime;
|
|
43
|
-
},
|
|
44
|
-
get preProgress() {
|
|
45
|
-
return parseProgress(log.data.progress);
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
const reloadLog = () => {
|
|
49
|
-
log.content = fs.existsSync(log.filepath) ? fs.readFileSync(log.filepath, "utf-8").trim() : "";
|
|
50
|
-
if (log.content === "") {
|
|
51
|
-
writeMarkdown(log.filepath, str_trim_indent(`
|
|
52
|
-
## 工作计划
|
|
53
|
-
|
|
54
|
-
<!--待定-->
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## 工作日志
|
|
59
|
-
|
|
60
|
-
<!--暂无-->
|
|
61
|
-
`), {
|
|
62
|
-
title: "_待定_",
|
|
63
|
-
createTime: new Date().toISOString(),
|
|
64
|
-
updateTime: new Date().toISOString(),
|
|
65
|
-
progress: "0%",
|
|
66
|
-
});
|
|
67
|
-
log.content = fs.readFileSync(log.filepath, "utf-8");
|
|
68
|
-
}
|
|
69
|
-
log.data = matter(log.content).data;
|
|
70
|
-
};
|
|
71
|
-
reloadLog();
|
|
72
|
-
const startTime = new Date().toISOString();
|
|
73
|
-
const runner_id = `${job_name}-${process_runner_uuid_prefix}-${current_job_loop_count.toString().padStart(3, "0")}`;
|
|
74
|
-
const task_process = {
|
|
75
|
-
code: null,
|
|
76
|
-
reason: "",
|
|
77
|
-
exit(code, reason) {
|
|
78
|
-
if (task_process.code) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
task_process.code = code;
|
|
82
|
-
task_process.reason = reason;
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
tasks.push({
|
|
86
|
-
...ai_task,
|
|
87
|
-
jobName: job_name,
|
|
88
|
-
loopCount: current_job_loop_count,
|
|
89
|
-
runner: runner_id,
|
|
90
|
-
filepath: options.filepath ?? path.join(cwd, `.jixo/${job_name}.job.md`),
|
|
91
|
-
cwd: cwd,
|
|
92
|
-
dirs: task_dir,
|
|
93
|
-
agents: match(z.union([z.string(), z.string().array()]).safeParse(ai_task.data.agents))
|
|
94
|
-
.with({ success: true, data: P.select() }, (agents) => {
|
|
95
|
-
return Array.isArray(agents) ? agents : agents.split(/\s+/);
|
|
96
|
-
})
|
|
97
|
-
.otherwise(() => []),
|
|
98
|
-
maxTurns: 40,
|
|
99
|
-
otherRunners: [],
|
|
100
|
-
model: match(z.string().safeParse(ai_task.data.model))
|
|
101
|
-
.with({ success: true, data: P.select() }, (model) => model)
|
|
102
|
-
.otherwise(() => ""),
|
|
103
|
-
startTime: startTime,
|
|
104
|
-
reloadLog: reloadLog,
|
|
105
|
-
log: log,
|
|
106
|
-
get exitCode() {
|
|
107
|
-
return task_process.code;
|
|
108
|
-
},
|
|
109
|
-
get exitReason() {
|
|
110
|
-
return task_process.reason;
|
|
111
|
-
},
|
|
112
|
-
exit(code, reason) {
|
|
113
|
-
task_process.exit(code, reason);
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
};
|
|
117
|
-
for (const config_task of config_tasks_arr) {
|
|
118
|
-
match(config_task)
|
|
119
|
-
.with({
|
|
120
|
-
type: "dir",
|
|
121
|
-
dirname: P.string.select(),
|
|
122
|
-
}, (dirname) => {
|
|
123
|
-
for (const entry of walkFiles(path.resolve(cwd, dirname), {
|
|
124
|
-
matchFile(entry) {
|
|
125
|
-
return entry.name.endsWith(".job.md");
|
|
126
|
-
},
|
|
127
|
-
})) {
|
|
128
|
-
addTask(readMarkdown(entry.path), {
|
|
129
|
-
filepath: entry.path,
|
|
130
|
-
defaultName: entry.name.slice(0, -".job.md".length),
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
})
|
|
134
|
-
.with({
|
|
135
|
-
type: "file",
|
|
136
|
-
filename: P.string.select("filename"),
|
|
137
|
-
name: P.string.select("name").optional(),
|
|
138
|
-
}, (m) => {
|
|
139
|
-
addTask(readMarkdown(m.filename), {
|
|
140
|
-
filepath: m.filename,
|
|
141
|
-
defaultName: m.name ?? m.filename.slice(0, -".job.md".length),
|
|
142
|
-
});
|
|
143
|
-
})
|
|
144
|
-
.with(P.string.select(), (mdContent) => {
|
|
145
|
-
addTask(matter(mdContent), {
|
|
146
|
-
defaultName: `${tasks.length + 1}`,
|
|
147
|
-
});
|
|
148
|
-
})
|
|
149
|
-
.with({
|
|
150
|
-
type: "prompt",
|
|
151
|
-
content: P.string.select("content"),
|
|
152
|
-
name: P.string.select("name").optional(),
|
|
153
|
-
}, (m) => {
|
|
154
|
-
addTask(matter(m.content), {
|
|
155
|
-
defaultName: m.name ?? `${tasks.length + 1}`,
|
|
156
|
-
});
|
|
157
|
-
})
|
|
158
|
-
.exhaustive();
|
|
159
|
-
}
|
|
160
|
-
return tasks;
|
|
161
|
-
};
|
|
162
|
-
//# sourceMappingURL=resolve-ai-tasks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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 {str_trim_indent} from \"@gaubee/util\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {match, P} from \"ts-pattern\";\nimport {uuidv7} from \"uuidv7\";\nimport z from \"zod\";\nimport {type JixoConfig} from \"../config.js\";\nimport {parseProgress} from \"./parse-progress.js\";\n\nconst process_runner_uuid_prefix = uuidv7();\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\"], current_job_loop_count: number) => {\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 Readonly<{\n runner: string;\n jobName: string;\n loopCount: number;\n filepath: string;\n exitCode: number | null;\n exitReason: string;\n exit: (code: number, reason: string) => void;\n\n cwd: string;\n dirs: string[];\n agents: string[];\n model: string;\n startTime: string;\n maxTurns: number;\n otherRunners: string[];\n\n log: Readonly<{\n name: string;\n filepath: string;\n content: string;\n data: {[key: string]: any};\n createTime: string;\n preUpdateTime: string;\n preProgress: number;\n }>;\n reloadLog: () => void;\n }>;\n const tasks: AiTask[] = [];\n const addTask = (\n ai_task: TaskBase,\n options: {\n filepath?: string;\n defaultName: string;\n },\n ) => {\n const {name: inner_task_name} = ai_task.data;\n\n const task_dir = match(z.union([z.string(), z.string().array()]).safeParse(ai_task.data.dirs ?? ai_task.data.dir))\n .with({success: true}, (it) => {\n const dirList = Array.isArray(it.data) ? it.data : [it.data];\n return dirList.map((dir) => normalizeFilePath(path.resolve(cwd, dir)));\n })\n .otherwise(() => []);\n if (task_dir.length === 0) {\n task_dir.push(cwd);\n }\n\n const job_name = inner_task_name || options.defaultName;\n const useLog = ai_task.data.useLog || job_name;\n\n const log = {\n name: useLog,\n filepath: path.join(cwd, `.jixo/${useLog}.log.md`),\n content: \"\",\n data: {} as {[key: string]: any},\n get createTime(): string {\n return log.data.createTime ?? startTime;\n },\n get preUpdateTime(): string {\n return log.data.updateTime ?? startTime;\n },\n get preProgress(): number {\n return parseProgress(log.data.progress);\n },\n } satisfies AiTask[\"log\"];\n const reloadLog = () => {\n log.content = fs.existsSync(log.filepath) ? fs.readFileSync(log.filepath, \"utf-8\").trim() : \"\";\n if (log.content === \"\") {\n writeMarkdown(\n log.filepath,\n str_trim_indent(`\n ## 工作计划\n \n <!--待定-->\n\n ---\n\n ## 工作日志\n\n <!--暂无-->\n `),\n {\n title: \"_待定_\",\n createTime: new Date().toISOString(),\n updateTime: new Date().toISOString(),\n progress: \"0%\",\n },\n );\n log.content = fs.readFileSync(log.filepath, \"utf-8\");\n }\n log.data = matter(log.content).data;\n };\n reloadLog();\n const startTime = new Date().toISOString();\n const runner_id = `${job_name}-${process_runner_uuid_prefix}-${current_job_loop_count.toString().padStart(3, \"0\")}`;\n\n const task_process = {\n code: null as number | null,\n reason: \"\",\n exit(code: number, reason: string) {\n if (task_process.code) {\n return;\n }\n task_process.code = code;\n task_process.reason = reason;\n },\n };\n\n tasks.push({\n ...ai_task,\n jobName: job_name,\n loopCount: current_job_loop_count,\n runner: runner_id,\n filepath: options.filepath ?? path.join(cwd, `.jixo/${job_name}.job.md`),\n cwd: cwd,\n dirs: 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 maxTurns: 40,\n otherRunners: [],\n model: match(z.string().safeParse(ai_task.data.model))\n .with({success: true, data: P.select()}, (model) => model)\n .otherwise(() => \"\"),\n startTime: startTime,\n reloadLog: reloadLog,\n log: log,\n\n get exitCode() {\n return task_process.code;\n },\n get exitReason() {\n return task_process.reason;\n },\n exit(code, reason) {\n task_process.exit(code, reason);\n },\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(\".job.md\");\n },\n })) {\n addTask(readMarkdown(entry.path), {\n filepath: entry.path,\n defaultName: entry.name.slice(0, -\".job.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 filepath: m.filename,\n defaultName: m.name ?? m.filename.slice(0, -\".job.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"]}
|