prizmkit 1.0.89 → 1.0.90
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/lib/branch.sh +4 -6
- package/bundled/dev-pipeline/retry-bug.sh +3 -0
- package/bundled/dev-pipeline/run-bugfix.sh +4 -1
- package/bundled/dev-pipeline/run.sh +1 -1
- package/bundled/dev-pipeline/scripts/detect-stuck.py +25 -3
- package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +3 -1
- package/bundled/dev-pipeline/scripts/init-pipeline.py +3 -1
- package/bundled/skills/_metadata.json +1 -1
- package/package.json +1 -1
package/bundled/VERSION.json
CHANGED
|
@@ -98,13 +98,11 @@ branch_merge() {
|
|
|
98
98
|
return 1
|
|
99
99
|
fi
|
|
100
100
|
|
|
101
|
-
# Step 2: Merge dev branch
|
|
101
|
+
# Step 2: Merge dev branch (fast-forward only — avoids interactive merge commit editor)
|
|
102
102
|
log_info "Merging $dev_branch into $original_branch..."
|
|
103
|
-
if ! git -C "$project_root" merge "$dev_branch" 2>&1; then
|
|
104
|
-
log_error "Merge failed — resolve
|
|
105
|
-
log_error " git checkout $original_branch && git
|
|
106
|
-
# Return to dev branch so state is not lost
|
|
107
|
-
git -C "$project_root" merge --abort 2>/dev/null || true
|
|
103
|
+
if ! git -C "$project_root" merge --ff-only "$dev_branch" 2>&1; then
|
|
104
|
+
log_error "Merge failed (non-fast-forward) — resolve manually:"
|
|
105
|
+
log_error " git checkout $original_branch && git rebase $dev_branch"
|
|
108
106
|
git -C "$project_root" checkout "$dev_branch" 2>/dev/null || true
|
|
109
107
|
return 1
|
|
110
108
|
fi
|
|
@@ -175,6 +175,9 @@ python3 "$SCRIPTS_DIR/update-bug-status.py" \
|
|
|
175
175
|
log_warn "Failed to clean bug artifacts (continuing with fresh session only)"
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
# Auto-detect available models (must run before any git commit operations)
|
|
179
|
+
bash "$SCRIPT_DIR/scripts/detect-models.sh" --quiet 2>/dev/null || true
|
|
180
|
+
|
|
178
181
|
# ============================================================
|
|
179
182
|
# Generate bootstrap prompt
|
|
180
183
|
# ============================================================
|
|
@@ -533,6 +533,9 @@ main() {
|
|
|
533
533
|
log_info "Resuming existing bugfix pipeline..."
|
|
534
534
|
fi
|
|
535
535
|
|
|
536
|
+
# Auto-detect available models (must run before any git commit operations)
|
|
537
|
+
bash "$SCRIPT_DIR/scripts/detect-models.sh" --quiet 2>/dev/null || true
|
|
538
|
+
|
|
536
539
|
# Print header
|
|
537
540
|
echo ""
|
|
538
541
|
echo -e "${BOLD}════════════════════════════════════════════════════${NC}"
|
|
@@ -594,7 +597,7 @@ main() {
|
|
|
594
597
|
_DEV_BRANCH_NAME=""
|
|
595
598
|
else
|
|
596
599
|
log_warn "Auto-merge failed — dev branch preserved: $_DEV_BRANCH_NAME"
|
|
597
|
-
log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git
|
|
600
|
+
log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git rebase $_DEV_BRANCH_NAME"
|
|
598
601
|
fi
|
|
599
602
|
fi
|
|
600
603
|
break
|
|
@@ -959,7 +959,7 @@ for f in data.get('stuck_features', []):
|
|
|
959
959
|
_DEV_BRANCH_NAME=""
|
|
960
960
|
else
|
|
961
961
|
log_warn "Auto-merge failed — dev branch preserved: $_DEV_BRANCH_NAME"
|
|
962
|
-
log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git
|
|
962
|
+
log_warn "Merge manually: git checkout $_ORIGINAL_BRANCH && git rebase $_DEV_BRANCH_NAME"
|
|
963
963
|
fi
|
|
964
964
|
fi
|
|
965
965
|
break
|
|
@@ -13,6 +13,7 @@ features are found, 0 otherwise.
|
|
|
13
13
|
Usage:
|
|
14
14
|
python3 detect-stuck.py --state-dir <path> [--feature-id <id>]
|
|
15
15
|
[--max-retries <n>] [--stale-threshold <seconds>]
|
|
16
|
+
[--feature-list <path>]
|
|
16
17
|
"""
|
|
17
18
|
|
|
18
19
|
import argparse
|
|
@@ -53,6 +54,11 @@ def parse_args():
|
|
|
53
54
|
default=600,
|
|
54
55
|
help="Heartbeat staleness threshold in seconds (default: 600)",
|
|
55
56
|
)
|
|
57
|
+
parser.add_argument(
|
|
58
|
+
"--feature-list",
|
|
59
|
+
default=None,
|
|
60
|
+
help="Path to feature-list.json (overrides pipeline.json reference)",
|
|
61
|
+
)
|
|
56
62
|
return parser.parse_args()
|
|
57
63
|
|
|
58
64
|
|
|
@@ -289,14 +295,26 @@ def check_dependency_deadlock(feature_id, feature_list_data, state_dir):
|
|
|
289
295
|
|
|
290
296
|
|
|
291
297
|
def find_feature_list(state_dir):
|
|
292
|
-
"""Attempt to locate and load feature-list.json via pipeline.json reference.
|
|
298
|
+
"""Attempt to locate and load feature-list.json via pipeline.json reference.
|
|
299
|
+
|
|
300
|
+
Resolves feature_list_path relative to state_dir when it is a relative path,
|
|
301
|
+
so that pipeline.json is portable across machines and directory structures.
|
|
302
|
+
"""
|
|
293
303
|
pipeline_path = os.path.join(state_dir, "pipeline.json")
|
|
294
304
|
pipeline = load_json(pipeline_path)
|
|
295
305
|
if pipeline is None:
|
|
296
306
|
return None
|
|
297
307
|
|
|
298
308
|
fl_path = pipeline.get("feature_list_path")
|
|
299
|
-
if
|
|
309
|
+
if not fl_path:
|
|
310
|
+
return None
|
|
311
|
+
|
|
312
|
+
# Resolve relative paths relative to state_dir (not process cwd)
|
|
313
|
+
if not os.path.isabs(fl_path):
|
|
314
|
+
fl_path = os.path.join(state_dir, fl_path)
|
|
315
|
+
|
|
316
|
+
fl_path = os.path.normpath(fl_path)
|
|
317
|
+
if os.path.isfile(fl_path):
|
|
300
318
|
return load_json(fl_path)
|
|
301
319
|
|
|
302
320
|
return None
|
|
@@ -354,7 +372,11 @@ def main():
|
|
|
354
372
|
feature_ids = discover_feature_ids(state_dir)
|
|
355
373
|
|
|
356
374
|
# Load feature list for dependency checks
|
|
357
|
-
|
|
375
|
+
# Prefer CLI-provided path; fall back to pipeline.json reference
|
|
376
|
+
if args.feature_list:
|
|
377
|
+
feature_list_data = load_json(os.path.abspath(args.feature_list))
|
|
378
|
+
else:
|
|
379
|
+
feature_list_data = find_feature_list(state_dir)
|
|
358
380
|
|
|
359
381
|
stuck_features = []
|
|
360
382
|
for fid in feature_ids:
|
|
@@ -190,6 +190,8 @@ def create_state_directory(state_dir, bug_list_path, bugs):
|
|
|
190
190
|
"""Create the state directory structure with pipeline.json and per-bug status files."""
|
|
191
191
|
abs_state_dir = os.path.abspath(state_dir)
|
|
192
192
|
abs_bug_list_path = os.path.abspath(bug_list_path)
|
|
193
|
+
# Store as relative path from state_dir so pipeline.json is portable across machines
|
|
194
|
+
rel_bug_list_path = os.path.relpath(abs_bug_list_path, abs_state_dir)
|
|
193
195
|
bugs_dir = os.path.join(abs_state_dir, "bugs")
|
|
194
196
|
|
|
195
197
|
now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
@@ -204,7 +206,7 @@ def create_state_directory(state_dir, bug_list_path, bugs):
|
|
|
204
206
|
"run_id": run_id,
|
|
205
207
|
"pipeline_type": "bugfix",
|
|
206
208
|
"status": "initialized",
|
|
207
|
-
"bug_list_path":
|
|
209
|
+
"bug_list_path": rel_bug_list_path,
|
|
208
210
|
"created_at": now,
|
|
209
211
|
"total_bugs": len(bugs),
|
|
210
212
|
"completed_bugs": 0,
|
|
@@ -226,6 +226,8 @@ def create_state_directory(state_dir, feature_list_path, features):
|
|
|
226
226
|
"""Create the state directory structure with pipeline.json and per-feature status files."""
|
|
227
227
|
abs_state_dir = os.path.abspath(state_dir)
|
|
228
228
|
abs_feature_list_path = os.path.abspath(feature_list_path)
|
|
229
|
+
# Store as relative path from state_dir so pipeline.json is portable across machines
|
|
230
|
+
rel_feature_list_path = os.path.relpath(abs_feature_list_path, abs_state_dir)
|
|
229
231
|
features_dir = os.path.join(abs_state_dir, "features")
|
|
230
232
|
|
|
231
233
|
now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
@@ -245,7 +247,7 @@ def create_state_directory(state_dir, feature_list_path, features):
|
|
|
245
247
|
pipeline_state = {
|
|
246
248
|
"run_id": run_id,
|
|
247
249
|
"status": "initialized",
|
|
248
|
-
"feature_list_path":
|
|
250
|
+
"feature_list_path": rel_feature_list_path,
|
|
249
251
|
"created_at": now,
|
|
250
252
|
"total_features": len(features),
|
|
251
253
|
"completed_features": completed_count,
|