prizmkit 1.0.89 → 1.0.91

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "frameworkVersion": "1.0.89",
3
- "bundledAt": "2026-03-22T14:55:28.566Z",
4
- "bundledFrom": "d430233"
2
+ "frameworkVersion": "1.0.91",
3
+ "bundledAt": "2026-03-22T16:22:09.148Z",
4
+ "bundledFrom": "e2ee289"
5
5
  }
@@ -93,18 +93,23 @@ branch_merge() {
93
93
  local auto_push="${4:-0}"
94
94
 
95
95
  # Step 1: Checkout original branch
96
+ # First commit any remaining dirty files so checkout is not blocked
97
+ local remaining_dirty
98
+ remaining_dirty=$(git -C "$project_root" status --porcelain 2>/dev/null || true)
99
+ if [[ -n "$remaining_dirty" ]]; then
100
+ git -C "$project_root" add -A 2>/dev/null || true
101
+ git -C "$project_root" commit --no-verify -m "chore: include pipeline state artifacts" 2>/dev/null || true
102
+ fi
96
103
  if ! git -C "$project_root" checkout "$original_branch" 2>/dev/null; then
97
104
  log_error "Failed to checkout $original_branch for merge"
98
105
  return 1
99
106
  fi
100
107
 
101
- # Step 2: Merge dev branch
108
+ # Step 2: Merge dev branch (fast-forward only — avoids interactive merge commit editor)
102
109
  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 conflicts manually:"
105
- log_error " git checkout $original_branch && git merge $dev_branch"
106
- # Return to dev branch so state is not lost
107
- git -C "$project_root" merge --abort 2>/dev/null || true
110
+ if ! git -C "$project_root" merge --ff-only "$dev_branch" 2>&1; then
111
+ log_error "Merge failed (non-fast-forward) — resolve manually:"
112
+ log_error " git checkout $original_branch && git rebase $dev_branch"
108
113
  git -C "$project_root" checkout "$dev_branch" 2>/dev/null || true
109
114
  return 1
110
115
  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 merge $_DEV_BRANCH_NAME"
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 merge $_DEV_BRANCH_NAME"
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 fl_path and os.path.isfile(fl_path):
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
- feature_list_data = find_feature_list(state_dir)
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": abs_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": abs_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,
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.89",
2
+ "version": "1.0.91",
3
3
  "skills": {
4
4
  "prizm-kit": {
5
5
  "description": "Full-lifecycle dev toolkit. Covers spec-driven development, Prizm context docs, code quality, debugging, deployment, and knowledge management.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prizmkit",
3
- "version": "1.0.89",
3
+ "version": "1.0.91",
4
4
  "description": "Create a new PrizmKit-powered project with clean initialization — no framework dev files, just what you need.",
5
5
  "type": "module",
6
6
  "bin": {