@chenmk/superflow 0.1.0
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/INSTALL.en.md +106 -0
- package/INSTALL.md +664 -0
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/README.zh-CN.md +117 -0
- package/assets/context-templates/business-rules.md +98 -0
- package/assets/context-templates/decisions.md +153 -0
- package/assets/context-templates/external-systems.md +166 -0
- package/assets/context-templates/incidents.md +89 -0
- package/assets/manifest.json +53 -0
- package/assets/prompts/superflow-archive.md +9 -0
- package/assets/prompts/superflow-clarify.md +10 -0
- package/assets/prompts/superflow-design.md +10 -0
- package/assets/prompts/superflow-docs.md +10 -0
- package/assets/prompts/superflow-implement.md +10 -0
- package/assets/prompts/superflow-pipeline.md +13 -0
- package/assets/prompts/superflow-verify.md +10 -0
- package/assets/rules/superflow-phase-guard.md +50 -0
- package/assets/scripts/claude-auto-backup-hook.sh +313 -0
- package/assets/scripts/codex-auto-backup-hook.sh +361 -0
- package/assets/scripts/install-sql-pre-commit.sh +44 -0
- package/assets/scripts/superflow-contract-hooks.sh +744 -0
- package/assets/scripts/superflow-delivery-check.sh +315 -0
- package/assets/scripts/superflow-dependency-update-hook.sh +161 -0
- package/assets/scripts/superflow-enforce-hook.sh +70 -0
- package/assets/scripts/superflow-hook-guard.sh +132 -0
- package/assets/scripts/superflow-integration-evidence-hook.sh +80 -0
- package/assets/scripts/superflow-sql-sync-hook.py +950 -0
- package/assets/scripts/superflow-test-report-lint.py +433 -0
- package/assets/scripts/superflow-verify-integration.sh +90 -0
- package/assets/scripts/sync-settings-json.py +52 -0
- package/assets/skills/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills/openspec-explore/SKILL.md +288 -0
- package/assets/skills/openspec-propose/SKILL.md +110 -0
- package/assets/skills/superflow-archive/SKILL.md +61 -0
- package/assets/skills/superflow-clarify/SKILL.md +146 -0
- package/assets/skills/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills/superflow-design/SKILL.md +83 -0
- package/assets/skills/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills/superflow-docs/SKILL.md +316 -0
- package/assets/skills/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills/superflow-implement/SKILL.md +461 -0
- package/assets/skills/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills/superflow-tweak/SKILL.md +46 -0
- package/assets/skills/superflow-verify/SKILL.md +112 -0
- package/assets/skills-en/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills-en/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills-en/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills-en/openspec-explore/SKILL.md +288 -0
- package/assets/skills-en/openspec-propose/SKILL.md +110 -0
- package/assets/skills-en/superflow-archive/SKILL.md +61 -0
- package/assets/skills-en/superflow-clarify/SKILL.md +146 -0
- package/assets/skills-en/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-design/SKILL.md +83 -0
- package/assets/skills-en/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-docs/SKILL.md +316 -0
- package/assets/skills-en/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills-en/superflow-implement/SKILL.md +461 -0
- package/assets/skills-en/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills-en/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills-en/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills-en/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills-en/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills-en/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills-en/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills-en/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills-en/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills-en/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills-en/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills-en/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills-en/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills-en/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills-en/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills-en/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills-en/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills-en/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills-en/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills-en/superflow-tweak/SKILL.md +46 -0
- package/assets/skills-en/superflow-verify/SKILL.md +112 -0
- package/dist/cli/index.js +186 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/archive.js +6 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/clarify.js +6 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/design.js +6 -0
- package/dist/commands/design.js.map +1 -0
- package/dist/commands/docs.js +6 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/doctor.js +473 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/implement.js +6 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.js +471 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pipeline.js +6 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/scan.js +59 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.js +173 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.js +213 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.js +187 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.js +6 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/assets.js +27 -0
- package/dist/core/assets.js.map +1 -0
- package/dist/core/context.js +100 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/dependencies.js +146 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/detect.js +71 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/i18n.js +103 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/integrity.js +46 -0
- package/dist/core/integrity.js.map +1 -0
- package/dist/core/manifest.js +18 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/prompts.js +20 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/rules.js +17 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/scripts.js +40 -0
- package/dist/core/scripts.js.map +1 -0
- package/dist/core/skill-check.js +31 -0
- package/dist/core/skill-check.js.map +1 -0
- package/dist/core/skills.js +56 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/state.js +43 -0
- package/dist/core/state.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/path.js +11 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.js +29 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
usage() {
|
|
5
|
+
cat <<'USAGE'
|
|
6
|
+
Usage:
|
|
7
|
+
superflow-status.sh <repo-root> [--json]
|
|
8
|
+
|
|
9
|
+
List active SDD changes under a repository.
|
|
10
|
+
USAGE
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
die() {
|
|
14
|
+
printf 'superflow-status: %s\n' "$*" >&2
|
|
15
|
+
exit 1
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
repo="${1:-}"
|
|
19
|
+
mode="${2:-}"
|
|
20
|
+
[[ -n "$repo" && "$repo" != "-h" && "$repo" != "--help" ]] || {
|
|
21
|
+
usage
|
|
22
|
+
exit 0
|
|
23
|
+
}
|
|
24
|
+
[[ -d "$repo" ]] || die "repo root not found: $repo"
|
|
25
|
+
[[ -z "$mode" || "$mode" == "--json" ]] || die "unknown option: $mode"
|
|
26
|
+
|
|
27
|
+
repo="$(cd "$repo" && pwd)"
|
|
28
|
+
state_script="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/superflow-state.sh"
|
|
29
|
+
shopt -s globstar nullglob 2>/dev/null || true
|
|
30
|
+
|
|
31
|
+
state_value() {
|
|
32
|
+
local file="$1"
|
|
33
|
+
local key="$2"
|
|
34
|
+
awk -F':' -v k="$key" '
|
|
35
|
+
$1 == k {
|
|
36
|
+
value = $0
|
|
37
|
+
sub("^[^:]*:[[:space:]]*", "", value)
|
|
38
|
+
gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
|
|
39
|
+
print value
|
|
40
|
+
found=1
|
|
41
|
+
}
|
|
42
|
+
END { exit found ? 0 : 1 }
|
|
43
|
+
' "$file" 2>/dev/null || true
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
count_tasks() {
|
|
47
|
+
local dir="$1"
|
|
48
|
+
local total done
|
|
49
|
+
total="$(grep -RHE '^[[:space:]]*-[[:space:]]+\[[ xX]\]' "$dir"/*.md "$dir"/**/*.md 2>/dev/null | wc -l | tr -d ' ')"
|
|
50
|
+
done="$(grep -RHE '^[[:space:]]*-[[:space:]]+\[[xX]\]' "$dir"/*.md "$dir"/**/*.md 2>/dev/null | wc -l | tr -d ' ')"
|
|
51
|
+
printf '%s/%s' "$done" "$total"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
task_total() {
|
|
55
|
+
printf '%s' "$1" | awk -F/ '{print $2}'
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
task_done() {
|
|
59
|
+
printf '%s' "$1" | awk -F/ '{print $1}'
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
next_reason() {
|
|
63
|
+
local phase="$1"
|
|
64
|
+
local verify_result="$2"
|
|
65
|
+
local tasks="$3"
|
|
66
|
+
local total done remaining
|
|
67
|
+
total="$(task_total "$tasks")"
|
|
68
|
+
done="$(task_done "$tasks")"
|
|
69
|
+
remaining=$((total - done))
|
|
70
|
+
[[ "$verify_result" == "fail" ]] && {
|
|
71
|
+
printf '最近一次 verify 失败,先修复验证报告中的失败项。'
|
|
72
|
+
return
|
|
73
|
+
}
|
|
74
|
+
case "$phase" in
|
|
75
|
+
docs) printf '当前处于 docs 阶段,继续生成或补齐 OpenSpec/SDD 合同文档。' ;;
|
|
76
|
+
design) printf '当前处于 design 阶段,继续生成 Superpowers 源码级技术详设。' ;;
|
|
77
|
+
implement)
|
|
78
|
+
if [[ "$remaining" -gt 0 ]]; then
|
|
79
|
+
printf '当前处于 implement 阶段,还有 %s 个任务未完成。' "$remaining"
|
|
80
|
+
else
|
|
81
|
+
printf 'implement 任务已完成,可以进入 verify 前检查。'
|
|
82
|
+
fi
|
|
83
|
+
;;
|
|
84
|
+
verify) printf '当前处于 verify 阶段,补齐真实验证证据并运行验收门禁。' ;;
|
|
85
|
+
archive) printf 'verify 已通过后进入 archive,等待明确归档确认。' ;;
|
|
86
|
+
*) printf '当前 phase 未知,先检查 .sdd/state.yaml。' ;;
|
|
87
|
+
esac
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
print_risks() {
|
|
91
|
+
local dir="$1"
|
|
92
|
+
local workflow="$2"
|
|
93
|
+
local phase="$3"
|
|
94
|
+
local review_mode="$4"
|
|
95
|
+
local verify_result="$5"
|
|
96
|
+
local tasks="$6"
|
|
97
|
+
local total done
|
|
98
|
+
total="$(task_total "$tasks")"
|
|
99
|
+
done="$(task_done "$tasks")"
|
|
100
|
+
[[ "$phase" == "" ]] && printf ' WARNING UNKNOWN_PHASE: phase 缺失或未知。\n'
|
|
101
|
+
if [[ "$total" -eq 0 || ! -f "$dir/tasks.md" ]]; then
|
|
102
|
+
printf ' WARNING TASKS_MISSING: 缺少 tasks.md 或任务清单为空。\n'
|
|
103
|
+
elif [[ "$phase" == "implement" && "$done" -lt "$total" ]]; then
|
|
104
|
+
printf ' WARNING TASKS_INCOMPLETE: 仍有 %s 个任务未完成。\n' "$((total - done))"
|
|
105
|
+
fi
|
|
106
|
+
if [[ "${workflow:-full}" == "full" && "${review_mode:-null}" == "null" ]]; then
|
|
107
|
+
printf ' WARNING REVIEW_MODE_MISSING: full workflow 尚未选择 review_mode。\n'
|
|
108
|
+
fi
|
|
109
|
+
if [[ "$verify_result" == "fail" ]]; then
|
|
110
|
+
printf ' ERROR VERIFY_FAILED: 最近一次 verify 失败。\n'
|
|
111
|
+
elif [[ "$phase" == "verify" && ! -f "$dir/test-report.md" ]]; then
|
|
112
|
+
printf ' WARNING TEST_REPORT_MISSING: verify 阶段缺少 test-report.md。\n'
|
|
113
|
+
fi
|
|
114
|
+
for artifact in proposal.md design.md tests.md; do
|
|
115
|
+
[[ -f "$dir/$artifact" ]] || printf ' INFO ARTIFACT_MISSING: 缺少 %s。\n' "$artifact"
|
|
116
|
+
done
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
tmp="$(mktemp)"
|
|
120
|
+
trap 'rm -f "$tmp"' EXIT
|
|
121
|
+
|
|
122
|
+
find "$repo" -path '*/.sdd/state.yaml' -type f 2>/dev/null | sort > "$tmp"
|
|
123
|
+
|
|
124
|
+
if [[ "$mode" == "--json" ]]; then
|
|
125
|
+
printf '{\n "changes": [\n'
|
|
126
|
+
first=1
|
|
127
|
+
while IFS= read -r state; do
|
|
128
|
+
dir="${state%/.sdd/state.yaml}"
|
|
129
|
+
archived="$(state_value "$state" archived)"
|
|
130
|
+
phase="$(state_value "$state" phase)"
|
|
131
|
+
[[ "$archived" == "true" || "$phase" == "done" ]] && continue
|
|
132
|
+
workflow="$(state_value "$state" workflow)"
|
|
133
|
+
build_mode="$(state_value "$state" build_mode)"
|
|
134
|
+
review_mode="$(state_value "$state" review_mode)"
|
|
135
|
+
verify_mode="$(state_value "$state" verify_mode)"
|
|
136
|
+
verify_result="$(state_value "$state" verify_result)"
|
|
137
|
+
next="$("$state_script" next "$dir" 2>/dev/null | tr '\n' ';' || true)"
|
|
138
|
+
tasks="$(count_tasks "$dir")"
|
|
139
|
+
reason="$(next_reason "$phase" "$verify_result" "$tasks")"
|
|
140
|
+
[[ "$first" -eq 0 ]] && printf ',\n'
|
|
141
|
+
first=0
|
|
142
|
+
printf ' {"path": "%s", "workflow": "%s", "phase": "%s", "buildMode": "%s", "reviewMode": "%s", "verifyMode": "%s", "verifyResult": "%s", "tasks": "%s", "next": "%s", "reason": "%s"}' \
|
|
143
|
+
"${dir#"$repo"/}" "$workflow" "$phase" "$build_mode" "$review_mode" "$verify_mode" "$verify_result" "$tasks" "$next" "$reason"
|
|
144
|
+
done < "$tmp"
|
|
145
|
+
printf '\n ]\n}\n'
|
|
146
|
+
exit 0
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
printed=0
|
|
150
|
+
while IFS= read -r state; do
|
|
151
|
+
dir="${state%/.sdd/state.yaml}"
|
|
152
|
+
archived="$(state_value "$state" archived)"
|
|
153
|
+
phase="$(state_value "$state" phase)"
|
|
154
|
+
[[ "$archived" == "true" || "$phase" == "done" ]] && continue
|
|
155
|
+
workflow="$(state_value "$state" workflow)"
|
|
156
|
+
build_mode="$(state_value "$state" build_mode)"
|
|
157
|
+
review_mode="$(state_value "$state" review_mode)"
|
|
158
|
+
verify_mode="$(state_value "$state" verify_mode)"
|
|
159
|
+
verify_result="$(state_value "$state" verify_result)"
|
|
160
|
+
tasks="$(count_tasks "$dir")"
|
|
161
|
+
printed=1
|
|
162
|
+
printf '%s\n' "- ${dir#"$repo"/}"
|
|
163
|
+
printf ' phase: %s | workflow: %s | build_mode: %s | review_mode: %s | verify_mode: %s | verify_result: %s | tasks: %s\n' \
|
|
164
|
+
"$phase" "$workflow" "$build_mode" "$review_mode" "$verify_mode" "$verify_result" "$tasks"
|
|
165
|
+
printf ' reason: %s\n' "$(next_reason "$phase" "$verify_result" "$tasks")"
|
|
166
|
+
print_risks "$dir" "$workflow" "$phase" "$review_mode" "$verify_result" "$tasks"
|
|
167
|
+
"$state_script" next "$dir" | sed 's/^/ /'
|
|
168
|
+
done < "$tmp"
|
|
169
|
+
|
|
170
|
+
if [[ "$printed" -eq 0 ]]; then
|
|
171
|
+
printf 'No active SuperBridge Flow changes.\n'
|
|
172
|
+
fi
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
usage() {
|
|
5
|
+
cat <<'USAGE'
|
|
6
|
+
Usage:
|
|
7
|
+
superflow-yaml-validate.sh <change-dir>
|
|
8
|
+
|
|
9
|
+
Validate <change-dir>/.sdd/state.yaml structure, enums, known fields, and
|
|
10
|
+
referenced paths.
|
|
11
|
+
USAGE
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
die() {
|
|
15
|
+
printf 'superflow-yaml-validate: %s\n' "$*" >&2
|
|
16
|
+
exit 1
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
CHANGE_DIR="${1:-}"
|
|
20
|
+
[[ -n "$CHANGE_DIR" && "$CHANGE_DIR" != "-h" && "$CHANGE_DIR" != "--help" ]] || {
|
|
21
|
+
usage
|
|
22
|
+
exit 0
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
[[ -d "$CHANGE_DIR" ]] || die "change dir not found: $CHANGE_DIR"
|
|
26
|
+
CHANGE_DIR="$(cd "$CHANGE_DIR" && pwd)"
|
|
27
|
+
STATE="$CHANGE_DIR/.sdd/state.yaml"
|
|
28
|
+
[[ -f "$STATE" ]] || die "state not found: $STATE"
|
|
29
|
+
|
|
30
|
+
ERRORS=0
|
|
31
|
+
WARNINGS=0
|
|
32
|
+
|
|
33
|
+
fail() {
|
|
34
|
+
printf 'FAIL %s\n' "$*" >&2
|
|
35
|
+
ERRORS=$((ERRORS + 1))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
warn() {
|
|
39
|
+
printf 'WARN %s\n' "$*" >&2
|
|
40
|
+
WARNINGS=$((WARNINGS + 1))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
value_of() {
|
|
44
|
+
local key="$1"
|
|
45
|
+
awk -F':' -v k="$key" '
|
|
46
|
+
$1 == k {
|
|
47
|
+
value = $0
|
|
48
|
+
sub("^[^:]*:[[:space:]]*", "", value)
|
|
49
|
+
sub("[[:space:]]+#.*$", "", value)
|
|
50
|
+
gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
|
|
51
|
+
print value
|
|
52
|
+
found=1
|
|
53
|
+
}
|
|
54
|
+
END { exit found ? 0 : 1 }
|
|
55
|
+
' "$STATE"
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
require_field() {
|
|
59
|
+
local key="$1"
|
|
60
|
+
grep -q "^${key}:" "$STATE" || fail "missing required field '$key'"
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
validate_enum() {
|
|
64
|
+
local key="$1"
|
|
65
|
+
local allowed="$2"
|
|
66
|
+
local value
|
|
67
|
+
value="$(value_of "$key" 2>/dev/null || true)"
|
|
68
|
+
[[ -z "$value" || "$value" == "null" ]] && return
|
|
69
|
+
for item in $allowed; do
|
|
70
|
+
[[ "$value" == "$item" ]] && return
|
|
71
|
+
done
|
|
72
|
+
fail "$key='$value' is invalid; expected one of: $allowed"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
validate_path_field() {
|
|
76
|
+
local key="$1"
|
|
77
|
+
local value
|
|
78
|
+
value="$(value_of "$key" 2>/dev/null || true)"
|
|
79
|
+
[[ -z "$value" || "$value" == "null" ]] && return
|
|
80
|
+
[[ -f "$CHANGE_DIR/$value" || -f "$value" ]] || fail "$key path does not exist: $value"
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
REQUIRED_FIELDS="workflow phase canonical_spec build_mode tdd_mode review_mode isolation verify_mode auto_transition verify_result verification_report branch_status archived handoff_context handoff_hash created_at updated_at"
|
|
84
|
+
for field in $REQUIRED_FIELDS; do
|
|
85
|
+
require_field "$field"
|
|
86
|
+
done
|
|
87
|
+
|
|
88
|
+
validate_enum workflow "full hotfix tweak"
|
|
89
|
+
validate_enum phase "docs design implement verify archive done"
|
|
90
|
+
validate_enum build_mode "subagent-driven-development executing-plans team-prompt direct"
|
|
91
|
+
validate_enum build_pause "plan-ready"
|
|
92
|
+
validate_enum subagent_dispatch "confirmed"
|
|
93
|
+
validate_enum tdd_mode "tdd direct"
|
|
94
|
+
validate_enum review_mode "off standard thorough"
|
|
95
|
+
validate_enum isolation "branch worktree"
|
|
96
|
+
validate_enum verify_mode "light full"
|
|
97
|
+
validate_enum auto_transition "true false"
|
|
98
|
+
validate_enum verify_result "pending pass fail"
|
|
99
|
+
validate_enum branch_status "pending handled"
|
|
100
|
+
validate_enum archived "true false"
|
|
101
|
+
validate_enum direct_override "true false"
|
|
102
|
+
validate_enum context_compression "off beta"
|
|
103
|
+
|
|
104
|
+
handoff_hash="$(value_of handoff_hash 2>/dev/null || true)"
|
|
105
|
+
if [[ -n "$handoff_hash" && "$handoff_hash" != "null" && ! "$handoff_hash" =~ ^[a-f0-9]{64}$ ]]; then
|
|
106
|
+
fail "handoff_hash is not a sha256 hex digest: $handoff_hash"
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
validate_path_field handoff_context
|
|
110
|
+
validate_path_field implementation_prompt
|
|
111
|
+
validate_path_field verification_report
|
|
112
|
+
validate_path_field design_doc
|
|
113
|
+
validate_path_field technical_design
|
|
114
|
+
validate_path_field plan
|
|
115
|
+
|
|
116
|
+
KNOWN="workflow phase canonical_spec context_compression design_doc technical_design plan base_ref build_mode build_pause subagent_dispatch tdd_mode review_mode isolation verify_mode auto_transition verify_result verification_report branch_status archived direct_override build_command verify_command handoff_context handoff_hash superpower_strategy implementation_prompt worktree_ports created_at verified_at updated_at"
|
|
117
|
+
while IFS= read -r line; do
|
|
118
|
+
[[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue
|
|
119
|
+
[[ "$line" == *:* ]] || {
|
|
120
|
+
fail "malformed state line without ':' -> $line"
|
|
121
|
+
continue
|
|
122
|
+
}
|
|
123
|
+
IFS=: read -r key _ <<< "$line"
|
|
124
|
+
key="$(printf '%s' "$key" | tr -d '[:space:]')"
|
|
125
|
+
[[ -z "$key" ]] && continue
|
|
126
|
+
found=0
|
|
127
|
+
for known in $KNOWN; do
|
|
128
|
+
[[ "$key" == "$known" ]] && found=1 && break
|
|
129
|
+
done
|
|
130
|
+
[[ "$found" -eq 1 ]] || warn "unknown field '$key'"
|
|
131
|
+
done < "$STATE"
|
|
132
|
+
|
|
133
|
+
if [[ "$ERRORS" -gt 0 ]]; then
|
|
134
|
+
printf 'superflow state validation failed: %s error(s), %s warning(s)\n' "$ERRORS" "$WARNINGS" >&2
|
|
135
|
+
exit 1
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
printf 'superflow state validation passed: %s warning(s)\n' "$WARNINGS"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: superflow-table-impact-analysis
|
|
3
|
+
description: Use when an SDD/OpenSpec requirement, bug fix, sync task, migration, or test plan touches database tables, status fields, Mapper/XML queries, cross-repo shared data, or user-facing behavior driven by persisted fields.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SDD Table Impact Analysis
|
|
7
|
+
|
|
8
|
+
Use this skill before freezing design, writing implementation prompts, coding,
|
|
9
|
+
or accepting test reports for database-backed behavior.
|
|
10
|
+
|
|
11
|
+
## Core Rule
|
|
12
|
+
|
|
13
|
+
Do not start from the happy-path writer only. Start from every affected
|
|
14
|
+
`table.field`, then reverse-scan all code and business consumers before
|
|
15
|
+
declaring the feature complete.
|
|
16
|
+
|
|
17
|
+
Required impact table:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
表/字段 | 写入方 | 读取/过滤方 | 跨仓/外部消费方 | 真实入口 | 反向状态场景 | 验证证据
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Required semantic table for status/enum/sync/default behavior:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
真源字段 | 真源枚举 | 目标字段 | 目标枚举 | 消费方解释 | 业务依据 | 不确定项
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Procedure
|
|
30
|
+
|
|
31
|
+
1. List every affected table and field from docs, SQL, Mapper/XML, entity,
|
|
32
|
+
DTO, sync payload, logs, and DB samples.
|
|
33
|
+
2. For each field, search all references. Use understand-anything only as a
|
|
34
|
+
locator when available; if it is missing, stale, incomplete, or unavailable,
|
|
35
|
+
degrade to `rg`, source reading, Mapper/XML, SQL, configuration, log
|
|
36
|
+
templates, database table names, and sibling-repo search. Cover entities,
|
|
37
|
+
Mapper/XML, SQL, services, jobs, MQ listeners, controllers, external
|
|
38
|
+
adapters, sibling repos, SDK/DTOs, and frontend/applet endpoints.
|
|
39
|
+
3. Classify each reference:
|
|
40
|
+
writer, reader, filter, default-value logic, old-value retention, state
|
|
41
|
+
recovery, cross-repo sync, user-facing entry point.
|
|
42
|
+
4. Add reverse-state scenarios:
|
|
43
|
+
offline -> online, disabled -> enabled, deleted -> restored, missing ->
|
|
44
|
+
reappearing, old invalid value -> valid when upstream omits a field.
|
|
45
|
+
5. For status, enum, sync, derived, default, or compatibility behavior, identify
|
|
46
|
+
the source-of-truth field and the consumer-facing meaning. Do not accept
|
|
47
|
+
non-null, present, successful, or "has any value" as correct. Reject
|
|
48
|
+
fallback/default/keep-old-value/null-conversion/alternative-field logic
|
|
49
|
+
unless explicitly approved by the requirement or owner. Approved
|
|
50
|
+
compatibility must document:
|
|
51
|
+
`兜底触发条件 | 业务依据 | 会掩盖的异常 | 监控/告警/暴露方式 | 移除条件 | owner确认`.
|
|
52
|
+
6. Put the impact table and semantic table into `design.md`, `tests.md`,
|
|
53
|
+
`traceability-matrix.md`, implementation prompt, and `test-report.md`.
|
|
54
|
+
7. Verify at least one final business entry point, not only the sync task or
|
|
55
|
+
DB update. Examples: applet QR scan, start charge, payment/refund,
|
|
56
|
+
notification, callback, scheduled job, third-party query.
|
|
57
|
+
|
|
58
|
+
## Blockers
|
|
59
|
+
|
|
60
|
+
Mark the task `Blocked` when:
|
|
61
|
+
|
|
62
|
+
- a consumer or real entry point is unknown;
|
|
63
|
+
- only the writer/sync path is tested;
|
|
64
|
+
- only the unavailable direction is tested;
|
|
65
|
+
- a status field can retain an old invalid value;
|
|
66
|
+
- a status/enum/sync value is treated as correct only because it is non-null,
|
|
67
|
+
present, successful, or has any value;
|
|
68
|
+
- fallback/default/keep-old-value/null-conversion/alternative-field logic is
|
|
69
|
+
used without explicit business approval and exposure strategy;
|
|
70
|
+
- cross-repo consumers are not enumerated;
|
|
71
|
+
- `test-report.md` lacks the required impact table.
|
|
72
|
+
|
|
73
|
+
## Hook
|
|
74
|
+
|
|
75
|
+
`~/.codex/hooks/superflow-test-report-lint.py` enforces this for database/status
|
|
76
|
+
reports that claim pass or partial pass. A report that only says "sync
|
|
77
|
+
succeeded" without consumer-path evidence is blocked.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: superflow-tweak
|
|
3
|
+
description: Use when an SDD task is a tiny non-behavioral tweak such as wording, prompt, docs, config comments, or local process text and may use a lighter path unless runtime gates are involved.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SDD Tweak
|
|
7
|
+
|
|
8
|
+
Tweak is a preset workflow for small non-runtime changes. It must not weaken
|
|
9
|
+
SDD evidence for code, API, database, or integration behavior.
|
|
10
|
+
|
|
11
|
+
## Allowed Scope
|
|
12
|
+
|
|
13
|
+
Use tweak only for:
|
|
14
|
+
|
|
15
|
+
- Prompt wording
|
|
16
|
+
- SDD documentation wording
|
|
17
|
+
- Review checklist wording
|
|
18
|
+
- Non-runtime comments
|
|
19
|
+
- Local process text
|
|
20
|
+
|
|
21
|
+
Do not use tweak for Java/runtime code, API behavior, SQL, Mapper/XML, DB,
|
|
22
|
+
status/enum, SDK, cross-repo, frontend contract, or real integration changes.
|
|
23
|
+
|
|
24
|
+
## Procedure
|
|
25
|
+
|
|
26
|
+
1. Initialize state:
|
|
27
|
+
```bash
|
|
28
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh init <change-dir> tweak docs
|
|
29
|
+
```
|
|
30
|
+
2. Generate/update handoff so future sessions can recover exact context.
|
|
31
|
+
3. Set:
|
|
32
|
+
```bash
|
|
33
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set <change-dir> build_mode direct
|
|
34
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set <change-dir> isolation branch
|
|
35
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set <change-dir> tdd_mode direct
|
|
36
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh set <change-dir> review_mode off
|
|
37
|
+
```
|
|
38
|
+
4. Run `superflow-state.sh scale <change-dir>`. If it returns `full`, stop tweak and
|
|
39
|
+
upgrade to full SDD.
|
|
40
|
+
5. Verify with the relevant doc/template/script checks and run archive only
|
|
41
|
+
after user confirmation.
|
|
42
|
+
|
|
43
|
+
## Upgrade Conditions
|
|
44
|
+
|
|
45
|
+
Any runtime behavior, API, DB, SQL, hook, integration evidence, worktree
|
|
46
|
+
parallel coding, or user-facing behavior change upgrades this to full SDD.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: superflow-verify
|
|
3
|
+
description: Use when an SDD/OpenSpec change is ready for verification, test-report closure, code review, branch/worktree handling, or retry decisions after implementation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SDD Verify
|
|
7
|
+
|
|
8
|
+
Verification is a phase, not a final sentence. Use this skill after
|
|
9
|
+
implementation work claims completion and before archive or delivery.
|
|
10
|
+
|
|
11
|
+
## Entry Check
|
|
12
|
+
|
|
13
|
+
Run:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-yaml-validate.sh <change-dir>
|
|
17
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh recover <change-dir>
|
|
18
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh scale <change-dir>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If the change is still in `implement`, run:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-guard.sh <change-dir> implement --apply
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Do not verify from conversation memory. Reload `.sdd/handoff/sdd-context.md`,
|
|
28
|
+
`api.md`, `design.md`, `tasks.md`, `tests.md`, `sdd-quality-gate.md`, and
|
|
29
|
+
existing `test-report.md`.
|
|
30
|
+
|
|
31
|
+
## Verification Modes
|
|
32
|
+
|
|
33
|
+
Use `.sdd/state.yaml` `verify_mode` after `scale`.
|
|
34
|
+
|
|
35
|
+
`light` is allowed only when all are true:
|
|
36
|
+
|
|
37
|
+
- no API, DB, SQL, Mapper/XML, SDK, cross-repo, status/enum, payment, refund,
|
|
38
|
+
device, MQ, scheduler, or third-party contract change;
|
|
39
|
+
- task count and changed-file count stay within the scale threshold;
|
|
40
|
+
- no L3/L4 integration evidence is required by `tests.md` or quality gate.
|
|
41
|
+
|
|
42
|
+
`full` is required when any SDD hard gate is touched. Full verification must
|
|
43
|
+
prove the complete evidence chain: source/Mapper/XML, DB when needed, real
|
|
44
|
+
entry point, interface automation, logs, SQL sync, and consumer behavior.
|
|
45
|
+
|
|
46
|
+
## Required Superpowers
|
|
47
|
+
|
|
48
|
+
Immediately load and apply these Superpowers when available:
|
|
49
|
+
|
|
50
|
+
- `verification-before-completion` before claiming the work passes.
|
|
51
|
+
- `requesting-code-review` after local verification has evidence.
|
|
52
|
+
- `finishing-a-development-branch` before branch/worktree closeout.
|
|
53
|
+
|
|
54
|
+
If a required Superpower is unavailable, mark the verification `Blocked` and
|
|
55
|
+
ask the user to install or enable it. Do not replace it with ordinary prose.
|
|
56
|
+
|
|
57
|
+
## Failure Decision
|
|
58
|
+
|
|
59
|
+
When verification fails, stop at a decision point. Present:
|
|
60
|
+
|
|
61
|
+
- failed check and evidence path;
|
|
62
|
+
- whether failure is CRITICAL, IMPORTANT, WARNING, or SUGGESTION;
|
|
63
|
+
- recommended fix path;
|
|
64
|
+
- risk if the user accepts deviation.
|
|
65
|
+
|
|
66
|
+
CRITICAL or IMPORTANT failures cannot be accepted silently. If the user chooses
|
|
67
|
+
to fix, run:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-state.sh transition <change-dir> verify-fail
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then return to `$superflow-implement` or `$superflow-docs` depending on whether the failure
|
|
74
|
+
is implementation drift or design/spec drift.
|
|
75
|
+
|
|
76
|
+
After three consecutive verify-fail cycles, do not auto-continue fixing. Ask
|
|
77
|
+
the user whether to continue fixing or accept the remaining deviations with
|
|
78
|
+
explicit recorded risk.
|
|
79
|
+
|
|
80
|
+
## Pass Closure
|
|
81
|
+
|
|
82
|
+
Before pass:
|
|
83
|
+
|
|
84
|
+
1. `test-report.md` records commands, RED/GREEN expectations, actual output,
|
|
85
|
+
DB/log/API evidence, handoff hash, and phase state.
|
|
86
|
+
2. `~/.codex/hooks/superflow-verify-integration.sh <test-report.md>` passes when the
|
|
87
|
+
report involves integration evidence.
|
|
88
|
+
3. `~/.codex/hooks/superflow-test-report-lint.py --tests <tests.md> <test-report.md>`
|
|
89
|
+
passes. If `tests.md` declares L3/L4, real-entry, third-party, device,
|
|
90
|
+
database, log, or dev-tool evidence, mock-only/unit-only reports are hard
|
|
91
|
+
failures unless the report is explicitly `Blocked` or `Partially verified`
|
|
92
|
+
with the missing environment named.
|
|
93
|
+
4. `~/.codex/hooks/superflow-delivery-check.sh <test-report.md>` passes before
|
|
94
|
+
delivery or branch closeout.
|
|
95
|
+
5. Code review findings are either fixed or explicitly recorded with accepted
|
|
96
|
+
risk.
|
|
97
|
+
6. Branch/worktree status is handled and `.sdd/state.yaml` has:
|
|
98
|
+
`branch_status: handled`.
|
|
99
|
+
|
|
100
|
+
Only then run:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
~/.codex/skills/superflow-pipeline/scripts/superflow-guard.sh <change-dir> verify --apply
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
This advances to `phase: archive`, sets `verify_result: pass`, and records
|
|
107
|
+
`verified_at`.
|
|
108
|
+
|
|
109
|
+
## Archive Boundary
|
|
110
|
+
|
|
111
|
+
Passing verification does not authorize automatic archive. Enter `$superflow-archive`
|
|
112
|
+
and wait for explicit user confirmation.
|