pwn 0.5.705 → 0.5.707

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/documentation/Reporting.md +1 -0
  4. data/etc/default_skills/pwn/reports/SKILL.md +4 -2
  5. data/etc/default_skills/pwn/reports/csv/SKILL.md +47 -0
  6. data/etc/default_skills/pwn/reports/html/SKILL.md +47 -0
  7. data/etc/default_skills/pwn/reports/json/SKILL.md +47 -0
  8. data/etc/default_skills/pwn/reports/markdown/SKILL.md +47 -0
  9. data/etc/default_skills/pwn/reports/pdf/SKILL.md +47 -0
  10. data/etc/default_skills/pwn/reports/xml/SKILL.md +47 -0
  11. data/lib/pwn/ai/agent/curriculum.rb +22 -20
  12. data/lib/pwn/ai/agent/learning.rb +3 -10
  13. data/lib/pwn/ai/agent/loop.rb +243 -52
  14. data/lib/pwn/ai/agent/policy.rb +23 -5
  15. data/lib/pwn/ai/agent/reward.rb +11 -23
  16. data/lib/pwn/ai/agent/turn_finalizer.rb +0 -1
  17. data/lib/pwn/reports/ai_red_team.rb +1 -1
  18. data/lib/pwn/reports/csv.rb +38 -0
  19. data/lib/pwn/reports/fuzz.rb +1 -1
  20. data/lib/pwn/reports/html.rb +58 -0
  21. data/lib/pwn/reports/json.rb +32 -0
  22. data/lib/pwn/reports/markdown.rb +40 -0
  23. data/lib/pwn/reports/pdf.rb +93 -0
  24. data/lib/pwn/reports/phone.rb +1 -1
  25. data/lib/pwn/reports/sast.rb +1 -1
  26. data/lib/pwn/reports/uri_buster.rb +1 -1
  27. data/lib/pwn/reports/xml.rb +44 -0
  28. data/lib/pwn/reports.rb +54 -6
  29. data/lib/pwn/version.rb +1 -1
  30. data/spec/integration/reinforced_feedback_loop_spec.rb +19 -4
  31. data/spec/lib/pwn/ai/agent/loop_spec.rb +166 -10
  32. data/spec/lib/pwn/ai/agent/policy_spec.rb +12 -2
  33. data/spec/lib/pwn/ai/agent/reward_spec.rb +72 -0
  34. data/spec/lib/pwn/reports/csv_spec.rb +19 -0
  35. data/spec/lib/pwn/reports/formats_spec.rb +90 -0
  36. data/spec/lib/pwn/reports/html_spec.rb +19 -0
  37. data/spec/lib/pwn/reports/json_spec.rb +19 -0
  38. data/spec/lib/pwn/reports/markdown_spec.rb +19 -0
  39. data/spec/lib/pwn/reports/pdf_spec.rb +19 -0
  40. data/spec/lib/pwn/reports/xml_spec.rb +19 -0
  41. data/third_party/pwn_rdoc.jsonl +46 -1
  42. metadata +22 -3
@@ -131,13 +131,23 @@ describe PWN::AI::Agent::Policy do
131
131
  grind = described_class.observe_step(
132
132
  action: 'shell', ok: true, session_id: 'en_credit', ts_state: ts
133
133
  )
134
- ts[:plan_idx] = 1
135
- ts[:evidence_blob] = 'rg hit locate the source lib/task_summarizer.rb patched later'
134
+ poc = "/tmp/pwn-policy-#{Process.pid}.poc"
135
+ File.write(poc, 'poc')
136
+ Thread.current[:pwn_loop_deliverables] = {
137
+ paths: [],
138
+ min_seconds: 0,
139
+ skills: [],
140
+ proofs: [poc],
141
+ hosts: [],
142
+ techniques: []
143
+ }
136
144
  advance = described_class.observe_step(
137
145
  action: 'shell', ok: true, session_id: 'en_credit', ts_state: ts
138
146
  )
139
147
  expect(advance[:reward].to_f).to be > grind[:reward].to_f
140
148
  ensure
149
+ FileUtils.rm_f(poc) if defined?(poc)
150
+ Thread.current[:pwn_loop_deliverables] = nil
141
151
  described_class.reset
142
152
  FileUtils.remove_entry(tmp) if tmp && Dir.exist?(tmp)
143
153
  end
@@ -328,3 +328,75 @@ describe PWN::AI::Agent::Reward do
328
328
  expect(src).to include('quiet: true')
329
329
  end
330
330
  end
331
+
332
+ describe 'PWN::AI::Agent::Reward vs TUI plan' do
333
+ it 'does not let a TUI plan_cover_low haircut a high-evidence original-request answer' do
334
+ stub_const('PWN::AI::Agent::Reward::SENTINEL_FILE', File.join(Dir.mktmpdir, 's.json'))
335
+ allow(PWN::AI::Agent::Reward).to receive(:reflect_available?).and_return(false)
336
+ plan = [
337
+ 'Load and review rules of engagement, submission criteria, and the full in-scope subdomain list',
338
+ 'Inventory applicable unauthenticated testing skills and techniques',
339
+ 'Enumerate and resolve all in-scope subdomains and map reachable services',
340
+ 'Fingerprint stacks, configurations, and exposure on every subdomain',
341
+ 'Run exhaustive unauthenticated analysis across the full attack surface',
342
+ 'Prioritize and deep-dive each promising lead to confirm exploitability',
343
+ 'Develop evidence-backed proof-of-concept demonstrations',
344
+ 'Combine related weaknesses into higher-impact attack chains',
345
+ 'Assign evidence-backed severity and filter to submission-eligible issues',
346
+ 'Use graphical applications where they improve validation',
347
+ 'Compile submission-ready writeups with reproduction steps',
348
+ 'Re-verify each finding still reproduces and present the final set'
349
+ ]
350
+ final = <<~TXT
351
+ Path-backed answer for the original request. Hosts scanned: 10.9.8.7 and 10.9.8.8.
352
+ Verified complete. Evidence in /tmp/pwn-eval-hosts.json. 12 hosts live. rspec passed.
353
+ TXT
354
+ klass = PWN::AI::Agent::Reward
355
+ v = klass.judge(
356
+ request: 'what live hosts can you find on this box and write /tmp/pwn-eval-hosts.json',
357
+ final: final,
358
+ plan: plan,
359
+ trace: [
360
+ '{"success":true,"result":{"stdout":"10.9.8.7 up","exit":0},"effect":"eval"}',
361
+ '{"success":true,"result":{"stdout":"wrote /tmp/pwn-eval-hosts.json","exit":0},"effect":"write"}'
362
+ ],
363
+ commit: false
364
+ )
365
+ expect(v[:source].to_s).to eq 'heuristic'
366
+ expect(v[:score]).to be >= 0.6
367
+ expect(v[:verdict].to_s).to eq 'solved'
368
+ args = {
369
+ request: 'what live hosts can you find on this box and write /tmp/pwn-eval-hosts.json',
370
+ final: final,
371
+ trace: [
372
+ '{"success":true,"result":{"stdout":"10.9.8.7 up","exit":0},"effect":"eval"}',
373
+ '{"success":true,"result":{"stdout":"wrote /tmp/pwn-eval-hosts.json","exit":0},"effect":"write"}'
374
+ ]
375
+ }
376
+ base = klass.send(:evidence_prior, **args)
377
+ mixed = klass.send(:evidence_prior, **args, plan: plan)
378
+ expect(mixed[:score]).to eq(base[:score])
379
+ end
380
+
381
+ it 'always grades the original request even when a stub compass or TUI plan is supplied' do
382
+ stub_const('PWN::AI::Agent::Reward::SENTINEL_FILE', File.join(Dir.mktmpdir, 's.json'))
383
+ allow(PWN::AI::Agent::Reward).to receive(:reflect_available?).and_return(false)
384
+ klass = PWN::AI::Agent::Reward
385
+ src = File.read(klass.method(:judge).source_location.first)
386
+ expect(src).not_to include('llm_judge(request: request, final: final, trace: trace, plan: opts[:plan])')
387
+ expect(src).not_to include('heuristic_judge(request: request, final: final, trace: trace, plan: opts[:plan])')
388
+ request = 'using hping3 what live hosts can you find in this subnet and write /tmp/x.json'
389
+ final = 'Live hosts: 10.1.2.3. Verified. Wrote /tmp/x.json. 4 hosts up. rspec passed.'
390
+ trace = [
391
+ '{"success":true,"result":{"stdout":"10.1.2.3 up","exit":0},"effect":"eval"}',
392
+ '{"success":true,"result":{"stdout":"wrote /tmp/x.json","exit":0},"effect":"write"}'
393
+ ]
394
+ a = klass.judge(request: request, final: final, trace: trace, commit: false)
395
+ b = klass.judge(request: request, final: final, trace: trace, plan: ['Carry out the core work'], commit: false)
396
+ c = klass.judge(request: request, final: final, trace: trace, plan: ['Enumerate subdomains', 'Compile writeups'], commit: false)
397
+ expect(a[:score]).to eq(b[:score])
398
+ expect(b[:score]).to eq(c[:score])
399
+ expect(a[:score]).to be >= 0.6
400
+ expect(a[:verdict].to_s).to eq('solved')
401
+ end
402
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::CSV do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::CSV
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::CSV
13
+ expect(help_response).to respond_to :help
14
+ end
15
+
16
+ it 'should respond to generate' do
17
+ expect(PWN::Reports::CSV).to respond_to :generate
18
+ end
19
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'json'
5
+ require 'csv'
6
+ require 'tmpdir'
7
+
8
+ describe 'PWN::Reports format generators' do
9
+ let(:payload) do
10
+ {
11
+ title: 'PWN Format Spec',
12
+ report_name: 'pwn_format_spec',
13
+ executive_summary: 'One finding.',
14
+ findings: [
15
+ {
16
+ id: 'CFG-001',
17
+ title: 'Missing Security Headers',
18
+ severity: 'Low',
19
+ cvss: 4.3,
20
+ description: 'No X-Frame-Options',
21
+ poc: 'GET /',
22
+ recommendation: 'Add headers'
23
+ }
24
+ ]
25
+ }
26
+ end
27
+
28
+ {
29
+ PDF: { ext: 'pdf', const: 'PDF' },
30
+ HTML: { ext: 'html', const: 'HTML' },
31
+ Markdown: { ext: 'md', const: 'Markdown' },
32
+ XML: { ext: 'xml', const: 'XML' },
33
+ CSV: { ext: 'csv', const: 'CSV' },
34
+ JSON: { ext: 'json', const: 'JSON' }
35
+ }.each do |label, meta|
36
+ describe "PWN::Reports::#{meta[:const]}" do
37
+ it 'responds to generate, authors, and help' do
38
+ klass = PWN::Reports.const_get(meta[:const])
39
+ expect(klass).to respond_to(:generate)
40
+ expect(klass).to respond_to(:authors)
41
+ expect(klass).to respond_to(:help)
42
+ end
43
+
44
+ it "writes a .#{meta[:ext]} report via generate" do
45
+ klass = PWN::Reports.const_get(meta[:const])
46
+ Dir.mktmpdir('pwn_report_fmt') do |dir|
47
+ path = klass.generate(
48
+ dir_path: dir,
49
+ report_name: 'pwn_format_spec',
50
+ results_hash: payload
51
+ )
52
+ expect(path).to eq(File.join(dir, "pwn_format_spec.#{meta[:ext]}"))
53
+ expect(File.file?(path)).to eq(true)
54
+ expect(File.size(path)).to be > 0
55
+ body = File.binread(path)
56
+ case label
57
+ when :PDF
58
+ expect(body.start_with?('%PDF')).to eq(true)
59
+ when :HTML
60
+ expect(body).to match(/<!DOCTYPE html>/i)
61
+ expect(body).to include('Missing Security Headers')
62
+ when :Markdown
63
+ expect(body).to include('# PWN Format Spec')
64
+ expect(body).to include('Missing Security Headers')
65
+ when :XML
66
+ expect(body).to include('<?xml')
67
+ expect(body).to include('Missing Security Headers')
68
+ when :CSV
69
+ rows = CSV.parse(body)
70
+ expect(rows.first).to include('title')
71
+ expect(body).to include('Missing Security Headers')
72
+ when :JSON
73
+ parsed = JSON.parse(body)
74
+ expect(parsed['title']).to eq('PWN Format Spec')
75
+ expect(parsed['findings'].first['id']).to eq('CFG-001')
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ it 'honours an explicit path: override' do
83
+ Dir.mktmpdir('pwn_report_path') do |dir|
84
+ out = File.join(dir, 'custom.json')
85
+ path = PWN::Reports::JSON.generate(path: out, results_hash: payload)
86
+ expect(path).to eq(out)
87
+ expect(JSON.parse(File.read(out))['title']).to eq('PWN Format Spec')
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::HTML do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::HTML
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::HTML
13
+ expect(help_response).to respond_to :help
14
+ end
15
+
16
+ it 'should respond to generate' do
17
+ expect(PWN::Reports::HTML).to respond_to :generate
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::JSON do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::JSON
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::JSON
13
+ expect(help_response).to respond_to :help
14
+ end
15
+
16
+ it 'should respond to generate' do
17
+ expect(PWN::Reports::JSON).to respond_to :generate
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::Markdown do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::Markdown
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::Markdown
13
+ expect(help_response).to respond_to :help
14
+ end
15
+
16
+ it 'should respond to generate' do
17
+ expect(PWN::Reports::Markdown).to respond_to :generate
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::PDF do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::PDF
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::PDF
13
+ expect(help_response).to respond_to :help
14
+ end
15
+
16
+ it 'should respond to generate' do
17
+ expect(PWN::Reports::PDF).to respond_to :generate
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::XML do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::XML
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::XML
13
+ expect(help_response).to respond_to :help
14
+ end
15
+
16
+ it 'should respond to generate' do
17
+ expect(PWN::Reports::XML).to respond_to :generate
18
+ end
19
+ end
@@ -40,6 +40,7 @@
40
40
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Curriculum.ollama_create Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Curriculum.ollama_create`: "}]}
41
41
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Curriculum.practice Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Curriculum.practice`: "}]}
42
42
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Curriculum.practice_kpi Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Curriculum.practice_kpi`: "}]}
43
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Curriculum.practice_poc_ok? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Curriculum.practice_poc_ok?`: "}]}
43
44
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Curriculum.practice_skip? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Curriculum.practice_skip?`: "}]}
44
45
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Curriculum.preference_balance Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Curriculum.preference_balance`: "}]}
45
46
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Curriculum.preference_diet_gate Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Curriculum.preference_diet_gate`: "}]}
@@ -309,6 +310,7 @@
309
310
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.update_skill Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.update_skill`: "}]}
310
311
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.verdict_for_score Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.verdict_for_score`: "}]}
311
312
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.weighted_judge_mean Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.weighted_judge_mean`: "}]}
313
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.abs_paths Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.abs_paths`: "}]}
312
314
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.active_engine Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.active_engine`: "}]}
313
315
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.agent_flag Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.agent_flag`: "}]}
314
316
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.answer_greeting Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.answer_greeting`: "}]}
@@ -327,6 +329,7 @@
327
329
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.call_engine Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.call_engine`: Supported Method Parameters\n\nmsg = PWN::AI::Agent::Loop.call_engine(\n\nmessages: 'required - OpenAI-format messages array',\ntools: 'optional - OpenAI tools array'\n\n)\n\nReturns a normalised assistant message hash:\n\n{ role: 'assistant', content: String|nil,\n tool_calls: [ {id:, type:'function', function:{name:, arguments:}} ],\n _native_content: <provider raw> (when adapter needs round-trip) }\n"}]}
328
330
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.catalog_lookup? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.catalog_lookup?`: "}]}
329
331
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.chat_response_history Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.chat_response_history`: "}]}
332
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.checkpoint_result Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.checkpoint_result`: "}]}
330
333
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.compact_history! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.compact_history!`: "}]}
331
334
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.debug_final_text! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.debug_final_text!`: "}]}
332
335
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.debug_msgs_line Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.debug_msgs_line`: "}]}
@@ -335,8 +338,15 @@
335
338
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.debug_snippet Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.debug_snippet`: "}]}
336
339
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.debug_tool_io! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.debug_tool_io!`: "}]}
337
340
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.debug_tools_line Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.debug_tools_line`: "}]}
341
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.declared_contract Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.declared_contract`: "}]}
342
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.declared_contract_unsatisfied? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.declared_contract_unsatisfied?`: "}]}
343
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.declared_deliverables Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.declared_deliverables`: "}]}
344
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.declared_hosts_missing? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.declared_hosts_missing?`: "}]}
345
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.declared_min_seconds Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.declared_min_seconds`: "}]}
346
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.declared_skills_missing? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.declared_skills_missing?`: "}]}
338
347
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.default_interactive_toolsets Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.default_interactive_toolsets`: "}]}
339
348
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.degrade_text_only Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.degrade_text_only`: "}]}
349
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.deliverable_missing? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.deliverable_missing?`: "}]}
340
350
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.dispatch_fail_n Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.dispatch_fail_n`: "}]}
341
351
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.duration_unsatisfied? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.duration_unsatisfied?`: "}]}
342
352
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.emit_task_summary Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.emit_task_summary`: "}]}
@@ -349,6 +359,7 @@
349
359
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.guard_repeated_failure Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.guard_repeated_failure`: "}]}
350
360
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.help Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.help`: "}]}
351
361
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.incomplete_final? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.incomplete_final?`: "}]}
362
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.infer_deliverables Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.infer_deliverables`: "}]}
352
363
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.inject_task_focus! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.inject_task_focus!`: "}]}
353
364
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.local_engine? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.local_engine?`: "}]}
354
365
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.loud_debug_tui! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.loud_debug_tui!`: "}]}
@@ -361,12 +372,14 @@
361
372
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.mistake_ts Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.mistake_ts`: "}]}
362
373
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.needs_host_work? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.needs_host_work?`: "}]}
363
374
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.no_progress_result Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.no_progress_result`: "}]}
375
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.normalize_contract Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.normalize_contract`: "}]}
364
376
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.normalize_llm Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.normalize_llm`: Supported Method Parameters\n\nmsg = PWN::AI::Agent::Loop.normalize_llm(\n\nresponse: 'required - chat_with_tools response Hash from any provider'\n\n)\n"}]}
365
377
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.note_same_payload! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.note_same_payload!`: "}]}
366
378
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.ollama_wire_messages Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.ollama_wire_messages`: Supported Method Parameters\n\nwire = PWN::AI::Agent::Loop.ollama_wire_messages(\n\nmessages: 'required - in-memory OpenAI-ish messages (may have String args)'\n\n)\n\nReturns a deep-copied array safe for Ollama / Open WebUI ollama/api/chat:\n\nparses JSON-string function.arguments into Hash/Array objects\n\ncoerces nil assistant content to ” when tool_calls present (Open WebUI GenerateChatCompletionForm rejects content:null alone)\n\ndrops _native_content / _text_tool_coerced / thinking private keys\n\nstringifies Hash/Array message content (tool results) to JSON text\n\n"}]}
367
379
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.ollama_wire_tool_call Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.ollama_wire_tool_call`: "}]}
368
380
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.openai_wire_messages Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.openai_wire_messages`: Supported Method Parameters\n\nwire = PWN::AI::Agent::Loop.openai_wire_messages(\n\nmessages: 'required - in-memory OpenAI-ish messages (may have Hash args / internal keys)'\n\n)\n\nReturns a deep-copied array safe for OpenAI / xAI chat.completions:\n\ndrops _native_content / _text_tool_coerced / thinking private keys\n\nstringifies function.arguments maps\n\ncoerces Hash/non-string content to JSON/string (nil kept for assistant tool turns)\n\n"}]}
369
381
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.openai_wire_tool_call Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.openai_wire_tool_call`: "}]}
382
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.parse_contract Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.parse_contract`: "}]}
370
383
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.parse_tool_arguments Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.parse_tool_arguments`: "}]}
371
384
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.payload_sig Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.payload_sig`: "}]}
372
385
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.plan_first Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.plan_first`: "}]}
@@ -381,6 +394,8 @@
381
394
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.run Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.run`: Supported Method Parameters\n\nfinal = PWN::AI::Agent::Loop.run(\n\nrequest: 'required - what the human typed',\nsession_id: 'optional - PWN::Sessions id (transcript is appended to it)',\nenabled_toolsets: 'optional - subset of Registry.toolsets, or nil for all',\non_tool: 'optional - ->(name, args, result) callback for live UI',\nsystem_role_content: 'optional - override default system prompt (built from session_id if not provided)'\n\n)\n"}]}
382
395
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.session_chat_history Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.session_chat_history`: "}]}
383
396
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.should_auto_introspect? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.should_auto_introspect?`: "}]}
397
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.spill_tool_body Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.spill_tool_body`: "}]}
398
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.spill_tool_history! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.spill_tool_history!`: "}]}
384
399
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.stamped_effect Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.stamped_effect`: "}]}
385
400
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.start_debug_session Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.start_debug_session`: "}]}
386
401
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.stringify_tool_arguments Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.stringify_tool_arguments`: "}]}
@@ -468,6 +483,7 @@
468
483
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Policy.bump_visit! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Policy.bump_visit!`: "}]}
469
484
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Policy.cold? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Policy.cold?`: "}]}
470
485
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Policy.completeness_bin Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Policy.completeness_bin`: "}]}
486
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Policy.contract_fields_met Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Policy.contract_fields_met`: "}]}
471
487
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Policy.current_episode Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Policy.current_episode`: "}]}
472
488
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Policy.current_state Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Policy.current_state`: "}]}
473
489
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Policy.detach_episode! Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Policy.detach_episode!`: "}]}
@@ -2467,20 +2483,45 @@
2467
2483
  {"messages":[{"role":"user","content":"PWN::Plugins::Zaproxy.stop Usage"},{"role":"assistant","content":"`PWN::Plugins::Zaproxy.stop`: Supported Method Parameters\n\nPWN::Plugins::Zaproxy.stop(\n\nzap_obj: 'required - zap_obj returned from #open method'\n\n)\n"}]}
2468
2484
  {"messages":[{"role":"user","content":"PWN::Plugins::Zaproxy.tamper Usage"},{"role":"assistant","content":"`PWN::Plugins::Zaproxy.tamper`: Supported Method Parameters\n\nPWN::Plugins::Zaproxy.tamper(\n\nzap_obj: 'required - zap_obj returned from #open method',\ndomain: 'required - FQDN to tamper (e.g. test.domain.local)',\nenabled: 'optional - boolean (defaults to true)'\n\n)\n"}]}
2469
2485
  {"messages":[{"role":"user","content":"PWN::Plugins::Zaproxy.zap_rest_call Usage"},{"role":"assistant","content":"`PWN::Plugins::Zaproxy.zap_rest_call`: Supported Method Parameters\n\nzap_rest_call(\n\nzap_obj: 'required zap_obj returned from #start method',\nrest_call: 'required rest call to make per the schema',\nhttp_method: 'optional HTTP method (defaults to GET)\nhttp_body: 'optional HTTP body sent in HTTP methods that support it e.g. POST'\n\n)\n"}]}
2470
- {"messages":[{"role":"user","content":"PWN::Reports.authors Usage"},{"role":"assistant","content":"`PWN::Reports.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2486
+ {"messages":[{"role":"user","content":"PWN::Reports.authors Usage"},{"role":"assistant","content":"`PWN::Reports.authors`: "}]}
2471
2487
  {"messages":[{"role":"user","content":"PWN::Reports.help Usage"},{"role":"assistant","content":"`PWN::Reports.help`: "}]}
2488
+ {"messages":[{"role":"user","content":"PWN::Reports.report_payload Usage"},{"role":"assistant","content":"`PWN::Reports.report_payload`: "}]}
2489
+ {"messages":[{"role":"user","content":"PWN::Reports.resolve_path Usage"},{"role":"assistant","content":"`PWN::Reports.resolve_path`: "}]}
2490
+ {"messages":[{"role":"user","content":"PWN::Reports.stringify_keys Usage"},{"role":"assistant","content":"`PWN::Reports.stringify_keys`: "}]}
2472
2491
  {"messages":[{"role":"user","content":"PWN::Reports::AIRedTeam.authors Usage"},{"role":"assistant","content":"`PWN::Reports::AIRedTeam.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2473
2492
  {"messages":[{"role":"user","content":"PWN::Reports::AIRedTeam.generate Usage"},{"role":"assistant","content":"`PWN::Reports::AIRedTeam.generate`: Supported Method Parameters\n\nPWN::Reports::AIRedTeam.generate(\n\ndir_path: 'optional - Directory path to save the report (defaults to .)',\nresults_hash: 'optional - Hash containing the results of the AI RedTeam analysis (defaults to empty hash structure)',\nreport_name: 'optional - Name of the report file (defaults to current directory name)'\n\n)\n"}]}
2474
2493
  {"messages":[{"role":"user","content":"PWN::Reports::AIRedTeam.help Usage"},{"role":"assistant","content":"`PWN::Reports::AIRedTeam.help`: "}]}
2494
+ {"messages":[{"role":"user","content":"PWN::Reports::CSV.authors Usage"},{"role":"assistant","content":"`PWN::Reports::CSV.authors`: "}]}
2495
+ {"messages":[{"role":"user","content":"PWN::Reports::CSV.generate Usage"},{"role":"assistant","content":"`PWN::Reports::CSV.generate`: "}]}
2496
+ {"messages":[{"role":"user","content":"PWN::Reports::CSV.help Usage"},{"role":"assistant","content":"`PWN::Reports::CSV.help`: "}]}
2475
2497
  {"messages":[{"role":"user","content":"PWN::Reports::Fuzz.authors Usage"},{"role":"assistant","content":"`PWN::Reports::Fuzz.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2476
2498
  {"messages":[{"role":"user","content":"PWN::Reports::Fuzz.generate Usage"},{"role":"assistant","content":"`PWN::Reports::Fuzz.generate`: Supported Method Parameters\n\nPWN::Reports::Fuzz.generate(\n\ndir_path: dir_path,\nresults_hash: results_hash,\nchar_encoding: 'optional - character encoding returned by PWN::Plugins::Char.list_encoders (defaults to UTF-8)'\n\n)\n"}]}
2477
2499
  {"messages":[{"role":"user","content":"PWN::Reports::Fuzz.help Usage"},{"role":"assistant","content":"`PWN::Reports::Fuzz.help`: "}]}
2500
+ {"messages":[{"role":"user","content":"PWN::Reports::HTML.authors Usage"},{"role":"assistant","content":"`PWN::Reports::HTML.authors`: "}]}
2501
+ {"messages":[{"role":"user","content":"PWN::Reports::HTML.generate Usage"},{"role":"assistant","content":"`PWN::Reports::HTML.generate`: "}]}
2502
+ {"messages":[{"role":"user","content":"PWN::Reports::HTML.h Usage"},{"role":"assistant","content":"`PWN::Reports::HTML.h`: "}]}
2503
+ {"messages":[{"role":"user","content":"PWN::Reports::HTML.help Usage"},{"role":"assistant","content":"`PWN::Reports::HTML.help`: "}]}
2504
+ {"messages":[{"role":"user","content":"PWN::Reports::HTML.summary_html Usage"},{"role":"assistant","content":"`PWN::Reports::HTML.summary_html`: "}]}
2478
2505
  {"messages":[{"role":"user","content":"PWN::Reports::HTMLFooter.authors Usage"},{"role":"assistant","content":"`PWN::Reports::HTMLFooter.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2479
2506
  {"messages":[{"role":"user","content":"PWN::Reports::HTMLFooter.generate Usage"},{"role":"assistant","content":"`PWN::Reports::HTMLFooter.generate`: Supported Method Parameters\n\nPWN::Reports::HTMLFooter.generate(\n\ncolumn_names: 'required - array of column names to use in the report table',\ndriver_src_uri: 'required - pwn driver source code uri',\n\n)\n"}]}
2480
2507
  {"messages":[{"role":"user","content":"PWN::Reports::HTMLFooter.help Usage"},{"role":"assistant","content":"`PWN::Reports::HTMLFooter.help`: "}]}
2481
2508
  {"messages":[{"role":"user","content":"PWN::Reports::HTMLHeader.authors Usage"},{"role":"assistant","content":"`PWN::Reports::HTMLHeader.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2482
2509
  {"messages":[{"role":"user","content":"PWN::Reports::HTMLHeader.generate Usage"},{"role":"assistant","content":"`PWN::Reports::HTMLHeader.generate`: Supported Method Parameters\n\nPWN::Reports::HTMLHeader.generate(\n\ncolumn_names: 'required - array of column names to use in the report table',\ndriver_src_uri: 'required - pwn driver source code uri',\n\n)\n"}]}
2483
2510
  {"messages":[{"role":"user","content":"PWN::Reports::HTMLHeader.help Usage"},{"role":"assistant","content":"`PWN::Reports::HTMLHeader.help`: "}]}
2511
+ {"messages":[{"role":"user","content":"PWN::Reports::JSON.authors Usage"},{"role":"assistant","content":"`PWN::Reports::JSON.authors`: "}]}
2512
+ {"messages":[{"role":"user","content":"PWN::Reports::JSON.generate Usage"},{"role":"assistant","content":"`PWN::Reports::JSON.generate`: "}]}
2513
+ {"messages":[{"role":"user","content":"PWN::Reports::JSON.help Usage"},{"role":"assistant","content":"`PWN::Reports::JSON.help`: "}]}
2514
+ {"messages":[{"role":"user","content":"PWN::Reports::Markdown.authors Usage"},{"role":"assistant","content":"`PWN::Reports::Markdown.authors`: "}]}
2515
+ {"messages":[{"role":"user","content":"PWN::Reports::Markdown.generate Usage"},{"role":"assistant","content":"`PWN::Reports::Markdown.generate`: "}]}
2516
+ {"messages":[{"role":"user","content":"PWN::Reports::Markdown.help Usage"},{"role":"assistant","content":"`PWN::Reports::Markdown.help`: "}]}
2517
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.assemble_pdf Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.assemble_pdf`: "}]}
2518
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.authors Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.authors`: "}]}
2519
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.generate Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.generate`: "}]}
2520
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.help Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.help`: "}]}
2521
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.pdf_escape Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.pdf_escape`: "}]}
2522
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.pdf_stream Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.pdf_stream`: "}]}
2523
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.render_pdf Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.render_pdf`: "}]}
2524
+ {"messages":[{"role":"user","content":"PWN::Reports::PDF.wrap_line Usage"},{"role":"assistant","content":"`PWN::Reports::PDF.wrap_line`: "}]}
2484
2525
  {"messages":[{"role":"user","content":"PWN::Reports::Phone.authors Usage"},{"role":"assistant","content":"`PWN::Reports::Phone.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2485
2526
  {"messages":[{"role":"user","content":"PWN::Reports::Phone.generate Usage"},{"role":"assistant","content":"`PWN::Reports::Phone.generate`: Supported Method Parameters\n\nPWN::Reports::Phone.generate(\n\ndir_path: dir_path,\nresults_hash: results_hash\n\n)\n"}]}
2486
2527
  {"messages":[{"role":"user","content":"PWN::Reports::Phone.help Usage"},{"role":"assistant","content":"`PWN::Reports::Phone.help`: "}]}
@@ -2490,6 +2531,10 @@
2490
2531
  {"messages":[{"role":"user","content":"PWN::Reports::URIBuster.authors Usage"},{"role":"assistant","content":"`PWN::Reports::URIBuster.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2491
2532
  {"messages":[{"role":"user","content":"PWN::Reports::URIBuster.generate Usage"},{"role":"assistant","content":"`PWN::Reports::URIBuster.generate`: Supported Method Parameters\n\nPWN::Reports::URIBuster.generate(\n\ndir_path: dir_path,\nresults_hash: results_hash\n\n)\n"}]}
2492
2533
  {"messages":[{"role":"user","content":"PWN::Reports::URIBuster.help Usage"},{"role":"assistant","content":"`PWN::Reports::URIBuster.help`: "}]}
2534
+ {"messages":[{"role":"user","content":"PWN::Reports::XML.authors Usage"},{"role":"assistant","content":"`PWN::Reports::XML.authors`: "}]}
2535
+ {"messages":[{"role":"user","content":"PWN::Reports::XML.generate Usage"},{"role":"assistant","content":"`PWN::Reports::XML.generate`: "}]}
2536
+ {"messages":[{"role":"user","content":"PWN::Reports::XML.help Usage"},{"role":"assistant","content":"`PWN::Reports::XML.help`: "}]}
2537
+ {"messages":[{"role":"user","content":"PWN::Reports::XML.safe_tag Usage"},{"role":"assistant","content":"`PWN::Reports::XML.safe_tag`: "}]}
2493
2538
  {"messages":[{"role":"user","content":"PWN::SAST.authors Usage"},{"role":"assistant","content":"`PWN::SAST.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
2494
2539
  {"messages":[{"role":"user","content":"PWN::SAST.help Usage"},{"role":"assistant","content":"`PWN::SAST.help`: "}]}
2495
2540
  {"messages":[{"role":"user","content":"PWN::SAST::AMQPConnectAsGuest.authors Usage"},{"role":"assistant","content":"`PWN::SAST::AMQPConnectAsGuest.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
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.705
4
+ version: 0.5.707
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -505,14 +505,14 @@ dependencies:
505
505
  requirements:
506
506
  - - '='
507
507
  - !ruby/object:Gem::Version
508
- version: 1.3.0
508
+ version: 1.4.0
509
509
  type: :runtime
510
510
  prerelease: false
511
511
  version_requirements: !ruby/object:Gem::Requirement
512
512
  requirements:
513
513
  - - '='
514
514
  - !ruby/object:Gem::Version
515
- version: 1.3.0
515
+ version: 1.4.0
516
516
  - !ruby/object:Gem::Dependency
517
517
  name: meshtastic
518
518
  requirement: !ruby/object:Gem::Requirement
@@ -5264,11 +5264,16 @@ files:
5264
5264
  - etc/default_skills/pwn/reports/SKILL.md
5265
5265
  - etc/default_skills/pwn/reports/ai_red_team/SKILL.md
5266
5266
  - etc/default_skills/pwn/reports/ai_red_team/references/urls.md
5267
+ - etc/default_skills/pwn/reports/csv/SKILL.md
5267
5268
  - etc/default_skills/pwn/reports/fuzz/SKILL.md
5268
5269
  - etc/default_skills/pwn/reports/fuzz/references/urls.md
5270
+ - etc/default_skills/pwn/reports/html/SKILL.md
5269
5271
  - etc/default_skills/pwn/reports/html_footer/SKILL.md
5270
5272
  - etc/default_skills/pwn/reports/html_header/SKILL.md
5271
5273
  - etc/default_skills/pwn/reports/html_header/references/urls.md
5274
+ - etc/default_skills/pwn/reports/json/SKILL.md
5275
+ - etc/default_skills/pwn/reports/markdown/SKILL.md
5276
+ - etc/default_skills/pwn/reports/pdf/SKILL.md
5272
5277
  - etc/default_skills/pwn/reports/phone/SKILL.md
5273
5278
  - etc/default_skills/pwn/reports/phone/references/urls.md
5274
5279
  - etc/default_skills/pwn/reports/references/urls.md
@@ -5276,6 +5281,7 @@ files:
5276
5281
  - etc/default_skills/pwn/reports/sast/references/urls.md
5277
5282
  - etc/default_skills/pwn/reports/uri_buster/SKILL.md
5278
5283
  - etc/default_skills/pwn/reports/uri_buster/references/urls.md
5284
+ - etc/default_skills/pwn/reports/xml/SKILL.md
5279
5285
  - etc/default_skills/pwn/sast/SKILL.md
5280
5286
  - etc/default_skills/pwn/sast/amqp_connect_as_guest/SKILL.md
5281
5287
  - etc/default_skills/pwn/sast/amqp_connect_as_guest/references/security.md
@@ -6086,12 +6092,18 @@ files:
6086
6092
  - lib/pwn/plugins/zaproxy.rb
6087
6093
  - lib/pwn/reports.rb
6088
6094
  - lib/pwn/reports/ai_red_team.rb
6095
+ - lib/pwn/reports/csv.rb
6089
6096
  - lib/pwn/reports/fuzz.rb
6097
+ - lib/pwn/reports/html.rb
6090
6098
  - lib/pwn/reports/html_footer.rb
6091
6099
  - lib/pwn/reports/html_header.rb
6100
+ - lib/pwn/reports/json.rb
6101
+ - lib/pwn/reports/markdown.rb
6102
+ - lib/pwn/reports/pdf.rb
6092
6103
  - lib/pwn/reports/phone.rb
6093
6104
  - lib/pwn/reports/sast.rb
6094
6105
  - lib/pwn/reports/uri_buster.rb
6106
+ - lib/pwn/reports/xml.rb
6095
6107
  - lib/pwn/sast.rb
6096
6108
  - lib/pwn/sast/amqp_connect_as_guest.rb
6097
6109
  - lib/pwn/sast/apache_file_system_util_api.rb
@@ -6572,12 +6584,19 @@ files:
6572
6584
  - spec/lib/pwn/plugins/zaproxy_spec.rb
6573
6585
  - spec/lib/pwn/plugins_spec.rb
6574
6586
  - spec/lib/pwn/reports/ai_red_team_spec.rb
6587
+ - spec/lib/pwn/reports/csv_spec.rb
6588
+ - spec/lib/pwn/reports/formats_spec.rb
6575
6589
  - spec/lib/pwn/reports/fuzz_spec.rb
6576
6590
  - spec/lib/pwn/reports/html_footer_spec.rb
6577
6591
  - spec/lib/pwn/reports/html_header_spec.rb
6592
+ - spec/lib/pwn/reports/html_spec.rb
6593
+ - spec/lib/pwn/reports/json_spec.rb
6594
+ - spec/lib/pwn/reports/markdown_spec.rb
6595
+ - spec/lib/pwn/reports/pdf_spec.rb
6578
6596
  - spec/lib/pwn/reports/phone_spec.rb
6579
6597
  - spec/lib/pwn/reports/sast_spec.rb
6580
6598
  - spec/lib/pwn/reports/uri_buster_spec.rb
6599
+ - spec/lib/pwn/reports/xml_spec.rb
6581
6600
  - spec/lib/pwn/reports_spec.rb
6582
6601
  - spec/lib/pwn/sast/amqp_connect_as_guest_spec.rb
6583
6602
  - spec/lib/pwn/sast/apache_file_system_util_api_spec.rb