🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

能力底图套件 1741505640/capmap-skills

DeepSeek Harnessv0.2.4
174150564045 天前有提交已提供中文文档扫描:高危

把方案到归档做成闭环技能,用图谱理清方案关系

30.4/100
综合分
1
GitHub 星标
187
npm 周下载
—/5
用户评分

数据截至 2026/9/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @chenjh12/dsh-capmap-viz
npm 源 · @chenjh12/dsh-capmap-viz 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/26·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 45 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过

安装清单取自 dsh-capmap-viz/package.json

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@chenjh12/dsh-capmap-viz @ 0.2.4
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:19:12

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件写入剪贴板(不计风险)
查看扫描证据(共 73 处,展示前 65 条)
  • 读取本地文件
    lib/index.js:93
    if (!existsSync(abs))
  • 读取本地文件
    lib/index.js:95
    const text = readFileSync(abs, 'utf8');
  • 写入剪贴板
    client/client.js:2871
    await navigator.clipboard.writeText(text);
  • 读取本地文件
    lib/parser/parse.js:25
    if (!existsSync(dir))
  • 读取本地文件
    lib/parser/parse.js:27
    for (const name of readdirSync(dir)) {
  • 读取本地文件
    lib/parser/parse.js:31
    const st = statSync(abs);
  • 读取本地文件
    lib/parser/parse.js:196
    if (!existsSync(c))
  • 读取本地文件
    lib/parser/parse.js:199
    const doc = yaml.load(readFileSync(c, 'utf8'));
  • 读取本地文件
    lib/parser/parse.js:203
    if (existsSync(abs))
  • 读取本地文件
    lib/bootstrap/installSkills.js:14
    return candidates.some((p) => existsSync(p));
  • 执行外部命令运行时拼接
    lib/bootstrap/installSkills.js:29
    ? spawn(`${escapeWinArg(command)} ${args.map(escapeWinArg).join(' ')}`, {
  • 执行外部命令来自配置/变量
    lib/bootstrap/installSkills.js:35
    : spawn(command, args, {
  • 读取本地文件
    lib/bootstrap/installSkills.js:128
    if (!existsSync(skillsSrc)) {
  • 写入本地文件
    lib/bootstrap/installSkills.js:141
    mkdirSync(dest, { recursive: true });
  • 读取本地文件
    lib/bootstrap/installSkills.js:143
    for (const name of readdirSync(skillsSrc)) {
  • 删除本地文件递归
    lib/bootstrap/installSkills.js:165
    rmSync(tmp, { recursive: true, force: true });
  • 读取本地文件
    lib/bootstrap/scaffold.js:10
    if (existsSync(abs)) {
  • 写入本地文件
    lib/bootstrap/scaffold.js:14
    mkdirSync(dirname(abs), { recursive: true });
  • 写入本地文件
    lib/bootstrap/scaffold.js:15
    writeFileSync(abs, content, 'utf8');
  • 读取本地文件
    lib/bootstrap/scaffold.js:19
    if (existsSync(abs)) {
  • 写入本地文件
    lib/bootstrap/scaffold.js:23
    mkdirSync(abs, { recursive: true });
  • 读取本地文件
    lib/bootstrap/scaffold.js:223
    if (!existsSync(graphDest)) {
  • 写入本地文件
    lib/bootstrap/scaffold.js:224
    mkdirSync(obsidianDir, { recursive: true });
  • 读取本地文件
    lib/bootstrap/scaffold.js:225
    if (existsSync(graphSrc)) {
  • 写入本地文件
    lib/bootstrap/scaffold.js:226
    copyFileSync(graphSrc, graphDest);
  • 写入本地文件
    lib/bootstrap/scaffold.js:229
    writeFileSync(graphDest, '{\n "colorGroups\": []\n}\n', 'utf8');
  • 读取本地文件
    lib/bootstrap/scaffold.js:248
    if (!existsSync(gi)) {
  • 读取本地文件
    lib/bootstrap/scaffold.js:253
    const cur = readFileSync(gi, 'utf8');
  • 写入本地文件
    src/bootstrap/installSkills.test.ts:12
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    src/bootstrap/installSkills.test.ts:13
    writeFileSync(join(dir, 'capmap.yaml'), 'docs_root: docs\n', 'utf8');
  • 写入本地文件
    src/bootstrap/installSkills.test.ts:16
    writeFileSync(join(dir, 'SKILL.md'), '# capmap-system\n', 'utf8');
  • 删除本地文件递归
    src/bootstrap/installSkills.test.ts:19
    rmSync(root, { recursive: true, force: true });
  • 读取本地文件
    src/bootstrap/installSkills.ts:18
    return candidates.some((p) => existsSync(p));
  • 执行外部命令运行时拼接
    src/bootstrap/installSkills.ts:50
    ? spawn(
  • 执行外部命令来自配置/变量
    src/bootstrap/installSkills.ts:59
    : spawn(command, args, {
  • 读取本地文件
    src/bootstrap/installSkills.ts:165
    if (!existsSync(skillsSrc)) {
  • 写入本地文件
    src/bootstrap/installSkills.ts:179
    mkdirSync(dest, { recursive: true });
  • 读取本地文件
    src/bootstrap/installSkills.ts:181
    for (const name of readdirSync(skillsSrc)) {
  • 删除本地文件递归
    src/bootstrap/installSkills.ts:202
    rmSync(tmp, { recursive: true, force: true });
  • 读取本地文件
    src/bootstrap/scaffold.test.ts:14
    assert.ok(existsSync(join(root, '.agents/skills/capmap-system/capmap.yaml')));
  • 读取本地文件
    src/bootstrap/scaffold.test.ts:15
    assert.ok(existsSync(join(root, 'docs/文档首页.md')));
  • 读取本地文件
    src/bootstrap/scaffold.test.ts:16
    assert.ok(existsSync(join(root, 'docs/方案/默认/能力底图-默认.md')));
  • 读取本地文件
    src/bootstrap/scaffold.test.ts:17
    const yaml = readFileSync(join(root, '.agents/skills/capmap-system/capmap.yaml'), 'utf8');
  • 删除本地文件递归
    src/bootstrap/scaffold.test.ts:23
    rmSync(root, { recursive: true, force: true });
  • 读取本地文件
    src/bootstrap/scaffold.ts:33
    if (existsSync(abs)) {
  • 写入本地文件
    src/bootstrap/scaffold.ts:37
    mkdirSync(dirname(abs), { recursive: true });
  • 写入本地文件
    src/bootstrap/scaffold.ts:38
    writeFileSync(abs, content, 'utf8');
  • 读取本地文件
    src/bootstrap/scaffold.ts:43
    if (existsSync(abs)) {
  • 写入本地文件
    src/bootstrap/scaffold.ts:47
    mkdirSync(abs, { recursive: true });
  • 读取本地文件
    src/bootstrap/scaffold.ts:306
    if (!existsSync(graphDest)) {
  • 写入本地文件
    src/bootstrap/scaffold.ts:307
    mkdirSync(obsidianDir, { recursive: true });
  • 读取本地文件
    src/bootstrap/scaffold.ts:308
    if (existsSync(graphSrc)) {
  • 写入本地文件
    src/bootstrap/scaffold.ts:309
    copyFileSync(graphSrc, graphDest);
  • 写入本地文件
    src/bootstrap/scaffold.ts:311
    writeFileSync(graphDest, '{\n "colorGroups\": []\n}\n', 'utf8');
  • 读取本地文件
    src/bootstrap/scaffold.ts:336
    if (!existsSync(gi)) {
  • 读取本地文件
    src/bootstrap/scaffold.ts:340
    const cur = readFileSync(gi, 'utf8');
  • 读取本地文件
    src/index.ts:120
    if (!existsSync(abs)) throw new Error(`capmap.read: 文件不存在 ${cleaned}`);
  • 读取本地文件
    src/index.ts:121
    const text = readFileSync(abs, 'utf8');
  • 读取本地文件
    src/parser/parse.ts:46
    if (!existsSync(dir)) return out;
  • 读取本地文件
    src/parser/parse.ts:47
    for (const name of readdirSync(dir)) {
  • 读取本地文件
    src/parser/parse.ts:50
    const st = statSync(abs);
  • 读取本地文件
    src/parser/parse.ts:213
    if (!existsSync(c)) continue;
  • 读取本地文件
    src/parser/parse.ts:215
    const doc = yaml.load(readFileSync(c, 'utf8')) as { docs_root?: string } | null;
  • 读取本地文件
    src/parser/parse.ts:219
    if (existsSync(abs)) return abs;
  • 删除本地文件递归
    src/setupHint.test.ts:26
    rmSync(root, { recursive: true, force: true });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 方案到归档闭环
  • 图谱梳理方案关系

README

由 DeepSeek 最新模型翻译生成
capmap-skills Vibe Coding 时代的能力底图策展套件:把「方案 → 开发 → 测试 → 落地 → 归档」做成可复用的 Agent Skills 闭环,并用 Obsidian 把方案关系画成图谱。 核心理念:代码给 Agent 看,文档给人看——人靠可读的方案与底图理解系统;Agent 靠契约化文档与状态机把开发节奏跑完整。 为什么需要 高频用 AI 写代码时,几组矛盾会同时出现: | 矛盾 | 表现 | | 感知下降 | 改动很快,人对模块边界、函数意图的掌握变浅,Review 变难 | | 方案膨胀 | 每次开发都会产出 Plan / 方案;文档越来越多,难检索、难淘汰 | | 关联断裂 | 方案与真实代码路径、git 合入历史弱关联 | | 关系隐形 | 方案之间的依赖、替代、分叉,散落 Markdown 里看不出来 | capmap-skills 的解法: 1. 人读文档:方案写清决策与变更;能力底图写清「有什么能力、代码在哪、怎么用」 2. Agent 跟契约:按阶段 Skill 推进,状态不可跳步,改完可 lint 3. 图谱给人导航:以 docs_root 为 Obsidian Vault,用唯一文件名 [[wikilink]] 连成图(init 预置状态颜色组) 能做什么 | 能力 | 说明 |
展开完整文档(README 剩余 1 节)
capmap-skills

Vibe Coding 时代的能力底图策展套件:把「方案 → 开发 → 测试 → 落地 → 归档」做成可复用的 Agent Skills 闭环,并用 Obsidian 把方案关系画成图谱。

核心理念:代码给 Agent 看,文档给人看——人靠可读的方案与底图理解系统;Agent 靠契约化文档与状态机把开发节奏跑完整。

为什么需要

高频用 AI 写代码时,几组矛盾会同时出现:

| 矛盾 | 表现 |
| 感知下降 | 改动很快,人对模块边界、函数意图的掌握变浅,Review 变难 |
| 方案膨胀 | 每次开发都会产出 Plan / 方案;文档越来越多,难检索、难淘汰 |
| 关联断裂 | 方案与真实代码路径、git 合入历史弱关联 |
| 关系隐形 | 方案之间的依赖、替代、分叉,散落 Markdown 里看不出来 |

capmap-skills 的解法:

1. 人读文档:方案写清决策与变更;能力底图写清「有什么能力、代码在哪、怎么用」
2. Agent 跟契约:按阶段 Skill 推进,状态不可跳步,改完可 lint
3. 图谱给人导航:以 docs_root 为 Obsidian Vault,用唯一文件名 [[wikilink]] 连成图(init 预置状态颜色组)

能做什么

| 能力 | 说明 |
| 初始化 | 选定任意名的 docs_root,建骨架(含 项目全貌.md 人读导读)、写 capmap.yaml,写入 Obsidian graph.json 颜色组 |
| 写方案 | 进行中方案带 ## 变更记录 |
| 开发收尾 | 对照方案判定完成后更新底图 §1/§2,方案标「已开发」,并询问是否转测试(≠ 已验证 / 已落地) |
| 测试 / 规范 | 测试进 测试/,长期用法进 规范/,再谈落地 |
| 反补 / 归档 | git 反补底图 §4;闭环方案进 _archive(不留 stub) |
| 校验 | capmap-lint 查断链、状态跳步等;skill 内含 GitHub action.yml |

闭环

方案(决策+体量) capmap-scheme │ ├─【小】────────────────────────────┐ └─【大】spec → slice → gate(点名)──┤ ↓ 开发收尾 capmap-dev ↓ 测试 / 规范 / 归档 capmap-test → norm → archive ↑ 反补 capmap-backfill

旁路 capmap-debug · capmap-handoff

方案主状态(禁止跳步;大需求多 规格中→已拆分):

小:方案中 → 已确认 → 开发中 → 已开发 → 验证中 → 已验证 → 落地中 → 已落地 → 已归档大:方案中 → 已确认 → 规格中 → 已拆分 → 开发中 → 已开发 → …(同上)

套件

| Skill | 用途 |
| capmap-system | 总入口、硬规则、契约 reference |
| capmap-init | docs_root、骨架、capmap.yaml、Obsidian 颜色组 |
| capmap-scheme | 写/改方案;升已确认时体量判断+询问 |
| capmap-spec | 大需求:执行规格 |
| capmap-slice | 大需求:垂直切片 DAG;推荐运行模式后停住 |
| capmap-gate | 大需求:frontier / 点名开干 / 交票验收 |
| capmap-dev | 对照方案判定完成后更新底图(大:须切片全验收);标完询问是否转测试 |
| capmap-test | 测试计划与记录(用户确认转测后拍 1;拍 2 人测/免测 → 已验证) |
| capmap-norm | 长期使用 / 配置规范 |
| capmap-backfill | 从 git 反补底图 §4 |
| capmap-archive | 方案归档 |
| capmap-lint | 结构校验 + action.yml |
| capmap-debug | 运行时修锅回合:复现/假设/停损;不进状态机 |
| capmap-handoff | 窗口交接:进行中换窗冷启动;_handoff/;不进状态机 |

契约细节:skills/capmap-system/reference/。

安装

本套件只发布 skills/capmap-。权威落点是业务仓的 .agents/skills/(capmap.yaml 与 lint 路径都按此约定)。

装完后目标布局:

your-repo/
.agents/skills/capmap-/ ← 本仓 skills/ 下全部目录 .agents/skills/capmap-system/capmap.yaml ← 由 capmap-init 生成 / ← 任意名;init 时选定

推荐:npx skills

在业务仓根目录:

npx skills add 1741505640/capmap-skills --skill '' -y

指定 Agent(可多选)
npx skills add 1741505640/capmap-skills --agent cursor codex claude-code --skill '' -y

检测到的全部 Agent
npx skills add 1741505640/capmap-skills --agent '' --skill '' -y

装的是 skills/ 下各 skill 整目录(含 reference/、capmap_lint.py、assets/obsidian/graph.json 等),不是整仓其它文件。

然后对 Agent 说:「按 capmap-init 初始化文档目录」(选定 docs_root)。没有这一步,方案/底图没有落点。
Cursor / Codex 等项目级目录是 .agents/skills/,路径与契约一致。
若只装到 Claude Code 的 .claude/skills/,请保证业务仓仍有一份 .agents/skills/capmap-(或对 .agents 做 junction/symlink),否则读不到 capmap.yaml。

手动拷贝

mkdir -p your-repo/.agents/skills
cp -R skills/capmap- your-repo/.agents/skills/

各 Agent

| Agent | 项目级发现目录 | 做法 |
| Cursor | .agents/skills/(亦认 .cursor/skills/) | npx skills add … --agent cursor 或手动拷贝 |
| Codex | .agents/skills/ | --agent codex 或手动拷贝 |
| Claude Code | .claude/skills/ | 先保证 .agents/skills/ 有实体,再链到 .claude/skills/(见下) |
| 其他(Deep Agents、Cline、OpenCode…) | 多数认 .agents/skills/ | --agent 或手动拷贝 |

Claude Code 发现入口(业务仓根已有 .agents/skills/capmap- 时):

Windows PowerShell
New-Item -ItemType Directory -Force -Path .claude\skills | Out-Null
Get-ChildItem .agents\skills -Directory -Filter "capmap-" | ForEach-Object {
$link = Join-Path ".claude\skills" $_.Name
if (Test-Path $link) { Remove-Item $link -Recurse -Force }
New-Item -ItemType Junction -Path $link -Target $_.FullName | Out-Null
}

macOS / Linux
mkdir -p .claude/skills
for d in .agents/skills/capmap-*; do
ln -sfn "$(pwd)/$d" ".claude/skills/$(basename "$d")"
done

可选 CI:把业务仓 .github/workflows/ 写成调用 uses: ./.agents/skills/capmap-lint(逻辑已在 skill 的 action.yml)。

怎么用

| 你说 | 通常触发 |
| 「初始化文档目录」 | capmap-init |
| 「写方案 / 需求又变了」 | capmap-scheme |
| 「写规格」 | capmap-spec(体量/大) |
| 「拆切片」 | capmap-slice |
| 「看 frontier / 开 01 / 验收通过」 | capmap-gate |
| 「功能开发完了,更新底图」 | capmap-dev |
| 「写测试点 / 测试通过记一下」 | capmap-test |
| 「写调用约定 / 配置规范」 | capmap-norm |
| 「从 git 反补变更轨迹」 | capmap-backfill |
| 「方案归档」 | capmap-archive |
| 「检查文档体系 / 跑 lint」 | capmap-lint |

不确定阶段时说「按 capmap 来」→ capmap-system。

日常节奏:
- 小:init → scheme(已确认+体量/小)→ 编码 → dev → test → norm → archive
- 大:scheme(体量/大)→ spec → slice(推荐模式后停住)→ 你点名 → gate 循环 → 全验收 → dev → test → …
随时 backfill;改完文档跑 lint。

Obsidian 打开业务仓的 docs_root 即可看图谱(颜色按状态 Tag 区分)。

本地 lint

pip install pyyaml
python .agents/skills/capmap-lint/capmap_lint.py
python .agents/skills/capmap-lint/capmap_lint.py --strict

设计要点

1. 真相源 = 能力底图,不是全局变更台账
2. docs_root 名任意,以 capmap.yaml 为准
3. 方案必须有 ## 变更记录;归档不留 stub
4. 进度 Tag 挂在方案上;切片用类型 切片;能力底图禁止状态 Tag
5. 禁止跳步:验证门 + 大需求规格/拆分门 + 切片全验收才已开发
6. 切片落盘:方案//切片// + 唯一文件名;用户点名才开跑
7. Obsidian:[[唯一文件名]] + Markdown 旁路;init 写入 graph.json 颜色组

本仓库

capmap-skills/
skills/ # 唯一需要安装到业务仓的内容 → .agents/skills/ README.md LICENSE

- 权威副本 = 本仓库;业务仓只同步 Skill,勿单边改契约
- 改契约请同步更新 skills/capmap-system/reference/decisions.md

License

MIT
预览分享卡片长什么样 ↓1741505640/capmap-skills
分享 · DeepSeek Harness Hub
1741505640/capmap-skills

把方案到归档做成闭环技能,用图谱理清方案关系

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部