viruagent 1.0.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.
- package/.claude/commands/viruagent-post.md +36 -0
- package/.env.example +2 -0
- package/LICENSE +21 -0
- package/README.md +194 -0
- package/bin/viruagent.js +3 -0
- package/config/prompt-config.json +14 -0
- package/config/system-prompt.md +97 -0
- package/package.json +32 -0
- package/src/agent.js +689 -0
- package/src/cli-post.js +93 -0
- package/src/lib/ai.js +192 -0
- package/src/lib/logger.js +27 -0
- package/src/lib/login.js +25 -0
- package/src/lib/tistory.js +243 -0
- package/src/lib/unsplash.js +151 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Generate and publish a blog post with ViruAgent
|
|
3
|
+
allowed-tools: Bash, AskUserQuestion
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ViruAgent Blog Posting
|
|
7
|
+
|
|
8
|
+
Generate an AI blog post on the user's requested topic and publish it to Tistory.
|
|
9
|
+
|
|
10
|
+
Topic: $ARGUMENTS
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. First, fetch the category list:
|
|
15
|
+
```bash
|
|
16
|
+
node src/cli-post.js --list-categories
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. Parse the category list result and use AskUserQuestion to ask the user:
|
|
20
|
+
- **Category**: Select from the fetched category list (present as options)
|
|
21
|
+
- **Visibility**: Choose between public / private / protected
|
|
22
|
+
- **Publish mode**: Publish now / Save as draft / Preview only (dry-run)
|
|
23
|
+
|
|
24
|
+
3. Run the CLI script based on the user's selections:
|
|
25
|
+
```bash
|
|
26
|
+
node src/cli-post.js --topic "$ARGUMENTS" --category [SELECTED_ID] --visibility [SELECTED_VALUE] [--draft] [--dry-run]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
4. Parse the JSON output and display the result to the user:
|
|
30
|
+
- On success: Show title, tags, and URL (if published)
|
|
31
|
+
- On failure: Show error message
|
|
32
|
+
|
|
33
|
+
## Important Notes
|
|
34
|
+
- If `$ARGUMENTS` is empty, use AskUserQuestion to ask for the topic first
|
|
35
|
+
- Only parse JSON output (last line of stdout)
|
|
36
|
+
- On error, inform the user of the cause and suggest a solution
|
package/.env.example
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 tkman
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
<img width="525" height="113" alt="image" src="https://github.com/user-attachments/assets/8bbd21d3-5f14-4d11-933d-17bdf6969ebf" />
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# ViruAgent
|
|
5
|
+
|
|
6
|
+
> 터미널에서 티스토리 블로그 글을 만들고, 다듬고, 발행하는 CLI 도구
|
|
7
|
+
|
|
8
|
+
티스토리 API를 역분석해서 OpenAI와 엮었습니다.
|
|
9
|
+
글감 잡기 → 초안 생성 → 수정 → 발행까지 터미널 안에서 끝납니다.
|
|
10
|
+
|
|
11
|
+
공식 API가 아닌 비공식 내부 통신을 쓰기 때문에, 학습/실험 용도로 만들었습니다.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 뭘 할 수 있나
|
|
16
|
+
|
|
17
|
+
- **AI 대화로 글쓰기** — 챗처럼 대화하면서 아이디어를 다듬고, `/write`로 초안을 뽑고, `/edit`로 고칩니다.
|
|
18
|
+
- **Unsplash 이미지 자동 삽입** — 글 생성 시 주제에 맞는 이미지를 자동 검색하고 티스토리에 업로드합니다. 첫 번째 이미지가 썸네일로 설정됩니다.
|
|
19
|
+
- **브라우저 로그인으로 세션 관리** — OAuth 설정 없이 Playwright로 실제 로그인해서 쿠키를 가져옵니다.
|
|
20
|
+
- **유연한 글 구조** — 5가지 글 유형(튜토리얼, 비교/리뷰, 리스트, 정보 가이드, 인사이트)을 AI가 주제에 맞게 자율 선택합니다.
|
|
21
|
+
- **CLI UX** — 커맨드 힌트, 화살표 키 메뉴, 상태바 등을 넣어서 터미널에서도 불편하지 않게 만들었습니다.
|
|
22
|
+
- **HTML 유지하면서 수정** — 글 구조를 깨뜨리지 않고 특정 부분만 고치거나 말투를 바꿀 수 있습니다.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 시작하기
|
|
27
|
+
|
|
28
|
+
**필요한 것**: Node.js 18+, OpenAI API Key
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
git clone https://github.com/your-username/viruagent.git
|
|
32
|
+
cd viruagent
|
|
33
|
+
npm install
|
|
34
|
+
cp .env.example .env
|
|
35
|
+
# .env 파일 편집
|
|
36
|
+
npm start
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 환경 변수
|
|
40
|
+
|
|
41
|
+
| 변수 | 필수 | 설명 |
|
|
42
|
+
|------|------|------|
|
|
43
|
+
| `OPENAI_API_KEY` | O | OpenAI API 키 |
|
|
44
|
+
| `UNSPLASH_ACCESS_KEY` | X | Unsplash API 키 (없으면 이미지 삽입 건너뜀) |
|
|
45
|
+
|
|
46
|
+
Unsplash API 키는 [unsplash.com/developers](https://unsplash.com/developers)에서 무료로 발급받을 수 있습니다. (시간당 50회 제한)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 명령어
|
|
51
|
+
|
|
52
|
+
<img width="547" height="441" alt="image" src="https://github.com/user-attachments/assets/bda2730d-d055-4872-b2b9-e24aeb7d5fd9" />
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
| 명령어 | 설명 |
|
|
59
|
+
| --------------- | -------------------------------------------- |
|
|
60
|
+
| `/write <주제>` | AI가 블로그 글 초안 생성 |
|
|
61
|
+
| `/edit <지시>` | 초안 수정 ("더 친근하게 바꿔줘" 같은 식으로) |
|
|
62
|
+
| `/preview` | 작성 중인 글 미리보기 |
|
|
63
|
+
| `/publish` | 글 발행 |
|
|
64
|
+
| `/set` | 카테고리, 공개 설정, 모델, 말투 변경 |
|
|
65
|
+
| `/list` | 최근 발행 글 목록 |
|
|
66
|
+
| `/login` | 티스토리 세션 갱신 |
|
|
67
|
+
| `/logout` | 티스토리 세션 삭제 |
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Claude Code로 글쓰기
|
|
72
|
+
|
|
73
|
+
[Claude Code](https://claude.com/claude-code)에서 자연어로 명령할 수 있습니다.
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
> viruagent로 블로그에 글 아무거나 써줘 카테고리는 "기타"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
<img width="1054" height="896" alt="image" src="https://github.com/user-attachments/assets/9e30e0ed-32f9-41a4-b39f-e4e6863d5d2d" />
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
카테고리, 공개 여부, 발행 방식을 물어본 뒤 AI가 글을 생성해서 티스토리에 발행합니다.
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
### 직접 CLI로 실행
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# 카테고리 목록 조회
|
|
90
|
+
node src/cli-post.js --list-categories
|
|
91
|
+
|
|
92
|
+
# 글 생성 + 발행
|
|
93
|
+
node src/cli-post.js --topic "주제" --category 1247460 --visibility public
|
|
94
|
+
|
|
95
|
+
# 미리보기만 (발행 안 함)
|
|
96
|
+
node src/cli-post.js --topic "주제" --dry-run
|
|
97
|
+
|
|
98
|
+
# 임시저장
|
|
99
|
+
node src/cli-post.js --topic "주제" --draft
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Unsplash 이미지 연동
|
|
105
|
+
|
|
106
|
+
글 생성 시 본문에 `<!-- IMAGE: keyword -->` 플레이스홀더가 자동 삽입됩니다. `UNSPLASH_ACCESS_KEY`가 설정되어 있으면:
|
|
107
|
+
|
|
108
|
+
1. 키워드로 Unsplash에서 이미지 검색
|
|
109
|
+
2. 이미지 다운로드 → 티스토리에 업로드
|
|
110
|
+
3. 티스토리 네이티브 이미지 치환자(`[##_Image|kage@..._##]`)로 변환
|
|
111
|
+
4. **첫 번째 이미지가 자동으로 글 썸네일(대표 이미지)로 설정**
|
|
112
|
+
|
|
113
|
+
키가 없으면 이미지 처리를 건너뛰고 글만 발행합니다.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 시스템 프롬프트 커스터마이징
|
|
118
|
+
|
|
119
|
+
글의 톤, 구조, HTML 스타일은 `config/system-prompt.md`에서 수정할 수 있습니다.
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
config/
|
|
123
|
+
├── prompt-config.json # 모델, 말투, 이미지 설정
|
|
124
|
+
└── system-prompt.md # AI 글쓰기 규칙 (글 유형, HTML 레퍼런스, 톤)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 글 유형 (AI가 주제에 맞게 자율 선택)
|
|
128
|
+
|
|
129
|
+
| 유형 | 구조 |
|
|
130
|
+
|------|------|
|
|
131
|
+
| 튜토리얼 | 준비물 → 단계 → 결과 확인 → 트러블슈팅 |
|
|
132
|
+
| 비교/리뷰 | 비교 테이블 + 장단점 → 추천 |
|
|
133
|
+
| 리스트 | 번호 소제목 + 항목별 팁 |
|
|
134
|
+
| 정보 가이드 | 문제 → 원인 → 해결 → FAQ |
|
|
135
|
+
| 인사이트 | 화두 → 근거 → 시사점 → 액션 |
|
|
136
|
+
|
|
137
|
+
### prompt-config.json 설정
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"defaultModel": "gpt-4o-mini",
|
|
142
|
+
"defaultTone": "정보전달",
|
|
143
|
+
"defaultLength": 2500,
|
|
144
|
+
"imageSource": "unsplash",
|
|
145
|
+
"imagesPerPost": 3
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 로그
|
|
152
|
+
|
|
153
|
+
실행 로그가 `logs/` 폴더에 날짜별로 기록됩니다.
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
logs/
|
|
157
|
+
└── 2026-02-11.log
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
이미지 업로드 실패, API 오류 등의 디버깅에 활용할 수 있습니다.
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
[10:30:15.123] [INFO] [unsplash] 이미지 플레이스홀더 3개 발견
|
|
164
|
+
[10:30:16.456] [INFO] [unsplash] Unsplash 이미지 찾음 | {"keyword":"laptop"}
|
|
165
|
+
[10:30:17.789] [INFO] [tistory] 이미지 업로드 성공 | {"url":"https://blog.kakaocdn.net/..."}
|
|
166
|
+
[10:30:17.800] [ERROR] [tistory] 이미지 업로드 실패 | {"status":500}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 기술 스택
|
|
172
|
+
|
|
173
|
+
- **런타임**: Node.js (CommonJS)
|
|
174
|
+
- **AI**: OpenAI SDK
|
|
175
|
+
- **이미지**: Unsplash API
|
|
176
|
+
- **자동화**: Playwright, Fetch
|
|
177
|
+
- **CLI**: Chalk, Readline
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 주의사항
|
|
182
|
+
|
|
183
|
+
이 프로젝트는 티스토리의 **비공식 내부 API**를 사용합니다.
|
|
184
|
+
|
|
185
|
+
- 정책이 바뀌면 언제든 안 될 수 있습니다.
|
|
186
|
+
- 사용에 따른 책임은 본인에게 있습니다.
|
|
187
|
+
|
|
188
|
+
교육/학습 목적으로 만들었습니다.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## License
|
|
193
|
+
|
|
194
|
+
MIT
|
package/bin/viruagent.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tones": [
|
|
3
|
+
{ "name": "정보전달", "description": "객관적이고 신뢰감 있는 톤" },
|
|
4
|
+
{ "name": "친근한", "description": "친구에게 말하듯 편안한 톤" },
|
|
5
|
+
{ "name": "전문적", "description": "권위 있고 격식 있는 톤" },
|
|
6
|
+
{ "name": "유머러스", "description": "재미있고 가벼운 톤" },
|
|
7
|
+
{ "name": "동기부여", "description": "독자에게 용기와 의지를 주는 톤" }
|
|
8
|
+
],
|
|
9
|
+
"defaultTone": "정보전달",
|
|
10
|
+
"defaultLength": 2500,
|
|
11
|
+
"defaultModel": "gpt-4o-mini",
|
|
12
|
+
"imageSource": "unsplash",
|
|
13
|
+
"imagesPerPost": 3
|
|
14
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
당신은 티스토리 블로그 전문 작가입니다.
|
|
2
|
+
검색 유입과 독자 체류 시간을 극대화하는 고품질 블로그 글을 작성합니다.
|
|
3
|
+
|
|
4
|
+
## ⛔ 금지
|
|
5
|
+
|
|
6
|
+
- 마크다운 문법 절대 금지 (`**`, `*`, `~~`, `` ` ``, `###` 등)
|
|
7
|
+
- 반드시 HTML 태그만 사용 (`<strong>`, `<em>`, `<del>` 등)
|
|
8
|
+
|
|
9
|
+
## 글 최상단 고정 구조 (필수)
|
|
10
|
+
|
|
11
|
+
1. 인용문 + 줄바꿈: `<blockquote data-ke-style="style1"><span style="font-family: 'Noto Serif KR';">인용문</span></blockquote><p data-ke-size="size16"><br/></p>`
|
|
12
|
+
2. 썸네일 이미지: `<!-- IMAGE: 주제관련키워드 -->` (첫 번째 이미지 플레이스홀더)
|
|
13
|
+
3. 썸네일 이미지 이후 줄바꿈 1회 `<br/>`
|
|
14
|
+
4. 이후 본문 시작
|
|
15
|
+
|
|
16
|
+
## 글 유형 (자율 선택, 혼합 가능)
|
|
17
|
+
|
|
18
|
+
| 유형 | 구조 |
|
|
19
|
+
| -------------- | -------------------------------------------- |
|
|
20
|
+
| 📘 튜토리얼 | 준비물 → 단계(h2) → 결과 확인 → 트러블슈팅 |
|
|
21
|
+
| ⚖️ 비교/리뷰 | 비교 테이블 + 대상별 h2 + 장단점 불릿 → 추천 |
|
|
22
|
+
| 📋 리스트 | 이모지+번호 소제목, 항목별 2~3문장 + 팁 |
|
|
23
|
+
| 📖 정보 가이드 | 문제 → 원인 → 해결 → FAQ, 불릿/테이블 정리 |
|
|
24
|
+
| 💡 인사이트 | 화두 → 근거(통계) → 시사점 → 독자 액션 |
|
|
25
|
+
|
|
26
|
+
## 티스토리 HTML 레퍼런스
|
|
27
|
+
|
|
28
|
+
문단: `<p data-ke-size="size16">텍스트</p>`
|
|
29
|
+
빈 줄: `<p data-ke-size="size16"> </p>`
|
|
30
|
+
제목: `<h2>`, `<h3>`
|
|
31
|
+
강조: `<strong>굵게</strong>`, `<span style="background-color: #f89009;">배경색</span>`
|
|
32
|
+
|
|
33
|
+
리스트:
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<ul style="list-style-type: circle;" data-ke-list-type="circle">
|
|
37
|
+
<li>원형</li>
|
|
38
|
+
</ul>
|
|
39
|
+
<ul style="list-style-type: disc;" data-ke-list-type="disc">
|
|
40
|
+
<li>채움</li>
|
|
41
|
+
</ul>
|
|
42
|
+
<ol style="list-style-type: decimal;" data-ke-list-type="decimal">
|
|
43
|
+
<li>숫자</li>
|
|
44
|
+
</ol>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
테이블 (data-ke-style: style1~style15):
|
|
48
|
+
|
|
49
|
+
```html
|
|
50
|
+
<table style="border-collapse: collapse; width: 100%;" border="1" data-ke-align="alignLeft" data-ke-style="style13">
|
|
51
|
+
<tbody>
|
|
52
|
+
<tr>
|
|
53
|
+
<td style="width: 50%;">열1</td>
|
|
54
|
+
<td style="width: 50%;">열2</td>
|
|
55
|
+
</tr>
|
|
56
|
+
</tbody>
|
|
57
|
+
</table>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
인용 (style1=따옴표, style2=슬라이스, style3=박스):
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<blockquote data-ke-style="style1"><span style="font-family: 'Noto Serif KR';">텍스트</span></blockquote>
|
|
64
|
+
<blockquote data-ke-style="style2">텍스트</blockquote>
|
|
65
|
+
<blockquote data-ke-style="style3">텍스트</blockquote>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
구분선 (style1~style8, style6 권장):
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<hr contenteditable="false" data-ke-type="horizontalRule" data-ke-style="style6" />
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
코드 블록:
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<pre id="code_[timestamp]" class="[lang]" data-ke-language="[lang]" data-ke-type="codeblock"><code>코드</code></pre>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 구분선 규칙 (필수)
|
|
81
|
+
|
|
82
|
+
- 각 h2 섹션(주제) 사이에 구분선을 삽입하세요
|
|
83
|
+
- 하나의 글 안에서는 반드시 동일한 style의 구분선만 사용 (style1~style8 중 하나를 글 시작 시 선택 후 통일)
|
|
84
|
+
- 예: 첫 구분선을 style3으로 썼다면 글 끝까지 style3만 사용
|
|
85
|
+
|
|
86
|
+
## 톤 & 스타일
|
|
87
|
+
|
|
88
|
+
- 친근하면서도 전문적인 톤, 2인칭 표현
|
|
89
|
+
- 소제목에 이모지 활용
|
|
90
|
+
- 한 문단 2~4문장, 짧을수록 좋음
|
|
91
|
+
- 시각 요소 교차 배치 (리스트 → 문단 → 테이블)
|
|
92
|
+
- 한국어로 작성
|
|
93
|
+
|
|
94
|
+
## 이미지 플레이스홀더
|
|
95
|
+
|
|
96
|
+
본문 중 `<!-- IMAGE: 영문키워드 -->` 형식으로 3개 내외 삽입
|
|
97
|
+
키워드는 영문 1~3단어, 섹션 전환 지점에 배치
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "viruagent",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI 기반 티스토리 블로그 자동 발행 CLI 도구",
|
|
5
|
+
"main": "src/agent.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"viruagent": "./bin/viruagent.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "node --no-deprecation src/agent.js",
|
|
11
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
12
|
+
},
|
|
13
|
+
"keywords": ["tistory", "blog", "openai", "cli", "ai"],
|
|
14
|
+
"author": "tkman",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/greekr4/Viruagent.git"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/greekr4/Viruagent#readme",
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18.0.0"
|
|
23
|
+
},
|
|
24
|
+
"type": "commonjs",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"chalk": "^4.1.2",
|
|
27
|
+
"dotenv": "^16.4.7",
|
|
28
|
+
"oh-my-logo": "^0.4.0",
|
|
29
|
+
"openai": "^4.77.0",
|
|
30
|
+
"playwright": "^1.58.2"
|
|
31
|
+
}
|
|
32
|
+
}
|