prizmkit 1.1.118 → 1.1.119

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.1.118",
3
- "bundledAt": "2026-07-09T14:31:05.918Z",
4
- "bundledFrom": "932cf65"
2
+ "frameworkVersion": "1.1.119",
3
+ "bundledAt": "2026-07-09T15:35:51.674Z",
4
+ "bundledFrom": "8a729da"
5
5
  }
@@ -33,10 +33,8 @@ HIDDEN_TOOL_WORKTREE_EXCLUDES = (
33
33
  ":(top,exclude).prizmkit/manifest.json",
34
34
  ":(top,exclude).prizmkit/state",
35
35
  ":(top,exclude,glob).prizmkit/state/**",
36
- ":(top,exclude).prizmkit/dev-pipeline/scripts",
37
- ":(top,exclude,glob).prizmkit/dev-pipeline/scripts/**",
38
- ":(top,exclude).prizmkit/dev-pipeline/prizmkit_runtime",
39
- ":(top,exclude,glob).prizmkit/dev-pipeline/prizmkit_runtime/**",
36
+ ":(top,exclude).prizmkit/dev-pipeline",
37
+ ":(top,exclude,glob).prizmkit/dev-pipeline/**",
40
38
  )
41
39
 
42
40
  PIPELINE_FALLBACK_GIT_NAME = "PrizmKit Pipeline"
@@ -46,18 +46,27 @@ def _visible_status_result(project_root: Path) -> GitCommandResult:
46
46
  return run_git_command(project_root, ("status", "--porcelain", "--", ".", *HIDDEN_TOOL_WORKTREE_EXCLUDES))
47
47
 
48
48
 
49
+ def _paths_from_status(stdout: str) -> tuple[str, ...]:
50
+ changed: list[str] = []
51
+ seen: set[str] = set()
52
+ for line in stdout.splitlines():
53
+ if len(line) < 4:
54
+ continue
55
+ path = line[3:].strip()
56
+ paths = path.split(" -> ", 1) if " -> " in path else [path]
57
+ for candidate in paths:
58
+ candidate = candidate.strip()
59
+ if candidate and candidate not in seen:
60
+ changed.append(candidate)
61
+ seen.add(candidate)
62
+ return tuple(changed)
63
+
64
+
49
65
  def _changed_paths_in(project_root: Path, paths: Sequence[str]) -> tuple[str, ...]:
50
66
  result = run_git_command(project_root, ("status", "--porcelain", "--", *paths))
51
67
  if result.return_code != 0:
52
68
  return ()
53
- changed: list[str] = []
54
- for line in result.stdout.splitlines():
55
- path = line[3:].strip()
56
- if " -> " in path:
57
- path = path.split(" -> ", 1)[1].strip()
58
- if path:
59
- changed.append(path)
60
- return tuple(changed)
69
+ return _paths_from_status(result.stdout)
61
70
 
62
71
 
63
72
  def commit_bookkeeping_changes(
@@ -80,14 +89,15 @@ def commit_preflight_ready_changes(project_root: Path, item_id: str) -> Bookkeep
80
89
  visible_status = _visible_status_result(project_root)
81
90
  if visible_status.return_code != 0:
82
91
  return BookkeepingResult(attempted=True, committed=False, result=visible_status)
83
- if not visible_status.stdout.strip():
92
+ paths = _paths_from_status(visible_status.stdout)
93
+ if not paths:
84
94
  return BookkeepingResult(attempted=False, committed=False)
85
- add_result = run_git_command(project_root, ("add", "-A", "--", ".", *HIDDEN_TOOL_WORKTREE_EXCLUDES))
95
+ add_result = run_git_command(project_root, ("add", "-A", "-f", "--", *paths))
86
96
  if add_result.return_code != 0:
87
97
  return BookkeepingResult(attempted=True, committed=False, result=add_result)
88
98
  result = run_git_command(
89
99
  project_root,
90
- ("commit", "--no-verify", "-m", f"chore: ready for {item_id}", "--", ".", *HIDDEN_TOOL_WORKTREE_EXCLUDES),
100
+ ("commit", "--no-verify", "-m", f"chore: ready for {item_id}", "--", *paths),
91
101
  )
92
102
  if result.return_code != 0:
93
103
  return BookkeepingResult(attempted=True, committed=False, result=result)
@@ -1771,7 +1771,8 @@ def test_git_status_safe_ignores_worktree_support_assets(monkeypatch, tmp_path):
1771
1771
  joined = " ".join(status_args)
1772
1772
  assert ":(top,exclude).prizmkit-worktree" in status_args
1773
1773
  assert ":(top,exclude).claude" in status_args
1774
- assert ":(top,exclude).prizmkit/dev-pipeline/scripts" in status_args
1774
+ assert ":(top,exclude).prizmkit/dev-pipeline" in status_args
1775
+ assert ":(top,exclude,glob).prizmkit/dev-pipeline/**" in status_args
1775
1776
  assert all(exclude in status_args for exclude in HIDDEN_TOOL_WORKTREE_EXCLUDES)
1776
1777
  assert ".prizmkit-worktree" in joined
1777
1778
 
@@ -1958,6 +1959,26 @@ def test_preflight_ready_commit_preserves_dirty_changes_without_repo_git_identit
1958
1959
  assert _short_status(repo) == ""
1959
1960
 
1960
1961
 
1962
+ def test_preflight_ready_commit_force_stages_visible_file_when_prizmkit_dir_is_ignored(tmp_path):
1963
+ from prizmkit_runtime.runner_bookkeeping import commit_preflight_ready_changes
1964
+
1965
+ repo = tmp_path / "repo"
1966
+ _init_temp_repo(repo)
1967
+ (repo / ".gitignore").write_text(".prizmkit/*\n", encoding="utf-8")
1968
+ subprocess.run(["git", "add", ".gitignore"], cwd=repo, check=True)
1969
+ subprocess.run(["git", "commit", "-m", "ignore prizmkit"], cwd=repo, check=True, stdout=subprocess.DEVNULL)
1970
+ (repo / ".prizmkit" / "dev-pipeline" / "templates").mkdir(parents=True)
1971
+ (repo / ".prizmkit" / "dev-pipeline" / "templates" / "bootstrap-prompt.md").write_text("ignored runtime\n", encoding="utf-8")
1972
+ (repo / "visible.txt").write_text("dirty\n", encoding="utf-8")
1973
+
1974
+ result = commit_preflight_ready_changes(repo, "F-008")
1975
+
1976
+ assert result.committed
1977
+ assert _head_commit_message(repo) == "chore: ready for F-008"
1978
+ assert _head_files(repo) == {"visible.txt"}
1979
+ assert _short_status(repo) == ""
1980
+
1981
+
1961
1982
  def test_materialize_worktree_support_assets_copies_ignored_assets_without_retired_shell_sources(tmp_path):
1962
1983
  from prizmkit_runtime.gitops import (
1963
1984
  BranchContext,
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.118",
2
+ "version": "1.1.119",
3
3
  "skills": {
4
4
  "prizmkit": {
5
5
  "description": "Full-lifecycle dev toolkit. Covers spec-driven development, Prizm context docs, code quality, debugging, deployment, and knowledge management.",
@@ -46,13 +46,15 @@ Before any action, validate:
46
46
 
47
47
  1. **bugfix pipeline exists**: Confirm `.prizmkit/dev-pipeline/cli.py` is present
48
48
  2. **For start**: `.prizmkit/plans/bug-fix-list.json` must exist in `.prizmkit/plans/` (or user-specified path)
49
- 3. **Dependencies**: `python3`, `git`, and AI CLI (`cbc` or `claude`) must be in PATH
49
+ 3. **Dependencies**: `python3`, `git`, and the configured AI CLI must be in PATH. Resolve and report the AI CLI from `AI_CLI` env, then `.prizmkit/config.json` `ai_cli`, then fallback to `claude` only when neither is configured. Read `${SKILL_DIR}/references/configuration.md` §Configured AI CLI Prerequisite Check before running the AI CLI check.
50
50
  4. **Python version**: Requires Python 3.10+ for the unified dev-pipeline runtime
51
51
  5. **Browser tools** (optional): If any bug has `browser_interaction` field, check the corresponding tool is available. Bugs may specify `tool: "playwright-cli"`, `tool: "opencli"`, or `tool: "auto"` (AI chooses at runtime).
52
52
 
53
53
  Quick check:
54
54
  ```bash
55
- command -v python3 && command -v git && (command -v cbc || command -v claude) && echo "All dependencies OK"
55
+ command -v python3 >/dev/null && command -v git >/dev/null && echo "Core dependencies OK"
56
+ # AI CLI check: read `${SKILL_DIR}/references/configuration.md` §Configured AI CLI Prerequisite Check.
57
+ # It must print `Configured AI CLI: <name>` and verify that exact executable.
56
58
  # Optional: browser interaction support (check both tools — bugs may use either)
57
59
  command -v playwright-cli && echo "playwright-cli OK" || echo "playwright-cli not found (playwright browser verification will be skipped)"
58
60
  command -v opencli && echo "opencli OK" || echo "opencli not found (opencli browser verification will be skipped)"
@@ -2,6 +2,45 @@
2
2
 
3
3
  Environment variable mappings for the bugfix launcher.
4
4
 
5
+ ## Configured AI CLI Prerequisite Check
6
+
7
+ Read this section during launcher prerequisite validation before reporting AI CLI availability.
8
+
9
+ Runtime AI CLI selection is config-driven. Resolve the executable name in this order:
10
+ 1. `AI_CLI` environment variable when set.
11
+ 2. `.prizmkit/config.json` `ai_cli` when present.
12
+ 3. `claude` fallback only when neither is configured.
13
+
14
+ Run this quick check from the project root:
15
+ ```bash
16
+ command -v python3 >/dev/null && command -v git >/dev/null || { echo "python3 or git missing"; exit 1; }
17
+ AI_CLI="$(
18
+ python3 - <<'PY'
19
+ import json, os, shlex
20
+ from pathlib import Path
21
+ cli = os.environ.get("AI_CLI", "").strip()
22
+ if not cli:
23
+ config_path = Path(".prizmkit/config.json")
24
+ if config_path.is_file():
25
+ try:
26
+ data = json.loads(config_path.read_text(encoding="utf-8"))
27
+ cli = str(data.get("ai_cli") or "").strip()
28
+ except (OSError, json.JSONDecodeError):
29
+ cli = ""
30
+ cli = cli or "claude"
31
+ try:
32
+ print(shlex.split(cli)[0])
33
+ except ValueError:
34
+ print(cli.split()[0] if cli.split() else "claude")
35
+ PY
36
+ )"
37
+ printf 'Configured AI CLI: %s\n' "$AI_CLI"
38
+ command -v "$AI_CLI" >/dev/null && printf 'AI CLI OK: %s\n' "$(command -v "$AI_CLI")" || { printf 'AI CLI not found: %s\n' "$AI_CLI"; exit 1; }
39
+ echo "All dependencies OK"
40
+ ```
41
+
42
+ Report the configured executable, for example `Configured AI CLI: claude`. Do not report the first arbitrary PATH match such as `cbc` when project config selects a different AI CLI.
43
+
5
44
  ## Environment Variable Mapping
6
45
 
7
46
  Translating user responses to env vars:
@@ -73,7 +112,7 @@ Note: Bug filter defaults to all bugs. Runtime selects eligible bugs in stable l
73
112
  | `.prizmkit/plans/bug-fix-list.json` not found | Tell user to run `bug-planner` skill first |
74
113
  | `python3` not installed | Install Python 3.10+ and rerun the Python runtime command |
75
114
  | `git` not installed | Install git; the Python runtime uses git for branch/worktree/status operations |
76
- | `cbc`/`claude` not in PATH | Check AI CLI installation |
115
+ | Configured AI CLI not in PATH | Install the executable selected by `AI_CLI` or `.prizmkit/config.json` `ai_cli`, or update the config to a CLI available in PATH. |
77
116
  | Bugfix pipeline already running | Show status, ask if user wants to stop and restart |
78
117
  | PID file stale (process dead) | `python3 ./.prizmkit/dev-pipeline/cli.py daemon bugfix start .prizmkit/plans/bug-fix-list.json` auto-cleans, retry start |
79
118
  | Launch failed (process died immediately) | Show last 20 lines of log: `python3 ./.prizmkit/dev-pipeline/cli.py daemon bugfix logs --lines 20` |
@@ -40,13 +40,15 @@ Before any action, validate:
40
40
 
41
41
  1. **dev-pipeline exists**: Confirm `.prizmkit/dev-pipeline/cli.py` is present
42
42
  2. **For start**: `.prizmkit/plans/feature-list.json` must exist in `.prizmkit/plans/` (or user-specified path)
43
- 3. **Dependencies**: `python3`, `git`, and AI CLI (`cbc` or `claude`) must be in PATH
43
+ 3. **Dependencies**: `python3`, `git`, and the configured AI CLI must be in PATH. Resolve and report the AI CLI from `AI_CLI` env, then `.prizmkit/config.json` `ai_cli`, then fallback to `claude` only when neither is configured. Read `${SKILL_DIR}/references/configuration.md` §Configured AI CLI Prerequisite Check before running the AI CLI check.
44
44
  4. **Python version**: Requires Python 3.10+ for the unified dev-pipeline runtime
45
45
  5. **Browser tools** (optional): If any feature has `browser_interaction` field, check the corresponding tool is available. Features may specify `tool: "playwright-cli"`, `tool: "opencli"`, or `tool: "auto"` (AI chooses at runtime).
46
46
 
47
47
  Quick check:
48
48
  ```bash
49
- command -v python3 && command -v git && (command -v cbc || command -v claude) && echo "All dependencies OK"
49
+ command -v python3 >/dev/null && command -v git >/dev/null && echo "Core dependencies OK"
50
+ # AI CLI check: read `${SKILL_DIR}/references/configuration.md` §Configured AI CLI Prerequisite Check.
51
+ # It must print `Configured AI CLI: <name>` and verify that exact executable.
50
52
  # Optional: browser interaction support (check both tools — features may use either)
51
53
  command -v playwright-cli && echo "playwright-cli OK" || echo "playwright-cli not found (playwright browser verification will be skipped)"
52
54
  command -v opencli && echo "opencli OK" || echo "opencli not found (opencli browser verification will be skipped)"
@@ -22,6 +22,45 @@ Asked only when the user chose "Yes" to Advanced config in step 6.
22
22
  - xhigh — Extensive reasoning (`PRIZMKIT_EFFORT=xhigh`)
23
23
  - max — Maximum reasoning, Claude Code only (`PRIZMKIT_EFFORT=max`)
24
24
 
25
+ ## Configured AI CLI Prerequisite Check
26
+
27
+ Read this section during launcher prerequisite validation before reporting AI CLI availability.
28
+
29
+ Runtime AI CLI selection is config-driven. Resolve the executable name in this order:
30
+ 1. `AI_CLI` environment variable when set.
31
+ 2. `.prizmkit/config.json` `ai_cli` when present.
32
+ 3. `claude` fallback only when neither is configured.
33
+
34
+ Run this quick check from the project root:
35
+ ```bash
36
+ command -v python3 >/dev/null && command -v git >/dev/null || { echo "python3 or git missing"; exit 1; }
37
+ AI_CLI="$(
38
+ python3 - <<'PY'
39
+ import json, os, shlex
40
+ from pathlib import Path
41
+ cli = os.environ.get("AI_CLI", "").strip()
42
+ if not cli:
43
+ config_path = Path(".prizmkit/config.json")
44
+ if config_path.is_file():
45
+ try:
46
+ data = json.loads(config_path.read_text(encoding="utf-8"))
47
+ cli = str(data.get("ai_cli") or "").strip()
48
+ except (OSError, json.JSONDecodeError):
49
+ cli = ""
50
+ cli = cli or "claude"
51
+ try:
52
+ print(shlex.split(cli)[0])
53
+ except ValueError:
54
+ print(cli.split()[0] if cli.split() else "claude")
55
+ PY
56
+ )"
57
+ printf 'Configured AI CLI: %s\n' "$AI_CLI"
58
+ command -v "$AI_CLI" >/dev/null && printf 'AI CLI OK: %s\n' "$(command -v "$AI_CLI")" || { printf 'AI CLI not found: %s\n' "$AI_CLI"; exit 1; }
59
+ echo "All dependencies OK"
60
+ ```
61
+
62
+ Report the configured executable, for example `Configured AI CLI: claude`. Do not report the first arbitrary PATH match such as `cbc` when project config selects a different AI CLI.
63
+
25
64
  ## Environment Variable Mapping
26
65
 
27
66
  Translating user responses to env vars:
@@ -55,7 +94,7 @@ Not exposed in interactive menu, pass via `--env`:
55
94
  | `.prizmkit/plans/feature-list.json` not found | Tell user to run `feature-planner` skill first |
56
95
  | `python3` not installed | Install Python 3.10+ and rerun the Python runtime command |
57
96
  | `git` not installed | Install git; the Python runtime uses git for branch/worktree/status operations |
58
- | `cbc`/`claude` not in PATH | Check AI CLI installation |
97
+ | Configured AI CLI not in PATH | Install the executable selected by `AI_CLI` or `.prizmkit/config.json` `ai_cli`, or update the config to a CLI available in PATH. |
59
98
  | Pipeline already running | Show status, ask if user wants to stop and restart |
60
99
  | PID file stale (process dead) | `python3 ./.prizmkit/dev-pipeline/cli.py daemon feature start .prizmkit/plans/feature-list.json` auto-cleans, retry start |
61
100
  | Launch failed (process died immediately) | Show last 20 lines of log: `python3 ./.prizmkit/dev-pipeline/cli.py daemon feature logs --lines 20` |
@@ -47,13 +47,15 @@ Before any action, validate:
47
47
 
48
48
  1. **refactor pipeline exists**: Confirm `.prizmkit/dev-pipeline/cli.py` is present
49
49
  2. **For start**: `.prizmkit/plans/refactor-list.json` must exist in `.prizmkit/plans/` (or user-specified path)
50
- 3. **Dependencies**: `python3`, `git`, and AI CLI (`cbc` or `claude`) must be in PATH
50
+ 3. **Dependencies**: `python3`, `git`, and the configured AI CLI must be in PATH. Resolve and report the AI CLI from `AI_CLI` env, then `.prizmkit/config.json` `ai_cli`, then fallback to `claude` only when neither is configured. Read `${SKILL_DIR}/references/configuration.md` §Configured AI CLI Prerequisite Check before running the AI CLI check.
51
51
  4. **Python version**: Requires Python 3.10+ for the unified dev-pipeline runtime
52
52
  5. **Browser tools** (optional): If any refactor has `browser_interaction` field, check the corresponding tool is available. Refactors may specify `tool: "playwright-cli"`, `tool: "opencli"`, or `tool: "auto"` (AI chooses at runtime).
53
53
 
54
54
  Quick check:
55
55
  ```bash
56
- command -v python3 && command -v git && (command -v cbc || command -v claude) && echo "All dependencies OK"
56
+ command -v python3 >/dev/null && command -v git >/dev/null && echo "Core dependencies OK"
57
+ # AI CLI check: read `${SKILL_DIR}/references/configuration.md` §Configured AI CLI Prerequisite Check.
58
+ # It must print `Configured AI CLI: <name>` and verify that exact executable.
57
59
  # Optional: browser interaction support (check both tools — refactors may use either)
58
60
  command -v playwright-cli && echo "playwright-cli OK" || echo "playwright-cli not found (playwright browser verification will be skipped)"
59
61
  command -v opencli && echo "opencli OK" || echo "opencli not found (opencli browser verification will be skipped)"
@@ -2,6 +2,45 @@
2
2
 
3
3
  Environment variable mappings for the refactor launcher.
4
4
 
5
+ ## Configured AI CLI Prerequisite Check
6
+
7
+ Read this section during launcher prerequisite validation before reporting AI CLI availability.
8
+
9
+ Runtime AI CLI selection is config-driven. Resolve the executable name in this order:
10
+ 1. `AI_CLI` environment variable when set.
11
+ 2. `.prizmkit/config.json` `ai_cli` when present.
12
+ 3. `claude` fallback only when neither is configured.
13
+
14
+ Run this quick check from the project root:
15
+ ```bash
16
+ command -v python3 >/dev/null && command -v git >/dev/null || { echo "python3 or git missing"; exit 1; }
17
+ AI_CLI="$(
18
+ python3 - <<'PY'
19
+ import json, os, shlex
20
+ from pathlib import Path
21
+ cli = os.environ.get("AI_CLI", "").strip()
22
+ if not cli:
23
+ config_path = Path(".prizmkit/config.json")
24
+ if config_path.is_file():
25
+ try:
26
+ data = json.loads(config_path.read_text(encoding="utf-8"))
27
+ cli = str(data.get("ai_cli") or "").strip()
28
+ except (OSError, json.JSONDecodeError):
29
+ cli = ""
30
+ cli = cli or "claude"
31
+ try:
32
+ print(shlex.split(cli)[0])
33
+ except ValueError:
34
+ print(cli.split()[0] if cli.split() else "claude")
35
+ PY
36
+ )"
37
+ printf 'Configured AI CLI: %s\n' "$AI_CLI"
38
+ command -v "$AI_CLI" >/dev/null && printf 'AI CLI OK: %s\n' "$(command -v "$AI_CLI")" || { printf 'AI CLI not found: %s\n' "$AI_CLI"; exit 1; }
39
+ echo "All dependencies OK"
40
+ ```
41
+
42
+ Report the configured executable, for example `Configured AI CLI: claude`. Do not report the first arbitrary PATH match such as `cbc` when project config selects a different AI CLI.
43
+
5
44
  ## Environment Variable Mapping
6
45
 
7
46
  Translating user responses to env vars:
@@ -38,7 +77,7 @@ Not exposed in interactive menu, pass via `--env`:
38
77
  | Test baseline failing | Fix failing tests before starting refactoring — behavior preservation requires a green baseline |
39
78
  | `python3` not installed | Install Python 3.10+ and rerun the Python runtime command |
40
79
  | `git` not installed | Install git; the Python runtime uses git for branch/worktree/status operations |
41
- | `cbc`/`claude` not in PATH | Check AI CLI installation |
80
+ | Configured AI CLI not in PATH | Install the executable selected by `AI_CLI` or `.prizmkit/config.json` `ai_cli`, or update the config to a CLI available in PATH. |
42
81
  | Refactor pipeline already running | Show status, ask if user wants to stop and restart |
43
82
  | PID file stale (process dead) | `python3 ./.prizmkit/dev-pipeline/cli.py daemon refactor start .prizmkit/plans/refactor-list.json` auto-cleans, retry start |
44
83
  | Launch failed (process died immediately) | Show last 20 lines of log: `python3 ./.prizmkit/dev-pipeline/cli.py daemon refactor logs --lines 20` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prizmkit",
3
- "version": "1.1.118",
3
+ "version": "1.1.119",
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": {