@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.
Files changed (198) hide show
  1. package/INSTALL.en.md +106 -0
  2. package/INSTALL.md +664 -0
  3. package/LICENSE +21 -0
  4. package/README.md +142 -0
  5. package/README.zh-CN.md +117 -0
  6. package/assets/context-templates/business-rules.md +98 -0
  7. package/assets/context-templates/decisions.md +153 -0
  8. package/assets/context-templates/external-systems.md +166 -0
  9. package/assets/context-templates/incidents.md +89 -0
  10. package/assets/manifest.json +53 -0
  11. package/assets/prompts/superflow-archive.md +9 -0
  12. package/assets/prompts/superflow-clarify.md +10 -0
  13. package/assets/prompts/superflow-design.md +10 -0
  14. package/assets/prompts/superflow-docs.md +10 -0
  15. package/assets/prompts/superflow-implement.md +10 -0
  16. package/assets/prompts/superflow-pipeline.md +13 -0
  17. package/assets/prompts/superflow-verify.md +10 -0
  18. package/assets/rules/superflow-phase-guard.md +50 -0
  19. package/assets/scripts/claude-auto-backup-hook.sh +313 -0
  20. package/assets/scripts/codex-auto-backup-hook.sh +361 -0
  21. package/assets/scripts/install-sql-pre-commit.sh +44 -0
  22. package/assets/scripts/superflow-contract-hooks.sh +744 -0
  23. package/assets/scripts/superflow-delivery-check.sh +315 -0
  24. package/assets/scripts/superflow-dependency-update-hook.sh +161 -0
  25. package/assets/scripts/superflow-enforce-hook.sh +70 -0
  26. package/assets/scripts/superflow-hook-guard.sh +132 -0
  27. package/assets/scripts/superflow-integration-evidence-hook.sh +80 -0
  28. package/assets/scripts/superflow-sql-sync-hook.py +950 -0
  29. package/assets/scripts/superflow-test-report-lint.py +433 -0
  30. package/assets/scripts/superflow-verify-integration.sh +90 -0
  31. package/assets/scripts/sync-settings-json.py +52 -0
  32. package/assets/skills/api-doc-changelog/SKILL.md +193 -0
  33. package/assets/skills/openspec-apply-change/SKILL.md +156 -0
  34. package/assets/skills/openspec-archive-change/SKILL.md +114 -0
  35. package/assets/skills/openspec-explore/SKILL.md +288 -0
  36. package/assets/skills/openspec-propose/SKILL.md +110 -0
  37. package/assets/skills/superflow-archive/SKILL.md +61 -0
  38. package/assets/skills/superflow-clarify/SKILL.md +146 -0
  39. package/assets/skills/superflow-clarify/agents/openai.yaml +4 -0
  40. package/assets/skills/superflow-design/SKILL.md +83 -0
  41. package/assets/skills/superflow-design/agents/openai.yaml +4 -0
  42. package/assets/skills/superflow-docs/SKILL.md +316 -0
  43. package/assets/skills/superflow-docs/agents/openai.yaml +4 -0
  44. package/assets/skills/superflow-hotfix/SKILL.md +48 -0
  45. package/assets/skills/superflow-implement/SKILL.md +461 -0
  46. package/assets/skills/superflow-implement/agents/openai.yaml +4 -0
  47. package/assets/skills/superflow-pipeline/SKILL.md +844 -0
  48. package/assets/skills/superflow-pipeline/agents/openai.yaml +4 -0
  49. package/assets/skills/superflow-pipeline/references/api-design-template.md +431 -0
  50. package/assets/skills/superflow-pipeline/references/architecture-design-template.md +119 -0
  51. package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +536 -0
  52. package/assets/skills/superflow-pipeline/references/batch-split-guide.md +140 -0
  53. package/assets/skills/superflow-pipeline/references/decision-point.md +30 -0
  54. package/assets/skills/superflow-pipeline/references/dirty-worktree.md +35 -0
  55. package/assets/skills/superflow-pipeline/references/document-templates.md +123 -0
  56. package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +124 -0
  57. package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
  58. package/assets/skills/superflow-pipeline/references/mock-strategy-guide.md +86 -0
  59. package/assets/skills/superflow-pipeline/references/openspec-format.md +57 -0
  60. package/assets/skills/superflow-pipeline/references/orchestration.md +639 -0
  61. package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +174 -0
  62. package/assets/skills/superflow-pipeline/references/project-config.md +40 -0
  63. package/assets/skills/superflow-pipeline/references/prompt-usage-template.md +152 -0
  64. package/assets/skills/superflow-pipeline/references/quality-gate.md +299 -0
  65. package/assets/skills/superflow-pipeline/references/quality-standards.md +190 -0
  66. package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +154 -0
  67. package/assets/skills/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
  68. package/assets/skills/superflow-pipeline/references/subagent-progress.md +90 -0
  69. package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
  70. package/assets/skills/superflow-pipeline/references/test-execution-template.md +220 -0
  71. package/assets/skills/superflow-pipeline/references/test-guide.md +30 -0
  72. package/assets/skills/superflow-pipeline/references/traceability-matrix.md +106 -0
  73. package/assets/skills/superflow-pipeline/references/validation-integrity.md +134 -0
  74. package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +178 -0
  75. package/assets/skills/superflow-pipeline/scripts/superflow-env.sh +118 -0
  76. package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +428 -0
  77. package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
  78. package/assets/skills/superflow-pipeline/scripts/superflow-state.sh +574 -0
  79. package/assets/skills/superflow-pipeline/scripts/superflow-status.sh +172 -0
  80. package/assets/skills/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
  81. package/assets/skills/superflow-table-impact-analysis/SKILL.md +77 -0
  82. package/assets/skills/superflow-tweak/SKILL.md +46 -0
  83. package/assets/skills/superflow-verify/SKILL.md +112 -0
  84. package/assets/skills-en/api-doc-changelog/SKILL.md +193 -0
  85. package/assets/skills-en/openspec-apply-change/SKILL.md +156 -0
  86. package/assets/skills-en/openspec-archive-change/SKILL.md +114 -0
  87. package/assets/skills-en/openspec-explore/SKILL.md +288 -0
  88. package/assets/skills-en/openspec-propose/SKILL.md +110 -0
  89. package/assets/skills-en/superflow-archive/SKILL.md +61 -0
  90. package/assets/skills-en/superflow-clarify/SKILL.md +146 -0
  91. package/assets/skills-en/superflow-clarify/agents/openai.yaml +4 -0
  92. package/assets/skills-en/superflow-design/SKILL.md +83 -0
  93. package/assets/skills-en/superflow-design/agents/openai.yaml +4 -0
  94. package/assets/skills-en/superflow-docs/SKILL.md +316 -0
  95. package/assets/skills-en/superflow-docs/agents/openai.yaml +4 -0
  96. package/assets/skills-en/superflow-hotfix/SKILL.md +48 -0
  97. package/assets/skills-en/superflow-implement/SKILL.md +461 -0
  98. package/assets/skills-en/superflow-implement/agents/openai.yaml +4 -0
  99. package/assets/skills-en/superflow-pipeline/SKILL.md +844 -0
  100. package/assets/skills-en/superflow-pipeline/agents/openai.yaml +4 -0
  101. package/assets/skills-en/superflow-pipeline/references/api-design-template.md +431 -0
  102. package/assets/skills-en/superflow-pipeline/references/architecture-design-template.md +119 -0
  103. package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +536 -0
  104. package/assets/skills-en/superflow-pipeline/references/batch-split-guide.md +140 -0
  105. package/assets/skills-en/superflow-pipeline/references/decision-point.md +30 -0
  106. package/assets/skills-en/superflow-pipeline/references/dirty-worktree.md +35 -0
  107. package/assets/skills-en/superflow-pipeline/references/document-templates.md +123 -0
  108. package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +124 -0
  109. package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
  110. package/assets/skills-en/superflow-pipeline/references/mock-strategy-guide.md +86 -0
  111. package/assets/skills-en/superflow-pipeline/references/openspec-format.md +57 -0
  112. package/assets/skills-en/superflow-pipeline/references/orchestration.md +639 -0
  113. package/assets/skills-en/superflow-pipeline/references/p0-baseline-template.md +174 -0
  114. package/assets/skills-en/superflow-pipeline/references/project-config.md +40 -0
  115. package/assets/skills-en/superflow-pipeline/references/prompt-usage-template.md +152 -0
  116. package/assets/skills-en/superflow-pipeline/references/quality-gate.md +299 -0
  117. package/assets/skills-en/superflow-pipeline/references/quality-standards.md +190 -0
  118. package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +154 -0
  119. package/assets/skills-en/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
  120. package/assets/skills-en/superflow-pipeline/references/subagent-progress.md +90 -0
  121. package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
  122. package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +220 -0
  123. package/assets/skills-en/superflow-pipeline/references/test-guide.md +30 -0
  124. package/assets/skills-en/superflow-pipeline/references/traceability-matrix.md +106 -0
  125. package/assets/skills-en/superflow-pipeline/references/validation-integrity.md +134 -0
  126. package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +178 -0
  127. package/assets/skills-en/superflow-pipeline/scripts/superflow-env.sh +118 -0
  128. package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +428 -0
  129. package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
  130. package/assets/skills-en/superflow-pipeline/scripts/superflow-state.sh +574 -0
  131. package/assets/skills-en/superflow-pipeline/scripts/superflow-status.sh +172 -0
  132. package/assets/skills-en/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
  133. package/assets/skills-en/superflow-table-impact-analysis/SKILL.md +77 -0
  134. package/assets/skills-en/superflow-tweak/SKILL.md +46 -0
  135. package/assets/skills-en/superflow-verify/SKILL.md +112 -0
  136. package/dist/cli/index.js +186 -0
  137. package/dist/cli/index.js.map +1 -0
  138. package/dist/commands/archive.js +6 -0
  139. package/dist/commands/archive.js.map +1 -0
  140. package/dist/commands/clarify.js +6 -0
  141. package/dist/commands/clarify.js.map +1 -0
  142. package/dist/commands/design.js +6 -0
  143. package/dist/commands/design.js.map +1 -0
  144. package/dist/commands/docs.js +6 -0
  145. package/dist/commands/docs.js.map +1 -0
  146. package/dist/commands/doctor.js +473 -0
  147. package/dist/commands/doctor.js.map +1 -0
  148. package/dist/commands/implement.js +6 -0
  149. package/dist/commands/implement.js.map +1 -0
  150. package/dist/commands/init.js +471 -0
  151. package/dist/commands/init.js.map +1 -0
  152. package/dist/commands/pipeline.js +6 -0
  153. package/dist/commands/pipeline.js.map +1 -0
  154. package/dist/commands/scan.js +59 -0
  155. package/dist/commands/scan.js.map +1 -0
  156. package/dist/commands/status.js +173 -0
  157. package/dist/commands/status.js.map +1 -0
  158. package/dist/commands/uninstall.js +213 -0
  159. package/dist/commands/uninstall.js.map +1 -0
  160. package/dist/commands/update.js +187 -0
  161. package/dist/commands/update.js.map +1 -0
  162. package/dist/commands/verify.js +6 -0
  163. package/dist/commands/verify.js.map +1 -0
  164. package/dist/core/assets.js +27 -0
  165. package/dist/core/assets.js.map +1 -0
  166. package/dist/core/context.js +100 -0
  167. package/dist/core/context.js.map +1 -0
  168. package/dist/core/dependencies.js +146 -0
  169. package/dist/core/dependencies.js.map +1 -0
  170. package/dist/core/detect.js +71 -0
  171. package/dist/core/detect.js.map +1 -0
  172. package/dist/core/i18n.js +103 -0
  173. package/dist/core/i18n.js.map +1 -0
  174. package/dist/core/integrity.js +46 -0
  175. package/dist/core/integrity.js.map +1 -0
  176. package/dist/core/manifest.js +18 -0
  177. package/dist/core/manifest.js.map +1 -0
  178. package/dist/core/prompts.js +20 -0
  179. package/dist/core/prompts.js.map +1 -0
  180. package/dist/core/registry.js +134 -0
  181. package/dist/core/registry.js.map +1 -0
  182. package/dist/core/rules.js +17 -0
  183. package/dist/core/rules.js.map +1 -0
  184. package/dist/core/scripts.js +40 -0
  185. package/dist/core/scripts.js.map +1 -0
  186. package/dist/core/skill-check.js +31 -0
  187. package/dist/core/skill-check.js.map +1 -0
  188. package/dist/core/skills.js +56 -0
  189. package/dist/core/skills.js.map +1 -0
  190. package/dist/core/state.js +43 -0
  191. package/dist/core/state.js.map +1 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/utils/path.js +11 -0
  195. package/dist/utils/path.js.map +1 -0
  196. package/dist/utils/shell.js +29 -0
  197. package/dist/utils/shell.js.map +1 -0
  198. package/package.json +60 -0
@@ -0,0 +1,296 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ usage() {
5
+ cat <<'USAGE'
6
+ Usage:
7
+ superflow-handoff.sh <change-dir> [--write|--hash-only|--refresh]
8
+
9
+ Generate a deterministic SDD handoff pack from OpenSpec/SDD documents.
10
+ The pack is context for Superpowers execution strategy; OpenSpec/SDD docs
11
+ remain the canonical source of truth.
12
+ USAGE
13
+ }
14
+
15
+ die() {
16
+ printf 'superflow-handoff: %s\n' "$*" >&2
17
+ exit 1
18
+ }
19
+
20
+ sha_file() {
21
+ # Ignore generated state/hash marker lines so recording the handoff hash in
22
+ # SDD docs does not change the handoff hash itself.
23
+ if command -v sha256sum >/dev/null 2>&1; then
24
+ sed -E '/handoff_hash/d;/context_hash/d;/sdd-context\.sha256/d;/[a-f0-9]{64}/d;/pending/d;/^[[:space:]]*$/d' "$1" \
25
+ | sha256sum | awk '{print $1}'
26
+ else
27
+ sed -E '/handoff_hash/d;/context_hash/d;/sdd-context\.sha256/d;/[a-f0-9]{64}/d;/pending/d;/^[[:space:]]*$/d' "$1" \
28
+ | shasum -a 256 | awk '{print $1}'
29
+ fi
30
+ }
31
+
32
+ json_escape() {
33
+ sed 's/\\/\\\\/g; s/"/\\"/g'
34
+ }
35
+
36
+ yaml_value() {
37
+ local file="$1"
38
+ local key="$2"
39
+ [[ -f "$file" ]] || return 1
40
+ awk -F':' -v k="$key" '
41
+ $1 == k {
42
+ value = $0
43
+ sub("^[^:]*:[[:space:]]*", "", value)
44
+ gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
45
+ print value
46
+ found=1
47
+ }
48
+ END { exit found ? 0 : 1 }
49
+ ' "$file"
50
+ }
51
+
52
+ project_root_for_change() {
53
+ if git -C "$CHANGE_DIR" rev-parse --show-toplevel >/dev/null 2>&1; then
54
+ git -C "$CHANGE_DIR" rev-parse --show-toplevel
55
+ else
56
+ dirname "$(dirname "$CHANGE_DIR")"
57
+ fi
58
+ }
59
+
60
+ config_value() {
61
+ local key="$1"
62
+ local default="$2"
63
+ local env_name="$3"
64
+ local root value
65
+
66
+ if [[ -n "${!env_name:-}" ]]; then
67
+ printf '%s\n' "${!env_name}"
68
+ return
69
+ fi
70
+
71
+ if value="$(yaml_value "$CHANGE_DIR/.sdd/config.yaml" "$key" 2>/dev/null)"; then
72
+ [[ -n "$value" ]] && { printf '%s\n' "$value"; return; }
73
+ fi
74
+
75
+ root="$(project_root_for_change)"
76
+ if value="$(yaml_value "$root/.sdd/config.yaml" "$key" 2>/dev/null)"; then
77
+ [[ -n "$value" ]] && { printf '%s\n' "$value"; return; }
78
+ fi
79
+
80
+ if value="$(yaml_value "$CHANGE_DIR/.sdd/state.yaml" "$key" 2>/dev/null)"; then
81
+ [[ -n "$value" ]] && { printf '%s\n' "$value"; return; }
82
+ fi
83
+
84
+ printf '%s\n' "$default"
85
+ }
86
+
87
+ source_role() {
88
+ local rel="$1"
89
+ case "$rel" in
90
+ docs/superpowers/specs/*.md|*/docs/superpowers/specs/*.md) printf 'technical-design' ;;
91
+ docs/superpowers/plans/*.md|*/docs/superpowers/plans/*.md) printf 'implementation-plan' ;;
92
+ api.md|*/api.md) printf 'api' ;;
93
+ tests.md|*/tests.md|test-report.md|*/test-report.md) printf 'test' ;;
94
+ spec.md|*/spec.md|specs/*/spec.md|*/specs/*/spec.md) printf 'spec' ;;
95
+ design.md|*/design.md) printf 'design' ;;
96
+ tasks.md|*/tasks.md) printf 'task' ;;
97
+ *) printf 'supporting' ;;
98
+ esac
99
+ }
100
+
101
+ is_beta_projected_role() {
102
+ case "$1" in
103
+ api|spec|test|technical-design) return 0 ;;
104
+ *) return 1 ;;
105
+ esac
106
+ }
107
+
108
+ CHANGE_DIR="${1:-}"
109
+ MODE="${2:-}"
110
+
111
+ if [[ -z "$CHANGE_DIR" || "$CHANGE_DIR" == "-h" || "$CHANGE_DIR" == "--help" ]]; then
112
+ usage
113
+ exit 0
114
+ fi
115
+
116
+ [[ -d "$CHANGE_DIR" ]] || die "change dir not found: $CHANGE_DIR"
117
+ [[ -z "$MODE" || "$MODE" == "--write" || "$MODE" == "--hash-only" || "$MODE" == "--refresh" ]] || die "unknown option: $MODE"
118
+
119
+ CHANGE_DIR="$(cd "$CHANGE_DIR" && pwd)"
120
+ OUT_DIR="$CHANGE_DIR/.sdd/handoff"
121
+ TMP_LIST="$(mktemp)"
122
+ trap 'rm -f "$TMP_LIST"' EXIT
123
+
124
+ context_compression="$(config_value context_compression off SDD_CONTEXT_COMPRESSION)"
125
+ case "$context_compression" in
126
+ off) excerpt_limit=220 ;;
127
+ beta) excerpt_limit=80 ;;
128
+ *) die "invalid context_compression: $context_compression" ;;
129
+ esac
130
+
131
+ find "$CHANGE_DIR" -type f \
132
+ \( -name '*.md' -o -name '.openspec.yaml' -o -name '*.yml' -o -name '*.yaml' \) \
133
+ ! -path "$CHANGE_DIR/.sdd/*" \
134
+ ! -path "$CHANGE_DIR/.comet/*" \
135
+ ! -path "$CHANGE_DIR/.git/*" \
136
+ | sort > "$TMP_LIST"
137
+
138
+ [[ -s "$TMP_LIST" ]] || die "no SDD/OpenSpec documents found under $CHANGE_DIR"
139
+
140
+ if [[ "$MODE" == "--write" || "$MODE" == "--refresh" ]]; then
141
+ mkdir -p "$OUT_DIR"
142
+ fi
143
+
144
+ context_hash_input=""
145
+ while IFS= read -r file; do
146
+ rel="${file#"$CHANGE_DIR"/}"
147
+ hash="$(sha_file "$file")"
148
+ context_hash_input+="${rel}:${hash}"$'\n'
149
+ done < "$TMP_LIST"
150
+
151
+ if command -v sha256sum >/dev/null 2>&1; then
152
+ context_hash="$(printf '%s' "$context_hash_input" | sha256sum | awk '{print $1}')"
153
+ else
154
+ context_hash="$(printf '%s' "$context_hash_input" | shasum -a 256 | awk '{print $1}')"
155
+ fi
156
+
157
+ write_markdown() {
158
+ {
159
+ printf '# SDD Handoff Context\n\n'
160
+ printf '> OpenSpec/SDD docs remain canonical. This file is a deterministic context pack for Superpowers execution strategy and implementation prompts.\n\n'
161
+ printf '%s\n' "- change_dir: \`$CHANGE_DIR\`"
162
+ printf '%s\n' "- context_hash: \`$context_hash\`"
163
+ printf '%s\n' "- context_compression: \`$context_compression\`"
164
+ printf '%s\n\n' "- generated_at: \`$(date -u '+%Y-%m-%dT%H:%M:%SZ')\`"
165
+ printf '## Source Inventory\n\n'
166
+ printf '| Path | Role | SHA256 | Lines |\n'
167
+ printf '|---|---|---|---:|\n'
168
+ while IFS= read -r file; do
169
+ rel="${file#"$CHANGE_DIR"/}"
170
+ hash="$(sha_file "$file")"
171
+ lines="$(wc -l < "$file" | tr -d ' ')"
172
+ role="$(source_role "$rel")"
173
+ printf '| `%s` | `%s` | `%s` | %s |\n' "$rel" "$role" "$hash" "$lines"
174
+ done < "$TMP_LIST"
175
+ printf '\n## Required Superpower Boundary\n\n'
176
+ printf '%s\n' '- Superpowers owns source-level HOW: technical design, execution strategy, plan, TDD order, reviewer/tester split, worktree/port orchestration, and verification ownership.'
177
+ printf '%s\n' '- Superpowers must not replace OpenSpec/SDD design, API, database, field semantics, SQL, or tests.'
178
+ printf '%s\n\n' '- If source documents conflict or are incomplete, mark `Blocked` and return to SDD docs instead of inventing a second design.'
179
+ if [[ "$context_compression" == "beta" ]]; then
180
+ printf '## Canonical Projection\n\n'
181
+ printf '%s\n\n' 'Beta mode projects API/spec/test sources verbatim and references supporting docs by hash. Read original supporting files when a design, task, or requirement detail is unclear.'
182
+ else
183
+ printf '## Source Excerpts\n\n'
184
+ fi
185
+ while IFS= read -r file; do
186
+ rel="${file#"$CHANGE_DIR"/}"
187
+ role="$(source_role "$rel")"
188
+ printf '### `%s`\n\n' "$rel"
189
+ if [[ "$context_compression" == "beta" ]] && ! is_beta_projected_role "$role"; then
190
+ printf '%s\n' "- Role: \`$role\`"
191
+ printf '%s\n' "- SHA256: \`$(sha_file "$file")\`"
192
+ printf '%s\n\n' "- Full source remains canonical. Read \`$rel\` directly if needed."
193
+ continue
194
+ fi
195
+ printf '```text\n'
196
+ if [[ "$context_compression" == "beta" ]]; then
197
+ cat "$file"
198
+ else
199
+ sed -n "1,${excerpt_limit}p" "$file"
200
+ total="$(wc -l < "$file" | tr -d ' ')"
201
+ if [[ "$total" -gt "$excerpt_limit" ]]; then
202
+ printf '\n[TRUNCATED: showing first %s of %s lines]\n' "$excerpt_limit" "$total"
203
+ fi
204
+ fi
205
+ printf '```\n\n'
206
+ done < "$TMP_LIST"
207
+ }
208
+ }
209
+
210
+ write_json() {
211
+ {
212
+ printf '{\n'
213
+ printf ' "changeDir": "%s",\n' "$(printf '%s' "$CHANGE_DIR" | json_escape)"
214
+ printf ' "contextHash": "%s",\n' "$context_hash"
215
+ printf ' "canonical": "openspec-sdd",\n'
216
+ printf ' "contextCompression": "%s",\n' "$context_compression"
217
+ printf ' "role": "superpowers-execution-context",\n'
218
+ printf ' "sources": [\n'
219
+ first=1
220
+ while IFS= read -r file; do
221
+ rel="${file#"$CHANGE_DIR"/}"
222
+ hash="$(sha_file "$file")"
223
+ lines="$(wc -l < "$file" | tr -d ' ')"
224
+ role="$(source_role "$rel")"
225
+ [[ "$first" -eq 0 ]] && printf ',\n'
226
+ first=0
227
+ projected=false
228
+ if [[ "$context_compression" == "off" ]] || is_beta_projected_role "$role"; then
229
+ projected=true
230
+ fi
231
+ printf ' {"path": "%s", "sha256": "%s", "lines": %s, "role": "%s", "projected": %s}' \
232
+ "$(printf '%s' "$rel" | json_escape)" "$hash" "$lines" "$role" "$projected"
233
+ done < "$TMP_LIST"
234
+ printf '\n ]\n'
235
+ printf '}\n'
236
+ }
237
+ }
238
+
239
+ sync_state() {
240
+ local state_sh="$1"
241
+ local technical_design_rel current_design_doc
242
+
243
+ "$state_sh" init "$CHANGE_DIR" docs >/dev/null
244
+ "$state_sh" set "$CHANGE_DIR" context_compression "$context_compression"
245
+ "$state_sh" set "$CHANGE_DIR" handoff_context .sdd/handoff/sdd-context.json
246
+ "$state_sh" set "$CHANGE_DIR" handoff_hash "$context_hash"
247
+ technical_design_rel="$(
248
+ find "$CHANGE_DIR/docs/superpowers/specs" -maxdepth 1 -type f -name '*.md' 2>/dev/null \
249
+ | sort | head -n 1 | sed "s#^$CHANGE_DIR/##"
250
+ )"
251
+ if [[ -n "$technical_design_rel" ]]; then
252
+ "$state_sh" set "$CHANGE_DIR" technical_design "$technical_design_rel"
253
+ fi
254
+
255
+ current_design_doc="$("$state_sh" get "$CHANGE_DIR" design_doc 2>/dev/null || true)"
256
+ if [[ -z "$current_design_doc" || "$current_design_doc" == "null" ]]; then
257
+ if [[ -f "$CHANGE_DIR/design.md" ]]; then
258
+ "$state_sh" set "$CHANGE_DIR" design_doc design.md
259
+ elif [[ -n "$technical_design_rel" ]]; then
260
+ "$state_sh" set "$CHANGE_DIR" design_doc "$technical_design_rel"
261
+ fi
262
+ fi
263
+ }
264
+
265
+ run_refresh_checks() {
266
+ local script_dir validate_sh guard_sh
267
+ script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
268
+ validate_sh="$script_dir/superflow-yaml-validate.sh"
269
+ guard_sh="$script_dir/superflow-guard.sh"
270
+
271
+ if [[ -x "$validate_sh" ]]; then
272
+ "$validate_sh" "$CHANGE_DIR" >/dev/null
273
+ printf 'yaml validation passed\n'
274
+ fi
275
+ if [[ -x "$guard_sh" ]]; then
276
+ "$guard_sh" "$CHANGE_DIR" docs >/dev/null
277
+ printf 'guard docs passed\n'
278
+ fi
279
+ }
280
+
281
+ if [[ "$MODE" == "--write" || "$MODE" == "--refresh" ]]; then
282
+ write_markdown > "$OUT_DIR/sdd-context.md"
283
+ write_json > "$OUT_DIR/sdd-context.json"
284
+ printf '%s\n' "$context_hash" > "$OUT_DIR/sdd-context.sha256"
285
+ STATE_SH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/superflow-state.sh"
286
+ if [[ -x "$STATE_SH" ]]; then
287
+ sync_state "$STATE_SH"
288
+ fi
289
+ printf 'wrote %s\n' "$OUT_DIR/sdd-context.md"
290
+ printf 'hash %s\n' "$context_hash"
291
+ if [[ "$MODE" == "--refresh" ]]; then
292
+ run_refresh_checks
293
+ fi
294
+ else
295
+ printf '%s\n' "$context_hash"
296
+ fi