Introduce AutoMetabuilder core components and workflow packages:

- Implement core components: CLI argument parsing, environment loading, GitHub service creation, and logging configuration.
- Add support for OpenAI client setup and model resolution.
- Develop SDLC context loader from GitHub and repository files.
- Implement workflow context and engine builders.
- Introduce major workflow packages: `game_tick_loop` and `contextual_iterative_loop`.
- Update localization files with new package descriptions and labels.
- Streamline web navigation by loading items from a dedicated JSON file.
This commit is contained in:
2026-01-10 00:58:47 +00:00
parent 5187347d21
commit e944c46853

View File

@@ -1 +1,122 @@
"use client";\n+\n+import { useEffect, useMemo, useState } from \"react\";\n+import DashboardSection from \"../components/sections/DashboardSection\";\n+import PromptSection from \"../components/sections/PromptSection\";\n+import SettingsSection from \"../components/sections/SettingsSection\";\n+import TranslationsSection from \"../components/sections/TranslationsSection\";\n+import WorkflowSection from \"../components/sections/WorkflowSection\";\n+import PageLayout from \"../components/layout/PageLayout\";\n+import {\n+ fetchContext,\n+ fetchWorkflowPackage,\n+ runBot,\n+ savePrompt,\n+ saveSettings,\n+ saveWorkflow,\n+} from \"../lib/api\";\n+import { UIContext } from \"../lib/types\";\n+\n+export default function HomePage() {\n+ const [context, setContext] = useState<UIContext | null>(null);\n+ const [selectedSection, setSelectedSection] = useState(\"dashboard\");\n+ const [loading, setLoading] = useState(true);\n+ const [error, setError] = useState(\"\");\n+\n+ const loadContext = async () => {\n+ setLoading(true);\n+ setError(\"\");\n+ try {\n+ const data = await fetchContext();\n+ setContext(data);\n+ setSelectedSection((prev) => prev || data.navigation[0]?.section || \"dashboard\");\n+ } catch (err) {\n+ setError(String(err));\n+ } finally {\n+ setLoading(false);\n+ }\n+ };\n+\n+ useEffect(() => {\n+ void loadContext();\n+ }, []);\n+\n+ const t = useMemo(\n+ () => (key: string, fallback?: string) => context?.messages[key] ?? fallback ?? key,\n+ [context]\n+ );\n+\n+ const handleRun = async (payload: Parameters<typeof runBot>[0]) => {\n+ await runBot(payload);\n+ await loadContext();\n+ };\n+\n+ const handleWorkflowSave = async (content: string) => {\n+ await saveWorkflow(content);\n+ await loadContext();\n+ };\n+\n+ const handleTemplateSelect = async (id: string) => {\n+ const pkg = await fetchWorkflowPackage(id);\n+ const workflowPayload = JSON.stringify(pkg.workflow ?? {}, null, 2);\n+ setContext((prev) => (prev ? { ...prev, workflow_content: workflowPayload } : prev));\n+ };\n+\n+ const handlePromptSave = async (content: string) => {\n+ await savePrompt(content);\n+ await loadContext();\n+ };\n+\n+ const handleSettingsSave = async (values: Record<string, string>) => {\n+ await saveSettings(values);\n+ await loadContext();\n+ };\n+\n+ if (loading) {\n+ return (\n+ <main className=\"app-loading\">\n+ <p>Loading dashboard…</p>\n+ </main>\n+ );\n+ }\n+\n+ if (error || !context) {\n+ return (\n+ <main className=\"app-loading\">\n+ <p>{error || \"Unable to load context.\"}</p>\n+ <button type=\"button\" onClick={loadContext}>\n+ Retry\n+ </button>\n+ </main>\n+ );\n+ }\n+\n+ return (\n+ <PageLayout\n+ navItems={context.navigation}\n+ section={selectedSection}\n+ onSectionChange={setSelectedSection}\n+ t={t}\n+ >\n+ {selectedSection === \"dashboard\" && (\n+ <DashboardSection logs={context.logs} status={context.status} onRun={handleRun} t={t} />\n+ )}\n+ {selectedSection === \"workflow\" && (\n+ <WorkflowSection\n+ content={context.workflow_content}\n+ packages={context.workflow_packages}\n+ onSave={handleWorkflowSave}\n+ onTemplateSelect={handleTemplateSelect}\n+ t={t}\n+ />\n+ )}\n+ {selectedSection === \"prompt\" && <PromptSection content={context.prompt_content} onSave={handlePromptSave} t={t} />}\n+ {selectedSection === \"settings\" && (\n+ <SettingsSection envVars={context.env_vars} onSave={handleSettingsSave} t={t} />\n+ )}\n+ {selectedSection === \"translations\" && (\n+ <TranslationsSection languages={context.translations} onRefresh={loadContext} t={t} />\n+ )}\n+ </PageLayout>\n+ );\n+}\n*** End Patch"""
"use client";
import { useEffect, useMemo, useState } from "react";
import DashboardSection from "../components/sections/DashboardSection";
import PromptSection from "../components/sections/PromptSection";
import SettingsSection from "../components/sections/SettingsSection";
import TranslationsSection from "../components/sections/TranslationsSection";
import WorkflowSection from "../components/sections/WorkflowSection";
import PageLayout from "../components/layout/PageLayout";
import {
fetchContext,
fetchWorkflowPackage,
runBot,
savePrompt,
saveSettings,
saveWorkflow,
} from "../lib/api";
import { UIContext } from "../lib/types";
export default function HomePage() {
const [context, setContext] = useState<UIContext | null>(null);
const [selectedSection, setSelectedSection] = useState("dashboard");
const [loading, setLoading] = useState(true);
const [error, setError] = useState("");
const loadContext = async () => {
setLoading(true);
setError("");
try {
const data = await fetchContext();
setContext(data);
setSelectedSection((prev) => prev || data.navigation[0]?.section || "dashboard");
} catch (err) {
setError(String(err));
} finally {
setLoading(false);
}
};
useEffect(() => {
void loadContext();
}, []);
const t = useMemo(
() => (key: string, fallback?: string) => context?.messages[key] ?? fallback ?? key,
[context]
);
const handleRun = async (payload: Parameters<typeof runBot>[0]) => {
await runBot(payload);
await loadContext();
};
const handleWorkflowSave = async (content: string) => {
await saveWorkflow(content);
await loadContext();
};
const handleTemplateSelect = async (id: string) => {
const pkg = await fetchWorkflowPackage(id);
const workflowPayload = JSON.stringify(pkg.workflow ?? {}, null, 2);
setContext((prev) => (prev ? { ...prev, workflow_content: workflowPayload } : prev));
};
const handlePromptSave = async (content: string) => {
await savePrompt(content);
await loadContext();
};
const handleSettingsSave = async (values: Record<string, string>) => {
await saveSettings(values);
await loadContext();
};
if (loading) {
return (
<main className="app-loading">
<p>Loading dashboard</p>
</main>
);
}
if (error || !context) {
return (
<main className="app-loading">
<p>{error || "Unable to load context."}</p>
<button type="button" onClick={loadContext}>
Retry
</button>
</main>
);
}
return (
<PageLayout
navItems={context.navigation}
section={selectedSection}
onSectionChange={setSelectedSection}
t={t}
>
{selectedSection === "dashboard" && (
<DashboardSection logs={context.logs} status={context.status} onRun={handleRun} t={t} />
)}
{selectedSection === "workflow" && (
<WorkflowSection
content={context.workflow_content}
packages={context.workflow_packages}
onSave={handleWorkflowSave}
onTemplateSelect={handleTemplateSelect}
t={t}
/>
)}
{selectedSection === "prompt" && <PromptSection content={context.prompt_content} onSave={handlePromptSave} t={t} />}
{selectedSection === "settings" && (
<SettingsSection envVars={context.env_vars} onSave={handleSettingsSave} t={t} />
)}
{selectedSection === "translations" && (
<TranslationsSection languages={context.translations} onRefresh={loadContext} t={t} />
)}
</PageLayout>
);
}