diff --git a/dashboard/src/v2/ProjectsPage.tsx b/dashboard/src/v2/ProjectsPage.tsx index f73abfc13c..1d2829d09c 100644 --- a/dashboard/src/v2/ProjectsPage.tsx +++ b/dashboard/src/v2/ProjectsPage.tsx @@ -3,6 +3,7 @@ import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "preact/ho import gsap from "gsap"; import { useNavigate } from "@tanstack/react-router"; import { + BookOpen, Bot, Check, Circle, @@ -18,7 +19,7 @@ import { Sparkles, Trash2, } from "lucide-preact"; -import type { Source, SourceStatus } from "./types.js"; +import type { ProjectSetupOptions, Source, SourceStatus } from "./types.js"; import { AddProjectModal, type AddProjectModalSubmission, type SourceType as AddProjectModalSourceType } from "./components/ui/AddProjectModal.js"; import { buildProjectCreationSettingsOverride } from "../lib/settings-updaters.js"; import { DEFAULT_DASHBOARD_SETTINGS } from "../lib/settings.js"; @@ -37,6 +38,14 @@ import { buildProjectCardViewModel } from "./lib/project-card-view-model.js"; const EMBER_HEX = '#FFB800'; +const createDefaultSetupOptions = (): ProjectSetupOptions => ({ + agents: true, + quicksprints: true, + previewScript: true, + ci: true, + techstack: true, + docs: false, +}); type Filter = 'All' | 'Running' | 'Idle' | 'Failed'; @@ -453,13 +462,7 @@ export const ProjectsPage: FunctionComponent = () => { const [runningSetupProjectIds, setRunningSetupProjectIds] = useState>(() => new Set()); const [setupInvocationByProjectId, setSetupInvocationByProjectId] = useState>({}); const [setupError, setSetupError] = useState(null); - const [setupOptions, setSetupOptions] = useState({ - agents: true, - quicksprints: true, - previewScript: true, - ci: true, - techstack: true, - }); + const [setupOptions, setSetupOptions] = useState(() => createDefaultSetupOptions()); const [activeFilter, setActiveFilter] = useState('All'); const { projects: sources, @@ -542,13 +545,7 @@ export const ProjectsPage: FunctionComponent = () => { const launchProjectSetup = ( projectId: string, projectName: string, - options: { - agents: boolean; - quicksprints: boolean; - previewScript: boolean; - ci: boolean; - techstack: boolean; - }, + options: ProjectSetupOptions, ) => { setRunningSetupProjectIds(prev => new Set(prev).add(projectId)); addToast({ @@ -810,7 +807,7 @@ export const ProjectsPage: FunctionComponent = () => { onDelete={() => { void deleteProject(source.id); }} onSetup={() => { setSetupProjectId(source.id); - setSetupOptions({ agents: true, quicksprints: true, previewScript: true, ci: true, techstack: true }); + setSetupOptions(createDefaultSetupOptions()); setSetupError(null); }} onOpenInvocation={() => { @@ -872,21 +869,29 @@ export const ProjectsPage: FunctionComponent = () => { { key: "previewScript", label: "Preview Script", description: "Container startup." }, { key: "ci", label: "CI", description: "Basic checks." }, { key: "techstack", label: "Techstack", description: "Detect and assign from manifests." }, + { key: "docs", label: "Docs", description: "Embed repository docs into Knowledge docs.", icon: BookOpen }, ] as const).map((option) => ( ))} diff --git a/dashboard/src/v2/components/ui/AddProjectModal.tsx b/dashboard/src/v2/components/ui/AddProjectModal.tsx index b1f8a76351..d95561dde3 100644 --- a/dashboard/src/v2/components/ui/AddProjectModal.tsx +++ b/dashboard/src/v2/components/ui/AddProjectModal.tsx @@ -1,25 +1,17 @@ import type { FunctionComponent } from "preact"; import { useRef, useState, useMemo } from "preact/hooks"; import gsap from "gsap"; -import { AlertCircle, Bot, Check, ChevronUp, Cloud, FolderOpen, GitBranch, FolderInput, Globe, Home, Info, Layers3, Link2, Loader2, Lock, PlaySquare, Plus, RefreshCw, ShieldCheck, Sparkles, Workflow, X } from "lucide-preact"; +import { AlertCircle, BookOpen, Bot, Check, ChevronUp, Cloud, FolderOpen, GitBranch, FolderInput, Globe, Home, Info, Layers3, Link2, Loader2, Lock, PlaySquare, Plus, RefreshCw, ShieldCheck, Sparkles, Workflow, X } from "lucide-preact"; import { FormError } from "../forms/FormError.js"; import { Modal } from "./Modal.js"; import { ActionFeedbackRegion } from "./ActionFeedbackRegion.js"; import { fetchLocalDirectories } from "../../lib/project-api.js"; -import type { LocalDirectoryBrowserResponse } from "../../types.js"; +import type { LocalDirectoryBrowserResponse, ProjectSetupOptions } from "../../types.js"; import type { ApplicationKind } from "../../../types.js"; import { DEFAULT_DASHBOARD_SETTINGS } from "../../../lib/settings.js"; export type SourceType = 'local' | 'git' | 'new_project'; -type ProjectSetupOptions = { - agents: boolean; - quicksprints: boolean; - previewScript: boolean; - ci: boolean; - techstack: boolean; -}; - type ExistingProjectSubmission = { name: string; type: 'local' | 'git'; @@ -102,12 +94,13 @@ export const AddProjectModal: FunctionComponent = ({ onClo const [newIsPrivate, setNewIsPrivate] = useState(true); const [initializeProject, setInitializeProject] = useState(true); const [showSetupOptions, setShowSetupOptions] = useState(false); - const [setupOptions, setSetupOptions] = useState({ + const [setupOptions, setSetupOptions] = useState({ agents: true, quicksprints: true, previewScript: false, ci: true, techstack: true, + docs: false, }); const [submitError, setSubmitError] = useState(null); const [activeDirectoryPickerTarget, setActiveDirectoryPickerTarget] = useState(null); @@ -379,6 +372,7 @@ export const AddProjectModal: FunctionComponent = ({ onClo { key: "previewScript", label: "Preview Script", description: "Container startup script for browser previews.", icon: PlaySquare }, { key: "ci", label: "CI", description: "Basic GitHub/GitLab error-checking pipelines.", icon: ShieldCheck }, { key: "techstack", label: "Techstack", description: "Detect and assign a project stack from manifests.", icon: Layers3 }, + { key: "docs", label: "Docs", description: "Embed repository docs into Knowledge docs.", icon: BookOpen }, ] as const; return ( @@ -659,7 +653,7 @@ export const AddProjectModal: FunctionComponent = ({ onClo