@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.
Files changed (130) hide show
  1. package/dist/cli.d.ts +2 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +74 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/doctor/config.d.ts +3 -0
  6. package/dist/commands/doctor/config.d.ts.map +1 -0
  7. package/dist/commands/doctor/config.js +30 -0
  8. package/dist/commands/doctor/config.js.map +1 -0
  9. package/dist/commands/doctor/doctor.d.ts +18 -0
  10. package/dist/commands/doctor/doctor.d.ts.map +1 -0
  11. package/dist/commands/doctor/doctor.js +125 -0
  12. package/dist/commands/doctor/doctor.js.map +1 -0
  13. package/dist/commands/doctor/doctor.test.d.ts +2 -0
  14. package/dist/commands/doctor/doctor.test.d.ts.map +1 -0
  15. package/dist/commands/doctor/doctor.test.js +14 -0
  16. package/dist/commands/doctor/doctor.test.js.map +1 -0
  17. package/dist/commands/doctor/index.d.ts +2 -0
  18. package/dist/commands/doctor/index.d.ts.map +1 -0
  19. package/dist/commands/doctor/index.js +19 -0
  20. package/dist/commands/doctor/index.js.map +1 -0
  21. package/dist/commands/doctor/types.d.ts +30 -0
  22. package/dist/commands/doctor/types.d.ts.map +1 -0
  23. package/dist/commands/doctor/types.js +3 -0
  24. package/dist/commands/doctor/types.js.map +1 -0
  25. package/dist/commands/init.d.ts +2 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +57 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/prompts/list.d.ts +2 -0
  30. package/dist/commands/prompts/list.d.ts.map +1 -0
  31. package/dist/commands/prompts/list.js +14 -0
  32. package/dist/commands/prompts/list.js.map +1 -0
  33. package/dist/commands/prompts/upgrade.d.ts +4 -0
  34. package/dist/commands/prompts/upgrade.d.ts.map +1 -0
  35. package/dist/commands/prompts/upgrade.js +17 -0
  36. package/dist/commands/prompts/upgrade.js.map +1 -0
  37. package/dist/commands/run.d.ts +5 -0
  38. package/dist/commands/run.d.ts.map +1 -0
  39. package/dist/commands/run.js +36 -0
  40. package/dist/commands/run.js.map +1 -0
  41. package/dist/commands/tasks/ai-tools.d.ts +268 -0
  42. package/dist/commands/tasks/ai-tools.d.ts.map +1 -0
  43. package/dist/commands/tasks/ai-tools.js +64 -0
  44. package/dist/commands/tasks/ai-tools.js.map +1 -0
  45. package/dist/commands/tasks/model-providers.d.ts +9 -0
  46. package/dist/commands/tasks/model-providers.d.ts.map +1 -0
  47. package/dist/commands/tasks/model-providers.js +53 -0
  48. package/dist/commands/tasks/model-providers.js.map +1 -0
  49. package/dist/commands/tasks/run-ai-task.d.ts +4 -0
  50. package/dist/commands/tasks/run-ai-task.d.ts.map +1 -0
  51. package/dist/commands/tasks/run-ai-task.js +246 -0
  52. package/dist/commands/tasks/run-ai-task.js.map +1 -0
  53. package/dist/commands/tasks/run-ai.d.ts +278 -0
  54. package/dist/commands/tasks/run-ai.d.ts.map +1 -0
  55. package/dist/commands/tasks/run-ai.js +179 -0
  56. package/dist/commands/tasks/run-ai.js.map +1 -0
  57. package/dist/commands/tasks/run.d.ts +5 -0
  58. package/dist/commands/tasks/run.d.ts.map +1 -0
  59. package/dist/commands/tasks/run.js +46 -0
  60. package/dist/commands/tasks/run.js.map +1 -0
  61. package/dist/commands/upgrade.d.ts +4 -0
  62. package/dist/commands/upgrade.d.ts.map +1 -0
  63. package/dist/commands/upgrade.js +17 -0
  64. package/dist/commands/upgrade.js.map +1 -0
  65. package/dist/config.d.ts +206 -0
  66. package/dist/config.d.ts.map +1 -0
  67. package/dist/config.js +35 -0
  68. package/dist/config.js.map +1 -0
  69. package/dist/env.d.ts +17 -0
  70. package/dist/env.d.ts.map +1 -0
  71. package/dist/env.js +26 -0
  72. package/dist/env.js.map +1 -0
  73. package/dist/helper/find-changes.d.ts +3 -0
  74. package/dist/helper/find-changes.d.ts.map +1 -0
  75. package/dist/helper/find-changes.js +106 -0
  76. package/dist/helper/find-changes.js.map +1 -0
  77. package/dist/helper/find-changes.test.d.ts +2 -0
  78. package/dist/helper/find-changes.test.d.ts.map +1 -0
  79. package/dist/helper/find-changes.test.js +22 -0
  80. package/dist/helper/find-changes.test.js.map +1 -0
  81. package/dist/helper/prompts-loader.d.ts +5 -0
  82. package/dist/helper/prompts-loader.d.ts.map +1 -0
  83. package/dist/helper/prompts-loader.js +28 -0
  84. package/dist/helper/prompts-loader.js.map +1 -0
  85. package/dist/helper/prompts.d.ts +3 -0
  86. package/dist/helper/prompts.d.ts.map +1 -0
  87. package/dist/helper/prompts.js +28 -0
  88. package/dist/helper/prompts.js.map +1 -0
  89. package/dist/helper/resolve-ai-tasks.d.ts +25 -0
  90. package/dist/helper/resolve-ai-tasks.d.ts.map +1 -0
  91. package/dist/helper/resolve-ai-tasks.js +91 -0
  92. package/dist/helper/resolve-ai-tasks.js.map +1 -0
  93. package/dist/helper/run-ai.d.ts +12 -0
  94. package/dist/helper/run-ai.d.ts.map +1 -0
  95. package/dist/helper/run-ai.js +179 -0
  96. package/dist/helper/run-ai.js.map +1 -0
  97. package/dist/index.d.ts +2 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +7 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/prompts.json +29 -0
  102. package/package.json +47 -0
  103. package/prompts/i18n.md +108 -0
  104. package/prompts/readme-writer.md +120 -0
  105. package/prompts/user.md +88 -0
  106. package/prompts/writer.md +13 -0
  107. package/scripts/gen-prompts.ts +27 -0
  108. package/src/cli.ts +96 -0
  109. package/src/commands/doctor/config.ts +30 -0
  110. package/src/commands/doctor/doctor.test.ts +17 -0
  111. package/src/commands/doctor/doctor.ts +151 -0
  112. package/src/commands/doctor/index.ts +21 -0
  113. package/src/commands/doctor/types.ts +39 -0
  114. package/src/commands/init.ts +64 -0
  115. package/src/commands/prompts/list.ts +14 -0
  116. package/src/commands/prompts/upgrade.ts +16 -0
  117. package/src/commands/tasks/ai-tools.ts +65 -0
  118. package/src/commands/tasks/model-providers.ts +54 -0
  119. package/src/commands/tasks/run-ai-task.ts +263 -0
  120. package/src/commands/tasks/run.ts +52 -0
  121. package/src/config.ts +39 -0
  122. package/src/env.ts +32 -0
  123. package/src/helper/find-changes.test.ts +23 -0
  124. package/src/helper/find-changes.ts +109 -0
  125. package/src/helper/prompts-loader.ts +33 -0
  126. package/src/helper/resolve-ai-tasks.ts +126 -0
  127. package/src/index.ts +8 -0
  128. package/src/prompts.json +29 -0
  129. package/tsconfig.json +15 -0
  130. package/tsconfig.tsbuildinfo +1 -0
@@ -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 "../../helper/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
+ export 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.default(`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/commands/tasks/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 \"../../helper/prompts-loader.js\";\nimport type {AiTask} from \"../../helper/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\nexport const 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"]}
@@ -0,0 +1,5 @@
1
+ export declare const run: (_cwd: string, options: {
2
+ nameFilter: string[];
3
+ dirFilter: string[];
4
+ }) => Promise<void>;
5
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,GAAG,GAAU,MAAM,MAAM,EAAE,SAAS;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAC,kBAyC3F,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { FileEntry, Ignore, normalizeFilePath, walkFiles } from "@gaubee/nodekit";
2
+ import { iter_map_not_null } from "@gaubee/util";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { loadConfig } from "../../config.js";
6
+ import { loadJixoEnv } from "../../env.js";
7
+ import { findChangedFilesSinceCommit } from "../../helper/find-changes.js";
8
+ import { resolveAiTasks } from "../../helper/resolve-ai-tasks.js";
9
+ import { runAiTask } from "./run-ai-task.js";
10
+ export const run = async (_cwd, options) => {
11
+ const cwd = normalizeFilePath(_cwd);
12
+ const config = await loadConfig(cwd);
13
+ const ai_tasks = resolveAiTasks(cwd, config.tasks);
14
+ const nameMatcher = options.nameFilter.length ? new Ignore(options.nameFilter, cwd) : { isMatch: () => true };
15
+ const dirMatcher = options.dirFilter.length ? new Ignore(options.dirFilter, cwd) : { isMatch: () => true };
16
+ const cwdIgnoreFilepath = path.join(cwd, ".gitignore");
17
+ let ignore;
18
+ if (fs.existsSync(cwdIgnoreFilepath)) {
19
+ ignore = fs.readFileSync(cwdIgnoreFilepath, "utf-8").split("\n");
20
+ }
21
+ const allFiles = [...walkFiles(cwd, { ignore })];
22
+ const changedFiles = (await findChangedFilesSinceCommit("@jixo", cwd)).filter((file) => {
23
+ return file.path.startsWith(cwd + "/");
24
+ });
25
+ // const run_tasks: Array<Func> = [];
26
+ for (const ai_task of ai_tasks) {
27
+ const { dir: task_dir } = ai_task;
28
+ if (!dirMatcher.isMatch(task_dir)) {
29
+ continue;
30
+ }
31
+ if (!nameMatcher.isMatch(ai_task.name)) {
32
+ continue;
33
+ }
34
+ const task_changedFiles = cwd === task_dir
35
+ ? changedFiles
36
+ : iter_map_not_null(changedFiles, (file) => {
37
+ if (file.path.startsWith(task_dir + "/")) {
38
+ return new FileEntry(file.path, { cwd: task_dir, state: file.stats });
39
+ }
40
+ });
41
+ const task_allFiles = cwd === task_dir ? allFiles : [...walkFiles(task_dir, { ignore })];
42
+ loadJixoEnv(cwd);
43
+ await runAiTask(ai_task, task_allFiles, task_changedFiles);
44
+ }
45
+ };
46
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tasks/run.ts"],"names":[],"mappings":"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","sourcesContent":["import {FileEntry, Ignore, normalizeFilePath, walkFiles} from \"@gaubee/nodekit\";\nimport {iter_map_not_null} from \"@gaubee/util\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {loadConfig} from \"../../config.js\";\nimport {loadJixoEnv} from \"../../env.js\";\nimport {findChangedFilesSinceCommit} from \"../../helper/find-changes.js\";\nimport {resolveAiTasks} from \"../../helper/resolve-ai-tasks.js\";\nimport {runAiTask} from \"./run-ai-task.js\";\n\nexport const run = async (_cwd: string, options: {nameFilter: string[]; dirFilter: string[]}) => {\n const cwd = normalizeFilePath(_cwd);\n const config = await loadConfig(cwd);\n const ai_tasks = resolveAiTasks(cwd, config.tasks);\n const nameMatcher = options.nameFilter.length ? new Ignore(options.nameFilter, cwd) : {isMatch: () => true};\n const dirMatcher = options.dirFilter.length ? new Ignore(options.dirFilter, cwd) : {isMatch: () => true};\n const cwdIgnoreFilepath = path.join(cwd, \".gitignore\");\n let ignore: undefined | string[];\n if (fs.existsSync(cwdIgnoreFilepath)) {\n ignore = fs.readFileSync(cwdIgnoreFilepath, \"utf-8\").split(\"\\n\");\n }\n\n const allFiles = [...walkFiles(cwd, {ignore})];\n const changedFiles = (await findChangedFilesSinceCommit(\"@jixo\", cwd)).filter((file) => {\n return file.path.startsWith(cwd + \"/\");\n });\n\n // const run_tasks: Array<Func> = [];\n for (const ai_task of ai_tasks) {\n const {dir: task_dir} = ai_task;\n if (!dirMatcher.isMatch(task_dir)) {\n continue;\n }\n if (!nameMatcher.isMatch(ai_task.name)) {\n continue;\n }\n\n const task_changedFiles =\n cwd === task_dir\n ? changedFiles\n : iter_map_not_null(changedFiles, (file) => {\n if (file.path.startsWith(task_dir + \"/\")) {\n return new FileEntry(file.path, {cwd: task_dir, state: file.stats});\n }\n });\n\n const task_allFiles = cwd === task_dir ? allFiles : [...walkFiles(task_dir, {ignore})];\n\n loadJixoEnv(cwd);\n await runAiTask(ai_task, task_allFiles, task_changedFiles);\n }\n};\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const upgrade: (dir: string, options: {
2
+ mirrorUrl?: string;
3
+ }) => Promise<void>;
4
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,GAAU,KAAK,MAAM,EAAE,SAAS;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,kBAavE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { spinner, writeJson } from "@gaubee/nodekit";
2
+ export const upgrade = async (dir, options) => {
3
+ // TODO 下载最新的提示词集合
4
+ const mirrorUrl = options.mirrorUrl || "https://jixo.ai/jixo-prompts.json";
5
+ const loading = spinner.default("Upgrading prompts");
6
+ loading.start("Downloading...");
7
+ // await delay(1000);
8
+ try {
9
+ const prompts = await fetch(mirrorUrl).then((res) => res.json());
10
+ loading.stopAndPersist({ symbol: "✅", text: "Download completed" });
11
+ writeJson(import.meta.resolve("jixo-prompts.json"), prompts);
12
+ }
13
+ catch (e) {
14
+ loading.stopAndPersist({ symbol: "❌", text: "Download failed" });
15
+ }
16
+ };
17
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAE,OAA6B,EAAE,EAAE;IAC1E,kBAAkB;IAClB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,mCAAmC,CAAC;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,uBAAuB;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,cAAc,CAAC,EAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,oBAAoB,EAAC,CAAC,CAAC;QAClE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,cAAc,CAAC,EAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC","sourcesContent":["import {spinner, writeJson} from \"@gaubee/nodekit\";\n\nexport const upgrade = async (dir: string, options: {mirrorUrl?: string}) => {\n // TODO 下载最新的提示词集合\n const mirrorUrl = options.mirrorUrl || \"https://jixo.ai/jixo-prompts.json\";\n const loading = spinner.default(\"Upgrading prompts\");\n loading.start(\"Downloading...\");\n // await delay(1000);\n try {\n const prompts = await fetch(mirrorUrl).then((res) => res.json());\n loading.stopAndPersist({symbol: \"✅\", text: \"Download completed\"});\n writeJson(import.meta.resolve(\"jixo-prompts.json\"), prompts);\n } catch (e) {\n loading.stopAndPersist({symbol: \"❌\", text: \"Download failed\"});\n }\n};\n"]}
@@ -0,0 +1,206 @@
1
+ import z from "zod";
2
+ declare const zJixoTask: z.ZodUnion<[z.ZodString, z.ZodObject<{
3
+ type: z.ZodLiteral<"file">;
4
+ name: z.ZodOptional<z.ZodString>;
5
+ filename: z.ZodString;
6
+ }, "strip", z.ZodTypeAny, {
7
+ type: "file";
8
+ filename: string;
9
+ name?: string | undefined;
10
+ }, {
11
+ type: "file";
12
+ filename: string;
13
+ name?: string | undefined;
14
+ }>, z.ZodObject<{
15
+ type: z.ZodLiteral<"dir">;
16
+ dirname: z.ZodString;
17
+ }, "strip", z.ZodTypeAny, {
18
+ type: "dir";
19
+ dirname: string;
20
+ }, {
21
+ type: "dir";
22
+ dirname: string;
23
+ }>, z.ZodObject<{
24
+ type: z.ZodLiteral<"prompt">;
25
+ name: z.ZodOptional<z.ZodString>;
26
+ content: z.ZodString;
27
+ }, "strip", z.ZodTypeAny, {
28
+ type: "prompt";
29
+ content: string;
30
+ name?: string | undefined;
31
+ }, {
32
+ type: "prompt";
33
+ content: string;
34
+ name?: string | undefined;
35
+ }>]>;
36
+ declare const zJixoConfig: z.ZodObject<{
37
+ tasks: z.ZodUnion<[z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
38
+ type: z.ZodLiteral<"file">;
39
+ name: z.ZodOptional<z.ZodString>;
40
+ filename: z.ZodString;
41
+ }, "strip", z.ZodTypeAny, {
42
+ type: "file";
43
+ filename: string;
44
+ name?: string | undefined;
45
+ }, {
46
+ type: "file";
47
+ filename: string;
48
+ name?: string | undefined;
49
+ }>, z.ZodObject<{
50
+ type: z.ZodLiteral<"dir">;
51
+ dirname: z.ZodString;
52
+ }, "strip", z.ZodTypeAny, {
53
+ type: "dir";
54
+ dirname: string;
55
+ }, {
56
+ type: "dir";
57
+ dirname: string;
58
+ }>, z.ZodObject<{
59
+ type: z.ZodLiteral<"prompt">;
60
+ name: z.ZodOptional<z.ZodString>;
61
+ content: z.ZodString;
62
+ }, "strip", z.ZodTypeAny, {
63
+ type: "prompt";
64
+ content: string;
65
+ name?: string | undefined;
66
+ }, {
67
+ type: "prompt";
68
+ content: string;
69
+ name?: string | undefined;
70
+ }>]>, "many">, z.ZodUnion<[z.ZodString, z.ZodObject<{
71
+ type: z.ZodLiteral<"file">;
72
+ name: z.ZodOptional<z.ZodString>;
73
+ filename: z.ZodString;
74
+ }, "strip", z.ZodTypeAny, {
75
+ type: "file";
76
+ filename: string;
77
+ name?: string | undefined;
78
+ }, {
79
+ type: "file";
80
+ filename: string;
81
+ name?: string | undefined;
82
+ }>, z.ZodObject<{
83
+ type: z.ZodLiteral<"dir">;
84
+ dirname: z.ZodString;
85
+ }, "strip", z.ZodTypeAny, {
86
+ type: "dir";
87
+ dirname: string;
88
+ }, {
89
+ type: "dir";
90
+ dirname: string;
91
+ }>, z.ZodObject<{
92
+ type: z.ZodLiteral<"prompt">;
93
+ name: z.ZodOptional<z.ZodString>;
94
+ content: z.ZodString;
95
+ }, "strip", z.ZodTypeAny, {
96
+ type: "prompt";
97
+ content: string;
98
+ name?: string | undefined;
99
+ }, {
100
+ type: "prompt";
101
+ content: string;
102
+ name?: string | undefined;
103
+ }>]>]>;
104
+ }, "strip", z.ZodTypeAny, {
105
+ tasks: string | {
106
+ type: "file";
107
+ filename: string;
108
+ name?: string | undefined;
109
+ } | {
110
+ type: "dir";
111
+ dirname: string;
112
+ } | {
113
+ type: "prompt";
114
+ content: string;
115
+ name?: string | undefined;
116
+ } | (string | {
117
+ type: "file";
118
+ filename: string;
119
+ name?: string | undefined;
120
+ } | {
121
+ type: "dir";
122
+ dirname: string;
123
+ } | {
124
+ type: "prompt";
125
+ content: string;
126
+ name?: string | undefined;
127
+ })[];
128
+ }, {
129
+ tasks: string | {
130
+ type: "file";
131
+ filename: string;
132
+ name?: string | undefined;
133
+ } | {
134
+ type: "dir";
135
+ dirname: string;
136
+ } | {
137
+ type: "prompt";
138
+ content: string;
139
+ name?: string | undefined;
140
+ } | (string | {
141
+ type: "file";
142
+ filename: string;
143
+ name?: string | undefined;
144
+ } | {
145
+ type: "dir";
146
+ dirname: string;
147
+ } | {
148
+ type: "prompt";
149
+ content: string;
150
+ name?: string | undefined;
151
+ })[];
152
+ }>;
153
+ export type JixoTask = z.output<typeof zJixoTask>;
154
+ export type JixoConfig = z.output<typeof zJixoConfig>;
155
+ export declare const defineConfig: (config: Partial<JixoConfig>) => {
156
+ tasks: string | {
157
+ type: "file";
158
+ filename: string;
159
+ name?: string | undefined;
160
+ } | {
161
+ type: "dir";
162
+ dirname: string;
163
+ } | {
164
+ type: "prompt";
165
+ content: string;
166
+ name?: string | undefined;
167
+ } | (string | {
168
+ type: "file";
169
+ filename: string;
170
+ name?: string | undefined;
171
+ } | {
172
+ type: "dir";
173
+ dirname: string;
174
+ } | {
175
+ type: "prompt";
176
+ content: string;
177
+ name?: string | undefined;
178
+ })[];
179
+ };
180
+ export declare const loadConfig: (dir: string) => Promise<{
181
+ tasks: string | {
182
+ type: "file";
183
+ filename: string;
184
+ name?: string | undefined;
185
+ } | {
186
+ type: "dir";
187
+ dirname: string;
188
+ } | {
189
+ type: "prompt";
190
+ content: string;
191
+ name?: string | undefined;
192
+ } | (string | {
193
+ type: "file";
194
+ filename: string;
195
+ name?: string | undefined;
196
+ } | {
197
+ type: "dir";
198
+ dirname: string;
199
+ } | {
200
+ type: "prompt";
201
+ content: string;
202
+ name?: string | undefined;
203
+ })[];
204
+ }>;
205
+ export {};
206
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgBb,CAAC;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEf,CAAC;AAKH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,eAAO,MAAM,YAAY,GAAI,QAAQ,OAAO,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAEvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;EAI3C,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,35 @@
1
+ import { cosmiconfig } from "cosmiconfig";
2
+ import { defu } from "defu";
3
+ import z from "zod";
4
+ const zJixoTask = z.union([
5
+ z.string(),
6
+ z.object({
7
+ type: z.literal("file"),
8
+ name: z.string().optional(),
9
+ filename: z.string(),
10
+ }),
11
+ z.object({
12
+ type: z.literal("dir"),
13
+ dirname: z.string(),
14
+ }),
15
+ z.object({
16
+ type: z.literal("prompt"),
17
+ name: z.string().optional(),
18
+ content: z.string(),
19
+ }),
20
+ ]);
21
+ const zJixoConfig = z.object({
22
+ tasks: z.union([z.array(zJixoTask), zJixoTask]),
23
+ });
24
+ const defaultConfig = {
25
+ tasks: { type: "dir", dirname: ".jixo" },
26
+ };
27
+ export const defineConfig = (config) => {
28
+ return zJixoConfig.parse(config);
29
+ };
30
+ export const loadConfig = async (dir) => {
31
+ const explorer = cosmiconfig("jixo");
32
+ const loaded = await explorer.search(dir);
33
+ return defu(loaded?.config, defaultConfig);
34
+ };
35
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,IAAI,EAAC,MAAM,MAAM,CAAC;AAC1B,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;IACxB,CAAC,CAAC,MAAM,EAAE;IACV,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACrB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;CACH,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,aAAa,GAAe;IAChC,KAAK,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAC;CACvC,CAAC;AAGF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAA2B,EAAE,EAAE;IAC1D,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;IAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,MAAM,EAAE,MAAoB,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC,CAAC","sourcesContent":["import {cosmiconfig} from \"cosmiconfig\";\nimport {defu} from \"defu\";\nimport z from \"zod\";\n\nconst zJixoTask = z.union([\n z.string(),\n z.object({\n type: z.literal(\"file\"),\n name: z.string().optional(),\n filename: z.string(),\n }),\n z.object({\n type: z.literal(\"dir\"),\n dirname: z.string(),\n }),\n z.object({\n type: z.literal(\"prompt\"),\n name: z.string().optional(),\n content: z.string(),\n }),\n]);\nconst zJixoConfig = z.object({\n tasks: z.union([z.array(zJixoTask), zJixoTask]),\n});\n\nconst defaultConfig: JixoConfig = {\n tasks: {type: \"dir\", dirname: \".jixo\"},\n};\nexport type JixoTask = z.output<typeof zJixoTask>;\nexport type JixoConfig = z.output<typeof zJixoConfig>;\nexport const defineConfig = (config: Partial<JixoConfig>) => {\n return zJixoConfig.parse(config);\n};\n\nexport const loadConfig = async (dir: string) => {\n const explorer = cosmiconfig(\"jixo\");\n const loaded = await explorer.search(dir);\n return defu(loaded?.config as JixoConfig, defaultConfig);\n};\n"]}
package/dist/env.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export declare const loadJixoEnv: (dir: string) => void;
2
+ export declare const safeEnv: import("@gaubee/node").DefineEnvChain<"JIXO", import("@gaubee/node").DefineEnv<"JIXO", {
3
+ DEEPSEEK_API_KEY: string;
4
+ DEEPSEEK_BASE_URL: string;
5
+ ANTHROPIC_API_KEY: string;
6
+ ANTHROPIC_BASE_URL: string;
7
+ OPENAI_API_KEY: string;
8
+ OPENAI_BASE_URL: string;
9
+ OPENAI_ORGANIZATION: string;
10
+ GOOGLE_API_KEY: string;
11
+ GOOGLE_BASE_URL: string;
12
+ XAI_BASE_URL: string;
13
+ XAI_API_KEY: string;
14
+ DEEPINFRA_BASE_URL: string;
15
+ DEEPINFRA_API_KEY: string;
16
+ }>>;
17
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,SAKtC,CAAC;AAGF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;GAmBlB,CAAC"}
package/dist/env.js ADDED
@@ -0,0 +1,26 @@
1
+ import { defineEnv } from "@gaubee/node";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ export const loadJixoEnv = (dir) => {
5
+ const cwdJixoEnvFilepath = path.join(dir, ".jixo.env");
6
+ if (fs.existsSync(cwdJixoEnvFilepath)) {
7
+ process.loadEnvFile(cwdJixoEnvFilepath);
8
+ }
9
+ };
10
+ loadJixoEnv(process.cwd());
11
+ export const safeEnv = defineEnv("JIXO", {
12
+ DEEPSEEK_API_KEY: "",
13
+ DEEPSEEK_BASE_URL: "",
14
+ ANTHROPIC_API_KEY: "",
15
+ ANTHROPIC_BASE_URL: "",
16
+ OPENAI_API_KEY: "",
17
+ OPENAI_BASE_URL: "",
18
+ OPENAI_ORGANIZATION: "",
19
+ GOOGLE_API_KEY: "",
20
+ GOOGLE_BASE_URL: "",
21
+ XAI_BASE_URL: "",
22
+ XAI_API_KEY: "",
23
+ DEEPINFRA_BASE_URL: "",
24
+ DEEPINFRA_API_KEY: "",
25
+ });
26
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE;IACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC,CAAC;AACF,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE;IACvC,gBAAgB,EAAE,EAAE;IACpB,iBAAiB,EAAE,EAAE;IAErB,iBAAiB,EAAE,EAAE;IACrB,kBAAkB,EAAE,EAAE;IAEtB,cAAc,EAAE,EAAE;IAClB,eAAe,EAAE,EAAE;IACnB,mBAAmB,EAAE,EAAE;IAEvB,cAAc,EAAE,EAAE;IAClB,eAAe,EAAE,EAAE;IAEnB,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IAEf,kBAAkB,EAAE,EAAE;IACtB,iBAAiB,EAAE,EAAE;CACtB,CAAC,CAAC","sourcesContent":["import {defineEnv} from \"@gaubee/node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport const loadJixoEnv = (dir: string) => {\n const cwdJixoEnvFilepath = path.join(dir, \".jixo.env\");\n if (fs.existsSync(cwdJixoEnvFilepath)) {\n process.loadEnvFile(cwdJixoEnvFilepath);\n }\n};\nloadJixoEnv(process.cwd());\n\nexport const safeEnv = defineEnv(\"JIXO\", {\n DEEPSEEK_API_KEY: \"\",\n DEEPSEEK_BASE_URL: \"\",\n\n ANTHROPIC_API_KEY: \"\",\n ANTHROPIC_BASE_URL: \"\",\n\n OPENAI_API_KEY: \"\",\n OPENAI_BASE_URL: \"\",\n OPENAI_ORGANIZATION: \"\",\n\n GOOGLE_API_KEY: \"\",\n GOOGLE_BASE_URL: \"\",\n\n XAI_BASE_URL: \"\",\n XAI_API_KEY: \"\",\n\n DEEPINFRA_BASE_URL: \"\",\n DEEPINFRA_API_KEY: \"\",\n});\n"]}
@@ -0,0 +1,3 @@
1
+ import { FileEntry } from "@gaubee/nodekit";
2
+ export declare function findChangedFilesSinceCommit(messagePattern: string, cwd?: string): Promise<FileEntry[]>;
3
+ //# sourceMappingURL=find-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-changes.d.ts","sourceRoot":"","sources":["../../src/helper/find-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAuB,MAAM,iBAAiB,CAAC;AAUhE,wBAAsB,2BAA2B,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,GAAE,MAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkGjH"}