prizmkit 1.0.0 → 1.0.1

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 (89) hide show
  1. package/bundled/VERSION.json +5 -0
  2. package/bundled/adapters/claude/agent-adapter.js +108 -0
  3. package/bundled/adapters/claude/command-adapter.js +104 -0
  4. package/bundled/adapters/claude/paths.js +35 -0
  5. package/bundled/adapters/claude/rules-adapter.js +77 -0
  6. package/bundled/adapters/claude/settings-adapter.js +73 -0
  7. package/bundled/adapters/claude/team-adapter.js +183 -0
  8. package/bundled/adapters/codebuddy/agent-adapter.js +43 -0
  9. package/bundled/adapters/codebuddy/paths.js +29 -0
  10. package/bundled/adapters/codebuddy/settings-adapter.js +47 -0
  11. package/bundled/adapters/codebuddy/skill-adapter.js +68 -0
  12. package/bundled/adapters/codebuddy/team-adapter.js +46 -0
  13. package/bundled/adapters/shared/frontmatter.js +77 -0
  14. package/bundled/agents/prizm-dev-team-coordinator.md +142 -0
  15. package/bundled/agents/prizm-dev-team-dev.md +99 -0
  16. package/bundled/agents/prizm-dev-team-pm.md +114 -0
  17. package/bundled/agents/prizm-dev-team-reviewer.md +119 -0
  18. package/bundled/dev-pipeline/README.md +482 -0
  19. package/bundled/dev-pipeline/assets/feature-list-example.json +147 -0
  20. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +138 -0
  21. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +425 -0
  22. package/bundled/dev-pipeline/launch-daemon.sh +549 -0
  23. package/bundled/dev-pipeline/reset-feature.sh +209 -0
  24. package/bundled/dev-pipeline/retry-bug.sh +344 -0
  25. package/bundled/dev-pipeline/retry-feature.sh +338 -0
  26. package/bundled/dev-pipeline/run-bugfix.sh +638 -0
  27. package/bundled/dev-pipeline/run.sh +845 -0
  28. package/bundled/dev-pipeline/scripts/check-session-status.py +158 -0
  29. package/bundled/dev-pipeline/scripts/detect-stuck.py +385 -0
  30. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +598 -0
  31. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +402 -0
  32. package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +294 -0
  33. package/bundled/dev-pipeline/scripts/init-dev-team.py +134 -0
  34. package/bundled/dev-pipeline/scripts/init-pipeline.py +335 -0
  35. package/bundled/dev-pipeline/scripts/update-bug-status.py +748 -0
  36. package/bundled/dev-pipeline/scripts/update-feature-status.py +1076 -0
  37. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +262 -0
  38. package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +159 -0
  39. package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +291 -0
  40. package/bundled/dev-pipeline/templates/feature-list-schema.json +112 -0
  41. package/bundled/dev-pipeline/templates/session-status-schema.json +77 -0
  42. package/bundled/skills/_metadata.json +267 -0
  43. package/bundled/skills/app-planner/SKILL.md +580 -0
  44. package/bundled/skills/app-planner/assets/planning-guide.md +313 -0
  45. package/bundled/skills/app-planner/scripts/validate-and-generate.py +758 -0
  46. package/bundled/skills/bug-planner/SKILL.md +235 -0
  47. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +252 -0
  48. package/bundled/skills/dev-pipeline-launcher/SKILL.md +223 -0
  49. package/bundled/skills/prizm-kit/SKILL.md +151 -0
  50. package/bundled/skills/prizm-kit/assets/claude-md-template.md +38 -0
  51. package/bundled/skills/prizm-kit/assets/codebuddy-md-template.md +35 -0
  52. package/bundled/skills/prizm-kit/assets/hooks/prizm-commit-hook.json +15 -0
  53. package/bundled/skills/prizmkit-adr-manager/SKILL.md +68 -0
  54. package/bundled/skills/prizmkit-adr-manager/assets/adr-template.md +26 -0
  55. package/bundled/skills/prizmkit-analyze/SKILL.md +194 -0
  56. package/bundled/skills/prizmkit-api-doc-generator/SKILL.md +56 -0
  57. package/bundled/skills/prizmkit-bug-fix-workflow/SKILL.md +351 -0
  58. package/bundled/skills/prizmkit-bug-reproducer/SKILL.md +62 -0
  59. package/bundled/skills/prizmkit-ci-cd-generator/SKILL.md +54 -0
  60. package/bundled/skills/prizmkit-clarify/SKILL.md +52 -0
  61. package/bundled/skills/prizmkit-code-review/SKILL.md +70 -0
  62. package/bundled/skills/prizmkit-committer/SKILL.md +117 -0
  63. package/bundled/skills/prizmkit-db-migration/SKILL.md +65 -0
  64. package/bundled/skills/prizmkit-dependency-health/SKILL.md +123 -0
  65. package/bundled/skills/prizmkit-deployment-strategy/SKILL.md +58 -0
  66. package/bundled/skills/prizmkit-error-triage/SKILL.md +55 -0
  67. package/bundled/skills/prizmkit-implement/SKILL.md +47 -0
  68. package/bundled/skills/prizmkit-init/SKILL.md +156 -0
  69. package/bundled/skills/prizmkit-log-analyzer/SKILL.md +55 -0
  70. package/bundled/skills/prizmkit-monitoring-setup/SKILL.md +75 -0
  71. package/bundled/skills/prizmkit-onboarding-generator/SKILL.md +70 -0
  72. package/bundled/skills/prizmkit-perf-profiler/SKILL.md +55 -0
  73. package/bundled/skills/prizmkit-plan/SKILL.md +54 -0
  74. package/bundled/skills/prizmkit-plan/assets/plan-template.md +37 -0
  75. package/bundled/skills/prizmkit-prizm-docs/SKILL.md +140 -0
  76. package/bundled/skills/prizmkit-prizm-docs/assets/PRIZM-SPEC.md +943 -0
  77. package/bundled/skills/prizmkit-retrospective/SKILL.md +79 -0
  78. package/bundled/skills/prizmkit-security-audit/SKILL.md +130 -0
  79. package/bundled/skills/prizmkit-specify/SKILL.md +52 -0
  80. package/bundled/skills/prizmkit-specify/assets/spec-template.md +37 -0
  81. package/bundled/skills/prizmkit-summarize/SKILL.md +51 -0
  82. package/bundled/skills/prizmkit-summarize/assets/registry-template.md +18 -0
  83. package/bundled/skills/prizmkit-tasks/SKILL.md +50 -0
  84. package/bundled/skills/prizmkit-tasks/assets/tasks-template.md +21 -0
  85. package/bundled/skills/prizmkit-tech-debt-tracker/SKILL.md +139 -0
  86. package/bundled/team/prizm-dev-team.json +47 -0
  87. package/bundled/templates/claude-md-template.md +38 -0
  88. package/bundled/templates/codebuddy-md-template.md +35 -0
  89. package/package.json +2 -1
@@ -0,0 +1,338 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # ============================================================
5
+ # dev-pipeline/retry-feature.sh - Retry a single failed feature
6
+ #
7
+ # Runs exactly ONE AI CLI session for the specified feature, then exits.
8
+ # Use this to manually retry a failed feature without restarting
9
+ # the full pipeline.
10
+ #
11
+ # Usage:
12
+ # ./retry-feature.sh <feature-id> [feature-list.json]
13
+ #
14
+ # Examples:
15
+ # ./retry-feature.sh F-007
16
+ # ./retry-feature.sh F-007 feature-list.json
17
+ # SESSION_TIMEOUT=3600 ./retry-feature.sh F-007 # with 1h timeout
18
+ # ============================================================
19
+
20
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
21
+ STATE_DIR="$SCRIPT_DIR/state"
22
+ SCRIPTS_DIR="$SCRIPT_DIR/scripts"
23
+
24
+ SESSION_TIMEOUT=${SESSION_TIMEOUT:-0}
25
+ HEARTBEAT_INTERVAL=${HEARTBEAT_INTERVAL:-30}
26
+
27
+ # AI CLI detection: AI_CLI > CODEBUDDY_CLI > auto-detect
28
+ if [[ -n "${AI_CLI:-}" ]]; then
29
+ CLI_CMD="$AI_CLI"
30
+ elif [[ -n "${CODEBUDDY_CLI:-}" ]]; then
31
+ CLI_CMD="$CODEBUDDY_CLI"
32
+ elif command -v cbc &>/dev/null; then
33
+ CLI_CMD="cbc"
34
+ elif command -v claude &>/dev/null; then
35
+ CLI_CMD="claude"
36
+ else
37
+ echo "ERROR: No AI CLI found. Install CodeBuddy (cbc) or Claude Code (claude)." >&2
38
+ exit 1
39
+ fi
40
+
41
+ # Platform detection
42
+ if [[ -n "${PRIZMKIT_PLATFORM:-}" ]]; then
43
+ PLATFORM="$PRIZMKIT_PLATFORM"
44
+ elif [[ "$CLI_CMD" == *"claude"* ]]; then
45
+ PLATFORM="claude"
46
+ else
47
+ PLATFORM="codebuddy"
48
+ fi
49
+ export PRIZMKIT_PLATFORM="$PLATFORM"
50
+
51
+ # Colors
52
+ RED='\033[0;31m'
53
+ GREEN='\033[0;32m'
54
+ YELLOW='\033[1;33m'
55
+ BLUE='\033[0;34m'
56
+ BOLD='\033[1m'
57
+ NC='\033[0m'
58
+
59
+ log_info() { echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $*"; }
60
+ log_warn() { echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $*"; }
61
+ log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $*"; }
62
+ log_success() { echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') $*"; }
63
+
64
+ # ============================================================
65
+ # Args
66
+ # ============================================================
67
+
68
+ if [[ $# -lt 1 ]]; then
69
+ echo "Usage: $0 <feature-id> [feature-list.json]"
70
+ echo ""
71
+ echo " feature-id Feature to retry (e.g. F-007)"
72
+ echo " feature-list.json Path to feature list (default: feature-list.json)"
73
+ echo ""
74
+ echo "Environment Variables:"
75
+ echo " SESSION_TIMEOUT Timeout in seconds (default: 0 = no limit)"
76
+ echo " HEARTBEAT_INTERVAL Heartbeat interval in seconds (default: 30)"
77
+ echo " AI_CLI AI CLI command (auto-detected: cbc or claude)"
78
+ exit 1
79
+ fi
80
+
81
+ FEATURE_ID="$1"
82
+ FEATURE_LIST="${2:-feature-list.json}"
83
+
84
+ # Resolve absolute path
85
+ if [[ ! "$FEATURE_LIST" = /* ]]; then
86
+ FEATURE_LIST="$(pwd)/$FEATURE_LIST"
87
+ fi
88
+
89
+ # ============================================================
90
+ # Validation
91
+ # ============================================================
92
+
93
+ if [[ ! -f "$FEATURE_LIST" ]]; then
94
+ log_error "Feature list not found: $FEATURE_LIST"
95
+ exit 1
96
+ fi
97
+
98
+ if [[ ! -f "$STATE_DIR/pipeline.json" ]]; then
99
+ log_error "No pipeline state found. Run './run.sh run' first to initialize."
100
+ exit 1
101
+ fi
102
+
103
+ if ! command -v jq &>/dev/null; then
104
+ log_error "jq is required. Install with: brew install jq"
105
+ exit 1
106
+ fi
107
+
108
+ # Verify feature exists in feature list
109
+ FEATURE_TITLE=$(python3 -c "
110
+ import json, sys
111
+ with open('$FEATURE_LIST') as f:
112
+ data = json.load(f)
113
+ for feat in data.get('features', []):
114
+ if feat.get('id') == '$FEATURE_ID':
115
+ print(feat.get('title', ''))
116
+ sys.exit(0)
117
+ sys.exit(1)
118
+ " 2>/dev/null) || {
119
+ log_error "Feature $FEATURE_ID not found in $FEATURE_LIST"
120
+ exit 1
121
+ }
122
+
123
+ # ============================================================
124
+ # Clean feature artifacts + reset status for a full restart
125
+ # ============================================================
126
+
127
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
128
+ FEATURE_SLUG=$(FEATURE_ID="$FEATURE_ID" FEATURE_TITLE="$FEATURE_TITLE" python3 -c "
129
+ import os, re
130
+ fid = os.environ['FEATURE_ID'].replace('F-', '').replace('f-', '').zfill(3)
131
+ title = os.environ.get('FEATURE_TITLE', '').lower()
132
+ title = re.sub(r'[^a-z0-9\s-]', '', title)
133
+ title = re.sub(r'[\s]+', '-', title.strip())
134
+ title = re.sub(r'-+', '-', title).strip('-') or 'feature'
135
+ print(f'{fid}-{title}')
136
+ " 2>/dev/null)
137
+
138
+ log_info "Cleaning $FEATURE_ID artifacts for full restart..."
139
+ python3 "$SCRIPTS_DIR/update-feature-status.py" \
140
+ --feature-list "$FEATURE_LIST" \
141
+ --state-dir "$STATE_DIR" \
142
+ --feature-id "$FEATURE_ID" \
143
+ --feature-slug "$FEATURE_SLUG" \
144
+ --project-root "$PROJECT_ROOT" \
145
+ --action clean >/dev/null 2>&1 || {
146
+ log_warn "Failed to clean feature artifacts (continuing with fresh session only)"
147
+ }
148
+
149
+ # ============================================================
150
+ # Generate bootstrap prompt
151
+ # ============================================================
152
+
153
+ RUN_ID=$(jq -r '.run_id' "$STATE_DIR/pipeline.json")
154
+ SESSION_ID="${FEATURE_ID}-$(date +%Y%m%d%H%M%S)"
155
+ SESSION_DIR="$STATE_DIR/features/$FEATURE_ID/sessions/$SESSION_ID"
156
+ mkdir -p "$SESSION_DIR/logs"
157
+
158
+ BOOTSTRAP_PROMPT="$SESSION_DIR/bootstrap-prompt.md"
159
+
160
+ log_info "Generating bootstrap prompt..."
161
+ python3 "$SCRIPTS_DIR/generate-bootstrap-prompt.py" \
162
+ --feature-list "$FEATURE_LIST" \
163
+ --feature-id "$FEATURE_ID" \
164
+ --session-id "$SESSION_ID" \
165
+ --run-id "$RUN_ID" \
166
+ --retry-count 0 \
167
+ --resume-phase "null" \
168
+ --state-dir "$STATE_DIR" \
169
+ --output "$BOOTSTRAP_PROMPT" >/dev/null 2>&1
170
+
171
+ # ============================================================
172
+ # Run single AI CLI session
173
+ # ============================================================
174
+
175
+ echo ""
176
+ echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
177
+ echo -e "${BOLD} Retry: $FEATURE_ID — $FEATURE_TITLE${NC}"
178
+ echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
179
+ log_info "CLI: $CLI_CMD (platform: $PLATFORM)"
180
+ if [[ $SESSION_TIMEOUT -gt 0 ]]; then
181
+ log_info "Session timeout: ${SESSION_TIMEOUT}s"
182
+ else
183
+ log_info "Session timeout: none"
184
+ fi
185
+ log_info "Prompt: $BOOTSTRAP_PROMPT"
186
+ log_info "Log: $SESSION_DIR/logs/session.log"
187
+ echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
188
+ echo ""
189
+
190
+ SESSION_LOG="$SESSION_DIR/logs/session.log"
191
+
192
+ # Spawn AI CLI session
193
+ case "$CLI_CMD" in
194
+ *claude*)
195
+ "$CLI_CMD" \
196
+ --print \
197
+ -p "$(cat "$BOOTSTRAP_PROMPT")" \
198
+ --yes \
199
+ > "$SESSION_LOG" 2>&1 &
200
+ ;;
201
+ *)
202
+ "$CLI_CMD" \
203
+ --print \
204
+ -y \
205
+ < "$BOOTSTRAP_PROMPT" \
206
+ > "$SESSION_LOG" 2>&1 &
207
+ ;;
208
+ esac
209
+ CBC_PID=$!
210
+
211
+ # Timeout watchdog (only if SESSION_TIMEOUT > 0)
212
+ WATCHER_PID=""
213
+ if [[ $SESSION_TIMEOUT -gt 0 ]]; then
214
+ ( sleep "$SESSION_TIMEOUT" && kill -TERM "$CBC_PID" 2>/dev/null ) &
215
+ WATCHER_PID=$!
216
+ fi
217
+
218
+ # Heartbeat
219
+ (
220
+ elapsed=0
221
+ prev_size=0
222
+ while kill -0 "$CBC_PID" 2>/dev/null; do
223
+ sleep "$HEARTBEAT_INTERVAL"
224
+ elapsed=$((elapsed + HEARTBEAT_INTERVAL))
225
+ kill -0 "$CBC_PID" 2>/dev/null || break
226
+
227
+ cur_size=0
228
+ if [[ -f "$SESSION_LOG" ]]; then
229
+ cur_size=$(wc -c < "$SESSION_LOG" 2>/dev/null || echo 0)
230
+ cur_size=$(echo "$cur_size" | tr -d ' ')
231
+ fi
232
+
233
+ growth=$((cur_size - prev_size))
234
+ prev_size=$cur_size
235
+
236
+ if [[ $cur_size -gt 1048576 ]]; then
237
+ size_display="$((cur_size / 1048576))MB"
238
+ elif [[ $cur_size -gt 1024 ]]; then
239
+ size_display="$((cur_size / 1024))KB"
240
+ else
241
+ size_display="${cur_size}B"
242
+ fi
243
+
244
+ mins=$((elapsed / 60))
245
+ secs=$((elapsed % 60))
246
+
247
+ last_activity=""
248
+ if [[ -f "$SESSION_LOG" ]]; then
249
+ last_activity=$(tail -20 "$SESSION_LOG" 2>/dev/null | grep -v '^$' | tail -1 | cut -c1-80 || echo "")
250
+ fi
251
+
252
+ if [[ $growth -gt 0 ]]; then
253
+ icon="${GREEN}▶${NC}"
254
+ else
255
+ icon="${YELLOW}⏸${NC}"
256
+ fi
257
+
258
+ echo -e " ${icon} ${BLUE}[HEARTBEAT]${NC} ${mins}m${secs}s | log: ${size_display} (+${growth}B) | ${last_activity}"
259
+ done
260
+ ) &
261
+ HEARTBEAT_PID=$!
262
+
263
+ # Ctrl+C cleanup
264
+ cleanup() {
265
+ echo ""
266
+ log_warn "Interrupted. Killing session..."
267
+ kill "$CBC_PID" 2>/dev/null || true
268
+ [[ -n "$WATCHER_PID" ]] && kill "$WATCHER_PID" 2>/dev/null || true
269
+ kill "$HEARTBEAT_PID" 2>/dev/null || true
270
+ wait "$CBC_PID" 2>/dev/null || true
271
+ [[ -n "$WATCHER_PID" ]] && wait "$WATCHER_PID" 2>/dev/null || true
272
+ wait "$HEARTBEAT_PID" 2>/dev/null || true
273
+ log_info "Session log: $SESSION_LOG"
274
+ exit 130
275
+ }
276
+ trap cleanup SIGINT SIGTERM
277
+
278
+ # Wait
279
+ EXIT_CODE=0
280
+ if wait "$CBC_PID" 2>/dev/null; then
281
+ EXIT_CODE=0
282
+ else
283
+ EXIT_CODE=$?
284
+ fi
285
+
286
+ # Cleanup background processes
287
+ [[ -n "$WATCHER_PID" ]] && kill "$WATCHER_PID" 2>/dev/null || true
288
+ kill "$HEARTBEAT_PID" 2>/dev/null || true
289
+ [[ -n "$WATCHER_PID" ]] && wait "$WATCHER_PID" 2>/dev/null || true
290
+ wait "$HEARTBEAT_PID" 2>/dev/null || true
291
+
292
+ [[ $EXIT_CODE -eq 143 ]] && EXIT_CODE=124
293
+
294
+ # ============================================================
295
+ # Check result
296
+ # ============================================================
297
+
298
+ echo ""
299
+ if [[ -f "$SESSION_LOG" ]]; then
300
+ FINAL_LINES=$(wc -l < "$SESSION_LOG" 2>/dev/null | tr -d ' ')
301
+ FINAL_SIZE=$(wc -c < "$SESSION_LOG" 2>/dev/null | tr -d ' ')
302
+ log_info "Session log: $FINAL_LINES lines, $((FINAL_SIZE / 1024))KB"
303
+ fi
304
+
305
+ SESSION_STATUS_FILE="$SESSION_DIR/session-status.json"
306
+
307
+ if [[ $EXIT_CODE -eq 124 ]]; then
308
+ log_warn "Session timed out after ${SESSION_TIMEOUT}s"
309
+ SESSION_STATUS="timed_out"
310
+ elif [[ -f "$SESSION_STATUS_FILE" ]]; then
311
+ SESSION_STATUS=$(python3 "$SCRIPTS_DIR/check-session-status.py" \
312
+ --status-file "$SESSION_STATUS_FILE" 2>/dev/null) || SESSION_STATUS="crashed"
313
+ else
314
+ log_warn "Session ended without status file"
315
+ SESSION_STATUS="crashed"
316
+ fi
317
+
318
+ # Update feature status
319
+ python3 "$SCRIPTS_DIR/update-feature-status.py" \
320
+ --feature-list "$FEATURE_LIST" \
321
+ --state-dir "$STATE_DIR" \
322
+ --feature-id "$FEATURE_ID" \
323
+ --session-status "$SESSION_STATUS" \
324
+ --session-id "$SESSION_ID" \
325
+ --max-retries 999 \
326
+ --action update >/dev/null 2>&1 || true
327
+
328
+ echo ""
329
+ if [[ "$SESSION_STATUS" == "success" ]]; then
330
+ log_success "════════════════════════════════════════════════════"
331
+ log_success " $FEATURE_ID completed successfully!"
332
+ log_success "════════════════════════════════════════════════════"
333
+ else
334
+ log_error "════════════════════════════════════════════════════"
335
+ log_error " $FEATURE_ID result: $SESSION_STATUS"
336
+ log_error " Review log: $SESSION_LOG"
337
+ log_error "════════════════════════════════════════════════════"
338
+ fi