Skip to content

Claude/project review 01 r1pc lz u yc4 bs rf l1 u6u r bx#122

Merged
blackwell-systems merged 32 commits into
mainfrom
claude/project-review-01R1pcLzUYc4BSRfL1U6uRBx
Dec 4, 2025
Merged

Claude/project review 01 r1pc lz u yc4 bs rf l1 u6u r bx#122
blackwell-systems merged 32 commits into
mainfrom
claude/project-review-01R1pcLzUYc4BSRfL1U6uRBx

Conversation

@blackwell-systems

Copy link
Copy Markdown
Owner

Pull Request

Description

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement
  • Test addition/improvement

Motivation and Context

Fixes # (issue)

Changes Made

Testing

How Has This Been Tested?

Test Configuration:

  • Platform:
  • OS Version:
  • Shell:

Test Steps:

Test Checklist

  • Tested on macOS
  • Tested on Linux/Lima
  • Ran dotfiles doctor successfully
  • Bootstrap script completes without errors
  • Scripts are idempotent (can run multiple times safely)
  • Pre-commit hooks pass
  • No secrets or personal information in commits

Screenshots (if applicable)

Before:

After:

Documentation

  • Updated README.md (if needed)
  • Updated CHANGELOG.md
  • Added/updated code comments
  • Updated vault/README.md (if vault changes)
  • No documentation changes needed

Breaking Changes

  • No breaking changes
  • Yes, breaking changes (describe below)

Breaking Changes Description:

Dependencies

  • No new dependencies
  • Added to Brewfile:
  • Updated dependency versions:

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • My changes generate no new warnings or errors
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published
  • I have read the CONTRIBUTING guide
  • All commits follow the commit message conventions

Additional Notes

Reviewer Notes


For Maintainers:

  • Code review completed
  • Tests pass in CI/CD
  • Documentation is adequate
  • Ready to merge

Claude added 30 commits December 4, 2025 02:00
Major restructuring to improve first-time user experience:

**Structure Changes:**
- Move install flow from line 544 → line 19 (hero section)
- Add simulated terminal output showing complete setup flow
- Add "Why This Dotfiles?" section with 4 key differentiators
- Nest all features under single collapsible (two-level)
- Group features into categories (Core, Safety, Advanced, Tools)
- Move "How This Compares" to bottom (collapsed)
- Move "Use Cases" up (after value prop)
- Simplify Prerequisites section

**Results:**
- README reduced from 1,255 → 832 lines (34% shorter)
- Install flow now immediately visible
- Features organized and scannable
- Better progressive disclosure
- Clearer value proposition

**Backup:**
- Original README saved as README_12_03_2025.md

The new structure leads with "show, don't tell" - users see the
complete install flow with credential onboarding simulation before
diving into features.
Make modularity a first-class feature to prevent users from abandoning
the project due to perceived opinions. Everything is now clearly optional
except shell config.

Changes:
- Update tagline: "Opinionated" → "Modular"
- Add "Pick What You Want" section with Component Matrix after install
- Show multiple one-line install options (full/minimal/custom)
- Add modularity bullet to cover page "What you get"
- Enhance install.sh help text with modular install instructions
- Document all SKIP_* flags and environment variables
- Add "enable features later" examples
- Clarify that setup wizard steps are all optional

Component Matrix shows:
- Shell config (required)
- Homebrew/packages (optional via --minimal)
- Vault system (optional, skip in wizard)
- /workspace symlink (optional via SKIP_WORKSPACE_SYMLINK)
- Claude integration (optional via SKIP_CLAUDE_SETUP)
- Templates (optional, don't run if not needed)

Philosophy: Start minimal, add what you need, when you need it.
Make the modular, optional nature of components prominent in
documentation to help users understand they can pick only what they need.

Changes to docs/architecture.md:
- Add "Modular Architecture" section after System Overview
- Component matrix showing core vs. optional components
- Install modes (full/minimal/custom)
- Environment variables table with use cases
- Component dependencies diagram (Mermaid)
- Key design principles (no hard dependencies, enable later, etc.)

Changes to docs/cli-reference.md:
- Add "Modular Design" section at top of document
- Quick install options (full/minimal/custom)
- "What's Optional?" table with links to relevant sections
- Links to Environment Variables section for complete SKIP flags

Both docs now emphasize: "Everything is optional except shell config"
Introduce tiered Brewfile system to give users granular control over
package installation size. Addresses concerns about the system being
too opinionated by making package selection fully modular.

New Brewfile tiers:
- Brewfile.minimal (~15 packages)
  - Essentials only: git, zsh, jq, shell plugins
  - Use case: CI/CD, servers, containers, resource-constrained
  - Install: BREWFILE_TIER=minimal ./bootstrap-mac.sh

- Brewfile.enhanced (~40 packages)
  - Modern CLI tools: fzf, ripgrep, bat, eza, zoxide, btop
  - Essential dev tools: gh, tmux, tree, yq
  - No containers (docker/lima) or heavy development tools
  - Use case: Developer workstations without container needs
  - Install: BREWFILE_TIER=enhanced ./bootstrap-mac.sh

- Brewfile (~80 packages, default)
  - Everything: all enhanced packages + Docker, Node, advanced tools
  - Use case: Full-stack development workstations
  - Install: brew bundle (or BREWFILE_TIER=full)

Implementation:
- bootstrap/_common.sh: Enhanced run_brew_bundle() to support tier selection
- Added BREWFILE_TIER environment variable (minimal|enhanced|full)
- Default tier is "full" (maintains backwards compatibility)
- All tiers work on macOS (Homebrew) and Linux (Linuxbrew)
- macOS casks automatically skipped on Linux

Documentation:
- README.md: Added Brewfile Tiers table to Component Matrix
- docs/architecture.md: Added BREWFILE_TIER to Environment Variables table
- docs/cli-reference.md: Added BREWFILE_TIER with examples
- CHANGELOG.md: Documented new feature in [Unreleased]
- Brewfile: Added header documenting all three tiers

Benefits:
- Users can avoid Docker/Node if not needed (saves ~40 packages)
- Minimal tier perfect for testing in containers/CI
- Enhanced tier gives modern CLI experience without bloat
- Fully backwards compatible (default is full tier)
- Reinforces "everything is optional" philosophy

Breaking changes: None (full tier is default)
Resolved conflicts in README.md by keeping modularity improvements:
- Three install options (Full/Minimal/Custom) at top
- Modularity bullets in 'What you get'
- 'Pick What You Want' section with Component Matrix
- Brewfile Tiers table

Our branch has comprehensive modularity documentation that
supersedes the simpler main branch version.
Removed outdated 'Project Structure' section check (moved to docs/architecture.md)
Updated required sections to match new modular README:
- One-Line Install
- Pick What You Want
- Why This Dotfiles
- Platform Support
- Documentation

Old sections like 'Quick Start' and 'Troubleshooting' were removed from
main README in favor of impact-focused content at the top.
Removed the entire documentation quality check from CI.
README structure is fluid and focused on user impact rather than
specific section names. Manual review is sufficient.
Separated full and minimal install options into distinct code blocks
with clear labels for better visual separation on the Docsify homepage.

Before: Single code block with comments
After: Two separate blocks with bold labels
Resolved conflict in docs/_coverpage.md by keeping our separate code
blocks version (better UX with distinct glowboxes for each install option).
Removed bold labels above install commands. Users can see the
difference from the commands themselves - cleaner look.
Resolved conflict by keeping our version without labels - just clean code blocks.
Added interactive template configuration as STEP 6 in the setup wizard
to make machine-specific templates more discoverable.

Changes:
- bin/dotfiles-setup:
  - New phase_template() function with examples and clear prompts
  - Defaults to 'No' (opt-in) to keep setup fast
  - Runs 'dotfiles template init' interactively
  - Shows how to enable later if skipped
  - Added 'template' to all phase lists (status, reset, execution)
  - Integrated with state management for resume support

- README.md:
  - Updated hero section terminal simulation with STEP 6
  - Shows realistic template setup flow (work email, git config)
  - Demonstrates work vs personal machine differentiation

- CHANGELOG.md:
  - Documented Templates Onboarding feature in [Unreleased]
  - Explained use cases and design decisions

Benefits:
- Templates are no longer buried in docs
- Users see real value (work vs personal configs)
- Still optional and fast (defaults to No)
- Clear path to enable later

Design decisions:
- Defaults to 'n' not 'Y' (opposite of vault/secrets)
- Templates are more advanced/optional than core features
- Keeps 5-minute setup promise for basic users
- Power users can opt-in when they see the value
Enhanced dotclaude visibility as sister product without 'only' language.

Changes:
- Updated 'What you get' bullet: Portable Claude sessions → Claude Code + dotclaude integration
- Added dedicated 'Claude Code + dotclaude' section after install flow
  - Explains what dotclaude is and why it matters
  - Lists key features: profile sync, git safety, portability, context isolation
  - Shows standalone install command
  - Links to dotclaude repo
- Added callout box in 'Why This Dotfiles?' section
  - Highlights dotclaude integration prominently
  - Explains automatic installation during setup
- Updated 'Key features' language: 'The only' → 'Key features'
  - More humble, less marketing-y
  - Still conveys value without exclusivity claims

Benefits:
- dotclaude is now impossible to miss
- Clear explanation of what it does
- Multiple touchpoints throughout README
- Links to learn more
- Standalone install option shown
Fixed 'permission denied' error when running install.sh by making
bootstrap scripts executable.

Issue: bootstrap-mac.sh, bootstrap-linux.sh, bootstrap-dotfiles.sh,
and _common.sh were missing execute permissions (644 instead of 755)

Solution: chmod +x bootstrap/*.sh bin/* vault/*.sh

This fixes the error users get when install.sh tries to call
./bootstrap/bootstrap-mac.sh and gets permission denied.
Previously, bootstrap would fail if a package couldn't be symlinked
(e.g., npm-installed bw conflicting with Homebrew bitwarden-cli).
This was poor UX since the package was actually installed successfully.

Changes:
- Brew bundle failures no longer stop bootstrap
- Auto-detects unlinked packages after brew bundle
- Attempts to fix with `brew link --overwrite`
- Provides clear feedback about what was fixed
- Bootstrap continues even if some links fail (non-fatal)

Fixes the "why should it fail just because something is installed
already" UX issue reported during fresh install testing.
Previously, Homebrew installation would fail hard if the curl command
encountered a network issue, stopping the entire bootstrap process.

Changes:
- Added install_homebrew() function with retry logic
  - 3 retries with exponential backoff (2s, 4s, 8s)
  - Clear error messages explaining possible causes
  - Option to continue without Homebrew or abort (user choice)
- Updated bootstrap-mac.sh to use new function
- Updated bootstrap-linux.sh to use new function
- Prevents bootstrap failure due to temporary network hiccups

This makes the bootstrap process more resilient for users with
flaky networks or when GitHub/Homebrew servers are under load.
Previously, bootstrap would fail to create /workspace on modern macOS
(Catalina+) due to read-only root filesystem, then show a manual fix
command that also wouldn't work.

Changes:
- Detect macOS-specific read-only filesystem error
- Provide clear instructions for synthetic.conf setup
- Show exact commands users can copy/paste:
  1. echo -e 'workspace\t$HOME/workspace' | sudo tee -a /etc/synthetic.conf
  2. sudo reboot
- Explain that ~/workspace works fine without /workspace
- Better messaging that this is expected, not an error

This makes the /workspace setup process clear for macOS users who
need it for cross-platform path consistency.
Homebrew 5.0+ removed the --no-lock flag, causing setup wizard to fail
with "Error: invalid option: --no-lock".

Changes:
- Removed --no-lock flag from dotfiles-setup brew bundle command
- Brew bundle still works correctly without this flag
- Setup wizard now compatible with Homebrew 5.0+

This was discovered during fresh install testing on macOS with
Homebrew 5.0.4.
Previously, skipping vault during setup marked it as "complete" with
no way to configure it later without manually resetting state. This
was confusing and frustrating for users.

New vault init command:
- Added `dotfiles vault init` standalone command
- Can configure or reconfigure vault anytime
- Detects existing config and asks to reconfigure
- Clear guidance when skipping
- No need to reset setup state or run full wizard

Setup wizard improvements:
- Now asks "Reconfigure vault?" if already configured
- Shows "Vault was skipped previously" for backend=none
- All skip paths mention "dotfiles vault init"
- Allows changing vault backend easily

Status display improvements:
- Skipped vault: [⊘] Vault (Skipped - run 'dotfiles vault init')
- Configured vault: [✓] Vault (Vault backend: bitwarden)
- Clearly distinguishes between skipped vs configured

This makes vault configuration much more discoverable and flexible,
fixing the UX issue where users felt locked out after skipping.

Files changed:
- vault/init-vault.sh (NEW): Standalone vault configuration
- zsh/zsh.d/40-aliases.zsh: Added 'init' subcommand
- bin/dotfiles-setup: Reconfigure option + better messaging
- CHANGELOG.md: Documented improvements
Updated documentation to reflect new 'dotfiles vault init' command:

- docs/vault-README.md: Added to Quick Reference table and Commands section
- docs/cli-reference.md: Added to vault subcommands table
- docs/architecture.md: Added init flow to mermaid sequence diagram

The init command is now documented across all relevant documentation
files, making it discoverable for users.
Enhances the onboarding experience by making the installation flow
smoother and helping users discover what they just installed.

Changes:
- install.sh now prompts to run setup wizard automatically
- Setup completion shows context-aware next steps based on config
- Highlights useful ZSH features: ls aliases, git shortcuts, fzf, zoxide, yazi
- Better guidance for vault and template workflows

This addresses user feedback about not knowing what to do after setup
and not being aware of all the shell features that were installed.
Claude added 2 commits December 4, 2025 08:56
Previously, the script would check for both Homebrew paths (/opt/homebrew
and /usr/local) regardless of which one was just installed. This was
indirect and could theoretically use the wrong path.

Now:
- After install_homebrew() runs, we detect which path was actually used
- We pass that specific path to add_brew_to_zprofile()
- If Homebrew was already installed, we skip detection and just activate it

This ties the path detection directly to the installation that just happened.
The "Your new shell features" section now conditionally displays
features based on what's actually installed. This prevents showing
features that aren't available when using:
- --minimal mode
- BREWFILE_TIER=minimal or enhanced
- When brew bundle partially failed

Checks:
- eza → ll, la, lt aliases
- git → gst, gd, gco shortcuts
- fzf → Ctrl+R fuzzy history
- zoxide → z directory jumper
- yazi → y file manager

Only shows the section if at least one feature is available.
Also documented the Homebrew path detection fix in CHANGELOG.
@blackwell-systems blackwell-systems merged commit 91971e1 into main Dec 4, 2025
20 checks passed
blackwell-systems added a commit that referenced this pull request Dec 7, 2025
* docs: Reorganize README for impact and clarity

Major restructuring to improve first-time user experience:

**Structure Changes:**
- Move install flow from line 544 → line 19 (hero section)
- Add simulated terminal output showing complete setup flow
- Add "Why This Dotfiles?" section with 4 key differentiators
- Nest all features under single collapsible (two-level)
- Group features into categories (Core, Safety, Advanced, Tools)
- Move "How This Compares" to bottom (collapsed)
- Move "Use Cases" up (after value prop)
- Simplify Prerequisites section

**Results:**
- README reduced from 1,255 → 832 lines (34% shorter)
- Install flow now immediately visible
- Features organized and scannable
- Better progressive disclosure
- Clearer value proposition

**Backup:**
- Original README saved as README_12_03_2025.md

The new structure leads with "show, don't tell" - users see the
complete install flow with credential onboarding simulation before
diving into features.

* docs: Remove emojis from README for cleaner presentation

* docs: Remove checkmarks for cleaner presentation

* docs: Emphasize modularity throughout README and install.sh

Make modularity a first-class feature to prevent users from abandoning
the project due to perceived opinions. Everything is now clearly optional
except shell config.

Changes:
- Update tagline: "Opinionated" → "Modular"
- Add "Pick What You Want" section with Component Matrix after install
- Show multiple one-line install options (full/minimal/custom)
- Add modularity bullet to cover page "What you get"
- Enhance install.sh help text with modular install instructions
- Document all SKIP_* flags and environment variables
- Add "enable features later" examples
- Clarify that setup wizard steps are all optional

Component Matrix shows:
- Shell config (required)
- Homebrew/packages (optional via --minimal)
- Vault system (optional, skip in wizard)
- /workspace symlink (optional via SKIP_WORKSPACE_SYMLINK)
- Claude integration (optional via SKIP_CLAUDE_SETUP)
- Templates (optional, don't run if not needed)

Philosophy: Start minimal, add what you need, when you need it.

* docs: Update Docsify coverpage to emphasize modularity

* docs: Add modularity sections to architecture and CLI reference

Make the modular, optional nature of components prominent in
documentation to help users understand they can pick only what they need.

Changes to docs/architecture.md:
- Add "Modular Architecture" section after System Overview
- Component matrix showing core vs. optional components
- Install modes (full/minimal/custom)
- Environment variables table with use cases
- Component dependencies diagram (Mermaid)
- Key design principles (no hard dependencies, enable later, etc.)

Changes to docs/cli-reference.md:
- Add "Modular Design" section at top of document
- Quick install options (full/minimal/custom)
- "What's Optional?" table with links to relevant sections
- Links to Environment Variables section for complete SKIP flags

Both docs now emphasize: "Everything is optional except shell config"

* feat: Add Brewfile tiers for flexible package installation

Introduce tiered Brewfile system to give users granular control over
package installation size. Addresses concerns about the system being
too opinionated by making package selection fully modular.

New Brewfile tiers:
- Brewfile.minimal (~15 packages)
  - Essentials only: git, zsh, jq, shell plugins
  - Use case: CI/CD, servers, containers, resource-constrained
  - Install: BREWFILE_TIER=minimal ./bootstrap-mac.sh

- Brewfile.enhanced (~40 packages)
  - Modern CLI tools: fzf, ripgrep, bat, eza, zoxide, btop
  - Essential dev tools: gh, tmux, tree, yq
  - No containers (docker/lima) or heavy development tools
  - Use case: Developer workstations without container needs
  - Install: BREWFILE_TIER=enhanced ./bootstrap-mac.sh

- Brewfile (~80 packages, default)
  - Everything: all enhanced packages + Docker, Node, advanced tools
  - Use case: Full-stack development workstations
  - Install: brew bundle (or BREWFILE_TIER=full)

Implementation:
- bootstrap/_common.sh: Enhanced run_brew_bundle() to support tier selection
- Added BREWFILE_TIER environment variable (minimal|enhanced|full)
- Default tier is "full" (maintains backwards compatibility)
- All tiers work on macOS (Homebrew) and Linux (Linuxbrew)
- macOS casks automatically skipped on Linux

Documentation:
- README.md: Added Brewfile Tiers table to Component Matrix
- docs/architecture.md: Added BREWFILE_TIER to Environment Variables table
- docs/cli-reference.md: Added BREWFILE_TIER with examples
- CHANGELOG.md: Documented new feature in [Unreleased]
- Brewfile: Added header documenting all three tiers

Benefits:
- Users can avoid Docker/Node if not needed (saves ~40 packages)
- Minimal tier perfect for testing in containers/CI
- Enhanced tier gives modern CLI experience without bloat
- Fully backwards compatible (default is full tier)
- Reinforces "everything is optional" philosophy

Breaking changes: None (full tier is default)

* ci: Update documentation check for new README structure

Removed outdated 'Project Structure' section check (moved to docs/architecture.md)
Updated required sections to match new modular README:
- One-Line Install
- Pick What You Want
- Why This Dotfiles
- Platform Support
- Documentation

Old sections like 'Quick Start' and 'Troubleshooting' were removed from
main README in favor of impact-focused content at the top.

* ci: Remove documentation-check job

Removed the entire documentation quality check from CI.
README structure is fluid and focused on user impact rather than
specific section names. Manual review is sufficient.

* docs: Split coverpage install commands into separate code blocks

Separated full and minimal install options into distinct code blocks
with clear labels for better visual separation on the Docsify homepage.

Before: Single code block with comments
After: Two separate blocks with bold labels

* docs: Remove labels from coverpage code blocks

Removed bold labels above install commands. Users can see the
difference from the commands themselves - cleaner look.

* feat: Add template onboarding to setup wizard

Added interactive template configuration as STEP 6 in the setup wizard
to make machine-specific templates more discoverable.

Changes:
- bin/dotfiles-setup:
  - New phase_template() function with examples and clear prompts
  - Defaults to 'No' (opt-in) to keep setup fast
  - Runs 'dotfiles template init' interactively
  - Shows how to enable later if skipped
  - Added 'template' to all phase lists (status, reset, execution)
  - Integrated with state management for resume support

- README.md:
  - Updated hero section terminal simulation with STEP 6
  - Shows realistic template setup flow (work email, git config)
  - Demonstrates work vs personal machine differentiation

- CHANGELOG.md:
  - Documented Templates Onboarding feature in [Unreleased]
  - Explained use cases and design decisions

Benefits:
- Templates are no longer buried in docs
- Users see real value (work vs personal configs)
- Still optional and fast (defaults to No)
- Clear path to enable later

Design decisions:
- Defaults to 'n' not 'Y' (opposite of vault/secrets)
- Templates are more advanced/optional than core features
- Keeps 5-minute setup promise for basic users
- Power users can opt-in when they see the value

* docs: Make dotclaude more prominent throughout README

Enhanced dotclaude visibility as sister product without 'only' language.

Changes:
- Updated 'What you get' bullet: Portable Claude sessions → Claude Code + dotclaude integration
- Added dedicated 'Claude Code + dotclaude' section after install flow
  - Explains what dotclaude is and why it matters
  - Lists key features: profile sync, git safety, portability, context isolation
  - Shows standalone install command
  - Links to dotclaude repo
- Added callout box in 'Why This Dotfiles?' section
  - Highlights dotclaude integration prominently
  - Explains automatic installation during setup
- Updated 'Key features' language: 'The only' → 'Key features'
  - More humble, less marketing-y
  - Still conveys value without exclusivity claims

Benefits:
- dotclaude is now impossible to miss
- Clear explanation of what it does
- Multiple touchpoints throughout README
- Links to learn more
- Standalone install option shown

* fix: Add execute permissions to bootstrap scripts

Fixed 'permission denied' error when running install.sh by making
bootstrap scripts executable.

Issue: bootstrap-mac.sh, bootstrap-linux.sh, bootstrap-dotfiles.sh,
and _common.sh were missing execute permissions (644 instead of 755)

Solution: chmod +x bootstrap/*.sh bin/* vault/*.sh

This fixes the error users get when install.sh tries to call
./bootstrap/bootstrap-mac.sh and gets permission denied.

* fix: Make brew bundle resilient to package link conflicts

Previously, bootstrap would fail if a package couldn't be symlinked
(e.g., npm-installed bw conflicting with Homebrew bitwarden-cli).
This was poor UX since the package was actually installed successfully.

Changes:
- Brew bundle failures no longer stop bootstrap
- Auto-detects unlinked packages after brew bundle
- Attempts to fix with `brew link --overwrite`
- Provides clear feedback about what was fixed
- Bootstrap continues even if some links fail (non-fatal)

Fixes the "why should it fail just because something is installed
already" UX issue reported during fresh install testing.

* fix: Add retry logic for Homebrew installation

Previously, Homebrew installation would fail hard if the curl command
encountered a network issue, stopping the entire bootstrap process.

Changes:
- Added install_homebrew() function with retry logic
  - 3 retries with exponential backoff (2s, 4s, 8s)
  - Clear error messages explaining possible causes
  - Option to continue without Homebrew or abort (user choice)
- Updated bootstrap-mac.sh to use new function
- Updated bootstrap-linux.sh to use new function
- Prevents bootstrap failure due to temporary network hiccups

This makes the bootstrap process more resilient for users with
flaky networks or when GitHub/Homebrew servers are under load.

* feat: Improve macOS /workspace symlink guidance

Previously, bootstrap would fail to create /workspace on modern macOS
(Catalina+) due to read-only root filesystem, then show a manual fix
command that also wouldn't work.

Changes:
- Detect macOS-specific read-only filesystem error
- Provide clear instructions for synthetic.conf setup
- Show exact commands users can copy/paste:
  1. echo -e 'workspace\t$HOME/workspace' | sudo tee -a /etc/synthetic.conf
  2. sudo reboot
- Explain that ~/workspace works fine without /workspace
- Better messaging that this is expected, not an error

This makes the /workspace setup process clear for macOS users who
need it for cross-platform path consistency.

* fix: Remove deprecated --no-lock flag from brew bundle

Homebrew 5.0+ removed the --no-lock flag, causing setup wizard to fail
with "Error: invalid option: --no-lock".

Changes:
- Removed --no-lock flag from dotfiles-setup brew bundle command
- Brew bundle still works correctly without this flag
- Setup wizard now compatible with Homebrew 5.0+

This was discovered during fresh install testing on macOS with
Homebrew 5.0.4.

* feat: Add vault init command and improve vault setup UX

Previously, skipping vault during setup marked it as "complete" with
no way to configure it later without manually resetting state. This
was confusing and frustrating for users.

New vault init command:
- Added `dotfiles vault init` standalone command
- Can configure or reconfigure vault anytime
- Detects existing config and asks to reconfigure
- Clear guidance when skipping
- No need to reset setup state or run full wizard

Setup wizard improvements:
- Now asks "Reconfigure vault?" if already configured
- Shows "Vault was skipped previously" for backend=none
- All skip paths mention "dotfiles vault init"
- Allows changing vault backend easily

Status display improvements:
- Skipped vault: [⊘] Vault (Skipped - run 'dotfiles vault init')
- Configured vault: [✓] Vault (Vault backend: bitwarden)
- Clearly distinguishes between skipped vs configured

This makes vault configuration much more discoverable and flexible,
fixing the UX issue where users felt locked out after skipping.

Files changed:
- vault/init-vault.sh (NEW): Standalone vault configuration
- zsh/zsh.d/40-aliases.zsh: Added 'init' subcommand
- bin/dotfiles-setup: Reconfigure option + better messaging
- CHANGELOG.md: Documented improvements

* docs: Add vault init command to all documentation

Updated documentation to reflect new 'dotfiles vault init' command:

- docs/vault-README.md: Added to Quick Reference table and Commands section
- docs/cli-reference.md: Added to vault subcommands table
- docs/architecture.md: Added init flow to mermaid sequence diagram

The init command is now documented across all relevant documentation
files, making it discoverable for users.

* feat: Improve post-installation UX and feature discovery

Enhances the onboarding experience by making the installation flow
smoother and helping users discover what they just installed.

Changes:
- install.sh now prompts to run setup wizard automatically
- Setup completion shows context-aware next steps based on config
- Highlights useful ZSH features: ls aliases, git shortcuts, fzf, zoxide, yazi
- Better guidance for vault and template workflows

This addresses user feedback about not knowing what to do after setup
and not being aware of all the shell features that were installed.

* fix: Use actual Homebrew installation path after install

Previously, the script would check for both Homebrew paths (/opt/homebrew
and /usr/local) regardless of which one was just installed. This was
indirect and could theoretically use the wrong path.

Now:
- After install_homebrew() runs, we detect which path was actually used
- We pass that specific path to add_brew_to_zprofile()
- If Homebrew was already installed, we skip detection and just activate it

This ties the path detection directly to the installation that just happened.

* fix: Only show available shell features in setup completion

The "Your new shell features" section now conditionally displays
features based on what's actually installed. This prevents showing
features that aren't available when using:
- --minimal mode
- BREWFILE_TIER=minimal or enhanced
- When brew bundle partially failed

Checks:
- eza → ll, la, lt aliases
- git → gst, gd, gco shortcuts
- fzf → Ctrl+R fuzzy history
- zoxide → z directory jumper
- yazi → y file manager

Only shows the section if at least one feature is available.
Also documented the Homebrew path detection fix in CHANGELOG.

---------

Co-authored-by: Claude <noreply@anthropic.com>
blackwell-systems added a commit that referenced this pull request Apr 15, 2026
* docs: Reorganize README for impact and clarity

Major restructuring to improve first-time user experience:

**Structure Changes:**
- Move install flow from line 544 → line 19 (hero section)
- Add simulated terminal output showing complete setup flow
- Add "Why This Dotfiles?" section with 4 key differentiators
- Nest all features under single collapsible (two-level)
- Group features into categories (Core, Safety, Advanced, Tools)
- Move "How This Compares" to bottom (collapsed)
- Move "Use Cases" up (after value prop)
- Simplify Prerequisites section

**Results:**
- README reduced from 1,255 → 832 lines (34% shorter)
- Install flow now immediately visible
- Features organized and scannable
- Better progressive disclosure
- Clearer value proposition

**Backup:**
- Original README saved as README_12_03_2025.md

The new structure leads with "show, don't tell" - users see the
complete install flow with credential onboarding simulation before
diving into features.

* docs: Remove emojis from README for cleaner presentation

* docs: Remove checkmarks for cleaner presentation

* docs: Emphasize modularity throughout README and install.sh

Make modularity a first-class feature to prevent users from abandoning
the project due to perceived opinions. Everything is now clearly optional
except shell config.

Changes:
- Update tagline: "Opinionated" → "Modular"
- Add "Pick What You Want" section with Component Matrix after install
- Show multiple one-line install options (full/minimal/custom)
- Add modularity bullet to cover page "What you get"
- Enhance install.sh help text with modular install instructions
- Document all SKIP_* flags and environment variables
- Add "enable features later" examples
- Clarify that setup wizard steps are all optional

Component Matrix shows:
- Shell config (required)
- Homebrew/packages (optional via --minimal)
- Vault system (optional, skip in wizard)
- /workspace symlink (optional via SKIP_WORKSPACE_SYMLINK)
- Claude integration (optional via SKIP_CLAUDE_SETUP)
- Templates (optional, don't run if not needed)

Philosophy: Start minimal, add what you need, when you need it.

* docs: Update Docsify coverpage to emphasize modularity

* docs: Add modularity sections to architecture and CLI reference

Make the modular, optional nature of components prominent in
documentation to help users understand they can pick only what they need.

Changes to docs/architecture.md:
- Add "Modular Architecture" section after System Overview
- Component matrix showing core vs. optional components
- Install modes (full/minimal/custom)
- Environment variables table with use cases
- Component dependencies diagram (Mermaid)
- Key design principles (no hard dependencies, enable later, etc.)

Changes to docs/cli-reference.md:
- Add "Modular Design" section at top of document
- Quick install options (full/minimal/custom)
- "What's Optional?" table with links to relevant sections
- Links to Environment Variables section for complete SKIP flags

Both docs now emphasize: "Everything is optional except shell config"

* feat: Add Brewfile tiers for flexible package installation

Introduce tiered Brewfile system to give users granular control over
package installation size. Addresses concerns about the system being
too opinionated by making package selection fully modular.

New Brewfile tiers:
- Brewfile.minimal (~15 packages)
  - Essentials only: git, zsh, jq, shell plugins
  - Use case: CI/CD, servers, containers, resource-constrained
  - Install: BREWFILE_TIER=minimal ./bootstrap-mac.sh

- Brewfile.enhanced (~40 packages)
  - Modern CLI tools: fzf, ripgrep, bat, eza, zoxide, btop
  - Essential dev tools: gh, tmux, tree, yq
  - No containers (docker/lima) or heavy development tools
  - Use case: Developer workstations without container needs
  - Install: BREWFILE_TIER=enhanced ./bootstrap-mac.sh

- Brewfile (~80 packages, default)
  - Everything: all enhanced packages + Docker, Node, advanced tools
  - Use case: Full-stack development workstations
  - Install: brew bundle (or BREWFILE_TIER=full)

Implementation:
- bootstrap/_common.sh: Enhanced run_brew_bundle() to support tier selection
- Added BREWFILE_TIER environment variable (minimal|enhanced|full)
- Default tier is "full" (maintains backwards compatibility)
- All tiers work on macOS (Homebrew) and Linux (Linuxbrew)
- macOS casks automatically skipped on Linux

Documentation:
- README.md: Added Brewfile Tiers table to Component Matrix
- docs/architecture.md: Added BREWFILE_TIER to Environment Variables table
- docs/cli-reference.md: Added BREWFILE_TIER with examples
- CHANGELOG.md: Documented new feature in [Unreleased]
- Brewfile: Added header documenting all three tiers

Benefits:
- Users can avoid Docker/Node if not needed (saves ~40 packages)
- Minimal tier perfect for testing in containers/CI
- Enhanced tier gives modern CLI experience without bloat
- Fully backwards compatible (default is full tier)
- Reinforces "everything is optional" philosophy

Breaking changes: None (full tier is default)

* ci: Update documentation check for new README structure

Removed outdated 'Project Structure' section check (moved to docs/architecture.md)
Updated required sections to match new modular README:
- One-Line Install
- Pick What You Want
- Why This Dotfiles
- Platform Support
- Documentation

Old sections like 'Quick Start' and 'Troubleshooting' were removed from
main README in favor of impact-focused content at the top.

* ci: Remove documentation-check job

Removed the entire documentation quality check from CI.
README structure is fluid and focused on user impact rather than
specific section names. Manual review is sufficient.

* docs: Split coverpage install commands into separate code blocks

Separated full and minimal install options into distinct code blocks
with clear labels for better visual separation on the Docsify homepage.

Before: Single code block with comments
After: Two separate blocks with bold labels

* docs: Remove labels from coverpage code blocks

Removed bold labels above install commands. Users can see the
difference from the commands themselves - cleaner look.

* feat: Add template onboarding to setup wizard

Added interactive template configuration as STEP 6 in the setup wizard
to make machine-specific templates more discoverable.

Changes:
- bin/dotfiles-setup:
  - New phase_template() function with examples and clear prompts
  - Defaults to 'No' (opt-in) to keep setup fast
  - Runs 'dotfiles template init' interactively
  - Shows how to enable later if skipped
  - Added 'template' to all phase lists (status, reset, execution)
  - Integrated with state management for resume support

- README.md:
  - Updated hero section terminal simulation with STEP 6
  - Shows realistic template setup flow (work email, git config)
  - Demonstrates work vs personal machine differentiation

- CHANGELOG.md:
  - Documented Templates Onboarding feature in [Unreleased]
  - Explained use cases and design decisions

Benefits:
- Templates are no longer buried in docs
- Users see real value (work vs personal configs)
- Still optional and fast (defaults to No)
- Clear path to enable later

Design decisions:
- Defaults to 'n' not 'Y' (opposite of vault/secrets)
- Templates are more advanced/optional than core features
- Keeps 5-minute setup promise for basic users
- Power users can opt-in when they see the value

* docs: Make dotclaude more prominent throughout README

Enhanced dotclaude visibility as sister product without 'only' language.

Changes:
- Updated 'What you get' bullet: Portable Claude sessions → Claude Code + dotclaude integration
- Added dedicated 'Claude Code + dotclaude' section after install flow
  - Explains what dotclaude is and why it matters
  - Lists key features: profile sync, git safety, portability, context isolation
  - Shows standalone install command
  - Links to dotclaude repo
- Added callout box in 'Why This Dotfiles?' section
  - Highlights dotclaude integration prominently
  - Explains automatic installation during setup
- Updated 'Key features' language: 'The only' → 'Key features'
  - More humble, less marketing-y
  - Still conveys value without exclusivity claims

Benefits:
- dotclaude is now impossible to miss
- Clear explanation of what it does
- Multiple touchpoints throughout README
- Links to learn more
- Standalone install option shown

* fix: Add execute permissions to bootstrap scripts

Fixed 'permission denied' error when running install.sh by making
bootstrap scripts executable.

Issue: bootstrap-mac.sh, bootstrap-linux.sh, bootstrap-dotfiles.sh,
and _common.sh were missing execute permissions (644 instead of 755)

Solution: chmod +x bootstrap/*.sh bin/* vault/*.sh

This fixes the error users get when install.sh tries to call
./bootstrap/bootstrap-mac.sh and gets permission denied.

* fix: Make brew bundle resilient to package link conflicts

Previously, bootstrap would fail if a package couldn't be symlinked
(e.g., npm-installed bw conflicting with Homebrew bitwarden-cli).
This was poor UX since the package was actually installed successfully.

Changes:
- Brew bundle failures no longer stop bootstrap
- Auto-detects unlinked packages after brew bundle
- Attempts to fix with `brew link --overwrite`
- Provides clear feedback about what was fixed
- Bootstrap continues even if some links fail (non-fatal)

Fixes the "why should it fail just because something is installed
already" UX issue reported during fresh install testing.

* fix: Add retry logic for Homebrew installation

Previously, Homebrew installation would fail hard if the curl command
encountered a network issue, stopping the entire bootstrap process.

Changes:
- Added install_homebrew() function with retry logic
  - 3 retries with exponential backoff (2s, 4s, 8s)
  - Clear error messages explaining possible causes
  - Option to continue without Homebrew or abort (user choice)
- Updated bootstrap-mac.sh to use new function
- Updated bootstrap-linux.sh to use new function
- Prevents bootstrap failure due to temporary network hiccups

This makes the bootstrap process more resilient for users with
flaky networks or when GitHub/Homebrew servers are under load.

* feat: Improve macOS /workspace symlink guidance

Previously, bootstrap would fail to create /workspace on modern macOS
(Catalina+) due to read-only root filesystem, then show a manual fix
command that also wouldn't work.

Changes:
- Detect macOS-specific read-only filesystem error
- Provide clear instructions for synthetic.conf setup
- Show exact commands users can copy/paste:
  1. echo -e 'workspace\t$HOME/workspace' | sudo tee -a /etc/synthetic.conf
  2. sudo reboot
- Explain that ~/workspace works fine without /workspace
- Better messaging that this is expected, not an error

This makes the /workspace setup process clear for macOS users who
need it for cross-platform path consistency.

* fix: Remove deprecated --no-lock flag from brew bundle

Homebrew 5.0+ removed the --no-lock flag, causing setup wizard to fail
with "Error: invalid option: --no-lock".

Changes:
- Removed --no-lock flag from dotfiles-setup brew bundle command
- Brew bundle still works correctly without this flag
- Setup wizard now compatible with Homebrew 5.0+

This was discovered during fresh install testing on macOS with
Homebrew 5.0.4.

* feat: Add vault init command and improve vault setup UX

Previously, skipping vault during setup marked it as "complete" with
no way to configure it later without manually resetting state. This
was confusing and frustrating for users.

New vault init command:
- Added `dotfiles vault init` standalone command
- Can configure or reconfigure vault anytime
- Detects existing config and asks to reconfigure
- Clear guidance when skipping
- No need to reset setup state or run full wizard

Setup wizard improvements:
- Now asks "Reconfigure vault?" if already configured
- Shows "Vault was skipped previously" for backend=none
- All skip paths mention "dotfiles vault init"
- Allows changing vault backend easily

Status display improvements:
- Skipped vault: [⊘] Vault (Skipped - run 'dotfiles vault init')
- Configured vault: [✓] Vault (Vault backend: bitwarden)
- Clearly distinguishes between skipped vs configured

This makes vault configuration much more discoverable and flexible,
fixing the UX issue where users felt locked out after skipping.

Files changed:
- vault/init-vault.sh (NEW): Standalone vault configuration
- zsh/zsh.d/40-aliases.zsh: Added 'init' subcommand
- bin/dotfiles-setup: Reconfigure option + better messaging
- CHANGELOG.md: Documented improvements

* docs: Add vault init command to all documentation

Updated documentation to reflect new 'dotfiles vault init' command:

- docs/vault-README.md: Added to Quick Reference table and Commands section
- docs/cli-reference.md: Added to vault subcommands table
- docs/architecture.md: Added init flow to mermaid sequence diagram

The init command is now documented across all relevant documentation
files, making it discoverable for users.

* feat: Improve post-installation UX and feature discovery

Enhances the onboarding experience by making the installation flow
smoother and helping users discover what they just installed.

Changes:
- install.sh now prompts to run setup wizard automatically
- Setup completion shows context-aware next steps based on config
- Highlights useful ZSH features: ls aliases, git shortcuts, fzf, zoxide, yazi
- Better guidance for vault and template workflows

This addresses user feedback about not knowing what to do after setup
and not being aware of all the shell features that were installed.

* fix: Use actual Homebrew installation path after install

Previously, the script would check for both Homebrew paths (/opt/homebrew
and /usr/local) regardless of which one was just installed. This was
indirect and could theoretically use the wrong path.

Now:
- After install_homebrew() runs, we detect which path was actually used
- We pass that specific path to add_brew_to_zprofile()
- If Homebrew was already installed, we skip detection and just activate it

This ties the path detection directly to the installation that just happened.

* fix: Only show available shell features in setup completion

The "Your new shell features" section now conditionally displays
features based on what's actually installed. This prevents showing
features that aren't available when using:
- --minimal mode
- BREWFILE_TIER=minimal or enhanced
- When brew bundle partially failed

Checks:
- eza → ll, la, lt aliases
- git → gst, gd, gco shortcuts
- fzf → Ctrl+R fuzzy history
- zoxide → z directory jumper
- yazi → y file manager

Only shows the section if at least one feature is available.
Also documented the Homebrew path detection fix in CHANGELOG.

---------

Co-authored-by: Claude <noreply@anthropic.com>
blackwell-systems added a commit that referenced this pull request Apr 15, 2026
* docs: Reorganize README for impact and clarity

Major restructuring to improve first-time user experience:

**Structure Changes:**
- Move install flow from line 544 → line 19 (hero section)
- Add simulated terminal output showing complete setup flow
- Add "Why This Dotfiles?" section with 4 key differentiators
- Nest all features under single collapsible (two-level)
- Group features into categories (Core, Safety, Advanced, Tools)
- Move "How This Compares" to bottom (collapsed)
- Move "Use Cases" up (after value prop)
- Simplify Prerequisites section

**Results:**
- README reduced from 1,255 → 832 lines (34% shorter)
- Install flow now immediately visible
- Features organized and scannable
- Better progressive disclosure
- Clearer value proposition

**Backup:**
- Original README saved as README_12_03_2025.md

The new structure leads with "show, don't tell" - users see the
complete install flow with credential onboarding simulation before
diving into features.

* docs: Remove emojis from README for cleaner presentation

* docs: Remove checkmarks for cleaner presentation

* docs: Emphasize modularity throughout README and install.sh

Make modularity a first-class feature to prevent users from abandoning
the project due to perceived opinions. Everything is now clearly optional
except shell config.

Changes:
- Update tagline: "Opinionated" → "Modular"
- Add "Pick What You Want" section with Component Matrix after install
- Show multiple one-line install options (full/minimal/custom)
- Add modularity bullet to cover page "What you get"
- Enhance install.sh help text with modular install instructions
- Document all SKIP_* flags and environment variables
- Add "enable features later" examples
- Clarify that setup wizard steps are all optional

Component Matrix shows:
- Shell config (required)
- Homebrew/packages (optional via --minimal)
- Vault system (optional, skip in wizard)
- /workspace symlink (optional via SKIP_WORKSPACE_SYMLINK)
- Claude integration (optional via SKIP_CLAUDE_SETUP)
- Templates (optional, don't run if not needed)

Philosophy: Start minimal, add what you need, when you need it.

* docs: Update Docsify coverpage to emphasize modularity

* docs: Add modularity sections to architecture and CLI reference

Make the modular, optional nature of components prominent in
documentation to help users understand they can pick only what they need.

Changes to docs/architecture.md:
- Add "Modular Architecture" section after System Overview
- Component matrix showing core vs. optional components
- Install modes (full/minimal/custom)
- Environment variables table with use cases
- Component dependencies diagram (Mermaid)
- Key design principles (no hard dependencies, enable later, etc.)

Changes to docs/cli-reference.md:
- Add "Modular Design" section at top of document
- Quick install options (full/minimal/custom)
- "What's Optional?" table with links to relevant sections
- Links to Environment Variables section for complete SKIP flags

Both docs now emphasize: "Everything is optional except shell config"

* feat: Add Brewfile tiers for flexible package installation

Introduce tiered Brewfile system to give users granular control over
package installation size. Addresses concerns about the system being
too opinionated by making package selection fully modular.

New Brewfile tiers:
- Brewfile.minimal (~15 packages)
  - Essentials only: git, zsh, jq, shell plugins
  - Use case: CI/CD, servers, containers, resource-constrained
  - Install: BREWFILE_TIER=minimal ./bootstrap-mac.sh

- Brewfile.enhanced (~40 packages)
  - Modern CLI tools: fzf, ripgrep, bat, eza, zoxide, btop
  - Essential dev tools: gh, tmux, tree, yq
  - No containers (docker/lima) or heavy development tools
  - Use case: Developer workstations without container needs
  - Install: BREWFILE_TIER=enhanced ./bootstrap-mac.sh

- Brewfile (~80 packages, default)
  - Everything: all enhanced packages + Docker, Node, advanced tools
  - Use case: Full-stack development workstations
  - Install: brew bundle (or BREWFILE_TIER=full)

Implementation:
- bootstrap/_common.sh: Enhanced run_brew_bundle() to support tier selection
- Added BREWFILE_TIER environment variable (minimal|enhanced|full)
- Default tier is "full" (maintains backwards compatibility)
- All tiers work on macOS (Homebrew) and Linux (Linuxbrew)
- macOS casks automatically skipped on Linux

Documentation:
- README.md: Added Brewfile Tiers table to Component Matrix
- docs/architecture.md: Added BREWFILE_TIER to Environment Variables table
- docs/cli-reference.md: Added BREWFILE_TIER with examples
- CHANGELOG.md: Documented new feature in [Unreleased]
- Brewfile: Added header documenting all three tiers

Benefits:
- Users can avoid Docker/Node if not needed (saves ~40 packages)
- Minimal tier perfect for testing in containers/CI
- Enhanced tier gives modern CLI experience without bloat
- Fully backwards compatible (default is full tier)
- Reinforces "everything is optional" philosophy

Breaking changes: None (full tier is default)

* ci: Update documentation check for new README structure

Removed outdated 'Project Structure' section check (moved to docs/architecture.md)
Updated required sections to match new modular README:
- One-Line Install
- Pick What You Want
- Why This Dotfiles
- Platform Support
- Documentation

Old sections like 'Quick Start' and 'Troubleshooting' were removed from
main README in favor of impact-focused content at the top.

* ci: Remove documentation-check job

Removed the entire documentation quality check from CI.
README structure is fluid and focused on user impact rather than
specific section names. Manual review is sufficient.

* docs: Split coverpage install commands into separate code blocks

Separated full and minimal install options into distinct code blocks
with clear labels for better visual separation on the Docsify homepage.

Before: Single code block with comments
After: Two separate blocks with bold labels

* docs: Remove labels from coverpage code blocks

Removed bold labels above install commands. Users can see the
difference from the commands themselves - cleaner look.

* feat: Add template onboarding to setup wizard

Added interactive template configuration as STEP 6 in the setup wizard
to make machine-specific templates more discoverable.

Changes:
- bin/dotfiles-setup:
  - New phase_template() function with examples and clear prompts
  - Defaults to 'No' (opt-in) to keep setup fast
  - Runs 'dotfiles template init' interactively
  - Shows how to enable later if skipped
  - Added 'template' to all phase lists (status, reset, execution)
  - Integrated with state management for resume support

- README.md:
  - Updated hero section terminal simulation with STEP 6
  - Shows realistic template setup flow (work email, git config)
  - Demonstrates work vs personal machine differentiation

- CHANGELOG.md:
  - Documented Templates Onboarding feature in [Unreleased]
  - Explained use cases and design decisions

Benefits:
- Templates are no longer buried in docs
- Users see real value (work vs personal configs)
- Still optional and fast (defaults to No)
- Clear path to enable later

Design decisions:
- Defaults to 'n' not 'Y' (opposite of vault/secrets)
- Templates are more advanced/optional than core features
- Keeps 5-minute setup promise for basic users
- Power users can opt-in when they see the value

* docs: Make dotclaude more prominent throughout README

Enhanced dotclaude visibility as sister product without 'only' language.

Changes:
- Updated 'What you get' bullet: Portable Claude sessions → Claude Code + dotclaude integration
- Added dedicated 'Claude Code + dotclaude' section after install flow
  - Explains what dotclaude is and why it matters
  - Lists key features: profile sync, git safety, portability, context isolation
  - Shows standalone install command
  - Links to dotclaude repo
- Added callout box in 'Why This Dotfiles?' section
  - Highlights dotclaude integration prominently
  - Explains automatic installation during setup
- Updated 'Key features' language: 'The only' → 'Key features'
  - More humble, less marketing-y
  - Still conveys value without exclusivity claims

Benefits:
- dotclaude is now impossible to miss
- Clear explanation of what it does
- Multiple touchpoints throughout README
- Links to learn more
- Standalone install option shown

* fix: Add execute permissions to bootstrap scripts

Fixed 'permission denied' error when running install.sh by making
bootstrap scripts executable.

Issue: bootstrap-mac.sh, bootstrap-linux.sh, bootstrap-dotfiles.sh,
and _common.sh were missing execute permissions (644 instead of 755)

Solution: chmod +x bootstrap/*.sh bin/* vault/*.sh

This fixes the error users get when install.sh tries to call
./bootstrap/bootstrap-mac.sh and gets permission denied.

* fix: Make brew bundle resilient to package link conflicts

Previously, bootstrap would fail if a package couldn't be symlinked
(e.g., npm-installed bw conflicting with Homebrew bitwarden-cli).
This was poor UX since the package was actually installed successfully.

Changes:
- Brew bundle failures no longer stop bootstrap
- Auto-detects unlinked packages after brew bundle
- Attempts to fix with `brew link --overwrite`
- Provides clear feedback about what was fixed
- Bootstrap continues even if some links fail (non-fatal)

Fixes the "why should it fail just because something is installed
already" UX issue reported during fresh install testing.

* fix: Add retry logic for Homebrew installation

Previously, Homebrew installation would fail hard if the curl command
encountered a network issue, stopping the entire bootstrap process.

Changes:
- Added install_homebrew() function with retry logic
  - 3 retries with exponential backoff (2s, 4s, 8s)
  - Clear error messages explaining possible causes
  - Option to continue without Homebrew or abort (user choice)
- Updated bootstrap-mac.sh to use new function
- Updated bootstrap-linux.sh to use new function
- Prevents bootstrap failure due to temporary network hiccups

This makes the bootstrap process more resilient for users with
flaky networks or when GitHub/Homebrew servers are under load.

* feat: Improve macOS /workspace symlink guidance

Previously, bootstrap would fail to create /workspace on modern macOS
(Catalina+) due to read-only root filesystem, then show a manual fix
command that also wouldn't work.

Changes:
- Detect macOS-specific read-only filesystem error
- Provide clear instructions for synthetic.conf setup
- Show exact commands users can copy/paste:
  1. echo -e 'workspace\t$HOME/workspace' | sudo tee -a /etc/synthetic.conf
  2. sudo reboot
- Explain that ~/workspace works fine without /workspace
- Better messaging that this is expected, not an error

This makes the /workspace setup process clear for macOS users who
need it for cross-platform path consistency.

* fix: Remove deprecated --no-lock flag from brew bundle

Homebrew 5.0+ removed the --no-lock flag, causing setup wizard to fail
with "Error: invalid option: --no-lock".

Changes:
- Removed --no-lock flag from dotfiles-setup brew bundle command
- Brew bundle still works correctly without this flag
- Setup wizard now compatible with Homebrew 5.0+

This was discovered during fresh install testing on macOS with
Homebrew 5.0.4.

* feat: Add vault init command and improve vault setup UX

Previously, skipping vault during setup marked it as "complete" with
no way to configure it later without manually resetting state. This
was confusing and frustrating for users.

New vault init command:
- Added `dotfiles vault init` standalone command
- Can configure or reconfigure vault anytime
- Detects existing config and asks to reconfigure
- Clear guidance when skipping
- No need to reset setup state or run full wizard

Setup wizard improvements:
- Now asks "Reconfigure vault?" if already configured
- Shows "Vault was skipped previously" for backend=none
- All skip paths mention "dotfiles vault init"
- Allows changing vault backend easily

Status display improvements:
- Skipped vault: [⊘] Vault (Skipped - run 'dotfiles vault init')
- Configured vault: [✓] Vault (Vault backend: bitwarden)
- Clearly distinguishes between skipped vs configured

This makes vault configuration much more discoverable and flexible,
fixing the UX issue where users felt locked out after skipping.

Files changed:
- vault/init-vault.sh (NEW): Standalone vault configuration
- zsh/zsh.d/40-aliases.zsh: Added 'init' subcommand
- bin/dotfiles-setup: Reconfigure option + better messaging
- CHANGELOG.md: Documented improvements

* docs: Add vault init command to all documentation

Updated documentation to reflect new 'dotfiles vault init' command:

- docs/vault-README.md: Added to Quick Reference table and Commands section
- docs/cli-reference.md: Added to vault subcommands table
- docs/architecture.md: Added init flow to mermaid sequence diagram

The init command is now documented across all relevant documentation
files, making it discoverable for users.

* feat: Improve post-installation UX and feature discovery

Enhances the onboarding experience by making the installation flow
smoother and helping users discover what they just installed.

Changes:
- install.sh now prompts to run setup wizard automatically
- Setup completion shows context-aware next steps based on config
- Highlights useful ZSH features: ls aliases, git shortcuts, fzf, zoxide, yazi
- Better guidance for vault and template workflows

This addresses user feedback about not knowing what to do after setup
and not being aware of all the shell features that were installed.

* fix: Use actual Homebrew installation path after install

Previously, the script would check for both Homebrew paths (/opt/homebrew
and /usr/local) regardless of which one was just installed. This was
indirect and could theoretically use the wrong path.

Now:
- After install_homebrew() runs, we detect which path was actually used
- We pass that specific path to add_brew_to_zprofile()
- If Homebrew was already installed, we skip detection and just activate it

This ties the path detection directly to the installation that just happened.

* fix: Only show available shell features in setup completion

The "Your new shell features" section now conditionally displays
features based on what's actually installed. This prevents showing
features that aren't available when using:
- --minimal mode
- BREWFILE_TIER=minimal or enhanced
- When brew bundle partially failed

Checks:
- eza → ll, la, lt aliases
- git → gst, gd, gco shortcuts
- fzf → Ctrl+R fuzzy history
- zoxide → z directory jumper
- yazi → y file manager

Only shows the section if at least one feature is available.
Also documented the Homebrew path detection fix in CHANGELOG.

---------

Co-authored-by: Claude <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