velogger 0.1.0__tar.gz
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.
- velogger-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +59 -0
- velogger-0.1.0/.github/ISSUE_TEMPLATE/chore.yml +41 -0
- velogger-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- velogger-0.1.0/.github/ISSUE_TEMPLATE/docs.yml +30 -0
- velogger-0.1.0/.github/ISSUE_TEMPLATE/feature.yml +40 -0
- velogger-0.1.0/.github/ISSUE_TEMPLATE/task.yml +30 -0
- velogger-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +33 -0
- velogger-0.1.0/.github/workflows/api-monitor.yml +81 -0
- velogger-0.1.0/.github/workflows/ci.yml +91 -0
- velogger-0.1.0/.github/workflows/release.yml +82 -0
- velogger-0.1.0/.gitignore +229 -0
- velogger-0.1.0/AGENTS.md +104 -0
- velogger-0.1.0/CHANGELOG.md +39 -0
- velogger-0.1.0/CLAUDE.md +4 -0
- velogger-0.1.0/LICENSE +21 -0
- velogger-0.1.0/PKG-INFO +226 -0
- velogger-0.1.0/README.md +197 -0
- velogger-0.1.0/docs/common.md +39 -0
- velogger-0.1.0/docs/llm.md +89 -0
- velogger-0.1.0/docs/velogger.md +339 -0
- velogger-0.1.0/pyproject.toml +120 -0
- velogger-0.1.0/references/architecture.md +81 -0
- velogger-0.1.0/references/code-style.md +154 -0
- velogger-0.1.0/references/development.md +127 -0
- velogger-0.1.0/references/output-contract.md +110 -0
- velogger-0.1.0/references/provider-conventions.md +126 -0
- velogger-0.1.0/references/providers/velogger.md +315 -0
- velogger-0.1.0/references/release.md +104 -0
- velogger-0.1.0/references/workflow.md +84 -0
- velogger-0.1.0/scripts/monitor/api_check.py +419 -0
- velogger-0.1.0/src/velogger/__init__.py +1 -0
- velogger-0.1.0/src/velogger/__main__.py +5 -0
- velogger-0.1.0/src/velogger/api/__init__.py +1 -0
- velogger-0.1.0/src/velogger/api/client.py +933 -0
- velogger-0.1.0/src/velogger/api/request/__init__.py +1 -0
- velogger-0.1.0/src/velogger/api/request/auth.py +14 -0
- velogger-0.1.0/src/velogger/api/request/cache.py +28 -0
- velogger-0.1.0/src/velogger/api/request/posts.py +40 -0
- velogger-0.1.0/src/velogger/api/request/social.py +34 -0
- velogger-0.1.0/src/velogger/api/request/users.py +11 -0
- velogger-0.1.0/src/velogger/api/request/write.py +81 -0
- velogger-0.1.0/src/velogger/api/response/__init__.py +1 -0
- velogger-0.1.0/src/velogger/api/response/auth.py +73 -0
- velogger-0.1.0/src/velogger/api/response/cache.py +64 -0
- velogger-0.1.0/src/velogger/api/response/common.py +65 -0
- velogger-0.1.0/src/velogger/api/response/posts.py +118 -0
- velogger-0.1.0/src/velogger/api/response/social.py +198 -0
- velogger-0.1.0/src/velogger/api/response/users.py +79 -0
- velogger-0.1.0/src/velogger/api/response/write.py +136 -0
- velogger-0.1.0/src/velogger/cli/__init__.py +0 -0
- velogger-0.1.0/src/velogger/cli/app.py +923 -0
- velogger-0.1.0/src/velogger/cli/output.py +185 -0
- velogger-0.1.0/src/velogger/core/__init__.py +0 -0
- velogger-0.1.0/src/velogger/core/errors.py +25 -0
- velogger-0.1.0/src/velogger/core/http.py +438 -0
- velogger-0.1.0/src/velogger/core/paths.py +21 -0
- velogger-0.1.0/src/velogger/core/ratelimit.py +383 -0
- velogger-0.1.0/src/velogger/core/schema.py +58 -0
- velogger-0.1.0/src/velogger/core/session.py +157 -0
- velogger-0.1.0/src/velogger/service/__init__.py +4 -0
- velogger-0.1.0/src/velogger/service/auth.py +267 -0
- velogger-0.1.0/src/velogger/service/common.py +277 -0
- velogger-0.1.0/src/velogger/service/post.py +172 -0
- velogger-0.1.0/src/velogger/service/posts.py +80 -0
- velogger-0.1.0/src/velogger/service/social.py +266 -0
- velogger-0.1.0/src/velogger/service/users.py +137 -0
- velogger-0.1.0/src/velogger/service/write.py +579 -0
- velogger-0.1.0/tests/conftest.py +11 -0
- velogger-0.1.0/tests/test_cli.py +212 -0
- velogger-0.1.0/tests/test_monitor.py +54 -0
- velogger-0.1.0/tests/test_write.py +238 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
name: ๐ ๋ฒ๊ทธ ์ ๋ณด
|
|
2
|
+
description: ๋ช
๋ น์ด ๋ฌธ์์ ๋ค๋ฅด๊ฒ ๋์ํ๊ฑฐ๋, ๊ฒฐ๊ณผ๊ฐ ์๋ชป ๋์ฌ ๋
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
์ ๋ณด ๊ฐ์ฌํฉ๋๋ค. ๋ถ์ฌ ๋ฃ๋ ๋ด์ฉ์์ **ํ ํฐยท์ฟ ํคยท์ด๋ฉ์ผ ๊ฐ์ ๊ฐ์ธ์ ๋ณด๋ ์ง์ ์ฃผ์ธ์.**
|
|
9
|
+
|
|
10
|
+
- type: dropdown
|
|
11
|
+
id: area
|
|
12
|
+
attributes:
|
|
13
|
+
label: ์์ญ
|
|
14
|
+
description: ์ด๋ ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋์?
|
|
15
|
+
options:
|
|
16
|
+
- ๋ก๊ทธ์ธยท์ธ์
(login, whoami)
|
|
17
|
+
- ์กฐํ (trending, search, post, user ๋ฑ)
|
|
18
|
+
- ์์ฑ (publish, like, comment ๋ฑ)
|
|
19
|
+
- ์์ฒญ ์ ํ (limits, RATE_LIMITED)
|
|
20
|
+
- CLI ์ถ๋ ฅยท์๋ฌ ํ์
|
|
21
|
+
- ๊ธฐํ / ์ ๋ชจ๋ฅด๊ฒ ์
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: what-happened
|
|
27
|
+
attributes:
|
|
28
|
+
label: ๋ฌด์จ ์ผ์ด ์์๋์?
|
|
29
|
+
description: ๊ธฐ๋ํ ๊ฒฐ๊ณผ์ ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ด ์ฃผ์ธ์.
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
|
|
33
|
+
- type: textarea
|
|
34
|
+
id: repro
|
|
35
|
+
attributes:
|
|
36
|
+
label: ์ฌํ ๋ฐฉ๋ฒ
|
|
37
|
+
description: ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฐ์ฅ ์งง์ ๋ช
๋ น.
|
|
38
|
+
placeholder: "velogger search fastapi --limit 3"
|
|
39
|
+
render: shell
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: output
|
|
45
|
+
attributes:
|
|
46
|
+
label: ์ถ๋ ฅ ๋๋ ์๋ฌ
|
|
47
|
+
description: stdout ๊ฒฐ๊ณผ๋ stderr ์ ์๋ฌ JSON. `--verbose` ๋ก๊ทธ๊ฐ ์์ผ๋ฉด ํจ๊ป ๋ถ์ฌ ์ฃผ์ธ์. ํ ํฐยท์ฟ ํคยท์ด๋ฉ์ผ์ ์ง์ฐ์ธ์.
|
|
48
|
+
render: shell
|
|
49
|
+
validations:
|
|
50
|
+
required: false
|
|
51
|
+
|
|
52
|
+
- type: input
|
|
53
|
+
id: versions
|
|
54
|
+
attributes:
|
|
55
|
+
label: ํ๊ฒฝ
|
|
56
|
+
description: "`velogger --version` ์ถ๋ ฅ, Python ๋ฒ์ , ์คํํ ๋ ์ง. ๋น๊ณต์ API ๋ผ ๋ ์ง๊ฐ ์ค์ํฉ๋๋ค."
|
|
57
|
+
placeholder: "velogger 0.1.0 (์ปค๋ฐ a1b2c3d), Python 3.11.6, 2026-10-18"
|
|
58
|
+
validations:
|
|
59
|
+
required: false
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: ๐งน ์ก๋ฌด
|
|
2
|
+
description: ์์กด์ฑ, ๋๊ตฌ, ์ค์ , ์ ๋ฆฌ โ ๋์ ๋ณํ ์์
|
|
3
|
+
labels: ["chore"]
|
|
4
|
+
body:
|
|
5
|
+
- type: dropdown
|
|
6
|
+
id: kind
|
|
7
|
+
attributes:
|
|
8
|
+
label: ์ข
๋ฅ
|
|
9
|
+
options:
|
|
10
|
+
- ์์กด์ฑ ์
๋ฐ์ดํธยท๊ณ ์
|
|
11
|
+
- ๋๊ตฌยทCI
|
|
12
|
+
- ์ค์
|
|
13
|
+
- ๋ฆฌํฉํฐ๋งยท์ ๋ฆฌ
|
|
14
|
+
- ๊ธฐํ
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: what
|
|
20
|
+
attributes:
|
|
21
|
+
label: ๋ฌด์์ ํด์ผ ํ๋์?
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: why
|
|
27
|
+
attributes:
|
|
28
|
+
label: ์ ์ง๊ธ ํ๋์?
|
|
29
|
+
description: |
|
|
30
|
+
๊ทธ๋๋ก ๋๋ฉด ์ด๋ค ๋น์ฉ์ด ์๋์? ๋ณด์ ๊ถ๊ณ , ๊นจ์ง ๋น๋, ๋จ์ํ ์ ๋ฆฌ
|
|
31
|
+
๋ชจ๋ ๊ด์ฐฎ์ ์ด์ ์
๋๋ค.
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
|
|
35
|
+
- type: checkboxes
|
|
36
|
+
id: impact
|
|
37
|
+
attributes:
|
|
38
|
+
label: ์ํฅ
|
|
39
|
+
options:
|
|
40
|
+
- label: CLI ์ถ๋ ฅ ํ์์ด๋ ๋ช
๋ นยท์ต์
์ด ๋ฐ๋๋ค
|
|
41
|
+
required: false
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: ๐ ๋ฌธ์
|
|
2
|
+
description: ๋ฌธ์์ ๋น ์ก๊ฑฐ๋, ํ๋ ธ๊ฑฐ๋, ์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ์ด ์์ ๋
|
|
3
|
+
labels: ["docs"]
|
|
4
|
+
body:
|
|
5
|
+
- type: input
|
|
6
|
+
id: location
|
|
7
|
+
attributes:
|
|
8
|
+
label: ์ด๋์ธ๊ฐ์?
|
|
9
|
+
description: ํ์ผ, ์น์
, ๋๋ docstring.
|
|
10
|
+
placeholder: "README.md โ ์์ฒญ ์ ํ ํ"
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: problem
|
|
16
|
+
attributes:
|
|
17
|
+
label: ๋ฌด์์ด ํ๋ ธ๊ฑฐ๋ ๋น ์ก๋์?
|
|
18
|
+
description: |
|
|
19
|
+
๋ฌธ์๊ฐ ์ง๊ธ ๋ญ๋ผ๊ณ ํ๋์ง, ๊ทธ๊ฒ ์ ํ๋ ธ๊ฑฐ๋ ๋ก์๊ฑฐ๋ ๋ฐ๋ผ๊ฐ๊ธฐ
|
|
20
|
+
์ด๋ ค์ด์ง ์ ์ด ์ฃผ์ธ์.
|
|
21
|
+
validations:
|
|
22
|
+
required: true
|
|
23
|
+
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: suggestion
|
|
26
|
+
attributes:
|
|
27
|
+
label: ์ ์ ๋ฌธ๊ตฌ
|
|
28
|
+
description: ์ ํ โ ๋ฐ๋์์ผ๋ฉด ํ๋ ๋ฌธ์ฅ์ ์ ์ด ์ฃผ์ธ์.
|
|
29
|
+
validations:
|
|
30
|
+
required: false
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: โจ ๊ธฐ๋ฅ
|
|
2
|
+
description: ์ ๋ช
๋ น, ์ต์
, ์๋ํฌ์ธํธ ์ ์
|
|
3
|
+
labels: ["feature"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: proposal
|
|
7
|
+
attributes:
|
|
8
|
+
label: ๋ฌด์์ด ์์ด์ผ ํ๋์?
|
|
9
|
+
description: |
|
|
10
|
+
์ํ๋ ๋ช
๋ น, ์ต์
, ์๋ํฌ์ธํธ๋ฅผ ์ค๋ช
ํด ์ฃผ์ธ์. ์ ์๋ํฌ์ธํธ๋ผ๋ฉด
|
|
11
|
+
ํ์ธํ ์์ฒญยท์๋ต ์์๋ฅผ ํจ๊ป ์ ์ด ์ฃผ์ธ์.
|
|
12
|
+
validations:
|
|
13
|
+
required: true
|
|
14
|
+
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: motivation
|
|
17
|
+
attributes:
|
|
18
|
+
label: ์ ํ์ํ๊ฐ์?
|
|
19
|
+
description: ์ง๊ธ ๋ช
๋ น์ผ๋ก๋ ํ ์ ์๋ ์ผ์ด ๋ฌด์์ธ๊ฐ์?
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
|
|
23
|
+
- type: textarea
|
|
24
|
+
id: usage
|
|
25
|
+
attributes:
|
|
26
|
+
label: ์ฌ์ฉ ์
|
|
27
|
+
description: ์๊ธฐ๋ฉด ์ฐ๊ณ ์ถ์ ๋ช
๋ น๊ณผ ๊ธฐ๋ํ๋ ์ถ๋ ฅ์ ์ ์ด ์ฃผ์ธ์.
|
|
28
|
+
render: shell
|
|
29
|
+
validations:
|
|
30
|
+
required: false
|
|
31
|
+
|
|
32
|
+
- type: checkboxes
|
|
33
|
+
id: conventions
|
|
34
|
+
attributes:
|
|
35
|
+
label: ๊ท์ฝ
|
|
36
|
+
options:
|
|
37
|
+
- label: ์ ์๋ํฌ์ธํธ๋ผ๋ฉด references/provider-conventions.md ๋ฅผ ์ฝ์๋ค
|
|
38
|
+
required: false
|
|
39
|
+
- label: ์ถ๋ ฅ์ด ๋ฐ๋๋ค๋ฉด references/output-contract.md ๋ฅผ ์ฝ์๋ค
|
|
40
|
+
required: false
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: โ
์์
|
|
2
|
+
description: ๋ฒ๊ทธยท๊ธฐ๋ฅยท๋ฌธ์ยท์ก๋ฌด ์ด๋์๋ ์ํ์ง ์๋ ๊ณํ๋ ์์
|
|
3
|
+
labels: ["task"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: description
|
|
7
|
+
attributes:
|
|
8
|
+
label: ์ค๋ช
|
|
9
|
+
description: ๋ฌด์์ ํด์ผ ํ๋์?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: done
|
|
15
|
+
attributes:
|
|
16
|
+
label: ์๋ฃ ์กฐ๊ฑด
|
|
17
|
+
description: ๋๋ฌ๋ค๋ ๊ฑธ ์ด๋ป๊ฒ ์ ์ ์๋์?
|
|
18
|
+
placeholder: |
|
|
19
|
+
- [ ] ...
|
|
20
|
+
- [ ] ...
|
|
21
|
+
validations:
|
|
22
|
+
required: true
|
|
23
|
+
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: context
|
|
26
|
+
attributes:
|
|
27
|
+
label: ๋งฅ๋ฝ
|
|
28
|
+
description: ๊ด๋ จ ์ด์, PR, ๋งํฌ. ์ ํ.
|
|
29
|
+
validations:
|
|
30
|
+
required: false
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## ์์ฝ
|
|
2
|
+
|
|
3
|
+
<!-- ๋ฌด์์ ์ ๋ฐ๊พธ๋์? ๋ซ๋ ์ด์๋ฅผ ์ ์ด ์ฃผ์ธ์. ์: "Closes #12" -->
|
|
4
|
+
|
|
5
|
+
## ๋ณ๊ฒฝ ์ข
๋ฅ
|
|
6
|
+
|
|
7
|
+
<!-- ํด๋นํ๋ ๊ฒ์ ๋ชจ๋ ์ฒดํฌํ์ธ์. -->
|
|
8
|
+
|
|
9
|
+
- [ ] `fix` โ ๋ฒ๊ทธ ์์
|
|
10
|
+
- [ ] `feature` โ ์ ๋ช
๋ น, ์ต์
, ์๋ํฌ์ธํธ
|
|
11
|
+
- [ ] `docs` โ ๋ฌธ์๋ง
|
|
12
|
+
- [ ] `chore` โ ์์กด์ฑ, ๋๊ตฌ, ์ค์ , ์ ๋ฆฌ
|
|
13
|
+
- [ ] `task` โ ๊ทธ ๋ฐ์ ์์
|
|
14
|
+
|
|
15
|
+
## ์ํฅ ๋ฒ์
|
|
16
|
+
|
|
17
|
+
<!-- ์: src/velogger/service/posts.py, cli ์ถ๋ ฅ. ๋ฌธ์ยท๋๊ตฌ๋ง ๋ฐ๊ฟจ๋ค๋ฉด "์์". -->
|
|
18
|
+
|
|
19
|
+
## ์ด๋ป๊ฒ ํ
์คํธํ๋์?
|
|
20
|
+
|
|
21
|
+
<!-- ์ค์ ๋ก ์คํํ ๊ฒ์ ์ ์ด ์ฃผ์ธ์. ์ค์ API ๋ก ํ์ธํ ๋ช
๋ น(CLI ์ง์ ์กฐํ)์ ๋จผ์ , ๋๋ฆฐ pytest ๊ฐ ์์ผ๋ฉด ๊ทธ๋ค์์.
|
|
22
|
+
ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ค๋ฉด ๋๋ฌธ ์ฃ์ง์ผ์ด์ค์ธ์ง ํต์ฌ ๋์์ธ์ง ์ ์ด ์ฃผ์ธ์. "ํ
์คํธ ์ ํจ"๋ ๊ด์ฐฎ์ต๋๋ค โ ๊ทธ๋ ๋ค๊ณ ์ ์ด ์ฃผ์ธ์. -->
|
|
23
|
+
|
|
24
|
+
## ์ฒดํฌ๋ฆฌ์คํธ
|
|
25
|
+
|
|
26
|
+
- [ ] [references/code-style.md](https://github.com/Rukkakka/velogger/blob/main/references/code-style.md) ๋ฅผ ๋ฐ๋ฅธ๋ค
|
|
27
|
+
- [ ] ์๋ก ๋ง๋ค๊ฑฐ๋ ๋ฐ๊พผ ์๋ํฌ์ธํธ๊ฐ [references/provider-conventions.md](https://github.com/Rukkakka/velogger/blob/main/references/provider-conventions.md) ๋ฅผ ๋ฐ๋ฅธ๋ค
|
|
28
|
+
- [ ] ๋ช
๋ นยท์ต์
ยท์ถ๋ ฅ ํ๋ยท์๋ฌ ์ฝ๋ยท์์ฒญ ์ ํ์ด ๋ฐ๋์๋ค๋ฉด `docs/<source>.md`ยท`docs/common.md` ์ [references/output-contract.md](https://github.com/Rukkakka/velogger/blob/main/references/output-contract.md) ๋ฅผ ๊ณ ์ณค๋ค
|
|
29
|
+
- [ ] ๋ช
๋ น์ ์ถ๊ฐยท์ญ์ ํ๊ฑฐ๋ ์์ด์ ํธ๊ฐ ํ๋ฆฌ๊ธฐ ์ฌ์ด ํด์ ๊ท์น์ด ๋ฐ๋์๋ค๋ฉด `docs/llm.md` ๋ฅผ ๊ณ ์ณค๋ค
|
|
30
|
+
- [ ] ๋ช
๋ น์ ์ถ๊ฐยท์ญ์ ํ๋ค๋ฉด ๋งค์ผ API ๊ฐ์ ๋ชฉ๋ก(`scripts/monitor/api_check.py` ์ `STEPS`, ๊ฐ์ํ์ง ์์ผ๋ฉด `NOT_MONITORED` ์ ์ด์ )๋ ๊ณ ์ณค๋ค
|
|
31
|
+
- [ ] ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ๋ณ๊ฒฝ์ด๋ฉด `CHANGELOG.md` ์ `Unreleased` ์ ์ ์๋ค ([์ฐ๋ ๋ฒ](https://github.com/Rukkakka/velogger/blob/main/references/release.md#changelog-์ฐ๋-๋ฒ))
|
|
32
|
+
- [ ] ๋ชจ๋์ ์ถ๊ฐยท์ด๋ฆ ๋ณ๊ฒฝยท์ญ์ ํ๋ค๋ฉด `AGENTS.md` ๊ตฌ์กฐ ํ์ ํด๋น `references/providers/<source>.md` ๋ฅผ ๊ณ ์ณค๋ค
|
|
33
|
+
- [ ] ์ ํฝ์ค์ฒ์ diff ์ ํ ํฐยท์ฟ ํคยท์ด๋ฉ์ผ ๊ฐ์ ๊ฐ์ธ์ ๋ณด๊ฐ ์๋ค
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# ๋งค์ผ ์๋ฒฝ velogger ์ ๋ก๊ทธ์ธ ์๋ ์กฐํ ๋ช
๋ น์ ์ค์ ๋ก ๋ถ๋ฌ ๋น๊ณต์ API ๊ฐ ๊นจ์ก๋์ง ๋ณธ๋ค (scripts/monitor/api_check.py,
|
|
2
|
+
# references/development.md '๋งค์ผ API ๊ฐ์'). ๊ณ ์ฅ์ด๋ฉด api-broken ์ด์๋ฅผ ์ด๊ณ (์ด๋ ค ์์ผ๋ฉด ๋๊ธ) ์คํ์ ์คํจ๋ก ๋๋ด GitHub ์ด ๋ฉ์ผ๋ก ์๋ฆฐ๋ค.
|
|
3
|
+
# ์์ฒญ ์ ํยท์๋ฒ ์ค๋ฅ๋ ๊ณ ์ฅ์ด ์๋๋ผ 'ํ์ธ ๋ชป ํจ'์ด๊ณ , ์ฌํ ์ฐ์ ๊ทธ๋ฌ๋ฉด api-blocked ์ด์๋ก ์๋ฆฐ๋ค.
|
|
4
|
+
# ๋ก๊ทธ์ธยท์ฐ๊ธฐ(publishยทlikeยทcomment)๋ ๋ถ์์ฉ์ด ์๊ณ CI ์ ์ธ์
๋ ์์ด ๊ฐ์์ ๋ฃ์ง ์๋๋ค.
|
|
5
|
+
# ๊ฐ์ ํ์ผ์ ๊ณ ์น PR ์์๋ ๋์ง๋ง ์ด์๋ ๊ฑด๋๋ฆฌ์ง ์๋๋ค. CI(ci.yml)๋ ์ฌ์ ํ ์ค์ API ๋ฅผ ๋ถ๋ฅด์ง ์๋๋ค.
|
|
6
|
+
# ์ก ์ด๋ฆ์ main ๋ณดํธ ๊ท์น์ ํ์ ๊ฒ์ฌ๊ฐ ์๋๋ค (๋งํ ๋ ์๋ PR ์ ๋จธ์งํ ์ ์๊ฒ). jibsa ์ ๊ฐ์๋ฅผ ์ฎ๊ฒผ๋ค.
|
|
7
|
+
name: API ๊ฐ์
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
schedule:
|
|
11
|
+
# ํ๊ตญ ์๊ฐ ๋งค์ผ 04:17. ์ ๊ฐ์ ์์ฝ ์คํ์ด ๋ชฐ๋ ค ๋ฆ๊ฑฐ๋ ๋น ์ง๋ค
|
|
12
|
+
- cron: '17 19 * * *'
|
|
13
|
+
workflow_dispatch:
|
|
14
|
+
pull_request:
|
|
15
|
+
paths:
|
|
16
|
+
- 'scripts/monitor/**'
|
|
17
|
+
- '.github/workflows/api-monitor.yml'
|
|
18
|
+
|
|
19
|
+
permissions:
|
|
20
|
+
contents: read
|
|
21
|
+
|
|
22
|
+
concurrency:
|
|
23
|
+
group: api-monitor-${{ github.ref }}
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
check:
|
|
27
|
+
name: ์กฐํ ๋ช
๋ น ์ค์ ํธ์ถ
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
timeout-minutes: 30
|
|
30
|
+
env:
|
|
31
|
+
PYTHONUTF8: '1'
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v7
|
|
34
|
+
- uses: actions/setup-python@v7
|
|
35
|
+
with:
|
|
36
|
+
python-version: '3.11'
|
|
37
|
+
cache: pip
|
|
38
|
+
cache-dependency-path: pyproject.toml
|
|
39
|
+
# PyPI ๋ฆด๋ฆฌ์ค๊ฐ ์๋๋ผ ์ด ์ปค๋ฐ์ ์ฝ๋๋ฅผ, ํธ์ง ๊ฐ๋ฅ ์ค์น๊ฐ ์๋๋ผ ์ค์น๋ณธ ๊ทธ๋๋ก ๋ณธ๋ค
|
|
40
|
+
- run: pip install .
|
|
41
|
+
- run: python scripts/monitor/api_check.py run --out result.json
|
|
42
|
+
- uses: actions/upload-artifact@v7
|
|
43
|
+
with:
|
|
44
|
+
name: result
|
|
45
|
+
path: result.json
|
|
46
|
+
retention-days: 7
|
|
47
|
+
|
|
48
|
+
report:
|
|
49
|
+
name: ๊ฒฐ๊ณผ ์ ๋ฆฌ
|
|
50
|
+
needs: check
|
|
51
|
+
# ์กฐํ ์ก์ด ์คํจํด๋ ์ ๋ฆฌํ๋ค (๊ฒฐ๊ณผ ํ์ผ์ด ์์ผ๋ฉด ๊ณ ์ฅ์ผ๋ก ๋ณธ๋ค)
|
|
52
|
+
if: always()
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
permissions:
|
|
55
|
+
contents: read
|
|
56
|
+
issues: write
|
|
57
|
+
# ์์ ์คํ์ ๊ฒฐ๊ณผ ํ์ผ์ ๋ด๋ ค๋ฐ์ ์ฐ์ ํ์ธ ๋ชป ํจ์ ์ผ๋ค
|
|
58
|
+
actions: read
|
|
59
|
+
env:
|
|
60
|
+
PYTHONUTF8: '1'
|
|
61
|
+
GH_TOKEN: ${{ github.token }}
|
|
62
|
+
GH_REPO: ${{ github.repository }}
|
|
63
|
+
steps:
|
|
64
|
+
- uses: actions/checkout@v7
|
|
65
|
+
- uses: actions/setup-python@v7
|
|
66
|
+
with:
|
|
67
|
+
python-version: '3.11'
|
|
68
|
+
- uses: actions/download-artifact@v8
|
|
69
|
+
# ์กฐํ ์ก์ด ์คํจํด ๊ฒฐ๊ณผ ํ์ผ์ด ์์ด๋ ์ ๋ฆฌ ๋จ๊ณ๋ ๋๋ค
|
|
70
|
+
continue-on-error: true
|
|
71
|
+
with:
|
|
72
|
+
name: result
|
|
73
|
+
path: results
|
|
74
|
+
- name: ํ ๋จ๊ธฐ๊ธฐยท์ด์ ๊ณ ์น๊ธฐ
|
|
75
|
+
run: python scripts/monitor/api_check.py report results/result.json ${{ github.event_name != 'pull_request' && '--issues' || '' }}
|
|
76
|
+
- uses: actions/upload-artifact@v7
|
|
77
|
+
if: always()
|
|
78
|
+
with:
|
|
79
|
+
name: report
|
|
80
|
+
path: report.json
|
|
81
|
+
retention-days: 7
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# PR ๊ณผ main push ๋ง๋ค ๋ฆฐํธยทํ์
๊ฒ์ฌยท์ ์ฒด pytestยท์ค์น๋ณธ์ ํ์ธํ๋ค. ๋ฐฐํฌ(release.yml)๋ ์ด ์ํฌํ๋ก๋ฅผ ๋ถ๋ฌ ๊ฐ์ ๊ฒ์ฌ๋ฅผ
|
|
2
|
+
# ํต๊ณผํ ๋น๋๋ง ์ฌ๋ฆฐ๋ค. ์ก ์ด๋ฆ์ main ๋ณดํธ ๊ท์น์ ํ์ ๊ฒ์ฌ๋ผ ๋ฐ๊พธ๋ฉด ๋ณดํธ ๊ท์น๋ ๊ฐ์ด ๊ณ ์น๋ค.
|
|
3
|
+
# ํ
์คํธ๋ ๊ฐ์ง ์๋ต๋ง ์ฐ๊ณ ์ค์ API ๋ ๋ถ๋ฅด์ง ์๋๋ค (references/development.md '๊ฒ์ฆ๊ณผ ํ
์คํธ').
|
|
4
|
+
name: CI
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: [main]
|
|
9
|
+
pull_request:
|
|
10
|
+
workflow_call:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: ci-${{ github.ref }}
|
|
17
|
+
cancel-in-progress: true
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
lint:
|
|
21
|
+
name: ๋ฆฐํธยทํ์
๊ฒ์ฌ
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v7
|
|
25
|
+
- uses: actions/setup-python@v7
|
|
26
|
+
with:
|
|
27
|
+
python-version: '3.11'
|
|
28
|
+
cache: pip
|
|
29
|
+
cache-dependency-path: pyproject.toml
|
|
30
|
+
- run: pip install -e '.[dev]'
|
|
31
|
+
- run: ruff check
|
|
32
|
+
- run: mypy
|
|
33
|
+
- name: docs/llm.md 200์ค ์ดํ
|
|
34
|
+
run: |
|
|
35
|
+
lines=$(wc -l < docs/llm.md)
|
|
36
|
+
echo "docs/llm.md: ${lines}์ค"
|
|
37
|
+
if [ "$lines" -gt 200 ]; then
|
|
38
|
+
echo "::error file=docs/llm.md::${lines}์ค์
๋๋ค. 200์ค ์ดํ๋ก ์ค์ด์ธ์ (AGENTS.md '๋ฌธ์ ๊ฐฑ์ ')"
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
test:
|
|
43
|
+
name: pytest (${{ matrix.os }}, Python ${{ matrix.python }})
|
|
44
|
+
runs-on: ${{ matrix.os }}
|
|
45
|
+
strategy:
|
|
46
|
+
fail-fast: false
|
|
47
|
+
matrix:
|
|
48
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
49
|
+
# ์ง์ํ๋ ๊ฐ์ฅ ๋ฎ์ ๋ฒ์ ๊ณผ ์ต์ ์์ ๋ฒ์
|
|
50
|
+
python: ['3.11', '3.14']
|
|
51
|
+
env:
|
|
52
|
+
# README ์ Windows ์ค์ (setx PYTHONUTF8 1)๊ณผ ๊ฐ๊ฒ ํ๋ค. macOSยทLinux ๋ ์๋ UTF-8 ์ด๋ค
|
|
53
|
+
PYTHONUTF8: '1'
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v7
|
|
56
|
+
- uses: actions/setup-python@v7
|
|
57
|
+
with:
|
|
58
|
+
python-version: ${{ matrix.python }}
|
|
59
|
+
cache: pip
|
|
60
|
+
cache-dependency-path: pyproject.toml
|
|
61
|
+
- run: pip install -e '.[dev]'
|
|
62
|
+
- run: pytest
|
|
63
|
+
|
|
64
|
+
package:
|
|
65
|
+
name: ์ค์น๋ณธ ํ์ธ
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v7
|
|
69
|
+
- uses: actions/setup-python@v7
|
|
70
|
+
with:
|
|
71
|
+
python-version: '3.11'
|
|
72
|
+
- run: pip install build twine
|
|
73
|
+
- run: python -m build
|
|
74
|
+
# README ๊ฐ PyPI ํ๋ก์ ํธ ํ์ด์ง์์ ๋ ๋๋ง๋๋์ง (์๋ ๋งํฌ๋ ์ก์ง ๋ชปํ๋ค)
|
|
75
|
+
- run: twine check --strict dist/*
|
|
76
|
+
# ํธ์ง ๊ฐ๋ฅ ์ค์น์ ๋ฌ๋ฆฌ docs/llm.mdยท์์ค ๋ฌธ์๋ฅผ ํจํค์ง ์ ์ฌ๋ณธ์ผ๋ก ์ฝ์ผ๋ฏ๋ก ์ฌ๋ณธ์ด ๋น ์ง๊ฑฐ๋ ๋ค๋ฅด๋ฉด ์ฌ๊ธฐ์ ๋๋ฌ๋๋ค
|
|
77
|
+
- name: ์ ๊ฐ์ํ๊ฒฝ์ ์ค์นํด ์คํ
|
|
78
|
+
run: |
|
|
79
|
+
python -m venv "$RUNNER_TEMP/velogger-check"
|
|
80
|
+
"$RUNNER_TEMP/velogger-check/bin/pip" install dist/*.whl
|
|
81
|
+
"$RUNNER_TEMP/velogger-check/bin/velogger" --version
|
|
82
|
+
"$RUNNER_TEMP/velogger-check/bin/velogger" guide > "$RUNNER_TEMP/guide.md"
|
|
83
|
+
diff "$RUNNER_TEMP/guide.md" docs/llm.md
|
|
84
|
+
for topic in common velogger; do
|
|
85
|
+
"$RUNNER_TEMP/velogger-check/bin/velogger" guide "$topic" > "$RUNNER_TEMP/$topic.md"
|
|
86
|
+
diff "$RUNNER_TEMP/$topic.md" "docs/$topic.md"
|
|
87
|
+
done
|
|
88
|
+
- uses: actions/upload-artifact@v7
|
|
89
|
+
with:
|
|
90
|
+
name: dist
|
|
91
|
+
path: dist/
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# v* ํ๊ทธ๋ฅผ push ํ๋ฉด PyPI ์ GitHub Release ๋ก ๋ฐฐํฌํ๋ค (references/release.md '๋ฆด๋ฆฌ์ค ์ ์ฐจ').
|
|
2
|
+
# PyPI ๋ API ํ ํฐ ์์ด ์ ๋ขฐ ๊ฒ์(Trusted Publishing)๋ก ์ฌ๋ฆฐ๋ค. pypi.org ์ ๊ฒ์์ ์ค์ ์ ํ๋ก์ ํธ velogger,
|
|
3
|
+
# ์ ์ฅ์ Rukkakka/velogger, ์ํฌํ๋ก release.yml, ํ๊ฒฝ pypi ์ด๊ณ GitHub ํ๊ฒฝ pypi ๋ v* ํ๊ทธ์์๋ง ๋ฐฐํฌ๋ฅผ ๋ฐ๋๋ค.
|
|
4
|
+
name: Release
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags: ['v*']
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
tag:
|
|
15
|
+
name: ํ๊ทธ ํ์ธ
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v7
|
|
19
|
+
with:
|
|
20
|
+
# ํ๊ทธ ์ปค๋ฐ์ด main ์ ์๋์ง ๋ณด๋ ค๊ณ main ๊ธฐ๋ก๊น์ง ๋ฐ๋๋ค
|
|
21
|
+
fetch-depth: 0
|
|
22
|
+
- uses: actions/setup-python@v7
|
|
23
|
+
with:
|
|
24
|
+
python-version: '3.11'
|
|
25
|
+
- name: ํ๊ทธ๊ฐ main ์ ์๊ณ pyproject.toml ๋ฒ์ ยทCHANGELOG ์ ๊ณผ ๋ง๋์ง
|
|
26
|
+
run: |
|
|
27
|
+
if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/main; then
|
|
28
|
+
echo "::error::$GITHUB_REF_NAME ์ด main ์ ์๋ ์ปค๋ฐ์ ๊ฐ๋ฆฌํต๋๋ค. ํ๊ทธ๋ ๋จธ์ง ๋ค main ์๋ง ๋จ๋ค"
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
version=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
|
|
32
|
+
if [ "v$version" != "$GITHUB_REF_NAME" ]; then
|
|
33
|
+
echo "::error::ํ๊ทธ $GITHUB_REF_NAME ์ pyproject.toml ๋ฒ์ $version ์ด ๋ค๋ฆ
๋๋ค"
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
if ! grep -q "^## $version โ " CHANGELOG.md; then
|
|
37
|
+
echo "::error::CHANGELOG.md ์ '## $version โ ๋ ์ง' ์ ์ด ์์ต๋๋ค"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
ci:
|
|
42
|
+
name: CI
|
|
43
|
+
needs: tag
|
|
44
|
+
uses: ./.github/workflows/ci.yml
|
|
45
|
+
|
|
46
|
+
pypi:
|
|
47
|
+
name: PyPI ์ ์ฌ๋ฆฌ๊ธฐ
|
|
48
|
+
needs: ci
|
|
49
|
+
runs-on: ubuntu-latest
|
|
50
|
+
environment:
|
|
51
|
+
name: pypi
|
|
52
|
+
url: https://pypi.org/project/velogger/
|
|
53
|
+
permissions:
|
|
54
|
+
# ์ ๋ขฐ ๊ฒ์์ OIDC ํ ํฐ
|
|
55
|
+
id-token: write
|
|
56
|
+
steps:
|
|
57
|
+
# CI ์ ์ค์น๋ณธ ํ์ธ์ด ๋น๋ยทํ์ธํ ํ์ผ์ ๊ทธ๋๋ก ์ฌ๋ฆฐ๋ค
|
|
58
|
+
- uses: actions/download-artifact@v8
|
|
59
|
+
with:
|
|
60
|
+
name: dist
|
|
61
|
+
path: dist/
|
|
62
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
63
|
+
|
|
64
|
+
github-release:
|
|
65
|
+
name: GitHub Release
|
|
66
|
+
needs: pypi
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
permissions:
|
|
69
|
+
contents: write
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v7
|
|
72
|
+
- uses: actions/download-artifact@v8
|
|
73
|
+
with:
|
|
74
|
+
name: dist
|
|
75
|
+
path: dist/
|
|
76
|
+
- name: CHANGELOG ์ ๊ทธ ๋ฒ์ ์ ๋ก Release ๋ง๋ค๊ธฐ
|
|
77
|
+
env:
|
|
78
|
+
GH_TOKEN: ${{ github.token }}
|
|
79
|
+
run: |
|
|
80
|
+
version="${GITHUB_REF_NAME#v}"
|
|
81
|
+
awk -v head="## $version " 'index($0, head) == 1 {f=1; next} /^## /{if (f) exit} f' CHANGELOG.md > "$RUNNER_TEMP/notes.md"
|
|
82
|
+
gh release create "$GITHUB_REF_NAME" --verify-tag --title "$GITHUB_REF_NAME" --notes-file "$RUNNER_TEMP/notes.md" dist/*
|