viruagent-cli 0.3.7 → 0.4.1
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 +41 -25
- package/README.md +40 -24
- package/bin/index.js +91 -1
- package/package.json +3 -2
- package/skills/viruagent-insta.md +163 -0
- package/skills/viruagent-naver.md +122 -0
- package/skills/viruagent-tistory.md +117 -0
- package/skills/viruagent.md +37 -246
- package/src/providers/insta/apiClient.js +630 -0
- package/src/providers/insta/auth.js +135 -0
- package/src/providers/insta/index.js +293 -0
- package/src/providers/insta/session.js +118 -0
- package/src/providers/insta/smartComment.js +67 -0
- package/src/providers/insta/utils.js +34 -0
- package/src/runner.js +82 -9
- package/src/services/providerManager.js +5 -2
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: viruagent-tistory
|
|
3
|
+
description: Tistory blog publishing via viruagent-cli. Login, categories, content creation, image upload, and publishing.
|
|
4
|
+
triggers:
|
|
5
|
+
- 티스토리
|
|
6
|
+
- tistory
|
|
7
|
+
- 티스토리 블로그
|
|
8
|
+
- tistory blog
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# viruagent-tistory — Tistory Blog Publishing Skill
|
|
12
|
+
|
|
13
|
+
You are a Tistory blog publishing agent using `viruagent-cli`. Always use `--provider tistory`.
|
|
14
|
+
|
|
15
|
+
## Step 1: Check authentication
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx viruagent-cli status --provider tistory
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If not logged in:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx viruagent-cli login --provider tistory --username <kakao_id> --password <pass> --headless
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If 2FA is required (`pending_2fa`), ask the user to approve in Kakao app, then retry status check.
|
|
28
|
+
|
|
29
|
+
Environment variables: `TISTORY_USERNAME` / `TISTORY_PASSWORD`
|
|
30
|
+
|
|
31
|
+
## Step 2: Get categories
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx viruagent-cli list-categories --provider tistory
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Ask the user which category to use if not specified.
|
|
38
|
+
|
|
39
|
+
## Step 3: Create content
|
|
40
|
+
|
|
41
|
+
Write content in HTML using the Tistory template. Tistory uses `data-ke-*` attributes.
|
|
42
|
+
|
|
43
|
+
### HTML Template
|
|
44
|
+
|
|
45
|
+
```html
|
|
46
|
+
<!-- 1. Hook -->
|
|
47
|
+
<blockquote data-ke-style="style2">[One impactful sentence]</blockquote>
|
|
48
|
+
<p data-ke-size="size16"> </p>
|
|
49
|
+
|
|
50
|
+
<!-- 2. Introduction (2~3 paragraphs) -->
|
|
51
|
+
<p data-ke-size="size18">[Context and reader empathy, 3~5 sentences]</p>
|
|
52
|
+
<p data-ke-size="size18">[What this post covers]</p>
|
|
53
|
+
<p data-ke-size="size16"> </p>
|
|
54
|
+
|
|
55
|
+
<!-- 3. Body (3~4 sections) -->
|
|
56
|
+
<h2>[Section Title]</h2>
|
|
57
|
+
<p data-ke-size="size18">[3~5 sentences with evidence]</p>
|
|
58
|
+
<p data-ke-size="size18">[Analysis and implications]</p>
|
|
59
|
+
<p data-ke-size="size16"> </p>
|
|
60
|
+
|
|
61
|
+
<!-- Repeat for 2~3 more sections -->
|
|
62
|
+
|
|
63
|
+
<!-- 4. Summary -->
|
|
64
|
+
<h2>핵심 정리</h2>
|
|
65
|
+
<ul>
|
|
66
|
+
<li>[Takeaway 1]</li>
|
|
67
|
+
<li>[Takeaway 2]</li>
|
|
68
|
+
<li>[Takeaway 3]</li>
|
|
69
|
+
</ul>
|
|
70
|
+
<p data-ke-size="size16"> </p>
|
|
71
|
+
|
|
72
|
+
<!-- 5. Closing -->
|
|
73
|
+
<p data-ke-size="size18">[Specific actionable suggestion]</p>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Tistory-Specific Rules
|
|
77
|
+
|
|
78
|
+
- Use `<p data-ke-size="size18">` for body text
|
|
79
|
+
- Use `<p data-ke-size="size16"> </p>` for spacing
|
|
80
|
+
- Use `<blockquote data-ke-style="style2">` for hook
|
|
81
|
+
|
|
82
|
+
## Step 4: Publish
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx viruagent-cli publish \
|
|
86
|
+
--provider tistory \
|
|
87
|
+
--title "Post Title" \
|
|
88
|
+
--content "<h2>...</h2><p>...</p>" \
|
|
89
|
+
--category <id> \
|
|
90
|
+
--tags "tag1,tag2,tag3,tag4,tag5" \
|
|
91
|
+
--visibility public \
|
|
92
|
+
--related-image-keywords "keyword1,keyword2" \
|
|
93
|
+
--image-upload-limit 2 \
|
|
94
|
+
--minimum-image-count 1
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
For drafts: `save-draft` instead of `publish`.
|
|
98
|
+
|
|
99
|
+
### Image Rules
|
|
100
|
+
|
|
101
|
+
- Always include `--related-image-keywords` with 2~3 English keywords
|
|
102
|
+
- Set `--image-upload-limit 2` and `--minimum-image-count 1`
|
|
103
|
+
- Never use `--no-auto-upload-images` unless user explicitly asks
|
|
104
|
+
|
|
105
|
+
## Step 5: Verify
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npx viruagent-cli list-posts --provider tistory --limit 1
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Other Commands
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
npx viruagent-cli read-post --provider tistory --post-id <id>
|
|
115
|
+
npx viruagent-cli list-posts --provider tistory --limit 10
|
|
116
|
+
npx viruagent-cli logout --provider tistory
|
|
117
|
+
```
|
package/skills/viruagent.md
CHANGED
|
@@ -1,266 +1,64 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: viruagent
|
|
3
|
-
description:
|
|
3
|
+
description: viruagent-cli overview. Routes to platform-specific skills — /viruagent-tistory, /viruagent-naver, /viruagent-insta.
|
|
4
4
|
triggers:
|
|
5
5
|
- 블로그
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
- blog post
|
|
9
|
-
- 블로그 글
|
|
10
|
-
- 블로그 발행
|
|
6
|
+
- blog
|
|
7
|
+
- viruagent
|
|
11
8
|
- 블로그 써줘
|
|
12
9
|
- publish blog
|
|
13
|
-
- naver blog
|
|
14
|
-
- 네이버 블로그
|
|
15
10
|
---
|
|
16
11
|
|
|
17
|
-
# viruagent —
|
|
12
|
+
# viruagent — Platform Router
|
|
18
13
|
|
|
19
|
-
You are
|
|
14
|
+
You are an agent using `viruagent-cli`. Route to the correct skill based on the user's request.
|
|
20
15
|
|
|
21
|
-
##
|
|
16
|
+
## Available Skills
|
|
22
17
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
## Step 2: Check authentication
|
|
30
|
-
|
|
31
|
-
### Tistory
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
npx viruagent-cli status --provider tistory
|
|
35
|
-
```
|
|
18
|
+
| Skill | Platform | Triggers |
|
|
19
|
+
|-------|----------|----------|
|
|
20
|
+
| `/viruagent-tistory` | Tistory Blog | 티스토리, tistory |
|
|
21
|
+
| `/viruagent-naver` | Naver Blog | 네이버, naver blog |
|
|
22
|
+
| `/viruagent-insta` | Instagram | 인스타, instagram, 좋아요, 댓글, 팔로우 |
|
|
36
23
|
|
|
37
|
-
|
|
24
|
+
## Quick Reference
|
|
38
25
|
|
|
39
26
|
```bash
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
If 2FA is required (response contains `pending_2fa`), ask the user to approve the login on their mobile device (Kakao app notification), then retry the status check.
|
|
44
|
-
|
|
45
|
-
### Naver Blog
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
npx viruagent-cli status --provider naver
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
If not logged in, authenticate:
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
# Manual login via browser
|
|
55
|
-
npx viruagent-cli login --provider naver --manual
|
|
56
|
-
|
|
57
|
-
# Auto login with credentials (NAVER_USERNAME / NAVER_PASSWORD env vars also work)
|
|
58
|
-
npx viruagent-cli login --provider naver --username <user> --password <pass>
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Step 3: Get categories (for publish)
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
npx viruagent-cli list-categories --provider <tistory|naver>
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Ask the user which category to use if not specified.
|
|
68
|
-
|
|
69
|
-
## Step 4: Create content and tags
|
|
70
|
-
|
|
71
|
-
When the user asks to write a blog post:
|
|
72
|
-
|
|
73
|
-
1. **Write the content** in HTML format following the structure below
|
|
74
|
-
2. **Generate exactly 5 tags** relevant to the post topic, in the same language as the content
|
|
75
|
-
3. **Validate with dry-run** before publishing
|
|
76
|
-
|
|
77
|
-
### Blog Post Structure (MUST FOLLOW)
|
|
78
|
-
|
|
79
|
-
Every post must follow this structure. Write in the same language as the user's request.
|
|
80
|
-
|
|
81
|
-
#### Tistory HTML Template
|
|
82
|
-
|
|
83
|
-
Tistory uses `data-ke-*` attributes for styling.
|
|
84
|
-
|
|
85
|
-
```html
|
|
86
|
-
<!-- 1. Hook (blockquote style2 for topic quote) -->
|
|
87
|
-
<blockquote data-ke-style="style2">[One impactful sentence that captures the core insight or tension]</blockquote>
|
|
88
|
-
<p data-ke-size="size16"> </p>
|
|
89
|
-
|
|
90
|
-
<!-- 2. Introduction (2~3 paragraphs: context, reader empathy, what this post covers) -->
|
|
91
|
-
<p data-ke-size="size18">[Describe the situation the reader relates to — paint a vivid picture, 3~5 sentences]</p>
|
|
92
|
-
<p data-ke-size="size18">[Set expectations: what angle this post takes, what the reader will gain]</p>
|
|
93
|
-
<p data-ke-size="size16"> </p>
|
|
27
|
+
# Check available providers
|
|
28
|
+
npx viruagent-cli list-providers
|
|
94
29
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
<h2>[Section 1 Title — keyword-rich]</h2>
|
|
98
|
-
<p data-ke-size="size18">[Explain the concept or situation in 3~5 sentences. Include evidence: expert quotes, data, or real-world examples]</p>
|
|
99
|
-
<p data-ke-size="size18">[Deepen the point with analysis, comparison, or implication. Connect to the reader's experience]</p>
|
|
100
|
-
<ul>
|
|
101
|
-
<li>[Key point — only use lists for 3+ concrete items worth scanning]</li>
|
|
102
|
-
<li>[Key point]</li>
|
|
103
|
-
<li>[Key point]</li>
|
|
104
|
-
</ul>
|
|
105
|
-
<p data-ke-size="size16"> </p>
|
|
106
|
-
|
|
107
|
-
<h2>[Section 2 Title]</h2>
|
|
108
|
-
<p data-ke-size="size18">[Introduce a new angle, case study, or supporting argument. 3~5 sentences with specific details]</p>
|
|
109
|
-
<p data-ke-size="size18">[Analyze why this matters. Use <strong>bold</strong> for key terms. Connect back to the main thesis]</p>
|
|
110
|
-
<p data-ke-size="size16"> </p>
|
|
111
|
-
|
|
112
|
-
<h2>[Section 3 Title]</h2>
|
|
113
|
-
<p data-ke-size="size18">[Practical application or actionable insight. Show, don't just tell]</p>
|
|
114
|
-
<p data-ke-size="size18">[Bridge to the conclusion — "what this all means"]</p>
|
|
115
|
-
<p data-ke-size="size16"> </p>
|
|
116
|
-
|
|
117
|
-
<!-- 4. Summary / Key Takeaways -->
|
|
118
|
-
<h2>핵심 정리</h2>
|
|
119
|
-
<ul>
|
|
120
|
-
<li>[Takeaway 1 — one complete sentence, not a fragment]</li>
|
|
121
|
-
<li>[Takeaway 2]</li>
|
|
122
|
-
<li>[Takeaway 3]</li>
|
|
123
|
-
</ul>
|
|
124
|
-
<p data-ke-size="size16"> </p>
|
|
125
|
-
|
|
126
|
-
<!-- 5. Closing (specific action the reader can take) -->
|
|
127
|
-
<p data-ke-size="size18">[Closing 1~2 sentences — suggest a concrete, immediate action. Not vague "stay tuned" but specific "try this tomorrow"]</p>
|
|
30
|
+
# Check CLI schema
|
|
31
|
+
npx viruagent-cli --spec
|
|
128
32
|
```
|
|
129
33
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
Naver converts HTML to editor components server-side. Do NOT use `data-ke-*` attributes. Use plain HTML with `<p> </p>` for spacing.
|
|
133
|
-
|
|
134
|
-
```html
|
|
135
|
-
<!-- 1. Hook -->
|
|
136
|
-
<blockquote>[One impactful sentence that captures the core insight or tension]</blockquote>
|
|
137
|
-
<p> </p>
|
|
138
|
-
|
|
139
|
-
<!-- 2. Introduction (2~3 paragraphs) -->
|
|
140
|
-
<p>[Describe the situation the reader relates to — paint a vivid picture, 3~5 sentences]</p>
|
|
141
|
-
<p>[Set expectations: what angle this post takes, what the reader will gain]</p>
|
|
142
|
-
<p> </p>
|
|
143
|
-
|
|
144
|
-
<!-- 3. Body (3~4 sections with h2, each section has 2~3 paragraphs) -->
|
|
145
|
-
<h2>[Section 1 Title — keyword-rich]</h2>
|
|
146
|
-
<p>[Explain the concept or situation in 3~5 sentences. Include evidence: expert quotes, data, or real-world examples]</p>
|
|
147
|
-
<p>[Deepen the point with analysis, comparison, or implication. Connect to the reader's experience]</p>
|
|
148
|
-
<ul>
|
|
149
|
-
<li>[Key point — only use lists for 3+ concrete items worth scanning]</li>
|
|
150
|
-
<li>[Key point]</li>
|
|
151
|
-
<li>[Key point]</li>
|
|
152
|
-
</ul>
|
|
153
|
-
<p> </p>
|
|
154
|
-
|
|
155
|
-
<h2>[Section 2 Title]</h2>
|
|
156
|
-
<p>[Introduce a new angle, case study, or supporting argument. 3~5 sentences with specific details]</p>
|
|
157
|
-
<p>[Analyze why this matters. Use <strong>bold</strong> for key terms. Connect back to the main thesis]</p>
|
|
158
|
-
<p> </p>
|
|
34
|
+
All responses are JSON: `{ "ok": true, "data": {...} }` on success, `{ "ok": false, "error": "...", "message": "...", "hint": "..." }` on failure.
|
|
159
35
|
|
|
160
|
-
|
|
161
|
-
<p>[Practical application or actionable insight. Show, don't just tell]</p>
|
|
162
|
-
<p>[Bridge to the conclusion — "what this all means"]</p>
|
|
163
|
-
<p> </p>
|
|
36
|
+
## Routing Rules
|
|
164
37
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
<li>[Takeaway 2]</li>
|
|
170
|
-
<li>[Takeaway 3]</li>
|
|
171
|
-
</ul>
|
|
172
|
-
<p> </p>
|
|
38
|
+
- User says "블로그 써줘" without specifying platform → ask which platform (Tistory or Naver)
|
|
39
|
+
- User says "티스토리" or "tistory" → use `/viruagent-tistory`
|
|
40
|
+
- User says "네이버" or "naver" → use `/viruagent-naver`
|
|
41
|
+
- User says "인스타" or mentions like/comment/follow → use `/viruagent-insta`
|
|
173
42
|
|
|
174
|
-
|
|
175
|
-
<p>[Closing 1~2 sentences — suggest a concrete, immediate action]</p>
|
|
176
|
-
```
|
|
43
|
+
## Writing Rules (Shared)
|
|
177
44
|
|
|
178
|
-
|
|
45
|
+
These rules apply to both Tistory and Naver blog publishing:
|
|
179
46
|
|
|
180
47
|
- **Title**: Include the primary keyword. 10~20 characters. Short and impactful.
|
|
181
|
-
- **Length**: 3000~4000 characters
|
|
182
|
-
- **Paragraphs**: 3~5 sentences each.
|
|
183
|
-
- **
|
|
184
|
-
- **Font size (Naver)**: Use plain `<p>` tags. Do NOT use `data-ke-*` attributes — Naver's editor ignores them.
|
|
185
|
-
- **Spacing (Tistory)**: Use `<p data-ke-size="size16"> </p>` between sections for line breaks.
|
|
186
|
-
- **Spacing (Naver)**: Use `<p> </p>` between sections.
|
|
187
|
-
- **Hook (Tistory)**: Always use `<blockquote data-ke-style="style2">` for the opening topic quote.
|
|
188
|
-
- **Hook (Naver)**: Use plain `<blockquote>` — Naver converts it to a quotation component.
|
|
189
|
-
- **Introduction**: 2~3 paragraphs that set context and build reader empathy before diving into the body.
|
|
48
|
+
- **Length**: 3000~4000 characters. Aim for depth, not padding.
|
|
49
|
+
- **Paragraphs**: 3~5 sentences each. Do NOT write 1~2 sentence paragraphs repeatedly.
|
|
50
|
+
- **Introduction**: 2~3 paragraphs that set context and build reader empathy.
|
|
190
51
|
- **Body sections**: Each h2 section must have 2~3 substantial paragraphs. Do NOT jump straight to bullet lists.
|
|
191
|
-
- **Lists**: Use sparingly — only for 3+ concrete, scannable items.
|
|
192
|
-
- **Evidence**: Each body section should include at least one of: expert quote, data point, real
|
|
193
|
-
- **Perspective shift**: Include at least one moment that reframes the reader's thinking
|
|
194
|
-
- **Transitions**: Connect sections with bridge sentences.
|
|
195
|
-
- **Bold**: Use `<strong>` for key terms
|
|
196
|
-
- **Subheadings**: Use `<h2>` for ALL section titles. Do NOT use `<h3>`.
|
|
197
|
-
- **Tone**: Conversational but substantive.
|
|
198
|
-
- **Closing**: End with a specific, actionable suggestion
|
|
199
|
-
- **SEO**: Primary keyword in title, first paragraph, and at least one `<h2>`.
|
|
200
|
-
|
|
201
|
-
```bash
|
|
202
|
-
npx viruagent-cli publish \
|
|
203
|
-
--provider tistory \
|
|
204
|
-
--title "Post Title" \
|
|
205
|
-
--content "<h2>...</h2><p>...</p>" \
|
|
206
|
-
--category <id> \
|
|
207
|
-
--tags "tag1,tag2,tag3,tag4,tag5" \
|
|
208
|
-
--visibility public \
|
|
209
|
-
--related-image-keywords "keyword1,keyword2" \
|
|
210
|
-
--image-upload-limit 2 \
|
|
211
|
-
--minimum-image-count 1 \
|
|
212
|
-
--dry-run
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
## Step 5: Publish
|
|
216
|
-
|
|
217
|
-
### Tistory
|
|
218
|
-
|
|
219
|
-
```bash
|
|
220
|
-
npx viruagent-cli publish \
|
|
221
|
-
--provider tistory \
|
|
222
|
-
--title "Post Title" \
|
|
223
|
-
--content "<h2>...</h2><p>...</p>" \
|
|
224
|
-
--category <id> \
|
|
225
|
-
--tags "tag1,tag2,tag3,tag4,tag5" \
|
|
226
|
-
--visibility public \
|
|
227
|
-
--related-image-keywords "keyword1,keyword2" \
|
|
228
|
-
--image-upload-limit 2 \
|
|
229
|
-
--minimum-image-count 1
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Naver Blog
|
|
233
|
-
|
|
234
|
-
```bash
|
|
235
|
-
npx viruagent-cli publish \
|
|
236
|
-
--provider naver \
|
|
237
|
-
--title "Post Title" \
|
|
238
|
-
--content "<h2>...</h2><p>...</p>" \
|
|
239
|
-
--category <id> \
|
|
240
|
-
--tags "tag1,tag2,tag3,tag4,tag5" \
|
|
241
|
-
--visibility public \
|
|
242
|
-
--related-image-keywords "keyword1,keyword2" \
|
|
243
|
-
--image-upload-limit 1 \
|
|
244
|
-
--minimum-image-count 1
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
For drafts, use `save-draft` instead of `publish` (Naver saves as private post).
|
|
248
|
-
|
|
249
|
-
### Image Rules (MUST FOLLOW)
|
|
250
|
-
|
|
251
|
-
- **Always** include `--related-image-keywords` with 2~3 keywords relevant to the post topic
|
|
252
|
-
- **Tistory**: set `--image-upload-limit 2` and `--minimum-image-count 1`
|
|
253
|
-
- **Naver**: set `--image-upload-limit 1` and `--minimum-image-count 1`
|
|
254
|
-
- Keywords should be in English for better image search results
|
|
255
|
-
- Never use `--no-auto-upload-images` unless the user explicitly asks
|
|
256
|
-
|
|
257
|
-
## Step 6: Verify
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
npx viruagent-cli list-posts --provider tistory --limit 1
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
Confirm the post was published and share the result with the user.
|
|
52
|
+
- **Lists**: Use sparingly — only for 3+ concrete, scannable items.
|
|
53
|
+
- **Evidence**: Each body section should include at least one of: expert quote, data point, real example.
|
|
54
|
+
- **Perspective shift**: Include at least one moment that reframes the reader's thinking.
|
|
55
|
+
- **Transitions**: Connect sections with bridge sentences.
|
|
56
|
+
- **Bold**: Use `<strong>` for key terms (2~3 per section max).
|
|
57
|
+
- **Subheadings**: Use `<h2>` for ALL section titles. Do NOT use `<h3>`.
|
|
58
|
+
- **Tone**: Conversational but substantive.
|
|
59
|
+
- **Closing**: End with a specific, actionable suggestion.
|
|
60
|
+
- **SEO**: Primary keyword in title, first paragraph, and at least one `<h2>`.
|
|
61
|
+
- **Tags**: Exactly 5, comma-separated, matching post language.
|
|
264
62
|
|
|
265
63
|
## Error Recovery
|
|
266
64
|
|
|
@@ -271,16 +69,9 @@ Confirm the post was published and share the result with the user.
|
|
|
271
69
|
| `PROVIDER_NOT_FOUND` | Check with `list-providers` |
|
|
272
70
|
| `INVALID_POST_ID` | Verify post ID with `list-posts` |
|
|
273
71
|
|
|
274
|
-
## Other Commands
|
|
275
|
-
|
|
276
|
-
- `npx viruagent-cli read-post --post-id <id>` — Read a specific post
|
|
277
|
-
- `npx viruagent-cli list-posts --limit 10` — List recent posts
|
|
278
|
-
- `npx viruagent-cli logout --provider tistory` — End session
|
|
279
|
-
|
|
280
72
|
## Important Notes
|
|
281
73
|
|
|
282
74
|
- Always use `--dry-run` before actual publish to validate parameters
|
|
283
75
|
- Content must be valid HTML
|
|
284
|
-
- Tags: exactly 5, comma-separated, matching post language
|
|
285
76
|
- Default provider is `tistory`
|
|
286
77
|
- For `--content-file`, use absolute paths
|