prizmkit 1.1.7 → 1.1.9
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/bundled/VERSION.json +3 -3
- package/bundled/adapters/codebuddy/skill-adapter.js +21 -7
- package/bundled/agents/prizm-dev-team-reviewer.md +53 -173
- package/bundled/dev-pipeline/.env.example +45 -0
- package/bundled/dev-pipeline/README.md +64 -64
- package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +535 -0
- package/bundled/dev-pipeline/assets/feature-list-example.json +0 -1
- package/bundled/dev-pipeline/launch-bugfix-daemon.sh +64 -18
- package/bundled/dev-pipeline/launch-feature-daemon.sh +15 -12
- package/bundled/dev-pipeline/launch-refactor-daemon.sh +64 -18
- package/bundled/dev-pipeline/lib/branch.sh +6 -1
- package/bundled/dev-pipeline/lib/common.sh +71 -0
- package/bundled/dev-pipeline/lib/heartbeat.sh +2 -2
- package/bundled/dev-pipeline/reset-bug.sh +10 -9
- package/bundled/dev-pipeline/reset-feature.sh +9 -8
- package/bundled/dev-pipeline/reset-refactor.sh +10 -9
- package/bundled/dev-pipeline/retry-bugfix.sh +67 -29
- package/bundled/dev-pipeline/retry-feature.sh +54 -18
- package/bundled/dev-pipeline/retry-refactor.sh +112 -29
- package/bundled/dev-pipeline/run-bugfix.sh +281 -59
- package/bundled/dev-pipeline/run-feature.sh +53 -18
- package/bundled/dev-pipeline/run-refactor.sh +392 -66
- package/bundled/dev-pipeline/scripts/check-session-status.py +24 -1
- package/bundled/dev-pipeline/scripts/cleanup-logs.py +2 -2
- package/bundled/dev-pipeline/scripts/detect-stuck.py +195 -85
- package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +57 -33
- package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +25 -9
- package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +104 -17
- package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +34 -9
- package/bundled/dev-pipeline/scripts/init-pipeline.py +10 -10
- package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +19 -8
- package/bundled/dev-pipeline/scripts/parse-stream-progress.py +1 -5
- package/bundled/dev-pipeline/scripts/patch-completion-notes.py +191 -0
- package/bundled/dev-pipeline/scripts/update-bug-status.py +167 -22
- package/bundled/dev-pipeline/scripts/update-feature-status.py +104 -62
- package/bundled/dev-pipeline/scripts/update-refactor-status.py +351 -21
- package/bundled/dev-pipeline/templates/agent-prompts/dev-fix.md +1 -1
- package/bundled/dev-pipeline/templates/agent-prompts/reviewer-review.md +7 -11
- package/bundled/dev-pipeline/templates/bootstrap-prompt.md +41 -7
- package/bundled/dev-pipeline/templates/bootstrap-tier1.md +27 -3
- package/bundled/dev-pipeline/templates/bootstrap-tier2.md +43 -19
- package/bundled/dev-pipeline/templates/bootstrap-tier3.md +54 -26
- package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +6 -15
- package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +36 -25
- package/bundled/dev-pipeline/templates/feature-list-schema.json +109 -31
- package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +270 -0
- package/bundled/dev-pipeline/templates/refactor-list-schema.json +11 -3
- package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +3 -1
- package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +1 -0
- package/bundled/dev-pipeline/templates/sections/feature-context.md +2 -0
- package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +29 -2
- package/bundled/dev-pipeline/templates/sections/phase-commit.md +22 -0
- package/bundled/dev-pipeline/templates/sections/phase-deploy-verification.md +2 -2
- package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +8 -6
- package/bundled/dev-pipeline/templates/sections/phase-review-full.md +7 -5
- package/bundled/dev-pipeline/templates/sections/phase-specify-plan-full.md +3 -3
- package/bundled/skills/_metadata.json +5 -22
- package/bundled/skills/app-planner/SKILL.md +98 -72
- package/bundled/skills/app-planner/assets/app-design-guide.md +1 -1
- package/bundled/skills/app-planner/references/architecture-decisions.md +1 -1
- package/bundled/skills/app-planner/references/project-brief-guide.md +69 -66
- package/bundled/skills/bug-fix-workflow/SKILL.md +52 -9
- package/bundled/skills/bug-planner/SKILL.md +139 -197
- package/bundled/skills/bug-planner/assets/bug-confirmation-template.md +43 -0
- package/bundled/skills/bug-planner/references/critic-and-verification.md +44 -0
- package/bundled/skills/bug-planner/references/error-recovery.md +73 -0
- package/bundled/skills/bug-planner/references/input-formats.md +53 -0
- package/bundled/skills/bug-planner/references/schema-validation.md +25 -0
- package/bundled/skills/bug-planner/references/severity-rules.md +16 -0
- package/bundled/skills/bug-planner/scripts/validate-bug-list.py +4 -8
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +34 -39
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +49 -36
- package/bundled/skills/feature-pipeline-launcher/scripts/preflight-check.py +3 -3
- package/bundled/skills/feature-planner/SKILL.md +53 -142
- package/bundled/skills/feature-planner/assets/evaluation-guide.md +1 -1
- package/bundled/skills/feature-planner/assets/planning-guide.md +21 -5
- package/bundled/skills/feature-planner/references/browser-interaction.md +2 -4
- package/bundled/skills/feature-planner/references/completeness-review.md +57 -0
- package/bundled/skills/feature-planner/references/error-recovery.md +16 -35
- package/bundled/skills/feature-planner/references/incremental-feature-planning.md +1 -1
- package/bundled/skills/feature-planner/references/new-project-planning.md +2 -2
- package/bundled/skills/feature-planner/scripts/validate-and-generate.py +19 -20
- package/bundled/skills/feature-workflow/SKILL.md +24 -25
- package/bundled/skills/prizm-kit/SKILL.md +39 -49
- package/bundled/skills/prizmkit-code-review/SKILL.md +51 -64
- package/bundled/skills/prizmkit-code-review/rules/dimensions.md +85 -0
- package/bundled/skills/prizmkit-code-review/rules/fix-strategy.md +11 -11
- package/bundled/skills/prizmkit-committer/SKILL.md +3 -31
- package/bundled/skills/prizmkit-deploy/SKILL.md +34 -31
- package/bundled/skills/prizmkit-deploy/assets/deploy-template.md +1 -1
- package/bundled/skills/prizmkit-implement/SKILL.md +35 -68
- package/bundled/skills/prizmkit-init/SKILL.md +112 -65
- package/bundled/skills/prizmkit-init/assets/project-brief-template.md +82 -0
- package/bundled/skills/prizmkit-plan/SKILL.md +120 -79
- package/bundled/skills/prizmkit-plan/assets/plan-template.md +28 -18
- package/bundled/skills/prizmkit-plan/assets/spec-template.md +28 -11
- package/bundled/skills/prizmkit-plan/references/clarify-guide.md +3 -3
- package/bundled/skills/prizmkit-plan/references/verification-checklist.md +60 -0
- package/bundled/skills/prizmkit-prizm-docs/SKILL.md +10 -81
- package/bundled/skills/prizmkit-prizm-docs/assets/{PRIZM-SPEC.md → prizm-docs-format.md} +41 -526
- package/bundled/skills/prizmkit-prizm-docs/references/op-init.md +46 -0
- package/bundled/skills/prizmkit-prizm-docs/references/op-rebuild.md +16 -0
- package/bundled/skills/prizmkit-prizm-docs/references/op-status.md +14 -0
- package/bundled/skills/prizmkit-prizm-docs/references/op-update.md +19 -0
- package/bundled/skills/prizmkit-prizm-docs/references/op-validate.md +17 -0
- package/bundled/skills/prizmkit-retrospective/SKILL.md +27 -65
- package/bundled/skills/prizmkit-retrospective/references/knowledge-injection-steps.md +3 -4
- package/bundled/skills/prizmkit-retrospective/references/structural-sync-steps.md +7 -25
- package/bundled/skills/recovery-workflow/SKILL.md +22 -22
- package/bundled/skills/recovery-workflow/evals/evals.json +5 -5
- package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +43 -10
- package/bundled/skills/refactor-pipeline-launcher/SKILL.md +48 -40
- package/bundled/skills/refactor-planner/SKILL.md +43 -61
- package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +17 -17
- package/bundled/skills/refactor-workflow/SKILL.md +23 -24
- package/bundled/team/prizm-dev-team.json +1 -1
- package/bundled/{skills/prizm-kit/assets → templates}/project-memory-template.md +1 -1
- package/package.json +1 -1
- package/src/clean.js +3 -4
- package/src/gitignore-template.js +7 -9
- package/src/scaffold.js +14 -5
- package/bundled/dev-pipeline/templates/agent-prompts/reviewer-analyze.md +0 -5
- package/bundled/dev-pipeline/templates/sections/phase-analyze-agent.md +0 -19
- package/bundled/dev-pipeline/templates/sections/phase-analyze-full.md +0 -19
- package/bundled/skills/app-planner/references/project-conventions.md +0 -93
- package/bundled/skills/prizmkit-analyze/SKILL.md +0 -207
- package/bundled/skills/prizmkit-code-review/rules/dimensions-bugfix.md +0 -25
- package/bundled/skills/prizmkit-code-review/rules/dimensions-feature.md +0 -43
- package/bundled/skills/prizmkit-code-review/rules/dimensions-refactor.md +0 -25
- package/bundled/skills/prizmkit-implement/references/deploy-guide-protocol.md +0 -69
- package/bundled/skills/prizmkit-verify/SKILL.md +0 -281
- package/bundled/skills/prizmkit-verify/scripts/verify-light.py +0 -402
|
@@ -5,12 +5,12 @@ set -euo pipefail
|
|
|
5
5
|
# dev-pipeline/run-bugfix.sh - Autonomous Bug Fix Pipeline Runner
|
|
6
6
|
#
|
|
7
7
|
# Drives the prizm-dev-team through iterative AI CLI sessions to
|
|
8
|
-
# fix bugs from a bug-fix-list.json specification.
|
|
8
|
+
# fix bugs from a .prizmkit/plans/bug-fix-list.json specification.
|
|
9
9
|
#
|
|
10
10
|
# Usage:
|
|
11
|
-
# ./run-bugfix.sh run [bug-fix-list.json] Run all bugs
|
|
11
|
+
# ./run-bugfix.sh run [.prizmkit/plans/bug-fix-list.json] Run all bugs
|
|
12
12
|
# ./run-bugfix.sh run <bug-id> [options] Run a single bug
|
|
13
|
-
# ./run-bugfix.sh status [bug-fix-list.json] Show pipeline status
|
|
13
|
+
# ./run-bugfix.sh status [.prizmkit/plans/bug-fix-list.json] Show pipeline status
|
|
14
14
|
# ./run-bugfix.sh reset Clear all state
|
|
15
15
|
#
|
|
16
16
|
# Environment Variables:
|
|
@@ -30,7 +30,8 @@ set -euo pipefail
|
|
|
30
30
|
# ============================================================
|
|
31
31
|
|
|
32
32
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
33
|
-
|
|
33
|
+
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
34
|
+
STATE_DIR="${PROJECT_ROOT}/.prizmkit/state/bugfix"
|
|
34
35
|
SCRIPTS_DIR="$SCRIPT_DIR/scripts"
|
|
35
36
|
|
|
36
37
|
# Configuration
|
|
@@ -42,6 +43,7 @@ LOG_CLEANUP_ENABLED=${LOG_CLEANUP_ENABLED:-1}
|
|
|
42
43
|
LOG_RETENTION_DAYS=${LOG_RETENTION_DAYS:-14}
|
|
43
44
|
LOG_MAX_TOTAL_MB=${LOG_MAX_TOTAL_MB:-1024}
|
|
44
45
|
VERBOSE=${VERBOSE:-0}
|
|
46
|
+
MODEL=${MODEL:-""}
|
|
45
47
|
DEV_BRANCH=${DEV_BRANCH:-""}
|
|
46
48
|
AUTO_PUSH=${AUTO_PUSH:-0}
|
|
47
49
|
|
|
@@ -76,7 +78,8 @@ spawn_and_wait_session() {
|
|
|
76
78
|
local bootstrap_prompt="$4"
|
|
77
79
|
local session_dir="$5"
|
|
78
80
|
local max_retries="$6"
|
|
79
|
-
local
|
|
81
|
+
local item_model="${7:-}"
|
|
82
|
+
local base_branch="${8:-main}"
|
|
80
83
|
|
|
81
84
|
local session_log="$session_dir/logs/session.log"
|
|
82
85
|
local progress_json="$session_dir/logs/progress.json"
|
|
@@ -94,7 +97,9 @@ spawn_and_wait_session() {
|
|
|
94
97
|
fi
|
|
95
98
|
|
|
96
99
|
local model_flag=""
|
|
97
|
-
if [[ -n "$
|
|
100
|
+
if [[ -n "$item_model" ]]; then
|
|
101
|
+
model_flag="--model $item_model"
|
|
102
|
+
elif [[ -n "${MODEL:-}" ]]; then
|
|
98
103
|
model_flag="--model $MODEL"
|
|
99
104
|
fi
|
|
100
105
|
|
|
@@ -102,6 +107,9 @@ spawn_and_wait_session() {
|
|
|
102
107
|
# within an existing Claude Code session (e.g. via launch-bugfix-daemon.sh).
|
|
103
108
|
unset CLAUDECODE 2>/dev/null || true
|
|
104
109
|
|
|
110
|
+
# Log bootstrap prompt in test mode
|
|
111
|
+
prizm_log_bootstrap_prompt "$bootstrap_prompt" "$bug_id"
|
|
112
|
+
|
|
105
113
|
case "$CLI_CMD" in
|
|
106
114
|
*claude*)
|
|
107
115
|
# Claude Code: prompt via -p, --dangerously-skip-permissions for auto-accept
|
|
@@ -272,7 +280,7 @@ sys.exit(0)
|
|
|
272
280
|
--max-retries "$max_retries" \
|
|
273
281
|
--action update >/dev/null 2>&1 || true
|
|
274
282
|
|
|
275
|
-
# Commit bug-fix-list.json status update (pipeline management commit)
|
|
283
|
+
# Commit .prizmkit/plans/bug-fix-list.json status update (pipeline management commit)
|
|
276
284
|
if ! git -C "$project_root" diff --quiet "$bug_list" 2>/dev/null; then
|
|
277
285
|
git -C "$project_root" add "$bug_list"
|
|
278
286
|
git -C "$project_root" commit --no-verify -m "chore($bug_id): update bug status" 2>/dev/null || true
|
|
@@ -354,6 +362,8 @@ run_one() {
|
|
|
354
362
|
local dry_run=false
|
|
355
363
|
local do_clean=false
|
|
356
364
|
local no_reset=false
|
|
365
|
+
local mode_override=""
|
|
366
|
+
local critic_override=""
|
|
357
367
|
|
|
358
368
|
while [[ $# -gt 0 ]]; do
|
|
359
369
|
case "$1" in
|
|
@@ -361,6 +371,20 @@ run_one() {
|
|
|
361
371
|
--clean) do_clean=true; shift ;;
|
|
362
372
|
--no-reset) no_reset=true; shift ;;
|
|
363
373
|
--timeout) shift; SESSION_TIMEOUT="${1:-0}"; shift ;;
|
|
374
|
+
--mode)
|
|
375
|
+
shift
|
|
376
|
+
if [[ $# -eq 0 ]]; then
|
|
377
|
+
log_error "--mode requires a value (lite|standard|full)"
|
|
378
|
+
exit 1
|
|
379
|
+
fi
|
|
380
|
+
case "$1" in
|
|
381
|
+
lite|standard|full) mode_override="$1" ;;
|
|
382
|
+
*) log_error "Invalid mode: $1 (must be lite, standard, or full)"; exit 1 ;;
|
|
383
|
+
esac
|
|
384
|
+
shift
|
|
385
|
+
;;
|
|
386
|
+
--critic) critic_override="true"; shift ;;
|
|
387
|
+
--no-critic) critic_override="false"; shift ;;
|
|
364
388
|
B-*|b-*) bug_id="$1"; shift ;;
|
|
365
389
|
*) bug_list="$1"; shift ;;
|
|
366
390
|
esac
|
|
@@ -374,7 +398,7 @@ run_one() {
|
|
|
374
398
|
fi
|
|
375
399
|
|
|
376
400
|
if [[ -z "$bug_list" ]]; then
|
|
377
|
-
bug_list="bug-fix-list.json"
|
|
401
|
+
bug_list=".prizmkit/plans/bug-fix-list.json"
|
|
378
402
|
fi
|
|
379
403
|
if [[ ! "$bug_list" = /* ]]; then
|
|
380
404
|
bug_list="$(pwd)/$bug_list"
|
|
@@ -403,7 +427,7 @@ run_one() {
|
|
|
403
427
|
local _gitignore_path
|
|
404
428
|
_gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
|
|
405
429
|
local _state_rel
|
|
406
|
-
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo "
|
|
430
|
+
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/bugfix")
|
|
407
431
|
if [[ -f "$_gitignore_path" ]]; then
|
|
408
432
|
if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
|
|
409
433
|
printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
|
|
@@ -493,16 +517,66 @@ sys.exit(1)
|
|
|
493
517
|
|
|
494
518
|
bootstrap_prompt="$session_dir/bootstrap-prompt.md"
|
|
495
519
|
|
|
520
|
+
# Read retry count from status.json
|
|
521
|
+
local retry_count
|
|
522
|
+
retry_count=$(python3 -c "
|
|
523
|
+
import json, os
|
|
524
|
+
status_path = os.path.join('$STATE_DIR', 'bugs', '$bug_id', 'status.json')
|
|
525
|
+
if os.path.isfile(status_path):
|
|
526
|
+
with open(status_path) as f:
|
|
527
|
+
d = json.load(f)
|
|
528
|
+
print(d.get('retry_count', 0))
|
|
529
|
+
else:
|
|
530
|
+
print(0)
|
|
531
|
+
" 2>/dev/null || echo "0")
|
|
532
|
+
local resume_phase
|
|
533
|
+
resume_phase=$(python3 -c "
|
|
534
|
+
import json, os
|
|
535
|
+
status_path = os.path.join('$STATE_DIR', 'bugs', '$bug_id', 'status.json')
|
|
536
|
+
if os.path.isfile(status_path):
|
|
537
|
+
with open(status_path) as f:
|
|
538
|
+
d = json.load(f)
|
|
539
|
+
print(d.get('resume_from_phase') or 'null')
|
|
540
|
+
else:
|
|
541
|
+
print('null')
|
|
542
|
+
" 2>/dev/null || echo "null")
|
|
543
|
+
|
|
496
544
|
log_info "Generating bugfix bootstrap prompt..."
|
|
497
|
-
|
|
498
|
-
--bug-list "$bug_list"
|
|
499
|
-
--bug-id "$bug_id"
|
|
500
|
-
--session-id "$session_id"
|
|
501
|
-
--run-id "$run_id"
|
|
502
|
-
--retry-count
|
|
503
|
-
--resume-phase "
|
|
504
|
-
--state-dir "$STATE_DIR"
|
|
505
|
-
--output "$bootstrap_prompt"
|
|
545
|
+
local prompt_args=(
|
|
546
|
+
--bug-list "$bug_list"
|
|
547
|
+
--bug-id "$bug_id"
|
|
548
|
+
--session-id "$session_id"
|
|
549
|
+
--run-id "$run_id"
|
|
550
|
+
--retry-count "$retry_count"
|
|
551
|
+
--resume-phase "$resume_phase"
|
|
552
|
+
--state-dir "$STATE_DIR"
|
|
553
|
+
--output "$bootstrap_prompt"
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
if [[ -n "$mode_override" ]]; then
|
|
557
|
+
prompt_args+=(--mode "$mode_override")
|
|
558
|
+
elif [[ -n "${PIPELINE_MODE:-}" ]]; then
|
|
559
|
+
prompt_args+=(--mode "$PIPELINE_MODE")
|
|
560
|
+
fi
|
|
561
|
+
|
|
562
|
+
if [[ -n "${critic_override:-}" ]]; then
|
|
563
|
+
prompt_args+=(--critic "$critic_override")
|
|
564
|
+
elif [[ "${ENABLE_CRITIC:-}" == "true" || "${ENABLE_CRITIC:-}" == "1" ]]; then
|
|
565
|
+
prompt_args+=(--critic "true")
|
|
566
|
+
elif [[ "${ENABLE_CRITIC:-}" == "false" || "${ENABLE_CRITIC:-}" == "0" ]]; then
|
|
567
|
+
prompt_args+=(--critic "false")
|
|
568
|
+
fi
|
|
569
|
+
|
|
570
|
+
local gen_output
|
|
571
|
+
gen_output=$(python3 "$SCRIPTS_DIR/generate-bugfix-prompt.py" "${prompt_args[@]}" 2>/dev/null) || {
|
|
572
|
+
log_error "Failed to generate bootstrap prompt for $bug_id"
|
|
573
|
+
return 1
|
|
574
|
+
}
|
|
575
|
+
local bug_model pipeline_mode agent_count critic_enabled
|
|
576
|
+
bug_model=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('model',''))" 2>/dev/null || echo "")
|
|
577
|
+
pipeline_mode=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('pipeline_mode','standard'))" 2>/dev/null || echo "standard")
|
|
578
|
+
agent_count=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('agent_count',3))" 2>/dev/null || echo "3")
|
|
579
|
+
critic_enabled=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('critic_enabled','false'))" 2>/dev/null || echo "false")
|
|
506
580
|
|
|
507
581
|
if [[ "$dry_run" == true ]]; then
|
|
508
582
|
echo ""
|
|
@@ -511,6 +585,20 @@ sys.exit(1)
|
|
|
511
585
|
echo -e "${BOLD} Severity: $bug_severity${NC}"
|
|
512
586
|
echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
|
|
513
587
|
echo ""
|
|
588
|
+
log_info "Session ID: $session_id"
|
|
589
|
+
if [[ -n "$mode_override" ]]; then
|
|
590
|
+
log_info "Mode Override: $mode_override"
|
|
591
|
+
fi
|
|
592
|
+
log_info "Pipeline mode: $pipeline_mode"
|
|
593
|
+
log_info "Agents: $agent_count (critic: $([ "$critic_enabled" = "true" ] && echo "enabled" || echo "disabled"))"
|
|
594
|
+
if [[ -n "$bug_model" ]]; then
|
|
595
|
+
log_info "Bug Model: $bug_model"
|
|
596
|
+
elif [[ -n "$MODEL" ]]; then
|
|
597
|
+
log_info "Model (env): $MODEL"
|
|
598
|
+
else
|
|
599
|
+
log_info "Model: (CLI default)"
|
|
600
|
+
fi
|
|
601
|
+
echo ""
|
|
514
602
|
log_info "Bootstrap prompt written to:"
|
|
515
603
|
echo " $bootstrap_prompt"
|
|
516
604
|
echo ""
|
|
@@ -527,6 +615,18 @@ sys.exit(1)
|
|
|
527
615
|
log_info "Session ID: $session_id"
|
|
528
616
|
log_info "Prompt: $bootstrap_prompt"
|
|
529
617
|
log_info "Log: $session_dir/logs/session.log"
|
|
618
|
+
local _run_one_mode_desc
|
|
619
|
+
case "$pipeline_mode" in
|
|
620
|
+
lite) _run_one_mode_desc="Tier 1 — Single Agent" ;;
|
|
621
|
+
standard) _run_one_mode_desc="Tier 2 — Orchestrator + Dev + Reviewer" ;;
|
|
622
|
+
full) _run_one_mode_desc="Tier 3 — Full Team (+ Multi-Critic)" ;;
|
|
623
|
+
*) _run_one_mode_desc="$pipeline_mode" ;;
|
|
624
|
+
esac
|
|
625
|
+
log_info "Pipeline mode: ${BOLD}$pipeline_mode${NC} ($_run_one_mode_desc)"
|
|
626
|
+
log_info "Agents: $agent_count (critic: $([ "$critic_enabled" = "true" ] && echo "enabled" || echo "disabled"))"
|
|
627
|
+
if [[ -n "$bug_model" ]]; then
|
|
628
|
+
log_info "Bug model: $bug_model"
|
|
629
|
+
fi
|
|
530
630
|
echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
|
|
531
631
|
echo ""
|
|
532
632
|
|
|
@@ -561,7 +661,7 @@ sys.exit(1)
|
|
|
561
661
|
|
|
562
662
|
spawn_and_wait_session \
|
|
563
663
|
"$bug_id" "$bug_list" "$session_id" \
|
|
564
|
-
"$bootstrap_prompt" "$session_dir" 999 "$_ORIGINAL_BRANCH"
|
|
664
|
+
"$bootstrap_prompt" "$session_dir" 999 "$bug_model" "$_ORIGINAL_BRANCH"
|
|
565
665
|
local session_status="$_SPAWN_RESULT"
|
|
566
666
|
|
|
567
667
|
# Merge dev branch back to original on success
|
|
@@ -591,7 +691,7 @@ sys.exit(1)
|
|
|
591
691
|
# ============================================================
|
|
592
692
|
|
|
593
693
|
main() {
|
|
594
|
-
local bug_list="${1
|
|
694
|
+
local bug_list="${1:-.prizmkit/plans/bug-fix-list.json}"
|
|
595
695
|
|
|
596
696
|
if [[ ! "$bug_list" = /* ]]; then
|
|
597
697
|
bug_list="$(pwd)/$bug_list"
|
|
@@ -601,7 +701,7 @@ main() {
|
|
|
601
701
|
if [[ ! -f "$bug_list" ]]; then
|
|
602
702
|
log_error "Bug fix list not found: $bug_list"
|
|
603
703
|
log_info "Create a bug fix list first using the bug-planner skill,"
|
|
604
|
-
log_info "or provide a path: ./run-bugfix.sh run <path-to
|
|
704
|
+
log_info "or provide a path: ./run-bugfix.sh run <path-to-.prizmkit/plans/bug-fix-list.json>"
|
|
605
705
|
exit 1
|
|
606
706
|
fi
|
|
607
707
|
|
|
@@ -633,7 +733,7 @@ main() {
|
|
|
633
733
|
local _gitignore_path
|
|
634
734
|
_gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
|
|
635
735
|
local _state_rel
|
|
636
|
-
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo "
|
|
736
|
+
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/bugfix")
|
|
637
737
|
if [[ -f "$_gitignore_path" ]]; then
|
|
638
738
|
if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
|
|
639
739
|
printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
|
|
@@ -664,23 +764,13 @@ main() {
|
|
|
664
764
|
echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
|
|
665
765
|
echo ""
|
|
666
766
|
|
|
667
|
-
# Branch lifecycle:
|
|
767
|
+
# Branch lifecycle: per-bug branches (like feature pipeline)
|
|
668
768
|
local _proj_root
|
|
669
769
|
_proj_root="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
670
770
|
local _source_branch
|
|
671
771
|
_source_branch=$(git -C "$_proj_root" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main")
|
|
672
772
|
_ORIGINAL_BRANCH="$_source_branch"
|
|
673
773
|
|
|
674
|
-
local run_id_for_branch
|
|
675
|
-
run_id_for_branch=$(jq -r '.run_id' "$STATE_DIR/pipeline.json" 2>/dev/null || echo "$$")
|
|
676
|
-
local _branch_name="${DEV_BRANCH:-bugfix/pipeline-${run_id_for_branch}}"
|
|
677
|
-
if branch_create "$_proj_root" "$_branch_name" "$_source_branch"; then
|
|
678
|
-
_DEV_BRANCH_NAME="$_branch_name"
|
|
679
|
-
log_info "Dev branch: $_branch_name"
|
|
680
|
-
else
|
|
681
|
-
log_warn "Failed to create bugfix branch; running on current branch: $_source_branch"
|
|
682
|
-
fi
|
|
683
|
-
|
|
684
774
|
local session_count=0
|
|
685
775
|
local total_subagent_calls=0
|
|
686
776
|
|
|
@@ -704,15 +794,6 @@ main() {
|
|
|
704
794
|
log_success " Total subagent calls: $total_subagent_calls"
|
|
705
795
|
log_success "════════════════════════════════════════════════════"
|
|
706
796
|
|
|
707
|
-
# Merge dev branch back to original
|
|
708
|
-
if [[ -n "$_DEV_BRANCH_NAME" ]]; then
|
|
709
|
-
if branch_merge "$_proj_root" "$_DEV_BRANCH_NAME" "$_ORIGINAL_BRANCH" "$AUTO_PUSH"; then
|
|
710
|
-
_DEV_BRANCH_NAME=""
|
|
711
|
-
else
|
|
712
|
-
log_warn "Auto-merge failed — dev branch preserved: $_DEV_BRANCH_NAME"
|
|
713
|
-
log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git rebase $_DEV_BRANCH_NAME"
|
|
714
|
-
fi
|
|
715
|
-
fi
|
|
716
797
|
break
|
|
717
798
|
fi
|
|
718
799
|
|
|
@@ -741,6 +822,23 @@ main() {
|
|
|
741
822
|
fi
|
|
742
823
|
echo -e "${BOLD}────────────────────────────────────────────────────${NC}"
|
|
743
824
|
|
|
825
|
+
# Pre-commit any dirty tree from previous iteration
|
|
826
|
+
if ! git -C "$_proj_root" diff --quiet HEAD 2>/dev/null || [ -n "$(git -C "$_proj_root" ls-files --others --exclude-standard 2>/dev/null)" ]; then
|
|
827
|
+
log_info "Dirty working tree detected — committing before $bug_id..."
|
|
828
|
+
git -C "$_proj_root" add -A 2>/dev/null || true
|
|
829
|
+
git -C "$_proj_root" commit --no-verify -m "chore: capture artifacts before $bug_id session" 2>/dev/null || true
|
|
830
|
+
fi
|
|
831
|
+
|
|
832
|
+
# Create per-bug dev branch
|
|
833
|
+
local _bug_branch="${DEV_BRANCH:-bugfix/${bug_id}-$(date +%Y%m%d%H%M)}"
|
|
834
|
+
if branch_create "$_proj_root" "$_bug_branch" "$_ORIGINAL_BRANCH"; then
|
|
835
|
+
_DEV_BRANCH_NAME="$_bug_branch"
|
|
836
|
+
log_info "Dev branch: $_bug_branch"
|
|
837
|
+
else
|
|
838
|
+
log_warn "Failed to create dev branch; running on current branch: $_ORIGINAL_BRANCH"
|
|
839
|
+
_DEV_BRANCH_NAME=""
|
|
840
|
+
fi
|
|
841
|
+
|
|
744
842
|
# Generate session
|
|
745
843
|
local session_id run_id
|
|
746
844
|
run_id=$(jq -r '.run_id' "$STATE_DIR/pipeline.json")
|
|
@@ -750,19 +848,61 @@ main() {
|
|
|
750
848
|
mkdir -p "$session_dir/logs"
|
|
751
849
|
|
|
752
850
|
local bootstrap_prompt="$session_dir/bootstrap-prompt.md"
|
|
753
|
-
|
|
851
|
+
|
|
852
|
+
local main_prompt_args=(
|
|
853
|
+
--bug-list "$bug_list"
|
|
854
|
+
--bug-id "$bug_id"
|
|
855
|
+
--session-id "$session_id"
|
|
856
|
+
--run-id "$run_id"
|
|
857
|
+
--retry-count "$retry_count"
|
|
858
|
+
--resume-phase "$resume_phase"
|
|
859
|
+
--state-dir "$STATE_DIR"
|
|
860
|
+
--output "$bootstrap_prompt"
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
# Support PIPELINE_MODE env var (set by launch-bugfix-daemon.sh --mode)
|
|
864
|
+
if [[ -n "${PIPELINE_MODE:-}" ]]; then
|
|
865
|
+
main_prompt_args+=(--mode "$PIPELINE_MODE")
|
|
866
|
+
fi
|
|
867
|
+
|
|
868
|
+
# Support ENABLE_CRITIC env var (set by launch-bugfix-daemon.sh --critic)
|
|
869
|
+
if [[ "${ENABLE_CRITIC:-}" == "true" || "${ENABLE_CRITIC:-}" == "1" ]]; then
|
|
870
|
+
main_prompt_args+=(--critic "true")
|
|
871
|
+
elif [[ "${ENABLE_CRITIC:-}" == "false" || "${ENABLE_CRITIC:-}" == "0" ]]; then
|
|
872
|
+
main_prompt_args+=(--critic "false")
|
|
873
|
+
fi
|
|
874
|
+
|
|
875
|
+
local gen_output
|
|
876
|
+
gen_output=$(python3 "$SCRIPTS_DIR/generate-bugfix-prompt.py" "${main_prompt_args[@]}" 2>/dev/null) || {
|
|
877
|
+
log_error "Failed to generate bootstrap prompt for $bug_id"
|
|
878
|
+
continue
|
|
879
|
+
}
|
|
880
|
+
local bug_model pipeline_mode agent_count critic_enabled
|
|
881
|
+
bug_model=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('model',''))" 2>/dev/null || echo "")
|
|
882
|
+
pipeline_mode=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('pipeline_mode','standard'))" 2>/dev/null || echo "standard")
|
|
883
|
+
agent_count=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('agent_count',3))" 2>/dev/null || echo "3")
|
|
884
|
+
critic_enabled=$(echo "$gen_output" | python3 -c "import json,sys; print(json.load(sys.stdin).get('critic_enabled','false'))" 2>/dev/null || echo "false")
|
|
885
|
+
|
|
886
|
+
# Log pipeline mode and agent configuration
|
|
887
|
+
local _mode_desc
|
|
888
|
+
case "$pipeline_mode" in
|
|
889
|
+
lite) _mode_desc="Tier 1 — Single Agent" ;;
|
|
890
|
+
standard) _mode_desc="Tier 2 — Orchestrator + Dev + Reviewer" ;;
|
|
891
|
+
full) _mode_desc="Tier 3 — Full Team (+ Multi-Critic)" ;;
|
|
892
|
+
*) _mode_desc="$pipeline_mode" ;;
|
|
893
|
+
esac
|
|
894
|
+
log_info "Pipeline mode: ${BOLD}$pipeline_mode${NC} ($_mode_desc)"
|
|
895
|
+
log_info "Agents: $agent_count (critic: $([ "$critic_enabled" = "true" ] && echo "enabled" || echo "disabled"))"
|
|
896
|
+
if [[ -n "$bug_model" ]]; then
|
|
897
|
+
log_info "Bug model: $bug_model"
|
|
898
|
+
fi
|
|
899
|
+
|
|
900
|
+
# Mark bug as in-progress before spawning session
|
|
901
|
+
python3 "$SCRIPTS_DIR/update-bug-status.py" \
|
|
754
902
|
--bug-list "$bug_list" \
|
|
755
|
-
--bug-id "$bug_id" \
|
|
756
|
-
--session-id "$session_id" \
|
|
757
|
-
--run-id "$run_id" \
|
|
758
|
-
--retry-count "$retry_count" \
|
|
759
|
-
--resume-phase "$resume_phase" \
|
|
760
903
|
--state-dir "$STATE_DIR" \
|
|
761
|
-
--
|
|
762
|
-
|
|
763
|
-
# Log agent configuration (bugfix always uses dual-agent: Orchestrator + Dev + Reviewer)
|
|
764
|
-
log_info "Pipeline mode: ${BOLD}standard${NC} (Dual Agent — Orchestrator + Dev + Reviewer)"
|
|
765
|
-
log_info "Agents: 3 (critic: disabled)"
|
|
904
|
+
--bug-id "$bug_id" \
|
|
905
|
+
--action start >/dev/null 2>&1 || true
|
|
766
906
|
|
|
767
907
|
# Spawn session
|
|
768
908
|
log_info "Spawning AI CLI session: $session_id"
|
|
@@ -770,11 +910,53 @@ main() {
|
|
|
770
910
|
|
|
771
911
|
spawn_and_wait_session \
|
|
772
912
|
"$bug_id" "$bug_list" "$session_id" \
|
|
773
|
-
"$bootstrap_prompt" "$session_dir" "$MAX_RETRIES" "$_ORIGINAL_BRANCH"
|
|
913
|
+
"$bootstrap_prompt" "$session_dir" "$MAX_RETRIES" "$bug_model" "$_ORIGINAL_BRANCH"
|
|
914
|
+
|
|
915
|
+
local session_status="$_SPAWN_RESULT"
|
|
916
|
+
|
|
917
|
+
# Merge per-bug dev branch back to original on success
|
|
918
|
+
if [[ "$session_status" == "success" && -n "$_DEV_BRANCH_NAME" ]]; then
|
|
919
|
+
if branch_merge "$_proj_root" "$_DEV_BRANCH_NAME" "$_ORIGINAL_BRANCH" "$AUTO_PUSH"; then
|
|
920
|
+
_DEV_BRANCH_NAME=""
|
|
921
|
+
else
|
|
922
|
+
log_warn "Auto-merge failed — dev branch preserved: $_DEV_BRANCH_NAME"
|
|
923
|
+
log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git rebase $_DEV_BRANCH_NAME"
|
|
924
|
+
git -C "$_proj_root" checkout "$_ORIGINAL_BRANCH" 2>/dev/null || true
|
|
925
|
+
_DEV_BRANCH_NAME=""
|
|
926
|
+
fi
|
|
927
|
+
elif [[ -n "$_DEV_BRANCH_NAME" ]]; then
|
|
928
|
+
# Session failed — return to original branch, preserve dev branch for inspection
|
|
929
|
+
if ! git -C "$_proj_root" checkout "$_ORIGINAL_BRANCH" 2>/dev/null; then
|
|
930
|
+
log_warn "Failed to checkout $_ORIGINAL_BRANCH after session failure — staying on dev branch"
|
|
931
|
+
fi
|
|
932
|
+
log_warn "Session failed — dev branch preserved for inspection: $_DEV_BRANCH_NAME"
|
|
933
|
+
_DEV_BRANCH_NAME=""
|
|
934
|
+
fi
|
|
774
935
|
|
|
775
936
|
session_count=$((session_count + 1))
|
|
776
937
|
total_subagent_calls=$((total_subagent_calls + _SUBAGENT_COUNT))
|
|
777
938
|
|
|
939
|
+
# Stuck detection
|
|
940
|
+
if python3 "$SCRIPTS_DIR/detect-stuck.py" \
|
|
941
|
+
--state-dir "$STATE_DIR" \
|
|
942
|
+
--pipeline-type bugfix \
|
|
943
|
+
--bug-list "$bug_list" \
|
|
944
|
+
--max-retries "$MAX_RETRIES" \
|
|
945
|
+
2>/dev/null | jq -e '.stuck_count > 0' >/dev/null 2>&1; then
|
|
946
|
+
log_warn "STUCK_DETECTED: Some bugs may be stuck — run detect-stuck.py for details"
|
|
947
|
+
fi
|
|
948
|
+
|
|
949
|
+
# Completion notes propagation (on success)
|
|
950
|
+
if [ "$_SPAWN_RESULT" = "success" ]; then
|
|
951
|
+
local _summary_path="$_proj_root/.prizmkit/bugfix/${bug_id}/completion-summary.json"
|
|
952
|
+
if [ -f "$_summary_path" ]; then
|
|
953
|
+
python3 "$SCRIPTS_DIR/patch-completion-notes.py" \
|
|
954
|
+
--bug-list "$bug_list" \
|
|
955
|
+
--bug-id "$bug_id" \
|
|
956
|
+
--summary "$_summary_path" 2>/dev/null || true
|
|
957
|
+
fi
|
|
958
|
+
fi
|
|
959
|
+
|
|
778
960
|
log_info "Pausing 5s before next bug..."
|
|
779
961
|
sleep 5
|
|
780
962
|
done
|
|
@@ -788,9 +970,9 @@ show_help() {
|
|
|
788
970
|
echo "Usage: $0 <command> [options]"
|
|
789
971
|
echo ""
|
|
790
972
|
echo "Commands:"
|
|
791
|
-
echo " run [bug-fix-list.json] Run all bugs by severity/priority order"
|
|
973
|
+
echo " run [.prizmkit/plans/bug-fix-list.json] Run all bugs by severity/priority order"
|
|
792
974
|
echo " run <bug-id> [options] Run a single bug fix"
|
|
793
|
-
echo " status [bug-fix-list.json] Show bug fix pipeline status"
|
|
975
|
+
echo " status [.prizmkit/plans/bug-fix-list.json] Show bug fix pipeline status"
|
|
794
976
|
echo " reset Clear all bugfix state"
|
|
795
977
|
echo " help Show this help message"
|
|
796
978
|
echo ""
|
|
@@ -799,10 +981,16 @@ show_help() {
|
|
|
799
981
|
echo " --clean Delete artifacts and reset before running"
|
|
800
982
|
echo " --no-reset Skip status reset (preserve retry count)"
|
|
801
983
|
echo " --timeout N Session timeout in seconds (default: 0 = no limit)"
|
|
984
|
+
echo " --mode <lite|standard|full> Override pipeline mode"
|
|
985
|
+
echo " --critic Enable adversarial critic review"
|
|
986
|
+
echo " --no-critic Disable adversarial critic review"
|
|
802
987
|
echo ""
|
|
803
988
|
echo "Environment Variables:"
|
|
804
989
|
echo " MAX_RETRIES Max retries per bug (default: 3)"
|
|
805
990
|
echo " SESSION_TIMEOUT Session timeout in seconds (default: 0 = no limit)"
|
|
991
|
+
echo " MODEL Default AI model (overridden by per-bug model in bug list)"
|
|
992
|
+
echo " PIPELINE_MODE Default pipeline mode: lite|standard|full (overridden by --mode)"
|
|
993
|
+
echo " ENABLE_CRITIC Enable/disable critic: true|false|1|0 (overridden by --critic/--no-critic)"
|
|
806
994
|
echo " AI_CLI AI CLI command name (auto-detected: cbc or claude)"
|
|
807
995
|
echo " VERBOSE Set to 1 for verbose AI CLI output"
|
|
808
996
|
echo " HEARTBEAT_INTERVAL Heartbeat log interval in seconds (default: 30)"
|
|
@@ -812,7 +1000,7 @@ show_help() {
|
|
|
812
1000
|
echo ""
|
|
813
1001
|
echo "Examples:"
|
|
814
1002
|
echo " ./run-bugfix.sh run # Run all bugs"
|
|
815
|
-
echo " ./run-bugfix.sh run bug-fix-list.json # Custom bug list"
|
|
1003
|
+
echo " ./run-bugfix.sh run .prizmkit/plans/bug-fix-list.json # Custom bug list"
|
|
816
1004
|
echo " ./run-bugfix.sh run B-001 --dry-run # Inspect generated prompt"
|
|
817
1005
|
echo " ./run-bugfix.sh run B-001 --clean # Clean artifacts + reset + run"
|
|
818
1006
|
echo " ./run-bugfix.sh run B-001 --no-reset # Retry without resetting status"
|
|
@@ -827,7 +1015,7 @@ case "${1:-run}" in
|
|
|
827
1015
|
if [[ "${1:-}" =~ ^[Bb]-[0-9]+ ]]; then
|
|
828
1016
|
run_one "$@"
|
|
829
1017
|
else
|
|
830
|
-
main "${1
|
|
1018
|
+
main "${1:-.prizmkit/plans/bug-fix-list.json}"
|
|
831
1019
|
fi
|
|
832
1020
|
;;
|
|
833
1021
|
status)
|
|
@@ -837,7 +1025,7 @@ case "${1:-run}" in
|
|
|
837
1025
|
exit 1
|
|
838
1026
|
fi
|
|
839
1027
|
python3 "$SCRIPTS_DIR/update-bug-status.py" \
|
|
840
|
-
--bug-list "${2
|
|
1028
|
+
--bug-list "${2:-.prizmkit/plans/bug-fix-list.json}" \
|
|
841
1029
|
--state-dir "$STATE_DIR" \
|
|
842
1030
|
--action status
|
|
843
1031
|
;;
|
|
@@ -846,6 +1034,40 @@ case "${1:-run}" in
|
|
|
846
1034
|
rm -rf "$STATE_DIR"
|
|
847
1035
|
log_success "Bugfix state cleared. Run './run-bugfix.sh run' to start fresh."
|
|
848
1036
|
;;
|
|
1037
|
+
unskip)
|
|
1038
|
+
check_dependencies
|
|
1039
|
+
if [[ ! -f "$STATE_DIR/pipeline.json" ]]; then
|
|
1040
|
+
log_error "No bugfix pipeline state found. Run './run-bugfix.sh run' first."
|
|
1041
|
+
exit 1
|
|
1042
|
+
fi
|
|
1043
|
+
_unskip_bug_list=".prizmkit/plans/bug-fix-list.json"
|
|
1044
|
+
_unskip_bug_id=""
|
|
1045
|
+
shift || true
|
|
1046
|
+
# Parse arguments: optional bug-id and bug-list path
|
|
1047
|
+
while [[ $# -gt 0 ]]; do
|
|
1048
|
+
if [[ "$1" =~ ^[Bb]-[0-9]+ ]]; then
|
|
1049
|
+
_unskip_bug_id="$1"
|
|
1050
|
+
else
|
|
1051
|
+
_unskip_bug_list="$1"
|
|
1052
|
+
fi
|
|
1053
|
+
shift
|
|
1054
|
+
done
|
|
1055
|
+
_unskip_args=(
|
|
1056
|
+
--bug-list "$_unskip_bug_list"
|
|
1057
|
+
--state-dir "$STATE_DIR"
|
|
1058
|
+
--action unskip
|
|
1059
|
+
)
|
|
1060
|
+
if [[ -n "$_unskip_bug_id" ]]; then
|
|
1061
|
+
_unskip_args+=(--bug-id "$_unskip_bug_id")
|
|
1062
|
+
fi
|
|
1063
|
+
python3 "$SCRIPTS_DIR/update-bug-status.py" "${_unskip_args[@]}"
|
|
1064
|
+
|
|
1065
|
+
# Commit the status change
|
|
1066
|
+
if ! git diff --quiet "$_unskip_bug_list" 2>/dev/null; then
|
|
1067
|
+
git add "$_unskip_bug_list"
|
|
1068
|
+
git commit -m "chore: unskip skipped bugs" 2>/dev/null || true
|
|
1069
|
+
fi
|
|
1070
|
+
;;
|
|
849
1071
|
help|--help|-h)
|
|
850
1072
|
show_help
|
|
851
1073
|
;;
|