Lina 自动归档
SkillDev toolsScans and archives completed OpenSpec active changes. Must be triggered manually by the user; automatic triggering is forbidden.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Lina 自动归档 skill
What this skill tells your AI
The instructions your AI receives, as published by linaproai/linapro in .agents/skills/lina-openspec-archive-changes/SKILL.md and read by ahel’s review.
归档 openspec/changes/ 下已完成的活跃变更(排除 archive/),输出成功/跳过清单。
硬规则
- 只扫活跃一级目录,不扫
archive/。 - 任务未完成、校验失败或不可安全修复 → 跳过,不强制归档,不用
--no-validate,不手动mv。 - 先全量预检/修复,再归档;单个失败不阻塞其他可归档项(环境级故障除外)。
- 不改无关工作区文件;不伪造
tasks.md完成态;不空写design.md。 - 修复后必须
openspec validate <name> --strict+openspec status --change <name> --json复验。 - 结束时列出:修复项、成功归档路径、跳过原因。
完成门禁(全部满足才可归档)
| 条件 | 要求 |
|---|---|
| 位置 | openspec/changes/<name>/,name ≠ archive |
| status 可读 | openspec status --change <name> --json 成功 |
| 必选 artifact | proposal / specs / tasks(若存在)为 done/complete/completed |
| design(可选) | 缺失 design.md、或 design=ready、或已 done → 均不阻塞。isComplete=false 仅因 design 未写 → 仍可继续。禁止为归档生成占位 design |
| tasks.md | 存在;无 - [ ] / - [未完成] |
| 任务统计 | completedTasks == totalTasks;不等则以 tasks.md 为准,记录差异后继续 |
| MODIFIED/REMOVED | header 须命中 openspec/specs/<capability>/spec.md;否则走修复 |
| 插件业务 specs | 能力目录必须以 <plugin-id> 开头(见下) |
| 校验 | openspec validate <name> --strict 通过 |
无 tasks.md → 跳过(无法判定)。缺 design.md → 不跳过。
无 artifact 明细时,用 openspec list --json 的 status ∈ {complete,completed,done} 辅助判断。
插件业务规范前缀
业务插件 = apps/lina-plugins/<plugin-id>/ 下的具体插件能力。
不含 宿主框架 / lifecycle / governance / pluginbridge / host service / 动态运行时。
- 从 proposal/design/tasks/specs/路径/
plugin.yaml识别plugin-id。 - 插件相关
specs/<capability>/必须以<plugin-id>或<plugin-id>-...命名;归档后openspec/specs/同理。 - 多插件分目录,不混用无前缀通用名(如
cms)。 - 主框架能力保持主框架名(如
plugin-framework)。 - 可安全重命名时:
specs/<cap>/→specs/<plugin-id>-<cap>/或specs/<plugin-id>/,再复验。 - 无法唯一识别 / 冲突 → 跳过:
插件规范目录缺少插件前缀且无法安全自动修复:<capability>。
流程
1. 环境
pwd && test -d openspec/changes && openspec --version && git status --short
CLI 不可用、非仓库根或无 openspec/changes → 停止并说明。
2. 候选
openspec list --json
find openspec/changes -mindepth 1 -maxdepth 1 -type d ! -name archive -exec basename {} \; | sort
CLI + 文件系统合并去重,字母序处理。
3. 逐项检查
openspec status --change "<name>" --json
# 读 openspec/changes/<name>/tasks.md;扫 specs/**
记录:任务完成度、artifact、插件 id、可修复异常、skipReason。
常用原因:任务未完成:a/b · 缺少 tasks.md · artifact 未完成:proposal/specs/tasks · design 可选,已继续 · header 不匹配… · 插件前缀… · 归档失败:…
4. 预检分类
- ready:门禁全过
- repair-required:任务完成但有可修异常
- skipped:未完成 / 不可修
可自动修复(最多 2 轮,每轮后 strict 复验):
- 插件 specs 缺前缀 → 安全重命名
- MODIFIED header 不匹配 → 对齐主规范文本;确属新增且主规范无同名 → 改
ADDED - REMOVED 主规范已无该条且无有效新增语义 → 删除空 REMOVED 块
- CLI 任务数 ≠ tasks.md 但 tasks 已全部完成 + strict 通过 → 记录差异并继续
- design 缺失/ready → 不修复,直接可选放行
禁止:改 tasks 勾选、覆盖用户未提交冲突文件、删除有效需求以混过校验。
5. 归档
openspec archive -y "<name>"
- 用
-y;默认不用--skip-specs/--no-validate - 确认目录已迁至
openspec/changes/archive/YYYY-MM-DD-<name>/ - 单条失败记原因,继续下一条
6. 报告
**自动归档结果**
扫描到 N 个活跃变更,自动修复 A 个,成功归档 B 个,跳过 C 个。
自动修复:
- `name`:动作摘要,复验通过
成功归档:
- `name` → `openspec/changes/archive/YYYY-MM-DD-name/`
未归档:
- `name`:原因
无任何可归档项时写明「本次没有归档任何变更」。环境错误示例:未找到 OpenSpec CLI。
7. 轻量验证(可选)
openspec list --json
openspec validate --all
validate --all 因其他未完成变更失败时,勿归咎本次归档,注明范围即可。
边界速查
| 情况 | 处理 |
|---|---|
| 无活跃变更 | 报告即可,不报错 |
| 仅未完成 | 列原因,不归档 |
| 已在 archive/ | 不扫描 |
| 缺 design / design=ready | 归档,记「design 可选」 |
| 工作区已有本地改动 | 可继续;不动无关文件;待归档目录有改动时先提示 |
| 归档产生 diff | 预期结果,不自动 commit |
Signals
- GitHub stars
- 153
- Forks
- 29
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
lina-openspec-archive-changes- Source
- github.com/linaproai/linapro