prizmkit 1.1.7 → 1.1.8
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/dev-pipeline/README.md +64 -64
- package/bundled/dev-pipeline/launch-bugfix-daemon.sh +11 -10
- package/bundled/dev-pipeline/launch-feature-daemon.sh +12 -11
- package/bundled/dev-pipeline/launch-refactor-daemon.sh +11 -10
- 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 +7 -6
- package/bundled/dev-pipeline/retry-feature.sh +7 -6
- package/bundled/dev-pipeline/retry-refactor.sh +7 -6
- package/bundled/dev-pipeline/run-bugfix.sh +16 -15
- package/bundled/dev-pipeline/run-feature.sh +18 -17
- package/bundled/dev-pipeline/run-refactor.sh +16 -15
- package/bundled/dev-pipeline/scripts/cleanup-logs.py +2 -2
- package/bundled/dev-pipeline/scripts/detect-stuck.py +3 -3
- package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +26 -14
- package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +6 -6
- package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +6 -6
- package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +4 -4
- package/bundled/dev-pipeline/scripts/init-pipeline.py +7 -7
- package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +4 -4
- package/bundled/dev-pipeline/scripts/update-bug-status.py +8 -8
- package/bundled/dev-pipeline/scripts/update-feature-status.py +25 -25
- package/bundled/dev-pipeline/scripts/update-refactor-status.py +8 -8
- package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +1 -1
- package/bundled/dev-pipeline/templates/feature-list-schema.json +88 -22
- package/bundled/dev-pipeline/templates/refactor-list-schema.json +1 -1
- package/bundled/skills/_metadata.json +1 -1
- package/bundled/skills/app-planner/SKILL.md +11 -11
- package/bundled/skills/app-planner/references/project-brief-guide.md +1 -1
- package/bundled/skills/bug-fix-workflow/SKILL.md +5 -5
- package/bundled/skills/bug-planner/SKILL.md +21 -21
- package/bundled/skills/bug-planner/scripts/validate-bug-list.py +3 -3
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +29 -29
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +33 -33
- package/bundled/skills/feature-pipeline-launcher/scripts/preflight-check.py +3 -3
- package/bundled/skills/feature-planner/SKILL.md +27 -27
- package/bundled/skills/feature-planner/references/error-recovery.md +8 -8
- package/bundled/skills/feature-planner/scripts/validate-and-generate.py +18 -18
- package/bundled/skills/feature-workflow/SKILL.md +21 -21
- package/bundled/skills/prizmkit-verify/SKILL.md +1 -1
- package/bundled/skills/recovery-workflow/SKILL.md +14 -14
- 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 +31 -31
- package/bundled/skills/refactor-planner/SKILL.md +23 -23
- package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +17 -17
- package/bundled/skills/refactor-workflow/SKILL.md +22 -22
- package/package.json +1 -1
- package/src/clean.js +4 -4
- package/src/gitignore-template.js +7 -8
- package/src/scaffold.js +4 -2
|
@@ -5,12 +5,12 @@ set -euo pipefail
|
|
|
5
5
|
# dev-pipeline/run-refactor.sh - Autonomous Refactor Pipeline Runner
|
|
6
6
|
#
|
|
7
7
|
# Drives the prizm-dev-team through iterative AI CLI sessions to
|
|
8
|
-
# execute refactors from a refactor-list.json specification.
|
|
8
|
+
# execute refactors from a .prizmkit/plans/refactor-list.json specification.
|
|
9
9
|
#
|
|
10
10
|
# Usage:
|
|
11
|
-
# ./run-refactor.sh run [refactor-list.json] Run all refactors
|
|
11
|
+
# ./run-refactor.sh run [.prizmkit/plans/refactor-list.json] Run all refactors
|
|
12
12
|
# ./run-refactor.sh run <refactor-id> [options] Run a single refactor
|
|
13
|
-
# ./run-refactor.sh status [refactor-list.json] Show pipeline status
|
|
13
|
+
# ./run-refactor.sh status [.prizmkit/plans/refactor-list.json] Show pipeline status
|
|
14
14
|
# ./run-refactor.sh reset Clear all state
|
|
15
15
|
#
|
|
16
16
|
# Environment Variables:
|
|
@@ -31,7 +31,8 @@ set -euo pipefail
|
|
|
31
31
|
# ============================================================
|
|
32
32
|
|
|
33
33
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
34
|
-
|
|
34
|
+
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
35
|
+
STATE_DIR="${PROJECT_ROOT}/.prizmkit/state/refactor"
|
|
35
36
|
SCRIPTS_DIR="$SCRIPT_DIR/scripts"
|
|
36
37
|
|
|
37
38
|
# Configuration
|
|
@@ -239,7 +240,7 @@ spawn_and_wait_session() {
|
|
|
239
240
|
--max-retries "$max_retries" \
|
|
240
241
|
--action update >/dev/null 2>&1 || true
|
|
241
242
|
|
|
242
|
-
# Commit refactor-list.json status update (pipeline management commit)
|
|
243
|
+
# Commit .prizmkit/plans/refactor-list.json status update (pipeline management commit)
|
|
243
244
|
if ! git -C "$project_root" diff --quiet "$refactor_list" 2>/dev/null; then
|
|
244
245
|
git -C "$project_root" add "$refactor_list"
|
|
245
246
|
git -C "$project_root" commit --no-verify -m "chore($refactor_id): update refactor status" 2>/dev/null || true
|
|
@@ -337,7 +338,7 @@ run_one() {
|
|
|
337
338
|
fi
|
|
338
339
|
|
|
339
340
|
if [[ -z "$refactor_list" ]]; then
|
|
340
|
-
refactor_list="refactor-list.json"
|
|
341
|
+
refactor_list=".prizmkit/plans/refactor-list.json"
|
|
341
342
|
fi
|
|
342
343
|
if [[ ! "$refactor_list" = /* ]]; then
|
|
343
344
|
refactor_list="$(pwd)/$refactor_list"
|
|
@@ -366,7 +367,7 @@ run_one() {
|
|
|
366
367
|
local _gitignore_path
|
|
367
368
|
_gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
|
|
368
369
|
local _state_rel
|
|
369
|
-
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo "
|
|
370
|
+
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/refactor")
|
|
370
371
|
if [[ -f "$_gitignore_path" ]]; then
|
|
371
372
|
if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
|
|
372
373
|
printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
|
|
@@ -521,7 +522,7 @@ sys.exit(1)
|
|
|
521
522
|
# ============================================================
|
|
522
523
|
|
|
523
524
|
main() {
|
|
524
|
-
local refactor_list="${1
|
|
525
|
+
local refactor_list="${1:-.prizmkit/plans/refactor-list.json}"
|
|
525
526
|
|
|
526
527
|
if [[ ! "$refactor_list" = /* ]]; then
|
|
527
528
|
refactor_list="$(pwd)/$refactor_list"
|
|
@@ -531,7 +532,7 @@ main() {
|
|
|
531
532
|
if [[ ! -f "$refactor_list" ]]; then
|
|
532
533
|
log_error "Refactor list not found: $refactor_list"
|
|
533
534
|
log_info "Create a refactor list first using the refactor-planner skill,"
|
|
534
|
-
log_info "or provide a path: ./run-refactor.sh run <path-to
|
|
535
|
+
log_info "or provide a path: ./run-refactor.sh run <path-to-.prizmkit/plans/refactor-list.json>"
|
|
535
536
|
exit 1
|
|
536
537
|
fi
|
|
537
538
|
|
|
@@ -563,7 +564,7 @@ main() {
|
|
|
563
564
|
local _gitignore_path
|
|
564
565
|
_gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
|
|
565
566
|
local _state_rel
|
|
566
|
-
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo "
|
|
567
|
+
_state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/refactor")
|
|
567
568
|
if [[ -f "$_gitignore_path" ]]; then
|
|
568
569
|
if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
|
|
569
570
|
printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
|
|
@@ -723,9 +724,9 @@ show_help() {
|
|
|
723
724
|
echo "Usage: $0 <command> [options]"
|
|
724
725
|
echo ""
|
|
725
726
|
echo "Commands:"
|
|
726
|
-
echo " run [refactor-list.json] Run all refactors in dependency-topological order"
|
|
727
|
+
echo " run [.prizmkit/plans/refactor-list.json] Run all refactors in dependency-topological order"
|
|
727
728
|
echo " run <refactor-id> [options] Run a single refactor"
|
|
728
|
-
echo " status [refactor-list.json] Show refactor pipeline status"
|
|
729
|
+
echo " status [.prizmkit/plans/refactor-list.json] Show refactor pipeline status"
|
|
729
730
|
echo " reset Clear all refactor state"
|
|
730
731
|
echo " help Show this help message"
|
|
731
732
|
echo ""
|
|
@@ -746,7 +747,7 @@ show_help() {
|
|
|
746
747
|
echo ""
|
|
747
748
|
echo "Examples:"
|
|
748
749
|
echo " ./run-refactor.sh run # Run all refactors"
|
|
749
|
-
echo " ./run-refactor.sh run refactor-list.json # Custom refactor list"
|
|
750
|
+
echo " ./run-refactor.sh run .prizmkit/plans/refactor-list.json # Custom refactor list"
|
|
750
751
|
echo " ./run-refactor.sh run R-001 --dry-run # Inspect generated prompt"
|
|
751
752
|
echo " ./run-refactor.sh run R-001 --timeout 3600 # 1h timeout"
|
|
752
753
|
echo " ./run-refactor.sh status # Show status"
|
|
@@ -760,7 +761,7 @@ case "${1:-run}" in
|
|
|
760
761
|
if [[ "${1:-}" =~ ^[Rr]-[0-9]+ ]]; then
|
|
761
762
|
run_one "$@"
|
|
762
763
|
else
|
|
763
|
-
main "${1
|
|
764
|
+
main "${1:-.prizmkit/plans/refactor-list.json}"
|
|
764
765
|
fi
|
|
765
766
|
;;
|
|
766
767
|
status)
|
|
@@ -770,7 +771,7 @@ case "${1:-run}" in
|
|
|
770
771
|
exit 1
|
|
771
772
|
fi
|
|
772
773
|
python3 "$SCRIPTS_DIR/update-refactor-status.py" \
|
|
773
|
-
--refactor-list "${2
|
|
774
|
+
--refactor-list "${2:-.prizmkit/plans/refactor-list.json}" \
|
|
774
775
|
--state-dir "$STATE_DIR" \
|
|
775
776
|
--action status
|
|
776
777
|
;;
|
|
@@ -9,8 +9,8 @@ Policies:
|
|
|
9
9
|
until within threshold.
|
|
10
10
|
|
|
11
11
|
Usage:
|
|
12
|
-
python3 cleanup-logs.py --state-dir
|
|
13
|
-
python3 cleanup-logs.py --state-dir
|
|
12
|
+
python3 cleanup-logs.py --state-dir .prizmkit/state/features
|
|
13
|
+
python3 cleanup-logs.py --state-dir .prizmkit/state/bugfix --retention-days 30 --max-total-mb 2048
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
import argparse
|
|
@@ -35,7 +35,7 @@ def parse_args():
|
|
|
35
35
|
parser.add_argument(
|
|
36
36
|
"--state-dir",
|
|
37
37
|
required=True,
|
|
38
|
-
help="Path to the state
|
|
38
|
+
help="Path to the state directory (default: .prizmkit/state/features)",
|
|
39
39
|
)
|
|
40
40
|
parser.add_argument(
|
|
41
41
|
"--feature-id",
|
|
@@ -57,7 +57,7 @@ def parse_args():
|
|
|
57
57
|
parser.add_argument(
|
|
58
58
|
"--feature-list",
|
|
59
59
|
default=None,
|
|
60
|
-
help="Path to feature-list.json (overrides pipeline.json reference)",
|
|
60
|
+
help="Path to .prizmkit/plans/feature-list.json (overrides pipeline.json reference)",
|
|
61
61
|
)
|
|
62
62
|
return parser.parse_args()
|
|
63
63
|
|
|
@@ -285,7 +285,7 @@ def check_dependency_deadlock(feature_id, feature_list_data, state_dir):
|
|
|
285
285
|
|
|
286
286
|
|
|
287
287
|
def find_feature_list(state_dir):
|
|
288
|
-
"""Attempt to locate and load feature-list.json via pipeline.json reference.
|
|
288
|
+
"""Attempt to locate and load .prizmkit/plans/feature-list.json via pipeline.json reference.
|
|
289
289
|
|
|
290
290
|
Resolves feature_list_path relative to state_dir when it is a relative path,
|
|
291
291
|
so that pipeline.json is portable across machines and directory structures.
|
|
@@ -38,13 +38,13 @@ def parse_args():
|
|
|
38
38
|
parser = argparse.ArgumentParser(
|
|
39
39
|
description=(
|
|
40
40
|
"Generate a session-specific bootstrap prompt from a template "
|
|
41
|
-
"and feature-list.json."
|
|
41
|
+
"and .prizmkit/plans/feature-list.json."
|
|
42
42
|
)
|
|
43
43
|
)
|
|
44
44
|
parser.add_argument(
|
|
45
45
|
"--feature-list",
|
|
46
46
|
required=True,
|
|
47
|
-
help="Path to feature-list.json",
|
|
47
|
+
help="Path to .prizmkit/plans/feature-list.json",
|
|
48
48
|
)
|
|
49
49
|
parser.add_argument(
|
|
50
50
|
"--feature-id",
|
|
@@ -348,7 +348,7 @@ def get_prev_session_status(state_dir, feature_id):
|
|
|
348
348
|
|
|
349
349
|
|
|
350
350
|
def _read_project_brief(project_root):
|
|
351
|
-
"""Read project-brief.md from
|
|
351
|
+
"""Read project-brief.md from new or old location with fallback.
|
|
352
352
|
|
|
353
353
|
Returns the file content as a string, or a fallback message if absent.
|
|
354
354
|
This brief is generated by app-planner during interactive planning and
|
|
@@ -356,13 +356,25 @@ def _read_project_brief(project_root):
|
|
|
356
356
|
marked [ ] for pending or [x] for completed. Feature sessions should mark
|
|
357
357
|
items [x] and append key file paths when implementing relevant ideas.
|
|
358
358
|
"""
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
359
|
+
# Check both new and old paths for backward compatibility
|
|
360
|
+
new_path = os.path.join(project_root, ".prizmkit", "plans", "project-brief.md")
|
|
361
|
+
old_path = os.path.join(project_root, "project-brief.md")
|
|
362
|
+
|
|
363
|
+
for brief_path in [new_path, old_path]:
|
|
364
|
+
if os.path.isfile(brief_path):
|
|
365
|
+
try:
|
|
366
|
+
with open(brief_path, "r", encoding="utf-8") as f:
|
|
367
|
+
content = f.read().strip()
|
|
368
|
+
if brief_path == old_path:
|
|
369
|
+
# Warn user about old path
|
|
370
|
+
import sys
|
|
371
|
+
print("⚠️ Migration notice: project-brief.md found in root. "
|
|
372
|
+
"Please move to .prizmkit/plans/project-brief.md",
|
|
373
|
+
file=sys.stderr)
|
|
374
|
+
return content
|
|
375
|
+
except IOError:
|
|
376
|
+
return "(project-brief.md exists but could not be read)"
|
|
377
|
+
|
|
366
378
|
return "(No project brief available)"
|
|
367
379
|
|
|
368
380
|
|
|
@@ -1179,12 +1191,12 @@ def build_replacements(args, feature, features, global_context, script_dir):
|
|
|
1179
1191
|
validator_scripts_dir = os.path.join(project_root, "dev-pipeline", "scripts")
|
|
1180
1192
|
init_script_path = os.path.join(validator_scripts_dir, "init-dev-team.py")
|
|
1181
1193
|
|
|
1182
|
-
# Session status path (relative to
|
|
1194
|
+
# Session status path (relative to project root)
|
|
1183
1195
|
session_status_path = os.path.join(
|
|
1184
|
-
"
|
|
1196
|
+
".prizmkit", "state", "features", args.feature_id,
|
|
1185
1197
|
"sessions", args.session_id, "session-status.json",
|
|
1186
1198
|
)
|
|
1187
|
-
# Make it
|
|
1199
|
+
# Make it absolute from project root
|
|
1188
1200
|
session_status_abs = os.path.join(project_root, session_status_path)
|
|
1189
1201
|
|
|
1190
1202
|
prev_status = get_prev_session_status(args.state_dir, args.feature_id)
|
|
@@ -1221,7 +1233,7 @@ def build_replacements(args, feature, features, global_context, script_dir):
|
|
|
1221
1233
|
critic_enabled = bool(feature.get("critic", False))
|
|
1222
1234
|
|
|
1223
1235
|
# Determine critic count (from feature field, default 1)
|
|
1224
|
-
# Multi-critic voting (3) must be explicitly set by the user in feature-list.json
|
|
1236
|
+
# Multi-critic voting (3) must be explicitly set by the user in .prizmkit/plans/feature-list.json
|
|
1225
1237
|
critic_count = feature.get("critic_count", 1)
|
|
1226
1238
|
|
|
1227
1239
|
# Guard: if critic enabled but agent file missing, force disable and warn
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Generate a session-specific bug fix bootstrap prompt from template and bug-fix-list.json.
|
|
2
|
+
"""Generate a session-specific bug fix bootstrap prompt from template and .prizmkit/plans/bug-fix-list.json.
|
|
3
3
|
|
|
4
|
-
Reads the bugfix-bootstrap-prompt.md template and a bug-fix-list.json, resolves all
|
|
4
|
+
Reads the bugfix-bootstrap-prompt.md template and a .prizmkit/plans/bug-fix-list.json, resolves all
|
|
5
5
|
{{PLACEHOLDER}} variables, handles conditional blocks, and writes the rendered
|
|
6
6
|
prompt to the specified output path.
|
|
7
7
|
|
|
@@ -31,16 +31,16 @@ def parse_args():
|
|
|
31
31
|
parser = argparse.ArgumentParser(
|
|
32
32
|
description=(
|
|
33
33
|
"Generate a session-specific bug fix bootstrap prompt from a template "
|
|
34
|
-
"and bug-fix-list.json."
|
|
34
|
+
"and .prizmkit/plans/bug-fix-list.json."
|
|
35
35
|
)
|
|
36
36
|
)
|
|
37
|
-
parser.add_argument("--bug-list", required=True, help="Path to bug-fix-list.json")
|
|
37
|
+
parser.add_argument("--bug-list", required=True, help="Path to .prizmkit/plans/bug-fix-list.json")
|
|
38
38
|
parser.add_argument("--bug-id", required=True, help="Bug ID to generate prompt for (e.g. B-001)")
|
|
39
39
|
parser.add_argument("--session-id", required=True, help="Session ID for this pipeline session")
|
|
40
40
|
parser.add_argument("--run-id", required=True, help="Pipeline run ID")
|
|
41
41
|
parser.add_argument("--retry-count", required=True, help="Current retry count")
|
|
42
42
|
parser.add_argument("--resume-phase", required=True, help='Phase to resume from, or "null" for fresh start')
|
|
43
|
-
parser.add_argument("--state-dir", default=None, help="State directory
|
|
43
|
+
parser.add_argument("--state-dir", default=None, help="State directory (default: .prizmkit/state/bugfix)")
|
|
44
44
|
parser.add_argument("--output", required=True, help="Output path for the rendered prompt")
|
|
45
45
|
parser.add_argument("--template", default=None, help="Custom template path. Defaults to {script_dir}/../templates/bugfix-bootstrap-prompt.md")
|
|
46
46
|
return parser.parse_args()
|
|
@@ -217,7 +217,7 @@ def build_replacements(args, bug, global_context, script_dir):
|
|
|
217
217
|
|
|
218
218
|
# Session status path
|
|
219
219
|
session_status_path = os.path.join(
|
|
220
|
-
project_root, "
|
|
220
|
+
project_root, ".prizmkit", "state", "bugfix", "bugs", args.bug_id,
|
|
221
221
|
"sessions", args.session_id, "session-status.json"
|
|
222
222
|
)
|
|
223
223
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Generate a session-specific refactor bootstrap prompt from template and refactor-list.json.
|
|
2
|
+
"""Generate a session-specific refactor bootstrap prompt from template and .prizmkit/plans/refactor-list.json.
|
|
3
3
|
|
|
4
|
-
Reads the refactor-bootstrap-prompt.md template and a refactor-list.json, resolves all
|
|
4
|
+
Reads the refactor-bootstrap-prompt.md template and a .prizmkit/plans/refactor-list.json, resolves all
|
|
5
5
|
{{PLACEHOLDER}} variables, handles conditional blocks, and writes the rendered
|
|
6
6
|
prompt to the specified output path.
|
|
7
7
|
|
|
@@ -30,16 +30,16 @@ def parse_args():
|
|
|
30
30
|
parser = argparse.ArgumentParser(
|
|
31
31
|
description=(
|
|
32
32
|
"Generate a session-specific refactor bootstrap prompt from a template "
|
|
33
|
-
"and refactor-list.json."
|
|
33
|
+
"and .prizmkit/plans/refactor-list.json."
|
|
34
34
|
)
|
|
35
35
|
)
|
|
36
|
-
parser.add_argument("--refactor-list", required=True, help="Path to refactor-list.json")
|
|
36
|
+
parser.add_argument("--refactor-list", required=True, help="Path to .prizmkit/plans/refactor-list.json")
|
|
37
37
|
parser.add_argument("--refactor-id", required=True, help="Refactor ID to generate prompt for (e.g. R-001)")
|
|
38
38
|
parser.add_argument("--session-id", required=True, help="Session ID for this pipeline session")
|
|
39
39
|
parser.add_argument("--run-id", required=True, help="Pipeline run ID")
|
|
40
40
|
parser.add_argument("--retry-count", required=True, help="Current retry count")
|
|
41
41
|
parser.add_argument("--resume-phase", required=True, help='Phase to resume from, or "null" for fresh start')
|
|
42
|
-
parser.add_argument("--state-dir", default=None, help="State directory
|
|
42
|
+
parser.add_argument("--state-dir", default=None, help="State directory (default: .prizmkit/state/refactor)")
|
|
43
43
|
parser.add_argument("--output", required=True, help="Output path for the rendered prompt")
|
|
44
44
|
parser.add_argument("--template", default=None, help="Custom template path. Defaults to {script_dir}/../templates/refactor-bootstrap-prompt.md")
|
|
45
45
|
return parser.parse_args()
|
|
@@ -247,7 +247,7 @@ def build_replacements(args, refactor, global_context, script_dir):
|
|
|
247
247
|
|
|
248
248
|
# Session status path
|
|
249
249
|
session_status_path = os.path.join(
|
|
250
|
-
project_root, "
|
|
250
|
+
project_root, ".prizmkit", "state", "refactor", "refactors", args.refactor_id,
|
|
251
251
|
"sessions", args.session_id, "session-status.json"
|
|
252
252
|
)
|
|
253
253
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Initialize the bug-fix pipeline state directory from a bug-fix-list.json file.
|
|
2
|
+
"""Initialize the bug-fix pipeline state directory from a .prizmkit/plans/bug-fix-list.json file.
|
|
3
3
|
|
|
4
4
|
Validates the bug fix list schema, sorts by priority/severity, and creates
|
|
5
5
|
the state directory structure with pipeline and per-bug status files.
|
|
@@ -40,17 +40,17 @@ VALID_STATUSES = [
|
|
|
40
40
|
|
|
41
41
|
def parse_args():
|
|
42
42
|
parser = argparse.ArgumentParser(
|
|
43
|
-
description="Initialize bug-fix pipeline state from a bug-fix-list.json file."
|
|
43
|
+
description="Initialize bug-fix pipeline state from a .prizmkit/plans/bug-fix-list.json file."
|
|
44
44
|
)
|
|
45
45
|
parser.add_argument(
|
|
46
46
|
"--bug-list",
|
|
47
47
|
required=True,
|
|
48
|
-
help="Path to the bug-fix-list.json file",
|
|
48
|
+
help="Path to the .prizmkit/plans/bug-fix-list.json file",
|
|
49
49
|
)
|
|
50
50
|
parser.add_argument(
|
|
51
51
|
"--state-dir",
|
|
52
52
|
required=True,
|
|
53
|
-
help="Path to the state directory
|
|
53
|
+
help="Path to the state directory (default: .prizmkit/state/bugfix)",
|
|
54
54
|
)
|
|
55
55
|
return parser.parse_args()
|
|
56
56
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Initialize the dev-pipeline state directory from a feature-list.json file.
|
|
2
|
+
"""Initialize the dev-pipeline state directory from a .prizmkit/plans/feature-list.json file.
|
|
3
3
|
|
|
4
4
|
Validates the feature list schema, checks dependency DAG for cycles,
|
|
5
5
|
and creates the state directory structure with pipeline and feature status files.
|
|
@@ -35,17 +35,17 @@ REQUIRED_FEATURE_FIELDS = [
|
|
|
35
35
|
|
|
36
36
|
def parse_args():
|
|
37
37
|
parser = argparse.ArgumentParser(
|
|
38
|
-
description="Initialize dev-pipeline state from a feature-list.json file."
|
|
38
|
+
description="Initialize dev-pipeline state from a .prizmkit/plans/feature-list.json file."
|
|
39
39
|
)
|
|
40
40
|
parser.add_argument(
|
|
41
41
|
"--feature-list",
|
|
42
42
|
required=True,
|
|
43
|
-
help="Path to the feature-list.json file",
|
|
43
|
+
help="Path to the .prizmkit/plans/feature-list.json file",
|
|
44
44
|
)
|
|
45
45
|
parser.add_argument(
|
|
46
46
|
"--state-dir",
|
|
47
47
|
required=True,
|
|
48
|
-
help="Path to the state directory
|
|
48
|
+
help="Path to the state directory (default: .prizmkit/state/features)",
|
|
49
49
|
)
|
|
50
50
|
return parser.parse_args()
|
|
51
51
|
|
|
@@ -283,7 +283,7 @@ def create_state_directory(state_dir, feature_list_path, features):
|
|
|
283
283
|
sessions_dir = os.path.join(feature_dir, "sessions")
|
|
284
284
|
os.makedirs(sessions_dir, exist_ok=True)
|
|
285
285
|
|
|
286
|
-
# Respect existing terminal status from feature-list.json
|
|
286
|
+
# Respect existing terminal status from .prizmkit/plans/feature-list.json
|
|
287
287
|
fl_status = feature.get("status", "pending")
|
|
288
288
|
init_status = fl_status if fl_status in TERMINAL_STATUSES else "pending"
|
|
289
289
|
|
|
@@ -316,13 +316,13 @@ def main():
|
|
|
316
316
|
print(json.dumps(output, indent=2, ensure_ascii=False))
|
|
317
317
|
sys.exit(1)
|
|
318
318
|
|
|
319
|
-
# Warn if feature-list.json is not at project root
|
|
319
|
+
# Warn if .prizmkit/plans/feature-list.json is not at project root
|
|
320
320
|
feature_list_dir = os.path.dirname(os.path.abspath(args.feature_list))
|
|
321
321
|
indicators = ['.git', 'package.json', '.prizmkit']
|
|
322
322
|
is_at_root = any(os.path.exists(os.path.join(feature_list_dir, i)) for i in indicators)
|
|
323
323
|
if not is_at_root:
|
|
324
324
|
sys.stderr.write(
|
|
325
|
-
"Warning: feature-list.json may not be at project root: {}\n".format(feature_list_dir)
|
|
325
|
+
"Warning: .prizmkit/plans/feature-list.json may not be at project root: {}\n".format(feature_list_dir)
|
|
326
326
|
)
|
|
327
327
|
|
|
328
328
|
# Validate schema
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Initialize the refactor pipeline state directory from a refactor-list.json file.
|
|
2
|
+
"""Initialize the refactor pipeline state directory from a .prizmkit/plans/refactor-list.json file.
|
|
3
3
|
|
|
4
4
|
Validates the refactor list schema, sorts by priority/complexity, checks for
|
|
5
5
|
circular dependencies, and creates the state directory structure with pipeline
|
|
@@ -47,17 +47,17 @@ VALID_BEHAVIOR_STRATEGIES = ["test-gate", "snapshot", "manual"]
|
|
|
47
47
|
|
|
48
48
|
def parse_args():
|
|
49
49
|
parser = argparse.ArgumentParser(
|
|
50
|
-
description="Initialize refactor pipeline state from a refactor-list.json file."
|
|
50
|
+
description="Initialize refactor pipeline state from a .prizmkit/plans/refactor-list.json file."
|
|
51
51
|
)
|
|
52
52
|
parser.add_argument(
|
|
53
53
|
"--refactor-list",
|
|
54
54
|
required=True,
|
|
55
|
-
help="Path to the refactor-list.json file",
|
|
55
|
+
help="Path to the .prizmkit/plans/refactor-list.json file",
|
|
56
56
|
)
|
|
57
57
|
parser.add_argument(
|
|
58
58
|
"--state-dir",
|
|
59
59
|
required=True,
|
|
60
|
-
help="Path to the state directory
|
|
60
|
+
help="Path to the state directory (default: .prizmkit/state/refactor)",
|
|
61
61
|
)
|
|
62
62
|
return parser.parse_args()
|
|
63
63
|
|
|
@@ -57,8 +57,8 @@ def parse_args():
|
|
|
57
57
|
parser = argparse.ArgumentParser(
|
|
58
58
|
description="Core state machine for bug-fix pipeline bug status management."
|
|
59
59
|
)
|
|
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
|
|
60
|
+
parser.add_argument("--bug-list", required=True, help="Path to the .prizmkit/plans/bug-fix-list.json file")
|
|
61
|
+
parser.add_argument("--state-dir", required=True, help="Path to the state directory (default: .prizmkit/state/bugfix)")
|
|
62
62
|
parser.add_argument(
|
|
63
63
|
"--action", required=True,
|
|
64
64
|
choices=["get_next", "update", "status", "pause", "reset", "clean"],
|
|
@@ -128,7 +128,7 @@ def update_bug_in_list(bug_list_path, bug_id, new_status):
|
|
|
128
128
|
found = True
|
|
129
129
|
break
|
|
130
130
|
if not found:
|
|
131
|
-
return "Bug '{}' not found in bug-fix-list.json".format(bug_id)
|
|
131
|
+
return "Bug '{}' not found in .prizmkit/plans/bug-fix-list.json".format(bug_id)
|
|
132
132
|
return write_json_file(bug_list_path, data)
|
|
133
133
|
|
|
134
134
|
|
|
@@ -238,7 +238,7 @@ def action_update(args, bug_list_path, state_dir):
|
|
|
238
238
|
bs["resume_from_phase"] = None
|
|
239
239
|
err = update_bug_in_list(bug_list_path, bug_id, "completed")
|
|
240
240
|
if err:
|
|
241
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
241
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
242
242
|
return
|
|
243
243
|
elif session_status == "merge_conflict":
|
|
244
244
|
# Degraded outcome: keep artifacts for retry (branch preserves work)
|
|
@@ -257,7 +257,7 @@ def action_update(args, bug_list_path, state_dir):
|
|
|
257
257
|
|
|
258
258
|
err = update_bug_in_list(bug_list_path, bug_id, target_status)
|
|
259
259
|
if err:
|
|
260
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
260
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
261
261
|
return
|
|
262
262
|
else:
|
|
263
263
|
bs["retry_count"] = bs.get("retry_count", 0) + 1
|
|
@@ -281,7 +281,7 @@ def action_update(args, bug_list_path, state_dir):
|
|
|
281
281
|
|
|
282
282
|
err = update_bug_in_list(bug_list_path, bug_id, target_status)
|
|
283
283
|
if err:
|
|
284
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
284
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
285
285
|
return
|
|
286
286
|
|
|
287
287
|
if session_status == "success" and session_id:
|
|
@@ -544,7 +544,7 @@ def action_reset(args, bug_list_path, state_dir):
|
|
|
544
544
|
|
|
545
545
|
err = update_bug_in_list(bug_list_path, bug_id, "pending")
|
|
546
546
|
if err:
|
|
547
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
547
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
548
548
|
return
|
|
549
549
|
|
|
550
550
|
result = {
|
|
@@ -620,7 +620,7 @@ def action_clean(args, bug_list_path, state_dir):
|
|
|
620
620
|
|
|
621
621
|
err = update_bug_in_list(bug_list_path, bug_id, "pending")
|
|
622
622
|
if err:
|
|
623
|
-
error_out("Failed to update bug-fix-list.json: {}".format(err))
|
|
623
|
+
error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
|
|
624
624
|
return
|
|
625
625
|
|
|
626
626
|
result = {
|