Skip to content

Update to support reference architectures#5

Merged
aknysh merged 7 commits intomasterfrom
update-for-reference-architectures
Nov 12, 2020
Merged

Update to support reference architectures#5
aknysh merged 7 commits intomasterfrom
update-for-reference-architectures

Conversation

@aknysh
Copy link
Member

@aknysh aknysh commented Nov 12, 2020

what

  • Update to support reference architectures

why

  • Rename opsctl to atmos
  • Rename projects/ to components/
  • Add vendor CLI for synching reference architecture components
  • Add terraform-backend CLI to generate Terraform S3 backends for Terraform components

@aknysh aknysh requested a review from osterman November 12, 2020 17:08
@aknysh aknysh requested a review from a team as a code owner November 12, 2020 17:08
@aknysh aknysh self-assigned this Nov 12, 2020
@aknysh aknysh merged commit 2f876cc into master Nov 12, 2020
@aknysh aknysh deleted the update-for-reference-architectures branch November 12, 2020 19:11
osterman added a commit that referenced this pull request Oct 6, 2025
Update developer and PRD documentation to reflect the new structured markdown
error formatting with explanations and examples.

## Changes

### Developer Guide (docs/errors.md)

**Error Builder API**:
- Document `WithExplanation()` and `WithExplanationf()` methods
- Document `WithExample()` and `WithExampleFile()` methods
- Add embedded markdown example pattern with `//go:embed`
- Update Quick Start with complete example using all features

**Error Formatting**:
- Add "Structured Markdown Output" section showing 6 sections
- Document section order and conditional rendering
- Provide complete example with all sections
- Update configuration options to reflect context table in all modes

### PRD (docs/prd/atmos-error-handling.md)

**Design Decisions**:
- Update "Builder Pattern for Complex Errors" with new methods
- Add "Structured Markdown Error Presentation" as Decision #5
- Document section hierarchy and visual design rationale
- Provide formatted example output

**Error Categories**:
- Update "Builder-Enhanced Errors" with rich error example
- Show explanations, examples, hints, and context together
- Document use cases for structured error presentation

**Migration Path**:
- Add Phase 6: Structured Markdown Error Formatting (Complete)
- Document all implementation details:
  - New builder methods
  - Formatter refactoring with 6 sections
  - Workflow error conversions
  - Exit code handling updates
  - 21 comprehensive tests
  - Golden snapshot regeneration

All documentation now reflects the complete structured markdown error system.

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

Co-Authored-By: Claude <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 18, 2025
- Fix broken documentation links in blog and update.mdx
  - Change /core-concepts/vendor/vendor-manifest to /vendor/vendor-config
  - Change /core-concepts/vendor to /vendor/vendor-config and /cheatsheets/vendoring
- Document vendor update stub as known limitation with detailed TODOs

Note: Comments #1, #3, #4, #5 were already addressed in previous commits.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 21, 2025
- Fix broken documentation links in blog and update.mdx
  - Change /core-concepts/vendor/vendor-manifest to /vendor/vendor-config
  - Change /core-concepts/vendor to /vendor/vendor-config and /cheatsheets/vendoring
- Document vendor update stub as known limitation with detailed TODOs

Note: Comments #1, #3, #4, #5 were already addressed in previous commits.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 23, 2025
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 26, 2025
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 26, 2025
- Fix broken documentation links in blog and update.mdx
  - Change /core-concepts/vendor/vendor-manifest to /vendor/vendor-config
  - Change /core-concepts/vendor to /vendor/vendor-config and /cheatsheets/vendoring
- Document vendor update stub as known limitation with detailed TODOs

Note: Comments #1, #3, #4, #5 were already addressed in previous commits.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 29, 2025
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 29, 2025
- Fix Comment #3: Parse global flags before InitCliConfig in all auth
  commands by adding BuildConfigAndStacksInfo helper to pkg/flags and
  cmd/auth/helpers.go

- Fix Comment #4: Add guard for empty selectable array in configure.go
  to prevent index out of bounds when no AWS user identities found

- Fix Comment #5: Remove duplicate IdentityFlagName constants by using
  cfg.IdentityFlagName from pkg/config/const.go as canonical source

- Remove unused schema imports from login.go, exec.go, shell.go
- Remove unnecessary nolint:gosec directives from env.go

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 29, 2025
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 30, 2025
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Dec 31, 2025
1. Fix hydration mismatch: Initialize isFullscreen/isMobile to false,
   then set mobile state after mount in useEffect (Comment #1)

2. Fix stale closure in resize handler: Use ref to track current
   fullscreen state instead of closure value (Comment #2)

3. Remove unused import: Remove createPortal from SlideNotesPopout
   (Comment #3)

4. Fix popout window recreation: Remove currentSlide/totalSlides/
   currentNotes from dependency array so window isn't recreated
   on every slide change (Comment #4)

5. Fix XSS vulnerability: Use textContent instead of innerHTML
   when setting notes content in popout window (Comment #5)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
aknysh added a commit that referenced this pull request Jan 1, 2026
…omization (#1925)

* feat: Improve slide deck mobile responsiveness and fullscreen behavior

- Auto-enter fullscreen mode on mobile/tablet devices (touch + width ≤ 1024px)
- Detect device orientation and screen dimensions for responsive behavior
- Remove forced dark mode styling; fullscreen now respects current theme
- Add responsive breakpoints for tablet (996px) and mobile (768px)
- Implement viewport-based scaling for text and images on mobile
- Maintain 2-column split layouts on mobile with scaled content
- Increase z-index to 99999 to prevent navbar overlap in fullscreen
- Improve padding and spacing for mobile screens
- Use clamp() with viewport units (vw) for fluid typography

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* feat: Add responsive scaling for desktop fullscreen mode

- Remove max-width constraint (1600px) on fullscreen slide wrapper
- Use viewport-based sizing to fill entire screen while maintaining 16:9
- Scale slide content width from 800px to 85-90% in fullscreen
- Add clamp() with vw units for text scaling in fullscreen:
  - Titles scale from 2.5rem to 4rem (4vw)
  - Title slides scale from 3.5rem to 5.5rem (5vw)
  - Content/lists scale from 1.25rem to 2rem (2vw)
  - Code scales from 0.9rem to 1.3rem (1.2vw)

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

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

* chore: Increase bomb image width from 180px to 280px

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

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

* fix: Allow vertical scrolling in fullscreen slides for long content

Changes overflow from hidden to overflow-y: auto so YAML code blocks
and other long content can be scrolled within the slide.

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

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

* fix: Make mobile fullscreen fill entire viewport without black borders

Remove 16:9 aspect ratio constraint on mobile so the slide background
extends to fill the entire screen instead of showing black bars.

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

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

* fix: Remove dark borders on mobile fullscreen by making containers transparent

Make all fullscreen containers transparent so the slide's background
extends to fill the entire viewport without visible borders.

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

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

* fix: Restore solid background and visible controls on mobile fullscreen

- Use solid background color instead of transparent to hide page behind
- Add fixed positioning for toolbar at bottom of screen
- Add fixed positioning for nav buttons with semi-transparent background
- Add padding-bottom to slide content to avoid toolbar overlap

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

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

* fix: Hide left-area container in mobile fullscreen mode

The left-area container was taking up space in the flex layout even
though the nav buttons were fixed positioned, causing a dark strip
on the left side of the slide.

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

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

* fix: Improve vertical centering in mobile fullscreen mode

- Changed container align-items from stretch to center
- Added flexbox centering to slide-wrapper
- Changed slide height from 100% to auto with min-height: 100%
- Added explicit flexbox centering to slide element

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

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

* fix: Keep prev navigation button visible in mobile fullscreen

Instead of hiding the left-area container completely (which also hides
the prev button), collapse it to width: 0 but keep overflow: visible
so the fixed-positioned nav button still renders.

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

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

* fix: Ensure vertical centering for content layout slides on mobile

- Changed slide height back to 100% (from auto with min-height)
- Added explicit centering override for content layout slides
- Keep text-align: left for content readability

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

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

* fix: Enable vertical scrolling on mobile fullscreen slides

- Changed slide from flexbox to block display to allow overflow scrolling
- Moved vertical centering to slide__inner using min-height + flexbox
- margin: auto centers content when it's shorter than viewport
- Long content can now scroll properly

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

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

* fix: Use absolute positioning for mobile slide to enable scrolling

- Removed flexbox from slide-wrapper (was preventing scroll)
- Used absolute positioning on slide to fill container
- Slide now has fixed dimensions and can scroll content

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

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

* fix: Use 'justify-content: safe center' for vertical centering with scroll

- Use 'safe center' which centers when content fits, aligns to start when overflow
- Keep flexbox display for proper centering
- Remove conflicting display: block from Slide.css

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

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

* fix: Use margin:auto on slide__inner for vertical centering

- Removed 'justify-content: safe center' (limited browser support)
- Use margin: auto on slide__inner with flex-shrink: 0
- This centers when content is short, scrolls when content overflows

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

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

* fix: Remove top padding from mobile fullscreen slide

Changed padding from '1.5rem 2rem' to '0 2rem' to eliminate the
top offset that was pushing content down.

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

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

* fix: Remove all top padding from mobile fullscreen slides

- Added !important to slide padding override (0 1.5rem)
- Explicitly set margin: auto and padding: 0 on slide__inner

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

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

* fix: Add horizontal padding to slide__inner on mobile fullscreen

Changed padding from 0 to '0 1rem' for left/right spacing.

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

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

* feat: Add customizable speaker notes with position, display mode, and popout options

- Add notes preferences state (position, displayMode, isPopout) to context with localStorage persistence
- Add bottom position for notes panel (Google Slides style) with 25vh height
- Add shrink display mode that resizes slides instead of overlaying
- Add toolbar controls to toggle position, display mode, and popout (desktop only)
- Add popout window component with BroadcastChannel sync for cross-window navigation
- Fix navigation buttons z-index to work when notes overlay is present
- Ensure notes content is scrollable with proper min-height: 0 on flex child

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

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

* refactor: Move notes preference controls to SlideNotesPanel header

Move the position toggle, display mode toggle, and popout button
from the main toolbar into the SlideNotesPanel header. The main
toolbar now only shows a single notes button that toggles notes
or brings them back from popout mode.

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

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

* fix: Add horizontal padding to bottom position speaker notes

The notes content was flush against the left/right edges when in
bottom position. Added 2rem padding to both header and content
for better visual spacing.

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

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

* fix: Extend progress bar to full width in page mode

The progress bar was respecting the container padding, leaving gaps
on the sides. Now uses negative margins to extend edge-to-edge.

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

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

* fix: Address CodeRabbit review comments for SlideDeck

1. Fix hydration mismatch: Initialize isFullscreen/isMobile to false,
   then set mobile state after mount in useEffect (Comment #1)

2. Fix stale closure in resize handler: Use ref to track current
   fullscreen state instead of closure value (Comment #2)

3. Remove unused import: Remove createPortal from SlideNotesPopout
   (Comment #3)

4. Fix popout window recreation: Remove currentSlide/totalSlides/
   currentNotes from dependency array so window isn't recreated
   on every slide change (Comment #4)

5. Fix XSS vulnerability: Use textContent instead of innerHTML
   when setting notes content in popout window (Comment #5)

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

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

* fix: Improve popout window slide state synchronization

- Add refs to track current slide state for immediate popout initialization
- Create updatePopoutContent helper to consolidate DOM update logic
- Immediately update popout content after document.close() to avoid "Loading..." flash
- Add popup=yes to window.open() for better browser compatibility
- Note: Arc browser opens popups as tabs by design, but BroadcastChannel sync still works

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

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

* feat: Add slide-notes-extractor plugin for TTS export

Creates plain text files from SlideNotes content at build time for
OpenAI TTS. Files are output to build/slides/{deck-name}/slide{N}.txt
and sync to S3 with the rest of the build.

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

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

* feat: Add TTS player for speaker notes

Implement a full-featured Text-to-Speech player for slide speaker notes:

- Play/Pause/Stop controls in both toolbar and player bar
- Mute toggle with visual feedback (red icon when muted)
- Voice selector with 6 OpenAI voices (alloy, echo, fable, nova, onyx, shimmer)
- Speed control (0.5x to 2x)
- Progress bar with seek capability
- Auto-advance to next slide when audio completes
- Auto-continue playback when manually navigating slides
- Preferences persistence (voice, speed, mute) in localStorage
- Keyboard shortcuts: P (play/pause), M (mute)

Uses the Cloud Posse TTS API which converts slide notes .txt files
(generated at build time by slide-notes-extractor plugin) to speech.

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

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

* fix: Address security and accessibility review comments

- Fix XSS vulnerability in slide-notes-extractor by using iterative
  tag stripping and removing any remaining < or > characters
- Add keyboard support to TTSPlayer progress bar (ArrowLeft/Right
  for 5s seek, Home/End for start/end)

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

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

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes (attempt 2/3)

* fix: Auto-play TTS continues after slide advance

The TTS auto-play feature was not continuing playback after auto-advancing
to the next slide because the "was playing" state was cleared before the
slide change occurred.

Changed to use a dedicated autoPlayRef that:
- Gets set to true when user starts playing
- Stays true across slide transitions (so next slide auto-plays)
- Gets cleared on pause, stop, or reaching the last slide

Also wired up TTSPlayer callbacks so pause/stop/resume properly
update the auto-play state.

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

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

* fix: Use text extraction approach for HTML sanitization

Changed from iterative tag stripping to text extraction approach
to address CodeQL "incomplete multi-character sanitization" alert.

The new approach:
1. Extracts text content between HTML tags
2. Joins with spaces to preserve word boundaries
3. Removes any stray angle brackets as final cleanup

This avoids the regex replacement pitfall where removing one tag
could leave fragments that combine into new tags.

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

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

* feat: Add 2-second delay between slides during TTS auto-play

When auto-playing speaker notes, there's now a 2-second pause between
slides to give listeners time to absorb the content before the next
slide's audio begins.

The delay is:
- Configurable via AUTO_ADVANCE_DELAY constant (currently 2000ms)
- Cancelled when user pauses or stops playback
- Cleaned up on component unmount

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

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

* refactor: Split TTS auto-advance delay into 1s after + 1s before

Split the 2-second delay between slides into two parts:
- 1 second after the current slide's audio ends
- 1 second before the next slide's audio starts

This provides a more balanced pause that gives time for both
the current slide to sink in and for the visual transition
to the next slide before audio begins.

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

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

* refactor: Rename TTS delay constants for clarity

Rename AUTO_ADVANCE_DELAY_AFTER/BEFORE to AUTO_ADVANCE_DELAY and
AUTO_PLAY_DELAY for clearer semantics:
- AUTO_ADVANCE_DELAY: delay before advancing to next slide
- AUTO_PLAY_DELAY: delay before starting audio on new slide

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

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

* fix: Keep TTS player bar visible during slide transitions

Add isAutoPlaying state to track auto-play mode for UI updates.
Previously, the TTSPlayer bar would disappear during the 1-second
delay between slides because neither isPlaying nor isPaused was true.

Now the bar stays visible when navigating via the drawer or during
auto-advance transitions.

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

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

* fix: Show loading spinner during TTS slide transitions

The play button now shows a loading spinner during the delay between
slides when in auto-play mode. Previously it would briefly show the
play icon which was jarring.

Changes:
- Always show the TTS button (not conditional on currentNotes)
- Show spinner when isAutoPlaying but not yet playing/paused
- Button stays active during auto-play transitions

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

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

* fix: Reuse Audio element for iOS autoplay compatibility

iOS Safari blocks audio playback that isn't directly triggered by user
interaction. Creating a new Audio() element for each slide broke the
user-activation chain, causing "request is not allowed by the user agent"
errors on mobile.

Fix: Reuse a single persistent Audio element and update its src property
instead of creating new elements. This preserves the user-activation
state established on the first tap.

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

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

* feat: Prefetch TTS audio in parallel with delay

Start the TTS API call immediately when a slide changes, running it in
parallel with the AUTO_PLAY_DELAY. This way the delay is:
  max(delay, api_call_time)
instead of:
  delay + api_call_time

Added prefetch() function to useTTS that returns a playPrefetched()
function, allowing the fetch and delay to run concurrently.

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

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

* feat: Prefetch next slide audio while current slide plays

Add background prefetching of n+1 slide audio to eliminate API latency
between slides during auto-play.

Changes:
- Add prefetch cache (Map keyed by slide+voice)
- Add prefetchInBackground() for silent background fetching
- Update play() and prefetch() to check cache first
- Trigger background prefetch when audio starts playing

Now while slide N plays, slide N+1 audio is fetched in parallel. When
advancing, the cached audio is used immediately.

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

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

* fix: Handle unhandled promise rejection in TTS resume

The resume callback was calling audio.play() without handling the
returned Promise, which could lead to unhandled rejections when
autoplay is blocked or other playback errors occur.

Now properly chains .then/.catch to update state appropriately on
success or failure.

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

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

* fix: Improve mobile portrait fullscreen layout for slides

Address issues in mobile Safari portrait mode:
- Use dvh units to account for dynamic browser UI (URL bar)
- Add safe-area-inset padding for notched devices
- Reduce font sizes for narrow portrait viewports
- Stack split layouts vertically in portrait
- Align content to top instead of center to prevent overlap

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

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

* fix: Center slide content vertically in mobile portrait mode

Reverted to centered vertical alignment for slides in portrait mode.
The previous top-alignment looked unbalanced for shorter content.
Content will scroll if it overflows.

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

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

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Andriy Knysh <aknysh@users.noreply.github.com>
osterman added a commit that referenced this pull request Jan 2, 2026
- cmd/auth/shell.go: Use envpkg.MergeGlobalEnv() for consistency with exec.go
  (addresses CodeRabbit comment #3 about env merging inconsistency)

- cmd/auth/whoami.go: Use %w for error wrapping to preserve error chain
  (addresses CodeRabbit comment #4 about error wrapping)

- tests/cli_describe_component_test.go: Use cross-platform TTY detection
  with term.IsTTYSupportForStdout() and close file handle properly
  (addresses CodeRabbit comments #5, #6)

- tests/describe_test.go: Add skipIfNoTTY helper with cross-platform
  TTY detection and proper file handle cleanup
  (addresses CodeRabbit comments #7, #8)

Note: Comments #1 and #2 (codeql clear-text logging) are false positives -
the atmos auth env command intentionally outputs credentials for shell
sourcing, similar to `aws configure export-credentials`. Suppression
comments are already in place.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 3, 2026
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 4, 2026
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 4, 2026
- Fix Comment #3: Parse global flags before InitCliConfig in all auth
  commands by adding BuildConfigAndStacksInfo helper to pkg/flags and
  cmd/auth/helpers.go

- Fix Comment #4: Add guard for empty selectable array in configure.go
  to prevent index out of bounds when no AWS user identities found

- Fix Comment #5: Remove duplicate IdentityFlagName constants by using
  cfg.IdentityFlagName from pkg/config/const.go as canonical source

- Remove unused schema imports from login.go, exec.go, shell.go
- Remove unnecessary nolint:gosec directives from env.go

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 4, 2026
- cmd/auth/shell.go: Use envpkg.MergeGlobalEnv() for consistency with exec.go
  (addresses CodeRabbit comment #3 about env merging inconsistency)

- cmd/auth/whoami.go: Use %w for error wrapping to preserve error chain
  (addresses CodeRabbit comment #4 about error wrapping)

- tests/cli_describe_component_test.go: Use cross-platform TTY detection
  with term.IsTTYSupportForStdout() and close file handle properly
  (addresses CodeRabbit comments #5, #6)

- tests/describe_test.go: Add skipIfNoTTY helper with cross-platform
  TTY detection and proper file handle cleanup
  (addresses CodeRabbit comments #7, #8)

Note: Comments #1 and #2 (codeql clear-text logging) are false positives -
the atmos auth env command intentionally outputs credentials for shell
sourcing, similar to `aws configure export-credentials`. Suppression
comments are already in place.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 5, 2026
- Fix Comment #3: Parse global flags before InitCliConfig in all auth
  commands by adding BuildConfigAndStacksInfo helper to pkg/flags and
  cmd/auth/helpers.go

- Fix Comment #4: Add guard for empty selectable array in configure.go
  to prevent index out of bounds when no AWS user identities found

- Fix Comment #5: Remove duplicate IdentityFlagName constants by using
  cfg.IdentityFlagName from pkg/config/const.go as canonical source

- Remove unused schema imports from login.go, exec.go, shell.go
- Remove unnecessary nolint:gosec directives from env.go

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 5, 2026
- cmd/auth/shell.go: Use envpkg.MergeGlobalEnv() for consistency with exec.go
  (addresses CodeRabbit comment #3 about env merging inconsistency)

- cmd/auth/whoami.go: Use %w for error wrapping to preserve error chain
  (addresses CodeRabbit comment #4 about error wrapping)

- tests/cli_describe_component_test.go: Use cross-platform TTY detection
  with term.IsTTYSupportForStdout() and close file handle properly
  (addresses CodeRabbit comments #5, #6)

- tests/describe_test.go: Add skipIfNoTTY helper with cross-platform
  TTY detection and proper file handle cleanup
  (addresses CodeRabbit comments #7, #8)

Note: Comments #1 and #2 (codeql clear-text logging) are false positives -
the atmos auth env command intentionally outputs credentials for shell
sourcing, similar to `aws configure export-credentials`. Suppression
comments are already in place.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 23, 2026
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 23, 2026
1. delete.go: Require --force flag for deletion (returns error instead
   of silently exiting), using static error ErrPlanfileDeleteRequireForce
2. list.go: Add global flag parsing (--base-path, --config, etc.)
3. show.go: Add global flag parsing (--base-path, --config, etc.)
4. check.go: Add Name field to UpdateCheckRunOptions (distinct from Title)
5. checks.go: Use opts.Name instead of opts.Title for GitHub API

Note: Comment #5 about template field access was investigated and found
to be a false positive. The templates correctly access fields from
TerraformTemplateContext which provides .Resources, .HasChanges() etc.
at the top level (not under .Result).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 30, 2026
- Use filepath.Join for OS-safe test paths (Comments #1, #6)
- Route FileCache operations through injected FileSystem interface (Comment #2)
- Add ErrCacheFetch sentinel and wrap fetch() errors (Comment #3)
- Fix misleading "log" comment in GetOrFetch (Comment #4)
- Add missing BrowserSessionWarningShown assertion (Comment #5)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
osterman added a commit that referenced this pull request Jan 30, 2026
- Use filepath.Join for OS-safe test paths (Comments #1, #6)
- Route FileCache operations through injected FileSystem interface (Comment #2)
- Add ErrCacheFetch sentinel and wrap fetch() errors (Comment #3)
- Fix misleading "log" comment in GetOrFetch (Comment #4)
- Add missing BrowserSessionWarningShown assertion (Comment #5)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Benbentwo added a commit that referenced this pull request Feb 23, 2026
- Update security note #5 to reflect deterministic identity binding
  via --identity flag (no longer "ambient AWS credentials")
- Fix diagram: "STS GetCallerID" → "GetCallerIdentity"
- Clarify that auth subcommands use authCmd.AddCommand(), not
  CommandProvider (which is for top-level commands only)
- Distinguish existing --role-arn flag (generation-time) from future
  exec plugin role assumption (runtime) in Future Enhancements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Benbentwo added a commit that referenced this pull request Mar 4, 2026
* docs: Add EKS kubeconfig authentication integration PRD

This PRD defines the design for integrating EKS kubeconfig generation into Atmos's
authentication system via the integration pattern. EKS kubeconfig generation will be
automatic on identity login and available via `atmos auth eks-kubeconfig` command.

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* docs: Update EKS PRD based on review feedback

Changes based on PR review:
- Use `atmos aws eks update-kubeconfig` instead of `atmos auth eks-kubeconfig`
- Update kubeconfig schema to use nested structure with path/mode/update fields
- Simplify KUBECONFIG env var example to use `atmos auth env --format=export`
- Add note clarifying exec credential plugin is standard AWS CLI format

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* docs: Sync EKS kubeconfig PRD with current codebase

Align the PRD with the actual integration infrastructure after
rebasing onto main. Fixes incorrect interface definition, method
names, file paths, and dependency status.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Use atmos as exec credential plugin, simplify XDG path

Replace `aws eks get-token` with `atmos auth eks-token` as the
kubeconfig exec credential plugin, eliminating the AWS CLI dependency.
Simplify XDG path usage to call GetXDGConfigDir directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Update architecture diagram to show kubectl exec flow

Add the kubectl-time exec flow showing atmos auth eks-token
being invoked by kubectl to generate bearer tokens via STS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Add identity resolution, KUBECONFIG append, Mode parsing to EKS PRD

- Add --identity flag and interactiveMode: Never to exec plugin spec
  for deterministic credential selection with multiple identities
- Specify KUBECONFIG colon-separated append semantics (idempotent)
- Fix eks-token command path to cmd/auth_eks_token.go matching existing
  auth subcommand pattern (not CommandProvider)
- Specify KubeconfigSettings.Mode octal parsing via strconv.ParseUint
- Replace custom MergeKubeconfig with k8s.io/client-go/tools/clientcmd

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Fix security note, diagram label, Role ARN scope in EKS PRD

- Update security note #5 to reflect deterministic identity binding
  via --identity flag (no longer "ambient AWS credentials")
- Fix diagram: "STS GetCallerID" → "GetCallerIdentity"
- Clarify that auth subcommands use authCmd.AddCommand(), not
  CommandProvider (which is for top-level commands only)
- Distinguish existing --role-arn flag (generation-time) from future
  exec plugin role assumption (runtime) in Future Enhancements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Sync EKS PRD with current codebase

- Add validation spec for KubeconfigSettings.Update (reject invalid
  values at config-load time, default "merge")
- Add k8s.io/client-go and PR #1903 to Dependencies section
- Fix `atmos auth env --format=export` to `atmos auth env` (bash is
  the default; "export" is not a valid format)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Rewrite EKS PRD intro, add Terraform provider documentation

Rewrite the executive summary and problem statement to better frame
the motivation: Atmos already manages cloud auth, so extending to
Kubernetes config is a natural next step. Add Terraform Kubernetes
provider section showing kubeconfig-based and exec-based approaches.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Clarify exec plugin mechanism in Terraform provider section

Explain that the kubeconfig's exec spec contains `command: atmos`
which the Terraform provider invokes on demand for token refresh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: Add integration lifecycle, env var composition, and flag docs to EKS PRD

- Show --identity and --profile flags in Desired Workflow examples
- Extend Integration interface with Cleanup() and Environment() methods
- Add Integration Cleanup on Logout section (logout undoes login effects)
- Add Integration Environment Variables section with composition strategy
  for multi-integration scenarios (blue/green clusters, mixed EKS+ECR)
- Update CLI command flags with env var bindings and flag disambiguation
- Replace kubeconfig cleanup future enhancement with CI/CD workflow item
- Add test cases for cleanup, environment composition, and logout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants