迁移工具从 Specivo 中拆出
Specivo 不再自己读取其他项目管理系统。改由独立的迁移工具读取旧系统并生成导入包:一个由纯文件组成的目录,包含项目、工作项(Issue)、历史记录、维基(Wiki)页面和附件。Specivo 随后校验导入包,可以先用试运行(dry run)演练,再用 python -m specivo.cli.import_data --source bundle 加载。两者分开后,迁移工具可以单独修复和发布,无需发新版 Specivo;导入包一旦生成,Specivo 也不再需要访问旧系统。
迁移工具和 SDK 各有自己的仓库:
- Redmine 迁移工具。它取代了内置的 Redmine 导入器。参见从 Redmine 迁移。
- Jira 迁移工具,本版本新增,支持 Jira Cloud 和 Jira Data Center。
- 迁移 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 没有关联,也未获其认可。