git-markdown 0.1.0

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.
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitMarkdown
4
+ module Providers
5
+ class GitHub < Base
6
+ def fetch_pull_request(owner, repo, number)
7
+ path = "/repos/#{owner}/#{repo}/pulls/#{number}"
8
+ response = client.get(path)
9
+
10
+ raise NotFoundError, "Pull request #{owner}/#{repo}##{number} not found" if response.not_found?
11
+ raise ApiError, "Failed to fetch PR: #{response.error_message}" unless response.success?
12
+
13
+ Models::PullRequest.from_api(response.data)
14
+ end
15
+
16
+ def fetch_comments(owner, repo, number)
17
+ path = "/repos/#{owner}/#{repo}/issues/#{number}/comments"
18
+ comments = fetch_all_pages(path)
19
+
20
+ comments.map { |data| Models::Comment.from_api(data) }
21
+ end
22
+
23
+ def fetch_reviews(owner, repo, number)
24
+ path = "/repos/#{owner}/#{repo}/pulls/#{number}/reviews"
25
+ reviews = fetch_all_pages(path)
26
+
27
+ reviews.map do |review_data|
28
+ review = Models::Review.from_api(review_data)
29
+ review.comments = fetch_review_comments(owner, repo, review.id)
30
+ review
31
+ end
32
+ end
33
+
34
+ def fetch_review_comments(owner, repo, review_id)
35
+ path = "/repos/#{owner}/#{repo}/pulls/comments"
36
+ all_comments = fetch_all_pages(path)
37
+
38
+ all_comments
39
+ .select { |c| c["pull_request_review_id"] == review_id }
40
+ .map { |data| Models::Comment.from_api(data) }
41
+ end
42
+
43
+ private
44
+
45
+ def client
46
+ @client ||= Api::Client.new(
47
+ base_url: @config.api_url,
48
+ token: @config.token
49
+ )
50
+ end
51
+
52
+ def fetch_all_pages(path, params = {})
53
+ results = []
54
+ page = 1
55
+ per_page = 100
56
+
57
+ loop do
58
+ response = client.get(path, params.merge(page: page, per_page: per_page))
59
+ break unless response.success?
60
+
61
+ data = response.data
62
+ break if data.empty?
63
+
64
+ results.concat(data)
65
+ break if data.length < per_page
66
+
67
+ page += 1
68
+ end
69
+
70
+ results
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitMarkdown
4
+ class RemoteParser
5
+ PATTERNS = {
6
+ github: %r{(?:github\.com|github\.enterprise)[/:]([^/]+)/([^/]+?)(?:\.git)?$},
7
+ gitlab: %r{gitlab\.com[/:]([^/]+)/([^/]+?)(?:\.git)?$}
8
+ }
9
+
10
+ attr_reader :url, :provider, :owner, :repo
11
+
12
+ def initialize(url)
13
+ @url = url
14
+ parse!
15
+ end
16
+
17
+ def self.parse(url)
18
+ new(url)
19
+ end
20
+
21
+ def self.from_git_remote(remote = "origin")
22
+ url = git_remote_url(remote)
23
+ return nil if url.nil? || url.empty?
24
+
25
+ new(url)
26
+ end
27
+
28
+ def valid?
29
+ !@provider.nil?
30
+ end
31
+
32
+ def full_name
33
+ "#{@owner}/#{@repo}" if valid?
34
+ end
35
+
36
+ private
37
+
38
+ def parse!
39
+ PATTERNS.each do |provider_name, pattern|
40
+ next unless (match = @url.match(pattern))
41
+
42
+ @provider = provider_name
43
+ @owner = match[1]
44
+ @repo = match[2]
45
+ break
46
+ end
47
+ end
48
+
49
+ private_class_method def self.git_remote_url(remote)
50
+ output = `git remote get-url #{remote} 2>/dev/null`
51
+ output.strip if $?.success?
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitMarkdown
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "io/console"
4
+ require "json"
5
+ require "net/http"
6
+ require "uri"
7
+ require "erb"
8
+ require "fileutils"
9
+
10
+ require "thor"
11
+
12
+ require_relative "git/markdown/version"
13
+ require_relative "git/markdown/configuration"
14
+ require_relative "git/markdown/credentials"
15
+ require_relative "git/markdown/remote_parser"
16
+ require_relative "git/markdown/providers/base"
17
+ require_relative "git/markdown/providers/github"
18
+ require_relative "git/markdown/api/client"
19
+ require_relative "git/markdown/api/response"
20
+ require_relative "git/markdown/models/pull_request"
21
+ require_relative "git/markdown/models/comment"
22
+ require_relative "git/markdown/models/review"
23
+ require_relative "git/markdown/markdown/generator"
24
+ require_relative "git/markdown/cli"
25
+
26
+ module GitMarkdown
27
+ class Error < StandardError; end
28
+
29
+ class AuthenticationError < Error; end
30
+
31
+ class NotFoundError < Error; end
32
+
33
+ class ApiError < Error; end
34
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-markdown
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ethos-link
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: thor
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '6.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '13.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '13.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: standard
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: vcr
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '6.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '6.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: webmock
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.0'
96
+ description: A CLI tool that fetches GitHub pull requests and converts them to Markdown
97
+ format, perfect for local AI assistants like opencode and codex.
98
+ executables:
99
+ - git-markdown
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - AGENTS.md
104
+ - CHANGELOG.md
105
+ - Gemfile
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - bin/git-markdown
110
+ - cliff.toml
111
+ - git-markdown.gemspec
112
+ - lefthook.yml
113
+ - lib/git/markdown/api/client.rb
114
+ - lib/git/markdown/api/response.rb
115
+ - lib/git/markdown/cli.rb
116
+ - lib/git/markdown/configuration.rb
117
+ - lib/git/markdown/credentials.rb
118
+ - lib/git/markdown/markdown/generator.rb
119
+ - lib/git/markdown/markdown/templates/default.erb
120
+ - lib/git/markdown/models/comment.rb
121
+ - lib/git/markdown/models/pull_request.rb
122
+ - lib/git/markdown/models/review.rb
123
+ - lib/git/markdown/providers/base.rb
124
+ - lib/git/markdown/providers/github.rb
125
+ - lib/git/markdown/remote_parser.rb
126
+ - lib/git/markdown/version.rb
127
+ - lib/git_markdown.rb
128
+ homepage: https://github.com/ethos-link/git-markdown
129
+ licenses:
130
+ - MIT
131
+ metadata:
132
+ homepage_uri: https://github.com/ethos-link/git-markdown
133
+ source_code_uri: https://github.com/ethos-link/git-markdown
134
+ changelog_uri: https://github.com/ethos-link/git-markdown/blob/main/CHANGELOG.md
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 3.0.0
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubygems_version: 3.6.9
150
+ specification_version: 4
151
+ summary: Convert GitHub PRs to Markdown for local AI code review
152
+ test_files: []