matrix-builder / web /src /lib /matrix-bundle.ts
ruslanmv
Deploy: metrics + docs (Batch 12)
22b729d
Raw
History Blame Contribute Delete
4.35 kB
// OFFLINE FALLBACK ONLY. The build flow downloads the engine's real bundle zip (/bundles/{id}
// /download) and shows the engine's file manifest; this reconstructs an equivalent bundle locally
// only when the API is unreachable, so the demo still produces a downloadable zip without a backend.
import type { BlueprintCandidate } from "@/types/blueprint";
import type { BundleFile } from "@/types/bundle";
import { AI_CODERS } from "./constants";
import { createCoderPrompt, bundleUrl } from "./coder-prompts";
export function createBundleFiles(
idea: string,
candidate: BlueprintCandidate,
bundleId: string,
): BundleFile[] {
const files: BundleFile[] = [];
files.push({
name: "README.md",
content: `# Matrix Bundle — ${candidate.name}
> A controlled build contract, not a vague prompt.
Idea: ${idea}
Blueprint: ${candidate.tier}
Bundle: ${bundleId}
Bundle URL: ${bundleUrl(bundleId)}
Stack: ${candidate.stack.join(", ")}
## How to build
1. Read MATRIX_BLUEPRINT.yaml.
2. Follow MATRIX_TASKS.md, one task at a time.
3. Stay inside MATRIX_ALLOWED_CHANGES.md.
4. Pass MATRIX_ACCEPTANCE_CRITERIA.md.
5. Run MATRIX_VALIDATION.md before finishing.
Send this bundle to an AI coder using one of the prompts in coder-prompts/.
`,
});
files.push({
name: "MATRIX_BLUEPRINT.yaml",
content: `apiVersion: matrix.builder/v1
kind: Blueprint
metadata:
name: ${candidate.name}
tier: ${candidate.tier.toLowerCase()}
bundle: ${bundleId}
idea: >
${idea}
stack:
${candidate.stack.map((item) => ` - ${item}`).join("\n")}
architecture:
frontend: ${candidate.stack.includes("React") ? "react" : "none"}
backend: fastapi
database: ${candidate.stack.includes("Postgres") ? "postgres" : "sqlite"}
deploy: ${candidate.stack.includes("K8s") ? "kubernetes" : "docker"}
`,
});
files.push({
name: "MATRIX_STANDARDS.lock",
content: `# Locked standards — do not edit
${candidate.standards.map((standard) => `- ${standard}`).join("\n")}
`,
});
files.push({
name: "MATRIX_TASKS.md",
content: `# Tasks — implement one at a time
## Task 01 — Project scaffold
Create the folder structure and entrypoints defined in MATRIX_BLUEPRINT.yaml.
## Task 02 — Core domain
Implement the core logic for: ${idea}.
## Task 03 — API surface
Expose the documented endpoints and OpenAPI contract.
## Task 04 — Tests and validation
Add tests and pass MATRIX_VALIDATION.md.
`,
});
files.push({
name: "MATRIX_ALLOWED_CHANGES.md",
content: `# Allowed changes
- Files under src/, app/, tests/, frontend/, backend/, worker/
- New routes that match MATRIX_BLUEPRINT.yaml
- Tests that prove the selected task works
# Forbidden
- Editing MATRIX_* control files
- New top-level dependencies not approved by MATRIX_STANDARDS.lock
- Changing the architecture
- Adding external SaaS, auth, background workers, or new databases without approval
`,
});
files.push({
name: "MATRIX_ACCEPTANCE_CRITERIA.md",
content: `# Acceptance criteria
- Current task implemented and tested
- Lints clean against MATRIX_STANDARDS.lock
- API matches the documented contract
- No secrets committed
- No forbidden files changed
`,
});
files.push({
name: "MATRIX_VALIDATION.md",
content: `# Validation
Run:
\`\`\`bash
make validate
\`\`\`
The build is approved only when validation passes with no architecture, dependency, or file-policy drift.
`,
});
files.push({
name: "docs/architecture.md",
content: `# Architecture
This project is generated from a Matrix Builder controlled blueprint.
- Idea: ${idea}
- Blueprint: ${candidate.name}
- Quality: ${candidate.tier}
- Engine: agent-generator
- Standard source: matrix-definitions
`,
});
files.push({
name: "docs/security.md",
content: `# Security
The AI coder must respect MATRIX_STANDARDS.lock and MATRIX_ALLOWED_CHANGES.md.
Forbidden changes include secrets, architecture drift, unapproved dependencies, and edits to MATRIX control files.
`,
});
files.push({
name: "docs/standards-report.md",
content: `# Standards report
${candidate.standards.map((standard) => `- ${standard}`).join("\n")}
`,
});
AI_CODERS.forEach((coder) => {
files.push({
name: `coder-prompts/${coder.id}.md`,
content: createCoderPrompt(coder.id, idea, candidate, bundleId),
});
});
return files;
}