github-mobile-reader 0.1.0 β 0.1.2
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.
- package/README.ko.md +585 -0
- package/README.md +157 -84
- package/dist/action.js +177 -30
- package/dist/cli.js +552 -0
- package/dist/index.d.mts +15 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.js +198 -23
- package/dist/index.mjs +188 -22
- package/package.json +7 -3
package/README.ko.md
ADDED
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
# π github-mobile-reader
|
|
2
|
+
|
|
3
|
+
> `github-mobile-reader`λ git diffλ₯Ό κΉλνκ² μΈλ‘ μ€ν¬λ‘€λ‘ μ½μ μ μλ Markdown λ¬Έμλ‘ λ³νν©λλ€ β λ μ΄μ μ’μ° νμΉμ€μ΄λ κ°λ‘ μ€μμ΄νλ νμ μμ΅λλ€.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/github-mobile-reader)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
|
|
9
|
+
> μμ΄ λ¬Έμλ [README.md](./README.md)μμ νμΈνμΈμ.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## λ¬Έμ μν©
|
|
14
|
+
|
|
15
|
+
GitHubμ λͺ¨λ°μΌ μΉ λ·°λ μ½λλ₯Ό κ³ μ λλΉμ λͺ¨λ
Έμ€νμ΄μ€ λΈλ‘μΌλ‘ λ λλ§ν©λλ€. κΈ΄ μ€μ κ°λ‘ μ€ν¬λ‘€μ μꡬνκ³ , κΉκ² μ€μ²©λ λ‘μ§μ νλμ νμ
μ΄ λΆκ°λ₯νλ©°, μΆν΄κ·Ό μ§νμ² μμ PR 리뷰λ₯Ό νλ 건 μ¬μ€μ λΆκ°λ₯μ κ°κΉμ΅λλ€.
|
|
16
|
+
|
|
17
|
+
## ν΄κ²°μ±
|
|
18
|
+
|
|
19
|
+
`github-mobile-reader`λ git diffλ₯Ό νμ±ν΄μ **Logical Flow** β λ¨μν μ΄λ€ λ¬Έμκ° λ°λμλμ§κ° μλλΌ *μ½λκ° λ¬΄μμ νλμ§*λ₯Ό 보μ¬μ£Όλ κ°κ²°ν νΈλ¦¬ β λ₯Ό μμ±ν©λλ€. κ²°κ³Όλ¬Όμ μ΄λ€ νλ©΄ λλΉμμλ μμμ μλλ‘ μ½νλ Markdown λ¬Έμμ
λλ€.
|
|
20
|
+
|
|
21
|
+
**Before** (κΈ°μ‘΄ diff, λͺ¨λ°μΌ μΉ):
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
β μ€μμ΄ν β μ€μμ΄ν β μ€μμ΄ν β
|
|
25
|
+
+ const result = data.map(item => item.value).filter(v => v > 10).reduce((a,b) => a+b, 0)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**After** (Reader Markdown):
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
data
|
|
32
|
+
ββ map(item β value)
|
|
33
|
+
ββ filter(callback)
|
|
34
|
+
ββ reduce(callback)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## μ£Όμ κΈ°λ₯
|
|
40
|
+
|
|
41
|
+
- **μμ‘΄μ± μ λ‘ μ½μ΄** β νμλ Node.js β₯ 18μ΄ μλ μ΄λμλ λμν©λλ€
|
|
42
|
+
- **μ΄μ€ μΆλ ₯ ν¬λ§·** β CJS (`require`)μ ESM (`import`) λͺ¨λ μ§μ, TypeScript νμ
ν¬ν¨
|
|
43
|
+
- **CLI** β `npx github-mobile-reader --repo owner/repo --pr 42` λ‘ μ΄λ€ PRμ΄λ μ¦μ λ³ν
|
|
44
|
+
- **GitHub Action** β λ ν¬μ YAML νμΌ νλλ§ μΆκ°νλ©΄ PRλ§λ€ Reader λ¬Έμκ° μλ μμ±λ©λλ€
|
|
45
|
+
- **νμΌλ³ λΆλ¦¬ μΆλ ₯** β λ³κ²½λ JS/TS νμΌλ§λ€ λ
립μ μΈ μΉμ
μΌλ‘ μΆλ ₯
|
|
46
|
+
- **JSX/Tailwind μΈμ** β `.jsx`/`.tsx` νμΌμ μ»΄ν¬λνΈ νΈλ¦¬(`π¨ JSX Structure`)μ Tailwind ν΄λμ€ diff(`π
Style Changes`)λ₯Ό λ³λ μΉμ
μΌλ‘ λΆλ¦¬ μΆλ ₯
|
|
47
|
+
- **μλ°©ν₯ diff μΆμ ** β μΆκ°λ μ½λμ μμ λ μ½λλ₯Ό κ°κ° λ³λ μΉμ
μΌλ‘ νμ
|
|
48
|
+
- **보μμ μ€κ³** β ν¨ν΄μ΄ μ λ§€ν λλ μλͺ»λ μ 보λ₯Ό 보μ¬μ£Όλ λμ λ 보μ¬μ€λλ€
|
|
49
|
+
- **보μ κΈ°λ³Έκ°** β ν ν°μ `$GITHUB_TOKEN` νκ²½λ³μλ‘λ§ μ½μ β μ
Έ νμ€ν 리λ `ps` λͺ©λ‘μ λ
ΈμΆλλ `--token` νλκ·Έ μμ
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## λͺ©μ°¨
|
|
54
|
+
|
|
55
|
+
1. [λΉ λ₯Έ μμ](#λΉ λ₯Έ-μμ)
|
|
56
|
+
2. [μΈμ΄ μ§μ](#μΈμ΄-μ§μ)
|
|
57
|
+
3. [CLI μ¬μ©λ²](#cli-μ¬μ©λ²)
|
|
58
|
+
4. [GitHub Action (κΆμ₯)](#github-action-κΆμ₯)
|
|
59
|
+
5. [npm λΌμ΄λΈλ¬λ¦¬ μ¬μ©λ²](#npm-λΌμ΄λΈλ¬λ¦¬-μ¬μ©λ²)
|
|
60
|
+
6. [μΆλ ₯ νμ](#μΆλ ₯-νμ)
|
|
61
|
+
7. [API λ νΌλ°μ€](#api-λ νΌλ°μ€)
|
|
62
|
+
8. [νμ λμ μ리](#νμ-λμ-μ리)
|
|
63
|
+
9. [κΈ°μ¬νκΈ°](#κΈ°μ¬νκΈ°)
|
|
64
|
+
10. [λΌμ΄μ μ€](#λΌμ΄μ μ€)
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## CLI μ¬μ©λ²
|
|
69
|
+
|
|
70
|
+
ν°λ―Έλμμ `github-mobile-reader`λ₯Ό λ°λ‘ μ€νν μ μμ΅λλ€ β λ³λ μ€μ νμΌ λΆνμ. GitHubμμ PR diffλ₯Ό λ°μ λͺ¨λ°μΌ μΉνμ μΈ MarkdownμΌλ‘ λ³ννκ³ `./reader-output/`μ PRλ³λ‘ νμΌμ μ μ₯ν©λλ€.
|
|
71
|
+
|
|
72
|
+
### μΈμ¦ (ν ν° μ€μ )
|
|
73
|
+
|
|
74
|
+
CLI μ€ν **μ μ** νκ²½λ³μλ‘ GitHub ν ν°μ μ€μ νμΈμ:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
export GITHUB_TOKEN=ghp_xxxx
|
|
78
|
+
npx github-mobile-reader --repo owner/repo --pr 42
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> **보μ μλ΄:** CLIλ `--token` νλκ·Έλ₯Ό μ§μνμ§ μμ΅λλ€. 컀맨λλΌμΈ μΈμλ‘ μν¬λ¦Ώμ μ λ¬νλ©΄ μ
Έ νμ€ν 리μ `ps` μΆλ ₯μ ν ν°μ΄ λ
ΈμΆλ©λλ€. λ°λμ νκ²½λ³μλ₯Ό μ¬μ©νμΈμ.
|
|
82
|
+
|
|
83
|
+
### λ¨μΌ PR
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npx github-mobile-reader --repo owner/repo --pr 42
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### μ΅κ·Ό PR μ 체
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
npx github-mobile-reader --repo owner/repo --all
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### μ΅μ
|
|
96
|
+
|
|
97
|
+
| νλκ·Έ | κΈ°λ³Έκ° | μ€λͺ
|
|
|
98
|
+
| ----------- | ------------------ | ------------------------------------------------------- |
|
|
99
|
+
| `--repo` | *(νμ)* | `owner/repo` νμμ λ ν¬μ§ν 리 |
|
|
100
|
+
| `--pr` | β | νΉμ PR λ²νΈ νλ μ²λ¦¬ |
|
|
101
|
+
| `--all` | β | μ΅κ·Ό PR μ 체 μ²λ¦¬ (`--limit`μ ν¨κ» μ¬μ©) |
|
|
102
|
+
| `--out` | `./reader-output` | μμ±λ `.md` νμΌ μ μ₯ κ²½λ‘ β μλ κ²½λ‘λ§ νμ©, `..` λΆκ° |
|
|
103
|
+
| `--limit` | `10` | `--all` μ¬μ© μ κ°μ Έμ¬ PR μ΅λ κ°μ |
|
|
104
|
+
|
|
105
|
+
ν ν°: `$GITHUB_TOKEN` νκ²½λ³μμμ μ½μ (λ―ΈμΈμ¦ μ 60 req/hr, μΈμ¦ μ 5 000 req/hr).
|
|
106
|
+
|
|
107
|
+
### μΆλ ₯ κ²°κ³Ό
|
|
108
|
+
|
|
109
|
+
PRλ§λ€ `reader-output/pr-<λ²νΈ>.md` νμΌ νλκ° μμ±λ©λλ€.
|
|
110
|
+
|
|
111
|
+
JSX/TSX νμΌμ μΆκ° μΉμ
μ΄ μμ±λ©λλ€:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
# π PR #42 β My Feature
|
|
115
|
+
|
|
116
|
+
## π `src/App.tsx`
|
|
117
|
+
|
|
118
|
+
### π§ Logical Flow β JS λ‘μ§ νΈλ¦¬
|
|
119
|
+
### π¨ JSX Structure β μ»΄ν¬λνΈ κ³μΈ΅ ꡬ쑰 (JSX/TSX μ μ©)
|
|
120
|
+
### π
Style Changes β μΆκ°/μ κ±°λ Tailwind ν΄λμ€ (JSX/TSX μ μ©)
|
|
121
|
+
### β
Added Code
|
|
122
|
+
### β Removed Code
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
> **μ°Έκ³ :** `reader-output/`λ κΈ°λ³Έμ μΌλ‘ `.gitignore`μ ν¬ν¨λμ΄ μμ΅λλ€ β μμ±λ νμΌμ λ‘컬μλ§ μ μ₯λλ©° λ ν¬μ§ν 리μ 컀λ°λμ§ μμ΅λλ€.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## λΉ λ₯Έ μμ
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npm install github-mobile-reader
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
import { generateReaderMarkdown } from "github-mobile-reader";
|
|
137
|
+
import { execSync } from "child_process";
|
|
138
|
+
|
|
139
|
+
const diff = execSync("git diff HEAD~1", { encoding: "utf8" });
|
|
140
|
+
const markdown = generateReaderMarkdown(diff, { file: "src/utils.ts" });
|
|
141
|
+
|
|
142
|
+
console.log(markdown);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## μΈμ΄ μ§μ
|
|
148
|
+
|
|
149
|
+
νμλ μ κ·μ κΈ°λ° ν¨ν΄ λ§€μΉμΌλ‘ λμνλ―λ‘ κΈ°μ μ μΌλ‘λ μ΄λ€ μΈμ΄μ diffλ μ
λ ₯λ°μ μ μμ΅λλ€. λ€λ§ κ°μ§ ν¨ν΄μ΄ JavaScript/TypeScript λ¬Έλ²μ λ§μΆ° μ€κ³λμ΄ μμ΄ **Logical Flow μΆλ ₯ νμ§μ΄ μΈμ΄λ§λ€ λ€λ¦
λλ€**.
|
|
150
|
+
|
|
151
|
+
### νμ¬ μ§μ νν© (v0.1)
|
|
152
|
+
|
|
153
|
+
| μΈμ΄ | νμ₯μ | νμ§ | λΉκ³ |
|
|
154
|
+
| ----------------------- | ------------------------- | :------------: | --------------------------------------------------------------------------- |
|
|
155
|
+
| **JavaScript** | `.js` `.mjs` `.cjs` | β
μμ | νμμ κΈ°μ€ μΈμ΄ |
|
|
156
|
+
| **TypeScript** | `.ts` | β
μμ | JS μμ μ§ν© β λͺ¨λ ν¨ν΄ μ μ© |
|
|
157
|
+
| **React JSX** | `.jsx` | β
μμ | JSμ λμΌν λ¬Έλ² |
|
|
158
|
+
| **React TSX** | `.tsx` | β
μμ | TSμ λμΌν λ¬Έλ² |
|
|
159
|
+
| **Next.js** | `.js` `.ts` `.jsx` `.tsx` | β
μμ | JS/TS μμμ λμνλ νλ μμν¬ |
|
|
160
|
+
| **Java** | `.java` | β οΈ λΆλΆ (~55%) | `if/for/while`κ³Ό 체μ΄λμ λμ; ν¨μ μ μΈ κ°μ§ μ€ν¨ (`const/let/var` μμ) |
|
|
161
|
+
| **C#** | `.cs` | β οΈ λΆλΆ (~35%) | LINQ 체μ΄λ(`.Where().Select()`)μ λμ; `using`/`namespace`/`class` λ―Έκ°μ§ |
|
|
162
|
+
| **C** | `.c` `.h` | β μ΅μ (~15%) | λ§€μΉ ν€μλ μμ; ν¬μΈν° λ¬Έλ²(`->`, `*`) λ―Έμ§μ |
|
|
163
|
+
| **Python, Go, Rust λ±** | β | π μμ | μλ λ‘λλ§΅ μ°Έκ³ |
|
|
164
|
+
|
|
165
|
+
> **μ°Έκ³ :** Java, C#, C νμΌμ κΈ°λ³Έμ μΌλ‘ GitHub Actionμμ μ²λ¦¬λμ§ μμ΅λλ€.
|
|
166
|
+
> Actionμ `.js .jsx .ts .tsx .mjs .cjs` νμΌλ§ μ€μΊν©λλ€ ([`src/action.ts` 66λ²μ§Έ μ€](src/action.ts)).
|
|
167
|
+
> λ€λ₯Έ μΈμ΄λ₯Ό μ²λ¦¬νλ €λ©΄ 컀μ€ν
μ΄λν°κ° νμν©λλ€ ([κΈ°μ¬νκΈ°](#κΈ°μ¬νκΈ°) μ°Έκ³ ).
|
|
168
|
+
|
|
169
|
+
### JS/TS/React/Next.jsκ° μμ μ§μλλ μ΄μ
|
|
170
|
+
|
|
171
|
+
λ€ κ°μ§ λͺ¨λ λμΌν κΈ°λ° λ¬Έλ²μ 곡μ ν©λλ€. νμκ° μΈμνλ κ²:
|
|
172
|
+
|
|
173
|
+
- **λ©μλ 체μ΄λ** β `)`λ `}`λ‘ λλλ μ€ λ€μμ `.`μΌλ‘ μμνλ μ€
|
|
174
|
+
```ts
|
|
175
|
+
data
|
|
176
|
+
.filter((item) => item.active) // P1 체μ΄λμΌλ‘ κ°μ§
|
|
177
|
+
.map((item) => item.value); // P1 체μ΄λμΌλ‘ κ°μ§
|
|
178
|
+
```
|
|
179
|
+
- **ν¨μ μ μΈ** β `const`, `let`, `var`, `function`, `async`
|
|
180
|
+
- **쑰건문** β `if / else / switch`
|
|
181
|
+
- **λ°λ³΅λ¬Έ** β `for / while`
|
|
182
|
+
- **λ
Έμ΄μ¦ νν°λ§** β `import`, `export`, `type`, `interface`, `console.log`λ μλμΌλ‘ μ κ±°
|
|
183
|
+
|
|
184
|
+
### C / C# / Javaκ° μ νμ μΈ μ΄μ
|
|
185
|
+
|
|
186
|
+
μ΄ μΈμ΄λ€μ μ ν¨ν΄μ λν΄ λ€λ₯Έ νκΈ° λ°©μμ μ¬μ©ν©λλ€:
|
|
187
|
+
|
|
188
|
+
| κ°λ
| JS/TS (β
κ°μ§λ¨) | Java / C# / C (β λ―Έκ°μ§) |
|
|
189
|
+
| ------------- | ---------------------- | -------------------------------- |
|
|
190
|
+
| λ³μ μ μΈ | `const x = β¦` | `int x = β¦` / `String x = β¦` |
|
|
191
|
+
| νμ΄ν μ½λ°± | `x => x.value` | μΈμ΄λ§λ€ λλ€ λ¬Έλ² λ€λ¦ |
|
|
192
|
+
| λ
Έμ΄μ¦ import | `import` / `export` | `using` / `#include` / `package` |
|
|
193
|
+
| λΉλκΈ° ν¨μ | `async function foo()` | `async Task<T> Foo()` |
|
|
194
|
+
|
|
195
|
+
### λ‘λλ§΅ β Language Adapter μμ€ν
(v0.2)
|
|
196
|
+
|
|
197
|
+
μΆκ° μΈμ΄ μ§μμ μν΄ **Language Adapter** μν€ν
μ²κ° κ³νλμ΄ μμ΅λλ€:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
src/languages/
|
|
201
|
+
βββ base.adapter.ts β κ³΅ν΅ μΈν°νμ΄μ€
|
|
202
|
+
βββ js-ts.adapter.ts β νμ¬ λ‘μ§ (parser.tsμμ λΆλ¦¬)
|
|
203
|
+
βββ java.adapter.ts β public/private/void μ μΈ, Stream 체μ΄λ
|
|
204
|
+
βββ csharp.adapter.ts β using/namespace, LINQ 체μ΄λ
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
κ° μ΄λν°κ° μ 곡νλ κ²:
|
|
208
|
+
|
|
209
|
+
- μ§μ νμΌ νμ₯μ λͺ©λ‘
|
|
210
|
+
- ν¨μ μ μΈ κ°μ§ ν¨ν΄
|
|
211
|
+
- 무μν ν€μλ λͺ©λ‘ (λ
Έμ΄μ¦)
|
|
212
|
+
- 체μ΄λ νκΈ° λ°©μ (μ (`.`) vs. νμ΄ν(`->`))
|
|
213
|
+
|
|
214
|
+
μΈμ΄ μ΄λν°λ₯Ό κΈ°μ¬νκ³ μΆλ€λ©΄ [κΈ°μ¬νκΈ°](#κΈ°μ¬νκΈ°)λ₯Ό νμΈνμΈμ.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## GitHub Action (κΆμ₯)
|
|
219
|
+
|
|
220
|
+
μ΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ°μ₯ μ¬μ΄ λ°©λ²μ
λλ€. λ§€ PRλ§λ€ μλμΌλ‘:
|
|
221
|
+
|
|
222
|
+
1. λ³κ²½λ `.js` / `.ts` νμΌμ diffλ₯Ό νμ±
|
|
223
|
+
2. `docs/reader/pr-<λ²νΈ>.md` νμΌμ λ ν¬μ μ μ₯
|
|
224
|
+
3. PRμ μμ½ μ½λ©νΈλ₯Ό μλμΌλ‘ λ¬μμ€λλ€
|
|
225
|
+
|
|
226
|
+
### Step 1 β μν¬νλ‘μ° νμΌ μΆκ°
|
|
227
|
+
|
|
228
|
+
λ ν¬μ `.github/workflows/mobile-reader.yml`μ λ§λ€μ΄ μ£ΌμΈμ:
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
name: π Mobile Reader
|
|
232
|
+
|
|
233
|
+
on:
|
|
234
|
+
pull_request:
|
|
235
|
+
types: [opened, synchronize, reopened]
|
|
236
|
+
|
|
237
|
+
permissions:
|
|
238
|
+
contents: write # .md νμΌ μ»€λ°
|
|
239
|
+
pull-requests: write # PR μ½λ©νΈ μμ±
|
|
240
|
+
|
|
241
|
+
jobs:
|
|
242
|
+
generate-reader:
|
|
243
|
+
name: Generate Mobile Reader View
|
|
244
|
+
runs-on: ubuntu-latest
|
|
245
|
+
|
|
246
|
+
steps:
|
|
247
|
+
- name: Checkout
|
|
248
|
+
uses: actions/checkout@v4
|
|
249
|
+
with:
|
|
250
|
+
fetch-depth: 0 # git diffμ μ 체 νμ€ν 리 νμ
|
|
251
|
+
|
|
252
|
+
- name: Generate Reader Markdown
|
|
253
|
+
uses: 3rdflr/github-mobile-reader@v1
|
|
254
|
+
with:
|
|
255
|
+
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
256
|
+
base_branch: ${{ github.base_ref }}
|
|
257
|
+
output_dir: docs/reader
|
|
258
|
+
env:
|
|
259
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
260
|
+
|
|
261
|
+
- name: Commit Reader Markdown
|
|
262
|
+
run: |
|
|
263
|
+
git config user.name "github-actions[bot]"
|
|
264
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
265
|
+
git add docs/reader/
|
|
266
|
+
if git diff --cached --quiet; then
|
|
267
|
+
echo "λ³κ²½μ¬ν μμ"
|
|
268
|
+
else
|
|
269
|
+
git commit -m "docs(reader): PR #${{ github.event.pull_request.number }} λͺ¨λ°μΌ 리λ μ
λ°μ΄νΈ [skip ci]"
|
|
270
|
+
git push
|
|
271
|
+
fi
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Step 2 β PR μ΄κΈ°
|
|
275
|
+
|
|
276
|
+
μ΄κ² μ λΆμ
λλ€. μ΄ν λͺ¨λ PRμ μλμΌλ‘:
|
|
277
|
+
|
|
278
|
+
- `docs/reader/pr-<λ²νΈ>.md` νμΌ μμ±
|
|
279
|
+
- μμ±λ νμΌ λ§ν¬κ° λ΄κΈ΄ PR μ½λ©νΈ μλ κ²μ
|
|
280
|
+
|
|
281
|
+
### Action μ
λ ₯κ°
|
|
282
|
+
|
|
283
|
+
| μ
λ ₯κ° | νμ | κΈ°λ³Έκ° | μ€λͺ
|
|
|
284
|
+
| -------------- | ---- | ------------- | ---------------------------------- |
|
|
285
|
+
| `github_token` | β
| β | `${{ secrets.GITHUB_TOKEN }}` μ¬μ© |
|
|
286
|
+
| `base_branch` | β | `main` | PRμ΄ λ¨Έμ§λλ λμ λΈλμΉ |
|
|
287
|
+
| `output_dir` | β | `docs/reader` | μμ±λ `.md` νμΌ μ μ₯ κ²½λ‘ |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## npm λΌμ΄λΈλ¬λ¦¬ μ¬μ©λ²
|
|
292
|
+
|
|
293
|
+
CI μ€ν¬λ¦½νΈ, 컀μ€ν
λ΄, λ‘컬 λꡬ λ± λͺ¨λ Node.js νλ‘μ νΈμμ λΌμ΄λΈλ¬λ¦¬λ‘ μ¬μ©ν μ μμ΅λλ€.
|
|
294
|
+
|
|
295
|
+
### μ€μΉ
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
# npm
|
|
299
|
+
npm install github-mobile-reader
|
|
300
|
+
|
|
301
|
+
# pnpm
|
|
302
|
+
pnpm add github-mobile-reader
|
|
303
|
+
|
|
304
|
+
# yarn
|
|
305
|
+
yarn add github-mobile-reader
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### CommonJS
|
|
309
|
+
|
|
310
|
+
```js
|
|
311
|
+
const { generateReaderMarkdown } = require("github-mobile-reader");
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### ESM / TypeScript
|
|
315
|
+
|
|
316
|
+
```ts
|
|
317
|
+
import {
|
|
318
|
+
generateReaderMarkdown,
|
|
319
|
+
parseDiffToLogicalFlow,
|
|
320
|
+
} from "github-mobile-reader";
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### κΈ°λ³Έ μ¬μ© μμ
|
|
324
|
+
|
|
325
|
+
```ts
|
|
326
|
+
import { generateReaderMarkdown } from "github-mobile-reader";
|
|
327
|
+
import { execSync } from "child_process";
|
|
328
|
+
import { writeFileSync } from "fs";
|
|
329
|
+
|
|
330
|
+
// λ§μ§λ§ 컀λ°μ diff κ°μ Έμ€κΈ°
|
|
331
|
+
const diff = execSync("git diff HEAD~1 HEAD", { encoding: "utf8" });
|
|
332
|
+
|
|
333
|
+
// λ©νλ°μ΄ν°μ ν¨κ» Reader Markdown μμ±
|
|
334
|
+
const markdown = generateReaderMarkdown(diff, {
|
|
335
|
+
pr: "42",
|
|
336
|
+
commit: "a1b2c3d",
|
|
337
|
+
file: "src/api/users.ts",
|
|
338
|
+
repo: "my-org/my-repo",
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// νμΌ μ μ₯ λλ Slack / Discord / GitHubμ κ²μ
|
|
342
|
+
writeFileSync("reader.md", markdown, "utf8");
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### μ μμ€ API μμ
|
|
346
|
+
|
|
347
|
+
νΈλ¦¬ κ΅¬μ‘°λ§ νμν κ²½μ° (μ: 컀μ€ν
λ λλ¬ μ μ):
|
|
348
|
+
|
|
349
|
+
```ts
|
|
350
|
+
import { parseDiffToLogicalFlow, renderFlowTree } from "github-mobile-reader";
|
|
351
|
+
|
|
352
|
+
const { root, rawCode, removedCode } = parseDiffToLogicalFlow(diff);
|
|
353
|
+
|
|
354
|
+
// root β FlowNode[] (λ
Όλ¦¬ νΈλ¦¬)
|
|
355
|
+
// rawCode β string (μΆκ°λ μ€, μ€λ°κΏμΌλ‘ μ°κ²°)
|
|
356
|
+
// removedCode β string (μμ λ μ€, μ€λ°κΏμΌλ‘ μ°κ²°)
|
|
357
|
+
|
|
358
|
+
const treeLines = renderFlowTree(root);
|
|
359
|
+
console.log(treeLines.join("\n"));
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## μΆλ ₯ νμ
|
|
365
|
+
|
|
366
|
+
μμ±λ Reader Markdown λ¬Έμλ λ€ κ°μ μΉμ
μΌλ‘ ꡬμ±λ©λλ€:
|
|
367
|
+
|
|
368
|
+
````markdown
|
|
369
|
+
# π GitHub Reader View
|
|
370
|
+
|
|
371
|
+
> Generated by **github-mobile-reader**
|
|
372
|
+
> Repository: my-org/my-repo
|
|
373
|
+
> Pull Request: #42
|
|
374
|
+
> Commit: `a1b2c3d`
|
|
375
|
+
> File: `src/api/users.ts`
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## π§ Logical Flow
|
|
380
|
+
|
|
381
|
+
```
|
|
382
|
+
getData()
|
|
383
|
+
ββ filter(callback)
|
|
384
|
+
ββ map(item β value)
|
|
385
|
+
ββ reduce(callback)
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
## β
Added Code
|
|
389
|
+
|
|
390
|
+
```typescript
|
|
391
|
+
const result = getData()
|
|
392
|
+
.filter((item) => item.active)
|
|
393
|
+
.map((item) => item.value)
|
|
394
|
+
.reduce((a, b) => a + b, 0);
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## β Removed Code
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
const result = getData().map((item) => item.value);
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
π Auto-generated by github-mobile-reader. Do not edit manually.
|
|
406
|
+
````
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## API λ νΌλ°μ€
|
|
411
|
+
|
|
412
|
+
### `generateReaderMarkdown(diffText, meta?)`
|
|
413
|
+
|
|
414
|
+
λ©μΈ μ§μ
μ . μμ git diff λ¬Έμμ΄μ νμ±ν΄μ μμ±λ Reader Markdown λ¬Έμλ₯Ό λ°νν©λλ€.
|
|
415
|
+
|
|
416
|
+
| νλΌλ―Έν° | νμ
| μ€λͺ
|
|
|
417
|
+
| ------------- | --------- | ----------------------------- |
|
|
418
|
+
| `diffText` | `string` | `git diff`μ μμ μΆλ ₯ |
|
|
419
|
+
| `meta.pr` | `string?` | PR λ²νΈ |
|
|
420
|
+
| `meta.commit` | `string?` | μ»€λ° SHA |
|
|
421
|
+
| `meta.file` | `string?` | ν€λμ νμν νμΌλͺ
|
|
|
422
|
+
| `meta.repo` | `string?` | `owner/repo` νμμ λ ν¬ μ΄λ¦ |
|
|
423
|
+
|
|
424
|
+
**λ°νκ°:** `string` β μμ±λ Markdown λ¬Έμ
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
### `parseDiffToLogicalFlow(diffText)`
|
|
429
|
+
|
|
430
|
+
λ λλ§ μμ΄ diffλ₯Ό ꡬ쑰νλ κ²°κ³Όλ‘ νμ±ν©λλ€.
|
|
431
|
+
|
|
432
|
+
**λ°νκ°:** `ParseResult`
|
|
433
|
+
|
|
434
|
+
```ts
|
|
435
|
+
interface ParseResult {
|
|
436
|
+
root: FlowNode[]; // λ
Όλ¦¬ νΈλ¦¬ (μΆκ°λ μ€)
|
|
437
|
+
rawCode: string; // μΆκ°λ μ€ (\nμΌλ‘ μ°κ²°)
|
|
438
|
+
removedCode: string; // μμ λ μ€ (\nμΌλ‘ μ°κ²°)
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
### `renderFlowTree(nodes, indent?)`
|
|
445
|
+
|
|
446
|
+
`FlowNode[]` νΈλ¦¬λ₯Ό Markdown μμ ν ν
μ€νΈ μ€ λ°°μ΄λ‘ λ³νν©λλ€.
|
|
447
|
+
|
|
448
|
+
```ts
|
|
449
|
+
const lines = renderFlowTree(root);
|
|
450
|
+
// [ 'getData()', ' ββ filter(callback)', ' ββ map(item β value)' ]
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
### `FlowNode`
|
|
456
|
+
|
|
457
|
+
```ts
|
|
458
|
+
interface FlowNode {
|
|
459
|
+
type: "root" | "chain" | "condition" | "loop" | "function" | "call";
|
|
460
|
+
name: string;
|
|
461
|
+
children: FlowNode[];
|
|
462
|
+
depth: number;
|
|
463
|
+
priority: Priority;
|
|
464
|
+
}
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
### `Priority` (μ΄κ±°ν)
|
|
470
|
+
|
|
471
|
+
| κ° | μλ―Έ |
|
|
472
|
+
| ----------------- | ----------------------------------------------- |
|
|
473
|
+
| `CHAINING = 1` | λ©μλ μ²΄μΈ (`.map()`, `.filter()`, β¦) β μ΅μ°μ |
|
|
474
|
+
| `CONDITIONAL = 2` | `if` / `else` / `switch` λΈλ‘ |
|
|
475
|
+
| `LOOP = 3` | `for` / `while` λ°λ³΅λ¬Έ |
|
|
476
|
+
| `FUNCTION = 4` | ν¨μ μ μΈ |
|
|
477
|
+
| `OTHER = 5` | κ·Έ μΈ |
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## νμ λμ μ리
|
|
482
|
+
|
|
483
|
+
νμλ κ²°μ λ‘ μ νμ΄νλΌμΈμΌλ‘ λμν©λλ€ β AI μμ, μΈλΆ μμ‘΄μ± μμ.
|
|
484
|
+
|
|
485
|
+
```
|
|
486
|
+
git diff ν
μ€νΈ
|
|
487
|
+
β
|
|
488
|
+
βΌ
|
|
489
|
+
1. filterDiffLines() β + / - μ€ λΆλ¦¬, +++ / --- ν€λ μ κ±°
|
|
490
|
+
β
|
|
491
|
+
βΌ
|
|
492
|
+
2. normalizeCode() β ; μ κ±°, μ£Όμ μ κ±°, 곡백 μ 리
|
|
493
|
+
β
|
|
494
|
+
βΌ
|
|
495
|
+
3. getIndentDepth() β μ€μ²© λ 벨 κ³μ° (2 spaces = 1 λ 벨)
|
|
496
|
+
β
|
|
497
|
+
βΌ
|
|
498
|
+
4. parseToFlowTree() β μ°μ μμ μμλ‘ ν¨ν΄ λ§€μΉ:
|
|
499
|
+
β P1 체μ΄λ (.map .filter .reduce β¦)
|
|
500
|
+
β P2 쑰건문 (if / else / switch)
|
|
501
|
+
β P3 λ°λ³΅λ¬Έ (for / while)
|
|
502
|
+
β P4 ν¨μ μ μΈ
|
|
503
|
+
β
|
|
504
|
+
βΌ
|
|
505
|
+
5. renderFlowTree() β νΈλ¦¬ β λ€μ¬μ°κΈ°λ ν
μ€νΈ μ€λ‘ λ³ν
|
|
506
|
+
β
|
|
507
|
+
βΌ
|
|
508
|
+
generateReaderMarkdown() β μ΅μ’
Markdown λ¬Έμ 쑰립
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
**μ£Όμ μ€κ³ κ²°μ :**
|
|
512
|
+
|
|
513
|
+
- **보μμ ** β λΆλ₯λμ§ μλ μ€μ μλͺ»λ μ 보 λμ μ‘°μ©ν 건λλλλ€
|
|
514
|
+
- **import / export / type / interface / console.log**λ 무μλ©λλ€. νλ¦ μ΄ν΄μ κΈ°μ¬νμ§ μκΈ° λλ¬Έμ
λλ€
|
|
515
|
+
- **μ½λ°± μΈμ μΆμ½** β λ³Έλ¬Έμ΄ λ¨μΌ μμ± μ κ·ΌμΌ λ `.map(item => item.value)`λ₯Ό `map(item β value)`λ‘ μΆμ½ν©λλ€. κ·Έ μΈμλ `map(callback)`μΌλ‘ νμν©λλ€
|
|
516
|
+
- **ν¨μ μ μΈμ μ΅μ°μ 체ν¬** β `const foo = async β¦`κ° `extractRoot`μ μλͺ» λΆλ₯λμ§ μλλ‘, ν¨μ μ μΈ κ°μ§λ₯Ό λ£¨νΈ μΆμΆλ³΄λ€ λ¨Όμ μνν©λλ€
|
|
517
|
+
- **depth**λ λ€μ¬μ°κΈ° κΈ°λ° (2-space κΈ°μ€)μΌλ‘ μΆμ λλ©°, 체μ΄λ κ°μ§κ° μ λ§€ν λ 보쑰 μ 보λ‘λ§ μ¬μ©λ©λλ€
|
|
518
|
+
|
|
519
|
+
### μ§μ μΈμ΄ (v0.1)
|
|
520
|
+
|
|
521
|
+
[μΈμ΄ μ§μ](#μΈμ΄-μ§μ) μΉμ
μ μ 체 νλ₯Ό νμΈνμΈμ.
|
|
522
|
+
μμ½: **JS / TS / React / Next.js μμ μ§μ**, Javaμ C#μ λΆλΆ μ§μ, C λ±μ Language Adapter μμ€ν
(v0.2)μΌλ‘ κ³ν μ€.
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
## κΈ°μ¬νκΈ°
|
|
527
|
+
|
|
528
|
+
PRμ μΈμ λ μ§ νμν©λλ€! μμ λ°©λ²:
|
|
529
|
+
|
|
530
|
+
```bash
|
|
531
|
+
# λ ν¬ ν΄λ‘
|
|
532
|
+
git clone https://github.com/3rdflr/github-mobile-reader.git
|
|
533
|
+
cd github-mobile-reader
|
|
534
|
+
|
|
535
|
+
# μμ‘΄μ± μ€μΉ
|
|
536
|
+
npm install
|
|
537
|
+
|
|
538
|
+
# λΉλ (λΌμ΄λΈλ¬λ¦¬ + Action runner)
|
|
539
|
+
npm run build:all
|
|
540
|
+
|
|
541
|
+
# κ°λ° μ€ watch λͺ¨λ
|
|
542
|
+
npm run dev
|
|
543
|
+
|
|
544
|
+
# ν
μ€νΈ μ€ν
|
|
545
|
+
npx ts-node src/test.ts
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### νλ‘μ νΈ κ΅¬μ‘°
|
|
549
|
+
|
|
550
|
+
```
|
|
551
|
+
github-mobile-reader/
|
|
552
|
+
βββ src/
|
|
553
|
+
β βββ parser.ts β ν΅μ¬ diff β logical flow νμ
|
|
554
|
+
β βββ index.ts β npm κ³΅κ° API
|
|
555
|
+
β βββ action.ts β GitHub Action μ§μ
μ
|
|
556
|
+
β βββ cli.ts β CLI μ§μ
μ (npx github-mobile-reader)
|
|
557
|
+
β βββ test.ts β μ€λͺ¨ν¬ ν
μ€νΈ (33κ°)
|
|
558
|
+
βββ dist/ β μ»΄νμΌ κ²°κ³Όλ¬Ό (μλ μμ±, μμ κΈμ§)
|
|
559
|
+
βββ reader-output/ β CLI μΆλ ₯ λλ ν 리 (gitignoreλ¨)
|
|
560
|
+
βββ .github/
|
|
561
|
+
β βββ workflows/
|
|
562
|
+
β βββ mobile-reader.yml β μ¬μ©μμ© μμ μν¬νλ‘μ°
|
|
563
|
+
βββ action.yml β GitHub Action μ μ
|
|
564
|
+
βββ README.md β μμ΄ λ¬Έμ
|
|
565
|
+
βββ README.ko.md β νκ΅μ΄ λ¬Έμ (νμ¬ νμΌ)
|
|
566
|
+
βββ package.json
|
|
567
|
+
βββ tsconfig.json
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### μ μΈμ΄ μ΄λν° μΆκ°νκΈ°
|
|
571
|
+
|
|
572
|
+
νμλ νμ¬ JS/TS λ¬Έλ² ν΄λ¦¬μ€ν±μ μμ‘΄ν©λλ€ (μ 체μ΄λ, `const`/`let`/`var`, `function`, `if`/`for`/`while`). μ μΈμ΄λ₯Ό μΆκ°νλ €λ©΄:
|
|
573
|
+
|
|
574
|
+
1. `src/parser.ts`μμ κ°μ§ ν¬νΌ μΆκ° (κΈ°μ‘΄ `isChaining`, `isConditional` ν¨ν΄ μ°Έκ³ )
|
|
575
|
+
2. `src/action.ts`μ `filterDiffLines`μμ μ νμΌ νμ₯μ νμ©
|
|
576
|
+
3. `src/test.ts`μ ν΄λΉ μΈμ΄μ diff μμλ₯Ό ν
μ€νΈ μΌμ΄μ€λ‘ μΆκ°
|
|
577
|
+
4. μμ diffλ₯Ό ν¬ν¨ν΄μ PR μ€ν
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
## λΌμ΄μ μ€
|
|
582
|
+
|
|
583
|
+
MIT Β© [3rdflr](https://github.com/3rdflr)
|
|
584
|
+
|
|
585
|
+
---
|