spec-pack-abandon

📁 zixun-github/aisdlc 📅 2 days ago
9
总安装量
9
周安装量
#32439
全站排名
安装命令
npx skills add https://github.com/zixun-github/aisdlc --skill spec-pack-abandon

Agent 安装分布

claude-code 9
cursor 8
opencode 3
gemini-cli 3
github-copilot 3
codex 3

Skill 文档

spec-pack-abandon(废弃/撤销 Spec Pack:清单 + 二次确认 + 删除分支)

概览

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

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

何时使用 / 不使用

  • 使用时机
    • 需求/约束出现重大问题,决定废弃当前 spec pack(不再继续澄清/设计/实现)。
    • 你需要删除:.aisdlc/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)

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

. (Join-Path (git rev-parse --show-toplevel) "skills\spec-context\scripts\spec-common.ps1")
$context = Get-SpecContext
$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)
}

第一次确认(必须)

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

  • 第一次确认短语:确认删除清单

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

删除命令准备(只在第一次确认后展示)

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

. (Join-Path (git rev-parse --show-toplevel) "skills\spec-context\scripts\spec-common.ps1")
$context = Get-SpecContext
$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)
}

第二次确认(必须)

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

  • 第二次确认短语:最终确认执行删除

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

执行删除(只在二次确认后)

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

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 不一致都必须停止。