pwn 0.5.777 → 0.5.778

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77cd821e27ebf793d043b1b73139ff68b17badf106a91f42832769ac7760785e
4
- data.tar.gz: '0708df0d0f8258f249e0b57556898e3a1e675ef90a8caa162eac0fc4366b652e'
3
+ metadata.gz: 3bd715a7f2fae3e39f56f1c2e0d47629de11144461591acbfcbc7399e8a1da9a
4
+ data.tar.gz: 80b713ca6f117ba5f9862416f2796f777e3c4a1e1bba68fdf05fda02ea758635
5
5
  SHA512:
6
- metadata.gz: 338c0443dd72e44e29b50c8b3afd11251ab84643f1b105304c698789cda148f69e4f68468b9c2cdc4824dc1570591f2d9d51c17d5a678c4cea4eace72c27be4e
7
- data.tar.gz: d60694fcbbe66c4b48eb2e35f5235e508d5bcc66f5d2172b7a5ebd604b755a778b83c428ea47578c61985078231382a5182dfca213e46400c61af5bdf8f9fd9a
6
+ metadata.gz: e17ff89a41133b10913a559880f90220940fa02ae6e74694e6c914d1c74af793d94907b05bd5655f7a9ee27afac498e896888c2d8a0c206381e7910ed8233dca
7
+ data.tar.gz: acc1ceac0c1e58354e730a115e06d312d5873cabaf1775ab7f39149ebfa99bb20094e83eae12b9e33108d046bcba61ab0887b7c869471fe9c0a9c655d29a2c72
data/Gemfile CHANGED
@@ -24,7 +24,7 @@ gem 'bundler', '>=4.0.23'
24
24
  gem 'bundler-audit', '>=0.9.3'
25
25
  gem 'bunny', '3.4.0'
26
26
  gem 'colorize', '1.1.0'
27
- gem 'credit_card_validations', '9.0.0'
27
+ gem 'credit_card_validations', '10.0.0'
28
28
  gem 'curses', '1.7.0'
29
29
  gem 'diffy', '3.4.4'
30
30
  gem 'eventmachine', '1.2.7'
data/Rakefile CHANGED
@@ -38,9 +38,8 @@ default_tasks = %i[spec rubocop]
38
38
  default_tasks << :rerdoc if defined?(RDoc::Task)
39
39
  task default: default_tasks
40
40
 
41
- desc 'Regenerate etc/default_skills/pwn from live PWN modules'
41
+ desc 'Regenerate etc/default_skills/pwn from live PWN modules. Not a spec dependency: writing the checkout blocks git merge on upgrade.'
42
42
  task :module_skills do
43
43
  require 'pwn'
44
44
  PWN::ModuleSkills.refresh!
45
45
  end
46
- Rake::Task[:spec].enhance([:module_skills])
data/build_gem.sh CHANGED
@@ -19,6 +19,20 @@ git config pull.rebase false
19
19
  # Sync fork with upstream to avoid merge conflicts and ensure we are building the latest codebase
20
20
  git remote -v | grep 'upstream' || git remote add upstream https://github.com/0dayinc/pwn.git
21
21
  git fetch upstream
22
+ # Preserve legacy generated-skill changes before switching branches or merging.
23
+ # Leave the stash saved: popping it would recreate the next upgrade conflict.
24
+ generated_skills=()
25
+ while IFS= read -r skill; do
26
+ [[ -f "$skill" ]] || continue
27
+ [[ "$skill" == */SKILL.md ]] || continue
28
+ grep -Eq '^[[:space:]]*generated:[[:space:]]*true[[:space:]]*$' "$skill" || continue
29
+ grep -Eq '^[[:space:]]*preserve:[[:space:]]*true[[:space:]]*$' "$skill" && continue
30
+ generated_skills+=("$skill")
31
+ done < <(git diff --name-only HEAD -- etc/default_skills/pwn)
32
+ if (( ${#generated_skills[@]} )); then
33
+ git stash push -m 'pwn upgrade: saved generated module skills' -- "${generated_skills[@]}"
34
+ printf '%s\n' 'Generated skill edits saved in git stash; not reapplied after upgrade.'
35
+ fi
22
36
  git checkout master
23
37
  git merge upstream/master
24
38
  git pull
@@ -381,8 +381,27 @@ edited SOP `SKILL.md`). Generated module skills under `etc/default_skills/pwn/`
381
381
  `PWN::` module, plus `references/` when the source has CWE/NIST/URLs) are
382
382
  copied to `~/.pwn/skills/pwn/` and **are** overwritten on
383
383
  `pwn setup --migrate` / first launch so they stay in sync with `lib/pwn`.
384
- `bundle exec rake` runs `:module_skills` (`PWN::ModuleSkills.refresh!`)
385
- before spec so `etc/default_skills/pwn` matches live `PWN::` class methods.
384
+ `bundle exec rake` does not rewrite `etc/default_skills/pwn`. `rake module_skills`
385
+ is the explicit regenerate. A spec or rake run that writes the checkout
386
+ leaves a local `SKILL.md` edit, and the next `upgrade_pwn.sh` merge aborts.
387
+ The upgrade saves modified generated module `SKILL.md` files in a named Git
388
+ stash before merging; it does not automatically reapply those stale files.
389
+ Skills marked `preserve: true` and unrelated edits are left alone.
390
+
391
+ For a clone already blocked before it can obtain this fix, no reclone is needed:
392
+
393
+ ```bash
394
+ cd /opt/pwn
395
+ git stash push -m 'pwn: preserve legacy generated skills before upgrade' -- etc/default_skills/pwn
396
+ ./upgrade_pwn.sh
397
+ ```
398
+
399
+ The stash preserves the prior skill edits for review with `git stash list` and
400
+ `git stash show -p`. Do not blindly pop it after upgrading: that restores stale
401
+ generated files and can recreate the conflict. The one-time command saves all
402
+ edits under that skill subtree, including any hand-edited skills; recover those
403
+ selectively after reviewing them. Other local changes are not stashed.
404
+
386
405
  `pwn setup --migrate` and `pwn-ai` start copy that tree to `~/.pwn/skills/pwn`. Add at least one
387
406
  LLM engine key with the `pwn-vault` REPL command to enable `pwn-ai` - see
388
407
  [Configuration](Configuration.md). `pwn setup` will report the AI-engine
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.5.777'
4
+ VERSION = '0.5.778'
5
5
  end
@@ -3,8 +3,46 @@
3
3
  require 'spec_helper'
4
4
  require 'fileutils'
5
5
  require 'tmpdir'
6
+ require 'open3'
6
7
 
7
8
  describe PWN::ModuleSkills do
9
+ it 'saves legacy generated edits and merges without discarding unrelated edits' do
10
+ script = File.read(File.expand_path('../../../build_gem.sh', __dir__))
11
+ recovery = script.split('generated_skills=()', 2).last.split('git checkout master', 2).first
12
+ Dir.mktmpdir('pwn_upgrade') do |dir|
13
+ git = lambda do |*args|
14
+ out, status = Open3.capture2e('git', *args, chdir: dir)
15
+ expect(status.success?).to be(true), out
16
+ out
17
+ end
18
+ git.call('init', '-b', 'master')
19
+ git.call('config', 'user.email', 'test@example.invalid')
20
+ git.call('config', 'user.name', 'Upgrade Test')
21
+ skill = 'etc/default_skills/pwn/json_text/SKILL.md'
22
+ path = File.join(dir, skill)
23
+ FileUtils.mkdir_p(File.dirname(path))
24
+ original = "---\ngenerated: true\n---\noriginal\n"
25
+ File.write(path, original)
26
+ File.write(File.join(dir, 'notes'), 'original')
27
+ git.call('add', '.')
28
+ git.call('commit', '-m', 'base')
29
+ git.call('checkout', '-b', 'incoming')
30
+ File.write(path, "#{original}upstream\n")
31
+ git.call('commit', '-am', 'update')
32
+ git.call('checkout', 'master')
33
+ File.write(path, "#{original}local regeneration\n")
34
+ File.write(File.join(dir, 'notes'), 'keep my edit')
35
+ _, blocked = Open3.capture2e('git', 'merge', '--ff-only', 'incoming', chdir: dir)
36
+ expect(blocked.success?).to be(false)
37
+ out, status = Open3.capture2e('bash', '-ec', "generated_skills=()#{recovery}", chdir: dir)
38
+ expect(status.success?).to be(true), out
39
+ git.call('merge', '--ff-only', 'incoming')
40
+ expect(File.read(path)).to eq("#{original}upstream\n")
41
+ expect(File.read(File.join(dir, 'notes'))).to eq('keep my edit')
42
+ expect(git.call('show', "stash@{0}:#{skill}")).to include('local regeneration')
43
+ end
44
+ end
45
+
8
46
  it 'should display information for authors' do
9
47
  expect(described_class).to respond_to :authors
10
48
  end
@@ -23,48 +61,50 @@ describe PWN::ModuleSkills do
23
61
  expect(described_class.relpath(source: 'pwn.rb')).to eq('pwn/SKILL.md')
24
62
  end
25
63
 
26
- it 'refreshes etc/default_skills/pwn from every lib/pwn module' do
27
- report = described_class.refresh!
28
- expect(report[:modules]).to be > 50
29
- tb = File.join(PWN::ModuleSkills::GEM_SKILLS, 'plugins', 'transparent_browser', 'SKILL.md')
30
- expect(File.file?(tb)).to eq(true), tb
31
- expect(File).not_to exist(File.join(PWN::ModuleSkills::GEM_SKILLS, 'plugins', 'transparent_browser.md'))
32
- body = File.read(tb)
33
- expect(body).to include('PWN::Plugins::TransparentBrowser')
34
- expect(body).to include('open')
35
- expect(body).not_to match(/hermes/i)
64
+ it 'refreshes a temp skill tree and does not rewrite the checkout' do
65
+ checkout = File.join(PWN::ModuleSkills::GEM_SKILLS, 'json_text', 'SKILL.md')
66
+ before = File.read(checkout)
67
+ Dir.mktmpdir('pwn_mod_refresh') do |dir|
68
+ report = described_class.refresh!(dest: dir)
69
+ expect(report[:modules]).to be > 50
70
+ tb = File.join(dir, 'pwn', 'plugins', 'transparent_browser', 'SKILL.md')
71
+ expect(File.file?(tb)).to eq(true), tb
72
+ expect(File).not_to exist(File.join(dir, 'pwn', 'plugins', 'transparent_browser.md'))
73
+ body = File.read(tb)
74
+ expect(body).to include('PWN::Plugins::TransparentBrowser')
75
+ expect(body).to include('open')
76
+ expect(body).not_to match(/hermes/i)
36
77
 
37
- pw = File.join(PWN::ModuleSkills::GEM_SKILLS, 'sast', 'password', 'SKILL.md')
38
- expect(File.file?(pw)).to eq(true), pw
39
- expect(File.file?(File.join(PWN::ModuleSkills::GEM_SKILLS, 'sast', 'password', 'references', 'security.md'))).to eq(true)
78
+ pw = File.join(dir, 'pwn', 'sast', 'password', 'SKILL.md')
79
+ expect(File.file?(pw)).to eq(true), pw
80
+ expect(File.file?(File.join(dir, 'pwn', 'sast', 'password', 'references', 'security.md'))).to eq(true)
81
+
82
+ described_class.enumerate.each do |rec|
83
+ path = File.join(dir, described_class.relpath(source: rec[:source], const: rec[:const]))
84
+ expect(File.file?(path)).to eq(true), path
85
+ expect(File.read(path)).to include(rec[:const])
86
+ expect(File.read(path)).not_to match(/hermes/i)
87
+ end
88
+ drift = described_class.drift(dest: dir)
89
+ expect(drift[:missing]).to eq([])
90
+ expect(drift[:stale]).to eq([])
91
+ expect(drift[:orphans]).to eq([])
92
+ end
93
+ expect(File.read(checkout)).to eq(before)
40
94
 
41
95
  gw = File.join(PWN::ModuleSkills::GEM_SKILLS, 'plugins', 'google_workspace', 'SKILL.md')
42
96
  expect(File.read(gw)).to include('preserve: true')
43
97
  expect(File.read(gw)).to include('gmail_search')
44
98
  expect(File.read(gw)).to include('daily-brief.md')
45
99
  expect(File).not_to exist(File.join(PWN::Config.default_skills_dir, 'productivity', 'google-workspace', 'SKILL.md'))
46
-
47
- described_class.enumerate.each do |rec|
48
- path = File.join(
49
- File.dirname(PWN::ModuleSkills::GEM_SKILLS),
50
- described_class.relpath(source: rec[:source], const: rec[:const])
51
- )
52
- expect(File.file?(path)).to eq(true), path
53
- expect(File.read(path)).to include(rec[:const])
54
- expect(File.read(path)).not_to match(/hermes/i)
55
- end
56
- drift = described_class.drift
57
- expect(drift[:missing]).to eq([])
58
- expect(drift[:stale]).to eq([])
59
- expect(drift[:orphans]).to eq([])
60
100
  end
61
101
 
62
- it 'exposes drift so rake/spec can refuse a stale gem skill tree' do
63
- expect(described_class).to respond_to(:drift)
102
+ it 'does not rewrite the checkout before spec' do
64
103
  rake = File.read(File.expand_path('../../../Rakefile', __dir__))
65
- expect(rake).to match(/module_skills/)
104
+ expect(rake).to match(/task :module_skills do/)
66
105
  expect(rake).to match(/ModuleSkills\.refresh!/)
67
- expect(rake).to match(/Task\[:spec\]\.enhance|task spec: :module_skills/)
106
+ expect(rake).not_to match(/Task\[:spec\]\.enhance\(\[:module_skills\]\)/)
107
+ expect(rake).not_to match(/module_skills_drift/)
68
108
  end
69
109
 
70
110
  it 'install overwrites existing generated module skills' do
@@ -83,7 +123,6 @@ describe PWN::ModuleSkills do
83
123
  end
84
124
 
85
125
  it 'ships no credential-shaped artifacts under etc/default_skills' do
86
- described_class.refresh!
87
126
  rx = described_class.const_get(:ARTIFACT_RX)
88
127
  leftovers = []
89
128
  Dir.glob(File.join(PWN::Config.default_skills_dir, '**', '*')).each do |path|
@@ -3397,18 +3397,6 @@
3397
3397
  {"messages":[{"role":"user","content":"PWN::Plugins::REDB.strings Usage"},{"role":"assistant","content":"`PWN::Plugins::REDB.strings`: "}]}
3398
3398
  {"messages":[{"role":"user","content":"PWN::Plugins::REDB.with_db Usage"},{"role":"assistant","content":"`PWN::Plugins::REDB.with_db`: "}]}
3399
3399
  {"messages":[{"role":"user","content":"PWN::Plugins::REDB.xrefs_to Usage"},{"role":"assistant","content":"`PWN::Plugins::REDB.xrefs_to`: "}]}
3400
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.add_commands Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.add_commands`: Supported Method Parameters\n\nPWN::Plugins::REPL.add_commands\n"}]}
3401
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.add_hooks Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.add_hooks`: Supported Method Parameters\n\nPWN::Plugins::REPL.add_hooks\n"}]}
3402
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
3403
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.compact_context_tokens Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.compact_context_tokens`: "}]}
3404
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.enable_autocomplete Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.enable_autocomplete`: "}]}
3405
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.help Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.help`: "}]}
3406
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.leave_special_mode! Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.leave_special_mode!`: "}]}
3407
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.ready_tty! Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.ready_tty!`: "}]}
3408
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.refresh_ps1_proc Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.refresh_ps1_proc`: "}]}
3409
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.reset_reline_editor Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.reset_reline_editor`: "}]}
3410
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.start Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.start`: Supported Method Parameters\n\nPWN::Plugins::REPL.start\n"}]}
3411
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL.process Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL.process`: "}]}
3412
3400
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AI.add_commands Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AI.add_commands`: "}]}
3413
3401
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AI.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AI.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
3414
3402
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::AI.help Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::AI.help`: "}]}
@@ -3677,13 +3665,6 @@
3677
3665
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
3678
3666
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh.help Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh.help`: "}]}
3679
3667
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh.process Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh.process`: "}]}
3680
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.install_pwn_mesh_completer! Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.install_pwn_mesh_completer!`: "}]}
3681
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.mesh_menu_pick Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.mesh_menu_pick`: "}]}
3682
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.mesh_reset_input! Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.mesh_reset_input!`: "}]}
3683
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.persist_mesh_env Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.persist_mesh_env`: "}]}
3684
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.pwn_mesh_complete Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.pwn_mesh_complete`: "}]}
3685
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.pwn_mesh_dispatch_slash! Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.pwn_mesh_dispatch_slash!`: "}]}
3686
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.pwn_mesh_menu_rows Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Mesh::PWN::Plugins::REPL.pwn_mesh_menu_rows`: "}]}
3687
3668
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::PWNMultiLineInput.new Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::PWNMultiLineInput.new`: "}]}
3688
3669
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::PWNMultiLineInput.ensure_tmux_extended_keys Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::PWNMultiLineInput.ensure_tmux_extended_keys`: "}]}
3689
3670
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::PWNMultiLineInput.ensure_vte_shift_enter Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::PWNMultiLineInput.ensure_vte_shift_enter`: "}]}
@@ -3692,10 +3673,6 @@
3692
3673
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::PWNMultiLineInput.reline_config Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::PWNMultiLineInput.reline_config`: "}]}
3693
3674
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::PWNMultiLineInput.tty? Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::PWNMultiLineInput.tty?`: "}]}
3694
3675
  {"messages":[{"role":"user","content":"PWN::Plugins::REPL::PWNMultiLineInput.winsize Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::PWNMultiLineInput.winsize`: "}]}
3695
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Vault.add_commands Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Vault.add_commands`: "}]}
3696
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Vault.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Vault.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
3697
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Vault.help Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Vault.help`: "}]}
3698
- {"messages":[{"role":"user","content":"PWN::Plugins::REPL::Vault.process Usage"},{"role":"assistant","content":"`PWN::Plugins::REPL::Vault.process`: "}]}
3699
3676
  {"messages":[{"role":"user","content":"PWN::Plugins::ROP.annotate Usage"},{"role":"assistant","content":"`PWN::Plugins::ROP.annotate`: "}]}
3700
3677
  {"messages":[{"role":"user","content":"PWN::Plugins::ROP.authors Usage"},{"role":"assistant","content":"`PWN::Plugins::ROP.authors`: "}]}
3701
3678
  {"messages":[{"role":"user","content":"PWN::Plugins::ROP.canonical_register Usage"},{"role":"assistant","content":"`PWN::Plugins::ROP.canonical_register`: "}]}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.777
4
+ version: 0.5.778
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -197,14 +197,14 @@ dependencies:
197
197
  requirements:
198
198
  - - '='
199
199
  - !ruby/object:Gem::Version
200
- version: 9.0.0
200
+ version: 10.0.0
201
201
  type: :runtime
202
202
  prerelease: false
203
203
  version_requirements: !ruby/object:Gem::Requirement
204
204
  requirements:
205
205
  - - '='
206
206
  - !ruby/object:Gem::Version
207
- version: 9.0.0
207
+ version: 10.0.0
208
208
  - !ruby/object:Gem::Dependency
209
209
  name: curses
210
210
  requirement: !ruby/object:Gem::Requirement