迁移工具从 Specivo 中拆出

Specivo 不再自己读取其他项目管理系统。改由独立的迁移工具读取旧系统并生成导入包:一个由纯文件组成的目录,包含项目、工作项(Issue)、历史记录、维基(Wiki)页面和附件。Specivo 随后校验导入包,可以先用试运行(dry run)演练,再用 python -m specivo.cli.import_data --source bundle 加载。两者分开后,迁移工具可以单独修复和发布,无需发新版 Specivo;导入包一旦生成,Specivo 也不再需要访问旧系统。

迁移工具和 SDK 各有自己的仓库:

Jira 迁移工具有独立的文档,还有一个介绍迁移过程的页面:从 Jira 迁移。

本版本中,导入包的导入有几项新增:

  • 按项目逐个导入。可以一次只加载一个项目。指向另一侧的关联、父工作项和文本引用会先保存在链接文件中,等那一侧加载后再解析。
  • 待处理引用。admin import-map pending、resolve-pending 和 purge 可以显示链接文件中仍在等待的引用,并让你完成或清除它们。
  • 导入包内容更丰富。导入包现在可以包含冲刺(Sprint)、以标签形式保存的 label、剩余预计工时和自定义字段名称。

导入指南介绍 Specivo 这一侧的步骤,所有迁移工具都通用。

如果你用过内置的 Redmine 导入

内置的 Redmine 导入器已移除,importers extra 和 make import-redmine 也一并移除。调用它们的脚本和定时任务需要修改。请改用 Redmine 迁移工具生成导入包,再加载。从未运行过直接导入的实例不受影响。

如果你曾用旧工具导入过,并想在那次导入的基础上继续追加,先把它在导入映射中的记录迁到导入包所用的 key 下。否则导入包会被当作新数据,造成重复。升级指南给出了具体的 import-map rename 步骤。

版本与冲刺

  • 版本排序。路线图和设置中的“版本”标签页可以按版本号、截止日期或状态排序。排序选择按用户记住,“显示已完成的版本”开关可以隐藏或显示已关闭的版本。
  • 数字顺序。版本现在按版本号排序,所以 0.2.0 排在 0.10.0 之前。
  • 冲刺统计。冲刺中的“已完成”计数现在依据状态类别,而不是状态名称。

更易读的工作项历史记录

  • 显示名称而不是 ID。历史记录中的状态、版本、类别、负责人、父工作项和自定义字段都显示名称,且只限读者有权看到的内容。自定义字段在所有地方都按定义的名称显示,用户和版本的值也按名称显示。
  • 文件记录。上传和删除显示为“已添加文件 X”或“已删除文件 X”,附件历史显示文件名而不是 ID。
  • API 与 MCP。REST API 中的变更记录(journal)详情现在包含 old_name、new_name 和 field_name。MCP 工具 specivo_list_comments 新增 include_changes 参数。PATCH /issues/{ref}/ 会返回 journal_id,这样上传的文件可以归入该次编辑的历史条目。

访问控制与安全

本版本修复了多处用户或密钥能看到、做到超出预期范围的问题。

  • 限定项目的 API 密钥。限定在部分项目的密钥现在在 REST 和 MCP 中都统一受限。范围之外的项目会显示为不存在,账户级或实例级操作会被拒绝。此前这类密钥可以为自己创建一个不受限的密钥,现已修复。
  • 文件。添加文件现在需要有修改对应工作项、维基页面或评论的权限。删除他人的文件需要有管理该容器文件的权限。
  • 计费费率。修改需要 manage-project 权限,查看列表需要 view-time-entries 权限。
  • 私有工作项。对无权查看的人,私有工作项不再出现在冲刺和版本列表、MCP 的版本和冲刺工作项列表、仪表盘计数、速率和自动链接中。
  • 历史记录泄露。历史记录中的名称、父工作项编号和关联变更不再暴露读者无权查看的工作项、项目或用户。
  • 搜索。搜索不再暴露私有项目是否存在,语义搜索的摘要片段现在会做转义。
  • 匿名访客不再能看到其可打开项目之外的用户名称。
  • 已保存的筛选器不再能从另一个项目通过 ID 读取。
  • 重定向:登录、单点登录和修改分页大小后的重定向始终停留在本站。
  • 批量标签请求不再接受无限数量的名称和工作项 ID,重复的工作项 ID 也不再导致服务器错误。
  • 智能体令牌日志不再接受其他用户的会话。
  • 磁盘上的密钥。configure.py 现在创建的 .env 和 .env.local 只有文件所有者可读。请用同一个用户运行它和 docker compose。

其他修复

  • 请求的变更在响应发出后才提交,导致紧接着的下一个请求仍可能读到旧数据。现在提交失败会返回错误,而不是成功。
  • [[wiki links]] 和工作项编号在代码和原始 HTML 中不再被重写。
  • 拖放到工作项编辑表单上的文件在保存时不再丢失。
  • 重复模板页面不再把生成的工作项链接到不存在的页面。
  • 查询中包含 &、# 或 + 时,搜索分页链接不再失效。
  • mcp 密钥作用域已从指南中移除。核心从未真正执行过它。
  • 单点登录测试用身份提供商的 compose 文件移到了 tests/fixtures/sso/,CI 工作流现在用只读令牌运行。

升级时要做什么

先备份数据库和数据目录。本版本没有数据库迁移,不改任何配置也能照常运行。

  • 用过内置的 Redmine 导入?改用 Redmine 迁移工具,并更新调用旧选项的脚本。如需在之前的导入基础上继续,参见上文说明。
  • 限定在部分项目的 API 密钥现在不会越出这些项目。检查那些依赖它们访问更大范围的自动化。
  • 用同一个用户运行 configure.py 和 docker compose。环境文件现在只有所有者可读。

详情见升级指南。

如何获取

用 docker pull specivo/specivo:0.11.0 拉取 Docker 镜像。服务器无法访问互联网时,GitHub Release 提供离线包。源代码在 github.com/specivo/specivo。安装和升级步骤参见用户指南。

Jira 是 Atlassian 的商标。Specivo 与 Atlassian 没有关联,也未获其认可。