{"slug":"pdlc-retro","title":"pdlc-retro","summary":"迭代复盘——读状态机历史出趋势报告","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-23T18:54:25.556119Z","repo":{"url":"https://github.com/kanfu-panda/pdlc-skills","stars":15,"forks":2,"license":"MIT","updatedAt":"2026-09-23T15:59:31Z"},"bodyHtml":"<hr>\n<p>name: pdlc-retro\ndescription: 迭代复盘——读状态机历史出趋势报告\nargument-hint: [--range 7d|30d|all] [--feature </p>\n<ul>\n<li>docs/07_reviews/retro/</li>\n<li>docs/.pdlc-state/\nnext_step: null\nterminal_state: retro_done</li>\n</ul>\n<hr>\n<h1>PDLC 迭代复盘</h1>\n<p>读取 <code>docs/.pdlc-state/</code> 下的状态机历史，按时间范围聚合，生成趋势复盘报告。</p>\n\n<p>⛔ <strong>IRON LAW · 不可违反的硬门禁</strong></p>\n<p>以下规则为<strong>不可协商</strong>的执行约束：</p>\n<ol>\n<li><strong>文件必须落盘</strong>：所有带编号（功能ID / 缺陷ID）的文档，必须作为实际文件写入磁盘，不可仅在对话中输出。</li>\n<li><strong>阶段必须落章</strong>：每个阶段完成后必须在状态机 <code>docs/.pdlc-state/&lt;feature-id&gt;.json</code> 追加 history，不可跳过。</li>\n<li><strong>测试必须存在</strong>：进入 <code>/pdlc-implement</code> 前，对应测试必须存在且处于红灯状态。违反则中止。</li>\n<li><strong>自检必须执行</strong>：段二自检为强制步骤，不得以\"已经很好了\"为由跳过。</li>\n<li><strong>防循环</strong>：段三修复为单次，不递归。无法自动修复的问题记录到报告，继续往下走。</li>\n<li><strong>状态必推进</strong>：成功执行某 phase 后 <code>current_stage</code> 必须变更。收尾时若发现 <code>current_stage</code> 未推进，视为失败并报错，<strong>不得静默返回</strong>（防止外层循环拿滞后的状态空转烧额度）。唯一例外：命中人工点主动 block 时，<code>current_stage</code> 保持不变但必须写 <code>last_phase_result.ok=false</code> + <code>blocked_reason</code>。</li>\n</ol>\n<p><strong>违反任一条 = 立即中止当前命令，输出违规详情，等待人工介入。</strong></p>\n\n\n<h2>读状态机之前：先做契约体检</h2>\n<p><code>docs/.pdlc-state/*.json</code> 不一定都是 <code>/pdlc-*</code> 命令写出来的——手写的、旧版本写的、照着格式仿写的\n都可能混在里面。字段对不上契约时，<strong>不许边猜边算、再把猜出来的东西当结论</strong>。先体检，再计算；\n体检发现的每一处偏差，都必须出现在输出的<strong>最前面</strong>。</p>\n<h3>1. 跑体检</h3>\n<p>体检脚本随本 skill 一起分发，就在本 skill 目录下：<code>scripts/pdlc-state-lint.sh</code>（运行时会告知本 skill 的\n所在目录）。它与正在运行的 skill 同一版本，体检规则——合法阶段名、偏差代码——与下方 §2 一致。</p>\n<p>在项目根执行 <code>bash &lt;本 skill 目录&gt;/scripts/pdlc-state-lint.sh .</code>。stdout 每行一条偏差：<code>文件&lt;TAB&gt;代码&lt;TAB&gt;说明</code>。退出码三态：</p>\n<ul>\n<li><code>0</code> 已体检、全部合契约 → 照常出结论，不输出体检块</li>\n<li><code>1</code> 已体检、有偏差 → 照常计算，但输出最前面必须先放「输入契约体检」块（见 §3）</li>\n<li><code>2</code> 无法体检（缺 jq / 无状态目录）→ 体检块写「无法体检：&lt;原因&gt;」，<strong>不得当成合契约</strong></li>\n</ul>\n<p>体检脚本不可用时（找不到，或当前平台没有随 skill 分发它），按 §2 的规则逐条人工核对，\n体检块首行注明「体检脚本不可用，以下为人工核对」。</p>\n<h3>2. 体检规则（偏差代码）</h3>\n<p>读侧跳过 <code>_</code> 前缀的索引文件（如 <code>_relations.json</code>）与 <code>statusline.json</code>，它们不是功能状态机。</p>\n\n<table>\n<thead>\n<tr>\n<th>代码</th>\n<th>判定</th>\n<th>读侧怎么处理</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>json-invalid</code></td>\n<td>文件不是合法 JSON</td>\n<td>跳过该文件，列入体检块</td>\n</tr>\n<tr>\n<td><code>missing-field</code></td>\n<td>缺 <code>feature_id</code> / <code>current_stage</code> / <code>history</code> / <code>next_step</code> / <code>created_at</code> 之一</td>\n<td>用到该字段的指标，对这份文件记「不可判」</td>\n</tr>\n<tr>\n<td><code>field-type-invalid</code></td>\n<td>字段在、类型不对（如 <code>current_stage</code> 不是字符串、<code>history</code> 不是数组、<code>last_phase_result</code> 不是对象、history 条目不是对象）</td>\n<td><strong>按缺失处理</strong>：用到它的指标对这份文件记「不可判」。类型不对的时间戳不再另报 <code>timestamp-no-time</code></td>\n</tr>\n<tr>\n<td><code>missing-last_phase_result</code></td>\n<td>缺 <code>last_phase_result</code>（多为旧文件）</td>\n<td>不推断本阶段结果与 checks</td>\n</tr>\n<tr>\n<td><code>terminal_state-in-instance</code></td>\n<td>实例里出现 <code>terminal_state</code></td>\n<td><strong>忽略该字段</strong>，判终态只看 §4</td>\n</tr>\n<tr>\n<td><code>non-contract-field</code></td>\n<td>其它表外顶层字段（如 <code>title</code>）</td>\n<td>忽略</td>\n</tr>\n<tr>\n<td><code>stage-alias</code></td>\n<td><code>stage</code> 用了已知别名</td>\n<td>可按说明里的 <code>别名→短名</code> 归一化计数，<strong>但必须在体检块写明归一化了哪些</strong></td>\n</tr>\n<tr>\n<td><code>stage-unknown</code></td>\n<td><code>stage</code> 既不是短名也不是已知别名</td>\n<td>单独成行，不并入任何阶段</td>\n</tr>\n<tr>\n<td><code>current_stage-unknown</code></td>\n<td><code>current_stage</code> 既不是短名，也不以 <code>_done</code> 结尾</td>\n<td>该功能归入「❓ 异常」</td>\n</tr>\n<tr>\n<td><code>next_step-not-command</code></td>\n<td><code>next_step</code> 不是纯命令名（如带散文后缀）</td>\n<td>按原文展示，不据此推断下一步</td>\n</tr>\n<tr>\n<td><code>timestamp-no-time</code></td>\n<td>时间戳只有日期、没有时刻</td>\n<td>依赖它的<strong>耗时类指标记「不可测」</strong>，不得算成 0</td>\n</tr>\n<tr>\n<td><code>relations-not-object</code></td>\n<td><code>relations</code> 不是六键对象（如数组）</td>\n<td>这份文件的关系<strong>不入图</strong>，列入体检块</td>\n</tr>\n<tr>\n<td><code>relations-unknown-type</code></td>\n<td>关系键不在六类之内</td>\n<td>该键下的关系不入图</td>\n</tr>\n<tr>\n<td><code>relations-target-not-id</code></td>\n<td>关系目标不是 feature ID（散文、模块路径等）</td>\n<td>该条不入图</td>\n</tr>\n<tr>\n<td><code>relations-dangling</code></td>\n<td>目标 ID 没有对应的状态文件</td>\n<td>标「悬空」，不参与影响半径计算</td>\n</tr>\n<tr>\n<td><code>id-prefix-mismatch</code></td>\n<td>走的是修复流程（有 <code>fix</code> 阶段），ID 却不以 <code>B</code> 开头</td>\n<td>缺陷计数按 ID 前缀的契约口径算，同时在体检块点名这份</td>\n</tr>\n<tr>\n<td><code>second-state-dir</code></td>\n<td>仓库根另有一个 <code>.pdlc-state/</code></td>\n<td>本命令只读 <code>docs/.pdlc-state/</code>，提示两处并存</td>\n</tr>\n</tbody>\n</table>\n\n<p><strong>「不入图」不是丢弃</strong>：关系目标是散文时，把它硬解读成某个 feature，等于把猜测升格成结构——\n影响半径会因此多出一条本不存在的强依赖。宁可在体检块里原样列出，交给人判断。</p>\n<h4>阶段短名全集</h4>\n<p><code>history[].stage</code> 与 <code>last_phase_result.stage</code> 只能取下表的短名——每个短名由对应命令写入，\n等于该命令 frontmatter 的 <code>stage:</code>。别名只为<strong>读</strong>旧数据时容忍，归一化必须披露；<strong>写</strong>的时候一律用短名。</p>\n\n<table>\n<thead>\n<tr>\n<th>短名</th>\n<th>由哪个命令写入</th>\n<th>已知别名（读侧可归一化，须披露）</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>requirements</code></td>\n<td><code>pdlc-prd</code></td>\n<td><code>prd</code></td>\n</tr>\n<tr>\n<td><code>design</code></td>\n<td><code>pdlc-design</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>tdd</code></td>\n<td><code>pdlc-tdd</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>impl</code></td>\n<td><code>pdlc-implement</code></td>\n<td><code>implement, implementation</code></td>\n</tr>\n<tr>\n<td><code>review</code></td>\n<td><code>pdlc-review</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>e2e</code></td>\n<td><code>pdlc-e2e</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>ship</code></td>\n<td><code>pdlc-ship</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>deploy</code></td>\n<td><code>pdlc-deploy</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>fix</code></td>\n<td><code>pdlc-fix</code></td>\n<td><code>bugfix</code></td>\n</tr>\n<tr>\n<td><code>refactor</code></td>\n<td><code>pdlc-refactor</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>task</code></td>\n<td><code>pdlc-task</code></td>\n<td></td>\n</tr>\n<tr>\n<td><code>feature</code></td>\n<td><code>pdlc-feature</code></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n\n<h3>3. 体检块的格式（放在输出最前面）</h3>\n<pre><code>⚠️ 输入契约体检：&lt;N&gt; 份状态文件，&lt;M&gt; 处偏差——以下结论建立在这些处理之上\n  · 3/5 份缺 created_at → 时间窗改用 history 末条 done_at\n  · 阶段别名 prd→requirements ×1、implementation→impl ×2 → 已归一化计数\n  · 5/5 份含 terminal_state → 已忽略（判终态只看 current_stage）\n  · 2 份的 done_at 只有日期 → 阶段耗时记「不可测」\n</code></pre>\n<ul>\n<li><strong>按「偏差类 × 份数 × 处理方式」汇总</strong>，不要把脚本输出原样倒出来</li>\n<li><strong>放最前面，不放末尾</strong>——结论会被单独引用，偏差得跟着结论走；写在报告末尾的偏差表，\n读者看到的时候已经信了前面的数字</li>\n<li><strong>计数照抄脚本输出，不要自己重数</strong>：按代码计数用 <code>cut -f2 | sort | uniq -c</code>，份数按第一列去重。\n真机验证时脚本报 25 处无时刻的时间戳，报告正文却自己数成了 26——同一份报告里两个数字对不上，\n读者就不知道该信哪个</li>\n<li>同一次输出里，前面披露了「已忽略 X」，后面的计算就不得再用 X</li>\n</ul>\n<h3>4. 判终态的唯一依据 ⛔</h3>\n<p><strong>已抵达终态 ⇔ <code>current_stage</code> 以 <code>_done</code> 结尾</strong>（终态即「已发布」：<code>/pdlc-ship</code> 写 <code>ship_done</code>、<code>/pdlc-deploy</code> 写 <code>deploy_done</code>；旧版本留下的 <code>feature_done</code> / <code>fix_done</code> / <code>review_done</code> 也按终态读）。</p>\n<ul>\n<li><strong>不看 <code>terminal_state</code></strong>。状态机实例本就没有这个字段。skill frontmatter 里的 <code>terminal_state:</code>\n说的是「这个命令走完后<strong>应当</strong>到达的终态名」——是<strong>目标</strong>，不是<strong>事实</strong>。拿它判终态，\n等于把「打算完成」当成「已经完成」。</li>\n<li><strong>不用封闭列表</strong>（如只认 <code>[feature_done, fix_done]</code>）。封闭列表会把合法的终态漏判成「进行中」，\n逼着读侧去别的字段里找答案——而最顺手的那个字段恰好就是 <code>terminal_state</code>。</li>\n<li><strong><code>next_step</code> 为 <code>null</code> 也不等于终态</strong>：<code>/pdlc-task</code> 写的 <code>next_step</code> 恒为 <code>null</code>，却未必完成；空的或残缺的状态文件也读得出 <code>null</code>。</li>\n</ul>\n\n<h2>段一：聚合统计</h2>\n<h3>1.1 参数解析</h3>\n<ul>\n<li><code>--range &lt;N&gt;d | all</code>：时间窗口（默认 <code>30d</code>）</li>\n<li><code>--feature &lt;feature-id&gt;</code>：只看单个功能的时间线（输出 history 详情而非聚合）</li>\n</ul>\n<h3>1.2 读取与过滤</h3>\n<ol>\n<li>列出 <code>docs/.pdlc-state/*.json</code>（跳过 <code>_</code> 前缀的索引文件与 <code>statusline.json</code>）</li>\n<li><strong>跑契约体检</strong>（见上方「读状态机之前：先做契约体检」），结果写进报告开头的「输入契约体检」节</li>\n<li>按 <code>created_at</code> 过滤到时间窗口内。缺 <code>created_at</code> 的文件改用 <code>history</code> 末条 <code>done_at</code>——<strong>这是口径替换，必须计入体检块</strong>，不得静默</li>\n<li>解析每份文件的 <code>history</code> 数组</li>\n</ol>\n<h3>1.3 计算指标</h3>\n<p>对时间窗口内的所有功能聚合：</p>\n<p><strong>交付量</strong>：</p>\n<ul>\n<li>完成功能数：<code>current_stage</code> 以 <code>_done</code> 结尾——<strong>判终态的唯一依据</strong>，不看 <code>terminal_state</code>（它是目标不是事实）、不用封闭列表</li>\n<li>修复缺陷数：<code>feature_id</code> 以 <code>B</code> 开头（契约口径）。体检报 <code>id-prefix-mismatch</code> 的文件在体检块点名，<strong>不据此改口径</strong>——两个口径打架时，报出来比悄悄挑一个更有用</li>\n</ul>\n<p><strong>质量趋势</strong>：</p>\n<ul>\n<li>每阶段自检通过率（<code>passed / (passed + failed + manual)</code>）；某阶段一条自检记录都没有 → 写「无数据」，不写 0%</li>\n<li>各阶段自检平均 <code>failed</code>、<code>manual</code> 数</li>\n<li>行按阶段短名：<code>stage-alias</code> 按 <code>别名→短名</code> 归一化后计数（归一化了哪些写进体检块）；<code>stage-unknown</code> 单独成行，不并入任何阶段</li>\n</ul>\n<p><strong>阶段耗时</strong>：</p>\n<ul>\n<li>相邻 history 条目的 <code>done_at</code> 差值作为阶段耗时，输出各阶段中位数</li>\n<li>任一端时间戳没有时刻（体检报 <code>timestamp-no-time</code>）→ 该间隔<strong>不可测</strong>，不计入中位数；全部不可测 → 整节写「不可测：&lt;原因&gt;」。<strong>不得输出 0.0h</strong>——它会被读成「快到不耗时」，实际是精度不够</li>\n</ul>\n<p><strong>卡点案例</strong>：</p>\n<ul>\n<li>自检 <code>failed &gt; 2</code> 或 <code>manual &gt; 1</code> 的阶段</li>\n<li>同一阶段耗时 &gt; 3 天的功能</li>\n</ul>\n<h2>段二：自检</h2>\n\n<h2>段二：自检（强制）</h2>\n<p>重新阅读本次产出物，按质量关卡清单逐项检查。勾选已通过，标注未通过原因。</p>\n<blockquote>\n<p><strong>注意</strong>：自检清单的具体内容由各命令自行定义，本片段只规定结构。</p>\n</blockquote>\n<h2>段三：修复（单次，不递归）</h2>\n<p>针对自检段标注为未通过的项：</p>\n<ul>\n<li><strong>可自动修复</strong>：直接修复（如补缺字段、修正格式、补齐缺失段落）</li>\n<li><strong>修复后回验</strong>：再次运行自检，确认被修复项现在通过</li>\n<li><strong>无法自动修复</strong>：记录到自审报告，不再尝试，流程继续</li>\n</ul>\n<p>⚠️ 单次修复原则：若一轮修复后仍有项未通过，<strong>不再递归修复</strong>，防止死循环。</p>\n\n<p><strong>复盘报告自检清单：</strong></p>\n<ul>\n<li><input disabled=\"disabled\" type=\"checkbox\"> 时间窗口正确（参数解析无误）</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> 数值可加总（交付量、质量趋势）</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> 列出了至少 1 个卡点案例或明确说明\"无卡点\"</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> 体检有偏差时，报告<strong>开头</strong>有「输入契约体检」节，且后文计算没有再用已声明忽略的字段（如 <code>terminal_state</code>）</li>\n<li><input disabled=\"disabled\" type=\"checkbox\"> 阶段耗时没有把「不可测」写成 0.0h</li>\n</ul>\n\n<h2>防循环规则</h2>\n<p>本命令所有的自检-修复循环均受以下约束：</p>\n<ol>\n<li><strong>单次检查</strong>：同一个自检清单在本次命令执行中只跑一次（起始 + 修复后验证共两次读）</li>\n<li><strong>单次修复</strong>：发现的问题只尝试修复一轮</li>\n<li><strong>不递归</strong>：修复后不再重新触发自检的全量重跑</li>\n<li><strong>失败降级</strong>：无法自动修复的问题 → 记录到自审报告 → 流程继续 → 最终报告标注待人工处理</li>\n</ol>\n<p>这是为了防止 agent 在\"修完再查、查完再修\"的往返中陷入死循环。</p>\n\n<h2>段三：生成报告文件</h2>\n<ol>\n<li>确定输出路径：<code>docs/07_reviews/retro/&lt;YYYY-MM&gt;-retro.md</code>（按当月归档）</li>\n<li>写入模板：</li>\n</ol>\n<pre><code># &lt;YYYY-MM&gt; PDLC 迭代复盘\n\n&gt; 时间窗口：&lt;起&gt; ~ &lt;止&gt;\n&gt; 生成时间：&lt;ISO 时间&gt;\n\n## 输入契约体检\n（仅在体检有偏差或无法体检时出现；按「偏差类 × 份数 × 处理方式」汇总，放在全文最前面）\n\n## 交付量\n- 完成功能：&lt;N&gt; 个\n- 修复缺陷：&lt;M&gt; 个\n\n## 质量趋势\n| 阶段 | 自检通过率 | 平均失败数 | 平均人工介入数 |\n|------|----------|------------|--------------|\n| requirements | XX% | N.N | N.N |\n| design       | XX% | N.N | N.N |\n| tdd          | XX% | N.N | N.N |\n| impl         | XX% | N.N | N.N |\n| review       | XX% | N.N | N.N |\n\n## 阶段耗时中位数\n- 需求: X.Xh  设计: X.Xh  TDD: X.Xh  实现: X.Xh  评审: X.Xh\n  （时间戳缺时刻导致不可测时，写「不可测：&lt;原因&gt;」，不写 0.0h）\n\n## 卡点案例\n- &lt;feature-id&gt; 在 &lt;stage&gt; 阶段: &lt;原因&gt;\n\n## 值得保留的做法\n- &lt;从高通过率/低耗时的功能中提炼&gt;\n</code></pre>\n<ol start=\"3\">\n<li><strong>IRON LAW 落盘</strong>：文件必须实际写入磁盘，不可仅在对话中输出</li>\n</ol>\n<h2>段四：交接</h2>\n\n<h2>段四：交接（Handoff）</h2>\n<p>命令完成后必须输出以下格式的最终消息：</p>\n<pre><code>✅ &lt;阶段名&gt; 完成：&lt;主要产出物路径&gt;\n\uD83D\uDCCA 自检：&lt;通过数&gt;/&lt;总数&gt; 通过（若有未通过，附要点）\n\uD83D\uDCE6 状态快照：docs/.pdlc-state/&lt;feature-id&gt;.json\n\uD83D\uDC49 下一步：/pdlc-&lt;next_step&gt;\n   （如果有分叉）或 /pdlc-&lt;alt&gt;（条件：&lt;选择依据&gt;）\n</code></pre>\n<p><strong>规则：</strong></p>\n<ul>\n<li>主流程命令（写状态机的命令；下一跳见正文里「本命令的状态机取值」）必须显式输出\"下一步\"，不可省略</li>\n<li>工具型命令（Layer 3）可以没有 <code>next_step</code>，此时输出 <code>\uD83D\uDC49 下一步：（本次流程结束，无后续）</code></li>\n<li>分叉场景必须说明<strong>选择条件</strong>，例如\"若需补充测试用例 → <code>/pdlc-tdd</code>；若测试已齐 → <code>/pdlc-review</code>\"</li>\n</ul>\n\n<p><strong>本命令的 handoff 输出：</strong></p>\n<pre><code>✅ 复盘报告已生成：docs/07_reviews/retro/&lt;YYYY-MM&gt;-retro.md\n\uD83D\uDCCA 时间窗口：&lt;起&gt; ~ &lt;止&gt;，共 &lt;N&gt; 个功能\n⚠️ 输入契约体检：&lt;M&gt; 处偏差（见报告开头；无偏差则省略本行）\n\uD83D\uDC49 下一步：（本次流程结束，建议人工 review 报告）\n</code></pre>\n<hr>\n<p><strong>参数</strong>：$ARGUMENTS</p>\n","files":[{"path":"scripts/pdlc-state-lint.sh","sizeBytes":11609,"isText":true},{"path":"SKILL.md","sizeBytes":15520,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-23T18:54:57.76064Z","sha256":"7A0C7DC25D3E75AB7F34FCDC7378CF0898F475DA88899EEB91575984FDAEC037","sizeBytes":11977},"review":null,"source":{"repositoryUrl":"https://github.com/kanfu-panda/pdlc-skills","path":"skills/pdlc-retro","license":"MIT","commit":"3cd2f02ab45cb1cd48962e0f298ae4dad9fb442f","subtreeSha":"05EC9771BCFDDB11A4AFEA211D402C1EE7B0BB52845FA6D20C9FA181FD42B6FB","lastSyncedAt":"2026-09-23T18:54:21.123477Z"},"reviewedAt":"2026-09-23T18:56:29.954078Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/kanfu-panda/pdlc-skills/tree/main/skills/pdlc-retro"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install kanfu-panda-pdlc-skills@llmmart"},{"target":"git","command":"git clone https://github.com/kanfu-panda/pdlc-skills.git"}]}