scai
Version:
> **AI-powered CLI for local code analysis, commit message suggestions, and natural-language queries.** 100% local, private, GDPR-friendly, made in Denmark/EU with ā¤ļø.
68 lines (67 loc) ⢠2.75 kB
JavaScript
import chalk from "chalk";
import { buildLightContext } from "./buildContextualPrompt.js";
/**
* Responsible only for building the contextual prompt text (no file writes).
*/
export async function buildContext(args) {
console.log(chalk.blueBright("\nš¦ Building contextual prompt..."));
// ā³ Now returns a StructuredContext object
const ctx = await buildLightContext(args);
// Serialize to prompt string
const promptContent = serializeContext(ctx);
console.log(chalk.greenBright("ā
Prompt built successfully."));
console.log(chalk.cyan(`[PromptBuilder] Token estimate: ~${Math.round(promptContent.length / 4)} tokens`));
return promptContent;
}
function serializeContext(ctx) {
const out = [];
out.push(`# User Query\n${ctx.initContext?.userQuery}\n`);
if (ctx.initContext?.projectSummary) {
out.push(`# Project Summary\n${ctx.initContext?.projectSummary}\n`);
}
if (ctx.initContext?.moduleSummaries?.length) {
out.push(`# Module Summaries`);
for (const m of ctx.initContext?.moduleSummaries) {
out.push(`- **${m.path}**: ${m.summary}`);
}
out.push("");
}
if (ctx.workingFiles?.length) {
out.push(`# Working Files`);
for (const f of ctx.workingFiles) {
out.push(`\n## ${f.path}`);
if (f.summary)
out.push(`Summary: ${f.summary}`);
if (f.code)
out.push(`\nCode (truncated):\n${f.code.slice(0, 1000)}`);
}
}
if (ctx.analysis?.focus?.relevantFiles?.length) {
out.push(`# Focused Files (semantic analysis)`);
for (const path of ctx.analysis.focus.relevantFiles) {
out.push(`- ${path}`);
}
if (ctx.analysis.focus.rationale) {
out.push(`Rationale: ${ctx.analysis.focus.rationale}`);
}
}
if (ctx.analysis?.understanding) {
out.push(`# Semantic Understanding`);
if (ctx.analysis.understanding.problemStatement)
out.push(`Problem: ${ctx.analysis.understanding.problemStatement}`);
if (ctx.analysis.understanding.assumptions?.length)
out.push(`Assumptions: ${ctx.analysis.understanding.assumptions.join(", ")}`);
if (ctx.analysis.understanding.risks?.length)
out.push(`Risks: ${ctx.analysis.understanding.risks.join(", ")}`);
}
if (ctx.initContext?.repoTree) {
out.push(`# Repo Tree\n${ctx.initContext?.repoTree}\n`);
}
if (ctx.initContext?.kgSample?.length) {
out.push(`# Knowledge Graph Sample`);
for (const e of ctx.initContext?.kgSample) {
out.push(`- ${e.source} -> (${e.relation}) -> ${e.target}`);
}
}
return out.join("\n");
}