matrix-builder / web /src /lib /coder-prompts.ts
ruslanmv
Deploy: metrics + docs (Batch 12)
22b729d
Raw
History Blame Contribute Delete
3.81 kB
import type { BlueprintCandidate } from "@/types/blueprint";
import type { CoderId } from "@/types/coder";
import { AI_CODERS, BUNDLE_API_BASE, DEFAULT_ALLOWED_FILES, DEFAULT_VALIDATION_COMMANDS, MATRIX_CONTRACT_FILES } from "./constants";
export function bundleUrl(bundleId: string): string {
return `${BUNDLE_API_BASE}/${bundleId}`;
}
function coderSpecificRules(coderId: CoderId): string[] {
switch (coderId) {
case "claude-code":
return [
"Use Claude Code as the local implementation worker, not the architect.",
"Summarize the selected Matrix task before editing.",
"Stop if the work requires architecture or dependency changes.",
];
case "codex-chatgpt":
return [
"Produce one scoped patch or exact file changes.",
"Do not invent files, services, auth, or dependencies outside the bundle.",
"Ask for missing Matrix control files instead of guessing.",
];
case "cursor":
return [
"Use workspace context only after reading the Matrix contract.",
"Avoid repo-wide edits outside the allowed files.",
"Reject unrelated refactors unless the task explicitly requests them.",
];
case "gitpilot":
return [
"Explorer may inspect the bundle but must not expand scope.",
"Planner must choose one Matrix task and preserve architecture.",
"Coder edits only allowed files; Reviewer verifies MATRIX_VALIDATION.md.",
];
case "ibm-bob":
return [
"Treat MATRIX_STANDARDS.lock as a governance artifact.",
"Do not introduce new services, dependencies, or data flows without approval.",
"Return validation evidence suitable for enterprise review.",
];
default:
return [
"If you cannot fetch the bundle URL, ask the user to paste README.md and the MATRIX_* files.",
"Implement only one Matrix task.",
"Do not bypass validation.",
];
}
}
export function createCoderPrompt(
coderId: CoderId,
idea: string,
candidate: BlueprintCandidate,
bundleId: string,
): string {
const coder = AI_CODERS.find((item) => item.id === coderId) ?? AI_CODERS[AI_CODERS.length - 1];
const rules = coderSpecificRules(coder.id).map((rule) => `- ${rule}`).join("\n");
const contractFiles = MATRIX_CONTRACT_FILES.map((path) => `- \`${path}\``).join("\n");
const allowedFiles = DEFAULT_ALLOWED_FILES.map((path) => `- \`${path}\``).join("\n");
const validationCommands = DEFAULT_VALIDATION_COMMANDS.map((command) => `- \`${command}\``).join("\n");
return `# ${coder.name} controlled implementation prompt
You are using ${coder.name} to implement a Matrix Builder controlled project.
AI coders are workers, not architects. You are not the architect. You are the implementation worker.
## Fetch this Matrix Bundle
${bundleUrl(bundleId)}
Project idea: ${idea}
Selected blueprint: ${candidate.name} (${candidate.tier})
Task: TASK-001
## Read first
${contractFiles}
## Allowed files for this task
${allowedFiles}
## Hard constraints
- Implement TASK-001 only.
- Edit only the allowed files listed above.
- Do not modify MATRIX_BLUEPRINT.yaml, MATRIX_STANDARDS.lock, or other Matrix control files.
- Do not add unapproved dependencies.
- Do not change architecture, stack, routes, services, or standards profile.
- Do not insert secrets.
- Stop and report a blocker if the request conflicts with the Matrix contract.
## ${coder.name} instructions
${rules}
## Validation commands
${validationCommands}
## Required response
Return:
1. Files changed.
2. Commands run.
3. Validation result.
4. Blockers if Matrix policy prevented a change.
End with one status:
- MATRIX_STATUS: READY_FOR_VALIDATION
- MATRIX_STATUS: BLOCKED_BY_CONTRACT
- MATRIX_STATUS: NEEDS_HUMAN_APPROVAL
`;
}