@nano-step/skill-manager 5.1.0 → 5.2.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/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/skills/blog-workflow/SKILL.md +522 -0
- package/skills/blog-workflow/skill.json +16 -0
- package/skills/comprehensive-feature-builder/SKILL.md +558 -0
- package/skills/comprehensive-feature-builder/skill.json +9 -0
- package/skills/idea-workflow/SKILL.md +229 -0
- package/skills/idea-workflow/skill.json +14 -0
- package/skills/reddit-workflow/SKILL.md +187 -0
- package/skills/reddit-workflow/skill.json +14 -0
- package/skills/rtk-setup/SKILL.md +118 -0
- package/skills/rtk-setup/skill.json +14 -0
- package/skills/security-workflow/SKILL.md +258 -0
- package/skills/security-workflow/skill.json +15 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +309 -0
- package/skills/skill-creator/references/metadata-quality-criteria.md +76 -0
- package/skills/skill-creator/references/plugin-marketplace-hosting.md +101 -0
- package/skills/skill-creator/references/plugin-marketplace-overview.md +55 -0
- package/skills/skill-creator/references/plugin-marketplace-schema.md +88 -0
- package/skills/skill-creator/references/plugin-marketplace-sources.md +103 -0
- package/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +80 -0
- package/skills/skill-creator/references/script-quality-criteria.md +106 -0
- package/skills/skill-creator/references/structure-organization-criteria.md +114 -0
- package/skills/skill-creator/references/token-efficiency-criteria.md +74 -0
- package/skills/skill-creator/references/validation-checklist.md +83 -0
- package/skills/skill-creator/scripts/encoding_utils.py +36 -0
- package/skills/skill-creator/scripts/init_skill.py +308 -0
- package/skills/skill-creator/scripts/package_skill.py +115 -0
- package/skills/skill-creator/scripts/quick_validate.py +69 -0
- package/skills/skill-creator/skill.json +14 -0
- package/skills/team-workflow/SKILL.md +227 -0
- package/skills/team-workflow/skill.json +15 -0
- package/skills/ui-ux-pro-max/SKILL.md +292 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/ui-ux-pro-max/skill.json +16 -0
package/dist/utils.d.ts
CHANGED
package/dist/utils.js
CHANGED
|
@@ -13,7 +13,7 @@ exports.writeText = writeText;
|
|
|
13
13
|
const path_1 = __importDefault(require("path"));
|
|
14
14
|
const os_1 = __importDefault(require("os"));
|
|
15
15
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
16
|
-
exports.MANAGER_VERSION = "5.1
|
|
16
|
+
exports.MANAGER_VERSION = "5.2.1";
|
|
17
17
|
async function detectOpenCodePaths() {
|
|
18
18
|
const homeConfig = path_1.default.join(os_1.default.homedir(), ".config", "opencode");
|
|
19
19
|
const cwd = process.cwd();
|
package/package.json
CHANGED
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Draft SEO-optimized technology blog posts for multiple platforms based on the current project or latest changes
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## User Input
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
$ARGUMENTS
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
You **MUST** consider the user input before proceeding (if not empty).
|
|
12
|
+
|
|
13
|
+
⚠️ **FIRST — check if `$ARGUMENTS` is exactly the word `help` (case-insensitive). If yes, jump directly to the [Help Output](#help-output) section below and STOP. Do NOT run any other phase.**
|
|
14
|
+
|
|
15
|
+
### Argument Parsing
|
|
16
|
+
|
|
17
|
+
Parse `$ARGUMENTS` to extract **platform selection**, **flags**, and **topic**.
|
|
18
|
+
|
|
19
|
+
**Syntax**: `/blog [platforms] [lang:vi|en] [file] [screenshot] [topic]`
|
|
20
|
+
|
|
21
|
+
All options are plain keywords — no dashes, no `--` prefix. This avoids conflict with the chat interface.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### Help Output
|
|
26
|
+
|
|
27
|
+
If `$ARGUMENTS` is `help` (case-insensitive, with or without extra whitespace), output the following help text **exactly** and then **STOP** — do not proceed to any other phase:
|
|
28
|
+
|
|
29
|
+
````
|
|
30
|
+
/blog — SEO-optimized blog post generator for multiple platforms
|
|
31
|
+
|
|
32
|
+
USAGE
|
|
33
|
+
/blog [platforms] [options] [topic]
|
|
34
|
+
|
|
35
|
+
PLATFORMS (comma-separated, default: all)
|
|
36
|
+
devto, dev.to dev.to
|
|
37
|
+
linkedin LinkedIn (short post + long-form article)
|
|
38
|
+
medium Medium
|
|
39
|
+
hashnode Hashnode
|
|
40
|
+
blog, hoainho hoainho.info/blog (canonical source)
|
|
41
|
+
thnk, thnkandgrow thnkandgrow.com
|
|
42
|
+
all All 6 platforms
|
|
43
|
+
|
|
44
|
+
OPTIONS (plain keywords, no dashes)
|
|
45
|
+
lang:en Write in English (default)
|
|
46
|
+
lang:vi Write in Vietnamese (tech terms stay in English)
|
|
47
|
+
file Save output as .md files in ./blog-output/
|
|
48
|
+
screenshot Capture app screenshots via Playwright and embed in posts
|
|
49
|
+
help Show this help message
|
|
50
|
+
|
|
51
|
+
EXAMPLES
|
|
52
|
+
/blog help Show this guide
|
|
53
|
+
/blog All platforms, English, auto-detect topic
|
|
54
|
+
/blog devto,medium My new feature dev.to + Medium only
|
|
55
|
+
/blog lang:vi All platforms, Vietnamese
|
|
56
|
+
/blog linkedin lang:vi AI Sandbox tips LinkedIn, Vietnamese
|
|
57
|
+
/blog file hashnode Deep dive into auth Hashnode, save to file
|
|
58
|
+
/blog screenshot file blog,thnk Release v2 Personal blogs, screenshots, files
|
|
59
|
+
/blog all lang:vi file screenshot Full combo
|
|
60
|
+
|
|
61
|
+
OUTPUT (default: inline)
|
|
62
|
+
Prints each platform version directly in chat, separated by ---
|
|
63
|
+
|
|
64
|
+
OUTPUT (file)
|
|
65
|
+
./blog-output/
|
|
66
|
+
├── index.md Summary with links to all versions
|
|
67
|
+
├── {slug}-devto.md dev.to version with frontmatter
|
|
68
|
+
├── {slug}-linkedin-post.md LinkedIn short post
|
|
69
|
+
├── {slug}-linkedin-article.md LinkedIn long-form article
|
|
70
|
+
├── {slug}-medium.md Medium version
|
|
71
|
+
├── {slug}-hashnode.md Hashnode version
|
|
72
|
+
├── {slug}-hoainho.md hoainho.info/blog version
|
|
73
|
+
├── {slug}-thnkandgrow.md thnkandgrow.com version
|
|
74
|
+
└── screenshots/ (only with screenshot option)
|
|
75
|
+
├── hero.png Main app screenshot
|
|
76
|
+
├── feature-1.png Key feature screenshots
|
|
77
|
+
└── mobile.png Mobile viewport
|
|
78
|
+
|
|
79
|
+
NOTES
|
|
80
|
+
• Canonical URL is always hoainho.info/blog unless overridden
|
|
81
|
+
• Posts include SEO keywords, meta descriptions, and platform-native formatting
|
|
82
|
+
• Cross-platform publishing schedule included in output
|
|
83
|
+
• Screenshots require a running dev server or build output
|
|
84
|
+
````
|
|
85
|
+
|
|
86
|
+
**Do NOT proceed with any other phase after printing help.**
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
#### Platform Identifiers
|
|
91
|
+
|
|
92
|
+
Case-insensitive, comma-separated, no spaces:
|
|
93
|
+
|
|
94
|
+
| Identifier | Platform |
|
|
95
|
+
|------------|----------|
|
|
96
|
+
| `devto` or `dev.to` | dev.to |
|
|
97
|
+
| `linkedin` | LinkedIn (both short post + long-form article) |
|
|
98
|
+
| `medium` | Medium |
|
|
99
|
+
| `hashnode` | Hashnode |
|
|
100
|
+
| `blog` or `hoainho` | hoainho.info/blog |
|
|
101
|
+
| `thnk` or `thnkandgrow` | thnkandgrow.com |
|
|
102
|
+
| `all` | All 6 platforms (default when no platform specified) |
|
|
103
|
+
|
|
104
|
+
#### Options
|
|
105
|
+
|
|
106
|
+
Plain keywords (no dashes) — can appear anywhere in `$ARGUMENTS`:
|
|
107
|
+
|
|
108
|
+
| Option | Default | Description |
|
|
109
|
+
|--------|---------|-------------|
|
|
110
|
+
| `lang:vi` | `en` | Generate all content in Vietnamese. Tech terms (React, Docker, API...) stay in English. |
|
|
111
|
+
| `lang:en` | `en` | Generate all content in English (default). |
|
|
112
|
+
| `file` | off | Save each platform version as a separate `.md` file in `./blog-output/` directory. File naming: `{slug}-{platform}.md` (e.g., `moodtrip-v2-devto.md`). Also creates an `index.md` with links to all versions. |
|
|
113
|
+
| `screenshot` | off | Include screenshots of the project. The agent will: (1) detect if the project has a running dev server or build output, (2) launch the app in a browser via Playwright, (3) capture key screens (homepage, main features, mobile view), (4) save screenshots to `./blog-output/screenshots/`, (5) embed image references in the blog content with descriptive alt text. If no UI is available (CLI tool, library), capture terminal output or architecture diagrams instead. |
|
|
114
|
+
| `help` | — | Display usage guide and exit. No content is generated. |
|
|
115
|
+
|
|
116
|
+
#### Parsing Rules
|
|
117
|
+
|
|
118
|
+
1. **Check `help` first** — if `$ARGUMENTS` is exactly `help` (case-insensitive), print help and stop immediately
|
|
119
|
+
2. Scan `$ARGUMENTS` for recognized platform identifiers (first comma-separated token)
|
|
120
|
+
3. Extract options (`lang:vi`, `lang:en`, `file`, `screenshot`) from anywhere in the arguments
|
|
121
|
+
4. Everything remaining after platforms and options is the **topic**
|
|
122
|
+
5. If no platform identifiers found → default to `all`
|
|
123
|
+
6. If no topic text → auto-detect topic from git activity
|
|
124
|
+
7. Options can appear in any order, before or after the topic
|
|
125
|
+
|
|
126
|
+
#### Examples
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
/blog help → show usage guide
|
|
130
|
+
/blog → all platforms, English, console output
|
|
131
|
+
/blog devto,medium Building a mood-based trip planner → dev.to + Medium, English
|
|
132
|
+
/blog lang:vi → all platforms, Vietnamese, auto-detect topic
|
|
133
|
+
/blog linkedin lang:vi Chia sẻ hành trình xây dựng MoodTrip → LinkedIn only, Vietnamese
|
|
134
|
+
/blog file devto,hashnode Introducing MoodTrip V2 → dev.to + Hashnode, save to files
|
|
135
|
+
/blog screenshot file blog,thnk MoodTrip V2 deep dive → personal blogs, with screenshots, save to files
|
|
136
|
+
/blog all lang:vi file screenshot → everything: all platforms, Vietnamese, files, screenshots
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**CRITICAL**: Only generate content for the selected platform(s). Skip all Phase 2 subsections for unselected platforms. Phase 3-5 output must also only reference selected platforms.
|
|
140
|
+
|
|
141
|
+
## Goal
|
|
142
|
+
|
|
143
|
+
Generate high-quality, SEO-optimized technology blog posts for **selected platforms** (default: all six — dev.to, LinkedIn, Medium, Hashnode, hoainho.info/blog, thnkandgrow.com). Only generate content for platforms specified in the argument parsing step. Each platform version must respect native formatting, optimal length, audience expectations, and discovery mechanics. Content is derived from the current project context and/or recent changes.
|
|
144
|
+
|
|
145
|
+
## Operating Constraints
|
|
146
|
+
|
|
147
|
+
- **Read-only analysis first**: Gather all project context before writing a single word.
|
|
148
|
+
- **Platform-native output**: Each platform version must be copy-paste ready with correct frontmatter/formatting.
|
|
149
|
+
- **Canonical source**: `hoainho.info/blog` is always the canonical URL unless user overrides.
|
|
150
|
+
- **Language**: Controlled by `--lang` flag. `--lang=en` (default) for English, `--lang=vi` for Vietnamese. When Vietnamese: use natural Vietnamese tech writing style, keep code/tech terms in English (React, Docker, API, etc.). If no `--lang` flag and user writes topic in Vietnamese, auto-set to `--lang=vi`.
|
|
151
|
+
- **No hallucinated features**: Only reference actual project capabilities confirmed by source code or docs.
|
|
152
|
+
|
|
153
|
+
## Execution Steps
|
|
154
|
+
|
|
155
|
+
### Phase 0: Context Gathering
|
|
156
|
+
|
|
157
|
+
1. **Read project metadata** — load in parallel:
|
|
158
|
+
- `README.md` (project overview, features, value prop)
|
|
159
|
+
- `AGENTS.md` (structure, conventions, tech stack)
|
|
160
|
+
- `package.json` or equivalent manifest (dependencies, scripts, version)
|
|
161
|
+
- Any `CHANGELOG.md` or `SESSION-SUMMARY.md` if present
|
|
162
|
+
|
|
163
|
+
2. **Analyze recent changes** (run from repo root):
|
|
164
|
+
```bash
|
|
165
|
+
git log --oneline --no-decorate -20
|
|
166
|
+
```
|
|
167
|
+
```bash
|
|
168
|
+
git diff HEAD~5..HEAD --stat
|
|
169
|
+
```
|
|
170
|
+
```bash
|
|
171
|
+
git log --format="%s" -10
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
3. **Determine content source**:
|
|
175
|
+
- If user provided a specific topic in `$ARGUMENTS` → use that as the primary angle
|
|
176
|
+
- If `$ARGUMENTS` is empty → auto-detect the most interesting angle from recent git activity
|
|
177
|
+
- If no recent activity → use the project overview as the angle
|
|
178
|
+
|
|
179
|
+
4. **Extract key facts** into an internal model (do not output this):
|
|
180
|
+
- Project name and one-line description
|
|
181
|
+
- Tech stack (languages, frameworks, tools)
|
|
182
|
+
- Key features (top 3-5)
|
|
183
|
+
- Recent changes (what changed, why it matters)
|
|
184
|
+
- Unique differentiators (what makes this project special)
|
|
185
|
+
- Target audience (who benefits from this project)
|
|
186
|
+
|
|
187
|
+
### Phase 1: Content Strategy
|
|
188
|
+
|
|
189
|
+
1. **Select blog post angle** — choose the most fitting type:
|
|
190
|
+
| Type | When to use |
|
|
191
|
+
|------|-------------|
|
|
192
|
+
| Tutorial / How-to | New feature with clear usage steps |
|
|
193
|
+
| Announcement | Major release, new tool, milestone |
|
|
194
|
+
| Deep-dive | Complex architecture, design decisions |
|
|
195
|
+
| Changelog / What's New | Multiple recent updates |
|
|
196
|
+
| Case Study | Real-world usage, performance results |
|
|
197
|
+
| Opinion / Lessons Learned | Insights from building the project |
|
|
198
|
+
|
|
199
|
+
2. **SEO keyword research** — generate:
|
|
200
|
+
- **Primary keyword**: 2-4 word phrase (high search intent, moderate competition)
|
|
201
|
+
- **Secondary keywords**: 3-5 related phrases
|
|
202
|
+
- **Long-tail variants**: 2-3 question-based phrases (e.g., "how to sandbox AI agents")
|
|
203
|
+
- **Semantic cluster**: 5-8 related terms to weave naturally into content
|
|
204
|
+
|
|
205
|
+
3. **Craft titles** — generate exactly 3 variants:
|
|
206
|
+
- Variant A: Number/list format (e.g., "5 Reasons to Sandbox Your AI Coding Agent")
|
|
207
|
+
- Variant B: How-to format (e.g., "How to Protect Your System from AI Coding Tools")
|
|
208
|
+
- Variant C: Curiosity/bold claim (e.g., "Your AI Coding Agent Has Full Access to Your SSH Keys")
|
|
209
|
+
- All titles must: contain the primary keyword (front-loaded), be under 60 characters, use power words
|
|
210
|
+
|
|
211
|
+
4. **Plan content structure** — outline with H2/H3 headings:
|
|
212
|
+
- Hook → Problem → Solution → Implementation → Results → CTA
|
|
213
|
+
- Every H2 section: 200-300 words max before next subheading
|
|
214
|
+
- Include planned code block locations
|
|
215
|
+
|
|
216
|
+
### Phase 2: Write Platform-Specific Versions
|
|
217
|
+
|
|
218
|
+
Generate **separate, complete versions** for each platform below. Each version must be self-contained and copy-paste ready.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
#### 2.1 — dev.to
|
|
223
|
+
|
|
224
|
+
**Format**: Markdown with Liquid tags
|
|
225
|
+
|
|
226
|
+
**Required frontmatter**:
|
|
227
|
+
```yaml
|
|
228
|
+
---
|
|
229
|
+
title: "[Your Title]"
|
|
230
|
+
published: false
|
|
231
|
+
tags: [tag1, tag2, tag3, tag4] # max 4 tags
|
|
232
|
+
cover_image: "" # suggest dimensions: 1000x420
|
|
233
|
+
canonical_url: "https://hoainho.info/blog/[slug]"
|
|
234
|
+
description: "[150-160 char meta description with primary keyword]"
|
|
235
|
+
series: "" # optional, suggest if part of a series
|
|
236
|
+
---
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Writing rules**:
|
|
240
|
+
- Developer-friendly tone, practical and code-heavy
|
|
241
|
+
- 1500-3000 words optimal
|
|
242
|
+
- Use fenced code blocks with language identifiers (```bash, ```typescript, etc.)
|
|
243
|
+
- Emojis in H2 headings are acceptable and encouraged for scannability
|
|
244
|
+
- Include a `## TL;DR` section immediately after the intro
|
|
245
|
+
- End with `## What's Next?` and a clear CTA (star the repo, try the tool, comment)
|
|
246
|
+
- Tags are critical for discovery — choose tags with high follower counts on dev.to
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
#### 2.2 — LinkedIn
|
|
251
|
+
|
|
252
|
+
Generate **two versions**:
|
|
253
|
+
|
|
254
|
+
**Version A — Short Post** (1300-2000 characters):
|
|
255
|
+
```
|
|
256
|
+
[Hook line — must grab attention before "see more" fold]
|
|
257
|
+
[Second line — amplify the hook]
|
|
258
|
+
|
|
259
|
+
[3-5 bullet points or short paragraphs with key insights]
|
|
260
|
+
|
|
261
|
+
[Call-to-action: question to drive comments]
|
|
262
|
+
|
|
263
|
+
[3-5 hashtags, mix of broad (#AI, #DevTools) and niche (#AISandbox)]
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Writing rules for short post**:
|
|
267
|
+
- First 2 lines must compel the reader to click "see more"
|
|
268
|
+
- Use "I" statements and personal experience framing
|
|
269
|
+
- Unicode bold (𝗯𝗼𝗹𝗱) for emphasis where needed
|
|
270
|
+
- Line breaks between every 1-2 sentences (LinkedIn penalizes walls of text)
|
|
271
|
+
- End with a question to drive engagement
|
|
272
|
+
- Hashtags: 3-5, placed at the end
|
|
273
|
+
|
|
274
|
+
**Version B — Long-form Article** (1000-2000 words):
|
|
275
|
+
- Professional thought-leadership tone
|
|
276
|
+
- Frame technical content through business value lens
|
|
277
|
+
- Include a compelling subtitle
|
|
278
|
+
- Use bullet points and numbered lists generously
|
|
279
|
+
- Add a "Key Takeaways" section
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
#### 2.3 — Medium
|
|
284
|
+
|
|
285
|
+
**Format**: Rich Markdown
|
|
286
|
+
|
|
287
|
+
**Structure**:
|
|
288
|
+
- Kicker (short text above title, e.g., "Developer Tools")
|
|
289
|
+
- Title (compelling, keyword-rich)
|
|
290
|
+
- Subtitle (expands on title, adds context)
|
|
291
|
+
- Body: storytelling approach, narrative-driven
|
|
292
|
+
- 2000-4000 words (target 7-10 minute read)
|
|
293
|
+
|
|
294
|
+
**Writing rules**:
|
|
295
|
+
- Open with a story, analogy, or surprising statement
|
|
296
|
+
- Use pull quotes for key insights (> blockquote format)
|
|
297
|
+
- Code blocks with syntax highlighting
|
|
298
|
+
- Break into clear sections with descriptive H2 headings
|
|
299
|
+
- Include 1-2 images/diagrams suggestions with alt text
|
|
300
|
+
- End with a "Final Thoughts" section and CTA
|
|
301
|
+
- SEO focus: title, subtitle, first 150 characters are indexed
|
|
302
|
+
- Suggest 5 Medium tags (check relevance to Medium's tag ecosystem)
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
#### 2.4 — Hashnode
|
|
307
|
+
|
|
308
|
+
**Format**: Markdown with frontmatter
|
|
309
|
+
|
|
310
|
+
**Required frontmatter**:
|
|
311
|
+
```yaml
|
|
312
|
+
---
|
|
313
|
+
title: "[Your Title]"
|
|
314
|
+
slug: "[seo-optimized-slug-with-primary-keyword]"
|
|
315
|
+
cover: "" # suggest dimensions: 1600x840
|
|
316
|
+
tags: [tag1, tag2, tag3, tag4, tag5]
|
|
317
|
+
canonical: "https://hoainho.info/blog/[slug]"
|
|
318
|
+
enableToc: true
|
|
319
|
+
---
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Writing rules**:
|
|
323
|
+
- Technical and educational tone, community-focused
|
|
324
|
+
- 1500-3000 words optimal
|
|
325
|
+
- Include auto-generated table of contents (TOC)
|
|
326
|
+
- Code snippets with clear explanations
|
|
327
|
+
- If part of a series, include series navigation links
|
|
328
|
+
- Hashnode SEO: slug is critical, meta description in first paragraph
|
|
329
|
+
- Include "Prerequisites" section if tutorial format
|
|
330
|
+
- End with "Resources" section with relevant links
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
#### 2.5 — hoainho.info/blog (Personal Blog — Canonical Source)
|
|
335
|
+
|
|
336
|
+
**Format**: Markdown or MDX (detect from project structure if possible, default to MDX)
|
|
337
|
+
|
|
338
|
+
**Frontmatter** (adapt to detected blog engine):
|
|
339
|
+
```yaml
|
|
340
|
+
---
|
|
341
|
+
title: "[Your Title]"
|
|
342
|
+
date: "[YYYY-MM-DD]"
|
|
343
|
+
description: "[150-160 char meta description]"
|
|
344
|
+
tags: [tag1, tag2, tag3]
|
|
345
|
+
author: "Hoai Nho"
|
|
346
|
+
slug: "[seo-optimized-slug]"
|
|
347
|
+
image: "" # og:image recommendation
|
|
348
|
+
draft: true
|
|
349
|
+
---
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Writing rules**:
|
|
353
|
+
- Personal voice — this is the author's own blog
|
|
354
|
+
- Detailed technical deep-dives with personal insights and opinions
|
|
355
|
+
- Can be longer and more thorough than other platforms (no length cap)
|
|
356
|
+
- If Vietnamese content: use natural Vietnamese tech writing (not machine-translated), Vietnamese headings, but keep code/tech terms in English
|
|
357
|
+
- Include: author's perspective, lessons learned, behind-the-scenes decisions
|
|
358
|
+
- SEO: suggest schema markup (Article, TechArticle), og:title, og:description, og:image
|
|
359
|
+
- This is the **canonical URL** — all other platforms link back here
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
#### 2.6 — thnkandgrow.com
|
|
364
|
+
|
|
365
|
+
**Format**: Markdown/MDX
|
|
366
|
+
|
|
367
|
+
**Frontmatter**:
|
|
368
|
+
```yaml
|
|
369
|
+
---
|
|
370
|
+
title: "[Your Title — growth/learning angle]"
|
|
371
|
+
date: "[YYYY-MM-DD]"
|
|
372
|
+
description: "[meta description with growth/learning angle]"
|
|
373
|
+
tags: [tag1, tag2, tag3]
|
|
374
|
+
category: "Tech & Growth"
|
|
375
|
+
draft: true
|
|
376
|
+
---
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
**Writing rules**:
|
|
380
|
+
- Growth mindset framing — what did building this teach you?
|
|
381
|
+
- 1500-2500 words optimal
|
|
382
|
+
- Frame technical content through the lens of personal/professional growth
|
|
383
|
+
- **Required sections**:
|
|
384
|
+
- "The Challenge" — what problem triggered this work
|
|
385
|
+
- "The Journey" — what was learned along the way
|
|
386
|
+
- "Key Takeaways" — 3-5 bullet points of actionable lessons
|
|
387
|
+
- "Reflection Questions" — 2-3 questions for the reader to consider
|
|
388
|
+
- Tone: inspiring but grounded, not preachy
|
|
389
|
+
- Include: mindset shifts, failure moments, breakthrough insights
|
|
390
|
+
- CTA: encourage readers to share their own learning experiences
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
### Phase 3: SEO Optimization Pass
|
|
395
|
+
|
|
396
|
+
After drafting all versions, run this checklist on each:
|
|
397
|
+
|
|
398
|
+
| Check | Criteria |
|
|
399
|
+
|-------|----------|
|
|
400
|
+
| Title | Contains primary keyword in first 30 chars |
|
|
401
|
+
| Meta description | 150-160 chars, includes keyword, has CTA verb |
|
|
402
|
+
| H2 headings | At least 2 contain keyword variants |
|
|
403
|
+
| First paragraph | Contains primary keyword naturally |
|
|
404
|
+
| Image alt text | Descriptive, includes keyword where natural |
|
|
405
|
+
| Internal links | Suggest 1-2 links to related content |
|
|
406
|
+
| External links | Include 1-3 authoritative external references |
|
|
407
|
+
| Reading level | Grade 8-10 (use short sentences, common words) |
|
|
408
|
+
| Word count | Meets platform-specific optimal range |
|
|
409
|
+
| Code blocks | All have language identifiers for syntax highlighting |
|
|
410
|
+
|
|
411
|
+
### Phase 4: Cross-Platform Publishing Strategy
|
|
412
|
+
|
|
413
|
+
Output a publishing plan:
|
|
414
|
+
|
|
415
|
+
1. **Canonical URL**: `https://hoainho.info/blog/[slug]`
|
|
416
|
+
|
|
417
|
+
2. **Posting schedule** (stagger for maximum reach):
|
|
418
|
+
| Day | Platform | Why this order |
|
|
419
|
+
|-----|----------|----------------|
|
|
420
|
+
| Day 1 | hoainho.info/blog | Canonical source, let Google index first |
|
|
421
|
+
| Day 1 | thnkandgrow.com | Second owned property |
|
|
422
|
+
| Day 2 | dev.to | Developer community, high engagement potential |
|
|
423
|
+
| Day 2 | Hashnode | Technical community, SEO boost |
|
|
424
|
+
| Day 3 | Medium | Broader audience, delayed for indexing |
|
|
425
|
+
| Day 3-4 | LinkedIn (short post) | Professional network, drives traffic |
|
|
426
|
+
| Day 5-7 | LinkedIn (article) | Long-form for sustained engagement |
|
|
427
|
+
|
|
428
|
+
3. **Cross-linking**: Each platform version links back to canonical. Mention other platforms where natural (e.g., "Read the full deep-dive on my blog").
|
|
429
|
+
|
|
430
|
+
4. **Repurposing ideas**:
|
|
431
|
+
- LinkedIn short post → Twitter/X thread
|
|
432
|
+
- Key code snippets → GitHub Gist → embed in posts
|
|
433
|
+
- TL;DR → social media snippets
|
|
434
|
+
- Key takeaways → carousel images for LinkedIn/Instagram
|
|
435
|
+
|
|
436
|
+
### Phase 5: Final Output
|
|
437
|
+
|
|
438
|
+
#### Mode A — Inline (default, no `--file` flag)
|
|
439
|
+
|
|
440
|
+
Present results directly in chat in this order:
|
|
441
|
+
|
|
442
|
+
1. **📋 Content Strategy Summary** — topic, angle, target audience (3-5 lines)
|
|
443
|
+
2. **🔑 SEO Analysis** — primary keyword, secondaries, title variants
|
|
444
|
+
3. **📝 Platform Versions** — each separated by `---` horizontal rules, only selected platforms:
|
|
445
|
+
- dev.to version (complete with frontmatter)
|
|
446
|
+
- LinkedIn short post
|
|
447
|
+
- LinkedIn long-form article
|
|
448
|
+
- Medium version (with kicker and subtitle)
|
|
449
|
+
- Hashnode version (complete with frontmatter)
|
|
450
|
+
- hoainho.info/blog version (complete with frontmatter)
|
|
451
|
+
- thnkandgrow.com version (complete with frontmatter)
|
|
452
|
+
4. **✅ Publishing Checklist** (only selected platforms):
|
|
453
|
+
```
|
|
454
|
+
[ ] Publish to hoainho.info/blog (canonical)
|
|
455
|
+
[ ] Publish to thnkandgrow.com
|
|
456
|
+
[ ] Submit to dev.to (set canonical_url)
|
|
457
|
+
[ ] Submit to Hashnode (set canonical)
|
|
458
|
+
[ ] Submit to Medium (import or paste, set canonical)
|
|
459
|
+
[ ] Post LinkedIn short version
|
|
460
|
+
[ ] Schedule LinkedIn long-form article
|
|
461
|
+
[ ] Share on social media (Twitter/X, Reddit if relevant)
|
|
462
|
+
[ ] Submit to relevant aggregators (Hacker News, Reddit communities)
|
|
463
|
+
[ ] Monitor analytics after 24h and 7d
|
|
464
|
+
```
|
|
465
|
+
5. **📅 Posting Schedule** — the staggered timeline from Phase 4
|
|
466
|
+
|
|
467
|
+
#### Mode B — File Output (`--file` flag)
|
|
468
|
+
|
|
469
|
+
Create a `./blog-output/` directory in the project root and write files:
|
|
470
|
+
|
|
471
|
+
1. **Generate slug** from the title: lowercase, hyphens, no special chars (e.g., `introducing-moodtrip-v2`)
|
|
472
|
+
|
|
473
|
+
2. **Write platform files** — one per selected platform:
|
|
474
|
+
| File | Content |
|
|
475
|
+
|------|---------|
|
|
476
|
+
| `{slug}-devto.md` | dev.to version with full frontmatter |
|
|
477
|
+
| `{slug}-linkedin-post.md` | LinkedIn short post (plain text) |
|
|
478
|
+
| `{slug}-linkedin-article.md` | LinkedIn long-form article |
|
|
479
|
+
| `{slug}-medium.md` | Medium version with kicker/subtitle |
|
|
480
|
+
| `{slug}-hashnode.md` | Hashnode version with full frontmatter |
|
|
481
|
+
| `{slug}-hoainho.md` | hoainho.info/blog version |
|
|
482
|
+
| `{slug}-thnkandgrow.md` | thnkandgrow.com version |
|
|
483
|
+
|
|
484
|
+
3. **Write `index.md`** — a summary file containing:
|
|
485
|
+
- Content strategy summary
|
|
486
|
+
- SEO analysis
|
|
487
|
+
- Links to each platform file
|
|
488
|
+
- Publishing checklist
|
|
489
|
+
- Posting schedule
|
|
490
|
+
|
|
491
|
+
4. **Screenshots** (only if `--screenshot` flag):
|
|
492
|
+
- Save to `./blog-output/screenshots/`
|
|
493
|
+
- Files: `hero.png`, `feature-{n}.png`, `mobile.png`
|
|
494
|
+
- Update image references in all platform files to use relative paths: `./screenshots/hero.png`
|
|
495
|
+
|
|
496
|
+
5. **Print summary** in chat:
|
|
497
|
+
```
|
|
498
|
+
✅ Blog output saved to ./blog-output/
|
|
499
|
+
|
|
500
|
+
Files created:
|
|
501
|
+
• blog-output/index.md
|
|
502
|
+
• blog-output/{slug}-devto.md
|
|
503
|
+
• blog-output/{slug}-linkedin-post.md
|
|
504
|
+
• ...
|
|
505
|
+
|
|
506
|
+
Next: review files, then follow the publishing checklist in index.md
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
## Writing Quality Standards
|
|
510
|
+
|
|
511
|
+
These standards apply to ALL platform versions:
|
|
512
|
+
|
|
513
|
+
- **Active voice** predominantly (passive only when emphasizing the object)
|
|
514
|
+
- **Hook first** — every version opens with a compelling hook (story, statistic, question, or bold claim)
|
|
515
|
+
- **Real code** — use actual code from the project, not pseudo-code or placeholders
|
|
516
|
+
- **Analogies** — explain at least one complex concept via analogy per post
|
|
517
|
+
- **Scannability** — subheadings every 200-300 words, bullet points for lists of 3+
|
|
518
|
+
- **TL;DR** — include a scannable summary section for developer-focused platforms
|
|
519
|
+
- **Clear CTA** — every version ends with an explicit call-to-action
|
|
520
|
+
- **No unexplained jargon** — define technical terms on first use or link to explanations
|
|
521
|
+
- **Transition phrases** — smooth flow between sections (avoid abrupt topic shifts)
|
|
522
|
+
- **Data when possible** — include performance numbers, statistics, or benchmarks where relevant
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "blog-workflow",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Generate SEO-optimized blog posts for dev.to, Medium, LinkedIn, Hashnode from project context",
|
|
5
|
+
"compatibility": "OpenCode",
|
|
6
|
+
"agent": null,
|
|
7
|
+
"commands": [],
|
|
8
|
+
"tags": [
|
|
9
|
+
"blog",
|
|
10
|
+
"content",
|
|
11
|
+
"seo",
|
|
12
|
+
"devto",
|
|
13
|
+
"medium",
|
|
14
|
+
"linkedin"
|
|
15
|
+
]
|
|
16
|
+
}
|