@flyin-ai/alloy 0.2.0-beta.0 → 0.2.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/alloy/apply.md +222 -430
- package/commands/alloy/archive.md +156 -132
- package/commands/alloy/discard.md +26 -11
- package/commands/alloy/finish.md +212 -116
- package/commands/alloy/fix.md +103 -258
- package/commands/alloy/plan.md +204 -301
- package/commands/alloy/references/apply-precheck.md +21 -0
- package/commands/alloy/references/apply-rationalizations.md +18 -0
- package/commands/alloy/references/apply-subagent-commit.md +49 -0
- package/commands/alloy/references/apply-worktree.md +130 -0
- package/commands/alloy/references/archive-rationalizations.md +16 -0
- package/commands/alloy/references/archive-worktree-cleanup.md +94 -0
- package/commands/alloy/references/artifact-hash-commit.md +49 -0
- package/commands/alloy/references/branch-naming.md +65 -0
- package/commands/alloy/references/branch-validation.md +36 -0
- package/commands/alloy/references/fix-precommit-check.md +58 -0
- package/commands/alloy/references/interaction-style.md +34 -1
- package/commands/alloy/references/main-branch-detection.md +3 -6
- package/commands/alloy/references/phase-downgrade-path.md +27 -0
- package/commands/alloy/references/plan-rollback.md +84 -0
- package/commands/alloy/references/spec-sync.md +62 -0
- package/commands/alloy/references/start-rationalizations.md +18 -0
- package/commands/alloy/start.md +189 -227
- package/dist/cli/commands/completion.js +13 -2
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/internal/artifact.d.ts +7 -0
- package/dist/cli/commands/internal/artifact.js +70 -0
- package/dist/cli/commands/internal/artifact.js.map +1 -0
- package/dist/cli/commands/internal/guard.js +204 -2
- package/dist/cli/commands/internal/guard.js.map +1 -1
- package/dist/cli/commands/internal/progress.d.ts +10 -0
- package/dist/cli/commands/internal/progress.js +70 -0
- package/dist/cli/commands/internal/progress.js.map +1 -0
- package/dist/cli/commands/internal/spec-audit.d.ts +42 -0
- package/dist/cli/commands/internal/spec-audit.js +363 -0
- package/dist/cli/commands/internal/spec-audit.js.map +1 -0
- package/dist/cli/commands/internal/state.js +4 -0
- package/dist/cli/commands/internal/state.js.map +1 -1
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# plan-rollback.md
|
|
2
|
+
|
|
3
|
+
plan 阶段的制品回溯清理——轻量修正和需求变更两条路径。
|
|
4
|
+
|
|
5
|
+
## 轻量修正(措辞/格式,不改变功能边界)
|
|
6
|
+
|
|
7
|
+
**判断规则:** 只有用户明确说"措辞/格式调整"才走此路径。用户主动提出"加入/删除/修改功能"= 需求变更,**禁止使用 `alloy _artifact reset`**,必须走下面的回溯路径。不确定时默认需求变更。
|
|
8
|
+
|
|
9
|
+
使用 `alloy _artifact reset` 一步完成 hash 清除 + 文件删除:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
alloy _artifact reset openspec/changes/<name> <artifact>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
该命令自动:
|
|
16
|
+
1. 清除 `.alloy.yaml` 中该制品的 hash 记录
|
|
17
|
+
2. 删除制品文件(specs 目录递归删除)
|
|
18
|
+
|
|
19
|
+
然后调用 `/opsx:continue` 重新生成 → 审查 → 重新锁定。下游已锁定制品保持不变。
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
git add openspec/changes/<name>/
|
|
23
|
+
git commit -m "chore(<name>): 轻量修正——清除 <artifact>,准备重新生成"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 需求变更回溯清理(功能增删、行为变更)
|
|
27
|
+
|
|
28
|
+
删除所有 plan 制品(保留 draft.md),重置 records 和 phase_timings:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 1. 打 snapshot tag(task #15)——回溯前留恢复入口
|
|
32
|
+
# 不可逆删除前必须留 git tag,事后用户可 git checkout <tag> 完整恢复 plan 制品
|
|
33
|
+
TS=$(date +%Y%m%d-%H%M%S)
|
|
34
|
+
SNAPSHOT_TAG="rollback-<name>-${TS}"
|
|
35
|
+
git tag "$SNAPSHOT_TAG"
|
|
36
|
+
echo "已打 snapshot tag: $SNAPSHOT_TAG(事后恢复:git checkout $SNAPSHOT_TAG -- openspec/changes/<name>/)"
|
|
37
|
+
|
|
38
|
+
# 2. 删除 plan 制品文件(保留 draft.md)
|
|
39
|
+
rm -f openspec/changes/<name>/proposal.md
|
|
40
|
+
rm -f openspec/changes/<name>/design.md
|
|
41
|
+
rm -f openspec/changes/<name>/tasks.md
|
|
42
|
+
rm -f openspec/changes/<name>/plans.md
|
|
43
|
+
rm -rf openspec/changes/<name>/specs/
|
|
44
|
+
|
|
45
|
+
# 3. 清理 records(只保留 draft)
|
|
46
|
+
DRAFT_RECORD=$(alloy _state read openspec/changes/<name> records | python3 -c "
|
|
47
|
+
import sys,json
|
|
48
|
+
content = sys.stdin.read().strip()
|
|
49
|
+
records = json.loads(content) if content and content != 'null' else []
|
|
50
|
+
draft = [r for r in records if r.get('artifact') == 'draft']
|
|
51
|
+
print(json.dumps(draft))
|
|
52
|
+
")
|
|
53
|
+
alloy _state write openspec/changes/<name> records "$DRAFT_RECORD"
|
|
54
|
+
|
|
55
|
+
# 4. 清理 phase_timings
|
|
56
|
+
# ⚠️ 此处是 phase_timings 唯一允许 _state write 的场景:回溯需要删除 key + 覆盖值,merge 语义不支持
|
|
57
|
+
TIMINGS=$(alloy _state read openspec/changes/<name> phase_timings 2>/dev/null || echo "{}")
|
|
58
|
+
echo "$TIMINGS" | python3 -c "
|
|
59
|
+
import sys,json
|
|
60
|
+
content = sys.stdin.read().strip()
|
|
61
|
+
d = json.loads(content) if content and content != 'null' else {}
|
|
62
|
+
for k in ['plan','apply','archive','finish']:
|
|
63
|
+
d.pop(k, None)
|
|
64
|
+
if 'start' in d:
|
|
65
|
+
d['start']['completed_at'] = None
|
|
66
|
+
print(json.dumps(d))
|
|
67
|
+
" | while read -r val; do alloy _state write openspec/changes/<name> phase_timings "$val"; done
|
|
68
|
+
|
|
69
|
+
git add openspec/changes/<name>/
|
|
70
|
+
git commit -m "chore(<name>): 回溯——清理 plan 制品,回到 brainstorming"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
→ 制品已清理(仅保留 draft),records/phase_timings 已重置
|
|
75
|
+
→ 请运行 /alloy:start <name> 重新走需求确认流程
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## apply 阶段的需求变更
|
|
79
|
+
|
|
80
|
+
apply 阶段的需求变更闸门见 apply.md——以 tasks.md checkbox 状态判断:
|
|
81
|
+
- 未编码(全部 unchecked)→ 清理 plan 制品 → 回到 brainstorming(使用上面的回溯清理步骤)
|
|
82
|
+
- 已编码(有 [x])→ 拒绝回溯,开新 change
|
|
83
|
+
|
|
84
|
+
apply 的 verify/retrospective 验证"代码是否匹配规格",发现问题修正代码,不改变需求/设计。
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Spec-Sync:Spec/Skill 对账工作流
|
|
2
|
+
|
|
3
|
+
所有 alloy 阶段命令共享的 spec-skill 对账工作流。修改 `commands/alloy/*.md` 或 `src/` 后触发。
|
|
4
|
+
|
|
5
|
+
## 1. 自动检测
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
alloy _spec-audit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
输出差异报告:
|
|
12
|
+
- `✓ <name>: spec 与 skill 一致` — 无需操作
|
|
13
|
+
- `✗ <name>: spec 与 skill 不一致` — 需要同步
|
|
14
|
+
- `⚠ <name>: 未声明 spec 锚点,跳过对账` — 缺少 `spec` frontmatter
|
|
15
|
+
- `✗ <name>: 对应 spec 文件 <path> 不存在` — spec 路径有误
|
|
16
|
+
|
|
17
|
+
## 2. 定位变更源
|
|
18
|
+
|
|
19
|
+
确认哪个 skill 文件修改了 behaviors:
|
|
20
|
+
- 新增/删除了 🔴 STOP → `stops` 或 `hard_stops` 变化
|
|
21
|
+
- 变更了外部调用 → `external_calls` 变化
|
|
22
|
+
- 产物列表更新 → `artifacts` 变化
|
|
23
|
+
- 阶段目标变更 → `transitions_to` 变化
|
|
24
|
+
|
|
25
|
+
## 3. 更新 spec 正文
|
|
26
|
+
|
|
27
|
+
确保 spec 正文描述与 skill 一致。例如:
|
|
28
|
+
- skill 新增了 🔴 STOP → spec 正文应有对应的确认点描述
|
|
29
|
+
- skill 新增了 external_call → spec 正文应有该技能的调用说明
|
|
30
|
+
- skill 修改了 transitions_to → spec 正文的目标阶段描述应更新
|
|
31
|
+
|
|
32
|
+
## 4. 更新 spec frontmatter
|
|
33
|
+
|
|
34
|
+
方式一:手动修改 spec 文件的 `behaviors` frontmatter
|
|
35
|
+
|
|
36
|
+
方式二:自动更新(仅修改 frontmatter,不修改正文)
|
|
37
|
+
```bash
|
|
38
|
+
alloy _spec-audit --fix
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 5. 验证
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
alloy _spec-audit
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
确认所有字段输出 `✓`。
|
|
48
|
+
|
|
49
|
+
## 6. 提交
|
|
50
|
+
|
|
51
|
+
skill 变更和 spec 变更在同一 commit 中:
|
|
52
|
+
```bash
|
|
53
|
+
git add commands/alloy/<skill>.md docs/specification/01-product-spec/<spec>.md
|
|
54
|
+
git commit -m "docs(<name>): 同步 spec 与 skill behaviors"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 注意事项
|
|
58
|
+
|
|
59
|
+
- **对账方向是 skill → spec**(skill 是真相源)
|
|
60
|
+
- 只改 spec 匹配 skill,不反向修改 skill
|
|
61
|
+
- 正文同步是人工判断,frontmatter 同步可自动化
|
|
62
|
+
- `--fix` 只修改 frontmatter,不修改 spec 正文——正文必须手动同步
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# start Red Flags 完整表(第三层防御——任一借口出现即 STOP)
|
|
2
|
+
|
|
3
|
+
主文件保留 5 条核心,完整 12 条在此。
|
|
4
|
+
|
|
5
|
+
| 借口 | 现实 |
|
|
6
|
+
|------|------|
|
|
7
|
+
| "不用建分支了,就在 main 上干吧" | ⛔ HARD_STOP:主分支污染不可逆。建分支只需 2 秒。违反字面 = 违反精神:哪怕"只是先建个目录后面再切"也算(Iron Law 第一层)。 |
|
|
8
|
+
| "分支创建是可选步骤" / "用户没提分支" | 分支创建是硬性闸门——没有验证,后续步骤全部禁止。闸门默认生效,不需要用户主动请求。 |
|
|
9
|
+
| "项目简单/一个人开发,不需要分支" | 分支保护的是 discard 安全性,不是团队协作。简单项目一样需要——否则 discard 丢失主分支无关变更。 |
|
|
10
|
+
| "不用 brainstorming,直接写代码" | brainstorming 不可跳过。跳过需求设计 = 规格和代码分叉的起点。 |
|
|
11
|
+
| "brainstorming 完成了,写 spec 文件吧" | Alloy start 的产出是 draft.md,不是 docs/superpowers/specs/。brainstorming 完成后直接输出方案,由 Alloy 流程生成 draft.md。 |
|
|
12
|
+
| "start 完成了,直接进 plan" / "用户没回复,我先继续" | ⛔ HARD_STOP:start 完成后绝不自动进入 plan。沉默 ≠ 授权(Iron Law 第二层)。替用户做阶段转换 = 剥夺审查机会。 |
|
|
13
|
+
| "draft.md 讨论过了,直接 commit" | brainstorming 讨论的是概念,draft.md 是最终文本。必须展示完整内容,等用户 USER_GATE 确认。 |
|
|
14
|
+
| "openspec/changes/<name>/ 已经有了,直接复用" | ⛔ PRECONDITION_FAIL:目录已存在 = #12 冲突。USER_GATE 让用户决策(改名 / 接续 / 中止),禁 agent 自动复用——可能覆盖用户既有工作。 |
|
|
15
|
+
| "/opsx:new 失败了,git mkdir 凑合一下" | ⛔ PRECONDITION_FAIL:opsx:new 是 schema 闸门,手工 mkdir 绕过制品 DAG 验证——退出 skill 引导用户排查。 |
|
|
16
|
+
| "change name 还没确认,先把分支建了" | ⛔ HARD_STOP:change name 未确认前禁继续步骤 2-9。违反字面 = 违反精神:哪怕"反正 name 大概就这个"。 |
|
|
17
|
+
| "git init 后 reset --hard 一下,把环境清干净" | ⛔ HARD_STOP:git 初始化失败禁 reset --hard / clean -fd / checkout .(§3.5.1 git 自救禁令)。退出 skill 让用户处理。 |
|
|
18
|
+
| "用户没明确选 (a) 但意思就是进 plan,加载吧" | 沉默 ≠ 授权。USER_GATE 必须明确选择 (a),不接受推断(Iron Law 第二层)。 |
|