eucode-cli 0.1.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 (157) hide show
  1. package/dist/agentFinish.d.ts +10 -0
  2. package/dist/agentFinish.d.ts.map +1 -0
  3. package/dist/agentFinish.js +9 -0
  4. package/dist/agentFinish.js.map +1 -0
  5. package/dist/agentHost.d.ts +29 -0
  6. package/dist/agentHost.d.ts.map +1 -0
  7. package/dist/agentHost.js +94 -0
  8. package/dist/agentHost.js.map +1 -0
  9. package/dist/backgroundJobs.d.ts +12 -0
  10. package/dist/backgroundJobs.d.ts.map +1 -0
  11. package/dist/backgroundJobs.js +66 -0
  12. package/dist/backgroundJobs.js.map +1 -0
  13. package/dist/capabilities.d.ts +9 -0
  14. package/dist/capabilities.d.ts.map +1 -0
  15. package/dist/capabilities.js +46 -0
  16. package/dist/capabilities.js.map +1 -0
  17. package/dist/cliErrors.d.ts +3 -0
  18. package/dist/cliErrors.d.ts.map +1 -0
  19. package/dist/cliErrors.js +16 -0
  20. package/dist/cliErrors.js.map +1 -0
  21. package/dist/cloud.d.ts +17 -0
  22. package/dist/cloud.d.ts.map +1 -0
  23. package/dist/cloud.js +78 -0
  24. package/dist/cloud.js.map +1 -0
  25. package/dist/codeReview.d.ts +8 -0
  26. package/dist/codeReview.d.ts.map +1 -0
  27. package/dist/codeReview.js +64 -0
  28. package/dist/codeReview.js.map +1 -0
  29. package/dist/commands/agent.d.ts +7 -0
  30. package/dist/commands/agent.d.ts.map +1 -0
  31. package/dist/commands/agent.js +86 -0
  32. package/dist/commands/agent.js.map +1 -0
  33. package/dist/commands/capabilities.d.ts +2 -0
  34. package/dist/commands/capabilities.d.ts.map +1 -0
  35. package/dist/commands/capabilities.js +22 -0
  36. package/dist/commands/capabilities.js.map +1 -0
  37. package/dist/commands/chat.d.ts +7 -0
  38. package/dist/commands/chat.d.ts.map +1 -0
  39. package/dist/commands/chat.js +426 -0
  40. package/dist/commands/chat.js.map +1 -0
  41. package/dist/commands/db.d.ts +6 -0
  42. package/dist/commands/db.d.ts.map +1 -0
  43. package/dist/commands/db.js +17 -0
  44. package/dist/commands/db.js.map +1 -0
  45. package/dist/commands/docker.d.ts +5 -0
  46. package/dist/commands/docker.d.ts.map +1 -0
  47. package/dist/commands/docker.js +35 -0
  48. package/dist/commands/docker.js.map +1 -0
  49. package/dist/commands/init.d.ts +3 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +34 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/login.d.ts +5 -0
  54. package/dist/commands/login.d.ts.map +1 -0
  55. package/dist/commands/login.js +32 -0
  56. package/dist/commands/login.js.map +1 -0
  57. package/dist/commands/mcp.d.ts +3 -0
  58. package/dist/commands/mcp.d.ts.map +1 -0
  59. package/dist/commands/mcp.js +65 -0
  60. package/dist/commands/mcp.js.map +1 -0
  61. package/dist/commands/models.d.ts +2 -0
  62. package/dist/commands/models.d.ts.map +1 -0
  63. package/dist/commands/models.js +30 -0
  64. package/dist/commands/models.js.map +1 -0
  65. package/dist/commands/new.d.ts +5 -0
  66. package/dist/commands/new.d.ts.map +1 -0
  67. package/dist/commands/new.js +31 -0
  68. package/dist/commands/new.js.map +1 -0
  69. package/dist/commands/plan.d.ts +6 -0
  70. package/dist/commands/plan.d.ts.map +1 -0
  71. package/dist/commands/plan.js +82 -0
  72. package/dist/commands/plan.js.map +1 -0
  73. package/dist/commands/pr.d.ts +6 -0
  74. package/dist/commands/pr.d.ts.map +1 -0
  75. package/dist/commands/pr.js +29 -0
  76. package/dist/commands/pr.js.map +1 -0
  77. package/dist/commands/test.d.ts +5 -0
  78. package/dist/commands/test.d.ts.map +1 -0
  79. package/dist/commands/test.js +49 -0
  80. package/dist/commands/test.js.map +1 -0
  81. package/dist/config.d.ts +18 -0
  82. package/dist/config.d.ts.map +1 -0
  83. package/dist/config.js +75 -0
  84. package/dist/config.js.map +1 -0
  85. package/dist/createProject.d.ts +5 -0
  86. package/dist/createProject.d.ts.map +1 -0
  87. package/dist/createProject.js +53 -0
  88. package/dist/createProject.js.map +1 -0
  89. package/dist/delegateAgent.d.ts +6 -0
  90. package/dist/delegateAgent.d.ts.map +1 -0
  91. package/dist/delegateAgent.js +34 -0
  92. package/dist/delegateAgent.js.map +1 -0
  93. package/dist/fileContext.d.ts +4 -0
  94. package/dist/fileContext.d.ts.map +1 -0
  95. package/dist/fileContext.js +98 -0
  96. package/dist/fileContext.js.map +1 -0
  97. package/dist/index.d.ts +3 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +207 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/intensity.d.ts +13 -0
  102. package/dist/intensity.d.ts.map +1 -0
  103. package/dist/intensity.js +33 -0
  104. package/dist/intensity.js.map +1 -0
  105. package/dist/mcpConfig.d.ts +3 -0
  106. package/dist/mcpConfig.d.ts.map +1 -0
  107. package/dist/mcpConfig.js +29 -0
  108. package/dist/mcpConfig.js.map +1 -0
  109. package/dist/memory.d.ts +3 -0
  110. package/dist/memory.d.ts.map +1 -0
  111. package/dist/memory.js +16 -0
  112. package/dist/memory.js.map +1 -0
  113. package/dist/modelCatalog.d.ts +9 -0
  114. package/dist/modelCatalog.d.ts.map +1 -0
  115. package/dist/modelCatalog.js +45 -0
  116. package/dist/modelCatalog.js.map +1 -0
  117. package/dist/nodeToolHost.d.ts +4 -0
  118. package/dist/nodeToolHost.d.ts.map +1 -0
  119. package/dist/nodeToolHost.js +320 -0
  120. package/dist/nodeToolHost.js.map +1 -0
  121. package/dist/projectRules.d.ts +2 -0
  122. package/dist/projectRules.d.ts.map +1 -0
  123. package/dist/projectRules.js +57 -0
  124. package/dist/projectRules.js.map +1 -0
  125. package/dist/replOutput.d.ts +21 -0
  126. package/dist/replOutput.d.ts.map +1 -0
  127. package/dist/replOutput.js +84 -0
  128. package/dist/replOutput.js.map +1 -0
  129. package/dist/sqliteQuery.d.ts +3 -0
  130. package/dist/sqliteQuery.d.ts.map +1 -0
  131. package/dist/sqliteQuery.js +40 -0
  132. package/dist/sqliteQuery.js.map +1 -0
  133. package/dist/synthesizeAgentReply.d.ts +32 -0
  134. package/dist/synthesizeAgentReply.d.ts.map +1 -0
  135. package/dist/synthesizeAgentReply.js +173 -0
  136. package/dist/synthesizeAgentReply.js.map +1 -0
  137. package/dist/synthesizeAgentReply.test.d.ts +2 -0
  138. package/dist/synthesizeAgentReply.test.d.ts.map +1 -0
  139. package/dist/synthesizeAgentReply.test.js +35 -0
  140. package/dist/synthesizeAgentReply.test.js.map +1 -0
  141. package/dist/terminalOutput.d.ts +4 -0
  142. package/dist/terminalOutput.d.ts.map +1 -0
  143. package/dist/terminalOutput.js +34 -0
  144. package/dist/terminalOutput.js.map +1 -0
  145. package/dist/ui.d.ts +17 -0
  146. package/dist/ui.d.ts.map +1 -0
  147. package/dist/ui.js +121 -0
  148. package/dist/ui.js.map +1 -0
  149. package/dist/webFetch.d.ts +2 -0
  150. package/dist/webFetch.d.ts.map +1 -0
  151. package/dist/webFetch.js +29 -0
  152. package/dist/webFetch.js.map +1 -0
  153. package/dist/workspace.d.ts +2 -0
  154. package/dist/workspace.d.ts.map +1 -0
  155. package/dist/workspace.js +30 -0
  156. package/dist/workspace.js.map +1 -0
  157. package/package.json +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteQuery.js","sourceRoot":"","sources":["../src/sqliteQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,WAAW,GACf,6GAA6G,CAAC;AAEhH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,kBAAkB,CAAC;IACxC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,OAAO,sDAAsD,CAAC;IAChE,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,8BAA8B,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,GAAW,EACX,OAAO,GAAG,GAAG;IAEb,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,IAAI,CAAC;QACH,UAAU,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,yBAAyB,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,OAAO,GAAG,CAAC;IACpE,MAAM,MAAM,GAAG,SAAS,CACtB,SAAS,EACT,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EACpD,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CACzC,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,OAAO,CACL,6EAA6E;YAC7E,qBAAqB,MAAM,eAAe,CAC3C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACnF,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { ChatMessage } from "@eucode/shared";
2
+ import type { LlmProvider } from "@eucode/llm";
3
+ export interface ToolResultEntry {
4
+ name: string;
5
+ content: string;
6
+ }
7
+ export declare function collectToolResults(messages: ChatMessage[]): ToolResultEntry[];
8
+ export interface GitStatusSummary {
9
+ branch: string;
10
+ tracking?: string;
11
+ ahead?: number;
12
+ behind?: number;
13
+ changedFiles: number;
14
+ staged: number;
15
+ unstaged: number;
16
+ untracked: number;
17
+ }
18
+ export declare function parseGitStatusOutput(output: string): GitStatusSummary | null;
19
+ export declare function formatGitStatusSummary(gitOutput: string): string | null;
20
+ export declare function promptWantsGitSummary(userPrompt: string): boolean;
21
+ export declare function assistantTextLooksLikeGitSummary(text: string): boolean;
22
+ /** Template synthesis from tool output (no LLM). */
23
+ export declare function synthesizeAgentReply(toolResults: ToolResultEntry[], userPrompt: string): string | null;
24
+ export declare function synthesizeAgentReplyWithLlm(provider: LlmProvider, toolResults: ToolResultEntry[], userPrompt: string): Promise<string>;
25
+ export declare function resolveAgentAssistantSummary(options: {
26
+ finalText: string;
27
+ wroteText: boolean;
28
+ history: ChatMessage[];
29
+ userPrompt: string;
30
+ provider?: LlmProvider;
31
+ }): Promise<string | undefined>;
32
+ //# sourceMappingURL=synthesizeAgentReply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesizeAgentReply.d.ts","sourceRoot":"","sources":["../src/synthesizeAgentReply.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,eAAe,EAAE,CAQ7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAwD5E;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuBvE;AA6BD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAIjE;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,eAAe,EAAE,EAC9B,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAgBf;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,eAAe,EAAE,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED,wBAAsB,4BAA4B,CAAC,OAAO,EAAE;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2B9B"}
@@ -0,0 +1,173 @@
1
+ import { formatToolFallbackSummary } from "@eucode/agent";
2
+ import { streamCliChat } from "./cloud.js";
3
+ export function collectToolResults(messages) {
4
+ const out = [];
5
+ for (const m of messages) {
6
+ if (m.role === "tool" && m.content?.trim()) {
7
+ out.push({ name: m.name ?? "tool", content: m.content });
8
+ }
9
+ }
10
+ return out;
11
+ }
12
+ export function parseGitStatusOutput(output) {
13
+ const lines = output.trim().split("\n").filter(Boolean);
14
+ const header = lines.find((l) => l.startsWith("##"));
15
+ if (!header)
16
+ return null;
17
+ let branch = "HEAD";
18
+ let tracking;
19
+ let ahead;
20
+ let behind;
21
+ const headerBody = header.replace(/^##\s+/, "").trim();
22
+ const bracketIdx = headerBody.indexOf(" [");
23
+ const branchPart = (bracketIdx >= 0 ? headerBody.slice(0, bracketIdx) : headerBody).trim();
24
+ const bracket = bracketIdx >= 0 ? headerBody.slice(bracketIdx + 2).replace(/\]$/, "") : "";
25
+ const [branchName, trackRef] = branchPart.split("...");
26
+ branch = branchName?.trim() || "HEAD";
27
+ tracking = trackRef?.trim() || undefined;
28
+ if (bracket) {
29
+ const aheadM = bracket.match(/ahead\s+(\d+)/i);
30
+ const behindM = bracket.match(/behind\s+(\d+)/i);
31
+ if (aheadM)
32
+ ahead = Number(aheadM[1]);
33
+ if (behindM)
34
+ behind = Number(behindM[1]);
35
+ }
36
+ let staged = 0;
37
+ let unstaged = 0;
38
+ let untracked = 0;
39
+ for (const line of lines) {
40
+ if (line.startsWith("##"))
41
+ continue;
42
+ const xy = line.length >= 2 ? line.slice(0, 2) : " ";
43
+ if (xy === "??" || xy[0] === "?" || xy[1] === "?") {
44
+ untracked++;
45
+ continue;
46
+ }
47
+ const hasStaged = xy[0] !== " " && xy[0] !== "?";
48
+ const hasUnstaged = xy[1] !== " " && xy[1] !== "?";
49
+ if (hasStaged)
50
+ staged++;
51
+ if (hasUnstaged)
52
+ unstaged++;
53
+ }
54
+ const changedFiles = staged + unstaged + untracked;
55
+ return {
56
+ branch,
57
+ tracking,
58
+ ahead,
59
+ behind,
60
+ changedFiles,
61
+ staged,
62
+ unstaged,
63
+ untracked,
64
+ };
65
+ }
66
+ export function formatGitStatusSummary(gitOutput) {
67
+ const parsed = parseGitStatusOutput(gitOutput);
68
+ if (!parsed)
69
+ return null;
70
+ const trackNote = parsed.tracking
71
+ ? parsed.ahead || parsed.behind
72
+ ? ` · ${parsed.tracking}${parsed.ahead ? `, +${parsed.ahead} commit` : ""}${parsed.behind ? `, −${parsed.behind} commit` : ""}`
73
+ : ` · traccia ${parsed.tracking}`
74
+ : "";
75
+ const line1 = `Ramo: ${parsed.branch}${trackNote}`;
76
+ const line2 = parsed.changedFiles === 0
77
+ ? "Working tree pulito: nessun file modificato o non tracciato."
78
+ : `${parsed.changedFiles} file toccati (${parsed.staged} in stage, ${parsed.unstaged} modificati, ${parsed.untracked} non tracciati).`;
79
+ const line3 = parsed.changedFiles === 0
80
+ ? "Puoi continuare a lavorare o creare un nuovo branch se serve."
81
+ : "Prossimo passo: `git add` sui file giusti, poi `git commit` con un messaggio chiaro.";
82
+ return [line1, line2, line3].join("\n");
83
+ }
84
+ function stripToolGuardPrefix(content) {
85
+ const trimmed = content.trim();
86
+ if (/^(Già eseguito|Chiamata duplicata)/i.test(trimmed)) {
87
+ const parts = trimmed.split(/\n\n+/);
88
+ return parts[parts.length - 1]?.trim() ?? trimmed;
89
+ }
90
+ return trimmed;
91
+ }
92
+ function findGitStatusOutput(toolResults) {
93
+ for (const r of toolResults) {
94
+ if (r.name === "git" && r.content.trim()) {
95
+ return stripToolGuardPrefix(r.content);
96
+ }
97
+ }
98
+ for (const r of toolResults) {
99
+ if ((r.name === "run_terminal" || r.name === "bash") &&
100
+ /git status/i.test(r.content) &&
101
+ (r.content.includes("##") || /^[ MADRCU?!]{2}/m.test(r.content))) {
102
+ return r.content;
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ export function promptWantsGitSummary(userPrompt) {
108
+ return /git\s+status|riassum|stato\s+(del\s+)?repo|modifiche\s+locali|working\s+tree/i.test(userPrompt);
109
+ }
110
+ export function assistantTextLooksLikeGitSummary(text) {
111
+ return /Ramo:|file toccati|working tree pulito|modificat/i.test(text);
112
+ }
113
+ /** Template synthesis from tool output (no LLM). */
114
+ export function synthesizeAgentReply(toolResults, userPrompt) {
115
+ if (!toolResults.length)
116
+ return null;
117
+ const gitOut = findGitStatusOutput(toolResults);
118
+ if (gitOut && (promptWantsGitSummary(userPrompt) || /git/i.test(userPrompt))) {
119
+ const summary = formatGitStatusSummary(gitOut);
120
+ if (summary)
121
+ return summary;
122
+ }
123
+ const last = toolResults[toolResults.length - 1];
124
+ if (last && promptWantsGitSummary(userPrompt)) {
125
+ const fromLast = formatGitStatusSummary(last.content);
126
+ if (fromLast)
127
+ return fromLast;
128
+ }
129
+ return null;
130
+ }
131
+ export async function synthesizeAgentReplyWithLlm(provider, toolResults, userPrompt) {
132
+ const toolBlock = toolResults
133
+ .map((t) => `### ${t.name}\n${t.content.slice(0, 6000)}`)
134
+ .join("\n\n");
135
+ const messages = [
136
+ {
137
+ role: "system",
138
+ content: "Sei EUCoder. Sintetizza i risultati dei tool in italiano per l'utente. Massimo 3 righe, concise, senza ripetere dump grezzi.",
139
+ },
140
+ {
141
+ role: "user",
142
+ content: `Richiesta utente: ${userPrompt}\n\nRisultati tool:\n${toolBlock}`,
143
+ },
144
+ ];
145
+ return streamCliChat(provider, messages, () => { }, { maxTokens: 256 });
146
+ }
147
+ export async function resolveAgentAssistantSummary(options) {
148
+ if (options.wroteText)
149
+ return undefined;
150
+ if (options.finalText.trim())
151
+ return options.finalText.trim();
152
+ const fromHistory = formatToolFallbackSummary(options.history).trim();
153
+ if (fromHistory)
154
+ return fromHistory;
155
+ const toolResults = collectToolResults(options.history);
156
+ if (!toolResults.length)
157
+ return undefined;
158
+ const templated = synthesizeAgentReply(toolResults, options.userPrompt);
159
+ if (templated?.trim())
160
+ return templated.trim();
161
+ if (!options.provider)
162
+ return undefined;
163
+ try {
164
+ const llm = await synthesizeAgentReplyWithLlm(options.provider, toolResults, options.userPrompt);
165
+ return llm.trim() || undefined;
166
+ }
167
+ catch {
168
+ const last = toolResults[toolResults.length - 1];
169
+ const preview = last?.content.split("\n").slice(0, 3).join("\n").trim();
170
+ return preview || undefined;
171
+ }
172
+ }
173
+ //# sourceMappingURL=synthesizeAgentReply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesizeAgentReply.js","sourceRoot":"","sources":["../src/synthesizeAgentReply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=synthesizeAgentReply.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesizeAgentReply.test.d.ts","sourceRoot":"","sources":["../src/synthesizeAgentReply.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { formatGitStatusSummary, parseGitStatusOutput, synthesizeAgentReply, } from "./synthesizeAgentReply.js";
4
+ describe("parseGitStatusOutput", () => {
5
+ it("parses branch and file counts", () => {
6
+ const out = parseGitStatusOutput(`## feature/foo...origin/feature/foo [ahead 2]
7
+ M apps/cli/src/a.ts
8
+ ?? apps/cli/src/b.ts
9
+ M staged.ts`);
10
+ assert.ok(out);
11
+ assert.equal(out.branch, "feature/foo");
12
+ assert.equal(out.tracking, "origin/feature/foo");
13
+ assert.equal(out.ahead, 2);
14
+ assert.equal(out.changedFiles, 3);
15
+ assert.equal(out.untracked, 1);
16
+ });
17
+ });
18
+ describe("formatGitStatusSummary", () => {
19
+ it("returns three Italian lines", () => {
20
+ const summary = formatGitStatusSummary(`## main...origin/main
21
+ M README.md`);
22
+ assert.ok(summary);
23
+ const lines = summary.split("\n");
24
+ assert.equal(lines.length, 3);
25
+ assert.match(lines[0], /Ramo: main/);
26
+ });
27
+ });
28
+ describe("synthesizeAgentReply", () => {
29
+ it("summarizes git tool output for git status prompts", () => {
30
+ const reply = synthesizeAgentReply([{ name: "git", content: "## dev\n M x.ts" }], "git status: riassumi in 3 righe");
31
+ assert.match(reply, /Ramo: dev/);
32
+ assert.equal(reply.split("\n").length, 3);
33
+ });
34
+ });
35
+ //# sourceMappingURL=synthesizeAgentReply.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesizeAgentReply.test.js","sourceRoot":"","sources":["../src/synthesizeAgentReply.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,oBAAoB,CAAC;;;aAGxB,CAAC,CAAC;QACX,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,GAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,GAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,GAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,GAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,GAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,OAAO,GAAG,sBAAsB,CAAC;aAC9B,CAAC,CAAC;QACX,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,oBAAoB,CAChC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAC7C,iCAAiC,CAClC,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,KAAM,EAAE,WAAW,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Avoid whole-monorepo eslint blowing context; cap output size. */
2
+ export declare function sanitizeTerminalCommand(command: string, cwd: string): string;
3
+ export declare function truncateTerminalOutput(output: string): string;
4
+ //# sourceMappingURL=terminalOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalOutput.d.ts","sourceRoot":"","sources":["../src/terminalOutput.ts"],"names":[],"mappings":"AAMA,oEAAoE;AACpE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAY5E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAe7D"}
@@ -0,0 +1,34 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const MAX_TERMINAL_CHARS = 8_000;
4
+ const TERMINAL_TAIL_LINES = 50;
5
+ /** Avoid whole-monorepo eslint blowing context; cap output size. */
6
+ export function sanitizeTerminalCommand(command, cwd) {
7
+ let cmd = command.trim();
8
+ if (/^eslint\s+(\.\s*|\.?$)/.test(cmd) || /\beslint\s+\.\b/.test(cmd)) {
9
+ const scoped = existsSync(join(cwd, "apps", "cli"))
10
+ ? "eslint apps/cli --max-warnings 0"
11
+ : "eslint . --max-warnings 0";
12
+ cmd = cmd.replace(/\beslint\s+\./g, scoped);
13
+ if (!/\|\s*tail\b/.test(cmd) && !cmd.includes("head")) {
14
+ cmd = `${cmd} 2>&1 | tail -n ${TERMINAL_TAIL_LINES}`;
15
+ }
16
+ }
17
+ return cmd;
18
+ }
19
+ export function truncateTerminalOutput(output) {
20
+ if (output.length <= MAX_TERMINAL_CHARS)
21
+ return output;
22
+ const lines = output.split("\n");
23
+ const omitted = Math.max(0, lines.length - TERMINAL_TAIL_LINES);
24
+ const tail = lines.slice(-TERMINAL_TAIL_LINES).join("\n");
25
+ const prefix = omitted > 0
26
+ ? `[${omitted} righe omesse — ultime ${TERMINAL_TAIL_LINES}]\n`
27
+ : "";
28
+ const combined = prefix + tail;
29
+ if (combined.length <= MAX_TERMINAL_CHARS)
30
+ return combined;
31
+ return (combined.slice(combined.length - MAX_TERMINAL_CHARS) +
32
+ `\n…[output troncato, ${output.length} caratteri]`);
33
+ }
34
+ //# sourceMappingURL=terminalOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalOutput.js","sourceRoot":"","sources":["../src/terminalOutput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,oEAAoE;AACpE,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,GAAW;IAClE,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,2BAA2B,CAAC;QAChC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,GAAG,GAAG,GAAG,GAAG,mBAAmB,mBAAmB,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,IAAI,MAAM,CAAC,MAAM,IAAI,kBAAkB;QAAE,OAAO,MAAM,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GACV,OAAO,GAAG,CAAC;QACT,CAAC,CAAC,IAAI,OAAO,0BAA0B,mBAAmB,KAAK;QAC/D,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,QAAQ,CAAC,MAAM,IAAI,kBAAkB;QAAE,OAAO,QAAQ,CAAC;IAC3D,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,kBAAkB,CAAC;QACpD,wBAAwB,MAAM,CAAC,MAAM,aAAa,CACnD,CAAC;AACJ,CAAC"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { SelectableModelGroup } from "@eucode/shared";
2
+ import type { IntensityMode } from "./intensity.js";
3
+ export declare function printBanner(modelId: string, intensity: IntensityMode): void;
4
+ export declare function printHelpHint(): void;
5
+ export declare function printReplHelp(agentMode?: boolean): void;
6
+ export declare function formatStatusPrompt(modelId: string, intensity: IntensityMode, agentMode?: boolean): string;
7
+ export declare function printModelGroups(groups: SelectableModelGroup[], currentModelId: string, hint?: string): void;
8
+ export declare const c: {
9
+ user: (s: string) => string;
10
+ assistant: (s: string) => string;
11
+ dim: import("picocolors/types.js").Formatter;
12
+ warn: import("picocolors/types.js").Formatter;
13
+ err: import("picocolors/types.js").Formatter;
14
+ accent: import("picocolors/types.js").Formatter;
15
+ ok: import("picocolors/types.js").Formatter;
16
+ };
17
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAwB3E;AAED,wBAAgB,aAAa,IAAI,IAAI,CAkBpC;AAED,wBAAgB,aAAa,CAAC,SAAS,UAAQ,GAAG,IAAI,CA0CrD;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,aAAa,EACxB,SAAS,UAAQ,GAChB,MAAM,CAWR;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,oBAAoB,EAAE,EAC9B,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAuBN;AAED,eAAO,MAAM,CAAC;cACF,MAAM;mBACD,MAAM;;;;;;CAMtB,CAAC"}
package/dist/ui.js ADDED
@@ -0,0 +1,121 @@
1
+ import boxen from "boxen";
2
+ import pc from "picocolors";
3
+ import { intensityLabel } from "./intensity.js";
4
+ export function printBanner(modelId, intensity) {
5
+ const art = [
6
+ " ███████╗██╗ ██╗ ██████╗ ██████╗ ███████╗██████╗ ",
7
+ " ██╔════╝██║ ██║██╔════╝██╔═══██╗██╔════╝██╔══██╗",
8
+ " █████╗ ██║ ██║██║ ██║ ██║█████╗ ██████╔╝",
9
+ " ██╔══╝ ██║ ██║██║ ██║ ██║██╔══╝ ██╔══██╗",
10
+ " ███████╗╚██████╔╝╚██████╗╚██████╔╝███████╗██║ ██║",
11
+ " ╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝",
12
+ ].join("\n");
13
+ const footer = [
14
+ pc.dim("REPL interattiva · Cloud EU"),
15
+ `${pc.cyan(modelId)} · ${pc.yellow(intensityLabel(intensity))}`,
16
+ pc.dim("Digita /help per i comandi"),
17
+ ].join("\n");
18
+ console.log(boxen(`${pc.cyan(art)}\n${footer}`, {
19
+ padding: 1,
20
+ margin: { top: 0, bottom: 1, left: 0, right: 0 },
21
+ borderColor: "cyan",
22
+ borderStyle: "round",
23
+ }));
24
+ }
25
+ export function printHelpHint() {
26
+ console.log(pc.dim("Comandi: ") +
27
+ pc.cyan("eucoder start") +
28
+ pc.dim(" · ") +
29
+ pc.cyan("eucoder chat") +
30
+ pc.dim(" · ") +
31
+ pc.cyan("eucoder agent") +
32
+ pc.dim(" · ") +
33
+ pc.cyan("eucoder capabilities") +
34
+ pc.dim(" · ") +
35
+ pc.cyan("eucoder mcp") +
36
+ pc.dim(" · ") +
37
+ pc.cyan("eucoder test") +
38
+ pc.dim(" · ") +
39
+ pc.cyan("eucoder init") +
40
+ pc.dim("\n"));
41
+ }
42
+ export function printReplHelp(agentMode = false) {
43
+ const agentLines = agentMode
44
+ ? [
45
+ `${pc.cyan("/init")} Crea AGENTS.md nel progetto`,
46
+ `${pc.cyan("/agent")} <task> Sub-agent (subprocess)`,
47
+ `${pc.cyan("/plan")} <task> Analisi read-only senza modifiche`,
48
+ `${pc.cyan("/background")} <task> Job in background (1 alla volta)`,
49
+ `${pc.cyan("/tasks")} Stato job background`,
50
+ `${pc.cyan("/diff")} git diff colorato`,
51
+ `${pc.cyan("/code-review")} [--fix] Review del diff`,
52
+ `${pc.cyan("/memory")} <nota> Append .eucode/memory.md`,
53
+ `${pc.cyan("/mcp")} list|test Server MCP`,
54
+ `${pc.dim("Menziona @percorso/file.ts per iniettare contesto")}`,
55
+ "",
56
+ ]
57
+ : [];
58
+ const body = [
59
+ `${pc.bold("Comandi REPL")}`,
60
+ "",
61
+ ...agentLines,
62
+ `${pc.cyan("/help")} Mostra questo aiuto`,
63
+ `${pc.cyan("/exit")} Esci dalla chat`,
64
+ `${pc.cyan("/clear")} Cancella la cronologia`,
65
+ `${pc.cyan("/compact")} Come /clear (contesto agent)`,
66
+ `${pc.cyan("/model")} <id> Cambia modello`,
67
+ `${pc.cyan("/models")} Elenco modelli (raggruppati)`,
68
+ `${pc.cyan("/intensity")} <modo> veloce · bilanciato · profondo`,
69
+ `${pc.cyan("/fast")} Intensità Veloce`,
70
+ `${pc.cyan("/balanced")} Intensità Bilanciato`,
71
+ `${pc.cyan("/deep")} Intensità Profondo`,
72
+ "",
73
+ pc.dim("Scorciatoie: /veloce /bilanciato /profondo · Ctrl+C per uscire"),
74
+ ].join("\n");
75
+ console.log(boxen(body, {
76
+ padding: { top: 0, bottom: 0, left: 1, right: 1 },
77
+ borderColor: "gray",
78
+ borderStyle: "round",
79
+ }));
80
+ }
81
+ export function formatStatusPrompt(modelId, intensity, agentMode = false) {
82
+ const mode = agentMode ? pc.green("agent") + pc.dim(" · ") : "";
83
+ return (pc.dim("[") +
84
+ pc.cyan(modelId) +
85
+ pc.dim("] [") +
86
+ pc.yellow(intensityLabel(intensity)) +
87
+ pc.dim("] ") +
88
+ mode +
89
+ pc.cyan("› "));
90
+ }
91
+ export function printModelGroups(groups, currentModelId, hint) {
92
+ const lines = [pc.bold("Modelli disponibili"), ""];
93
+ if (hint)
94
+ lines.push(pc.dim(hint), "");
95
+ for (const group of groups) {
96
+ const badge = group.badge ? pc.dim(` [${group.badge}]`) : "";
97
+ lines.push(pc.bold(`${group.label}${badge}`));
98
+ for (const m of group.models) {
99
+ const active = m.id === currentModelId ? pc.green(" ●") : " ";
100
+ const free = m.showFreeBadge ? pc.dim(" F") : "";
101
+ lines.push(`${active} ${pc.cyan(m.id)}${free} ${pc.dim(m.displayName)}`);
102
+ }
103
+ lines.push("");
104
+ }
105
+ lines.push(pc.dim("Usa /model <id> per cambiare modello"));
106
+ console.log(boxen(lines.join("\n").trimEnd(), {
107
+ padding: { top: 0, bottom: 0, left: 1, right: 1 },
108
+ borderColor: "cyan",
109
+ borderStyle: "round",
110
+ }));
111
+ }
112
+ export const c = {
113
+ user: (s) => pc.bold(pc.blue("Tu: ")) + s,
114
+ assistant: (s) => pc.bold(pc.green("EUCoder: ")) + s,
115
+ dim: pc.dim,
116
+ warn: pc.yellow,
117
+ err: pc.red,
118
+ accent: pc.cyan,
119
+ ok: pc.green,
120
+ };
121
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function fetchUrlAsText(url: string, maxChars?: number): Promise<string>;
2
+ //# sourceMappingURL=webFetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webFetch.d.ts","sourceRoot":"","sources":["../src/webFetch.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,SAAkB,GACzB,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
@@ -0,0 +1,29 @@
1
+ const MAX_FETCH_CHARS = 12_000;
2
+ const FETCH_TIMEOUT_MS = 15_000;
3
+ export async function fetchUrlAsText(url, maxChars = MAX_FETCH_CHARS) {
4
+ const parsed = new URL(url);
5
+ if (!["http:", "https:"].includes(parsed.protocol)) {
6
+ throw new Error("Solo URL http/https.");
7
+ }
8
+ const controller = new AbortController();
9
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
10
+ try {
11
+ const res = await fetch(url, {
12
+ signal: controller.signal,
13
+ headers: { "User-Agent": "EUCoder-CLI/0.2" },
14
+ });
15
+ if (!res.ok) {
16
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
17
+ }
18
+ const contentType = res.headers.get("content-type") ?? "";
19
+ const body = await res.text();
20
+ const trimmed = body.length > maxChars
21
+ ? `${body.slice(0, maxChars)}\n…[troncato, ${body.length} caratteri]`
22
+ : body;
23
+ return `URL: ${url}\nContent-Type: ${contentType}\n\n${trimmed}`;
24
+ }
25
+ finally {
26
+ clearTimeout(timer);
27
+ }
28
+ }
29
+ //# sourceMappingURL=webFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webFetch.js","sourceRoot":"","sources":["../src/webFetch.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,QAAQ,GAAG,eAAe;IAE1B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE;SAC7C,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,GAAG,QAAQ;YACpB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB,IAAI,CAAC,MAAM,aAAa;YACrE,CAAC,CAAC,IAAI,CAAC;QACX,OAAO,QAAQ,GAAG,mBAAmB,WAAW,OAAO,OAAO,EAAE,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isProjectDirectory(cwd: string): Promise<boolean>;
2
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAaA,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAetE"}
@@ -0,0 +1,30 @@
1
+ import { access, readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const PROJECT_MARKERS = [
4
+ "package.json",
5
+ ".git",
6
+ "AGENTS.md",
7
+ "Cargo.toml",
8
+ "pyproject.toml",
9
+ "go.mod",
10
+ "pnpm-workspace.yaml",
11
+ ];
12
+ export async function isProjectDirectory(cwd) {
13
+ for (const marker of PROJECT_MARKERS) {
14
+ try {
15
+ await access(join(cwd, marker));
16
+ return true;
17
+ }
18
+ catch {
19
+ /* try next */
20
+ }
21
+ }
22
+ try {
23
+ const entries = await readdir(cwd);
24
+ return entries.some((e) => !e.startsWith("."));
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,eAAe,GAAG;IACtB,cAAc;IACd,MAAM;IACN,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,QAAQ;IACR,qBAAqB;CACtB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAClD,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "eucode-cli",
3
+ "version": "0.1.0",
4
+ "description": "EUCoder terminal CLI — chat e agent cloud",
5
+ "type": "module",
6
+ "bin": {
7
+ "eucoder": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "keywords": [
14
+ "cli",
15
+ "ai",
16
+ "agent",
17
+ "coding-assistant",
18
+ "eucode"
19
+ ],
20
+ "author": "EUCode Team",
21
+ "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/eucode/eucode.git",
25
+ "directory": "apps/cli"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc",
29
+ "dev": "tsc --watch",
30
+ "typecheck": "tsc --noEmit",
31
+ "test": "pnpm run build && node --test dist/synthesizeAgentReply.test.js",
32
+ "start": "node dist/index.js"
33
+ },
34
+ "dependencies": {
35
+ "@eucode/agent": "workspace:*",
36
+ "@eucode/context": "workspace:*",
37
+ "@eucode/llm": "workspace:*",
38
+ "@eucode/shared": "workspace:*",
39
+ "@eucode/templates": "workspace:*",
40
+ "boxen": "^8.0.1",
41
+ "commander": "^13.1.0",
42
+ "ora": "^8.2.0",
43
+ "picocolors": "^1.1.1"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.10.5",
47
+ "typescript": "^5.7.3"
48
+ }
49
+ }