// Onboarding / first connect — welcome → connect gitea → choose repo → bootstrap function OnboardingScreen({ onDone }) { const DS = window.CommiTeaDesignSystem_20e63b; const { Button, Input, Radio, Tag, Badge, Icon } = DS; const [step, setStep] = React.useState(0); const [conn, setConn] = React.useState('idle'); // idle | testing | ok const [repo, setRepo] = React.useState('stephen/commitea'); const [boot, setBoot] = React.useState(-1); // -1 idle, 0..2 running, 3 done React.useEffect(() => { if (conn !== 'testing') return; const t = setTimeout(() => setConn('ok'), 1100); return () => clearTimeout(t); }, [conn]); React.useEffect(() => { if (boot < 0 || boot >= 3) return; const t = setTimeout(() => setBoot(boot + 1), 700); return () => clearTimeout(t); }, [boot]); const STEPS = ['Welcome', 'Connect', 'Repo', 'Bootstrap']; const BOOT_TASKS = [ 'Create stephen/pm-state (the sidecar)', 'Apply the label schema to stephen/commitea', 'Install a webhook · endpoint :48731', ]; const Frame = ({ children, footer }) => (
{children} {footer ?
{footer}
: null}
); return (
{/* brand */}
CommiTea
{/* stepper */}
{STEPS.map((s, i) => (
{i < step ? '\u2713' : i + 1} {s} {i < STEPS.length - 1 ? : null}
))}
{step === 0 ? ( setStep(1)}>Begin}>

Good morning.

I'm Reginald, your project manager. I interview you instead of making you fill in forms, I forecast in honest ranges, and I never do the arithmetic myself — there's a scheduler for that.

Your plans live in your own Gitea as ordinary issues and labels. Delete me and nothing human is lost.

) : null} {step === 1 ? ( }>

Your Gitea

{conn === 'ok' ? connected · 3 repos visible : null}
) : null} {step === 2 ? ( }>

Which repo shall I manage?

{['stephen/commitea', 'stephen/novelpad', 'stephen/infra'].map((r) => ( ))}

One to start. You can add more later in Settings.

) : null} {step === 3 ? ( : <> }>

{boot === 3 ? 'All set.' : 'With your approval'}

{BOOT_TASKS.map((t, i) => (
i ? 'var(--ok)' : boot === i ? 'var(--warn)' : 'var(--ink-3)' }}> i ? 'circle-check' : boot === i ? 'loader-circle' : 'circle-dashed'} size={15} /> i ? 'var(--ink-1)' : 'var(--ink-2)', whiteSpace: 'nowrap' }}>{t}
))}
{['est/1d', 'est/2d', 'est/3d', 'est/5d', 'est/8d', 'p/1', 'p/2', 'p/3', 'p/4', 'deadline/hard'].map((l) => )}
{boot === 3 ? (

The pot is empty. Tell me what you're planning and I'll draw up the tickets.

) : (

No bot comments, no body frontmatter, no synthetic issues — ever. Labels are the only footprint.

)} ) : null}
first run · everything reversible
); } Object.assign(window, { OnboardingScreen });