Skip to content

Conversation

@Shironex
Copy link
Collaborator

@Shironex Shironex commented Jan 11, 2026

Summary

  • Adds an interactive onboarding wizard for the board view that guides users through the Kanban workflow
  • Extracts onboarding components to be reusable/shared for future view-specific onboarding
  • Wizard triggers manually via help button (no auto-show on fresh projects to avoid conflicts with spec generation)

Changes

New Shared Onboarding Infrastructure

Created apps/ui/src/components/shared/onboarding/ with:

  • types.ts - Generic OnboardingStep, OnboardingState, and related interfaces
  • constants.ts - Shared layout constants and analytics event names
  • use-onboarding-wizard.ts - Generic hook (no auto-show, manual trigger via startWizard())
  • onboarding-wizard.tsx - Reusable wizard with spotlight effect using data-onboarding-target

Board View Integration

  • use-board-onboarding.ts - Board-specific wrapper with Quick Start sample data feature
  • board-onboarding-wizard.tsx - Wraps shared wizard with Quick Start section
  • board-controls.tsx - Help button always visible (triggers wizard)
  • kanban-column.tsx - Added data-onboarding-target for spotlight targeting
  • kanban-board.tsx - Added target to pipeline settings button for last step

Features

  • 5-step wizard covering: Backlog, In Progress, Waiting Approval, Verified, Custom Pipelines
  • Spotlight overlay highlighting target elements
  • Responsive tooltip positioning (left/right/bottom based on viewport)
  • Keyboard navigation (Arrow keys, ESC, Enter)
  • Quick Start to add sample tasks
  • Completion celebration animation
  • Full accessibility (ARIA, focus management)

Test plan

  • Open board view - help button should always be visible
  • Click help button - wizard starts from step 1
  • Navigate through all 5 steps with Next/Previous
  • Test keyboard navigation (Arrow keys, ESC, Enter)
  • Test Quick Start functionality (adds sample tasks)
  • Complete wizard, click help again - should restart
  • Last step highlights pipeline settings icon (not full column)
  • Test on different viewport sizes

🤖 Generated with Claude Code

- Added a new onboarding wizard to guide users through the board features.
- Integrated sample feature generation for quick start onboarding.
- Enhanced BoardView component to manage onboarding state and actions.
- Updated BoardControls and BoardHeader to include tour functionality.
- Introduced utility functions for sample feature management in constants.
- Improved user experience with toast notifications for onboarding actions.
- Introduced a new onboarding wizard for guiding users through the board features.
- Added shared onboarding components including OnboardingWizard, useOnboardingWizard, and related types and constants.
- Implemented onboarding logic in the BoardView, integrating sample feature generation for a quick start.
- Updated UI components to support onboarding interactions and improve user experience.
- Enhanced onboarding state management with localStorage persistence for user progress tracking.
@coderabbitai
Copy link

coderabbitai bot commented Jan 11, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @Shironex, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a comprehensive interactive onboarding wizard for the board view, designed to help new users quickly understand and utilize the Kanban workflow. It establishes a robust, reusable foundation for future onboarding experiences across the application, complete with dynamic UI highlighting, keyboard navigation, and a 'Quick Start' option to populate the board with illustrative sample tasks. The wizard is intentionally triggered manually to avoid conflicts with existing user flows.

Highlights

  • Interactive Board Onboarding Wizard: Introduced a new, interactive wizard for the Kanban board view to guide users through the workflow, covering key areas like Backlog, In Progress, Waiting Approval, Verified, and Custom Pipelines.
  • Reusable Onboarding Infrastructure: Developed a generic OnboardingWizard component and useOnboardingWizard hook, allowing for consistent and easily extensible onboarding experiences across different views within the application.
  • Quick Start with Sample Data: Implemented a 'Quick Start' feature within the board wizard to add sample tasks, demonstrating the Kanban workflow in action and providing a tangible starting point for new users.
  • Manual Trigger & Accessibility: The wizard is manually triggered via a help button (not auto-shown on fresh projects to avoid conflicts) and includes full accessibility support, keyboard navigation, and focus management.
  • Dynamic UI Highlighting: Features a spotlight overlay that visually highlights target elements on the board and responsive tooltip positioning (left/right/bottom) based on viewport and target location for optimal user guidance.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@Shironex Shironex self-assigned this Jan 11, 2026
@Shironex Shironex added Enhancement Improvements to existing functionality or UI. Do Not Merge Use this label if something should not be merged. Experiment labels Jan 11, 2026
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a well-structured and reusable onboarding wizard, which is a great addition for improving user experience. The implementation is solid, with good separation between the generic wizard infrastructure and the board-specific integration. My review includes a few suggestions to improve efficiency and robustness, such as parallelizing API calls for a quicker 'Quick Start' experience, making the step navigation more direct, and strengthening the logic for identifying sample data.

Comment on lines +285 to +300
const handleStepClick = useCallback(
(stepIndex: number) => {
if (stepIndex === currentStep) return;

if (stepIndex > currentStep) {
for (let i = currentStep; i < stepIndex; i++) {
onNext();
}
} else {
for (let i = currentStep; i > stepIndex; i--) {
onPrevious();
}
}
},
[currentStep, onNext, onPrevious]
);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The handleStepClick function simulates jumping to a step by repeatedly calling onNext or onPrevious in a loop. This is inefficient and makes assumptions about the implementation of these handlers (e.g., that they are synchronous and have no side effects per call).

The useOnboardingWizard hook already provides a more direct and efficient goToStep function. This should be passed down to the OnboardingWizard component and used here.

To fix this, you should:

  1. Add onGoToStep: (step: number) => void; to the OnboardingWizardProps interface in apps/ui/src/components/shared/onboarding/types.ts.
  2. Pass onGoToStep to this component's props.
  3. Update this handleStepClick function to call onGoToStep directly:
const handleStepClick = useCallback(
  (stepIndex: number) => {
    if (stepIndex === currentStep) return;
    onGoToStep(stepIndex);
  },
  [currentStep, onGoToStep]
);
  1. Pass the goToStep function from the useBoardOnboarding hook through BoardOnboardingWizard to this component.

Comment on lines +1049 to +1055
// Create each sample feature
for (const featureData of sampleFeatures) {
const result = await api.features.create(currentProject.path, featureData);
if (result.success && result.feature) {
useAppStore.getState().addFeature(result.feature);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Creating sample features sequentially with await inside a for loop can be slow, as each API call waits for the previous one to complete. To improve performance and provide a faster user experience, these API calls should be made in parallel using Promise.all.

Suggested change
// Create each sample feature
for (const featureData of sampleFeatures) {
const result = await api.features.create(currentProject.path, featureData);
if (result.success && result.feature) {
useAppStore.getState().addFeature(result.feature);
}
}
// Create each sample feature in parallel
const createPromises = sampleFeatures.map((featureData) =>
api.features.create(currentProject.path, featureData)
);
const results = await Promise.all(createPromises);
// Add successfully created features to the store
for (const result of results) {
if (result.success && result.feature) {
useAppStore.getState().addFeature(result.feature);
}
}

Comment on lines +179 to +182
export function isSampleFeature(feature: Partial<Feature>): boolean {
// Check title prefix - this is the reliable marker that persists through the database
return feature.title?.startsWith(SAMPLE_FEATURE_PREFIX) ?? false;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using a title prefix [DEMO] to identify sample features is fragile. A user could inadvertently create a feature with this prefix, causing it to be treated as sample data. A more robust approach is to use a dedicated property on the feature object.

The SampleFeatureTemplate interface already includes an isSampleData: true marker. This should be passed through to the feature object in generateSampleFeatures and used for identification.

  1. Update generateSampleFeatures to include the isSampleData property:
// in generateSampleFeatures()
return SAMPLE_FEATURES.map((template) => ({
  // ... other properties
  isSampleData: template.isSampleData,
  // ... other properties
}));
  1. Update this function to check for that property instead of the title prefix.
Suggested change
export function isSampleFeature(feature: Partial<Feature>): boolean {
// Check title prefix - this is the reliable marker that persists through the database
return feature.title?.startsWith(SAMPLE_FEATURE_PREFIX) ?? false;
}
export function isSampleFeature(feature: Partial<Feature & { isSampleData?: boolean }>): boolean {
// Check for a dedicated property instead of a title prefix for robustness.
return feature.isSampleData === true;
}

Base automatically changed from v0.10.0rc to main January 12, 2026 21:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Do Not Merge Use this label if something should not be merged. Enhancement Improvements to existing functionality or UI. Experiment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants