feat: turborepo monorepo scaffold and provisioning

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-21 16:44:30 -08:00
parent e22f5e379f
commit 8587644a62
35 changed files with 841 additions and 5 deletions

View File

@@ -35,6 +35,16 @@ export interface ProjectChatContext {
q3?: string;
updatedAt?: string;
};
/** Gitea monorepo */
giteaRepo?: string | null;
giteaRepoUrl?: string | null;
/** Turborepo apps */
apps?: Array<{
name: string;
path: string;
domain?: string | null;
coolifyServiceUuid?: string | null;
}>;
};
/** Phase-specific artifacts */
@@ -261,6 +271,9 @@ export async function buildProjectContextForChat(
githubRepoUrl: projectData.githubRepoUrl ?? null,
extensionLinked: projectData.extensionLinked ?? false,
visionAnswers: projectData.visionAnswers ?? {},
giteaRepo: projectData.giteaRepo ?? null,
giteaRepoUrl: projectData.giteaRepoUrl ?? null,
apps: projectData.apps ?? [],
},
phaseData: {
canonicalProductModel: projectData.phaseData?.canonicalProductModel ?? null,
@@ -342,6 +355,19 @@ export function formatContextForPrompt(context: ProjectChatContext): string {
`Phase: ${context.project.currentPhase} (${context.project.phaseStatus})`
);
// Monorepo info
if (context.project.giteaRepo) {
sections.push(`\n## Monorepo (Turborepo)`);
sections.push(`Repository: ${context.project.giteaRepoUrl ?? context.project.giteaRepo}`);
if (context.project.apps && context.project.apps.length > 0) {
sections.push(`Apps:`);
for (const app of context.project.apps) {
const domain = app.domain ? ` → https://${app.domain}` : '';
sections.push(`${app.name} (${app.path})${domain}`);
}
}
}
// Knowledge summary
if (context.knowledgeSummary.totalCount > 0) {
sections.push(`\nKnowledge Items: ${context.knowledgeSummary.totalCount} total`);