OpenSpec 在 CI 中报 “Legacy files detected in non-interactive mode“ 怎么解决?

📅 发布时间:2026/9/9 14:04:07
OpenSpec 在 CI 中报 “Legacy files detected in non-interactive mode“ 怎么解决? OpenSpec 在 CI 中报 Legacy files detected in non-interactive mode 怎么解决【免费下载链接】OpenSpecSpec-driven development (SDD) for AI coding assistants.项目地址: https://gitcode.com/GitHub_Trending/op/OpenSpec在 CI 流水线或任何非交互 shell 里跑openspec init时如果项目里残留着旧版 OpenSpec 生成的文件旧的斜杠命令目录、带 OpenSpec 标记块的工具配置文件等init 检测到这些遗留文件后本应弹出确认提示Legacy files detected. Upgrade and clean up? [Y/n]。但 CI 里没有任何进程能回答这个问题init 会以退出码 1 中止并列出它检测到的遗留文件报出Legacy files detected in non-interactive mode。解决办法很直接用--force标志跳过提示、自动批准清理。适用前提是CI/非交互环境没有终端可以应答提示的 shell、AI agent 调用、stdin 已关闭的场景且你确认项目里这些遗留文件属于旧版 OpenSpec 产物、可以被清理。为什么 CI 里会失败这个报错的机制报错不是 bug而是保护机制。OpenSpec 在init时按顺序检测三类遗留物带 OpenSpec 标记块!-- OPENSPEC:START --到!-- OPENSPEC:END --的工具配置文件如CLAUDE.md、.cursorrules、.windsurfrules、.clinerules、.github/copilot-instructions.md、CODEBUDDY.md、IFLOW.md等旧的斜杠命令目录如.claude/commands/openspec/、.windsurf/workflows/openspec-*.md旧的 OpenSpec 结构文件如openspec/AGENTS.md、带 OpenSpec 标记的根AGENTS.md。检测到遗留物后交互式运行会先展示找到了什么再请求确认用户按 N 则中止初始化并建议使用--force手动处理。而在 CI 环境中--no-interactive或无法应答提示检测到遗留物就直接以退出码 1 中止、打印检测清单并建议改用交互模式或--force运行。也就是说这条报错本身就是在告诉你下一步该做什么。解决方法openspec init --forcedocs/troubleshooting.md 和 docs/migration-guide.md 给出的修复命令一致openspec init --forceCLI 参考对--force的定义是 Auto-cleanup legacy files without prompting——自动清理遗留文件、不弹提示。清理会执行但不做外科手术式的误删规则如下只含 OpenSpec 标记块标记外允许空白的配置文件移除标记块但保留文件本身不删除文件标记块内外都有内容的配置文件包括根AGENTS.md只移除标记块保留标记前后的内容并清理产生的多余空行遗留斜杠命令目录如.claude/commands/openspec/整个目录删除父目录如.claude/commands/保留openspec/AGENTS.md删除该文件不删除openspec/目录本身。一个需要注意的例外openspec/project.md永远不会被自动删除因为里面可能有你手写的内容。清理完成后如果它还存在输出中会出现这样一段迁移提示文档示例Manual migration needed: → openspec/project.md still exists Move useful content to config.yamls context: field, then delete处理方式是把有用内容移入openspec/config.yaml的context:字段然后手动删除该文件。迁移指南提供了完整步骤。在 CI 中完整跑通非交互初始化--force只解决遗留清理的确认提示。如果 CI 里还要指定要为哪些 AI 工具生成 skills/commands用--tools一起传入避免其他交互提问openspec init --force --tools claude,cursordocs/cli.md 中的非交互示例形式为openspec init --tools claude,cursor--tools支持all、none或逗号分隔的工具 ID 列表完整 ID 列表见 Supported Tools。如果你只关心清理和生成openspec/目录结构、不配置任何工具用--tools none。清理后如何验证重新运行原命令openspec init --force应以退出码 0 正常结束不再打印Legacy files detected in non-interactive mode的检测清单。查看清理摘要清理完成时输出会带一段Cleaned up legacy files:摘要文档示例Cleaned up legacy files: ✓ Removed OpenSpec markers from CLAUDE.md ✓ Removed .claude/commands/openspec/ (replaced by OpenSpec skills and commands) ✓ Removed openspec/AGENTS.md (no longer needed)没有检测到遗留物时不会出现这段摘要直接进入 skill 配置。检查文件状态openspec/AGENTS.md应已不存在而openspec/目录仍在.claude/commands/openspec/目录应已不存在而.claude/commands/仍在CLAUDE.md等配置文件仍在只是 OpenSpec 标记块被移除、你自己的内容保留。确认命令生效如果之后发现工具里/opsx:*命令没出现重启 IDEskills 在启动时检测仍不出现则跑openspec update并核对 Supported Tools 里的文件位置。边界与限制Codex 的旧提示文件有特殊限制OpenSpec 可能检测到$CODEX_HOME/prompts或~/.codex/prompts下的旧版受管提示文件但清理范围限于 OpenSpec 允许名单内的遗留 Codex 提示文件名并且非交互init只删除其对应的.agents/skills/openspec-*skill 已存在的那些文件。openspec update的行为不同非交互的openspec update即使发现遗留文件也只警告、不中止要让它执行清理必须显式传--force。另外注意update的--force含义是 Force update even when files are up to date与init的--force自动清理遗留文件不是同一个作用别混用。交互式环境下想先看看会清理什么本地运行时直接跑openspec init然后在清理提示处拒绝按 N——init 会打印完整的检测结果但不做任何更改之后确认无误再走--force。如果--force之后流水线仍失败按 troubleshooting 文档 的建议记录 OpenSpec 版本openspec --version、Node 版本node --version要求 20.19.0 及以上、使用的 AI 工具以及原始命令和完整输出再通过openspec feedback提交 issue 求助。【免费下载链接】OpenSpecSpec-driven development (SDD) for AI coding assistants.项目地址: https://gitcode.com/GitHub_Trending/op/OpenSpec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考