prizmkit 1.1.118 → 1.1.120
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/bin/create-prizmkit.js +1 -5
- package/bundled/VERSION.json +3 -3
- package/bundled/dev-pipeline/README.md +41 -38
- package/bundled/dev-pipeline/assets/skill-subagent-integration.md +76 -0
- package/bundled/dev-pipeline/prizmkit_runtime/config.py +2 -8
- package/bundled/dev-pipeline/prizmkit_runtime/gitops.py +2 -4
- package/bundled/dev-pipeline/prizmkit_runtime/interoperability.py +1 -1
- package/bundled/dev-pipeline/prizmkit_runtime/platform_detection.py +3 -3
- package/bundled/dev-pipeline/prizmkit_runtime/runner_bookkeeping.py +21 -11
- package/bundled/dev-pipeline/prizmkit_runtime/runners.py +45 -3
- package/bundled/dev-pipeline/prizmkit_runtime/sessions.py +28 -6
- package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +60 -102
- package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +1 -19
- package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +1 -19
- package/bundled/dev-pipeline/scripts/{init-dev-team.py → init-change-artifact.py} +6 -16
- package/bundled/dev-pipeline/scripts/parse-stream-progress.py +364 -76
- package/bundled/dev-pipeline/scripts/utils.py +1 -1
- package/bundled/dev-pipeline/templates/bootstrap-prompt.md +2 -2
- package/bundled/dev-pipeline/templates/bootstrap-tier3.md +7 -9
- package/bundled/dev-pipeline/templates/sections/bugfix-phase-review.md +2 -2
- package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +1 -1
- package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +0 -1
- package/bundled/dev-pipeline/templates/sections/critical-paths-full.md +0 -2
- package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +8 -1
- package/bundled/dev-pipeline/templates/sections/phase-implement-agent.md +6 -7
- package/bundled/dev-pipeline/templates/sections/phase-implement-full.md +6 -7
- package/bundled/dev-pipeline/templates/sections/phase-implement-lite.md +4 -2
- package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +2 -2
- package/bundled/dev-pipeline/templates/sections/phase-review-full.md +4 -2
- package/bundled/dev-pipeline/templates/sections/phase-specify-plan-full.md +20 -0
- package/bundled/dev-pipeline/templates/sections/refactor-phase-review.md +2 -2
- package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +204 -141
- package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +16 -10
- package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +2 -13
- package/bundled/dev-pipeline/tests/test_python_runner_parity.py +13 -14
- package/bundled/dev-pipeline/tests/test_unified_cli.py +227 -7
- package/bundled/skills/_metadata.json +1 -1
- package/bundled/skills/app-planner/SKILL.md +2 -2
- package/bundled/skills/app-planner/references/architecture-decisions.md +1 -3
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +4 -2
- package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +40 -1
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +4 -2
- package/bundled/skills/feature-pipeline-launcher/references/configuration.md +40 -1
- package/bundled/skills/prizmkit-code-review/SKILL.md +16 -14
- package/bundled/skills/prizmkit-code-review/references/reviewer-agent-prompt.md +9 -9
- package/bundled/skills/prizmkit-implement/SKILL.md +21 -1
- package/bundled/skills/prizmkit-implement/references/implementation-subagent-procedure.md +67 -0
- package/bundled/skills/refactor-pipeline-launcher/SKILL.md +4 -2
- package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +40 -1
- package/package.json +1 -1
- package/src/clean.js +12 -8
- package/src/config.js +24 -42
- package/src/index.js +1 -10
- package/src/manifest.js +3 -9
- package/src/metadata.js +0 -26
- package/src/prompts.js +0 -13
- package/src/scaffold.js +76 -201
- package/src/upgrade.js +16 -33
- package/bundled/adapters/claude/agent-adapter.js +0 -96
- package/bundled/adapters/claude/team-adapter.js +0 -183
- package/bundled/adapters/codebuddy/agent-adapter.js +0 -42
- package/bundled/adapters/codebuddy/team-adapter.js +0 -46
- package/bundled/adapters/codex/agent-adapter.js +0 -38
- package/bundled/adapters/codex/team-adapter.js +0 -37
- package/bundled/agents/prizm-dev-team-dev.md +0 -123
- package/bundled/agents/prizm-dev-team-reviewer.md +0 -113
- package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +0 -65
- package/bundled/dev-pipeline/templates/bootstrap-tier1.md +0 -436
- package/bundled/dev-pipeline/templates/bootstrap-tier2.md +0 -510
- package/bundled/team/prizm-dev-team.json +0 -27
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "prizmkit-code-review"
|
|
3
|
-
description: "Iterative review-fix loop against spec and plan. Always uses
|
|
3
|
+
description: "Iterative review-fix loop against spec and plan. Always uses an independent inline reviewer subagent in the active checkout with a skill-owned prompt reference and no worktree/copy/remote isolation; the Main Agent filters findings and applies accepted fixes directly. If the platform cannot start an active-checkout inline reviewer, stop with checkout-isolation incompatibility instead of falling back to Main-Agent self-review. Loops until PASS or max 3 rounds. Use after /prizmkit-implement for Full path quality gate or when the user says 'review', 'check code', 'code review', or 'is it ready to commit'. (project)"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# PrizmKit Code Review
|
|
7
7
|
|
|
8
|
-
An iterative review-fix loop that checks workspace changes against the task spec and plan. It separates review judgment from fix application by requiring
|
|
8
|
+
An iterative review-fix loop that checks workspace changes against the task spec and plan. It separates review judgment from fix application by requiring an independent inline reviewer subagent launched from the active checkout with a prompt loaded from this skill's references. Main Agent applies accepted fixes directly after filtering reviewer findings.
|
|
9
9
|
|
|
10
10
|
Review modes:
|
|
11
|
-
- `reviewer-
|
|
11
|
+
- `inline-reviewer-active-checkout`: required mode. Always spawn an independent reviewer subagent in the current active checkout with no worktree, copied checkout, remote checkout, or branch isolation.
|
|
12
12
|
- `not-run-no-changes`: no workspace changes were detected.
|
|
13
13
|
|
|
14
|
-
If the platform cannot launch
|
|
14
|
+
If the platform cannot launch an inline reviewer subagent in current-workspace / active-checkout / no-worktree mode, stop with this checkout-isolation incompatibility message:
|
|
15
15
|
|
|
16
16
|
```text
|
|
17
|
-
Cannot run /prizmkit-code-review because this platform cannot start
|
|
17
|
+
Cannot run /prizmkit-code-review because this platform cannot start an inline reviewer subagent in the active checkout without worktree, copy, remote, or branch isolation.
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
### When to Use
|
|
@@ -48,6 +48,7 @@ Cannot run /prizmkit-code-review because this platform cannot start prizm-dev-te
|
|
|
48
48
|
- `git diff`
|
|
49
49
|
- `git diff --cached`
|
|
50
50
|
- full paths for untracked and renamed files
|
|
51
|
+
- expected active checkout git top-level from `git rev-parse --show-toplevel`
|
|
51
52
|
- relevant root.prizm RULES and plan decisions
|
|
52
53
|
6. If no changes are detected, skip Phase 1 and write `review-report.md` with verdict PASS, rounds 0, and review mode `not-run-no-changes`.
|
|
53
54
|
|
|
@@ -69,22 +70,23 @@ python3 --version 2>/dev/null && echo "SCRIPT_MODE" || echo "TEXT_MODE"
|
|
|
69
70
|
- `round = 1`
|
|
70
71
|
- `max_rounds = 3`
|
|
71
72
|
- `findings_history = []`
|
|
72
|
-
- `review_mode = reviewer-
|
|
73
|
+
- `review_mode = inline-reviewer-active-checkout` after confirming an inline reviewer subagent can launch in the active checkout
|
|
73
74
|
|
|
74
|
-
### Step 1: Launch Required Reviewer
|
|
75
|
+
### Step 1: Launch Required Inline Reviewer
|
|
75
76
|
|
|
76
|
-
Always spawn
|
|
77
|
+
Always spawn an independent reviewer subagent using this skill-owned inline contract:
|
|
77
78
|
|
|
78
79
|
```yaml
|
|
79
|
-
|
|
80
|
+
prompt_reference: ${SKILL_DIR}/references/reviewer-agent-prompt.md
|
|
80
81
|
isolation: current-workspace / active-checkout / no-worktree
|
|
82
|
+
subagent_kind: inline reviewer prompt, not a platform-installed named agent
|
|
81
83
|
```
|
|
82
84
|
|
|
83
|
-
1.
|
|
85
|
+
1. Read `${SKILL_DIR}/references/reviewer-agent-prompt.md` and fill it with the active-checkout context from Phase 0.
|
|
84
86
|
2. The captured git diff, staged diff, untracked files, spec, plan, dev rules, and scoped test report are the primary review scope.
|
|
85
|
-
3. Never use
|
|
87
|
+
3. Never use worktree isolation, remote isolation, copied checkouts, branch switching, broad repository exploration, or a generic code explorer as a substitute for the required inline reviewer prompt. Do not request or create tool-managed worktrees, pipeline-managed worktrees, copied repositories, or remote checkouts. Do not use `.claude/worktrees/...` or `.prizmkit/state/worktrees/...`. Pipeline runner `USE_WORKTREE` controls outer infrastructure only; it does not change this skill's active-checkout reviewer requirement.
|
|
86
88
|
4. Never perform Main-Agent self-review or fallback review; the Main Agent's job is filtering and fixing, not acting as the reviewer.
|
|
87
|
-
5. If the platform cannot launch the reviewer in the active checkout without worktree isolation, stop with the
|
|
89
|
+
5. If the platform cannot launch the reviewer in the active checkout without worktree/copy/remote/branch isolation, stop with the checkout-isolation incompatibility message from this skill's introduction.
|
|
88
90
|
|
|
89
91
|
### Step 2: Run Review
|
|
90
92
|
|
|
@@ -141,7 +143,7 @@ After filtering, call the Loop Exit Gate. If `endLoop=true`, proceed to Phase 2.
|
|
|
141
143
|
|
|
142
144
|
### Step 5: Main Agent Applies Accepted Fixes
|
|
143
145
|
|
|
144
|
-
The Main Agent applies accepted findings directly in the active checkout. Do not spawn a separate
|
|
146
|
+
The Main Agent applies accepted findings directly in the active checkout. Do not spawn a separate implementation subagent for review fixes.
|
|
145
147
|
|
|
146
148
|
If an accepted finding cannot be safely fixed within scope, record the reason and carry it into `review-report.md` as unresolved.
|
|
147
149
|
|
|
@@ -153,7 +155,7 @@ Always write `review-report.md` to the artifact directory, including no-change P
|
|
|
153
155
|
|
|
154
156
|
Required report fields:
|
|
155
157
|
- Verdict: `PASS` or `NEEDS_FIXES`
|
|
156
|
-
- Review Mode: `reviewer-
|
|
158
|
+
- Review Mode: `inline-reviewer-active-checkout` or `not-run-no-changes`
|
|
157
159
|
- Rounds and total findings
|
|
158
160
|
- Fixed, rejected, and unresolved findings
|
|
159
161
|
- Final summary
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Reviewer
|
|
1
|
+
# Reviewer Subagent Prompt Template
|
|
2
2
|
|
|
3
|
-
Used in Phase 1 Step 1 of `/prizmkit-code-review`. The orchestrator fills `{goals}`, `{plan decisions}`, `{scoped test report}`, `{workspace context}`, `{dev rules}`, `{round N}`, and `{round_context}` before spawning
|
|
3
|
+
Used in Phase 1 Step 1 of `/prizmkit-code-review`. The orchestrator fills `{goals}`, `{plan decisions}`, `{scoped test report}`, `{workspace context}`, `{dev rules}`, `{round N}`, and `{round_context}` before spawning an independent inline reviewer subagent from the active checkout.
|
|
4
4
|
|
|
5
5
|
```
|
|
6
|
-
You are
|
|
6
|
+
You are an independent PrizmKit reviewer subagent launched by `/prizmkit-code-review` from the active checkout. Review workspace changes against the spec goals, plan decisions, scoped test evidence, and per-layer dev rules. Do not modify files and do not apply fixes; the Main Agent will filter findings and apply accepted fixes directly.
|
|
7
7
|
|
|
8
8
|
## Spec Goals
|
|
9
9
|
{goals and acceptance criteria from spec.md}
|
|
@@ -15,18 +15,18 @@ You are the dedicated PrizmKit Reviewer agent (`prizm-dev-team-reviewer`). Revie
|
|
|
15
15
|
{summary from artifact_dir/test-report-path.txt and test-report.md, including Scope, Generated / Updated Tests, In-Scope Failures, Baseline Failures, Out of Scope Gaps, Boundary Matrix / Boundary Completion Gate if present, and Verdict. If no scoped report exists for a change artifact, write "No scoped /prizmkit-test report found (expected for pre-test review)." Treat that absence as informational unless the calling workflow explicitly requires a prior test report.}
|
|
16
16
|
|
|
17
17
|
## Workspace Context
|
|
18
|
-
{git status, unstaged diff summary, staged diff summary, current working directory, expected active checkout git top-level, and new-file paths captured by the Main Agent in Phase 0 from the active checkout. This is your primary review scope — use this context to understand what changed. Request targeted file reads only when you need specific line-level detail for a finding, not to re-discover or re-index the repository. Do not read files that are not in the workspace context unless you need them to verify impact (callers, dependents, shared patterns).
|
|
18
|
+
{git status, unstaged diff summary, staged diff summary, current working directory, expected active checkout git top-level, and new-file paths captured by the Main Agent in Phase 0 from the active checkout. This is your primary review scope — use this context to understand what changed. Request targeted file reads only when you need specific line-level detail for a finding, not to re-discover or re-index the repository. Do not read files that are not in the workspace context unless you need them to verify impact (callers, dependents, shared patterns).}
|
|
19
19
|
|
|
20
20
|
## Active Checkout Guard
|
|
21
21
|
The orchestrator must provide the expected active checkout git top-level in Workspace Context. Before reviewing, verify that your current git top-level matches that expected active checkout.
|
|
22
22
|
|
|
23
|
-
If your current checkout is different, or appears to be under `.claude/worktrees/`, `.prizmkit/state/worktrees/`, a remote checkout, or any
|
|
23
|
+
If your current checkout is different, or appears to be under `.claude/worktrees/`, `.prizmkit/state/worktrees/`, a copied checkout, a remote isolated checkout, a temporary repository clone, or any branch/top-level other than the orchestrator-provided active checkout:
|
|
24
24
|
- Stop immediately.
|
|
25
25
|
- Do not review files.
|
|
26
26
|
- Do not produce normal findings.
|
|
27
27
|
- Report `WRONG_CHECKOUT` and state that `/prizmkit-code-review` cannot continue because the reviewer subagent was not started in the active checkout/no-worktree mode required by this skill.
|
|
28
28
|
|
|
29
|
-
Worktree review
|
|
29
|
+
Worktree, copied-checkout, remote-checkout, and branch-switched review are not supported by `/prizmkit-code-review`; do not continue even if the files appear similar. Do not request or create worktrees, copied repositories, branch switches, or remote checkouts.
|
|
30
30
|
|
|
31
31
|
## Dev Rules (per-layer conventions)
|
|
32
32
|
{rules from .prizmkit/rules/<layer>-rules.md, or "No custom dev rules configured — use general best practices."}
|
|
@@ -38,7 +38,7 @@ Round {N}. {round_context}
|
|
|
38
38
|
Use the orchestrator-provided workspace context as the source of truth for changed files:
|
|
39
39
|
- For new files listed in workspace status, read their full content.
|
|
40
40
|
- For modified files, read enough surrounding context to understand the change.
|
|
41
|
-
- Do not edit files, stage changes, run test suites,
|
|
41
|
+
- Do not edit files, stage changes, run test suites, spawn other agents, or invoke tools that modify the workspace.
|
|
42
42
|
- Do not request or create worktrees — you are reviewing the active checkout's changes. The orchestrator has already captured the full diff and status context; re-discovering the whole repository is wasteful and unnecessary.
|
|
43
43
|
|
|
44
44
|
## Review Dimensions
|
|
@@ -55,10 +55,10 @@ Evaluate the changes across these dimensions (focus on what's relevant):
|
|
|
55
55
|
## Output Format
|
|
56
56
|
Respond with EXACTLY this format:
|
|
57
57
|
|
|
58
|
-
### Result: PASS | NEEDS_FIXES
|
|
58
|
+
### Result: PASS | NEEDS_FIXES | WRONG_CHECKOUT
|
|
59
59
|
|
|
60
60
|
### Findings
|
|
61
|
-
(If PASS, write "No issues found.")
|
|
61
|
+
(If PASS, write "No issues found." If WRONG_CHECKOUT, include only checkout mismatch evidence and do not include normal review findings.)
|
|
62
62
|
|
|
63
63
|
#### Finding N
|
|
64
64
|
- **Severity**: high | medium | low
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "prizmkit-implement"
|
|
3
|
-
description: "Execute plan.md tasks with a TDD-oriented approach. Respects task ordering, checkpoints, and dependencies for Fast path or Full path change artifacts. Reads Prizm docs before editing;
|
|
3
|
+
description: "Execute plan.md tasks with a TDD-oriented approach. Respects task ordering, checkpoints, and dependencies for Fast path or Full path change artifacts. Reads Prizm docs before editing; optional inline implementation subagent delegation uses this skill's references and active-checkout/no-worktree constraints. Use after /prizmkit-plan. Trigger on: 'implement', 'build', 'code it', 'start coding', 'execute', 'write the code'. (project)"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# PrizmKit Implement
|
|
@@ -39,6 +39,26 @@ Before implementation, load context once:
|
|
|
39
39
|
|
|
40
40
|
If a dev rule conflicts with `plan.md`, call out the conflict and ask the user unless the plan clearly supersedes the rule.
|
|
41
41
|
|
|
42
|
+
## Optional Inline Implementation Subagent Delegation
|
|
43
|
+
|
|
44
|
+
The default execution mode is direct Main Agent implementation. If delegation is useful for a narrow implementation slice, use only this skill's local reference:
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
prompt_reference: ${SKILL_DIR}/references/implementation-subagent-procedure.md
|
|
48
|
+
isolation: current-workspace / active-checkout / no-worktree
|
|
49
|
+
subagent_kind: inline implementation prompt, not a platform-installed named agent
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Delegation rules:
|
|
53
|
+
- Read `${SKILL_DIR}/references/implementation-subagent-procedure.md` before preparing the subagent prompt.
|
|
54
|
+
- Pass the expected active checkout git top-level and the exact delegated task/file scope.
|
|
55
|
+
- Do not use worktree isolation, copied checkouts, remote isolated checkouts, branch switching, or a platform-installed named implementation agent.
|
|
56
|
+
- If active-checkout/no-worktree launch cannot be satisfied, stop with:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
Cannot delegate /prizmkit-implement because this platform cannot start an inline implementation subagent in the active checkout without worktree, copy, remote, or branch isolation.
|
|
60
|
+
```
|
|
61
|
+
|
|
42
62
|
## Execution
|
|
43
63
|
|
|
44
64
|
For each unchecked task in `plan.md`, in order:
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Implementation Subagent Procedure
|
|
2
|
+
|
|
3
|
+
Use this reference only when `/prizmkit-implement` deliberately delegates implementation work to an inline implementation subagent. The default path remains direct Main Agent implementation. Delegation is allowed only when the active-checkout/no-worktree contract below can be satisfied.
|
|
4
|
+
|
|
5
|
+
## Launch Contract
|
|
6
|
+
|
|
7
|
+
The Main Agent must provide:
|
|
8
|
+
- Artifact directory containing `spec.md`, `plan.md`, and `context-snapshot.md` when available.
|
|
9
|
+
- Expected active checkout git top-level from the Main Agent's workspace.
|
|
10
|
+
- The exact plan tasks or files delegated.
|
|
11
|
+
- Any loaded Prizm docs traps/rules relevant to the delegated files.
|
|
12
|
+
|
|
13
|
+
The implementation subagent must run in the same active checkout as the Main Agent.
|
|
14
|
+
|
|
15
|
+
## Active Checkout Guard
|
|
16
|
+
|
|
17
|
+
Before reading or editing files, verify your current git top-level matches the expected active checkout git top-level provided by the Main Agent.
|
|
18
|
+
|
|
19
|
+
Stop immediately and report `WRONG_CHECKOUT` if any of these are true:
|
|
20
|
+
- You are running from a git worktree, tool-created worktree, `.claude/worktrees/`, `.prizmkit/state/worktrees/`, copied repository checkout, remote isolated checkout, or temporary clone.
|
|
21
|
+
- Your current git top-level differs from the expected active checkout git top-level.
|
|
22
|
+
- You are on a different branch because the launch path switched branches.
|
|
23
|
+
- You would need to create or enter another checkout to complete the work.
|
|
24
|
+
|
|
25
|
+
Do not create worktrees, copied repositories, remote checkouts, or branch switches. Do not continue from the wrong checkout even if files appear identical.
|
|
26
|
+
|
|
27
|
+
## Context Loading
|
|
28
|
+
|
|
29
|
+
1. Read `context-snapshot.md` first when it exists.
|
|
30
|
+
2. Use Section 3 for relevant Prizm rules/traps and Section 4 File Manifest for file summaries.
|
|
31
|
+
3. Do not re-read files already summarized in the File Manifest unless a specific implementation detail is missing.
|
|
32
|
+
4. If no context snapshot exists, read `.prizmkit/prizm-docs/root.prizm`, relevant L1/L2 docs, then targeted source files.
|
|
33
|
+
5. If a relevant L2 doc is missing, use source fallback and note that retrospective may create or update docs later.
|
|
34
|
+
|
|
35
|
+
## Implementation Rules
|
|
36
|
+
|
|
37
|
+
- Implement only the tasks delegated by the Main Agent and follow `plan.md` task order.
|
|
38
|
+
- Use TDD where meaningful: update/write the smallest relevant test first for behavior changes, then implement, then run the smallest useful check.
|
|
39
|
+
- For docs/config/mechanical refactors where test-first is not meaningful, use the smallest verification that proves the change.
|
|
40
|
+
- Mark delegated `plan.md` tasks `[x]` immediately after completion when the Main Agent explicitly authorizes task marking; otherwise report completed task IDs to the Main Agent for marking.
|
|
41
|
+
- Do not execute git `add`, `commit`, `reset`, `push`, branch checkout, rebase, merge, or stash operations.
|
|
42
|
+
- Do not spawn further agents.
|
|
43
|
+
- Do not perform broad repository rediscovery. Read only delegated files and targeted dependencies needed for correctness.
|
|
44
|
+
- Do not write PrizmKit feature/bug/refactor/task/session/run IDs, pipeline IDs, workflow IDs, branch names, absolute worktree paths, or `.prizmkit/specs` / `.prizmkit/dev-pipeline` artifact paths into `.prizmkit/prizm-docs/`, user-visible UI text, API responses, emails, notifications, or expected product-copy tests.
|
|
45
|
+
- If creating a new sub-module, note the durable facts needed for retrospective; do not overwrite existing `.prizmkit/prizm-docs/` files in full.
|
|
46
|
+
|
|
47
|
+
## Output Format
|
|
48
|
+
|
|
49
|
+
Report exactly:
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
### Result: COMPLETED | BLOCKED | WRONG_CHECKOUT
|
|
53
|
+
|
|
54
|
+
### Completed Tasks
|
|
55
|
+
- [task id or description]
|
|
56
|
+
|
|
57
|
+
### Files Changed
|
|
58
|
+
- path: summary
|
|
59
|
+
|
|
60
|
+
### Verification
|
|
61
|
+
- command/check: result
|
|
62
|
+
|
|
63
|
+
### Notes for Main Agent
|
|
64
|
+
- durable decisions, missing L2 docs, or blockers
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
For `WRONG_CHECKOUT`, include only the checkout mismatch evidence and do not include normal implementation findings.
|
|
@@ -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
|
|
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
|
|
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
|
-
|
|
|
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
package/src/clean.js
CHANGED
|
@@ -17,6 +17,10 @@ const PRIZMKIT_GITIGNORE_ENTRIES = new Set([
|
|
|
17
17
|
'CODEBUDDY.private.md',
|
|
18
18
|
]);
|
|
19
19
|
|
|
20
|
+
const LEGACY_TEAM_NAME = ['prizm', 'dev', 'team'].join('-');
|
|
21
|
+
const LEGACY_DEV_AGENT_FILE = `${LEGACY_TEAM_NAME}-dev.md`;
|
|
22
|
+
const LEGACY_REVIEWER_AGENT_FILE = `${LEGACY_TEAM_NAME}-reviewer.md`;
|
|
23
|
+
|
|
20
24
|
async function removePath(targetPath, dryRun) {
|
|
21
25
|
if (!await fs.pathExists(targetPath)) {
|
|
22
26
|
return { path: targetPath, removed: false, reason: 'not_found' };
|
|
@@ -175,7 +179,7 @@ export async function runClean(directory, options = {}) {
|
|
|
175
179
|
console.log('');
|
|
176
180
|
console.log(chalk.bold(' PrizmKit 清理模式'));
|
|
177
181
|
console.log(` 目标目录: ${projectRoot}`);
|
|
178
|
-
console.log(`
|
|
182
|
+
console.log(` 全局旧团队配置: ${cleanGlobalTeam ? chalk.yellow('将清理') : chalk.gray('跳过')}`);
|
|
179
183
|
console.log(` 预览模式: ${dryRun ? chalk.yellow('是') : chalk.green('否')}`);
|
|
180
184
|
console.log('');
|
|
181
185
|
|
|
@@ -193,10 +197,10 @@ export async function runClean(directory, options = {}) {
|
|
|
193
197
|
const manifestSkillNames = manifest?.files?.skills || [];
|
|
194
198
|
const allSkillNames = [...new Set([...metadataSkillNames, ...externalSkillNames, ...manifestSkillNames])];
|
|
195
199
|
|
|
196
|
-
//
|
|
200
|
+
// Retired PrizmKit named-agent files (legacy installs + manifest)
|
|
197
201
|
const knownAgentFiles = [
|
|
198
|
-
|
|
199
|
-
|
|
202
|
+
LEGACY_DEV_AGENT_FILE,
|
|
203
|
+
LEGACY_REVIEWER_AGENT_FILE,
|
|
200
204
|
];
|
|
201
205
|
const manifestAgentFiles = manifest?.files?.agents || [];
|
|
202
206
|
const agentFiles = [...new Set([...knownAgentFiles, ...manifestAgentFiles])];
|
|
@@ -248,15 +252,15 @@ export async function runClean(directory, options = {}) {
|
|
|
248
252
|
const codexSkillsDir = path.join(projectRoot, '.agents', 'skills');
|
|
249
253
|
results.push(...await removeKnownEntries(codexSkillsDir, allSkillNames, dryRun));
|
|
250
254
|
|
|
251
|
-
// .claude/agents/ — PrizmKit agent files
|
|
255
|
+
// .claude/agents/ — retired PrizmKit named-agent files
|
|
252
256
|
const claudeAgentsDir = path.join(projectRoot, '.claude', 'agents');
|
|
253
257
|
results.push(...await removeKnownEntries(claudeAgentsDir, agentFiles, dryRun));
|
|
254
258
|
|
|
255
|
-
// .codebuddy/agents/ —
|
|
259
|
+
// .codebuddy/agents/ — retired PrizmKit named-agent files
|
|
256
260
|
const cbAgentsDir = path.join(projectRoot, '.codebuddy', 'agents');
|
|
257
261
|
results.push(...await removeKnownEntries(cbAgentsDir, agentFiles, dryRun));
|
|
258
262
|
|
|
259
|
-
// .codex/agents/ —
|
|
263
|
+
// .codex/agents/ — retired PrizmKit named-agent files
|
|
260
264
|
const codexAgentsDir = path.join(projectRoot, '.codex', 'agents');
|
|
261
265
|
results.push(...await removeKnownEntries(codexAgentsDir, codexAgentFiles, dryRun));
|
|
262
266
|
|
|
@@ -292,7 +296,7 @@ export async function runClean(directory, options = {}) {
|
|
|
292
296
|
if (cleanGlobalTeam) {
|
|
293
297
|
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
294
298
|
if (homeDir) {
|
|
295
|
-
const globalTeamPath = path.join(homeDir, '.codebuddy', 'teams',
|
|
299
|
+
const globalTeamPath = path.join(homeDir, '.codebuddy', 'teams', LEGACY_TEAM_NAME);
|
|
296
300
|
results.push(await removePath(globalTeamPath, dryRun));
|
|
297
301
|
}
|
|
298
302
|
}
|
package/src/config.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* PrizmKit Config Command
|
|
3
3
|
*
|
|
4
4
|
* Reconfigure an existing PrizmKit installation without a full reinstall.
|
|
5
|
-
* Supports changing platform, AI CLI, skills suite, rules,
|
|
5
|
+
* Supports changing platform, AI CLI, skills suite, rules, and pipeline.
|
|
6
6
|
*
|
|
7
7
|
* Flow: READ manifest → PROMPT user → COMPUTE DIFF → DISPLAY SUMMARY → EXECUTE
|
|
8
8
|
*
|
|
@@ -21,13 +21,10 @@ import { readManifest, writeManifest, buildManifest, diffManifest } from './mani
|
|
|
21
21
|
import {
|
|
22
22
|
loadMetadata,
|
|
23
23
|
loadRulesMetadata,
|
|
24
|
-
getAgentsDir,
|
|
25
24
|
} from './metadata.js';
|
|
26
25
|
import {
|
|
27
26
|
installSkills,
|
|
28
|
-
installAgents,
|
|
29
27
|
installSettings,
|
|
30
|
-
installTeamConfig,
|
|
31
28
|
installProjectMemory,
|
|
32
29
|
installPipeline,
|
|
33
30
|
installGitignore,
|
|
@@ -39,6 +36,7 @@ import {
|
|
|
39
36
|
findStaleManagedPipelineFiles,
|
|
40
37
|
removeStaleManagedPipelineFiles,
|
|
41
38
|
normalizeMainProjectMemoryContent,
|
|
39
|
+
removeRetiredAgentTeamArtifacts,
|
|
42
40
|
} from './scaffold.js';
|
|
43
41
|
import {
|
|
44
42
|
removeSkillFiles,
|
|
@@ -52,7 +50,6 @@ import {
|
|
|
52
50
|
selectAiCliLaunch,
|
|
53
51
|
selectSkillSuite,
|
|
54
52
|
selectRulesPreset,
|
|
55
|
-
confirmTeamMode,
|
|
56
53
|
confirmPipeline,
|
|
57
54
|
} from './prompts.js';
|
|
58
55
|
import { isKnownPlatform, platformLabel, privateProjectMemoryFile, privateProjectMemoryFiles, projectMemoryFile, resolvePayloadPlatforms } from './platforms.js';
|
|
@@ -61,6 +58,9 @@ import { applyAiCliLaunchToConfig, resolveAiCliLaunchSelection, storedAiCliLaunc
|
|
|
61
58
|
|
|
62
59
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
63
60
|
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
61
|
+
const LEGACY_TEAM_NAME = ['prizm', 'dev', 'team'].join('-');
|
|
62
|
+
const LEGACY_DEV_AGENT_FILE = `${LEGACY_TEAM_NAME}-dev.md`;
|
|
63
|
+
const LEGACY_REVIEWER_AGENT_FILE = `${LEGACY_TEAM_NAME}-reviewer.md`;
|
|
64
64
|
|
|
65
65
|
// ============================================================
|
|
66
66
|
// Helpers
|
|
@@ -96,12 +96,9 @@ async function detectInstalledPlatforms(projectRoot) {
|
|
|
96
96
|
}
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
-
const hasClaude = await hasPlatformFiles(path.join(projectRoot, '.claude', 'commands'))
|
|
100
|
-
|
|
101
|
-
const
|
|
102
|
-
|| await hasPlatformFiles(path.join(projectRoot, '.codebuddy', 'agents'));
|
|
103
|
-
const hasCodex = await hasPlatformFiles(path.join(projectRoot, '.agents', 'skills'))
|
|
104
|
-
|| await hasPlatformFiles(path.join(projectRoot, '.codex', 'agents'));
|
|
99
|
+
const hasClaude = await hasPlatformFiles(path.join(projectRoot, '.claude', 'commands'));
|
|
100
|
+
const hasCodeBuddy = await hasPlatformFiles(path.join(projectRoot, '.codebuddy', 'skills'));
|
|
101
|
+
const hasCodex = await hasPlatformFiles(path.join(projectRoot, '.agents', 'skills'));
|
|
105
102
|
|
|
106
103
|
if (hasClaude && hasCodeBuddy && hasCodex) return 'all';
|
|
107
104
|
if (hasClaude && hasCodeBuddy) return 'both';
|
|
@@ -216,8 +213,14 @@ async function migrateProjectMemoryOnPlatformDrop(droppedPlatform, newPlatforms,
|
|
|
216
213
|
*/
|
|
217
214
|
async function removePlatformFiles(platform, projectRoot, manifest, dryRun) {
|
|
218
215
|
const skillNames = manifest?.files?.skills || [];
|
|
219
|
-
const agentFileNames = manifest?.files?.agents || [];
|
|
220
216
|
const ruleFileNames = manifest?.files?.rules || [];
|
|
217
|
+
const agentFileNames = [
|
|
218
|
+
...new Set([
|
|
219
|
+
...(manifest?.files?.agents || []),
|
|
220
|
+
LEGACY_DEV_AGENT_FILE,
|
|
221
|
+
LEGACY_REVIEWER_AGENT_FILE,
|
|
222
|
+
]),
|
|
223
|
+
];
|
|
221
224
|
|
|
222
225
|
if (skillNames.length) {
|
|
223
226
|
console.log(chalk.blue(`\n 删除 ${platformLabel(platform)} skills:`));
|
|
@@ -273,13 +276,13 @@ async function removePlatformFiles(platform, projectRoot, manifest, dryRun) {
|
|
|
273
276
|
}
|
|
274
277
|
} else if (platform === 'codebuddy') {
|
|
275
278
|
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
276
|
-
const teamDir = path.join(homeDir, '.codebuddy', 'teams',
|
|
279
|
+
const teamDir = path.join(homeDir, '.codebuddy', 'teams', LEGACY_TEAM_NAME);
|
|
277
280
|
if (await fs.pathExists(teamDir)) {
|
|
278
281
|
if (dryRun) {
|
|
279
|
-
console.log(chalk.gray(' [dry-run] remove
|
|
282
|
+
console.log(chalk.gray(' [dry-run] remove legacy CodeBuddy team config'));
|
|
280
283
|
} else {
|
|
281
284
|
await fs.remove(teamDir);
|
|
282
|
-
console.log(chalk.red(' ✗ removed
|
|
285
|
+
console.log(chalk.red(' ✗ removed legacy CodeBuddy team config'));
|
|
283
286
|
}
|
|
284
287
|
}
|
|
285
288
|
} else if (platform === 'codex') {
|
|
@@ -405,7 +408,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
405
408
|
runtime: normalizedManifestRuntime,
|
|
406
409
|
suite: oldManifest.suite || 'core',
|
|
407
410
|
rules: oldManifest.options?.rules || 'recommended',
|
|
408
|
-
team: oldManifest.options?.team ?? true,
|
|
409
411
|
pipeline: oldManifest.options?.pipeline ?? true,
|
|
410
412
|
aiCli: userConfig.ai_cli || oldManifest.options?.aiCli || '',
|
|
411
413
|
aiCliLaunch: storedAiCliLaunch(userConfig),
|
|
@@ -422,7 +424,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
422
424
|
console.log(` AI CLI: ${currentConfig.aiCli ? chalk.cyan(currentConfig.aiCli) : chalk.gray('(未设置)')}`);
|
|
423
425
|
console.log(` 技能套件: ${chalk.cyan(currentConfig.suite)}`);
|
|
424
426
|
console.log(` 规则: ${chalk.cyan(currentConfig.rules)}`);
|
|
425
|
-
console.log(` 团队模式: ${currentConfig.team ? chalk.green('启用') : chalk.gray('禁用')}`);
|
|
426
427
|
console.log(` 流水线: ${currentConfig.pipeline ? chalk.green('启用') : chalk.gray('禁用')}`);
|
|
427
428
|
console.log('');
|
|
428
429
|
|
|
@@ -435,9 +436,9 @@ export async function runConfig(directory, options = {}) {
|
|
|
435
436
|
if (nonInteractive) {
|
|
436
437
|
// Non-interactive: only change what's explicitly specified via CLI options
|
|
437
438
|
if (!platformManifestNeedsNormalization && !runtimeManifestNeedsNormalization && !runtimeOptionNeedsNormalization && !options.platform && !options.skills && !options.rules && options.runtime === undefined
|
|
438
|
-
&& options.aiCli === undefined && options.headlessPromptArg === undefined && options.headlessExtraArgs === undefined && options.
|
|
439
|
+
&& options.aiCli === undefined && options.headlessPromptArg === undefined && options.headlessExtraArgs === undefined && options.pipeline === undefined) {
|
|
439
440
|
console.log(chalk.yellow(' ⚠ 非交互式模式下未指定任何变更。'));
|
|
440
|
-
console.log(chalk.gray(' 使用 --platform, --runtime, --skills, --rules, --ai-cli, --headless-prompt-arg, --headless-extra-args, --
|
|
441
|
+
console.log(chalk.gray(' 使用 --platform, --runtime, --skills, --rules, --ai-cli, --headless-prompt-arg, --headless-extra-args, --pipeline/--no-pipeline'));
|
|
441
442
|
return;
|
|
442
443
|
}
|
|
443
444
|
|
|
@@ -452,7 +453,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
452
453
|
runtime: optionRuntime || currentConfig.runtime,
|
|
453
454
|
suite: options.skills || currentConfig.suite,
|
|
454
455
|
rules: options.rules || currentConfig.rules,
|
|
455
|
-
team: options.team !== undefined ? options.team : currentConfig.team,
|
|
456
456
|
pipeline: options.pipeline !== undefined ? options.pipeline : currentConfig.pipeline,
|
|
457
457
|
aiCli: aiCliLaunchValue.aiCli,
|
|
458
458
|
aiCliLaunch: aiCliLaunchValue.aiCliLaunch,
|
|
@@ -471,7 +471,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
471
471
|
const metadata = await loadMetadata();
|
|
472
472
|
const newSuite = await selectSkillSuite(currentConfig.suite, metadata);
|
|
473
473
|
const newRules = await selectRulesPreset(currentConfig.rules);
|
|
474
|
-
const newTeam = await confirmTeamMode(currentConfig.team);
|
|
475
474
|
const newPipeline = await confirmPipeline(currentConfig.pipeline);
|
|
476
475
|
|
|
477
476
|
newConfig = {
|
|
@@ -479,7 +478,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
479
478
|
runtime: newRuntime,
|
|
480
479
|
suite: newSuite,
|
|
481
480
|
rules: newRules,
|
|
482
|
-
team: newTeam,
|
|
483
481
|
pipeline: newPipeline,
|
|
484
482
|
aiCli: aiCliSelection.aiCli,
|
|
485
483
|
aiCliLaunch: aiCliSelection.aiCliLaunch,
|
|
@@ -522,9 +520,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
522
520
|
if (newConfig.rules !== currentConfig.rules) {
|
|
523
521
|
changes.push(`规则: ${currentConfig.rules} → ${newConfig.rules}`);
|
|
524
522
|
}
|
|
525
|
-
if (newConfig.team !== currentConfig.team) {
|
|
526
|
-
changes.push(`团队模式: ${currentConfig.team ? '启用' : '禁用'} → ${newConfig.team ? '启用' : '禁用'}`);
|
|
527
|
-
}
|
|
528
523
|
if (newConfig.pipeline !== currentConfig.pipeline) {
|
|
529
524
|
changes.push(`流水线: ${currentConfig.pipeline ? '启用' : '禁用'} → ${newConfig.pipeline ? '启用' : '禁用'}`);
|
|
530
525
|
}
|
|
@@ -582,8 +577,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
582
577
|
|
|
583
578
|
// Resolve new file lists
|
|
584
579
|
const newSkillList = await resolveSkillList(newConfig.suite);
|
|
585
|
-
const agentsDir = getAgentsDir();
|
|
586
|
-
const newAgentFiles = (await fs.readdir(agentsDir)).filter(f => f.endsWith('.md'));
|
|
587
580
|
const rulesMeta = await loadRulesMetadata();
|
|
588
581
|
const newRuleFiles = resolveRuleNamesForRuntime(rulesMeta, newConfig.rules, newConfig.runtime).map(name => `${name}.md`);
|
|
589
582
|
const newPipelineFiles = newConfig.pipeline ? resolvePipelineFileList(newConfig.runtime) : [];
|
|
@@ -605,8 +598,8 @@ export async function runConfig(directory, options = {}) {
|
|
|
605
598
|
|| newConfig.runtime !== currentConfig.runtime) {
|
|
606
599
|
const newTempManifest = buildManifest({
|
|
607
600
|
version: pkg.version, platform: newConfig.platform, suite: newConfig.suite,
|
|
608
|
-
skills: newSkillList,
|
|
609
|
-
pipeline: newPipelineFiles,
|
|
601
|
+
skills: newSkillList, rules: newRuleFiles,
|
|
602
|
+
pipeline: newPipelineFiles, aiCli: newConfig.aiCli,
|
|
610
603
|
runtime: newConfig.runtime, rulesPreset: newConfig.rules, extras: oldManifest?.files?.extras || [], payloadPlatforms: newPlatforms,
|
|
611
604
|
});
|
|
612
605
|
const diff = diffManifest(oldManifest, newTempManifest);
|
|
@@ -633,11 +626,11 @@ export async function runConfig(directory, options = {}) {
|
|
|
633
626
|
|| newConfig.runtime !== currentConfig.runtime
|
|
634
627
|
|| newConfig.suite !== currentConfig.suite
|
|
635
628
|
|| newConfig.rules !== currentConfig.rules
|
|
636
|
-
|| newConfig.aiCli !== currentConfig.aiCli
|
|
637
|
-
|| newConfig.team !== currentConfig.team;
|
|
629
|
+
|| newConfig.aiCli !== currentConfig.aiCli;
|
|
638
630
|
|
|
639
631
|
for (const p of allTargetPlatforms) {
|
|
640
632
|
const isNew = platformsToAdd.includes(p);
|
|
633
|
+
await removeRetiredAgentTeamArtifacts(p, projectRoot, false);
|
|
641
634
|
|
|
642
635
|
if (isNew || needsReinstall) {
|
|
643
636
|
console.log(chalk.bold(`\n ${isNew ? '安装' : '更新'} ${platformLabel(p)} 环境...\n`));
|
|
@@ -645,19 +638,11 @@ export async function runConfig(directory, options = {}) {
|
|
|
645
638
|
console.log(chalk.blue(' Skills:'));
|
|
646
639
|
await installSkills(p, newSkillList, projectRoot, false, newConfig.runtime);
|
|
647
640
|
|
|
648
|
-
console.log(chalk.blue('\n Agents:'));
|
|
649
|
-
await installAgents(p, projectRoot, false);
|
|
650
|
-
|
|
651
641
|
console.log(chalk.blue('\n Settings & Rules:'));
|
|
652
642
|
await installSettings(p, projectRoot, { pipeline: newConfig.pipeline, rules: newConfig.rules }, false, newConfig.runtime);
|
|
653
643
|
|
|
654
644
|
console.log(chalk.blue('\n Project Memory:'));
|
|
655
645
|
await installProjectMemory(p, projectRoot, false);
|
|
656
|
-
|
|
657
|
-
if (newConfig.team) {
|
|
658
|
-
console.log(chalk.blue('\n Team Config:'));
|
|
659
|
-
await installTeamConfig(p, projectRoot, false);
|
|
660
|
-
}
|
|
661
646
|
}
|
|
662
647
|
}
|
|
663
648
|
|
|
@@ -723,10 +708,8 @@ export async function runConfig(directory, options = {}) {
|
|
|
723
708
|
runtime: newConfig.runtime,
|
|
724
709
|
suite: newConfig.suite,
|
|
725
710
|
skills: newSkillList,
|
|
726
|
-
agents: newAgentFiles,
|
|
727
711
|
rules: newRuleFiles,
|
|
728
712
|
pipeline: newPipelineFiles,
|
|
729
|
-
team: newConfig.team,
|
|
730
713
|
aiCli: newConfig.aiCli,
|
|
731
714
|
rulesPreset: newConfig.rules,
|
|
732
715
|
payloadPlatforms: newPlatforms,
|
|
@@ -755,7 +738,6 @@ export async function runConfig(directory, options = {}) {
|
|
|
755
738
|
console.log(chalk.gray(` AI CLI: ${newConfig.aiCli || '(未设置)'}`));
|
|
756
739
|
console.log(chalk.gray(` 技能套件: ${newConfig.suite}`));
|
|
757
740
|
console.log(chalk.gray(` 规则: ${newConfig.rules}`));
|
|
758
|
-
console.log(chalk.gray(` 团队模式: ${newConfig.team ? '启用' : '禁用'}`));
|
|
759
741
|
console.log(chalk.gray(` 流水线: ${newConfig.pipeline ? '启用' : '禁用'}`));
|
|
760
742
|
console.log('');
|
|
761
743
|
}
|