shipwright-cli 3.2.0 → 3.3.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 (279) hide show
  1. package/.claude/agents/code-reviewer.md +2 -0
  2. package/.claude/agents/devops-engineer.md +2 -0
  3. package/.claude/agents/doc-fleet-agent.md +2 -0
  4. package/.claude/agents/pipeline-agent.md +2 -0
  5. package/.claude/agents/shell-script-specialist.md +2 -0
  6. package/.claude/agents/test-specialist.md +2 -0
  7. package/.claude/hooks/agent-crash-capture.sh +32 -0
  8. package/.claude/hooks/post-tool-use.sh +3 -2
  9. package/.claude/hooks/pre-tool-use.sh +35 -3
  10. package/README.md +4 -4
  11. package/claude-code/hooks/config-change.sh +18 -0
  12. package/claude-code/hooks/instructions-reloaded.sh +7 -0
  13. package/claude-code/hooks/worktree-create.sh +25 -0
  14. package/claude-code/hooks/worktree-remove.sh +20 -0
  15. package/config/code-constitution.json +130 -0
  16. package/dashboard/middleware/auth.ts +134 -0
  17. package/dashboard/middleware/constants.ts +21 -0
  18. package/dashboard/public/index.html +2 -6
  19. package/dashboard/public/styles.css +100 -97
  20. package/dashboard/routes/auth.ts +38 -0
  21. package/dashboard/server.ts +66 -25
  22. package/dashboard/services/config.ts +26 -0
  23. package/dashboard/services/db.ts +118 -0
  24. package/dashboard/src/canvas/pixel-agent.ts +298 -0
  25. package/dashboard/src/canvas/pixel-sprites.ts +440 -0
  26. package/dashboard/src/canvas/shipyard-effects.ts +367 -0
  27. package/dashboard/src/canvas/shipyard-scene.ts +616 -0
  28. package/dashboard/src/canvas/submarine-layout.ts +267 -0
  29. package/dashboard/src/components/header.ts +8 -7
  30. package/dashboard/src/core/router.ts +1 -0
  31. package/dashboard/src/design/submarine-theme.ts +253 -0
  32. package/dashboard/src/main.ts +2 -0
  33. package/dashboard/src/types/api.ts +2 -1
  34. package/dashboard/src/views/activity.ts +2 -1
  35. package/dashboard/src/views/shipyard.ts +39 -0
  36. package/dashboard/types/index.ts +166 -0
  37. package/docs/plans/2026-02-28-compound-audit-and-shipyard-design.md +186 -0
  38. package/docs/plans/2026-02-28-skipper-shipwright-implementation-plan.md +1182 -0
  39. package/docs/plans/2026-02-28-skipper-shipwright-integration-design.md +531 -0
  40. package/docs/plans/2026-03-01-ai-powered-skill-injection-design.md +298 -0
  41. package/docs/plans/2026-03-01-ai-powered-skill-injection-plan.md +1109 -0
  42. package/docs/plans/2026-03-01-capabilities-cleanup-plan.md +658 -0
  43. package/docs/plans/2026-03-01-clean-architecture-plan.md +924 -0
  44. package/docs/plans/2026-03-01-compound-audit-cascade-design.md +191 -0
  45. package/docs/plans/2026-03-01-compound-audit-cascade-plan.md +921 -0
  46. package/docs/plans/2026-03-01-deep-integration-plan.md +851 -0
  47. package/docs/plans/2026-03-01-pipeline-audit-trail-design.md +145 -0
  48. package/docs/plans/2026-03-01-pipeline-audit-trail-plan.md +770 -0
  49. package/docs/plans/2026-03-01-refined-depths-brand-design.md +382 -0
  50. package/docs/plans/2026-03-01-refined-depths-implementation.md +599 -0
  51. package/docs/plans/2026-03-01-skipper-kernel-integration-design.md +203 -0
  52. package/docs/plans/2026-03-01-unified-platform-design.md +272 -0
  53. package/docs/plans/2026-03-07-claude-code-feature-integration-design.md +189 -0
  54. package/docs/plans/2026-03-07-claude-code-feature-integration-plan.md +1165 -0
  55. package/docs/research/BACKLOG_QUICK_REFERENCE.md +352 -0
  56. package/docs/research/CUTTING_EDGE_RESEARCH_2026.md +546 -0
  57. package/docs/research/RESEARCH_INDEX.md +439 -0
  58. package/docs/research/RESEARCH_SOURCES.md +440 -0
  59. package/docs/research/RESEARCH_SUMMARY.txt +275 -0
  60. package/docs/superpowers/specs/2026-03-10-pipeline-quality-revolution-design.md +341 -0
  61. package/package.json +2 -2
  62. package/scripts/lib/adaptive-model.sh +427 -0
  63. package/scripts/lib/adaptive-timeout.sh +316 -0
  64. package/scripts/lib/audit-trail.sh +309 -0
  65. package/scripts/lib/auto-recovery.sh +471 -0
  66. package/scripts/lib/bandit-selector.sh +431 -0
  67. package/scripts/lib/bootstrap.sh +104 -2
  68. package/scripts/lib/causal-graph.sh +455 -0
  69. package/scripts/lib/compat.sh +126 -0
  70. package/scripts/lib/compound-audit.sh +337 -0
  71. package/scripts/lib/constitutional.sh +454 -0
  72. package/scripts/lib/context-budget.sh +359 -0
  73. package/scripts/lib/convergence.sh +594 -0
  74. package/scripts/lib/cost-optimizer.sh +634 -0
  75. package/scripts/lib/daemon-adaptive.sh +10 -0
  76. package/scripts/lib/daemon-dispatch.sh +106 -17
  77. package/scripts/lib/daemon-failure.sh +34 -4
  78. package/scripts/lib/daemon-patrol.sh +23 -2
  79. package/scripts/lib/daemon-poll-github.sh +361 -0
  80. package/scripts/lib/daemon-poll-health.sh +299 -0
  81. package/scripts/lib/daemon-poll.sh +27 -611
  82. package/scripts/lib/daemon-state.sh +112 -66
  83. package/scripts/lib/daemon-triage.sh +10 -0
  84. package/scripts/lib/dod-scorecard.sh +442 -0
  85. package/scripts/lib/error-actionability.sh +300 -0
  86. package/scripts/lib/formal-spec.sh +461 -0
  87. package/scripts/lib/helpers.sh +177 -4
  88. package/scripts/lib/intent-analysis.sh +409 -0
  89. package/scripts/lib/loop-convergence.sh +350 -0
  90. package/scripts/lib/loop-iteration.sh +682 -0
  91. package/scripts/lib/loop-progress.sh +48 -0
  92. package/scripts/lib/loop-restart.sh +185 -0
  93. package/scripts/lib/memory-effectiveness.sh +506 -0
  94. package/scripts/lib/mutation-executor.sh +352 -0
  95. package/scripts/lib/outcome-feedback.sh +521 -0
  96. package/scripts/lib/pipeline-cli.sh +336 -0
  97. package/scripts/lib/pipeline-commands.sh +1216 -0
  98. package/scripts/lib/pipeline-detection.sh +100 -2
  99. package/scripts/lib/pipeline-execution.sh +897 -0
  100. package/scripts/lib/pipeline-github.sh +28 -3
  101. package/scripts/lib/pipeline-intelligence-compound.sh +431 -0
  102. package/scripts/lib/pipeline-intelligence-scoring.sh +407 -0
  103. package/scripts/lib/pipeline-intelligence-skip.sh +181 -0
  104. package/scripts/lib/pipeline-intelligence.sh +100 -1136
  105. package/scripts/lib/pipeline-quality-bash-compat.sh +182 -0
  106. package/scripts/lib/pipeline-quality-checks.sh +17 -715
  107. package/scripts/lib/pipeline-quality-gates.sh +563 -0
  108. package/scripts/lib/pipeline-stages-build.sh +730 -0
  109. package/scripts/lib/pipeline-stages-delivery.sh +965 -0
  110. package/scripts/lib/pipeline-stages-intake.sh +1133 -0
  111. package/scripts/lib/pipeline-stages-monitor.sh +407 -0
  112. package/scripts/lib/pipeline-stages-review.sh +1022 -0
  113. package/scripts/lib/pipeline-stages.sh +59 -2929
  114. package/scripts/lib/pipeline-state.sh +36 -5
  115. package/scripts/lib/pipeline-util.sh +487 -0
  116. package/scripts/lib/policy-learner.sh +438 -0
  117. package/scripts/lib/process-reward.sh +493 -0
  118. package/scripts/lib/project-detect.sh +649 -0
  119. package/scripts/lib/quality-profile.sh +334 -0
  120. package/scripts/lib/recruit-commands.sh +885 -0
  121. package/scripts/lib/recruit-learning.sh +739 -0
  122. package/scripts/lib/recruit-roles.sh +648 -0
  123. package/scripts/lib/reward-aggregator.sh +458 -0
  124. package/scripts/lib/rl-optimizer.sh +362 -0
  125. package/scripts/lib/root-cause.sh +427 -0
  126. package/scripts/lib/scope-enforcement.sh +445 -0
  127. package/scripts/lib/session-restart.sh +493 -0
  128. package/scripts/lib/skill-memory.sh +300 -0
  129. package/scripts/lib/skill-registry.sh +775 -0
  130. package/scripts/lib/spec-driven.sh +476 -0
  131. package/scripts/lib/test-helpers.sh +18 -7
  132. package/scripts/lib/test-holdout.sh +429 -0
  133. package/scripts/lib/test-optimizer.sh +511 -0
  134. package/scripts/shipwright-file-suggest.sh +45 -0
  135. package/scripts/skills/adversarial-quality.md +61 -0
  136. package/scripts/skills/api-design.md +44 -0
  137. package/scripts/skills/architecture-design.md +50 -0
  138. package/scripts/skills/brainstorming.md +43 -0
  139. package/scripts/skills/data-pipeline.md +44 -0
  140. package/scripts/skills/deploy-safety.md +64 -0
  141. package/scripts/skills/documentation.md +38 -0
  142. package/scripts/skills/frontend-design.md +45 -0
  143. package/scripts/skills/generated/.gitkeep +0 -0
  144. package/scripts/skills/generated/_refinements/.gitkeep +0 -0
  145. package/scripts/skills/generated/_refinements/adversarial-quality.patch.md +3 -0
  146. package/scripts/skills/generated/_refinements/architecture-design.patch.md +3 -0
  147. package/scripts/skills/generated/_refinements/brainstorming.patch.md +3 -0
  148. package/scripts/skills/generated/cli-version-management.md +29 -0
  149. package/scripts/skills/generated/collection-system-validation.md +99 -0
  150. package/scripts/skills/generated/large-scale-c-refactoring-coordination.md +97 -0
  151. package/scripts/skills/generated/pattern-matching-similarity-scoring.md +195 -0
  152. package/scripts/skills/generated/test-parallelization-detection.md +65 -0
  153. package/scripts/skills/observability.md +79 -0
  154. package/scripts/skills/performance.md +48 -0
  155. package/scripts/skills/pr-quality.md +49 -0
  156. package/scripts/skills/product-thinking.md +43 -0
  157. package/scripts/skills/security-audit.md +49 -0
  158. package/scripts/skills/systematic-debugging.md +40 -0
  159. package/scripts/skills/testing-strategy.md +47 -0
  160. package/scripts/skills/two-stage-review.md +52 -0
  161. package/scripts/skills/validation-thoroughness.md +55 -0
  162. package/scripts/sw +9 -3
  163. package/scripts/sw-activity.sh +9 -2
  164. package/scripts/sw-adaptive.sh +2 -1
  165. package/scripts/sw-adversarial.sh +2 -1
  166. package/scripts/sw-architecture-enforcer.sh +3 -1
  167. package/scripts/sw-auth.sh +12 -2
  168. package/scripts/sw-autonomous.sh +5 -1
  169. package/scripts/sw-changelog.sh +4 -1
  170. package/scripts/sw-checkpoint.sh +2 -1
  171. package/scripts/sw-ci.sh +5 -1
  172. package/scripts/sw-cleanup.sh +4 -26
  173. package/scripts/sw-code-review.sh +10 -4
  174. package/scripts/sw-connect.sh +2 -1
  175. package/scripts/sw-context.sh +2 -1
  176. package/scripts/sw-cost.sh +48 -3
  177. package/scripts/sw-daemon.sh +66 -9
  178. package/scripts/sw-dashboard.sh +3 -1
  179. package/scripts/sw-db.sh +59 -16
  180. package/scripts/sw-decide.sh +8 -2
  181. package/scripts/sw-decompose.sh +360 -17
  182. package/scripts/sw-deps.sh +4 -1
  183. package/scripts/sw-developer-simulation.sh +4 -1
  184. package/scripts/sw-discovery.sh +325 -2
  185. package/scripts/sw-doc-fleet.sh +4 -1
  186. package/scripts/sw-docs-agent.sh +3 -1
  187. package/scripts/sw-docs.sh +2 -1
  188. package/scripts/sw-doctor.sh +453 -2
  189. package/scripts/sw-dora.sh +4 -1
  190. package/scripts/sw-durable.sh +4 -3
  191. package/scripts/sw-e2e-orchestrator.sh +17 -16
  192. package/scripts/sw-eventbus.sh +7 -1
  193. package/scripts/sw-evidence.sh +364 -12
  194. package/scripts/sw-feedback.sh +550 -9
  195. package/scripts/sw-fix.sh +20 -1
  196. package/scripts/sw-fleet-discover.sh +6 -2
  197. package/scripts/sw-fleet-viz.sh +4 -1
  198. package/scripts/sw-fleet.sh +5 -1
  199. package/scripts/sw-github-app.sh +16 -3
  200. package/scripts/sw-github-checks.sh +3 -2
  201. package/scripts/sw-github-deploy.sh +3 -2
  202. package/scripts/sw-github-graphql.sh +18 -7
  203. package/scripts/sw-guild.sh +5 -1
  204. package/scripts/sw-heartbeat.sh +5 -30
  205. package/scripts/sw-hello.sh +67 -0
  206. package/scripts/sw-hygiene.sh +6 -1
  207. package/scripts/sw-incident.sh +265 -1
  208. package/scripts/sw-init.sh +18 -2
  209. package/scripts/sw-instrument.sh +10 -2
  210. package/scripts/sw-intelligence.sh +42 -6
  211. package/scripts/sw-jira.sh +5 -1
  212. package/scripts/sw-launchd.sh +2 -1
  213. package/scripts/sw-linear.sh +4 -1
  214. package/scripts/sw-logs.sh +4 -1
  215. package/scripts/sw-loop.sh +432 -1128
  216. package/scripts/sw-memory.sh +356 -2
  217. package/scripts/sw-mission-control.sh +6 -1
  218. package/scripts/sw-model-router.sh +481 -26
  219. package/scripts/sw-otel.sh +13 -4
  220. package/scripts/sw-oversight.sh +14 -5
  221. package/scripts/sw-patrol-meta.sh +334 -0
  222. package/scripts/sw-pipeline-composer.sh +5 -1
  223. package/scripts/sw-pipeline-vitals.sh +2 -1
  224. package/scripts/sw-pipeline.sh +53 -2664
  225. package/scripts/sw-pm.sh +12 -5
  226. package/scripts/sw-pr-lifecycle.sh +2 -1
  227. package/scripts/sw-predictive.sh +7 -1
  228. package/scripts/sw-prep.sh +185 -2
  229. package/scripts/sw-ps.sh +5 -25
  230. package/scripts/sw-public-dashboard.sh +15 -3
  231. package/scripts/sw-quality.sh +2 -1
  232. package/scripts/sw-reaper.sh +8 -25
  233. package/scripts/sw-recruit.sh +156 -2303
  234. package/scripts/sw-regression.sh +19 -12
  235. package/scripts/sw-release-manager.sh +3 -1
  236. package/scripts/sw-release.sh +4 -1
  237. package/scripts/sw-remote.sh +3 -1
  238. package/scripts/sw-replay.sh +7 -1
  239. package/scripts/sw-retro.sh +158 -1
  240. package/scripts/sw-review-rerun.sh +3 -1
  241. package/scripts/sw-scale.sh +10 -3
  242. package/scripts/sw-security-audit.sh +6 -1
  243. package/scripts/sw-self-optimize.sh +6 -3
  244. package/scripts/sw-session.sh +9 -3
  245. package/scripts/sw-setup.sh +3 -1
  246. package/scripts/sw-stall-detector.sh +406 -0
  247. package/scripts/sw-standup.sh +15 -7
  248. package/scripts/sw-status.sh +3 -1
  249. package/scripts/sw-strategic.sh +4 -1
  250. package/scripts/sw-stream.sh +7 -1
  251. package/scripts/sw-swarm.sh +18 -6
  252. package/scripts/sw-team-stages.sh +13 -6
  253. package/scripts/sw-templates.sh +5 -29
  254. package/scripts/sw-testgen.sh +7 -1
  255. package/scripts/sw-tmux-pipeline.sh +4 -1
  256. package/scripts/sw-tmux-role-color.sh +2 -0
  257. package/scripts/sw-tmux-status.sh +1 -1
  258. package/scripts/sw-tmux.sh +3 -1
  259. package/scripts/sw-trace.sh +3 -1
  260. package/scripts/sw-tracker-github.sh +3 -0
  261. package/scripts/sw-tracker-jira.sh +3 -0
  262. package/scripts/sw-tracker-linear.sh +3 -0
  263. package/scripts/sw-tracker.sh +3 -1
  264. package/scripts/sw-triage.sh +2 -1
  265. package/scripts/sw-upgrade.sh +3 -1
  266. package/scripts/sw-ux.sh +5 -2
  267. package/scripts/sw-webhook.sh +3 -1
  268. package/scripts/sw-widgets.sh +3 -1
  269. package/scripts/sw-worktree.sh +15 -3
  270. package/scripts/test-skill-injection.sh +1233 -0
  271. package/templates/pipelines/autonomous.json +27 -3
  272. package/templates/pipelines/cost-aware.json +34 -8
  273. package/templates/pipelines/deployed.json +12 -0
  274. package/templates/pipelines/enterprise.json +12 -0
  275. package/templates/pipelines/fast.json +6 -0
  276. package/templates/pipelines/full.json +27 -3
  277. package/templates/pipelines/hotfix.json +6 -0
  278. package/templates/pipelines/standard.json +12 -0
  279. package/templates/pipelines/tdd.json +12 -0
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/env bash
2
+ # ╔═══════════════════════════════════════════════════════════════════════════╗
3
+ # ║ shipwright context-budget — Context Window Budget Monitor ║
4
+ # ║ Proactive tracking and auto-summarization to prevent context blowout ║
5
+ # ╚═══════════════════════════════════════════════════════════════════════════╝
6
+
7
+ # Module guard
8
+ [[ -n "${_CONTEXT_BUDGET_LOADED:-}" ]] && return 0
9
+ _CONTEXT_BUDGET_LOADED=1
10
+
11
+ # ─── Initialization ──────────────────────────────────────────────────────────
12
+
13
+ context_budget_init() {
14
+ local total_budget="${1:-800000}"
15
+ local artifacts_dir="${2:-./.claude/pipeline-artifacts}"
16
+
17
+ # Create artifacts dir if needed
18
+ mkdir -p "$artifacts_dir" 2>/dev/null || true
19
+
20
+ # Calculate reserves
21
+ local system_reserve=$(( total_budget / 10 )) # 10% for system prompt
22
+ local tools_reserve=$(( total_budget / 10 )) # 10% for tool defs
23
+ local working_memory=$(( total_budget * 6 / 10 )) # 60% for working memory
24
+ local output_reserve=$(( total_budget / 5 )) # 20% for output
25
+
26
+ # Build JSON config
27
+ local config_json
28
+ config_json=$(cat <<EOF
29
+ {
30
+ "total_budget": $total_budget,
31
+ "system_reserve": $system_reserve,
32
+ "tools_reserve": $tools_reserve,
33
+ "working_memory": $working_memory,
34
+ "output_reserve": $output_reserve,
35
+ "initialized_at": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")",
36
+ "iterations_tracked": 0
37
+ }
38
+ EOF
39
+ )
40
+
41
+ # Write atomically
42
+ local tmp_file
43
+ tmp_file=$(mktemp "$artifacts_dir/context-budget.json.tmp.XXXXXX" 2>/dev/null) || tmp_file="/tmp/context-budget-$$.tmp"
44
+ echo "$config_json" > "$tmp_file" 2>/dev/null
45
+ mv "$tmp_file" "$artifacts_dir/context-budget.json" 2>/dev/null || return 1
46
+
47
+ return 0
48
+ }
49
+
50
+ # ─── Token Estimation ────────────────────────────────────────────────────────
51
+
52
+ context_budget_estimate() {
53
+ local prompt_content="${1:-}"
54
+ local context_dir="${2:-./.claude/pipeline-artifacts}"
55
+
56
+ # Estimate tokens from prompt (rough: chars / 4 = tokens)
57
+ local prompt_chars=${#prompt_content}
58
+ local prompt_tokens=$(( (prompt_chars + 3) / 4 ))
59
+
60
+ # Count context injections from various sources
61
+ local context_tokens=0
62
+ local injected_tokens=0
63
+
64
+ # Count memory context if present
65
+ if [[ -f "$context_dir/iteration-summaries.json" ]]; then
66
+ local mem_chars
67
+ mem_chars=$(wc -c < "$context_dir/iteration-summaries.json" 2>/dev/null || echo 0)
68
+ context_tokens=$(( context_tokens + mem_chars / 4 ))
69
+ fi
70
+
71
+ # Count progress.md
72
+ if [[ -f "$context_dir/progress.md" ]]; then
73
+ local prog_chars
74
+ prog_chars=$(wc -c < "$context_dir/progress.md" 2>/dev/null || echo 0)
75
+ injected_tokens=$(( injected_tokens + prog_chars / 4 ))
76
+ fi
77
+
78
+ # Count error summaries
79
+ if [[ -f "$context_dir/error-summary.json" ]]; then
80
+ local err_chars
81
+ err_chars=$(wc -c < "$context_dir/error-summary.json" 2>/dev/null || echo 0)
82
+ injected_tokens=$(( injected_tokens + err_chars / 4 ))
83
+ fi
84
+
85
+ # Load budget config
86
+ local total_budget=800000
87
+ if [[ -f "$context_dir/context-budget.json" ]] && command -v jq >/dev/null 2>&1; then
88
+ total_budget=$(jq -r '.total_budget // 800000' "$context_dir/context-budget.json" 2>/dev/null || echo 800000)
89
+ fi
90
+
91
+ local total_used=$(( prompt_tokens + context_tokens + injected_tokens ))
92
+ local remaining=$(( total_budget - total_used ))
93
+
94
+ # Build estimate JSON
95
+ cat <<EOF
96
+ {
97
+ "prompt_tokens": $prompt_tokens,
98
+ "context_tokens": $context_tokens,
99
+ "injected_tokens": $injected_tokens,
100
+ "total_used": $total_used,
101
+ "remaining_tokens": $remaining,
102
+ "budget": $total_budget,
103
+ "utilization_percent": $(( (total_used * 100) / total_budget ))
104
+ }
105
+ EOF
106
+ }
107
+
108
+ # ─── Status Checking ────────────────────────────────────────────────────────
109
+
110
+ context_budget_check() {
111
+ local estimate="${1:-}"
112
+
113
+ if [[ -z "$estimate" ]]; then
114
+ echo "{\"status\":\"error\",\"message\":\"No estimate provided\"}"
115
+ return 1
116
+ fi
117
+
118
+ local utilization
119
+ utilization=$(echo "$estimate" | jq -r '.utilization_percent // 0' 2>/dev/null || echo 0)
120
+
121
+ local status="green"
122
+ local action="continue"
123
+ local message="Context usage normal"
124
+
125
+ if [[ "$utilization" -ge 90 ]]; then
126
+ status="critical"
127
+ action="restart_session"
128
+ message="Context at critical level — prepare for session restart"
129
+ elif [[ "$utilization" -ge 80 ]]; then
130
+ status="red"
131
+ action="aggressive_trim"
132
+ message="Context usage high — trim non-essential context"
133
+ elif [[ "$utilization" -ge 60 ]]; then
134
+ status="yellow"
135
+ action="trim"
136
+ message="Context usage moderate — begin trimming"
137
+ fi
138
+
139
+ cat <<EOF
140
+ {
141
+ "status": "$status",
142
+ "utilization_percent": $utilization,
143
+ "action": "$action",
144
+ "message": "$message",
145
+ "estimate": $estimate
146
+ }
147
+ EOF
148
+ }
149
+
150
+ # ─── Context Trimming ────────────────────────────────────────────────────────
151
+
152
+ context_budget_trim() {
153
+ local content="${1:-}"
154
+ local status="${2:-green}"
155
+ local max_size="${3:-100000}"
156
+
157
+ local trimmed="$content"
158
+
159
+ # Green: no trimming
160
+ if [[ "$status" == "green" ]]; then
161
+ echo "$trimmed"
162
+ return 0
163
+ fi
164
+
165
+ # Yellow: remove duplicate errors, truncate memory
166
+ if [[ "$status" == "yellow" ]]; then
167
+ # Remove duplicate error lines (keep latest only)
168
+ trimmed=$(echo "$trimmed" | awk '
169
+ /Error:|ERROR:/{
170
+ if (seen[$0]) next
171
+ seen[$0] = 1
172
+ }
173
+ {print}
174
+ ')
175
+
176
+ # Truncate memory section to first 20K chars
177
+ trimmed=$(echo "$trimmed" | awk '
178
+ /## Memory Context/{mem=1; chars=0; print; next}
179
+ mem && /^## [^#]/{mem=0; print; next}
180
+ mem{chars+=length($0)+1; if(chars>20000){print "... (memory truncated)"; mem=0; next}}
181
+ {print}
182
+ ')
183
+ fi
184
+
185
+ # Red: aggressive trimming
186
+ if [[ "$status" == "red" ]]; then
187
+ # Remove DORA/performance baselines
188
+ trimmed=$(echo "$trimmed" | awk '/^## Performance Baselines/{skip=1; next} skip && /^## [^#]/{skip=0} !skip{print}')
189
+
190
+ # Remove old git log entries (keep last 5)
191
+ trimmed=$(echo "$trimmed" | awk '/^## Recent Git Activity/{p=1; c=0; next} p && /^## [^#]/{p=0; next} p{c++; if(c>5) next} {print}')
192
+
193
+ # Remove file hotspots (keep last 3)
194
+ trimmed=$(echo "$trimmed" | awk '/^## File Hotspots/{p=1; c=0; next} p && /^## [^#]/{p=0; next} p{c++; if(c>3) next} {print}')
195
+
196
+ # Truncate memory to first 10K chars
197
+ trimmed=$(echo "$trimmed" | awk '
198
+ /## Memory Context/{mem=1; chars=0; print; next}
199
+ mem && /^## [^#]/{mem=0; print; next}
200
+ mem{chars+=length($0)+1; if(chars>10000){print "... (memory heavily truncated)"; mem=0; next}}
201
+ {print}
202
+ ')
203
+
204
+ # Truncate test output to last 30 lines
205
+ trimmed=$(echo "$trimmed" | awk '
206
+ /^## Test Results/{found=1; buf=""; print; next}
207
+ found && /^## [^#]/{found=0; n=split(buf,arr,"\n"); start=(n>30)?(n-29):1; for(i=start;i<=n;i++) if(arr[i]!="") print arr[i]; print; next}
208
+ found{buf=buf $0 "\n"; next}
209
+ {print}
210
+ ')
211
+ fi
212
+
213
+ # Critical: hard truncate if still over budget
214
+ if [[ "${#trimmed}" -gt "$max_size" ]]; then
215
+ trimmed="${trimmed:0:$max_size}
216
+
217
+ ... [CONTEXT TRUNCATED FOR BUDGET]"
218
+ fi
219
+
220
+ echo "$trimmed"
221
+ }
222
+
223
+ # ─── Iteration Summarization ─────────────────────────────────────────────────
224
+
225
+ context_budget_summarize_iteration() {
226
+ local iteration_num="${1:-0}"
227
+ local log_file="${2:-}"
228
+ local test_result="${3:-}"
229
+ local artifacts_dir="${4:-./.claude/pipeline-artifacts}"
230
+
231
+ if [[ -z "$log_file" ]] || [[ ! -f "$log_file" ]]; then
232
+ return 1
233
+ fi
234
+
235
+ # Extract key info from iteration
236
+ local summary=""
237
+ local changes_made
238
+ changes_made=$(git diff --stat HEAD~1 2>/dev/null | tail -1 || echo "no changes")
239
+
240
+ # Get test status
241
+ local test_status="skipped"
242
+ if [[ -n "$test_result" ]]; then
243
+ if grep -q "FAILED\|failed\|✗" <<< "$test_result" 2>/dev/null; then
244
+ test_status="failed"
245
+ elif grep -q "PASSED\|passed\|✓" <<< "$test_result" 2>/dev/null; then
246
+ test_status="passed"
247
+ fi
248
+ fi
249
+
250
+ # Extract errors if any
251
+ local errors=""
252
+ if [[ "$test_status" == "failed" ]]; then
253
+ errors=$(grep -E "Error:|ERROR:|FAIL" "$log_file" 2>/dev/null | head -3 || true)
254
+ fi
255
+
256
+ # Build summary (keep under 500 chars)
257
+ summary="Iteration ${iteration_num}: $(echo "$changes_made" | tr '\n' ' ') | Tests: ${test_status}"
258
+ if [[ -n "$errors" ]]; then
259
+ summary="${summary} | Errors: $(echo "$errors" | cut -c1-100)"
260
+ fi
261
+
262
+ # Append to iteration-summaries.json
263
+ local summaries_file="$artifacts_dir/iteration-summaries.json"
264
+ local tmp_file
265
+ tmp_file=$(mktemp "$artifacts_dir/iteration-summaries.json.tmp.XXXXXX" 2>/dev/null) || tmp_file="/tmp/iteration-summaries-$$.tmp"
266
+
267
+ if [[ -f "$summaries_file" ]] && command -v jq >/dev/null 2>&1; then
268
+ # Append to existing array
269
+ jq --arg num "$iteration_num" \
270
+ --arg sum "$summary" \
271
+ --arg status "$test_status" \
272
+ '.iterations += [{iteration: ($num | tonumber), summary: $sum, test_status: $status, timestamp: now}]' \
273
+ "$summaries_file" > "$tmp_file" 2>/dev/null || echo "[]" > "$tmp_file"
274
+ else
275
+ # Create new array
276
+ cat > "$tmp_file" <<EOF
277
+ {
278
+ "iterations": [
279
+ {
280
+ "iteration": $iteration_num,
281
+ "summary": "$summary",
282
+ "test_status": "$test_status",
283
+ "timestamp": $(date +%s)
284
+ }
285
+ ]
286
+ }
287
+ EOF
288
+ fi
289
+
290
+ mv "$tmp_file" "$summaries_file" 2>/dev/null || return 1
291
+ return 0
292
+ }
293
+
294
+ # ─── Budget Report ──────────────────────────────────────────────────────────
295
+
296
+ context_budget_report() {
297
+ local artifacts_dir="${1:-./.claude/pipeline-artifacts}"
298
+
299
+ # Load budget config
300
+ local budget_json=""
301
+ if [[ -f "$artifacts_dir/context-budget.json" ]]; then
302
+ budget_json=$(cat "$artifacts_dir/context-budget.json" 2>/dev/null || echo "{}")
303
+ else
304
+ budget_json="{}"
305
+ fi
306
+
307
+ # Load iteration summaries
308
+ local summaries_json=""
309
+ if [[ -f "$artifacts_dir/iteration-summaries.json" ]] && command -v jq >/dev/null 2>&1; then
310
+ summaries_json=$(cat "$artifacts_dir/iteration-summaries.json" 2>/dev/null || echo "{}")
311
+ else
312
+ summaries_json="{\"iterations\":[]}"
313
+ fi
314
+
315
+ # Generate report
316
+ cat <<EOF
317
+ {
318
+ "budget_config": $budget_json,
319
+ "iteration_summaries": $summaries_json,
320
+ "report_generated_at": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
321
+ }
322
+ EOF
323
+ }
324
+
325
+ # ─── Integration Helpers ────────────────────────────────────────────────────
326
+
327
+ # Export a summary of context state for logging
328
+ context_budget_log_state() {
329
+ local estimate="${1:-}"
330
+ local status="${2:-}"
331
+ local artifacts_dir="${3:-./.claude/pipeline-artifacts}"
332
+
333
+ if [[ -z "$estimate" || -z "$status" ]]; then
334
+ return 1
335
+ fi
336
+
337
+ local utilization
338
+ utilization=$(echo "$estimate" | jq -r '.utilization_percent // 0' 2>/dev/null || echo 0)
339
+
340
+ local used_tokens
341
+ used_tokens=$(echo "$estimate" | jq -r '.total_used // 0' 2>/dev/null || echo 0)
342
+
343
+ local remaining
344
+ remaining=$(echo "$estimate" | jq -r '.remaining_tokens // 0' 2>/dev/null || echo 0)
345
+
346
+ # Log to context-budget-log.jsonl
347
+ local log_file="$artifacts_dir/context-budget-log.jsonl"
348
+ local tmp_file
349
+ tmp_file=$(mktemp "$artifacts_dir/context-budget-log.jsonl.tmp.XXXXXX" 2>/dev/null) || tmp_file="/tmp/context-budget-log-$$.tmp"
350
+
351
+ cat >> "$tmp_file" <<EOF
352
+ {"timestamp":"$(date -u +"%Y-%m-%dT%H:%M:%SZ")","status":"$(echo "$status" | jq -r '.status // "unknown"' 2>/dev/null)","utilization_percent":$utilization,"used_tokens":$used_tokens,"remaining_tokens":$remaining}
353
+ EOF
354
+
355
+ cat "$log_file" 2>/dev/null >> "$tmp_file" || true
356
+ mv "$tmp_file" "$log_file" 2>/dev/null || true
357
+ }
358
+
359
+ return 0