fluxflow-cli 3.14.0 → 3.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fluxflow.js +23 -14
- package/package.json +73 -73
package/dist/fluxflow.js
CHANGED
|
@@ -6703,7 +6703,7 @@ Tool calls: ONLY use [tool:functions.ToolName(args)]
|
|
|
6703
6703
|
|
|
6704
6704
|
**TOOL USAGE POLICY:**
|
|
6705
6705
|
- MAX 4 TOOL CALLS/TURN${mode === "Flux" ? " (Todo: 4+, Run: max 1 or 2 consecutive)" : ""}
|
|
6706
|
-
${mode === "Flux" ? "- Same file, many edits? Prefer multi search-replace in Patch \u2190 **HIGHLY RECOMMENDED**\n- Tool denied?Use `Ask` immediately for user guidance
|
|
6706
|
+
${mode === "Flux" ? "- Same file, many edits? Prefer multi search-replace in Patch \u2190 **HIGHLY RECOMMENDED**\n- Tool denied?Use `Ask` immediately for user guidance \u2190 ** MANDATORY **\n- FileMap > ReadFile for efficient file understanding\n- Need specific text ? SearchKeyword > Guessing/ReadFile\n- Huge files ? SearchKeyword > Full Read\n- **Update Todos from realtime progress EVERY TURN**\n" : ""}
|
|
6707
6707
|
- COMMUNICATION TOOLS -
|
|
6708
6708
|
1. [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity: MUST for path divergence, security risk. Ask, don't finish/guess. Suggest best options; no preferences. Keep options short
|
|
6709
6709
|
|
|
@@ -6712,12 +6712,12 @@ ${mode === "Flux" ? "- Same file, many edits? Prefer multi search-replace in Pat
|
|
|
6712
6712
|
2. [tool:functions.WebScrape(url="...")]. Proactive use for specific webpage/docs/api
|
|
6713
6713
|
|
|
6714
6714
|
${mode === "Flux" ? `- WORKSPACE TOOLS (path = relative; FIRST ARGUMENT, path separator: '/') -
|
|
6715
|
-
1. [tool:functions.ReadFile(path="...", startLine="integer", endLine="integer")]. ${aiProvider !== "Google" ? `${isMultiModal ? `Supports images/docs` :
|
|
6715
|
+
1. [tool:functions.ReadFile(path="...", startLine="integer", endLine="integer")]. ${aiProvider !== "Google" ? `${isMultiModal ? `Supports images/docs` : ``}` : `Supports images/docs`}
|
|
6716
6716
|
2. [tool:functions.ReadFolder(path="...", recurse="integer 0-4 optional, default: 0")]. Detailed DIR stats including File Sizes
|
|
6717
|
-
3. [tool:functions.FileMap(path="file")]. Shows file structure
|
|
6718
|
-
4. [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical
|
|
6717
|
+
3. [tool:functions.FileMap(path="file")]. Shows file structure
|
|
6718
|
+
4. [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical patchs, TARGET SMALLEST SNIPPETS/SUB-STRINGS. allowMultiple: Replace all matches. Use replaceContent2/newContent2... for multi blocks. Verify DIFFs
|
|
6719
6719
|
5. [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile
|
|
6720
|
-
6. [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")].
|
|
6720
|
+
6. [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")]. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code
|
|
6721
6721
|
7. [tool:functions.Run(command="...")]. Runs ${osDetected === "Windows" ? isPsAvailable() ? `WINDOWS POWERSHELL` : `WINDOWS CMD ONLY` : `BASH`} command. Destructive/Irreversible ops \u2192 Ask user
|
|
6722
6722
|
8. [tool:functions.Todo(method="create/append/get", tasks=[ARRAY OF STRINGS], markDone=[ARRAY OF TASKS])]. Task list, no Markdown in arrays. Analyze request: if long multi-task, break it down & create Todos BEFORE starting. \`tasks\` & \`markDone\` optional with \`get\`. Use \`get + markDone\` to complete tasks, or \`create + markDone\` to create completed tasks. **UPDATE EVERY TURN**${enableSubAgents ? '\n9. [tool:functions.Await(time="seconds")]. For waiting without exiting agent loop, 15s - 180s' : ""}
|
|
6723
6723
|
${_cachedAdvanceRollback ? `
|
|
@@ -6732,7 +6732,7 @@ Invocations:
|
|
|
6732
6732
|
- Invoke (async/background, \u22647 parallel). Parallelize long tasks. NEVER repeat while active
|
|
6733
6733
|
- InvokeSync (sync/blocking). Sequential, repetitive or delegated tasks. Saves tokens/cost
|
|
6734
6734
|
1. [agent:generalist.InvokeSync/Invoke(title="...", task="...")]. Task must be detailed: exact file paths, imports/exports, dependencies & folder structure
|
|
6735
|
-
2. [agent:generalist.GetProgress(id="...")]. Check async task progress. If still running, continue your work. Wait exponentially longer between checks
|
|
6735
|
+
2. [agent:generalist.GetProgress(id="...")]. Check async task progress. If still running, continue your work. Wait exponentially longer between checks
|
|
6736
6736
|
3. [agent:generalist.Cancel(id="...")]. Cancel async task ONLY if stalled (2m+) or clearly incorrect` : ""}`.trim() : `- CREATIVE TOOLS (path = relative to CWD & WILL BE FIRST ARGUMENT, path separator: '/') -
|
|
6737
6737
|
1. [tool:functions.WritePDF(path="...", content="...", orientation="...")]. PROACTIVE A4 PAGE BREAKS MUST IN CSS. HTML/CSS for PREMIUM layout, stable margins & headers/footers, NO WATERMARKS
|
|
6738
6738
|
2. [tool:functions.WriteDoc(path="...", content="...")]. A4 Word document, NO WATERMARKS, stable margins & headers/footers
|
|
@@ -8244,7 +8244,7 @@ ${projectContextBlock}${isMemoryEnabled ? `
|
|
|
8244
8244
|
- Sensitive files? Ask before Read${isSystemDir ? "\n- PROTECTED DIRECTORY" : ""}
|
|
8245
8245
|
|
|
8246
8246
|
-- CHAT FORMATTING --
|
|
8247
|
-
- GFM Markdown
|
|
8247
|
+
- GFM Markdown ONLY
|
|
8248
8248
|
- Same Language as User Query
|
|
8249
8249
|
- Before tool calls, emit one brief current update. After tool calls, emit no further text this turn
|
|
8250
8250
|
- On completion: summarize changes (why) + edited files${mode === "Flux" ? "" : "\n- Use Kaomojis HEAVILY"}
|
|
@@ -8590,7 +8590,7 @@ var init_history = __esm({
|
|
|
8590
8590
|
const extractedLatest = extractPrompt(latestUserMsg);
|
|
8591
8591
|
const extractedFirst = extractPrompt(firstUserMsg);
|
|
8592
8592
|
if (existingChat && existingChat.prompt) {
|
|
8593
|
-
if (Math.random() < 0.
|
|
8593
|
+
if (Math.random() < 0.5 && extractedLatest) {
|
|
8594
8594
|
prompt = extractedLatest;
|
|
8595
8595
|
} else {
|
|
8596
8596
|
prompt = existingChat.prompt;
|
|
@@ -17673,7 +17673,7 @@ Error Log can be found in ${path25.join(LOGS_DIR, "agent", "error.log")}`);
|
|
|
17673
17673
|
"filemap": '- [tool:functions.FileMap(path="file")]. Shows file structure, functions, class, import/export, variables',
|
|
17674
17674
|
"patchfile": '- [tool:functions.PatchFile(path="...", allowMultiple="bool optional, default: false", replaceContent1="...", newContent1="...", ...MAX 15)]. Surgical patch. allowMultiple: Replace all matches. Multiple patches same file? Use replaceContent2/newContent2... Verify DIFFs',
|
|
17675
17675
|
"writefile": '- [tool:functions.WriteFile(path="...", content="...")]. Creates/Overwrites. File Exist? PatchFile > WriteFile. VERIFY IMPORTS',
|
|
17676
|
-
"searchkeyword": '- [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")].
|
|
17676
|
+
"searchkeyword": '- [tool:functions.SearchKeyword(keyword="...", path="optional, target directory/filename", subString="bool optional, default: false", regex="bool optional, default: auto")]. path limits scope to a file/dir. Find definitions/logic without full reads. Locate relevant code',
|
|
17677
17677
|
"websearch": '- [tool:functions.WebSearch(query="...", aiMode="bool optional, default: false", limit="integer 3-10, aiMode: exclude")]. Usage: unknown info/docs. aiMode: LLM search',
|
|
17678
17678
|
"webscrape": '- [tool:functions.WebScrape(url="...")]. Proactive use for specific webpage/docs/api',
|
|
17679
17679
|
"ask": `- [tool:functions.Ask(question="...", optionA="option::description", ...MAX 4)]. Ambiguity: MUST for path divergence, security risk. Ask, don't finish/guess. Suggest best options; no preferences. Keep options short`
|
|
@@ -20970,7 +20970,7 @@ ${cleanText}`, color: "magenta" }];
|
|
|
20970
20970
|
case "/chats": {
|
|
20971
20971
|
const run = async () => {
|
|
20972
20972
|
const history = await loadHistory();
|
|
20973
|
-
const list = Object.entries(history).map(([id, info]) => `\u2022 ${id}: ${info.name}`).join("\n");
|
|
20973
|
+
const list = Object.entries(history).sort((a, b) => (b[1].updatedAt || 0) - (a[1].updatedAt || 0)).map(([id, info]) => `\u2022 ${id}: ${info.name}`).join("\n");
|
|
20974
20974
|
setMessages((prev) => {
|
|
20975
20975
|
setCompletedIndex(prev.length + 1);
|
|
20976
20976
|
return [...prev, { id: Date.now(), role: "system", text: `[HISTORY] Saved Chats:
|
|
@@ -22151,7 +22151,8 @@ Selection: ${val}`,
|
|
|
22151
22151
|
);
|
|
22152
22152
|
};
|
|
22153
22153
|
const renderProgressBar = (label, current, limit) => {
|
|
22154
|
-
const
|
|
22154
|
+
const actualPercent = limit > 0 ? Math.min(100, current / limit * 100) : 0;
|
|
22155
|
+
const percent = Math.round(actualPercent);
|
|
22155
22156
|
const barWidth = 15;
|
|
22156
22157
|
const filledCount = Math.round(percent / 100 * barWidth);
|
|
22157
22158
|
const barStr = "\u2588".repeat(filledCount) + "\u2591".repeat(Math.max(0, barWidth - filledCount));
|
|
@@ -22164,7 +22165,15 @@ Selection: ${val}`,
|
|
|
22164
22165
|
const isTokens = label.toLowerCase().includes("token");
|
|
22165
22166
|
const displayLimit = shouldClearValue(limit) ? "\u221E" : isTokens ? formatTokens(limit) : limit;
|
|
22166
22167
|
const displayCurrent = isTokens ? formatTokens(current) : current;
|
|
22167
|
-
|
|
22168
|
+
let displayPercent;
|
|
22169
|
+
if (actualPercent === 0) {
|
|
22170
|
+
displayPercent = "0%";
|
|
22171
|
+
} else if (actualPercent > 0 && actualPercent < 1) {
|
|
22172
|
+
displayPercent = "<1%";
|
|
22173
|
+
} else {
|
|
22174
|
+
displayPercent = `${percent}%`;
|
|
22175
|
+
}
|
|
22176
|
+
return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "row", paddingLeft: 4, key: label }, /* @__PURE__ */ React16.createElement(Box14, { width: 18 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, label, ": ")), /* @__PURE__ */ React16.createElement(Text16, { color: barColor }, barStr), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, " ", displayPercent, " (", displayCurrent, "/", displayLimit, ")"));
|
|
22168
22177
|
};
|
|
22169
22178
|
const renderActiveView = () => {
|
|
22170
22179
|
switch (activeView) {
|
|
@@ -22466,7 +22475,7 @@ Selection: ${val}`,
|
|
|
22466
22475
|
}
|
|
22467
22476
|
const resetDate = new Date(today.getFullYear(), resetMonth, resetDay);
|
|
22468
22477
|
const monthName = resetDate.toLocaleString("default", { month: "short" });
|
|
22469
|
-
resetInfo =
|
|
22478
|
+
resetInfo = `${monthName}-${resetDay}`;
|
|
22470
22479
|
}
|
|
22471
22480
|
return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 1, justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true, underline: true }, "BUDGET LIMIT STATUS"), /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "[ ESC to Close ]")), limitsNotSet ? /* @__PURE__ */ React16.createElement(Box14, { padding: 1, justifyContent: "center", alignItems: "center", width: "100%" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, "LIMITS NOT SET")) : usingProviderBudgets && configuredProviders.length > 0 ? /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", gap: 1, width: "100%" }, configuredProviders.map((prov) => {
|
|
22472
22481
|
const pb = providerBudgetsMap[prov];
|
|
@@ -22483,7 +22492,7 @@ Selection: ${val}`,
|
|
|
22483
22492
|
provMonthlyCurrent += monthlyModels[m]?.tokens || 0;
|
|
22484
22493
|
}
|
|
22485
22494
|
return /* @__PURE__ */ React16.createElement(Box14, { key: prov, flexDirection: "column", borderStyle: "single", borderColor: colors.borderMuted, paddingX: 1, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { marginBottom: 0 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.primary, bold: true }, "\u25C6 ", prov)), renderProgressBar("Daily Requests", provReqCurrent, pb.agentLimit || 99999999, "cyan"), renderProgressBar("Daily Tokens", provTokenCurrent, pb.tokenLimit || 99999999999999, "green"), renderProgressBar("Monthly Tokens", provMonthlyCurrent, pb.monthlyTokenLimit || 99999999999999, "yellow"));
|
|
22486
|
-
}), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset
|
|
22495
|
+
}), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.accent || "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary || "blue", bold: true }, "Rolling 30-Day Window"))) : /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "single", borderColor: colors.borderMuted, paddingX: 1, width: "100%" }, renderProgressBar("Daily Requests", reqCurrent, reqLimit, "cyan"), renderProgressBar("Daily Tokens", tokenCurrent, tokenLimit, "green"), renderProgressBar("Monthly Tokens", monthlyCurrent, monthlyLimit, "yellow"), resetInfo ? /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.accent || "magenta", bold: true }, resetInfo)) : /* @__PURE__ */ React16.createElement(Box14, { marginLeft: 4, marginTop: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted }, "Monthly Reset: "), /* @__PURE__ */ React16.createElement(Text16, { color: colors.secondary || "blue", bold: true }, "Rolling 30-Day Window"))));
|
|
22487
22496
|
}
|
|
22488
22497
|
case "input":
|
|
22489
22498
|
return /* @__PURE__ */ React16.createElement(Box14, { flexDirection: "column", borderStyle: "round", borderColor: colors.borderMuted, padding: 0, width: "100%" }, /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, "DATA CONFIGURATION")), inputConfig?.note && /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.textMuted, italic: true }, inputConfig.note)), /* @__PURE__ */ React16.createElement(Box14, { paddingX: 1, flexDirection: "row" }, /* @__PURE__ */ React16.createElement(Text16, { color: colors.text, bold: true }, inputConfig?.label, " "), /* @__PURE__ */ React16.createElement(
|
package/package.json
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "fluxflow-cli",
|
|
3
|
-
"version": "3.14.
|
|
4
|
-
"date": "2026-07-30",
|
|
5
|
-
"description": "A High-Fidelity Agentic CLI with Sub-Agents for the Flux Era.",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"ai",
|
|
8
|
-
"agent",
|
|
9
|
-
"terminal",
|
|
10
|
-
"cli",
|
|
11
|
-
"gemini",
|
|
12
|
-
"ink",
|
|
13
|
-
"flux",
|
|
14
|
-
"fluxflow"
|
|
15
|
-
],
|
|
16
|
-
"license": "MIT",
|
|
17
|
-
"repository": {
|
|
18
|
-
"type": "git",
|
|
19
|
-
"url": "git+https://github.com/KushalRoyChowdhury/fluxflow-cli.git"
|
|
20
|
-
},
|
|
21
|
-
"engines": {
|
|
22
|
-
"node": ">=20",
|
|
23
|
-
"vscode": "^1.90.0"
|
|
24
|
-
},
|
|
25
|
-
"files": [
|
|
26
|
-
"dist",
|
|
27
|
-
"README.md",
|
|
28
|
-
"package.json",
|
|
29
|
-
"ARCHITECTURE.md",
|
|
30
|
-
"TOOLS.md",
|
|
31
|
-
"UI_FEATURES.md",
|
|
32
|
-
"cat.txt",
|
|
33
|
-
".puppeteerrc.cjs",
|
|
34
|
-
"flux-flow.cjs",
|
|
35
|
-
"model_config.json"
|
|
36
|
-
],
|
|
37
|
-
"type": "module",
|
|
38
|
-
"bin": {
|
|
39
|
-
"fluxflow-cli": "dist/fluxflow.js",
|
|
40
|
-
"fluxflow": "dist/fluxflow.js"
|
|
41
|
-
},
|
|
42
|
-
"scripts": {
|
|
43
|
-
"start": "tsx ./src/cli.jsx",
|
|
44
|
-
"build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --outfile=./dist/fluxflow.js --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv"
|
|
45
|
-
},
|
|
46
|
-
"dependencies": {
|
|
47
|
-
"@google/genai": "^1.52.0",
|
|
48
|
-
"chalk": "^5.6.2",
|
|
49
|
-
"diff": "^9.0.0",
|
|
50
|
-
"dotenv": "^17.4.2",
|
|
51
|
-
"fs-extra": "^11.3.4",
|
|
52
|
-
"gradient-string": "^3.0.0",
|
|
53
|
-
"html-to-docx": "^1.8.0",
|
|
54
|
-
"ink": "^7.0.1",
|
|
55
|
-
"ink-gradient": "^4.0.1",
|
|
56
|
-
"ink-select-input": "^6.2.0",
|
|
57
|
-
"ink-spinner": "^5.0.0",
|
|
58
|
-
"ink-text-input": "^6.0.0",
|
|
59
|
-
"nanoid": "^5.1.9",
|
|
60
|
-
"node-pty": "^1.1.0",
|
|
61
|
-
"pdf-lib": "^1.17.1",
|
|
62
|
-
"puppeteer": "24.43.1",
|
|
63
|
-
"react": "^19.2.5",
|
|
64
|
-
"web-tree-sitter": "^0.25.10",
|
|
65
|
-
"ws": "^8.21.0",
|
|
66
|
-
"zod": "^4.3.6"
|
|
67
|
-
},
|
|
68
|
-
"devDependencies": {
|
|
69
|
-
"@types/react": "^19.2.14",
|
|
70
|
-
"esbuild": "^0.28.0",
|
|
71
|
-
"tsx": "^4.21.0"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "fluxflow-cli",
|
|
3
|
+
"version": "3.14.1",
|
|
4
|
+
"date": "2026-07-30",
|
|
5
|
+
"description": "A High-Fidelity Agentic CLI with Sub-Agents for the Flux Era.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"ai",
|
|
8
|
+
"agent",
|
|
9
|
+
"terminal",
|
|
10
|
+
"cli",
|
|
11
|
+
"gemini",
|
|
12
|
+
"ink",
|
|
13
|
+
"flux",
|
|
14
|
+
"fluxflow"
|
|
15
|
+
],
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/KushalRoyChowdhury/fluxflow-cli.git"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20",
|
|
23
|
+
"vscode": "^1.90.0"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md",
|
|
28
|
+
"package.json",
|
|
29
|
+
"ARCHITECTURE.md",
|
|
30
|
+
"TOOLS.md",
|
|
31
|
+
"UI_FEATURES.md",
|
|
32
|
+
"cat.txt",
|
|
33
|
+
".puppeteerrc.cjs",
|
|
34
|
+
"flux-flow.cjs",
|
|
35
|
+
"model_config.json"
|
|
36
|
+
],
|
|
37
|
+
"type": "module",
|
|
38
|
+
"bin": {
|
|
39
|
+
"fluxflow-cli": "dist/fluxflow.js",
|
|
40
|
+
"fluxflow": "dist/fluxflow.js"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"start": "tsx ./src/cli.jsx",
|
|
44
|
+
"build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --outfile=./dist/fluxflow.js --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@google/genai": "^1.52.0",
|
|
48
|
+
"chalk": "^5.6.2",
|
|
49
|
+
"diff": "^9.0.0",
|
|
50
|
+
"dotenv": "^17.4.2",
|
|
51
|
+
"fs-extra": "^11.3.4",
|
|
52
|
+
"gradient-string": "^3.0.0",
|
|
53
|
+
"html-to-docx": "^1.8.0",
|
|
54
|
+
"ink": "^7.0.1",
|
|
55
|
+
"ink-gradient": "^4.0.1",
|
|
56
|
+
"ink-select-input": "^6.2.0",
|
|
57
|
+
"ink-spinner": "^5.0.0",
|
|
58
|
+
"ink-text-input": "^6.0.0",
|
|
59
|
+
"nanoid": "^5.1.9",
|
|
60
|
+
"node-pty": "^1.1.0",
|
|
61
|
+
"pdf-lib": "^1.17.1",
|
|
62
|
+
"puppeteer": "24.43.1",
|
|
63
|
+
"react": "^19.2.5",
|
|
64
|
+
"web-tree-sitter": "^0.25.10",
|
|
65
|
+
"ws": "^8.21.0",
|
|
66
|
+
"zod": "^4.3.6"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@types/react": "^19.2.14",
|
|
70
|
+
"esbuild": "^0.28.0",
|
|
71
|
+
"tsx": "^4.21.0"
|
|
72
|
+
}
|
|
73
|
+
}
|