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.
Files changed (132) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/adapters/codebuddy/skill-adapter.js +21 -7
  3. package/bundled/agents/prizm-dev-team-reviewer.md +53 -173
  4. package/bundled/dev-pipeline/.env.example +45 -0
  5. package/bundled/dev-pipeline/README.md +64 -64
  6. package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +535 -0
  7. package/bundled/dev-pipeline/assets/feature-list-example.json +0 -1
  8. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +64 -18
  9. package/bundled/dev-pipeline/launch-feature-daemon.sh +15 -12
  10. package/bundled/dev-pipeline/launch-refactor-daemon.sh +64 -18
  11. package/bundled/dev-pipeline/lib/branch.sh +6 -1
  12. package/bundled/dev-pipeline/lib/common.sh +71 -0
  13. package/bundled/dev-pipeline/lib/heartbeat.sh +2 -2
  14. package/bundled/dev-pipeline/reset-bug.sh +10 -9
  15. package/bundled/dev-pipeline/reset-feature.sh +9 -8
  16. package/bundled/dev-pipeline/reset-refactor.sh +10 -9
  17. package/bundled/dev-pipeline/retry-bugfix.sh +67 -29
  18. package/bundled/dev-pipeline/retry-feature.sh +54 -18
  19. package/bundled/dev-pipeline/retry-refactor.sh +112 -29
  20. package/bundled/dev-pipeline/run-bugfix.sh +281 -59
  21. package/bundled/dev-pipeline/run-feature.sh +53 -18
  22. package/bundled/dev-pipeline/run-refactor.sh +392 -66
  23. package/bundled/dev-pipeline/scripts/check-session-status.py +24 -1
  24. package/bundled/dev-pipeline/scripts/cleanup-logs.py +2 -2
  25. package/bundled/dev-pipeline/scripts/detect-stuck.py +195 -85
  26. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +57 -33
  27. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +25 -9
  28. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +104 -17
  29. package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +34 -9
  30. package/bundled/dev-pipeline/scripts/init-pipeline.py +10 -10
  31. package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +19 -8
  32. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +1 -5
  33. package/bundled/dev-pipeline/scripts/patch-completion-notes.py +191 -0
  34. package/bundled/dev-pipeline/scripts/update-bug-status.py +167 -22
  35. package/bundled/dev-pipeline/scripts/update-feature-status.py +104 -62
  36. package/bundled/dev-pipeline/scripts/update-refactor-status.py +351 -21
  37. package/bundled/dev-pipeline/templates/agent-prompts/dev-fix.md +1 -1
  38. package/bundled/dev-pipeline/templates/agent-prompts/reviewer-review.md +7 -11
  39. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +41 -7
  40. package/bundled/dev-pipeline/templates/bootstrap-tier1.md +27 -3
  41. package/bundled/dev-pipeline/templates/bootstrap-tier2.md +43 -19
  42. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +54 -26
  43. package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +6 -15
  44. package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +36 -25
  45. package/bundled/dev-pipeline/templates/feature-list-schema.json +109 -31
  46. package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +270 -0
  47. package/bundled/dev-pipeline/templates/refactor-list-schema.json +11 -3
  48. package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +3 -1
  49. package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +1 -0
  50. package/bundled/dev-pipeline/templates/sections/feature-context.md +2 -0
  51. package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +29 -2
  52. package/bundled/dev-pipeline/templates/sections/phase-commit.md +22 -0
  53. package/bundled/dev-pipeline/templates/sections/phase-deploy-verification.md +2 -2
  54. package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +8 -6
  55. package/bundled/dev-pipeline/templates/sections/phase-review-full.md +7 -5
  56. package/bundled/dev-pipeline/templates/sections/phase-specify-plan-full.md +3 -3
  57. package/bundled/skills/_metadata.json +5 -22
  58. package/bundled/skills/app-planner/SKILL.md +98 -72
  59. package/bundled/skills/app-planner/assets/app-design-guide.md +1 -1
  60. package/bundled/skills/app-planner/references/architecture-decisions.md +1 -1
  61. package/bundled/skills/app-planner/references/project-brief-guide.md +69 -66
  62. package/bundled/skills/bug-fix-workflow/SKILL.md +52 -9
  63. package/bundled/skills/bug-planner/SKILL.md +139 -197
  64. package/bundled/skills/bug-planner/assets/bug-confirmation-template.md +43 -0
  65. package/bundled/skills/bug-planner/references/critic-and-verification.md +44 -0
  66. package/bundled/skills/bug-planner/references/error-recovery.md +73 -0
  67. package/bundled/skills/bug-planner/references/input-formats.md +53 -0
  68. package/bundled/skills/bug-planner/references/schema-validation.md +25 -0
  69. package/bundled/skills/bug-planner/references/severity-rules.md +16 -0
  70. package/bundled/skills/bug-planner/scripts/validate-bug-list.py +4 -8
  71. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +34 -39
  72. package/bundled/skills/feature-pipeline-launcher/SKILL.md +49 -36
  73. package/bundled/skills/feature-pipeline-launcher/scripts/preflight-check.py +3 -3
  74. package/bundled/skills/feature-planner/SKILL.md +53 -142
  75. package/bundled/skills/feature-planner/assets/evaluation-guide.md +1 -1
  76. package/bundled/skills/feature-planner/assets/planning-guide.md +21 -5
  77. package/bundled/skills/feature-planner/references/browser-interaction.md +2 -4
  78. package/bundled/skills/feature-planner/references/completeness-review.md +57 -0
  79. package/bundled/skills/feature-planner/references/error-recovery.md +16 -35
  80. package/bundled/skills/feature-planner/references/incremental-feature-planning.md +1 -1
  81. package/bundled/skills/feature-planner/references/new-project-planning.md +2 -2
  82. package/bundled/skills/feature-planner/scripts/validate-and-generate.py +19 -20
  83. package/bundled/skills/feature-workflow/SKILL.md +24 -25
  84. package/bundled/skills/prizm-kit/SKILL.md +39 -49
  85. package/bundled/skills/prizmkit-code-review/SKILL.md +51 -64
  86. package/bundled/skills/prizmkit-code-review/rules/dimensions.md +85 -0
  87. package/bundled/skills/prizmkit-code-review/rules/fix-strategy.md +11 -11
  88. package/bundled/skills/prizmkit-committer/SKILL.md +3 -31
  89. package/bundled/skills/prizmkit-deploy/SKILL.md +34 -31
  90. package/bundled/skills/prizmkit-deploy/assets/deploy-template.md +1 -1
  91. package/bundled/skills/prizmkit-implement/SKILL.md +35 -68
  92. package/bundled/skills/prizmkit-init/SKILL.md +112 -65
  93. package/bundled/skills/prizmkit-init/assets/project-brief-template.md +82 -0
  94. package/bundled/skills/prizmkit-plan/SKILL.md +120 -79
  95. package/bundled/skills/prizmkit-plan/assets/plan-template.md +28 -18
  96. package/bundled/skills/prizmkit-plan/assets/spec-template.md +28 -11
  97. package/bundled/skills/prizmkit-plan/references/clarify-guide.md +3 -3
  98. package/bundled/skills/prizmkit-plan/references/verification-checklist.md +60 -0
  99. package/bundled/skills/prizmkit-prizm-docs/SKILL.md +10 -81
  100. package/bundled/skills/prizmkit-prizm-docs/assets/{PRIZM-SPEC.md → prizm-docs-format.md} +41 -526
  101. package/bundled/skills/prizmkit-prizm-docs/references/op-init.md +46 -0
  102. package/bundled/skills/prizmkit-prizm-docs/references/op-rebuild.md +16 -0
  103. package/bundled/skills/prizmkit-prizm-docs/references/op-status.md +14 -0
  104. package/bundled/skills/prizmkit-prizm-docs/references/op-update.md +19 -0
  105. package/bundled/skills/prizmkit-prizm-docs/references/op-validate.md +17 -0
  106. package/bundled/skills/prizmkit-retrospective/SKILL.md +27 -65
  107. package/bundled/skills/prizmkit-retrospective/references/knowledge-injection-steps.md +3 -4
  108. package/bundled/skills/prizmkit-retrospective/references/structural-sync-steps.md +7 -25
  109. package/bundled/skills/recovery-workflow/SKILL.md +22 -22
  110. package/bundled/skills/recovery-workflow/evals/evals.json +5 -5
  111. package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +43 -10
  112. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +48 -40
  113. package/bundled/skills/refactor-planner/SKILL.md +43 -61
  114. package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +17 -17
  115. package/bundled/skills/refactor-workflow/SKILL.md +23 -24
  116. package/bundled/team/prizm-dev-team.json +1 -1
  117. package/bundled/{skills/prizm-kit/assets → templates}/project-memory-template.md +1 -1
  118. package/package.json +1 -1
  119. package/src/clean.js +3 -4
  120. package/src/gitignore-template.js +7 -9
  121. package/src/scaffold.js +14 -5
  122. package/bundled/dev-pipeline/templates/agent-prompts/reviewer-analyze.md +0 -5
  123. package/bundled/dev-pipeline/templates/sections/phase-analyze-agent.md +0 -19
  124. package/bundled/dev-pipeline/templates/sections/phase-analyze-full.md +0 -19
  125. package/bundled/skills/app-planner/references/project-conventions.md +0 -93
  126. package/bundled/skills/prizmkit-analyze/SKILL.md +0 -207
  127. package/bundled/skills/prizmkit-code-review/rules/dimensions-bugfix.md +0 -25
  128. package/bundled/skills/prizmkit-code-review/rules/dimensions-feature.md +0 -43
  129. package/bundled/skills/prizmkit-code-review/rules/dimensions-refactor.md +0 -25
  130. package/bundled/skills/prizmkit-implement/references/deploy-guide-protocol.md +0 -69
  131. package/bundled/skills/prizmkit-verify/SKILL.md +0 -281
  132. 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 six actions:
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 bugfix-state/ directory")
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 = {"critical": 0, "high": 1, "medium": 2, "low": 3}
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"), 3)
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
- # 所有剩余的 bug 都处于非终端但也非 pending/in_progress 状态
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 == "merge_conflict":
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
- bs["status"] = "merge_conflict"
252
- target_status = "merge_conflict"
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 == "merge_conflict":
311
- summary["degraded_reason"] = "merge_conflict"
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__":