Skip to content

Conversation

@osterman
Copy link
Member

@osterman osterman commented Dec 23, 2025

what

  • Add interactive roadmap page with 10 initiatives and 50+ milestones
  • Create Roadmap component with initiative cards, milestone lists, and quarter timeline
  • Implement MilestoneDrawer for detailed milestone information with descriptions, screenshots, and code examples
  • Add Tooltip component for PR/issue title hover tooltips with theme-aware styling
  • Include extensive roadmap data with changelog and documentation links
  • Add Roadmap navigation link to Docusaurus navbar
  • Fix milestone/bullet alignment with proper flexbox and margin adjustments

why

  • Provides users with transparent view of product roadmap and upcoming features
  • Helps users understand what's shipped, in progress, and planned
  • Links to relevant documentation and announcements for each milestone
  • Improves project visibility and community engagement with detailed progress tracking

references

  • Implements planned Roadmap feature from project PRD
  • Related discussions: Strategic product planning and user visibility

Summary by CodeRabbit

  • New Features
    • Full interactive Roadmap page: navbar link, hero, quarter timeline, highlights, featured improvements, initiative cards, milestone lists with slide-in drawers, progress bars, tooltips, animations, and keyboard accessibility.
  • Documentation
    • Roadmap Maintainer guide and contributor instructions added; CLAUDE.md updated; new blog post announcing the product roadmap.
  • Style
    • Comprehensive responsive, theme- and dark-mode-aware styling for the Roadmap UI.
  • Chores
    • CI workflow updated to enforce release documentation checks (blog + roadmap).

✏️ Tip: You can customize this high-level summary in your review settings.

- Add Roadmap component with interactive initiative cards
- Create MilestoneList, MilestoneDrawer, and ProgressBar components
- Add Tooltip component for PR/issue titles with theme-aware styling
- Implement responsive design with flexbox alignment fixes
- Add extensive roadmap data with documented milestones across 10 initiatives
- Add changelog and docs links to all relevant milestones
- Update Docusaurus navbar with Roadmap link

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
@osterman osterman requested a review from a team as a code owner December 23, 2025 17:52
@github-actions github-actions bot added the size/xl Extra large size PR label Dec 23, 2025
@mergify
Copy link

mergify bot commented Dec 23, 2025

Warning

This PR exceeds the recommended limit of 1,000 lines.

Large PRs are difficult to review and may be rejected due to their size.

Please verify that this PR does not address multiple issues.
Consider refactoring it into smaller, more focused PRs to facilitate a smoother review process.

@github-actions
Copy link

github-actions bot commented Dec 23, 2025

Dependency Review

✅ No vulnerabilities or license issues found.

Scanned Files

None

@codecov
Copy link

codecov bot commented Dec 23, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 73.56%. Comparing base (1d433c4) to head (e103ac9).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #1912      +/-   ##
==========================================
- Coverage   73.57%   73.56%   -0.01%     
==========================================
  Files         634      634              
  Lines       59027    59027              
==========================================
- Hits        43430    43425       -5     
- Misses      12604    12614      +10     
+ Partials     2993     2988       -5     
Flag Coverage Δ
unittests 73.56% <ø> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.
see 5 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 23, 2025

📝 Walkthrough

Walkthrough

Adds a complete Roadmap feature: data model, new /roadmap page and navbar link, multiple React UI components (hero, timeline, featured/highlights, initiatives, milestones, drawers, stats, tooltip), styles, maintainer docs, a blog post, and CI workflow enforcing release-docs checks.

Changes

Cohort / File(s) Summary
Maintainer docs & policy
\.claude/agents/roadmap.md, CLAUDE.md
New Roadmap Maintainer guide and CLAUDE.md additions describing CI-enforced roadmap update requirements for minor/major PRs.
Roadmap data
website/src/data/roadmap.js
New exported roadmapConfig static dataset (vision, quarters, initiatives, milestones, PRs/issues, highlights).
Site navigation
website/docusaurus.config.js
Adds Roadmap navbar item linking to /roadmap.
Page & container
website/src/pages/roadmap.js, website/src/components/Roadmap/index.tsx
New Roadmap page and container composing hero, timeline, featured/highlights, stats, and initiatives grid with expand-all control and sorting.
Timeline & hero
website/src/components/Roadmap/QuarterTimeline.tsx, website/src/components/Roadmap/RoadmapHero.tsx
QuarterTimeline (scrollable/selectable quarters, detail panel) and animated RoadmapHero.
Initiatives, featured & highlights
website/src/components/Roadmap/InitiativeCard.tsx, website/src/components/Roadmap/FeaturedSection.tsx, website/src/components/Roadmap/Highlights.tsx, website/src/components/Roadmap/FeaturedDrawer.tsx
Initiative cards (expandable, keyboard accessible, dynamic icons, PR/issue links), featured grid and drawer, highlights grid; adds PRReference and FeaturedItem types.
Milestones list & drawer
website/src/components/Roadmap/MilestoneList.tsx, website/src/components/Roadmap/MilestoneDrawer.tsx
New exported Milestone model and MilestoneList (sorting, grouping, interactivity) plus slide-in MilestoneDrawer detail view; MilestoneListProps exported.
Stats & progress UI
website/src/components/Roadmap/RoadmapStats.tsx, website/src/components/Roadmap/ProgressBar.tsx
RoadmapStats computes and renders aggregated metrics; ProgressBar component with animated, color-coded fill and ProgressBarProps.
Primitives & utils
website/src/components/Roadmap/Tooltip.tsx, website/src/components/Roadmap/utils.tsx
Viewport-aware Tooltip component and renderInlineMarkdown utility for inline code spans.
Featured page styling
website/src/components/Roadmap/styles.module.css
Comprehensive CSS module for layout, responsive grids, dark-mode tokens, timeline visuals, drawers, tooltips, progress colors, and motion/accessibility rules.
CI workflow
.github/workflows/changelog-check.yml
Renamed/repurposed workflow to check-release-docs; adds roadmap change detection, updates PR comment logic and outputs to require release documentation (blog + roadmap) when applicable.
Content
website/blog/2025-12-23-product-roadmap.mdx
New blog post announcing the product roadmap.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    actor User
    participant Browser
    participant RoadmapPage as Roadmap Page
    participant Data as roadmapConfig
    participant Timeline as QuarterTimeline
    participant Initiative as InitiativeCard
    participant MilestoneList as MilestoneList
    participant Drawer as MilestoneDrawer

    Note over User,Browser: User navigates to /roadmap
    User->>Browser: GET /roadmap
    Browser->>RoadmapPage: render(roadmapConfig)
    RoadmapPage->>Data: import roadmapConfig
    RoadmapPage->>Timeline: render(quarters, initiatives)
    RoadmapPage->>Initiative: render(initiative list)
    User->>Timeline: select quarter
    Timeline->>Data: aggregate milestones for quarter
    Timeline->>RoadmapPage: show quarter detail
    User->>Initiative: expand card
    Initiative->>MilestoneList: render(grouped, sorted milestones)
    User->>MilestoneList: click milestone
    MilestoneList->>Drawer: open(milestone data)
    Drawer->>User: display details
    User->>Drawer: close (Escape/backdrop)
    Drawer->>Initiative: onClose callback
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

no-release

Suggested reviewers

  • milldr

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.67% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: Add comprehensive roadmap page' clearly summarizes the main change: introducing a new roadmap page with components and data.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch osterman/atmos-roadmap-page

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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🧹 Nitpick comments (13)
website/src/components/Roadmap/Tooltip.tsx (1)

55-58: Consider using CSS variables for colors.

The tooltip colors are hardcoded. Using CSS variables would make theme adjustments easier and keep color tokens centralized in the stylesheet.

🔎 Refactor to use CSS variables

In styles.module.css, add:

:root {
  --tooltip-bg-light: #1e1e2e;
  --tooltip-bg-dark: #2a2a3e;
  --tooltip-color: #f0f0f0;
}

Then in the component:

- const tooltipBg = isDark ? '#2a2a3e' : '#1e1e2e';
- const tooltipColor = '#f0f0f0';
+ // Remove these lines and use CSS variables directly in the style prop or className

Alternatively, rely entirely on CSS with data-theme selectors rather than inline styles.

website/src/components/Roadmap/MilestoneDrawer.tsx (2)

140-143: Quarter formatting could be more explicit.

The chain of .replace() calls works but is a bit implicit. Consider a helper function for clarity.

🔎 Cleaner quarter formatting
const formatQuarter = (quarter: string) => {
  // 'q4-2025' → 'Q4 2025'
  return quarter.toUpperCase().replace('-', ' ');
};

// Then use:
{formatQuarter(milestone.quarter)}

105-110: Alt text may contain markdown formatting.

The milestone label could include backtick code formatting (e.g., `atmos` integration), which isn't ideal for alt text. Consider stripping markdown from the label for the alt attribute.

🔎 Strip markdown from alt text
  <img
    src={milestone.screenshot}
-   alt={`Screenshot for ${milestone.label}`}
+   alt={`Screenshot for ${milestone.label.replace(/`/g, '')}`}
    loading="lazy"
  />

Or better, add a utility function to strip all markdown:

const stripMarkdown = (text: string) => text.replace(/[`*_~]/g, '');
website/src/components/Roadmap/styles.module.css (2)

974-979: Consider centralizing more color tokens as CSS variables.

Progress colors are defined as variables, but many other colors are hardcoded throughout the file (e.g., #1e5bb8, #538ce9, #38a169). Defining these as CSS variables would improve maintainability and make theme adjustments easier.

🔎 Example color token centralization
:root {
  /* Existing progress colors */
  --progress-complete: #38a169;
  --progress-high: #3182ce;
  --progress-medium: #dd6b20;
  --progress-low: #e53e3e;
  
  /* Brand colors */
  --color-primary: #1e5bb8;
  --color-primary-dark: #538ce9;
  --color-success: #38a169;
  --color-success-dark: #68d391;
  
  /* Then use throughout */
  background: var(--color-primary);
}

1267-1272: Reduced motion support is incomplete.

The prefers-reduced-motion media query only targets .initiativeCard and .quarterNode, but many other elements have transitions (.milestoneItem, .scrollButton, hover effects, etc.).

While Framer Motion components handle reduced motion automatically, CSS transitions should also respect this preference for consistency.

🔎 Expand reduced motion coverage
@media (prefers-reduced-motion: reduce) {
  .initiativeCard,
  .quarterNode,
  .milestoneItem,
  .scrollButton,
  .milestoneLinkBadge,
  .drawerClose,
  .progressFill {
    transition: none;
  }
}

Or use a more general approach:

@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}
website/src/components/Roadmap/utils.tsx (1)

4-16: Inline markdown parser has expected limitations.

The regex /([^]+)/g` handles simple backtick code spans but won't match:

  • Empty code spans: (no characters between backticks)
  • Unmatched backticks: This is `code (renders backtick as-is)
  • Multiple backticks: (triple backticks)

This is fine for the roadmap use case where labels should be simple. Consider adding a comment documenting these limitations to prevent misuse.

🔎 Add documentation comment
  /**
   * Renders basic inline markdown (backtick code spans).
   * Converts `code` to <code>code</code>.
+  * 
+  * Limitations:
+  * - Only supports single backticks (not triple backticks)
+  * - Empty code spans are not matched
+  * - Unmatched backticks are rendered as-is
   */
  export function renderInlineMarkdown(text: string): React.ReactNode {
website/src/data/roadmap.js (1)

24-31: Quarters data will need periodic updates.

The status: 'current' on Q4 2025 is hardcoded. Consider adding a comment noting when this should be updated, or computing current dynamically based on Date.now().

website/src/components/Roadmap/InitiativeCard.tsx (1)

19-31: Unused changelogSlugs field in interface.

The changelogSlugs field on line 30 isn't used anywhere in this component. If it's not needed, remove it to keep the interface clean.

Proposed fix
 interface Initiative {
   id: string;
   icon: string;
   title: string;
   tagline: string;
   description: string;
   progress: number;
   status: 'completed' | 'in-progress' | 'planned';
   milestones: Milestone[];
   issues: number[];
   prs: PRReference[];
-  changelogSlugs: string[];
 }
website/src/components/Roadmap/ProgressBar.tsx (1)

20-25: Consider hoisting getProgressColor outside the component.

This function is recreated on every render. Moving it outside the component would be a minor optimization.

Proposed refactor
+const getProgressColor = (value: number): string => {
+  if (value >= 90) return 'var(--progress-complete)';
+  if (value >= 70) return 'var(--progress-high)';
+  if (value >= 40) return 'var(--progress-medium)';
+  return 'var(--progress-low)';
+};
+
 export default function ProgressBar({
   progress,
   showLabel = true,
   size = 'medium',
   animated = true,
 }: ProgressBarProps): JSX.Element {
   const clampedProgress = Math.min(100, Math.max(0, progress));
-
-  const getProgressColor = (value: number): string => {
-    if (value >= 90) return 'var(--progress-complete)';
-    if (value >= 70) return 'var(--progress-high)';
-    if (value >= 40) return 'var(--progress-medium)';
-    return 'var(--progress-low)';
-  };
website/src/components/Roadmap/QuarterTimeline.tsx (3)

14-20: Duplicate Milestone type.

This local Milestone interface duplicates the one exported from MilestoneList.tsx (lines 7-23) but with fewer fields. Consider importing and using the canonical type to avoid drift.

Proposed fix
+import { Milestone } from './MilestoneList';
 import { renderInlineMarkdown } from './utils';
 
 interface Quarter {
   id: string;
   label: string;
   status: 'completed' | 'current' | 'planned';
 }
 
-interface Milestone {
-  label: string;
-  status: 'shipped' | 'in-progress' | 'planned';
-  quarter: string;
-  pr?: number;
-  changelog?: string;
-}
-
 interface Initiative {

232-254: Using array index as key.

Line 239 uses idx as the key. If milestones within a group could reorder or change, this may cause rendering issues. Using milestone.label or a composite key would be more stable.

Proposed fix
-                        {group.milestones.map((milestone, idx) => {
+                        {group.milestones.map((milestone) => {
                           const statusDotClass = {
                             shipped: styles.quarterDetailStatusDotShipped,
                             'in-progress': styles.quarterDetailStatusDotInProgress,
                             planned: styles.quarterDetailStatusDotPlanned,
                           }[milestone.status];
                           return (
-                          <li key={idx} className={styles.quarterDetailMilestoneItem}>
+                          <li key={milestone.label} className={styles.quarterDetailMilestoneItem}>

147-152: getMilestonesForQuarter called during render.

This function is called for each quarter during every render (line 152). For larger datasets, consider memoizing the milestone counts.

website/src/components/Roadmap/MilestoneList.tsx (1)

137-145: Using array index as key for milestones.

Line 139 uses index as key. Since milestones are sorted by status, the list order is stable within a render, but using milestone.label would be more robust if the sort logic changes.

Proposed fix
-            <li
-              key={index}
+            <li
+              key={milestone.label}
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between acaba0f and 1018fd9.

📒 Files selected for processing (15)
  • .claude/agents/roadmap.md
  • website/docusaurus.config.js
  • website/src/components/Roadmap/Highlights.tsx
  • website/src/components/Roadmap/InitiativeCard.tsx
  • website/src/components/Roadmap/MilestoneDrawer.tsx
  • website/src/components/Roadmap/MilestoneList.tsx
  • website/src/components/Roadmap/ProgressBar.tsx
  • website/src/components/Roadmap/QuarterTimeline.tsx
  • website/src/components/Roadmap/RoadmapHero.tsx
  • website/src/components/Roadmap/Tooltip.tsx
  • website/src/components/Roadmap/index.tsx
  • website/src/components/Roadmap/styles.module.css
  • website/src/components/Roadmap/utils.tsx
  • website/src/data/roadmap.js
  • website/src/pages/roadmap.js
🧰 Additional context used
📓 Path-based instructions (1)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/src/components/Roadmap/utils.tsx
  • website/src/components/Roadmap/Tooltip.tsx
  • website/src/pages/roadmap.js
  • website/src/data/roadmap.js
  • website/src/components/Roadmap/index.tsx
  • website/src/components/Roadmap/Highlights.tsx
  • website/src/components/Roadmap/styles.module.css
  • website/src/components/Roadmap/ProgressBar.tsx
  • website/src/components/Roadmap/InitiativeCard.tsx
  • website/src/components/Roadmap/MilestoneList.tsx
  • website/docusaurus.config.js
  • website/src/components/Roadmap/QuarterTimeline.tsx
  • website/src/components/Roadmap/RoadmapHero.tsx
  • website/src/components/Roadmap/MilestoneDrawer.tsx
🧠 Learnings (2)
📚 Learning: 2025-09-24T22:20:39.209Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1505
File: website/docs/cli/commands/completion.mdx:124-127
Timestamp: 2025-09-24T22:20:39.209Z
Learning: In Docusaurus (specifically the cloudposse/atmos repository), backticks render correctly as code formatting even when used inside HTML elements like <dl>/<dt>/<dd> tags in MDX files. No need to replace with <code> tags.

Applied to files:

  • website/src/components/Roadmap/utils.tsx
📚 Learning: 2025-11-07T14:52:55.217Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1761
File: docs/prd/claude-agent-architecture.md:331-439
Timestamp: 2025-11-07T14:52:55.217Z
Learning: In the cloudposse/atmos repository, Claude agents are used as interactive tools, not in automated/headless CI/CD contexts. Agent documentation and patterns should assume synchronous human interaction.

Applied to files:

  • .claude/agents/roadmap.md
🧬 Code graph analysis (4)
website/src/pages/roadmap.js (1)
website/src/components/Roadmap/index.tsx (1)
  • Roadmap (9-42)
website/src/components/Roadmap/InitiativeCard.tsx (5)
website/src/components/Roadmap/MilestoneList.tsx (2)
  • Milestone (7-23)
  • MilestoneList (50-177)
website/src/components/Roadmap/ProgressBar.tsx (1)
  • ProgressBar (12-43)
website/src/components/Roadmap/utils.tsx (1)
  • renderInlineMarkdown (8-16)
website/src/components/Roadmap/Tooltip.tsx (1)
  • Tooltip (10-97)
website/src/components/Roadmap/MilestoneDrawer.tsx (1)
  • MilestoneDrawer (15-160)
website/src/components/Roadmap/QuarterTimeline.tsx (2)
website/src/components/Roadmap/MilestoneList.tsx (1)
  • Milestone (7-23)
website/src/components/Roadmap/utils.tsx (1)
  • renderInlineMarkdown (8-16)
website/src/components/Roadmap/MilestoneDrawer.tsx (2)
website/src/components/Roadmap/MilestoneList.tsx (1)
  • Milestone (7-23)
website/src/components/Roadmap/utils.tsx (1)
  • renderInlineMarkdown (8-16)
🪛 LanguageTool
.claude/agents/roadmap.md

[typographical] ~38-~38: To join two clauses or introduce examples, consider using an em dash.
Context: ...data/roadmap.js` | Primary data file - All initiatives, milestones, quarters, p...

(DASH_RULE)


[typographical] ~219-~219: To join two clauses or introduce examples, consider using an em dash.
Context: ...(React Icons Remix set): - RiLockLine - Authentication/Security - `RiFlashlightL...

(DASH_RULE)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (17)
website/src/components/Roadmap/Tooltip.tsx (1)

17-34: LGTM! Clean theme detection implementation.

The MutationObserver pattern correctly watches for theme changes on the document element and properly cleans up on unmount.

website/src/components/Roadmap/MilestoneDrawer.tsx (3)

23-31: LGTM! Proper escape key handling.

Clean implementation with correct cleanup and dependency tracking.


34-46: LGTM! Solid click-outside detection.

Using mousedown instead of click is the right choice, and the contains check properly handles nested elements.


49-58: LGTM! Proper scroll lock implementation.

Correctly prevents body scroll while the drawer is open and ensures cleanup restores the original state.

website/docusaurus.config.js (1)

438-442: LGTM! Clean navbar integration.

The Roadmap link follows the existing navigation pattern and correctly points to the new /roadmap page.

website/src/pages/roadmap.js (1)

1-14: LGTM! Clean page structure.

Follows Docusaurus conventions perfectly. The page properly wraps the Roadmap component with Layout and provides appropriate metadata.

website/src/components/Roadmap/Highlights.tsx (1)

26-42: LGTM! Safe icon resolution with fallback.

The dynamic icon lookup uses a type assertion but safely falls back to RiStarLine if the icon isn't found. The staggered animation timing creates a nice visual effect.

.claude/agents/roadmap.md (1)

1-251: LGTM! Comprehensive agent documentation.

This is well-structured documentation that clearly explains the roadmap data model, common tasks, and maintenance workflows. The examples and quality checklist are particularly helpful.

website/src/components/Roadmap/index.tsx (1)

1-42: Clean component composition.

The structure is well organized. Using MotionConfig with reducedMotion="user" properly respects user accessibility preferences. Sorting with spread avoids mutating the original array, and keys use stable initiative.id.

website/src/components/Roadmap/RoadmapHero.tsx (1)

1-23: Straightforward hero implementation.

Simple, semantic HTML structure with a smooth fade-in animation. No concerns here.

website/src/data/roadmap.js (1)

1-313: Solid data structure for the roadmap.

The configuration is comprehensive and well-documented with clear update instructions. The milestone data is rich with docs, changelog references, and descriptions.

website/src/components/Roadmap/InitiativeCard.tsx (2)

46-49: Good defensive icon resolution.

The fallback to RiQuestionLine handles cases where an invalid icon name is provided in the data. Solid approach.


76-104: Accessible expandable header.

Proper role="button", tabIndex, aria-expanded, and keyboard handling. Well done on the a11y front.

website/src/components/Roadmap/ProgressBar.tsx (1)

1-43: Solid progress bar implementation.

Proper clamping, CSS variable usage for theming, and conditional animation handling. The component is clean and reusable.

website/src/components/Roadmap/QuarterTimeline.tsx (1)

128-265: Well-structured timeline component.

Good accessibility with aria-label and aria-expanded. The scroll handling and detail panel animations are smooth. Overall solid work.

website/src/components/Roadmap/MilestoneList.tsx (2)

7-23: Well-documented interface.

The JSDoc comments on optional fields make the data contract clear. This is the canonical Milestone type that other components should import.


137-172: Good accessible list implementation.

Conditional role="button" and tabIndex based on clickability, proper keyboard handling, and stopPropagation on nested links. The accessibility story is solid.

- Fix type mismatch: use undefined instead of null for selectedMilestone
- Make changelogSlugs optional in Initiative interface
- Replace fragile status className construction with explicit mapping
- Reduce tooltip z-index from 9999 to 1002 (just above drawer)
- Add scroll/resize listeners for tooltip position updates
- Improve keyboard accessibility with tabIndex, aria-describedby, role="tooltip"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Focus on custom column views rather than output formats.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
coderabbitai[bot]
coderabbitai bot previously approved these changes Dec 23, 2025
Tab completion is more about developer experience than discoverability.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
… list columns'

Clarifies that this is an improvement to existing list commands (added Q1 2025),
not a new feature. The Q4 2025 milestone added customizable column support.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename 'Migration & Code Generation' to 'Feature Parity with Terragrunt'
- Rename 'Quality & Community' to 'Code Quality and Community'
- Change 'Learning section' to 'New learning section'
- Add Native Terraform to migration guides list
- Add Roadmap milestone to Documentation initiative

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed /design-patterns/design-patterns to /design-patterns

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman and others added 3 commits December 23, 2025 13:18
Adds a prominent link to GitHub feature request issue template
for users who want to suggest new features for the roadmap.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds a link to browse existing feature requests and issues
alongside the 'Request a Feature' link.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changes to Feature Parity with Terragrunt:
- Keep: File-scoped locals
- Rename: Stack name field → Imperative stack names
- Rename: Generate section inheritance → File generation (generate blocks)
- Rename: Backend provisioning → Automatic backend provisioning
- Add: AWS context YAML functions (!aws.account-id, !aws.region, etc.)
- Remove: Metadata inheritance (merged into other features)

Moved to Extensibility & Custom Components:
- !literal YAML function
- metadata.name for component workspace keys

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
website/blog/2025-12-23-product-roadmap.mdx (2)

12-12: Use typographic (curly) quotes instead of straight quotes.

Line 12 uses straight double quotes around "What's the long-term vision?" and "The roadmap answers that question openly". Swap these for typographic curly quotes for better typography.

🔎 Proposed fix
-We're sharing the [Atmos Product Roadmap](/roadmap)—a transparent view of where we've been, where we're headed, and what's coming next. Infrastructure teams evaluating Atmos often ask *"What's the long-term vision?"* The roadmap answers that question openly.
+We're sharing the [Atmos Product Roadmap](/roadmap)—a transparent view of where we've been, where we're headed, and what's coming next. Infrastructure teams evaluating Atmos often ask *"What's the long-term vision?"* The roadmap answers that question openly.

30-31: Consider em dashes for better typography.

Lines 30–31 use hyphens to join clauses. Replace with em dashes for clearer separation.

🔎 Proposed fix
-- [View the Roadmap](/roadmap) - Browse everything we've shipped and what's planned
-- [GitHub Issues](https://github.com/cloudposse/atmos/issues) - Vote on features or request new ones
+- [View the Roadmap](/roadmap) — Browse everything we've shipped and what's planned
+- [GitHub Issues](https://github.com/cloudposse/atmos/issues) — Vote on features or request new ones
website/src/components/Roadmap/InitiativeCard.tsx (1)

56-59: Icon resolution with fallback is solid.

The dynamic icon lookup with fallback to RiQuestionLine handles missing icons gracefully. Optionally, you could add a dev-mode console warning when the fallback is used, but this is working well as-is.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 71f352a and badf273.

📒 Files selected for processing (6)
  • website/blog/2025-12-23-product-roadmap.mdx
  • website/src/components/Roadmap/FeaturedDrawer.tsx
  • website/src/components/Roadmap/FeaturedSection.tsx
  • website/src/components/Roadmap/InitiativeCard.tsx
  • website/src/components/Roadmap/RoadmapStats.tsx
  • website/src/data/roadmap.js
🚧 Files skipped from review as they are similar to previous changes (2)
  • website/src/components/Roadmap/RoadmapStats.tsx
  • website/src/data/roadmap.js
🧰 Additional context used
📓 Path-based instructions (2)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/src/components/Roadmap/FeaturedSection.tsx
  • website/src/components/Roadmap/InitiativeCard.tsx
  • website/src/components/Roadmap/FeaturedDrawer.tsx
  • website/blog/2025-12-23-product-roadmap.mdx
website/blog/**/*.mdx

📄 CodeRabbit inference engine (CLAUDE.md)

website/blog/**/*.mdx: Follow PR template (what/why/references); PRs labeled minor/major MUST include blog post at website/blog/YYYY-MM-DD-feature-name.mdx with YAML front matter, after intro, and only tags from website/blog/tags.yml
Blog posts MUST use only tags defined in website/blog/tags.yml and authors defined in website/blog/authors.yml; valid tags are: feature, enhancement, bugfix, dx, breaking-change, security, documentation, deprecation, core; never invent new tags

Files:

  • website/blog/2025-12-23-product-roadmap.mdx
🧠 Learnings (3)
📓 Common learnings
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • website/src/components/Roadmap/FeaturedSection.tsx
  • website/src/components/Roadmap/InitiativeCard.tsx
  • website/src/components/Roadmap/FeaturedDrawer.tsx
📚 Learning: 2025-12-16T18:20:55.630Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-16T18:20:55.630Z
Learning: Applies to website/blog/**/*.mdx : Follow PR template (what/why/references); PRs labeled minor/major MUST include blog post at website/blog/YYYY-MM-DD-feature-name.mdx with YAML front matter, <!--truncate--> after intro, and only tags from website/blog/tags.yml

Applied to files:

  • website/src/components/Roadmap/FeaturedSection.tsx
  • website/blog/2025-12-23-product-roadmap.mdx
🧬 Code graph analysis (1)
website/src/components/Roadmap/FeaturedSection.tsx (1)
website/src/components/Roadmap/FeaturedDrawer.tsx (2)
  • FeaturedItem (8-21)
  • FeaturedDrawer (35-203)
🪛 LanguageTool
website/blog/2025-12-23-product-roadmap.mdx

[typographical] ~12-~12: Consider using a typographic close quote here.
Context: ...cture teams evaluating Atmos often ask "What's the long-term vision?" The roadm...

(EN_QUOTES)


[typographical] ~12-~12: Consider using a typographic close quote here.
Context: ...often ask "What's the long-term vision?" The roadmap answers that question open...

(EN_QUOTES)


[typographical] ~30-~30: To join two clauses or introduce examples, consider using an em dash.
Context: ...arn More - View the Roadmap - Browse everything we've shipped and what...

(DASH_RULE)


[typographical] ~31-~31: To join two clauses or introduce examples, consider using an em dash.
Context: ...ps://github.com/cloudposse/atmos/issues) - Vote on features or request new ones

(DASH_RULE)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (18)
website/blog/2025-12-23-product-roadmap.mdx (2)

14-31: Well-structured blog post that follows guidelines.

The post has correct front matter, proper tag selection (feature, documentation), truncate placement, and clear structure that answers what/why/references. Content is actionable and aligns with the roadmap feature rollout.


1-10: Author and tags are valid.

osterman is registered in website/blog/authors.yml, and both feature and documentation tags are defined in website/blog/tags.yml. The front matter is correctly configured.

website/src/components/Roadmap/InitiativeCard.tsx (7)

1-11: Imports look solid.

All necessary dependencies are imported cleanly. The dual import pattern for react-icons (named icons plus wildcard for dynamic resolution) is appropriate for the icon fallback mechanism used later.


13-17: Clean interface definition.

The exported PRReference interface is well-documented and provides clear typing for PR tooltip data.


19-38: Interfaces are well-defined.

Both Initiative and InitiativeCardProps are properly typed with sensible defaults and clear documentation.


40-54: State management looks good.

The component state is properly initialized, and the type mismatch from the previous review (null vs undefined) has been addressed. The expandAllMilestones effect appropriately expands the card in response to the prop.


61-75: Event handlers are well-implemented.

Keyboard accessibility with Enter and Space keys is properly handled, and preventDefault() correctly prevents unwanted default behavior.


77-184: Rendering logic is complete and accessible.

The component properly implements:

  • Smooth animations with Framer Motion
  • Full keyboard accessibility with ARIA attributes
  • Secure external links with target="_blank" and rel="noopener noreferrer" (as addressed from previous reviews)

All previous concerns about missing security attributes on GitHub links have been resolved.


187-191: Drawer integration is correct.

The MilestoneDrawer receives properly typed props, and the type consistency issue from the previous review has been addressed.

website/src/components/Roadmap/FeaturedSection.tsx (4)

13-32: LGTM! Clean status and sorting configuration.

The status config and sorting logic are well-structured. The parseQuarter function correctly converts quarter strings to sortable numbers for chronological ordering.


34-43: LGTM! Proper state management and sorting.

State hooks and sorting logic are correctly implemented. Items are sorted by status priority first, then chronologically by quarter.


45-59: LGTM! Excellent keyboard accessibility.

Event handlers are well-implemented with proper keyboard support (Enter and Space keys) and preventDefault to avoid unintended scrolling.


61-163: LGTM! Comprehensive rendering with proper security and accessibility.

The rendering logic is well-structured:

  • Animations are smooth with staggered delays
  • Keyboard navigation is fully accessible with role="button" and tabIndex={0}
  • stopPropagation on footer links prevents unintended card clicks
  • External GitHub links (PRD and PR) correctly include target="_blank" and rel="noopener noreferrer"
website/src/components/Roadmap/FeaturedDrawer.tsx (5)

42-78: LGTM! Excellent effect management.

All three effects are properly implemented:

  • Escape key handling with cleanup
  • Click-outside detection using ref
  • Body scroll lock/unlock with restoration in cleanup

Dependencies are correct and cleanup functions prevent memory leaks.


80-83: LGTM! Safe icon resolution with fallback.

Dynamic icon resolution is well-implemented with a sensible fallback to RiQuestionLine when the icon is not found or item is undefined.


85-122: LGTM! Smooth drawer animations and structure.

The drawer implementation is solid:

  • AnimatePresence handles exit animations properly
  • Backdrop and drawer use appropriate motion transitions
  • Close button includes aria-label for accessibility
  • Conditional rendering prevents rendering null items

124-202: LGTM! Complete drawer content with proper link handling.

The drawer content is comprehensive and well-structured:

  • Optional sections (description, benefits) conditionally rendered
  • Internal links (changelog, docs) use relative paths appropriately
  • External GitHub links (PRD, PR) include target="_blank" and rel="noopener noreferrer" for security
  • Metadata rendering uses defensive fallback for unknown statuses
  • Quarter and status formatting is clean

29-33: The CSS class name drawerMetaStatusInprogress (lowercase 'i') in the mapping matches the actual class definition in styles.module.css at line 1814. No inconsistency here—the naming is intentional and consistent across both FeaturedDrawer.tsx and MilestoneDrawer.tsx.

Likely an incorrect or invalid review comment.

coderabbitai[bot]
coderabbitai bot previously approved these changes Dec 24, 2025
Update doc links to use correct paths:
- /cli/configuration/configuration → /cli/configuration
- /cli/commands/commands → /cli/commands

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
aknysh
aknysh previously approved these changes Dec 26, 2025
@aknysh
Copy link
Member

aknysh commented Dec 26, 2025

@coderabbitai full review please

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 26, 2025

@aknysh I'll conduct a full review of all the changes in this PR.


🧠 Learnings used
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
✅ Actions performed

Full review triggered.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
website/src/data/roadmap.js (1)

109-146: Type mismatch previously identified.

The Initiative interface expects changelogSlugs: string[] but initiatives don't provide this field. Either add empty arrays or make the interface field optional.

🧹 Nitpick comments (1)
website/src/components/Roadmap/MilestoneDrawer.tsx (1)

89-92: Consider using role="dialog" instead of role="tooltip".

The drawer behaves like a modal dialog rather than a tooltip. While not critical, role="dialog" with aria-modal="true" would better communicate the interaction pattern to screen readers.

🔎 Optional ARIA refinement
          <motion.div
            ref={drawerRef}
            className={styles.drawer}
+           role="dialog"
+           aria-modal="true"
-           role="tooltip"
            initial={{ x: '100%' }}
            animate={{ x: 0 }}
            exit={{ x: '100%' }}
            transition={{ type: 'spring', damping: 25, stiffness: 300 }}
          >
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1d433c4 and bca6ab5.

📒 Files selected for processing (21)
  • .claude/agents/roadmap.md
  • .github/workflows/changelog-check.yml
  • CLAUDE.md
  • website/blog/2025-12-23-product-roadmap.mdx
  • website/docusaurus.config.js
  • website/src/components/Roadmap/FeaturedDrawer.tsx
  • website/src/components/Roadmap/FeaturedSection.tsx
  • website/src/components/Roadmap/Highlights.tsx
  • website/src/components/Roadmap/InitiativeCard.tsx
  • website/src/components/Roadmap/MilestoneDrawer.tsx
  • website/src/components/Roadmap/MilestoneList.tsx
  • website/src/components/Roadmap/ProgressBar.tsx
  • website/src/components/Roadmap/QuarterTimeline.tsx
  • website/src/components/Roadmap/RoadmapHero.tsx
  • website/src/components/Roadmap/RoadmapStats.tsx
  • website/src/components/Roadmap/Tooltip.tsx
  • website/src/components/Roadmap/index.tsx
  • website/src/components/Roadmap/styles.module.css
  • website/src/components/Roadmap/utils.tsx
  • website/src/data/roadmap.js
  • website/src/pages/roadmap.js
🧰 Additional context used
📓 Path-based instructions (3)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/src/pages/roadmap.js
  • website/docusaurus.config.js
  • website/src/components/Roadmap/Highlights.tsx
  • website/src/data/roadmap.js
  • website/src/components/Roadmap/utils.tsx
  • website/src/components/Roadmap/MilestoneDrawer.tsx
  • website/blog/2025-12-23-product-roadmap.mdx
  • website/src/components/Roadmap/QuarterTimeline.tsx
  • website/src/components/Roadmap/InitiativeCard.tsx
  • website/src/components/Roadmap/index.tsx
  • website/src/components/Roadmap/ProgressBar.tsx
  • website/src/components/Roadmap/Tooltip.tsx
  • website/src/components/Roadmap/RoadmapStats.tsx
  • website/src/components/Roadmap/MilestoneList.tsx
  • website/src/components/Roadmap/styles.module.css
  • website/src/components/Roadmap/FeaturedDrawer.tsx
  • website/src/components/Roadmap/FeaturedSection.tsx
  • website/src/components/Roadmap/RoadmapHero.tsx
website/blog/**/*.mdx

📄 CodeRabbit inference engine (CLAUDE.md)

website/blog/**/*.mdx: Follow PR template (what/why/references); PRs labeled minor/major MUST include blog post at website/blog/YYYY-MM-DD-feature-name.mdx with YAML front matter, after intro, and only tags from website/blog/tags.yml
Blog posts MUST use only tags defined in website/blog/tags.yml and authors defined in website/blog/authors.yml; valid tags are: feature, enhancement, bugfix, dx, breaking-change, security, documentation, deprecation, core; never invent new tags

Files:

  • website/blog/2025-12-23-product-roadmap.mdx
.github/workflows/*.{yml,yaml}

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

Configure CI to run unit tests, integration tests, golangci-lint, and coverage reporting on all pull requests

Files:

  • .github/workflows/changelog-check.yml
🧠 Learnings (10)
📓 Common learnings
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
Learnt from: Listener430
Repo: cloudposse/atmos PR: 934
File: tests/fixtures/scenarios/docs-generate/README.md.gotmpl:99-118
Timestamp: 2025-01-25T03:51:57.689Z
Learning: For the cloudposse/atmos repository, changes to template contents should be handled in dedicated PRs and are typically considered out of scope for PRs focused on other objectives.
📚 Learning: 2025-01-19T15:49:15.593Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 955
File: tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden:0-0
Timestamp: 2025-01-19T15:49:15.593Z
Learning: In future commits, the help text for Atmos CLI commands should be limited to only show component and stack parameters for commands that actually use them. This applies to the example usage section in command help text.

Applied to files:

  • website/src/data/roadmap.js
📚 Learning: 2025-09-24T22:20:39.209Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1505
File: website/docs/cli/commands/completion.mdx:124-127
Timestamp: 2025-09-24T22:20:39.209Z
Learning: In Docusaurus (specifically the cloudposse/atmos repository), backticks render correctly as code formatting even when used inside HTML elements like <dl>/<dt>/<dd> tags in MDX files. No need to replace with <code> tags.

Applied to files:

  • website/src/components/Roadmap/utils.tsx
📚 Learning: 2025-12-16T18:20:55.630Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-16T18:20:55.630Z
Learning: Applies to website/blog/**/*.mdx : Follow PR template (what/why/references); PRs labeled minor/major MUST include blog post at website/blog/YYYY-MM-DD-feature-name.mdx with YAML front matter, <!--truncate--> after intro, and only tags from website/blog/tags.yml

Applied to files:

  • website/blog/2025-12-23-product-roadmap.mdx
  • .github/workflows/changelog-check.yml
  • website/src/components/Roadmap/FeaturedSection.tsx
  • CLAUDE.md
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • website/src/components/Roadmap/InitiativeCard.tsx
  • .github/workflows/changelog-check.yml
  • website/src/components/Roadmap/FeaturedDrawer.tsx
  • website/src/components/Roadmap/FeaturedSection.tsx
  • CLAUDE.md
📚 Learning: 2025-11-07T14:52:55.217Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1761
File: docs/prd/claude-agent-architecture.md:331-439
Timestamp: 2025-11-07T14:52:55.217Z
Learning: In the cloudposse/atmos repository, Claude agents are used as interactive tools, not in automated/headless CI/CD contexts. Agent documentation and patterns should assume synchronous human interaction.

Applied to files:

  • .claude/agents/roadmap.md
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to CHANGELOG.md : Follow semantic versioning, update CHANGELOG.md with each release, and create GitHub releases with detailed release notes

Applied to files:

  • .github/workflows/changelog-check.yml
  • CLAUDE.md
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Ensure all tests pass, verify code coverage meets targets, run golangci-lint and fix any issues, and update documentation before submitting pull requests

Applied to files:

  • .github/workflows/changelog-check.yml
📚 Learning: 2025-12-16T18:20:55.630Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-16T18:20:55.630Z
Learning: Applies to website/blog/**/*.mdx : Blog posts MUST use only tags defined in website/blog/tags.yml and authors defined in website/blog/authors.yml; valid tags are: feature, enhancement, bugfix, dx, breaking-change, security, documentation, deprecation, core; never invent new tags

Applied to files:

  • CLAUDE.md
📚 Learning: 2025-11-24T17:35:37.209Z
Learnt from: CR
Repo: cloudposse/atmos PR: 0
File: .cursor/rules/atmos-rules.mdc:0-0
Timestamp: 2025-11-24T17:35:37.209Z
Learning: Applies to website/** : Update website documentation in the `website/` directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style

Applied to files:

  • CLAUDE.md
🧬 Code graph analysis (6)
website/src/pages/roadmap.js (1)
website/src/components/Roadmap/index.tsx (1)
  • Roadmap (21-91)
website/src/components/Roadmap/QuarterTimeline.tsx (2)
website/src/components/Roadmap/MilestoneList.tsx (1)
  • Milestone (7-29)
website/src/components/Roadmap/utils.tsx (1)
  • renderInlineMarkdown (8-16)
website/src/components/Roadmap/index.tsx (6)
website/src/data/roadmap.js (2)
  • roadmapConfig (14-412)
  • roadmapConfig (14-412)
website/src/components/Roadmap/RoadmapHero.tsx (1)
  • RoadmapHero (9-23)
website/src/components/Roadmap/QuarterTimeline.tsx (1)
  • QuarterTimeline (49-266)
website/src/components/Roadmap/FeaturedSection.tsx (1)
  • FeaturedSection (34-163)
website/src/components/Roadmap/RoadmapStats.tsx (1)
  • RoadmapStats (49-99)
website/src/components/Roadmap/InitiativeCard.tsx (1)
  • InitiativeCard (40-194)
website/src/components/Roadmap/RoadmapStats.tsx (1)
website/src/components/Roadmap/MilestoneList.tsx (1)
  • Milestone (7-29)
website/src/components/Roadmap/MilestoneList.tsx (1)
website/src/components/Roadmap/utils.tsx (1)
  • renderInlineMarkdown (8-16)
website/src/components/Roadmap/FeaturedSection.tsx (1)
website/src/components/Roadmap/FeaturedDrawer.tsx (2)
  • FeaturedItem (8-21)
  • FeaturedDrawer (35-203)
🪛 LanguageTool
website/blog/2025-12-23-product-roadmap.mdx

[typographical] ~12-~12: Consider using a typographic close quote here.
Context: ...cture teams evaluating Atmos often ask "What's the long-term vision?" The roadm...

(EN_QUOTES)


[typographical] ~12-~12: Consider using a typographic close quote here.
Context: ...often ask "What's the long-term vision?" The roadmap answers that question open...

(EN_QUOTES)


[typographical] ~30-~30: To join two clauses or introduce examples, consider using an em dash.
Context: ...arn More - View the Roadmap - Browse everything we've shipped and what...

(DASH_RULE)


[typographical] ~31-~31: To join two clauses or introduce examples, consider using an em dash.
Context: ...ps://github.com/cloudposse/atmos/issues) - Vote on features or request new ones

(DASH_RULE)

.claude/agents/roadmap.md

[typographical] ~38-~38: To join two clauses or introduce examples, consider using an em dash.
Context: ...data/roadmap.js` | Primary data file - All initiatives, milestones, quarters, p...

(DASH_RULE)


[typographical] ~219-~219: To join two clauses or introduce examples, consider using an em dash.
Context: ...(React Icons Remix set): - RiLockLine - Authentication/Security - `RiFlashlightL...

(DASH_RULE)

⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (23)
CLAUDE.md (1)

276-283: LGTM!

Clear documentation of the new CI-enforced roadmap update requirements. The structure mirrors the existing blog post documentation block, maintaining consistency.

.github/workflows/changelog-check.yml (3)

65-82: LGTM!

The roadmap check step mirrors the blog check pattern correctly. Uses git diff for reliable detection without API limitations.


84-133: Well-structured conditional commenting.

The dynamic checklist approach (showing ✅ for completed items) gives clear feedback. The fallback from PATCH to comment creation handles edge cases nicely.


195-204: LGTM!

The success condition correctly handles both cases: no docs required OR all docs present.

website/docusaurus.config.js (1)

438-442: LGTM!

Navbar item follows existing patterns. Route /roadmap matches the new page component.

website/src/pages/roadmap.js (1)

1-14: LGTM!

Clean page component. Follows Docusaurus conventions with proper Layout wrapper and SEO metadata.

website/src/components/Roadmap/utils.tsx (1)

8-16: LGTM!

Clean implementation for inline markdown code spans. The regex correctly captures backtick-delimited segments, and using index as key is fine for this static content.

.claude/agents/roadmap.md (1)

1-254: LGTM!

Comprehensive agent documentation. The data structures, workflow examples, and quality checks align well with the actual roadmap.js implementation. Good reference material for maintainers.

website/src/data/roadmap.js (1)

1-16: LGTM!

Well-documented data file with comprehensive roadmap information. The header comments provide clear update instructions.

website/blog/2025-12-23-product-roadmap.mdx (1)

1-14: Post is good to merge.

Author osterman is properly defined in authors.yml, and both tags (feature, documentation) are valid per tags.yml. Frontmatter structure, truncate placement, and format all check out.

website/src/components/Roadmap/RoadmapHero.tsx (1)

1-23: LGTM!

Clean hero component with appropriate fade-in animation. The implementation is straightforward and correct.

website/src/components/Roadmap/Highlights.tsx (1)

1-56: LGTM!

The highlights grid implementation is solid. Icon resolution with fallback and staggered animations are well-implemented.

website/src/components/Roadmap/Tooltip.tsx (1)

1-116: LGTM!

The tooltip implementation addresses previous feedback well—scroll/resize handling and keyboard accessibility are properly implemented. Theme detection and positioning logic are solid.

website/src/components/Roadmap/index.tsx (1)

1-91: LGTM!

The main Roadmap composition is well-structured. Priority sorting with fallback to progress is logical, and the reducedMotion="user" config respects accessibility preferences.

website/src/components/Roadmap/RoadmapStats.tsx (1)

1-99: LGTM!

The stats computation and progress bar rendering correctly guard against division by zero. The breakdown display with animated bars is well-implemented.

website/src/components/Roadmap/MilestoneDrawer.tsx (1)

15-19: Past fragile className construction is now resolved.

The explicit statusClassMap with fallback is much clearer than the previous string manipulation approach. Good refactor.

Also applies to: 158-158

website/src/components/Roadmap/FeaturedSection.tsx (1)

1-163: LGTM!

Featured section is well-implemented with proper keyboard navigation, external link handling (target="_blank" + rel), and accessible card interactions. The drawer integration and sorting logic are solid.

website/src/components/Roadmap/QuarterTimeline.tsx (1)

1-266: LGTM!

The quarter timeline is well-architected with proper scroll management, accessibility (ARIA attributes on interactive elements), and smooth animations. The milestone grouping and sorting logic is clear and correct.

website/src/components/Roadmap/ProgressBar.tsx (1)

1-43: LGTM! Clean progress bar implementation.

The component is well-structured with proper clamping, smooth animations, and dynamic theming. The conditional animation logic and CSS variable-based coloring are solid choices.

website/src/components/Roadmap/FeaturedDrawer.tsx (1)

1-203: LGTM! Solid drawer implementation.

The component handles keyboard events, outside clicks, and scroll locking correctly. Icon resolution with fallback and external link security attributes are all in place. Nice work on the animations and accessibility.

website/src/components/Roadmap/InitiativeCard.tsx (1)

1-194: LGTM! Well-architected initiative card.

The component properly handles expansion state, keyboard navigation, and external link security. The integration with MilestoneList and MilestoneDrawer is clean, and the expandAllMilestones propagation works as expected. Good use of event propagation control and accessibility attributes.

website/src/components/Roadmap/styles.module.css (1)

1-1893: LGTM! Comprehensive and well-organized stylesheet.

The CSS module provides thorough theme support, proper z-index layering (tooltip at 1002, drawer at 1001), responsive breakpoints, and accessibility features including reduced motion support. The styling is consistent across all roadmap components.

website/src/components/Roadmap/MilestoneList.tsx (1)

1-313: LGTM! Excellent milestone list implementation.

The component provides flexible rendering with flat and grouped views, smart sorting by status and priority, and proper handling of rich content interactions. External links include security attributes, keyboard navigation is well-implemented, and the collapsible group logic with expandAll override works cleanly. The integration with renderInlineMarkdown for backtick-style code formatting is a nice touch.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (2)
website/src/components/Roadmap/MilestoneDrawer.tsx (1)

15-19: Previous concern addressed.

The explicit statusClassMap resolves the fragile string manipulation issue from the prior review. Clear and maintainable.

website/src/data/roadmap.js (1)

109-146: Verify type requirements with InitiativeCard interface.

A past review noted that the Initiative interface expects a changelogSlugs: string[] field, but no initiatives in this file provide it. If this field is still required by the consuming components, either add changelogSlugs: [] to each initiative or remove/mark the field as optional in the interface.

Run the following to check the current interface definition:

#!/bin/bash
# Check if changelogSlugs is still required in the Initiative interface
rg -n -A5 -B5 'interface.*Initiative' website/src/components/Roadmap/
🧹 Nitpick comments (2)
website/src/components/Roadmap/MilestoneDrawer.tsx (1)

81-103: Consider adding focus management for full accessibility.

The ARIA attributes are solid. For a complete accessible modal experience, consider:

  1. Moving focus to the close button (or first focusable element) when the drawer opens.
  2. Trapping focus within the drawer while open.
  3. Returning focus to the triggering element on close.
🔎 Example focus management addition
+ const previousActiveElement = useRef<HTMLElement | null>(null);
+
  // Close on escape key.
  useEffect(() => {
+   if (isOpen) {
+     previousActiveElement.current = document.activeElement as HTMLElement;
+     // Focus the close button or drawer
+     drawerRef.current?.focus();
+   }
    const handleKeyDown = (e: KeyboardEvent) => {
      if (e.key === 'Escape' && isOpen) {
        onClose();
      }
    };
    document.addEventListener('keydown', handleKeyDown);
-   return () => document.removeEventListener('keydown', handleKeyDown);
+   return () => {
+     document.removeEventListener('keydown', handleKeyDown);
+     if (!isOpen && previousActiveElement.current) {
+       previousActiveElement.current.focus();
+     }
+   };
  }, [isOpen, onClose]);

And add tabIndex={-1} to the drawer div to make it focusable.

website/src/data/roadmap.js (1)

339-360: Consider adjusting progress percentage.

The quality initiative shows progress: 85 with 6 shipped and 2 in-progress milestones (6/8 = 75%). The 85% seems slightly optimistic, though it may account for partial completion of in-progress work. Consider whether 80% better reflects current state.

🔎 Optional adjustment
-      progress: 85,
+      progress: 80,
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between bca6ab5 and 67e48f2.

📒 Files selected for processing (2)
  • website/src/components/Roadmap/MilestoneDrawer.tsx
  • website/src/data/roadmap.js
🧰 Additional context used
📓 Path-based instructions (1)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/src/components/Roadmap/MilestoneDrawer.tsx
  • website/src/data/roadmap.js
🧠 Learnings (2)
📓 Common learnings
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
Learnt from: Listener430
Repo: cloudposse/atmos PR: 934
File: tests/fixtures/scenarios/docs-generate/README.md.gotmpl:99-118
Timestamp: 2025-01-25T03:51:57.689Z
Learning: For the cloudposse/atmos repository, changes to template contents should be handled in dedicated PRs and are typically considered out of scope for PRs focused on other objectives.
📚 Learning: 2025-01-19T15:49:15.593Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 955
File: tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden:0-0
Timestamp: 2025-01-19T15:49:15.593Z
Learning: In future commits, the help text for Atmos CLI commands should be limited to only show component and stack parameters for commands that actually use them. This applies to the example usage section in command help text.

Applied to files:

  • website/src/data/roadmap.js
🧬 Code graph analysis (1)
website/src/components/Roadmap/MilestoneDrawer.tsx (2)
website/src/components/Roadmap/MilestoneList.tsx (1)
  • Milestone (7-29)
website/src/components/Roadmap/utils.tsx (1)
  • renderInlineMarkdown (8-16)
⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (7)
website/src/components/Roadmap/MilestoneDrawer.tsx (4)

29-64: Effects are well-structured.

Proper cleanup in all three effects. Dependencies are correct. The body scroll lock correctly resets on cleanup.


119-133: Screenshot and code sections look good.

Lazy loading on the image is a nice touch. The code example uses a simple <code> element which works for short snippets.


135-154: Internal links correctly use Docusaurus Link.

Good use of the Link component for internal navigation to changelog and docs pages.


156-169: Status mapping and quarter formatting are solid.

The statusClassMap with fallback and the ternary for display text both align with the Milestone type's status union ('shipped' | 'in-progress' | 'planned').

website/src/data/roadmap.js (3)

1-31: Structure looks solid.

The file header provides clear maintainer guidance, and the quarter timeline accurately reflects Q4 2025 as current. Vision and theme are well-articulated.


33-107: Featured section is well-structured.

All featured initiatives have comprehensive metadata with proper links to docs, changelogs, PRDs, or PRs. Status values and quarters are consistent.


386-412: Highlights effectively communicate project progress.

The highlights section provides clear, quantifiable metrics showing the project's evolution. Test coverage improvement from <20% to 74% is particularly impressive.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
website/src/components/Roadmap/MilestoneDrawer.tsx (2)

15-19: statusClassMap improves maintainability.

The explicit mapping addresses the previous review's concern about fragile string manipulation. This is clearer and easier to maintain than dynamic className construction.

One minor note: the values are still string keys that must match CSS module class names exactly. If the CSS changes, this will break silently. Consider using direct style references if possible:

const statusClassMap: Record<string, string> = {
  shipped: styles.drawerMetaStatusShipped,
  'in-progress': styles.drawerMetaStatusInprogress,
  planned: styles.drawerMetaStatusPlanned,
};

Then use it as: statusClassMap[milestone.status] without needing styles[...] wrapper.


172-185: Status badge rendering is functional.

The meta section correctly displays the quarter and status. The statusClassMap lookup with fallback prevents undefined class names.

The nested ternary for status labels (lines 179-183) is readable, but a mapping object would be more maintainable:

const statusLabels = {
  'shipped': 'Shipped',
  'in-progress': 'In Progress',
  'planned': 'Planned',
};

// Then use:
{statusLabels[milestone.status] || 'Planned'}
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 67e48f2 and e103ac9.

📒 Files selected for processing (2)
  • website/src/components/Roadmap/MilestoneDrawer.tsx
  • website/src/data/roadmap.js
🧰 Additional context used
📓 Path-based instructions (1)
website/**

📄 CodeRabbit inference engine (.cursor/rules/atmos-rules.mdc)

website/**: Update website documentation in the website/ directory when adding new features, ensure consistency between CLI help text and website documentation, and follow the website's documentation structure and style
Keep website code in the website/ directory, follow the existing website architecture and style, and test website changes locally before committing
Keep CLI documentation and website documentation in sync and document new features on the website with examples and use cases

Files:

  • website/src/data/roadmap.js
  • website/src/components/Roadmap/MilestoneDrawer.tsx
🧠 Learnings (3)
📓 Common learnings
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.
📚 Learning: 2025-12-13T06:07:37.766Z
Learnt from: osterman
Repo: cloudposse/atmos PR: 1686
File: docs/prd/tool-dependencies-integration.md:58-64
Timestamp: 2025-12-13T06:07:37.766Z
Learning: cloudposse/atmos: For PRD docs (docs/prd/*.md), markdownlint issues like MD040/MD010/MD034 can be handled in a separate documentation cleanup commit and should not block the current PR.

Applied to files:

  • website/src/data/roadmap.js
📚 Learning: 2025-01-19T15:49:15.593Z
Learnt from: samtholiya
Repo: cloudposse/atmos PR: 955
File: tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden:0-0
Timestamp: 2025-01-19T15:49:15.593Z
Learning: In future commits, the help text for Atmos CLI commands should be limited to only show component and stack parameters for commands that actually use them. This applies to the example usage section in command help text.

Applied to files:

  • website/src/data/roadmap.js
⏰ Context from checks skipped due to timeout of 900000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Acceptance Tests (macos)
  • GitHub Check: Acceptance Tests (windows)
  • GitHub Check: Summary
🔇 Additional comments (9)
website/src/data/roadmap.js (6)

1-107: Structure looks solid.

The roadmap data model is well-organized with clear sections for vision, quarters, and featured initiatives. The featured items include all necessary metadata for UI rendering.


186-207: Progress percentage now accurate.

The discoverability initiative correctly shows progress: 100 with all 6 milestones marked as shipped. Previous concern resolved.


208-230: Progress percentage now accurate.

The workflows initiative correctly shows progress: 100 with all 6 milestones marked as shipped. Previous concern resolved.


361-383: Progress percentage now accurate.

The docs initiative correctly shows progress: 100 with all 9 milestones marked as shipped. Previous concern resolved.


386-414: Clean data structure and export.

The highlights array and export statement are straightforward. No issues detected.


109-146: No action needed. The changelogSlugs field is already marked as optional in the Initiative interface (InitiativeCard.tsx line 30), so the data structure is correct as-is.

website/src/components/Roadmap/MilestoneDrawer.tsx (3)

30-41: Focus management follows accessibility best practices.

Saving the previously focused element and restoring it on close is the correct pattern. The 100ms delay allows the drawer animation to start before focusing the close button.


43-79: Event handlers and scroll lock implemented correctly.

The Escape key handler, click-outside detection, and body scroll lock all follow proper React patterns with appropriate cleanup. Dependencies are correct and the logic is sound.


81-150: Drawer UI and accessibility are well implemented.

The component uses proper ARIA attributes, conditional rendering for optional fields, and lazy loading for images. The Framer Motion animations are configured appropriately.

@aknysh aknysh merged commit 2a6c2e9 into main Dec 26, 2025
59 checks passed
@aknysh aknysh deleted the osterman/atmos-roadmap-page branch December 26, 2025 06:30
@mergify mergify bot removed the needs-cloudposse Needs Cloud Posse assistance label Dec 26, 2025
@github-actions
Copy link

Warning

Release Documentation Required

This PR is labeled minor or major and requires documentation updates:

  • Changelog entry - Add a blog post in website/blog/YYYY-MM-DD-feature-name.mdx
  • Roadmap update - Update website/src/data/roadmap.js with the new milestone

Alternatively: If this change doesn't require release documentation, remove the minor or major label.

@github-actions
Copy link

These changes were released in v1.203.0-rc.2.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

minor New features that do not break anything size/xl Extra large size PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants