smdev 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/smdev/cursor_rules/backup_manager.rb +103 -0
- data/lib/smdev/cursor_rules/config_manager.rb +60 -0
- data/lib/smdev/cursor_rules/directory_manager.rb +55 -0
- data/lib/smdev/cursor_rules/file_copier.rb +53 -0
- data/lib/smdev/cursor_rules/file_operations.rb +83 -0
- data/lib/smdev/cursor_rules/installer.rb +128 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/core-rules/readme.md +1 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/core-rules/rule-generating-agent.mdc +86 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/default.mdc +42 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/documentation/markdown-auto.mdc +59 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/documentation/readme.md +1 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/emoji-communication-always.mdc +33 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/performance-standards-agent.mdc +36 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/readme.md +5 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/tech-stack-agent.mdc +42 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/rb-rules/database-standards-agent.mdc +52 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/rb-rules/rails-conventions-agent.mdc +48 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/rb-rules/readme.md +1 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/testing-rules/rspec-standards-agent.mdc +51 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/tool-rules/gitpush.mdc +35 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/tool-rules/readme.md +1 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/ts-rules/readme.md +1 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/ui-rules/readme.md +11 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/ui-rules/ui-component-standards-agent.mdc +55 -0
- data/lib/smdev/cursor_rules/templates/.cursor/rules/workflows/workflow-agile-manual.mdc +48 -0
- data/lib/smdev/cursor_rules/templates/.cursor/templates/template-arch.md +76 -0
- data/lib/smdev/cursor_rules/templates/.cursor/templates/template-prd.md +136 -0
- data/lib/smdev/cursor_rules/templates/.cursor/templates/template-story.md +146 -0
- data/lib/smdev/cursor_rules/templates/docs/agile-readme.md +251 -0
- data/lib/smdev/cursor_rules/templates/docs/cursor_rules.md +88 -0
- data/lib/smdev/cursor_rules/user_interface.rb +27 -0
- data/lib/smdev/cursor_rules.rb +16 -0
- data/lib/smdev/ecs_exec.rb +0 -4
- data/lib/smdev.rb +117 -101
- metadata +107 -5
    
        data/lib/smdev.rb
    CHANGED
    
    | @@ -2,128 +2,168 @@ | |
| 2 2 | 
             
            require 'io/console'
         | 
| 3 3 | 
             
            require 'octokit'
         | 
| 4 4 | 
             
            require 'optparse'
         | 
| 5 | 
            +
            require 'base64'
         | 
| 5 6 | 
             
            require 'smdev/ecs_exec'
         | 
| 6 7 | 
             
            require 'smdev/pr_critic'
         | 
| 8 | 
            +
            require 'smdev/cursor_rules'
         | 
| 7 9 |  | 
| 8 10 | 
             
            module Smdev
         | 
| 11 | 
            +
              class Error < StandardError; end
         | 
| 12 | 
            +
             | 
| 9 13 | 
             
              class CLI
         | 
| 10 14 | 
             
                def run(args = ARGV)
         | 
| 11 | 
            -
                  options =  | 
| 12 | 
            -
                   | 
| 13 | 
            -
             | 
| 14 | 
            -
                              "clone_repos : Checkout all repositories for StrongMind\n",
         | 
| 15 | 
            -
                              "update_repos : Checkout all repositories for StrongMind\n",
         | 
| 16 | 
            -
                              "console : Open a rails console on ECS\n",
         | 
| 17 | 
            -
                              "ssh : Open a bash shell on ECS\n"
         | 
| 18 | 
            -
                  ]
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  OptionParser.new do |opts|
         | 
| 21 | 
            -
                    opts.banner = "Usage: smdev.rb [options] <command>"
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                    opts.on("-t", "--team TEAM_NAME", "Pull repositories assigned to a specific team") do |team_name|
         | 
| 24 | 
            -
                      options[:team] = team_name
         | 
| 25 | 
            -
                    end
         | 
| 15 | 
            +
                  options = parse_options
         | 
| 16 | 
            +
                  command = args.shift || 'help'
         | 
| 17 | 
            +
                  subcommand = args.shift
         | 
| 26 18 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
                     | 
| 19 | 
            +
                  case command
         | 
| 20 | 
            +
                  when 'local_app_setup'
         | 
| 21 | 
            +
                    execute_local_app_setup
         | 
| 22 | 
            +
                  when 'system_install'
         | 
| 23 | 
            +
                    system_install
         | 
| 24 | 
            +
                  when 'clone_repos'
         | 
| 25 | 
            +
                    clone_repos(options)
         | 
| 26 | 
            +
                  when 'update_repos'
         | 
| 27 | 
            +
                    update_repos(options)
         | 
| 28 | 
            +
                  when 'console'
         | 
| 29 | 
            +
                    execute_console(options)
         | 
| 30 | 
            +
                  when 'ssh'
         | 
| 31 | 
            +
                    execute_ssh(options)
         | 
| 32 | 
            +
                  when 'update'
         | 
| 33 | 
            +
                    handle_update_command(subcommand)
         | 
| 34 | 
            +
                  when 'help'
         | 
| 35 | 
            +
                    display_help
         | 
| 36 | 
            +
                  else
         | 
| 37 | 
            +
                    puts "Unknown command: #{command}"
         | 
| 38 | 
            +
                    display_help
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 30 41 |  | 
| 31 | 
            -
             | 
| 32 | 
            -
                      options[:cluster] = cluster
         | 
| 33 | 
            -
                    end
         | 
| 42 | 
            +
                private
         | 
| 34 43 |  | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 44 | 
            +
                def handle_update_command(subcommand)
         | 
| 45 | 
            +
                  case subcommand
         | 
| 46 | 
            +
                  when 'cursor'
         | 
| 47 | 
            +
                    CursorRules.install
         | 
| 48 | 
            +
                  else
         | 
| 49 | 
            +
                    puts "Invalid update subcommand: #{subcommand}"
         | 
| 50 | 
            +
                    puts "Available update subcommands: cursor"
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                end
         | 
| 38 53 |  | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 54 | 
            +
                def parse_options
         | 
| 55 | 
            +
                  options = {}
         | 
| 56 | 
            +
                  OptionParser.new do |parser|
         | 
| 57 | 
            +
                    parser.banner = "Usage: smdev COMMAND [options]"
         | 
| 58 | 
            +
                    parser.on("-h", "--help", "Show this help message") do
         | 
| 59 | 
            +
                      puts parser
         | 
| 60 | 
            +
                      exit
         | 
| 41 61 | 
             
                    end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
                      options[:pr_critic] = true
         | 
| 62 | 
            +
                    parser.on("-s", "--https", "Use HTTPS instead of SSH for git operations") do
         | 
| 63 | 
            +
                      options[:https] = true
         | 
| 45 64 | 
             
                    end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
                      options[:pr_state] = 'open'
         | 
| 65 | 
            +
                    parser.on("-t", "--team TEAM", "Specify team name for repository operations") do |team|
         | 
| 66 | 
            +
                      options[:team] = team
         | 
| 49 67 | 
             
                    end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
                      options[:pr_state] = 'closed'
         | 
| 68 | 
            +
                    parser.on("--cluster CLUSTER", "Specify ECS cluster for console/ssh commands") do |cluster|
         | 
| 69 | 
            +
                      options[:cluster] = cluster
         | 
| 53 70 | 
             
                    end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
                      puts opts
         | 
| 57 | 
            -
                      puts "\nCommands:"
         | 
| 58 | 
            -
                      commands.each { |cmd| puts "  #{cmd}" }
         | 
| 59 | 
            -
                      exit
         | 
| 71 | 
            +
                    parser.on("--service SERVICE", "Specify ECS service for console/ssh commands") do |service|
         | 
| 72 | 
            +
                      options[:service] = service
         | 
| 60 73 | 
             
                    end
         | 
| 61 | 
            -
             | 
| 62 74 | 
             
                  end.parse!
         | 
| 75 | 
            +
                  options
         | 
| 76 | 
            +
                end
         | 
| 63 77 |  | 
| 64 | 
            -
             | 
| 65 | 
            -
                   | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
                   | 
| 78 | 
            +
                def display_help
         | 
| 79 | 
            +
                  puts "Usage: smdev COMMAND [options]"
         | 
| 80 | 
            +
                  puts "\nCommands:"
         | 
| 81 | 
            +
                  puts "  local_app_setup - Set up local development environment"
         | 
| 82 | 
            +
                  puts "  system_install  - Install system dependencies"
         | 
| 83 | 
            +
                  puts "  clone_repos     - Clone repositories"
         | 
| 84 | 
            +
                  puts "  update_repos    - Update repositories"
         | 
| 85 | 
            +
                  puts "  console        - Open Rails console"
         | 
| 86 | 
            +
                  puts "  ssh            - SSH into ECS container"
         | 
| 87 | 
            +
                  puts "  update cursor  - Install or update cursor rules"
         | 
| 88 | 
            +
                  puts "  help           - Show this help message"
         | 
| 89 | 
            +
                  puts "\nOptions:"
         | 
| 90 | 
            +
                  puts "  -h, --help     - Show this help message"
         | 
| 91 | 
            +
                  puts "  -s, --https    - Use HTTPS instead of SSH for git operations"
         | 
| 92 | 
            +
                  puts "  -t, --team     - Specify team name for repository operations"
         | 
| 93 | 
            +
                  puts "  --cluster      - Specify ECS cluster for console/ssh commands"
         | 
| 94 | 
            +
                  puts "  --service      - Specify ECS service for console/ssh commands"
         | 
| 95 | 
            +
                end
         | 
| 70 96 |  | 
| 71 | 
            -
             | 
| 97 | 
            +
                def handle_pr_critic(options)
         | 
| 98 | 
            +
                  options[:pr_state] ||= 'open'
         | 
| 99 | 
            +
                  Smdev::PrCritic.analyze(options)
         | 
| 100 | 
            +
                end
         | 
| 72 101 |  | 
| 102 | 
            +
                def execute_command(command, subcommand, options)
         | 
| 73 103 | 
             
                  case command
         | 
| 74 | 
            -
                  when "local_app_setup"
         | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 104 | 
            +
                  when "local_app_setup" then execute_local_app_setup
         | 
| 105 | 
            +
                  when "system_install" then system_install
         | 
| 106 | 
            +
                  when "clone_repos" then clone_repos(options)
         | 
| 107 | 
            +
                  when "update_repos" then update_repos(options)
         | 
| 108 | 
            +
                  when "console" then execute_console(options)
         | 
| 109 | 
            +
                  when "ssh" then execute_ssh(options)
         | 
| 110 | 
            +
                  when "update" then handle_update(subcommand)
         | 
| 111 | 
            +
                  else
         | 
| 112 | 
            +
                    puts "Invalid command: #{command}. Use --help for a list of commands."
         | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
                end
         | 
| 77 115 |  | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 116 | 
            +
                def execute_local_app_setup
         | 
| 117 | 
            +
                  puts "Running Bundle Install"
         | 
| 118 | 
            +
                  system('bundle', 'install')
         | 
| 80 119 |  | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 120 | 
            +
                  puts "Copying env file"
         | 
| 121 | 
            +
                  system('cp', '.env.example', '.env')
         | 
| 83 122 |  | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
                   | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
                   | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 123 | 
            +
                  puts "Create database"
         | 
| 124 | 
            +
                  system('bin/rails', 'db:create')
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                  puts "Run database migrations"
         | 
| 127 | 
            +
                  system('rails', 'db:migrate')
         | 
| 128 | 
            +
                end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                def execute_console(options)
         | 
| 131 | 
            +
                  options[:command] = "rails c"
         | 
| 132 | 
            +
                  open_ssh(options)
         | 
| 133 | 
            +
                end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                def execute_ssh(options)
         | 
| 136 | 
            +
                  options[:command] ||= "/bin/sh"
         | 
| 137 | 
            +
                  open_ssh(options)
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                def handle_update(subcommand)
         | 
| 141 | 
            +
                  case subcommand
         | 
| 142 | 
            +
                  when "cursor"
         | 
| 143 | 
            +
                    CursorRules.install
         | 
| 98 144 | 
             
                  else
         | 
| 99 | 
            -
                    puts "Invalid  | 
| 145 | 
            +
                    puts "Invalid update subcommand: #{subcommand}. Use --help for a list of commands."
         | 
| 100 146 | 
             
                  end
         | 
| 101 | 
            -
             | 
| 102 147 | 
             
                end
         | 
| 103 148 |  | 
| 104 149 | 
             
                def system_install
         | 
| 105 150 | 
             
                  puts "Installing Homebrew..."
         | 
| 106 151 | 
             
                  system({ 'SHELL' => '/bin/bash' }, '/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"')
         | 
| 107 | 
            -
                  # system('/bin/bash', '-c', "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)")
         | 
| 108 152 |  | 
| 109 | 
            -
                  # Add Homebrew to PATH and run initialization script
         | 
| 110 153 | 
             
                  puts "adding homebrew to .zshrc"
         | 
| 111 154 | 
             
                  File.open("#{ENV['HOME']}/.zshrc", "a") do |file|
         | 
| 112 155 | 
             
                    file.write("\n")
         | 
| 113 156 | 
             
                    file.write('eval "$(/opt/homebrew/bin/brew shellenv)"')
         | 
| 114 157 | 
             
                  end
         | 
| 115 158 |  | 
| 116 | 
            -
                  # Update PATH to include Homebrew
         | 
| 117 159 | 
             
                  ENV['PATH'] = "#{ENV['HOME']}/.homebrew/bin:#{ENV['HOME']}/.homebrew/sbin:#{ENV['PATH']}"
         | 
| 118 160 |  | 
| 119 | 
            -
                  # Install PostgreSQL
         | 
| 120 161 | 
             
                  puts "Installing PostgreSQL..."
         | 
| 121 162 | 
             
                  system('brew', 'install', 'libpq')
         | 
| 122 163 |  | 
| 123 164 | 
             
                  puts "Installing lib-pq..."
         | 
| 124 165 | 
             
                  system('brew', 'install', 'postgresql@15')
         | 
| 125 166 |  | 
| 126 | 
            -
                  # Install Code Climate
         | 
| 127 167 | 
             
                  puts "Preparing Code Climate Formulae..."
         | 
| 128 168 | 
             
                  system('brew', 'tap', 'codeclimate/formulae')
         | 
| 129 169 |  | 
| @@ -136,12 +176,6 @@ module Smdev | |
| 136 176 | 
             
                  puts "Installing AWS Session Manager Plugin..."
         | 
| 137 177 | 
             
                  system('brew', 'install', '--cask', 'session-manager-plugin')
         | 
| 138 178 |  | 
| 139 | 
            -
                  # TODO: need to add the path & compiler flags
         | 
| 140 | 
            -
                  # echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc
         | 
| 141 | 
            -
                  # export LDFLAGS="-L/opt/homebrew/opt/libpq/lib"
         | 
| 142 | 
            -
                  # export CPPFLAGS="-I/opt/homebrew/opt/libpq/include"
         | 
| 143 | 
            -
             | 
| 144 | 
            -
                  # Install RBenv
         | 
| 145 179 | 
             
                  puts "Installing RBenv..."
         | 
| 146 180 | 
             
                  system('brew', 'install', 'rbenv')
         | 
| 147 181 | 
             
                  puts "Initialize RBenv..."
         | 
| @@ -149,19 +183,15 @@ module Smdev | |
| 149 183 | 
             
                    file.write("\n")
         | 
| 150 184 | 
             
                    file.write('eval "$(rbenv init - zsh)"')
         | 
| 151 185 | 
             
                  end
         | 
| 152 | 
            -
                  # Load the contents of .zshrc into a string
         | 
| 153 186 | 
             
                  zshrc_contents = File.read(File.expand_path('~/.zshrc'))
         | 
| 154 187 |  | 
| 155 | 
            -
                  # Execute a new shell session with the .zshrc contents
         | 
| 156 188 | 
             
                  exec('zsh', '-c', zshrc_contents)
         | 
| 157 189 |  | 
| 158 | 
            -
                  # Install Ruby
         | 
| 159 190 | 
             
                  puts "Installing Ruby via RBenv..."
         | 
| 160 191 | 
             
                  system('rbenv', 'install', '3.2.6')
         | 
| 161 192 | 
             
                  puts "Making ruby 3.2.6 global ..."
         | 
| 162 193 | 
             
                  system('rbenv', 'global', '3.2.6')
         | 
| 163 194 |  | 
| 164 | 
            -
                  # Install Ruby on Rails
         | 
| 165 195 | 
             
                  puts "Installing Ruby on Rails..."
         | 
| 166 196 | 
             
                  system('sudo', 'gem', 'install', 'rails')
         | 
| 167 197 | 
             
                end
         | 
| @@ -169,31 +199,23 @@ module Smdev | |
| 169 199 | 
             
                def get_repos(options)
         | 
| 170 200 | 
             
                  token = ENV['GITHUB_TOKEN']
         | 
| 171 201 | 
             
                  if token.nil?
         | 
| 172 | 
            -
                    # Prompt the user for their GitHub personal access token
         | 
| 173 202 | 
             
                    print "GitHub personal access token: "
         | 
| 174 203 | 
             
                    token = STDIN.noecho(&:gets).chomp
         | 
| 175 204 | 
             
                    puts ""
         | 
| 176 205 | 
             
                  end
         | 
| 177 206 |  | 
| 178 | 
            -
                  # Authenticate with the GitHub API using the user's credentials
         | 
| 179 207 | 
             
                  client = Octokit::Client.new(access_token: token)
         | 
| 180 208 |  | 
| 181 | 
            -
                  # Specify the organization name
         | 
| 182 209 | 
             
                  org_name = "StrongMind"
         | 
| 183 210 |  | 
| 184 211 | 
             
                  if options[:team]
         | 
| 185 | 
            -
                    # A team name was provided as a command-line argument
         | 
| 186 212 | 
             
                    team_name = options[:team]
         | 
| 187 | 
            -
                    # Get a list of all teams in the organization
         | 
| 188 213 | 
             
                    teams = client.organization_teams(org_name)
         | 
| 189 | 
            -
                    # Find the team with the specified name
         | 
| 190 214 | 
             
                    team = teams.find { |t| t.name == team_name }
         | 
| 191 215 | 
             
                    if team.nil?
         | 
| 192 216 | 
             
                      puts "Error: Could not find team with name '#{team_name}' in organization '#{org_name}'"
         | 
| 193 217 | 
             
                      exit
         | 
| 194 218 | 
             
                    end
         | 
| 195 | 
            -
                    # Get a list of all repositories in the organization that are assigned to the specified team
         | 
| 196 | 
            -
                    #
         | 
| 197 219 | 
             
                    repos = client.org_repos(org_name, { :affiliation => 'organization_member', :team_id => team.id })
         | 
| 198 220 | 
             
                    puts "Team Name #{team_name} - Team ID: #{team.id}"
         | 
| 199 221 | 
             
                  else
         | 
| @@ -213,7 +235,6 @@ module Smdev | |
| 213 235 |  | 
| 214 236 | 
             
                def update_repos(options)
         | 
| 215 237 | 
             
                  repos = get_repos(options)
         | 
| 216 | 
            -
                  # Clone each repository to a local directory
         | 
| 217 238 | 
             
                  repos.each do |repo|
         | 
| 218 239 | 
             
                    clone_url = repo.clone_url
         | 
| 219 240 | 
             
                    ssh_url = repo.ssh_url
         | 
| @@ -235,15 +256,11 @@ module Smdev | |
| 235 256 | 
             
                      puts "Repository '#{repo_name}' isn't cloned locally. Skipping update."
         | 
| 236 257 | 
             
                    end
         | 
| 237 258 | 
             
                  end
         | 
| 238 | 
            -
             | 
| 239 259 | 
             
                end
         | 
| 240 260 |  | 
| 241 | 
            -
             | 
| 242 261 | 
             
                def clone_repos(options)
         | 
| 243 262 | 
             
                  repos = get_repos(options)
         | 
| 244 263 |  | 
| 245 | 
            -
             | 
| 246 | 
            -
                  # Clone each repository to a local directory
         | 
| 247 264 | 
             
                  repos.each do |repo|
         | 
| 248 265 | 
             
                    clone_url = repo.clone_url
         | 
| 249 266 | 
             
                    ssh_url = repo.ssh_url
         | 
| @@ -256,7 +273,6 @@ module Smdev | |
| 256 273 | 
             
                      `git clone #{url} #{repo_name}`
         | 
| 257 274 | 
             
                    end
         | 
| 258 275 | 
             
                  end
         | 
| 259 | 
            -
             | 
| 260 276 | 
             
                end
         | 
| 261 277 |  | 
| 262 278 | 
             
                private
         | 
    
        metadata
    CHANGED
    
    | @@ -1,16 +1,86 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: smdev
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.2.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Derek Neighbors
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2025- | 
| 12 | 
            -
            dependencies: | 
| 13 | 
            -
             | 
| 11 | 
            +
            date: 2025-04-01 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: colorize
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - "~>"
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '1.1'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - "~>"
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '1.1'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: clipboard
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - "~>"
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '2.0'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - "~>"
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '2.0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: dotenv
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '3.1'
         | 
| 48 | 
            +
              type: :runtime
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '3.1'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: octokit
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '6.1'
         | 
| 62 | 
            +
              type: :runtime
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '6.1'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: base64
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - "~>"
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '0.2'
         | 
| 76 | 
            +
              type: :runtime
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - "~>"
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '0.2'
         | 
| 83 | 
            +
            description: Collection of tools for StrongMind development
         | 
| 14 84 | 
             
            email: derek.neighbors@strongmind.com
         | 
| 15 85 | 
             
            executables:
         | 
| 16 86 | 
             
            - smdev
         | 
| @@ -19,6 +89,38 @@ extra_rdoc_files: [] | |
| 19 89 | 
             
            files:
         | 
| 20 90 | 
             
            - bin/smdev
         | 
| 21 91 | 
             
            - lib/smdev.rb
         | 
| 92 | 
            +
            - lib/smdev/cursor_rules.rb
         | 
| 93 | 
            +
            - lib/smdev/cursor_rules/backup_manager.rb
         | 
| 94 | 
            +
            - lib/smdev/cursor_rules/config_manager.rb
         | 
| 95 | 
            +
            - lib/smdev/cursor_rules/directory_manager.rb
         | 
| 96 | 
            +
            - lib/smdev/cursor_rules/file_copier.rb
         | 
| 97 | 
            +
            - lib/smdev/cursor_rules/file_operations.rb
         | 
| 98 | 
            +
            - lib/smdev/cursor_rules/installer.rb
         | 
| 99 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/core-rules/readme.md
         | 
| 100 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/core-rules/rule-generating-agent.mdc
         | 
| 101 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/default.mdc
         | 
| 102 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/documentation/markdown-auto.mdc
         | 
| 103 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/documentation/readme.md
         | 
| 104 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/emoji-communication-always.mdc
         | 
| 105 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/performance-standards-agent.mdc
         | 
| 106 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/readme.md
         | 
| 107 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/global-rules/tech-stack-agent.mdc
         | 
| 108 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/rb-rules/database-standards-agent.mdc
         | 
| 109 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/rb-rules/rails-conventions-agent.mdc
         | 
| 110 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/rb-rules/readme.md
         | 
| 111 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/testing-rules/rspec-standards-agent.mdc
         | 
| 112 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/tool-rules/gitpush.mdc
         | 
| 113 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/tool-rules/readme.md
         | 
| 114 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/ts-rules/readme.md
         | 
| 115 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/ui-rules/readme.md
         | 
| 116 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/ui-rules/ui-component-standards-agent.mdc
         | 
| 117 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/rules/workflows/workflow-agile-manual.mdc
         | 
| 118 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/templates/template-arch.md
         | 
| 119 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/templates/template-prd.md
         | 
| 120 | 
            +
            - lib/smdev/cursor_rules/templates/.cursor/templates/template-story.md
         | 
| 121 | 
            +
            - lib/smdev/cursor_rules/templates/docs/agile-readme.md
         | 
| 122 | 
            +
            - lib/smdev/cursor_rules/templates/docs/cursor_rules.md
         | 
| 123 | 
            +
            - lib/smdev/cursor_rules/user_interface.rb
         | 
| 22 124 | 
             
            - lib/smdev/ecs_exec.rb
         | 
| 23 125 | 
             
            - lib/smdev/pr_critic.rb
         | 
| 24 126 | 
             
            homepage: https://github.com/StrongMind/Helpers/tree/main/smdev
         | 
| @@ -33,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 33 135 | 
             
              requirements:
         | 
| 34 136 | 
             
              - - ">="
         | 
| 35 137 | 
             
                - !ruby/object:Gem::Version
         | 
| 36 | 
            -
                  version: '0'
         | 
| 138 | 
            +
                  version: '3.0'
         | 
| 37 139 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 38 140 | 
             
              requirements:
         | 
| 39 141 | 
             
              - - ">="
         |