# Spec Pack Abandon

> Use when 需要因需求重大问题而废弃/撤销当前 Spec Pack，并且必须删除对应 `.aidlc/specs/{branch}` 目录与本地/远程分支，同时需要在执行删除前输出删除清单并要求用户二次确认。

- Skill: `zixun-github/spec-pack-abandon` (Agent Skill)
- Install (CLI): `npx skillmds@latest add zixun-github/spec-pack-abandon`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zixun-github/spec-pack-abandon/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: zixun-github (https://skillmd.com/u/zixun-github)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/zixun-github/spec-pack-abandon

---


# spec-pack-abandon（废弃/撤销 Spec Pack：清单 + 二次确认 + 删除分支）

## 概览

当需求出现重大问题需要“废弃当前 spec pack”时，本技能用于**安全地撤销**：先执行 `spec-context` 获取上下文并精确定位 `{FEATURE_DIR}`，再生成“将要删除的内容清单”，并在执行任何破坏性操作前要求用户**二次确认**；最后删除本地/远程分支，并清理工作区中残留的 spec pack 目录。

**开始时宣布：**「我正在使用 spec-pack-abandon 技能废弃当前 Spec Pack（输出删除清单并二次确认后删除目录与分支）。」

## 何时使用 / 不使用

- **使用时机**
  - 需求/约束出现重大问题，决定废弃当前 spec pack（不再继续澄清/设计/实现）。
  - 你需要删除：`.aidlc/specs/{CURRENT_BRANCH}/` 以及该 `{CURRENT_BRANCH}` 分支（本地 + 远程）。
- **不要用在**
  - 你只是想“回退某个提交”或“重做需求文档”：优先用正常 git 回退/新提交，而不是删分支。
  - 当前不在 spec 分支（分支名不符合 `{num}-{short-name}`）：先切到目标 spec 分支再说；否则**停止**。

## 硬规则（必须遵守）

- **REQUIRED SUB-SKILL：正在执行 `spec-context` 获取上下文，并在对话中回显 `FEATURE_DIR=...`（允许 `(reuse)`）。**
- **禁止猜路径/猜分支**：只能使用 `Get-SpecContext` 的 `CURRENT_BRANCH` 与 `FEATURE_DIR`。
- **必须输出删除清单**：在任何删除命令前，先输出“将要删除的内容清单”（目录/分支/远程分支存在性/未提交更改概览）。
- **必须二次确认**：
  - 第一次确认：用户确认“删除清单无误”。
  - 第二次确认：用户确认“即将执行的具体删除命令无误”。
  - 两次确认都必须要求用户回复**精确短语**（见下文）。
- **禁止默认丢弃整个工作区**：不得建议/执行 `git clean -fd` 这类“全盘清空”命令来图省事。
- **遇到任何验证失败就停止**：不得继续给出“直接删”的命令。

## 删除清单生成（PowerShell）

> 本段只用于**生成清单与风险提示**，不执行删除。

```powershell
. (Join-Path (git rev-parse --show-toplevel) "skills\spec-context\scripts\spec-common.ps1")
$context = Get-SpecContext -SkillName "spec-pack-abandon"
$FEATURE_DIR = $context.FEATURE_DIR
Write-Host ("FEATURE_DIR={0}" -f $FEATURE_DIR)
Write-Host ("CURRENT_BRANCH={0}" -f $context.CURRENT_BRANCH)

$repoRoot = $context.REPO_ROOT
$branch = $context.CURRENT_BRANCH
$featureDir = $context.FEATURE_DIR
$demoDir = Join-Path $repoRoot ("demo\prototypes\{0}" -f $branch)

$hasRemote = $false
git ls-remote --exit-code --heads origin $branch *> $null
if ($LASTEXITCODE -eq 0) { $hasRemote = $true }

$dirty = git status --porcelain
$aheadBehind = git rev-list --left-right --count ("origin/{0}...{0}" -f $branch) 2>$null

Write-Host "=== 删除清单（待确认）==="
Write-Host ("REPO_ROOT: {0}" -f $repoRoot)
Write-Host ("CURRENT_BRANCH（将删除）: {0}" -f $branch)
Write-Host ("FEATURE_DIR（将删除/清理）: {0}" -f $featureDir)
Write-Host ("demo/prototypes（如存在将删除/清理）: {0}" -f $demoDir)
Write-Host ("远程分支 origin/{0} 是否存在: {1}" -f $branch, $hasRemote)
Write-Host ""
Write-Host "=== 工作区风险提示 ==="
if ($dirty) {
  Write-Host "检测到未提交更改（将随分支删除而丢失）。git status --porcelain："
  $dirty | ForEach-Object { Write-Host ("  {0}" -f $_) }
} else {
  Write-Host "未检测到未提交更改。"
}
if ($aheadBehind) {
  Write-Host ("与 origin/{0} 的 ahead/behind 计数（若分支未 push 可能为空/报错）： {1}" -f $branch, $aheadBehind)
}
```

### 第一次确认（必须）

把上面生成的“删除清单”原样展示给用户，然后要求用户回复以下精确短语：

- **第一次确认短语**：`确认删除清单`

若用户未明确回复该短语（或提出任何疑问/修改），**停止**，先修正清单再继续。

## 删除命令准备（只在第一次确认后展示）

> 本段仍然不执行删除；仅把“将要执行的命令”完整列出来作为第二次确认对象。

```powershell
. (Join-Path (git rev-parse --show-toplevel) "skills\spec-context\scripts\spec-common.ps1")
$context = Get-SpecContext -SkillName "spec-pack-abandon"
$branch = $context.CURRENT_BRANCH
$featureDir = $context.FEATURE_DIR
$repoRoot = $context.REPO_ROOT
$demoDir = Join-Path $repoRoot ("demo\prototypes\{0}" -f $branch)

$hasRemote = $false
git ls-remote --exit-code --heads origin $branch *> $null
if ($LASTEXITCODE -eq 0) { $hasRemote = $true }

@"
【将要执行的删除命令（待最终确认）】

1) 切到 main（避免在被删分支上删除）
git switch main
git pull

2) 清理本地残留目录（若存在）
if (Test-Path -LiteralPath `"$featureDir`") { Remove-Item -LiteralPath `"$featureDir`" -Recurse -Force }
if (Test-Path -LiteralPath `"$demoDir`") { Remove-Item -LiteralPath `"$demoDir`" -Recurse -Force }

3) 删除本地分支
git branch -D $branch

4) 删除远程分支（若存在）
"@ | Write-Host

if ($hasRemote) {
  Write-Host ("git push origin --delete {0}" -f $branch)
} else {
  Write-Host ("（跳过远程删除：未检测到 origin/{0}）" -f $branch)
}

```

### 第二次确认（必须）

要求用户在看到“将要执行的删除命令”后，回复以下精确短语：

- **第二次确认短语**：`最终确认执行删除`

未收到该短语前，**禁止**执行任何删除动作。

## 执行删除（只在二次确认后）

按“删除命令准备”里展示的命令执行即可。执行后做最小验收：

```powershell
git branch --list $branch
git branch -r | Select-String ("origin/{0}" -f $branch)
Test-Path -LiteralPath $featureDir
```

期望：
- `git branch --list $branch` 无输出
- 远程分支查询无匹配（若你执行了远程删除）
- `Test-Path $featureDir` 为 `False`

## 常见错误（出现即按硬规则停止）

- **跳过 `spec-context`**：用“看目录/看打开文件/猜分支名”的方式拼路径。
- **不出清单就删**：直接给 `git branch -D` / `git push --delete` / `Remove-Item`。
- **只确认一次**：用户说“删吧”不等于完成二次确认门禁。
- **用 `git clean -fd` 清空仓库**：这是全盘删除，极易误伤非 spec pack 文件。
- **删 main / 删错误分支**：任何分支名与 `Get-SpecContext.CURRENT_BRANCH` 不一致都必须停止。


