Release v1.30.0: Add competitors-analysis skill

- Add competitors-analysis skill for evidence-based competitor tracking
  - Pre-analysis checklist to ensure repositories are cloned locally
  - Forbidden patterns to prevent assumptions and speculation
  - Required patterns for source citation (file:line_number format)
  - Tech stack analysis guides for Node.js, Python, Rust
  - Bundled references: profile_template.md, analysis_checklist.md
  - Management script: update-competitors.sh
- Update marketplace version from 1.29.0 to 1.30.0
- Update skills count from 34 to 35
- Update README.md and README.zh-CN.md (badges, skill section, use case)
- Update CLAUDE.md (skill count, available skills list)
- Update marketplace.json (metadata + new plugin entry)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
daymade
2026-01-30 00:01:57 +08:00
parent 4ea2c8b4de
commit 104e431574
10 changed files with 810 additions and 11 deletions

View File

@@ -0,0 +1,4 @@
Security scan passed
Scanned at: 2026-01-29T23:52:21.174078
Tool: gitleaks + pattern-based validation
Content hash: 2f057ff46a0c9553f5183e7140adbc009f02793b958f49708d792de09815f258

View File

@@ -0,0 +1,252 @@
---
name: competitors-analysis
description: Analyze competitor repositories with evidence-based approach. Use when tracking competitors, creating competitor profiles, or generating competitive analysis. CRITICAL - all analysis must be based on actual cloned code, never assumptions. Triggers include "analyze competitor", "add competitor", "competitive analysis", or "竞品分析".
context: fork
agent: general-purpose
allowed-tools: Read, Grep, Glob, Bash(git *), Bash(mkdir *), Bash(ls *), Bash(wc *)
argument-hint: [product-name] [competitor-url]
---
# Competitors Analysis
Evidence-based competitor tracking and analysis. **All analysis must be based on actual code, never assumptions.**
## CRITICAL: Evidence-Based Analysis Only
**在开始分析之前,必须完成以下检查:**
### Pre-Analysis Checklist
- [ ] 仓库已克隆到本地 `~/Workspace/competitors/{product}/`
- [ ] 可以 `ls` 查看目录结构
- [ ] 可以 `cat package.json` (或等效配置文件) 读取版本信息
- [ ] 可以 `git log -1` 确认代码是最新的
**如果以上任何一项未完成,停止分析,先完成克隆操作。**
### Forbidden Patterns (禁止的表述)
| 禁止 | 原因 |
|------|------|
| "推测..."、"可能..."、"应该..." | 没有证据支持 |
| "架构图(推测版)" | 必须基于实际代码 |
| "未公开"、"未披露" | 如果不知道就不要写 |
| 不带来源的技术细节 | 无法验证 |
### Required Patterns (必须的表述)
| 正确格式 | 示例 |
|----------|------|
| 技术细节 + (来源: 文件:行号) | "使用 better-sqlite3 (来源: package.json:88)" |
| 直接引用 + 来源 | `> "description text" (README.md:3)` |
| 版本号 + 来源 | "版本 1.3.3 (package.json:2)" |
---
## Analysis Workflow
### Step 1: Clone Repository (必须)
```bash
# 创建产品竞品目录
mkdir -p ~/Workspace/competitors/{product-name}
# 克隆竞品仓库 (SSH失败则重试)
cd ~/Workspace/competitors/{product-name}
git clone git@github.com:org/repo.git
```
**网络问题处理**: 中国网络环境可能需要多次重试。
### Step 2: Gather Facts (收集事实)
按顺序读取以下文件,记录关键信息:
**2.1 项目元数据**
```bash
# Node.js 项目
cat package.json | head -20 # name, version, description
cat package.json | grep -A50 dependencies
# Python 项目
cat pyproject.toml # 或 setup.py, requirements.txt
# Rust 项目
cat Cargo.toml
```
**2.2 项目结构**
```bash
ls -la # 根目录结构
ls src/ # 源码目录
find . -name "*.md" -maxdepth 2 # 文档文件
```
**2.3 核心模块**
```bash
# 找到入口文件
cat main.js | head -50 # 或 index.js, app.py, main.rs
# 找到核心 helpers/utils
ls src/helpers/ 2>/dev/null || ls src/utils/ 2>/dev/null
```
**2.4 README 和文档**
```bash
cat README.md | head -100 # 官方描述
cat CHANGELOG.md | head -50 # 版本历史
```
### Step 3: Deep Dive (深入分析)
针对关键技术点,读取具体实现文件:
```bash
# 示例:分析 ASR 实现
cat src/helpers/whisper.js # 读取完整文件
grep -n "class.*Manager" src/helpers/*.js # 找到核心类
```
**记录格式**:
```
| 文件 | 行号 | 发现 |
|------|------|------|
| whisper.js | 33-35 | 使用 WhisperServerManager |
```
### Step 4: Write Profile (撰写分析)
使用 [references/profile_template.md](references/profile_template.md) 模板,确保每个技术细节都有来源标注。
### Step 5: Post-Analysis Verification (分析后验证)
**自检清单**:
- [ ] 所有版本号都有来源标注?
- [ ] 所有技术栈都来自 package.json/Cargo.toml
- [ ] 架构描述基于实际代码结构?
- [ ] 没有"推测"、"可能"等词汇?
- [ ] 对比表中的竞品数据都有来源?
---
## Directory Structure
```
~/Workspace/competitors/
├── flowzero/ # Flowzero 的竞品
│ ├── openwhispr/ # git clone 的仓库
│ └── ...
└── {product-name}/ # 其他产品
{project}/docs/competitors/
├── README.md # 索引(标注分析状态)
├── profiles/
│ └── {competitor}.md # 基于代码的分析
├── landscape/
├── insights/
└── updates/2026/
```
---
## Templates and Checklists
| 文档 | 用途 |
|------|------|
| [references/profile_template.md](references/profile_template.md) | 竞品分析报告模板 |
| [references/analysis_checklist.md](references/analysis_checklist.md) | 分析前/中/后检查清单 |
**关键要求**:
1. 顶部必须标注数据来源路径和 commit hash
2. 每个技术细节必须有 (来源: 文件:行号)
3. 引用 README 内容必须标注行号
4. 无法验证的标记为"待验证"并说明原因
5. 分析完成后运行检查清单中的验证命令
---
## Tech Stack Analysis Guide
### Node.js / JavaScript
| 信息 | 来源文件 | 关键字段 |
|------|----------|----------|
| 版本 | package.json | `version` |
| 依赖 | package.json | `dependencies`, `devDependencies` |
| 入口 | package.json | `main`, `scripts.start` |
| 框架 | package.json | electron, react, vite 等 |
### Python
| 信息 | 来源文件 | 关键字段 |
|------|----------|----------|
| 版本 | pyproject.toml | `[project].version` |
| 依赖 | pyproject.toml / requirements.txt | `dependencies` |
| 入口 | pyproject.toml | `[project.scripts]` |
### Rust
| 信息 | 来源文件 | 关键字段 |
|------|----------|----------|
| 版本 | Cargo.toml | `[package].version` |
| 依赖 | Cargo.toml | `[dependencies]` |
---
## Common Mistakes to Avoid
### 1. 跳过克隆直接分析
❌ 错误: 从 GitHub 网页或 WebFetch 获取信息后直接写分析
✅ 正确: 必须 `git clone` 到本地,用 `Read` 工具读取文件
### 2. 混合事实和推测
❌ 错误:
```markdown
## 技术栈
- Electron (推测基于桌面应用特征)
- 可能使用了 React
```
✅ 正确:
```markdown
## 技术栈 (来源: package.json)
| 依赖 | 版本 | 来源 |
|------|------|------|
| electron | 36.9.5 | package.json:68 |
| react | 19.1.0 | package.json:96 |
```
### 3. 使用过时信息
❌ 错误: 分析时不检查 git log使用过时的代码
✅ 正确: 分析前运行 `git pull`,记录分析时的 commit hash
### 4. 对比表中竞品数据无来源
❌ 错误:
```markdown
| 维度 | 竞品 | 我们 |
|------|------|------|
| 支持语言 | 25种 | 58种 |
```
✅ 正确:
```markdown
| 维度 | 竞品 | 来源 | 我们 |
|------|------|------|------|
| 支持语言 | 25种 | modelRegistryData.json:9-35 | 58种 (FunASR 官方文档) |
```
---
## Scripts
See [scripts/update-competitors.sh](scripts/update-competitors.sh) for repository management.
```bash
./scripts/update-competitors.sh clone # 克隆所有竞品
./scripts/update-competitors.sh pull # 更新所有竞品
./scripts/update-competitors.sh status # 检查状态
```

View File

@@ -0,0 +1,137 @@
# 竞品分析检查清单
## 分析前检查 (Pre-Analysis)
### 1. 仓库准备
- [ ] 仓库 URL 是否正确?
- [ ] 已创建产品竞品目录 `~/Workspace/competitors/{product}/`
- [ ] 已成功克隆仓库到本地
- [ ] 运行 `git pull` 确保代码最新
- [ ] 记录当前 commit: `git log -1 --format="%h %s"`
### 2. 基础文件确认
- [ ] README.md 存在且可读
- [ ] 配置文件存在 (package.json / Cargo.toml / pyproject.toml)
- [ ] LICENSE 文件存在
- [ ] 源码目录结构清晰 (src/ 或等效目录)
---
## 分析中检查 (During Analysis)
### 3. 技术栈验证
- [ ] 框架版本来自配置文件,已标注行号
- [ ] 依赖列表来自配置文件,已标注行号
- [ ] 入口文件已确认并读取
### 4. 核心模块分析
- [ ] 已识别核心模块/helper 文件
- [ ] 已读取关键实现代码
- [ ] 代码片段标注了文件路径和行号
### 5. 来源标注
- [ ] 每个版本号都有 (来源: file:行号)
- [ ] 每个技术细节都有来源
- [ ] 引用 README 内容标注了行号
- [ ] 对比表中竞品数据都有来源列
---
## 分析后检查 (Post-Analysis)
### 6. 禁止词汇检查
在分析文档中搜索以下词汇,如果存在必须修改或删除:
```bash
grep -E "(推测|可能|应该|大概|似乎|或许|未知|未披露|未公开)" profile.md
```
- [ ] 无"推测"
- [ ] 无"可能"
- [ ] 无"应该"
- [ ] 无"大概"/"似乎"/"或许"
- [ ] 无"未知"/"未披露"/"未公开" (改为"待验证"并说明原因)
### 7. 来源完整性检查
```bash
# 检查是否有未标注来源的技术细节
grep -E "^- |^\| " profile.md | grep -v "(来源:|待验证)"
```
- [ ] 所有列表项都有来源或标记为待验证
- [ ] 所有表格数据都有来源列
### 8. 文件引用验证
确认分析中引用的文件确实存在:
```bash
# 提取所有引用的文件路径
grep -oE "[a-zA-Z0-9_/]+\.(js|ts|py|rs|json|toml|md):[0-9]+" profile.md
```
- [ ] 所有引用的文件都存在于仓库中
- [ ] 行号在文件范围内
---
## 常见错误修复
### 错误 1: 使用了推测性语言
**修复前**:
```markdown
## 架构设计(推测版)
可能使用了微服务架构...
```
**修复后**:
```markdown
## 架构设计 (来源: 代码结构分析)
基于 src/ 目录结构,项目采用模块化设计:
- helpers/ 包含 30 个工具模块 (来源: `ls src/helpers/ | wc -l`)
- services/ 包含业务逻辑 (来源: 目录结构)
```
### 错误 2: 对比表无来源
**修复前**:
```markdown
| 维度 | 竞品 | 我们 |
|------|------|------|
| Stars | 920 | 100 |
```
**修复后**:
```markdown
| 维度 | 竞品 | 来源 | 我们 | 来源 |
|------|------|------|------|------|
| Stars | 920 | GitHub 2026-01-29 | 100 | GitHub 2026-01-29 |
```
### 错误 3: 版本号无来源
**修复前**:
```markdown
使用 React 19 和 Electron 36
```
**修复后**:
```markdown
使用 React 19.1.0 (package.json:96) 和 Electron 36.9.5 (package.json:68)
```
---
## 质量评分
完成分析后,按以下标准自评:
| 维度 | 权重 | 评分标准 |
|------|------|----------|
| 数据来源 | 40% | 100% 技术细节有来源 = 满分 |
| 无推测语言 | 30% | 0 个禁止词汇 = 满分 |
| 代码分析深度 | 20% | 读取 5+ 核心文件 = 满分 |
| 对比完整性 | 10% | 对比表 5+ 维度 = 满分 |
**目标**: 总分 >= 90%

View File

@@ -0,0 +1,125 @@
# {Competitor Name} 深度分析
**仓库**: {GitHub URL}
**版本**: {version} (来源: package.json:2)
**License**: {license} (来源: LICENSE)
**分析日期**: {YYYY-MM-DD}
**分析 Commit**: {git log -1 --format="%h %s"}
**数据来源**: `~/Workspace/competitors/{product}/{competitor}/`
---
## 分析声明
> 本分析基于本地克隆的代码仓库,所有技术细节均标注来源文件和行号。
> 未标注来源的内容为"待验证"状态。
---
## 核心定位
> "{从 README.md 直接引用的描述}"
>
> — README.md:{行号}
---
## 技术栈 (来源: package.json / Cargo.toml / pyproject.toml)
| 依赖 | 版本 | 用途 | 来源 |
|------|------|------|------|
| {dep1} | {ver} | {用途} | package.json:{行号} |
| {dep2} | {ver} | {用途} | package.json:{行号} |
---
## 项目结构 (来源: `ls -la`)
```
{competitor}/
├── {file1} # {说明} ({大小})
├── {dir1}/
│ ├── {file2} # {说明}
│ └── ...
└── ...
```
---
## 核心模块分析
### {模块名} (来源: {文件路径})
**文件**: `{path/to/file.js}`
**行数**: {wc -l 结果}
**关键代码**:
```javascript
// {文件}:{起始行}-{结束行}
{代码片段}
```
**发现**:
- {发现1} (行 {X})
- {发现2} (行 {Y})
---
## 与 {你的产品} 对比
| 维度 | {竞品} | 来源 | {你的产品} | 来源 |
|------|--------|------|------------|------|
| **框架** | {value} | package.json:{行} | {value} | package.json:{行} |
| **ASR 引擎** | {value} | {file}:{行} | {value} | {file}:{行} |
| **数据库** | {value} | package.json:{行} | {value} | package.json:{行} |
---
## 可借鉴点
| 特性 | 实现位置 | 代码示例 | 借鉴价值 |
|------|----------|----------|----------|
| {特性1} | `{file}:{行号}` | `{简短代码}` | {价值说明} |
| {特性2} | `{file}:{行号}` | `{简短代码}` | {价值说明} |
---
## 差异化机会
| {你的产品}优势 | 原因 | 竞品对应实现 |
|----------------|------|--------------|
| {优势1} | {原因} | {竞品如何实现或缺失} |
| {优势2} | {原因} | {竞品如何实现或缺失} |
---
## 源码阅读记录
| 文件 | 行数 | 核心发现 | 来源行号 |
|------|------|----------|----------|
| `{file1}` | {lines} | {发现} | L{start}-L{end} |
| `{file2}` | {lines} | {发现} | L{start}-L{end} |
---
## 待验证项
以下信息未能从代码中直接确认,需要进一步调查:
- [ ] {待验证项1} - 原因: {为什么无法确认}
- [ ] {待验证项2} - 原因: {为什么无法确认}
---
## 社区数据 (来源: GitHub API / 页面)
| 指标 | 数值 | 获取日期 |
|------|------|----------|
| Stars | {count} | {date} |
| Forks | {count} | {date} |
| Open Issues | {count} | {date} |
| Last Commit | {date} | {date} |
---
*返回 [README.md](../README.md)*

View File

@@ -0,0 +1,151 @@
#!/bin/bash
# 竞品仓库管理脚本模板
# 复制此文件到你的项目: scripts/update-competitors.sh
# 用法: ./scripts/update-competitors.sh [clone|pull|status]
set -e
# ============================================================
# 配置区域 - 根据你的产品修改
# ============================================================
# 竞品仓库基础目录(按产品区分)
COMPETITORS_BASE="${COMPETITORS_BASE:-$HOME/Workspace/competitors}"
# 你的产品名称(用于子目录)
PRODUCT_NAME="your-product-name" # TODO: 修改为你的产品名
# 竞品目录
COMPETITORS_DIR="$COMPETITORS_BASE/$PRODUCT_NAME"
# 竞品仓库列表SSH 方式,网络问题时会自动重试)
declare -A COMPETITORS=(
# TODO: 添加你的竞品
# ["competitor-name"]="git@github.com:org/repo.git"
# 示例:
# ["openwhispr"]="git@github.com:OpenWhispr/openwhispr.git"
)
# ============================================================
# 以下代码无需修改
# ============================================================
# 颜色
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
# 函数:克隆仓库
clone_repos() {
echo -e "${GREEN}=== 克隆竞品仓库 ($PRODUCT_NAME) ===${NC}"
mkdir -p "$COMPETITORS_DIR"
for name in "${!COMPETITORS[@]}"; do
repo="${COMPETITORS[$name]}"
target="$COMPETITORS_DIR/$name"
if [ -d "$target" ]; then
echo -e "${YELLOW}[跳过] $name 已存在${NC}"
else
echo -e "${GREEN}[克隆] $name${NC}"
# 网络问题自动重试
for i in 1 2 3; do
if git clone "$repo" "$target" 2>/dev/null; then
break
fi
echo " 重试 $i/3..."
sleep 2
done
fi
done
echo ""
echo -e "${GREEN}完成!竞品仓库位于: $COMPETITORS_DIR${NC}"
}
# 函数:更新仓库
pull_repos() {
echo -e "${GREEN}=== 更新竞品仓库 ($PRODUCT_NAME) ===${NC}"
for name in "${!COMPETITORS[@]}"; do
target="$COMPETITORS_DIR/$name"
if [ -d "$target" ]; then
echo -e "${GREEN}[更新] $name${NC}"
cd "$target"
git fetch --all 2>/dev/null || echo -e "${RED} fetch 失败${NC}"
git pull --rebase 2>/dev/null || echo -e "${YELLOW} 可能有冲突${NC}"
cd - > /dev/null
else
echo -e "${RED}[缺失] $name - 请先运行 clone${NC}"
fi
done
}
# 函数:检查状态
check_status() {
echo -e "${GREEN}=== 竞品仓库状态 ($PRODUCT_NAME) ===${NC}"
echo ""
for name in "${!COMPETITORS[@]}"; do
target="$COMPETITORS_DIR/$name"
if [ -d "$target" ]; then
cd "$target"
branch=$(git branch --show-current 2>/dev/null || echo "unknown")
commit=$(git log -1 --format="%h %s" 2>/dev/null | head -c 60)
behind=$(git rev-list --count HEAD..origin/main 2>/dev/null || echo "?")
echo -e "${GREEN}$name${NC} ($branch)"
echo " 最新: $commit"
echo " 落后: $behind 个提交"
cd - > /dev/null
else
echo -e "${RED}$name${NC}: 未克隆"
fi
echo ""
done
}
# 函数:显示帮助
show_help() {
echo "竞品仓库管理脚本 - $PRODUCT_NAME"
echo ""
echo "用法: $0 [命令]"
echo ""
echo "命令:"
echo " clone 克隆所有竞品仓库到 $COMPETITORS_DIR"
echo " pull 更新所有竞品仓库"
echo " status 检查仓库状态(分支、最新提交、落后数)"
echo " help 显示此帮助"
echo ""
echo "环境变量:"
echo " COMPETITORS_BASE 竞品仓库基础目录 (默认: ~/Workspace/competitors)"
echo ""
echo "目录结构:"
echo " $COMPETITORS_BASE/"
echo " └── $PRODUCT_NAME/"
echo " ├── competitor1/"
echo " └── competitor2/"
}
# 主逻辑
case "${1:-help}" in
clone)
clone_repos
;;
pull)
pull_repos
;;
status)
check_status
;;
help|--help|-h)
show_help
;;
*)
echo -e "${RED}未知命令: $1${NC}"
show_help
exit 1
;;
esac