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
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""Core state machine for updating bug status in the bug-fix pipeline.
|
|
3
3
|
|
|
4
|
-
Handles
|
|
4
|
+
Handles eight actions:
|
|
5
5
|
- get_next: Find the next bug to process based on priority and severity
|
|
6
|
+
- start: Mark a bug as fixing when a session starts
|
|
6
7
|
- update: Update a bug's status based on session outcome
|
|
7
8
|
- status: Print a formatted overview of all bugs
|
|
8
9
|
- pause: Save pipeline state for graceful shutdown
|
|
9
10
|
- reset: Reset a bug to pending (status + retry count)
|
|
10
11
|
- clean: Reset + delete session history + delete bugfix artifacts
|
|
12
|
+
- unskip: Reset skipped bugs back to pending
|
|
11
13
|
|
|
12
14
|
Usage:
|
|
13
15
|
python3 update-bug-status.py \
|
|
14
16
|
--bug-list <path> --state-dir <path> \
|
|
15
|
-
--action <get_next|update|status|pause|reset|clean> \
|
|
17
|
+
--action <get_next|start|update|status|pause|reset|clean|unskip> \
|
|
16
18
|
[--bug-id <id>] [--session-status <status>] \
|
|
17
19
|
[--session-id <id>] [--max-retries <n>]
|
|
18
20
|
"""
|
|
@@ -39,12 +41,14 @@ SESSION_STATUS_VALUES = [
|
|
|
39
41
|
"failed",
|
|
40
42
|
"crashed",
|
|
41
43
|
"timed_out",
|
|
44
|
+
"commit_missing",
|
|
45
|
+
"docs_missing",
|
|
42
46
|
"merge_conflict",
|
|
43
47
|
]
|
|
44
48
|
|
|
45
49
|
TERMINAL_STATUSES = {"completed", "failed", "skipped", "needs_info"}
|
|
46
50
|
|
|
47
|
-
#
|
|
51
|
+
# Severity priority (lower value = higher priority)
|
|
48
52
|
SEVERITY_PRIORITY = {
|
|
49
53
|
"critical": 0,
|
|
50
54
|
"high": 1,
|
|
@@ -57,11 +61,11 @@ def parse_args():
|
|
|
57
61
|
parser = argparse.ArgumentParser(
|
|
58
62
|
description="Core state machine for bug-fix pipeline bug status management."
|
|
59
63
|
)
|
|
60
|
-
parser.add_argument("--bug-list", required=True, help="Path to the bug-fix-list.json file")
|
|
61
|
-
parser.add_argument("--state-dir", required=True, help="Path to the
|
|
64
|
+
parser.add_argument("--bug-list", required=True, help="Path to the .prizmkit/plans/bug-fix-list.json file")
|
|
65
|
+
parser.add_argument("--state-dir", required=True, help="Path to the state directory (default: .prizmkit/state/bugfix)")
|
|
62
66
|
parser.add_argument(
|
|
63
67
|
"--action", required=True,
|
|
64
|
-
choices=["get_next", "update", "status", "pause", "reset", "clean"],
|
|
68
|
+
choices=["get_next", "start", "update", "status", "pause", "reset", "clean", "unskip", "complete"],
|
|
65
69
|
help="Action to perform",
|
|
66
70
|
)
|
|
67
71
|
parser.add_argument("--bug-id", default=None, help="Bug ID (required for 'update'/'reset'/'clean' actions)")
|
|
@@ -128,7 +132,7 @@ def update_bug_in_list(bug_list_path, bug_id, new_status):
|
|
|
128
132
|
found = True
|
|
129
133
|
break
|
|
130
134
|
if not found:
|
|
131
|
-
return "Bug '{}' not found in bug-fix-list.json".format(bug_id)
|
|
135
|
+
return "Bug '{}' not found in .prizmkit/plans/bug-fix-list.json".format(bug_id)
|
|
132
136
|
return write_json_file(bug_list_path, data)
|
|
133
137
|
|
|
134
138
|
|
|
@@ -183,12 +187,12 @@ def action_get_next(bug_list_data, state_dir):
|
|
|
183
187
|
elif bstatus == "pending":
|
|
184
188
|
pending_bugs.append(bug)
|
|
185
189
|
|
|
186
|
-
_PRIORITY_ORDER = {"
|
|
190
|
+
_PRIORITY_ORDER = {"high": 0, "medium": 1, "low": 2}
|
|
187
191
|
|
|
188
192
|
def sort_key(b):
|
|
189
193
|
severity = b.get("severity", "medium")
|
|
190
194
|
sev_order = SEVERITY_PRIORITY.get(severity, 2)
|
|
191
|
-
priority = _PRIORITY_ORDER.get(b.get("priority", "low"),
|
|
195
|
+
priority = _PRIORITY_ORDER.get(b.get("priority", "low"), 2)
|
|
192
196
|
return (sev_order, priority)
|
|
193
197
|
|
|
194
198
|
if in_progress_bugs:
|
|
@@ -196,7 +200,7 @@ def action_get_next(bug_list_data, state_dir):
|
|
|
196
200
|
elif pending_bugs:
|
|
197
201
|
candidates = sorted(pending_bugs, key=sort_key)
|
|
198
202
|
else:
|
|
199
|
-
#
|
|
203
|
+
# All remaining bugs are in non-terminal but also non-pending/in_progress states
|
|
200
204
|
print("PIPELINE_BLOCKED")
|
|
201
205
|
return
|
|
202
206
|
|
|
@@ -238,26 +242,32 @@ def action_update(args, bug_list_path, state_dir):
|
|
|
238
242
|
bs["resume_from_phase"] = None
|
|
239
243
|
err = update_bug_in_list(bug_list_path, bug_id, "completed")
|
|
240
244
|
if err:
|
|
241
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
245
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
242
246
|
return
|
|
243
|
-
elif session_status
|
|
244
|
-
# Degraded outcome: keep artifacts for retry (branch preserves work)
|
|
247
|
+
elif session_status in ("commit_missing", "docs_missing", "merge_conflict"):
|
|
248
|
+
# Degraded outcome: keep artifacts for retry (branch preserves work).
|
|
249
|
+
# Write schema-valid status to bug-fix-list.json ("pending" for retry,
|
|
250
|
+
# "failed" if max retries exceeded). Store the granular degraded reason
|
|
251
|
+
# in status.json only (internal pipeline state, not schema-bound).
|
|
245
252
|
bs["retry_count"] = bs.get("retry_count", 0) + 1
|
|
246
253
|
|
|
247
254
|
if bs["retry_count"] >= max_retries:
|
|
248
255
|
bs["status"] = "failed"
|
|
249
256
|
target_status = "failed"
|
|
250
257
|
else:
|
|
251
|
-
|
|
252
|
-
|
|
258
|
+
# status.json keeps the granular degraded reason for diagnostics
|
|
259
|
+
bs["status"] = session_status
|
|
260
|
+
# bug-fix-list.json gets schema-valid "pending" (will be retried)
|
|
261
|
+
target_status = "pending"
|
|
253
262
|
|
|
263
|
+
bs["degraded_reason"] = session_status
|
|
254
264
|
bs["resume_from_phase"] = None
|
|
255
265
|
bs["sessions"] = []
|
|
256
266
|
bs["last_session_id"] = None
|
|
257
267
|
|
|
258
268
|
err = update_bug_in_list(bug_list_path, bug_id, target_status)
|
|
259
269
|
if err:
|
|
260
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
270
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
261
271
|
return
|
|
262
272
|
else:
|
|
263
273
|
bs["retry_count"] = bs.get("retry_count", 0) + 1
|
|
@@ -281,7 +291,7 @@ def action_update(args, bug_list_path, state_dir):
|
|
|
281
291
|
|
|
282
292
|
err = update_bug_in_list(bug_list_path, bug_id, target_status)
|
|
283
293
|
if err:
|
|
284
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
294
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
285
295
|
return
|
|
286
296
|
|
|
287
297
|
if session_status == "success" and session_id:
|
|
@@ -307,8 +317,8 @@ def action_update(args, bug_list_path, state_dir):
|
|
|
307
317
|
"resume_from_phase": bs.get("resume_from_phase"),
|
|
308
318
|
"updated_at": bs["updated_at"],
|
|
309
319
|
}
|
|
310
|
-
if session_status
|
|
311
|
-
summary["degraded_reason"] =
|
|
320
|
+
if session_status in ("commit_missing", "docs_missing", "merge_conflict"):
|
|
321
|
+
summary["degraded_reason"] = session_status
|
|
312
322
|
summary["restart_policy"] = "finalization_retry"
|
|
313
323
|
elif session_status != "success":
|
|
314
324
|
summary["restart_policy"] = "full_restart"
|
|
@@ -544,7 +554,7 @@ def action_reset(args, bug_list_path, state_dir):
|
|
|
544
554
|
|
|
545
555
|
err = update_bug_in_list(bug_list_path, bug_id, "pending")
|
|
546
556
|
if err:
|
|
547
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
557
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
548
558
|
return
|
|
549
559
|
|
|
550
560
|
result = {
|
|
@@ -620,7 +630,7 @@ def action_clean(args, bug_list_path, state_dir):
|
|
|
620
630
|
|
|
621
631
|
err = update_bug_in_list(bug_list_path, bug_id, "pending")
|
|
622
632
|
if err:
|
|
623
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
633
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
624
634
|
return
|
|
625
635
|
|
|
626
636
|
result = {
|
|
@@ -661,6 +671,133 @@ def action_pause(state_dir):
|
|
|
661
671
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
662
672
|
|
|
663
673
|
|
|
674
|
+
# ---------------------------------------------------------------------------
|
|
675
|
+
# Action: start
|
|
676
|
+
# ---------------------------------------------------------------------------
|
|
677
|
+
|
|
678
|
+
def action_start(args, bug_list_path, state_dir):
|
|
679
|
+
"""Mark a bug as in_progress when a session starts.
|
|
680
|
+
|
|
681
|
+
This keeps bug-fix-list.json/state status in sync during execution,
|
|
682
|
+
instead of only updating after session end.
|
|
683
|
+
"""
|
|
684
|
+
bug_id = args.bug_id
|
|
685
|
+
if not bug_id:
|
|
686
|
+
error_out("--bug-id is required for 'start' action")
|
|
687
|
+
return
|
|
688
|
+
|
|
689
|
+
bs = load_bug_status(state_dir, bug_id)
|
|
690
|
+
old_status = bs.get("status", "pending")
|
|
691
|
+
|
|
692
|
+
bs["status"] = "in_progress"
|
|
693
|
+
bs["updated_at"] = now_iso()
|
|
694
|
+
|
|
695
|
+
err = save_bug_status(state_dir, bug_id, bs)
|
|
696
|
+
if err:
|
|
697
|
+
error_out("Failed to save bug status: {}".format(err))
|
|
698
|
+
return
|
|
699
|
+
|
|
700
|
+
err = update_bug_in_list(bug_list_path, bug_id, "in_progress")
|
|
701
|
+
if err:
|
|
702
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
703
|
+
return
|
|
704
|
+
|
|
705
|
+
result = {
|
|
706
|
+
"action": "start",
|
|
707
|
+
"bug_id": bug_id,
|
|
708
|
+
"old_status": old_status,
|
|
709
|
+
"new_status": "in_progress",
|
|
710
|
+
"updated_at": bs["updated_at"],
|
|
711
|
+
}
|
|
712
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
# ---------------------------------------------------------------------------
|
|
716
|
+
# Action: unskip
|
|
717
|
+
# ---------------------------------------------------------------------------
|
|
718
|
+
|
|
719
|
+
def action_unskip(args, bug_list_path, state_dir):
|
|
720
|
+
"""Reset skipped bugs back to pending.
|
|
721
|
+
|
|
722
|
+
Two modes:
|
|
723
|
+
- --bug-id B-001: Reset the specified skipped bug to pending.
|
|
724
|
+
- No --bug-id: Reset ALL skipped bugs to pending.
|
|
725
|
+
"""
|
|
726
|
+
bug_id = args.bug_id
|
|
727
|
+
|
|
728
|
+
data, err = load_json_file(bug_list_path)
|
|
729
|
+
if err:
|
|
730
|
+
error_out("Cannot load bug fix list: {}".format(err))
|
|
731
|
+
return
|
|
732
|
+
bugs = data.get("bugs", [])
|
|
733
|
+
|
|
734
|
+
to_reset = set()
|
|
735
|
+
|
|
736
|
+
if bug_id:
|
|
737
|
+
# Find the target bug
|
|
738
|
+
target = None
|
|
739
|
+
for b in bugs:
|
|
740
|
+
if isinstance(b, dict) and b.get("id") == bug_id:
|
|
741
|
+
target = b
|
|
742
|
+
break
|
|
743
|
+
if not target:
|
|
744
|
+
error_out("Bug '{}' not found in .prizmkit/plans/bug-fix-list.json".format(bug_id))
|
|
745
|
+
return
|
|
746
|
+
if target.get("status") not in ("failed", "skipped", "needs_info"):
|
|
747
|
+
error_out(
|
|
748
|
+
"Bug '{}' has status '{}', expected 'failed', 'skipped', or 'needs_info'".format(
|
|
749
|
+
bug_id, target.get("status", "unknown")
|
|
750
|
+
)
|
|
751
|
+
)
|
|
752
|
+
return
|
|
753
|
+
to_reset.add(bug_id)
|
|
754
|
+
else:
|
|
755
|
+
# No bug-id: reset ALL skipped/failed/needs_info bugs
|
|
756
|
+
for b in bugs:
|
|
757
|
+
if isinstance(b, dict) and b.get("id"):
|
|
758
|
+
if b.get("status") in ("failed", "skipped", "needs_info"):
|
|
759
|
+
to_reset.add(b["id"])
|
|
760
|
+
|
|
761
|
+
if not to_reset:
|
|
762
|
+
error_out("No bugs to unskip")
|
|
763
|
+
return
|
|
764
|
+
|
|
765
|
+
# Reset all collected bugs in bug-fix-list.json
|
|
766
|
+
reset_details = []
|
|
767
|
+
for b in bugs:
|
|
768
|
+
if isinstance(b, dict) and b.get("id") in to_reset:
|
|
769
|
+
old_status = b.get("status", "unknown")
|
|
770
|
+
b["status"] = "pending"
|
|
771
|
+
reset_details.append({
|
|
772
|
+
"bug_id": b["id"],
|
|
773
|
+
"title": b.get("title", ""),
|
|
774
|
+
"old_status": old_status,
|
|
775
|
+
})
|
|
776
|
+
|
|
777
|
+
err = write_json_file(bug_list_path, data)
|
|
778
|
+
if err:
|
|
779
|
+
error_out("Failed to write .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
780
|
+
return
|
|
781
|
+
|
|
782
|
+
# Reset status.json for each bug
|
|
783
|
+
for bid in to_reset:
|
|
784
|
+
bs = load_bug_status(state_dir, bid)
|
|
785
|
+
bs["status"] = "pending"
|
|
786
|
+
bs["retry_count"] = 0
|
|
787
|
+
bs["sessions"] = []
|
|
788
|
+
bs["last_session_id"] = None
|
|
789
|
+
bs["resume_from_phase"] = None
|
|
790
|
+
bs["updated_at"] = now_iso()
|
|
791
|
+
save_bug_status(state_dir, bid, bs)
|
|
792
|
+
|
|
793
|
+
result = {
|
|
794
|
+
"action": "unskip",
|
|
795
|
+
"reset_count": len(to_reset),
|
|
796
|
+
"bugs": reset_details,
|
|
797
|
+
}
|
|
798
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
799
|
+
|
|
800
|
+
|
|
664
801
|
# ---------------------------------------------------------------------------
|
|
665
802
|
# Main
|
|
666
803
|
# ---------------------------------------------------------------------------
|
|
@@ -673,7 +810,7 @@ def main():
|
|
|
673
810
|
error_out("--bug-id is required for 'update' action")
|
|
674
811
|
if not args.session_status:
|
|
675
812
|
error_out("--session-status is required for 'update' action")
|
|
676
|
-
if args.action in ("reset", "clean"):
|
|
813
|
+
if args.action in ("start", "reset", "clean", "complete"):
|
|
677
814
|
if not args.bug_id:
|
|
678
815
|
error_out("--bug-id is required for '{}' action".format(args.action))
|
|
679
816
|
if args.action == "clean":
|
|
@@ -686,6 +823,8 @@ def main():
|
|
|
686
823
|
|
|
687
824
|
if args.action == "get_next":
|
|
688
825
|
action_get_next(bug_list_data, args.state_dir)
|
|
826
|
+
elif args.action == "start":
|
|
827
|
+
action_start(args, args.bug_list, args.state_dir)
|
|
689
828
|
elif args.action == "update":
|
|
690
829
|
action_update(args, args.bug_list, args.state_dir)
|
|
691
830
|
elif args.action == "status":
|
|
@@ -696,6 +835,12 @@ def main():
|
|
|
696
835
|
action_clean(args, args.bug_list, args.state_dir)
|
|
697
836
|
elif args.action == "pause":
|
|
698
837
|
action_pause(args.state_dir)
|
|
838
|
+
elif args.action == "unskip":
|
|
839
|
+
action_unskip(args, args.bug_list, args.state_dir)
|
|
840
|
+
elif args.action == "complete":
|
|
841
|
+
# Shortcut: 'complete' is equivalent to 'update --session-status success'
|
|
842
|
+
args.session_status = "success"
|
|
843
|
+
action_update(args, args.bug_list, args.state_dir)
|
|
699
844
|
|
|
700
845
|
|
|
701
846
|
if __name__ == "__main__":
|