Files
whetstone_DSL/editor/src/SelfHostingIntegration.h
2026-02-16 21:32:16 -07:00

81 lines
2.7 KiB
C++

#pragma once
// Step 487: Phase 23c Integration
// Validates full self-hosting data flow without invoking a real worker agent.
#include "PriorStepContextInjector.h"
#include "ProjectConventionAnalyzer.h"
#include "StepSpecExpander.h"
#include "TestPlanGenerator.h"
#include <string>
#include <vector>
struct SelfHostingInput {
std::string repoRoot = ".";
std::string stepMarkdown;
std::string stepNumber;
std::string componentName;
std::vector<std::string> priorHeaders;
std::vector<SourceFileDraft> knownGoodFiles;
std::vector<SourceFileDraft> knownBrokenFiles;
};
struct SelfHostingResult {
ProjectConventions conventions;
StepContext context;
StepSpec spec;
GeneratedTestPlan testPlan;
ConventionValidationReport goodReport;
ConventionValidationReport brokenReport;
bool workerReady = false;
std::vector<std::string> notes;
};
class SelfHostingIntegration {
public:
static SelfHostingResult run(const SelfHostingInput& in) {
SelfHostingResult out;
out.conventions = ProjectConventionAnalyzer::extract(in.repoRoot);
out.context = PriorStepContextInjector::build(in.priorHeaders);
out.spec = StepSpecExpander::expand({
in.stepMarkdown,
in.stepNumber,
in.componentName,
"cmake",
{},
in.priorHeaders
});
out.testPlan = TestPlanGenerator::generate({
in.stepMarkdown,
in.stepNumber,
in.componentName,
{},
StepComplexity::Standard,
false
});
out.goodReport = ProjectConventionAnalyzer::validate(out.conventions, in.knownGoodFiles);
out.brokenReport = ProjectConventionAnalyzer::validate(out.conventions, in.knownBrokenFiles);
out.workerReady = isWorkerReady(out);
out.notes.push_back("Flow executed: conventions -> context -> spec -> test plan");
out.notes.push_back(out.workerReady
? "Worker brief sufficiency checks passed"
: "Worker brief sufficiency checks failed");
return out;
}
private:
static bool isWorkerReady(const SelfHostingResult& r) {
const bool hasSpec = !r.spec.testPlan.empty() &&
!r.spec.headerSkeleton.methods.empty() &&
!r.spec.buildEntry.targetName.empty();
const bool hasContext = !r.context.priorApis.empty();
const bool hasConventions = r.conventions.sizeLimits.count("header") &&
r.conventions.sizeLimits.count("main.cpp");
const bool hasPlan = !r.testPlan.tests.empty();
return hasSpec && hasContext && hasConventions && hasPlan;
}
};