{"id":36965317,"url":"https://github.com/dirien/lazy-pulumi","last_synced_at":"2026-02-09T12:18:57.206Z","repository":{"id":326887015,"uuid":"1107062059","full_name":"dirien/lazy-pulumi","owner":"dirien","description":"A terminal UI (TUI) application for Pulumi Cloud","archived":false,"fork":false,"pushed_at":"2026-01-07T22:24:03.000Z","size":280,"stargazers_count":12,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-08T11:15:14.496Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dirien.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-30T14:04:37.000Z","updated_at":"2026-01-07T21:47:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dirien/lazy-pulumi","commit_stats":null,"previous_names":["dirien/lazy-pulumi"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/dirien/lazy-pulumi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dirien%2Flazy-pulumi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dirien%2Flazy-pulumi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dirien%2Flazy-pulumi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dirien%2Flazy-pulumi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dirien","download_url":"https://codeload.github.com/dirien/lazy-pulumi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dirien%2Flazy-pulumi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28398467,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-13T19:57:22.784Z","updated_at":"2026-01-13T19:57:23.453Z","avatar_url":"https://github.com/dirien.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lazy Pulumi\n\nA stylish terminal UI for Pulumi Cloud, ESC, and Neo built with Ratatui.\n\n\u003e [!NOTE]\n\u003e **New in this version:** Neo now supports slash commands! Press `/` in the Neo view to access predefined prompts like `/get-started`, `/component-version-report`, and more. Commands are highlighted in purple and can be combined with custom text.\n\n## Features\n\n- **Dashboard**: Overview of your Pulumi resources with quick stats\n- **Stacks View**: Browse and manage your Pulumi stacks with update history\n- **ESC View**: Manage ESC environments, view definitions, and resolve secrets\n- **Neo Chat**: Interactive chat interface for Pulumi's AI agent with markdown rendering\n- **Platform View**: Browse Services, Components (Registry Packages), and Templates\n- **Organization Selector**: Switch between organizations on-the-fly with `o`\n- **Splash Screen**: Startup checks for token validation and CLI availability\n- **Log Viewer**: Built-in log viewer for debugging with `l`\n\n## Prerequisites\n\n- Rust 1.82+ (uses latest Ratatui)\n- Pulumi Access Token\n- Pulumi CLI (checked on startup)\n\n## Setup\n\nSet your Pulumi access token:\n\n```bash\nexport PULUMI_ACCESS_TOKEN=\"pul-xxxxxxxxxxxx\"\n\n# Optional: Set default organization\nexport PULUMI_ORG=\"your-org-name\"\n\n# Optional: Custom API endpoint (defaults to https://api.pulumi.com)\nexport PULUMI_API_URL=\"https://api.pulumi.com\"\n```\n\n## Installation\n\n### Homebrew (macOS/Linux)\n\n```bash\nbrew tap dirien/dirien\nbrew install lazy-pulumi\n```\n\n### From Source\n\n```bash\n# Build\ncargo build --release\n\n# Run\ncargo run --release\n\n# Run with debug logging\nRUST_LOG=debug cargo run --release\n```\n\n### From Releases\n\nDownload the latest binary from the [GitHub Releases](https://github.com/dirien/lazy-pulumi/releases) page.\n\n## Updating\n\n### Homebrew\n\nTo update to the latest version via Homebrew:\n\n```bash\nbrew update \u0026\u0026 brew upgrade lazy-pulumi\n```\n\nOr update all Homebrew packages including lazy-pulumi:\n\n```bash\nbrew update \u0026\u0026 brew upgrade\n```\n\n## Logging\n\nLogs are written to a file to avoid interfering with the TUI:\n- **Log file location**: `~/.cache/lazy-pulumi/app.log`\n- Press `l` globally to open the log viewer popup\n- Logs are color-coded by level (ERROR=red, WARN=yellow, INFO=blue, DEBUG=muted)\n\n## Keyboard Shortcuts\n\n### Global\n| Key | Action |\n|-----|--------|\n| `Tab` / `Shift+Tab` | Switch between views |\n| `o` | Open organization selector |\n| `l` | Open log viewer |\n| `?` | Toggle help |\n| `q` / `Ctrl+C` | Quit |\n| `r` | Refresh data |\n| `Esc` | Close popup / Cancel |\n\n### Navigation\n| Key | Action |\n|-----|--------|\n| `j` / `↓` | Move down |\n| `k` / `↑` | Move up |\n| `g` / `Home` | First item |\n| `G` / `End` | Last item |\n| `Enter` | Select / Confirm |\n\n### Stacks View\n| Key | Action |\n|-----|--------|\n| `Enter` | View stack details |\n| `u` | View update history |\n\n### ESC View\n| Key | Action |\n|-----|--------|\n| `Enter` | Load environment definition |\n| `O` | Open \u0026 resolve environment values |\n\n### Neo View\n| Key | Action |\n|-----|--------|\n| `n` | Start new task |\n| `i` | Focus input field |\n| `/` | Open slash command picker |\n| `d` | Show task details (in full-width chat mode) |\n| `Enter` | Send message / Load selected task / Insert command |\n| `Tab` | Insert selected command (in picker) |\n| `Esc` | Show task list (exit full-width chat) / Unfocus input / Close picker |\n| `j` / `k` | Scroll chat down/up (3 lines) |\n| `J` / `K` | Scroll chat by page |\n| `g` | Jump to oldest messages |\n| `G` | Jump to newest messages + enable auto-scroll |\n| `Page Up/Down` | Scroll messages |\n| `↑` / `↓` | Navigate command picker |\n\n### Platform View\n| Key | Action |\n|-----|--------|\n| `h` / `←` | Previous sub-tab |\n| `l` / `→` | Next sub-tab |\n| `j` / `k` | Navigate list |\n| `Enter` | Select item |\n\n### Log Viewer\n| Key | Action |\n|-----|--------|\n| `l` / `Esc` | Close logs |\n| `w` | Toggle word wrap |\n| `j` / `↓` | Scroll down 3 lines |\n| `k` / `↑` | Scroll up 3 lines |\n| `J` / `PageDown` | Scroll down by page |\n| `K` / `PageUp` | Scroll up by page |\n| `g` | Jump to top |\n| `G` | Jump to bottom |\n| `R` | Refresh logs |\n\n### Splash Screen\n| Key | Action |\n|-----|--------|\n| `Enter` | Continue (when checks pass) |\n| `Space` | Toggle \"Don't show again\" |\n| `q` | Quit (when checks fail) |\n\n## Architecture\n\nThe application follows **The Elm Architecture (TEA)** pattern for clear separation of concerns.\n\n```\nsrc/\n├── main.rs          # Entry point\n├── app/             # Application core (TEA pattern)\n│   ├── mod.rs       # App struct, new(), run(), render()\n│   ├── types.rs     # Model: Tab, FocusMode, AppState, async result types\n│   ├── handlers.rs  # Update: All keyboard event handlers\n│   ├── data.rs      # Data loading \u0026 refresh logic\n│   └── neo.rs       # Neo AI agent async operations\n├── event.rs         # Event handling (keyboard, mouse)\n├── tui.rs           # Terminal setup/teardown\n├── theme.rs         # Official Pulumi brand colors \u0026 styling\n├── config.rs        # User configuration (splash screen preference)\n├── startup.rs       # Startup validation checks\n├── logging.rs       # File-based logging system\n├── api/             # Pulumi API client\n│   ├── mod.rs\n│   ├── client.rs    # HTTP client\n│   └── types.rs     # Data structures (Stacks, ESC, Neo, Resources, Registry)\n├── components/      # Reusable UI components\n│   ├── mod.rs\n│   ├── input.rs     # Text input field\n│   ├── list.rs      # Stateful list\n│   └── spinner.rs   # Loading spinner\n└── ui/              # View rendering\n    ├── mod.rs\n    ├── dashboard.rs # Overview with stats widgets\n    ├── stacks.rs    # Stack list and update history\n    ├── esc.rs       # ESC environments with YAML/resolved values\n    ├── neo.rs       # Chat interface for Pulumi's AI agent\n    ├── platform.rs  # Services, Components, Templates browser\n    ├── header.rs    # Tab bar with organization display\n    ├── help.rs      # Keyboard shortcut overlay\n    ├── logs.rs      # Log viewer popup\n    ├── splash.rs    # Startup splash screen with checklist\n    └── markdown.rs  # Markdown rendering for Neo messages\n```\n\n## Color Theme\n\nThe UI uses the official Pulumi brand color palette:\n\n| Color | Hex | Usage |\n|-------|-----|-------|\n| **Yellow** | #f7bf2a | Accents, highlights, warnings |\n| **Salmon** | #f26e7e | Errors, failed states |\n| **Fuchsia** | #bd4c85 | Special highlights |\n| **Purple** | #8a3391 | Brand accent |\n| **Violet** | #805ac3 | Primary accent, focused borders |\n| **Blue** | #4d5bd9 | Secondary accent, info states |\n\nAdditional UI colors:\n- **Success**: Green (#48BB78) for passed states\n- **Background**: Dark theme with purple undertones\n\n## Neo Chat Features\n\nThe Neo view provides a rich chat interface for Pulumi's AI agent:\n\n- **Slash Commands**: Press `/` to access predefined prompts (e.g., `/get-started`, `/component-version-report`)\n  - Commands appear in a picker with descriptions\n  - Insert commands with Enter or Tab, then add custom text\n  - Multiple commands can be combined in a single message\n  - Commands are highlighted with purple background in the input\n- **Markdown Rendering**: Bold, italic, code blocks, headers, lists\n- **Auto-scroll**: Automatically scrolls to new messages\n- **Task Details Dialog**: Press `d` to view task metadata including:\n  - Status (idle, running, completed, failed)\n  - Started by (user info)\n  - Linked PRs with state (open/merged/closed)\n  - Involved entities (stacks, environments, repositories)\n  - Active policies\n- **Thinking Indicator**: Animated spinner while Neo is processing\n- **Background Polling**: Updates automatically every few seconds\n\n## Splash Screen\n\nOn startup, the application displays a splash screen with:\n- Pulumi logo (scaled to terminal size)\n- Version information\n- Startup checklist:\n  - PULUMI_ACCESS_TOKEN validation\n  - Pulumi CLI availability check\n- Option to skip splash screen on future launches\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdirien%2Flazy-pulumi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdirien%2Flazy-pulumi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdirien%2Flazy-pulumi/lists"}