prizmkit 1.0.152 → 1.1.0
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 +27 -2
- package/bundled/VERSION.json +3 -3
- package/bundled/adapters/claude/paths.js +1 -1
- package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +482 -57
- package/bundled/dev-pipeline/scripts/parse-stream-progress.py +2 -6
- package/bundled/dev-pipeline/templates/bootstrap-tier1.md +48 -8
- package/bundled/dev-pipeline/templates/bootstrap-tier2.md +54 -1
- package/bundled/dev-pipeline/templates/bootstrap-tier3.md +47 -10
- package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +11 -0
- package/bundled/dev-pipeline/templates/sections/critical-paths-agent.md +9 -0
- package/bundled/dev-pipeline/templates/sections/critical-paths-full.md +12 -0
- package/bundled/dev-pipeline/templates/sections/critical-paths-lite.md +7 -0
- package/bundled/dev-pipeline/templates/sections/directory-convention-agent.md +8 -0
- package/bundled/dev-pipeline/templates/sections/directory-convention-full.md +9 -0
- package/bundled/dev-pipeline/templates/sections/directory-convention-lite.md +6 -0
- package/bundled/dev-pipeline/templates/sections/failure-capture.md +21 -0
- package/bundled/dev-pipeline/templates/sections/failure-log-check.md +8 -0
- package/bundled/dev-pipeline/templates/sections/feature-context.md +23 -0
- package/bundled/dev-pipeline/templates/sections/phase-analyze-agent.md +15 -0
- package/bundled/dev-pipeline/templates/sections/phase-analyze-full.md +15 -0
- package/bundled/dev-pipeline/templates/sections/phase-browser-verification.md +31 -0
- package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +36 -0
- package/bundled/dev-pipeline/templates/sections/phase-commit.md +26 -0
- package/bundled/dev-pipeline/templates/sections/phase-context-snapshot-agent-suffix.md +14 -0
- package/bundled/dev-pipeline/templates/sections/phase-context-snapshot-base.md +20 -0
- package/bundled/dev-pipeline/templates/sections/phase-context-snapshot-lite-suffix.md +3 -0
- package/bundled/dev-pipeline/templates/sections/phase-critic-code.md +24 -0
- package/bundled/dev-pipeline/templates/sections/phase-critic-plan-full.md +45 -0
- package/bundled/dev-pipeline/templates/sections/phase-critic-plan.md +24 -0
- package/bundled/dev-pipeline/templates/sections/phase-deploy-verification.md +36 -0
- package/bundled/dev-pipeline/templates/sections/phase-implement-agent.md +24 -0
- package/bundled/dev-pipeline/templates/sections/phase-implement-full.md +41 -0
- package/bundled/dev-pipeline/templates/sections/phase-implement-lite.md +32 -0
- package/bundled/dev-pipeline/templates/sections/phase-plan-agent.md +17 -0
- package/bundled/dev-pipeline/templates/sections/phase-plan-lite.md +16 -0
- package/bundled/dev-pipeline/templates/sections/phase-review-agent.md +28 -0
- package/bundled/dev-pipeline/templates/sections/phase-review-full.md +36 -0
- package/bundled/dev-pipeline/templates/sections/phase-specify-plan-full.md +82 -0
- package/bundled/dev-pipeline/templates/sections/phase0-init.md +4 -0
- package/bundled/dev-pipeline/templates/sections/phase0-test-baseline.md +12 -0
- package/bundled/dev-pipeline/templates/sections/resume-header.md +2 -0
- package/bundled/dev-pipeline/templates/sections/session-context.md +6 -0
- package/bundled/dev-pipeline/templates/sections/subagent-timeout-recovery.md +6 -0
- package/bundled/skills/_metadata.json +21 -177
- package/bundled/skills/app-planner/SKILL.md +22 -3
- package/bundled/skills/app-planner/references/project-brief-guide.md +110 -0
- package/bundled/skills/bug-fix-workflow/SKILL.md +4 -0
- package/bundled/skills/bug-planner/SKILL.md +2 -2
- package/bundled/skills/dev-pipeline-launcher/SKILL.md +1 -1
- package/bundled/skills/prizm-kit/SKILL.md +18 -47
- package/bundled/skills/prizm-kit/assets/project-memory-template.md +1 -1
- package/bundled/skills/prizmkit-analyze/SKILL.md +4 -4
- package/bundled/skills/prizmkit-init/SKILL.md +4 -4
- package/bundled/skills/prizmkit-plan/SKILL.md +126 -108
- package/bundled/skills/prizmkit-plan/assets/plan-template.md +1 -2
- package/bundled/skills/refactor-workflow/SKILL.md +142 -124
- package/bundled/team/prizm-dev-team.json +2 -8
- package/package.json +1 -1
- package/src/clean.js +8 -0
- package/src/gitignore-template.js +12 -0
- package/src/index.js +3 -22
- package/src/scaffold.js +20 -11
- package/src/upgrade.js +6 -31
- package/bundled/skills/prizmkit-clarify/SKILL.md +0 -93
- package/bundled/skills/prizmkit-specify/SKILL.md +0 -118
- package/bundled/skills/prizmkit-specify/assets/spec-template.md +0 -56
- package/bundled/skills/prizmkit-tool-adr-manager/SKILL.md +0 -67
- package/bundled/skills/prizmkit-tool-adr-manager/assets/adr-template.md +0 -26
- package/bundled/skills/prizmkit-tool-api-doc-generator/SKILL.md +0 -55
- package/bundled/skills/prizmkit-tool-bug-reproducer/SKILL.md +0 -61
- package/bundled/skills/prizmkit-tool-ci-cd-generator/SKILL.md +0 -53
- package/bundled/skills/prizmkit-tool-db-migration/SKILL.md +0 -64
- package/bundled/skills/prizmkit-tool-dependency-health/SKILL.md +0 -122
- package/bundled/skills/prizmkit-tool-deployment-strategy/SKILL.md +0 -57
- package/bundled/skills/prizmkit-tool-error-triage/SKILL.md +0 -54
- package/bundled/skills/prizmkit-tool-log-analyzer/SKILL.md +0 -54
- package/bundled/skills/prizmkit-tool-monitoring-setup/SKILL.md +0 -74
- package/bundled/skills/prizmkit-tool-onboarding-generator/SKILL.md +0 -69
- package/bundled/skills/prizmkit-tool-perf-profiler/SKILL.md +0 -54
- package/bundled/skills/prizmkit-tool-security-audit/SKILL.md +0 -129
- package/bundled/skills/prizmkit-tool-tech-debt-tracker/SKILL.md +0 -138
package/src/scaffold.js
CHANGED
|
@@ -57,7 +57,7 @@ async function loadSharedFrontmatter() {
|
|
|
57
57
|
/**
|
|
58
58
|
* 根据套件名称解析 Skill 列表
|
|
59
59
|
*/
|
|
60
|
-
async function resolveSkillList(suite) {
|
|
60
|
+
export async function resolveSkillList(suite) {
|
|
61
61
|
const metadata = await loadMetadata();
|
|
62
62
|
|
|
63
63
|
// 处理 recommended:<type> 格式
|
|
@@ -74,7 +74,7 @@ async function resolveSkillList(suite) {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
const suiteDef = metadata.suites[suite] || metadata.suites.
|
|
77
|
+
const suiteDef = metadata.suites[suite] || metadata.suites.core;
|
|
78
78
|
if (suiteDef.skills === '*') {
|
|
79
79
|
return Object.keys(metadata.skills);
|
|
80
80
|
}
|
|
@@ -92,11 +92,13 @@ export async function installSkills(platform, skills, projectRoot, dryRun) {
|
|
|
92
92
|
const skillsDir = getSkillsDir();
|
|
93
93
|
const { parseFrontmatter, buildMarkdown } = await loadSharedFrontmatter();
|
|
94
94
|
|
|
95
|
-
// Load metadata to get skill -> category mapping
|
|
95
|
+
// Load metadata to get skill -> category + subcategory mapping
|
|
96
96
|
const metadata = await loadMetadata();
|
|
97
97
|
const skillCategories = {};
|
|
98
|
+
const skillSubcategories = {};
|
|
98
99
|
for (const [skillName, skillDef] of Object.entries(metadata.skills)) {
|
|
99
100
|
skillCategories[skillName] = skillDef.category;
|
|
101
|
+
skillSubcategories[skillName] = skillDef.subcategory;
|
|
100
102
|
}
|
|
101
103
|
|
|
102
104
|
// Load Claude command adapter for skill conversion
|
|
@@ -107,22 +109,30 @@ export async function installSkills(platform, skills, projectRoot, dryRun) {
|
|
|
107
109
|
}
|
|
108
110
|
|
|
109
111
|
for (const skillName of skills) {
|
|
110
|
-
// Determine the category subdirectory (prizmkit-skill, prizmkit-tool-skill,
|
|
112
|
+
// Determine the category subdirectory (prizmkit-skill, prizmkit-tool-skill, orchestration-skill)
|
|
111
113
|
const category = skillCategories[skillName];
|
|
112
114
|
if (!category) {
|
|
113
115
|
console.warn(` ⚠ Skill ${skillName} has no category mapping in metadata, skipping`);
|
|
114
116
|
continue;
|
|
115
117
|
}
|
|
116
118
|
|
|
117
|
-
|
|
119
|
+
const subcategory = skillSubcategories[skillName];
|
|
120
|
+
|
|
121
|
+
// Security: validate category, subcategory, and skillName contain no path traversal sequences.
|
|
118
122
|
if (category.includes('..') || category.includes('/') || skillName.includes('..') || skillName.includes('/')) {
|
|
119
123
|
console.warn(` ⚠ Skill ${skillName} has invalid category or name, skipping`);
|
|
120
124
|
continue;
|
|
121
125
|
}
|
|
126
|
+
if (subcategory && (subcategory.includes('..') || subcategory.includes('/'))) {
|
|
127
|
+
console.warn(` ⚠ Skill ${skillName} has invalid subcategory, skipping`);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
122
130
|
|
|
123
|
-
// Build path: prefer hierarchical layout (<skillsDir>/<category
|
|
131
|
+
// Build path: prefer hierarchical layout (<skillsDir>/<category>/[<subcategory>/]/<skillName>),
|
|
124
132
|
// fallback to flat bundled layout (<skillsDir>/<skillName>) for npm package compatibility.
|
|
125
|
-
let corePath =
|
|
133
|
+
let corePath = subcategory
|
|
134
|
+
? path.resolve(skillsDir, category, subcategory, skillName)
|
|
135
|
+
: path.resolve(skillsDir, category, skillName);
|
|
126
136
|
// Ensure resolved path stays within skillsDir
|
|
127
137
|
if (!corePath.startsWith(path.resolve(skillsDir))) {
|
|
128
138
|
console.warn(` ⚠ Skill ${skillName} path escapes skills directory, skipping`);
|
|
@@ -244,7 +254,7 @@ export async function installAgents(platform, projectRoot, dryRun) {
|
|
|
244
254
|
/**
|
|
245
255
|
* 安装 Team 配置
|
|
246
256
|
*/
|
|
247
|
-
async function installTeamConfig(platform, projectRoot, dryRun) {
|
|
257
|
+
export async function installTeamConfig(platform, projectRoot, dryRun) {
|
|
248
258
|
const teamDir = getTeamDir();
|
|
249
259
|
const teamDefPath = path.join(teamDir, 'prizm-dev-team.json');
|
|
250
260
|
|
|
@@ -766,7 +776,7 @@ export const EXTRAS_REGISTRY = {
|
|
|
766
776
|
* 执行纯净安装
|
|
767
777
|
* @param {Object} config
|
|
768
778
|
* @param {string} config.platform - 'codebuddy' | 'claude' | 'both'
|
|
769
|
-
* @param {string} config.skills - '
|
|
779
|
+
* @param {string} config.skills - 'core' | 'minimal' | 'recommended:<type>'
|
|
770
780
|
* @param {boolean} config.team - 是否启用团队模式
|
|
771
781
|
* @param {boolean} config.pipeline - 是否安装 dev-pipeline
|
|
772
782
|
* @param {string} [config.rules] - Rules preset: 'recommended' | 'minimal' | 'none'
|
|
@@ -958,8 +968,7 @@ export async function scaffold(config) {
|
|
|
958
968
|
console.log('');
|
|
959
969
|
|
|
960
970
|
// 安装统计
|
|
961
|
-
const suiteLabel = skills === '
|
|
962
|
-
: skills === 'core' ? `核心 ${skillList.length} 个`
|
|
971
|
+
const suiteLabel = skills === 'core' ? `核心 ${skillList.length} 个`
|
|
963
972
|
: skills === 'minimal' ? `最小 ${skillList.length} 个`
|
|
964
973
|
: `推荐 ${skillList.length} 个`;
|
|
965
974
|
|
package/src/upgrade.js
CHANGED
|
@@ -30,42 +30,17 @@ import {
|
|
|
30
30
|
installGitignore,
|
|
31
31
|
installProjectMemory,
|
|
32
32
|
resolvePipelineFileList,
|
|
33
|
+
resolveSkillList,
|
|
33
34
|
EXTRAS_REGISTRY,
|
|
34
35
|
} from './scaffold.js';
|
|
35
36
|
|
|
36
37
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
37
38
|
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
38
39
|
|
|
39
|
-
/**
|
|
40
|
-
* Resolve skill list from suite name (same logic as scaffold.js).
|
|
41
|
-
*/
|
|
42
|
-
async function resolveSkillList(suite) {
|
|
43
|
-
const metadata = await loadMetadata();
|
|
44
|
-
|
|
45
|
-
if (suite && suite.startsWith('recommended:')) {
|
|
46
|
-
const projectType = suite.split(':')[1];
|
|
47
|
-
const rec = metadata.recommendations?.[projectType];
|
|
48
|
-
if (rec) {
|
|
49
|
-
const baseSkills = rec.base === '*'
|
|
50
|
-
? Object.keys(metadata.skills)
|
|
51
|
-
: [...(metadata.suites[rec.base]?.skills || [])];
|
|
52
|
-
const includeSkills = rec.include || [];
|
|
53
|
-
const excludeSkills = new Set(rec.exclude || []);
|
|
54
|
-
return [...new Set([...baseSkills, ...includeSkills])].filter(s => !excludeSkills.has(s));
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const suiteDef = metadata.suites[suite] || metadata.suites.full;
|
|
59
|
-
if (suiteDef.skills === '*') {
|
|
60
|
-
return Object.keys(metadata.skills);
|
|
61
|
-
}
|
|
62
|
-
return suiteDef.skills;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
40
|
/**
|
|
66
41
|
* Remove skill files for a specific platform.
|
|
67
42
|
*/
|
|
68
|
-
async function removeSkillFiles(platform, projectRoot, skillNames, dryRun) {
|
|
43
|
+
export async function removeSkillFiles(platform, projectRoot, skillNames, dryRun) {
|
|
69
44
|
for (const skillName of skillNames) {
|
|
70
45
|
if (platform === 'claude') {
|
|
71
46
|
const commandFile = path.join(projectRoot, '.claude', 'commands', `${skillName}.md`);
|
|
@@ -103,7 +78,7 @@ async function removeSkillFiles(platform, projectRoot, skillNames, dryRun) {
|
|
|
103
78
|
/**
|
|
104
79
|
* Remove agent files for a specific platform.
|
|
105
80
|
*/
|
|
106
|
-
async function removeAgentFiles(platform, projectRoot, agentFileNames, dryRun) {
|
|
81
|
+
export async function removeAgentFiles(platform, projectRoot, agentFileNames, dryRun) {
|
|
107
82
|
for (const fileName of agentFileNames) {
|
|
108
83
|
const dir = platform === 'claude'
|
|
109
84
|
? path.join(projectRoot, '.claude', 'agents')
|
|
@@ -123,7 +98,7 @@ async function removeAgentFiles(platform, projectRoot, agentFileNames, dryRun) {
|
|
|
123
98
|
/**
|
|
124
99
|
* Remove rule files for a specific platform.
|
|
125
100
|
*/
|
|
126
|
-
async function removeRuleFiles(platform, projectRoot, ruleFileNames, dryRun) {
|
|
101
|
+
export async function removeRuleFiles(platform, projectRoot, ruleFileNames, dryRun) {
|
|
127
102
|
for (const fileName of ruleFileNames) {
|
|
128
103
|
const ext = platform === 'claude' ? '' : '';
|
|
129
104
|
const dir = platform === 'claude'
|
|
@@ -148,7 +123,7 @@ async function removeRuleFiles(platform, projectRoot, ruleFileNames, dryRun) {
|
|
|
148
123
|
/**
|
|
149
124
|
* Remove pipeline files that are no longer in the new manifest.
|
|
150
125
|
*/
|
|
151
|
-
async function removePipelineFiles(projectRoot, fileList, dryRun) {
|
|
126
|
+
export async function removePipelineFiles(projectRoot, fileList, dryRun) {
|
|
152
127
|
for (const relPath of fileList) {
|
|
153
128
|
const filePath = path.join(projectRoot, 'dev-pipeline', relPath);
|
|
154
129
|
if (await fs.pathExists(filePath)) {
|
|
@@ -217,7 +192,7 @@ export async function runUpgrade(directory, options = {}) {
|
|
|
217
192
|
|
|
218
193
|
// 3. Resolve new skill list using old manifest's suite + platform (or defaults)
|
|
219
194
|
const oldManifestPlatform = oldManifest?.platform || 'claude';
|
|
220
|
-
const suite = oldManifest?.suite || '
|
|
195
|
+
const suite = oldManifest?.suite || 'core';
|
|
221
196
|
const team = oldManifest?.options?.team ?? true;
|
|
222
197
|
const pipeline = oldManifest?.options?.pipeline ?? true;
|
|
223
198
|
const rulesPreset = oldManifest?.options?.rules || 'recommended';
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "prizmkit-clarify"
|
|
3
|
-
description: "Interactive requirement clarification. Resolves ALL ambiguities in feature specs through unlimited rounds of questions until full understanding is reached. Use when spec has unclear parts, you're unsure about requirements, or before planning to ensure nothing is ambiguous. Trigger on: 'clarify', 'refine spec', 'resolve ambiguities', 'spec has questions', 'unsure about requirements', 'spec is unclear'. (project)"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PrizmKit Clarify
|
|
7
|
-
|
|
8
|
-
Exhaustive interactive requirement clarification. Resolves **every** ambiguity in a feature specification by asking questions one at a time — no limit on rounds or number of questions. The goal is **complete understanding**: do not stop until every unclear aspect is resolved and you are fully confident about the requirements.
|
|
9
|
-
|
|
10
|
-
### When to Use
|
|
11
|
-
- After `/prizmkit-specify` when spec has `[NEEDS CLARIFICATION]` markers
|
|
12
|
-
- User says "clarify", "resolve ambiguities", "refine spec"
|
|
13
|
-
- Before `/prizmkit-plan` to ensure spec is unambiguous
|
|
14
|
-
- Whenever you encounter any uncertainty about what the user wants — proactively ask rather than assume
|
|
15
|
-
|
|
16
|
-
**PRECONDITION:**
|
|
17
|
-
|
|
18
|
-
| Required Artifact | Directory | Check | If Missing |
|
|
19
|
-
|---|---|---|---|
|
|
20
|
-
| `spec.md` | `.prizmkit/specs/###-feature-name/` | File exists with `[NEEDS CLARIFICATION]` markers or underspecified areas | Run `/prizmkit-specify` first |
|
|
21
|
-
|
|
22
|
-
## Execution Steps
|
|
23
|
-
|
|
24
|
-
1. Read `spec.md` from `.prizmkit/specs/###-feature-name/`
|
|
25
|
-
2. Scan for ALL ambiguities — not just `[NEEDS CLARIFICATION]` markers but also:
|
|
26
|
-
- Vague terms without measurable criteria (e.g., "fast", "user-friendly", "secure")
|
|
27
|
-
- Missing edge cases that would affect implementation
|
|
28
|
-
- Implicit assumptions not stated explicitly
|
|
29
|
-
- Scope boundaries that could be interpreted multiple ways
|
|
30
|
-
- Data model gaps (entities, relationships, constraints undefined)
|
|
31
|
-
3. Categorize ambiguities by dimension and prioritize — address the ones that would most affect architecture and data model first, since those are hardest to change later:
|
|
32
|
-
- Data model (what entities, relationships, constraints?) — **highest priority when DB changes are involved**: field types, nullability, naming conventions, relationships, and constraint patterns must all be resolved before plan finalization. Unresolved DB design decisions during implementation lead to expensive rework.
|
|
33
|
-
- Functional scope (what does it do?)
|
|
34
|
-
- UX flow (what does the user see?)
|
|
35
|
-
- Error handling (what happens when things fail?)
|
|
36
|
-
- Non-functional requirements (performance, security)
|
|
37
|
-
- Edge cases, integration points, accessibility
|
|
38
|
-
4. Ask questions **one at a time** — batch questions overwhelm users and produce lower-quality answers because they rush through without thinking deeply about each one
|
|
39
|
-
5. For each question: provide a recommended answer with rationale. The recommendation gives users a concrete starting point to accept, modify, or reject — this is much faster than open-ended questions
|
|
40
|
-
6. After each answer: immediately update `spec.md` (not batched at the end). Atomic updates mean the spec is always in a consistent state, even if the session is interrupted
|
|
41
|
-
7. Remove resolved `[NEEDS CLARIFICATION]` markers as they are addressed
|
|
42
|
-
8. **Continue asking** — after each answer, re-evaluate the spec for remaining ambiguities. Each user answer may reveal new questions. Keep going until:
|
|
43
|
-
- All `[NEEDS CLARIFICATION]` markers are removed, AND
|
|
44
|
-
- No vague or underspecified areas remain, AND
|
|
45
|
-
- You are fully confident about the requirements
|
|
46
|
-
9. Support early termination: user says "done", "stop", or "enough" — end immediately and summarize what was resolved vs what remains unclear
|
|
47
|
-
10. After all questions resolved or user terminates: output summary of all changes made
|
|
48
|
-
|
|
49
|
-
## No Limits Policy
|
|
50
|
-
|
|
51
|
-
**There is NO cap on the number of questions or rounds.** Ask as many questions as needed to achieve complete understanding. A half-understood spec leads to wrong implementations, which cost far more than thorough clarification upfront.
|
|
52
|
-
|
|
53
|
-
- If you've asked 10 questions and there are still ambiguities — keep asking
|
|
54
|
-
- If the user's answer raises new questions — ask those too
|
|
55
|
-
- If you realize a previously-resolved item needs revisiting because of new context — go back and ask again
|
|
56
|
-
- Only stop when you genuinely have no more uncertainties, or the user explicitly terminates
|
|
57
|
-
|
|
58
|
-
## Example Session
|
|
59
|
-
|
|
60
|
-
**Question 1:**
|
|
61
|
-
> spec.md §3.2 says "User can upload files" but doesn't specify which file types or size limits.
|
|
62
|
-
>
|
|
63
|
-
> **Recommended answer:** Accept JPEG, PNG, and PDF up to 10MB. These are the most common user upload types, and 10MB covers high-res photos without straining storage.
|
|
64
|
-
>
|
|
65
|
-
> Do you agree, or would you like different constraints?
|
|
66
|
-
|
|
67
|
-
**User:** "Also allow SVG, and make it 25MB"
|
|
68
|
-
|
|
69
|
-
**Action:** Update spec.md §3.2:
|
|
70
|
-
```
|
|
71
|
-
File upload: accepts JPEG, PNG, PDF, SVG. Max size: 25MB per file.
|
|
72
|
-
```
|
|
73
|
-
Remove `[NEEDS CLARIFICATION]` marker from §3.2.
|
|
74
|
-
|
|
75
|
-
**Question 2** (new question triggered by user's answer):
|
|
76
|
-
> You mentioned SVG files. SVGs can contain embedded scripts which pose XSS risks. Should uploaded SVGs be sanitized (strip `<script>` tags and event handlers), or should SVG upload be restricted to trusted users only?
|
|
77
|
-
>
|
|
78
|
-
> **Recommended answer:** Sanitize all SVG uploads by stripping scripts and event handlers. This allows all users to upload SVGs safely.
|
|
79
|
-
|
|
80
|
-
*(Continue until all ambiguities are resolved...)*
|
|
81
|
-
|
|
82
|
-
## Guidelines
|
|
83
|
-
|
|
84
|
-
- Keep questions at the WHAT/WHY level — do not introduce implementation details (HOW). The spec describes the problem space; implementation choices belong in plan.md
|
|
85
|
-
- If the user's answer contradicts an existing requirement, point out the conflict and ask which one should change
|
|
86
|
-
- Group related follow-up questions naturally — if a user's answer opens 3 related sub-questions, ask the most impactful one first, then proceed to the others
|
|
87
|
-
- If the user seems fatigued, acknowledge it: "I have N more questions. Want to continue now or come back later?" — but never silently stop with unresolved ambiguities
|
|
88
|
-
|
|
89
|
-
**HANDOFF:** `/prizmkit-plan`
|
|
90
|
-
|
|
91
|
-
## Output
|
|
92
|
-
|
|
93
|
-
Updates are made directly to `.prizmkit/specs/###-feature-name/spec.md`. No new files are created.
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "prizmkit-specify"
|
|
3
|
-
description: "Create structured feature specifications from natural language. Use this skill whenever the user wants to define a new feature, describe what to build, or write requirements. Trigger on: 'specify', 'define feature', 'write requirements', 'new feature', 'what should we build', 'I want to add...', 'I want to build...', 'let's add', 'let's build', 'feature idea', or when the user describes a feature they want. This is the first step in the full dev workflow — always use before /prizmkit-plan. Skip for bug fixes, config tweaks, or simple refactors (use fast path). (project)"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PrizmKit Specify
|
|
7
|
-
|
|
8
|
-
Create structured feature specifications from natural language descriptions. This skill transforms a feature idea into a well-structured spec with user stories, acceptance criteria, and scope boundaries.
|
|
9
|
-
|
|
10
|
-
### When to Use
|
|
11
|
-
- Starting a new feature — user says "specify", "define feature", "new feature", "I want to add..."
|
|
12
|
-
- Before `/prizmkit-plan` — to define WHAT will be built before deciding HOW
|
|
13
|
-
- When a feature idea needs to be formalized before implementation
|
|
14
|
-
- When multiple stakeholders need to agree on scope before coding starts
|
|
15
|
-
|
|
16
|
-
### When NOT to Use
|
|
17
|
-
- Bug fixes with clear root cause → use fast path (`/prizmkit-plan` simplified → `/prizmkit-implement` → `/prizmkit-committer`)
|
|
18
|
-
- Config tweaks, typo fixes, simple refactors → edit directly
|
|
19
|
-
- Documentation-only changes → no spec needed
|
|
20
|
-
- User already has a detailed spec → skip to /prizmkit-plan
|
|
21
|
-
|
|
22
|
-
## Execution Steps
|
|
23
|
-
|
|
24
|
-
1. Ask user for feature description (natural language)
|
|
25
|
-
2. Auto-generate 2-4 word feature slug from description
|
|
26
|
-
3. Determine next feature number by scanning `.prizmkit/specs/`:
|
|
27
|
-
- List existing `###-*` directories and find the highest numeric prefix
|
|
28
|
-
- Next number = highest + 1 (zero-padded to 3 digits)
|
|
29
|
-
- Append a short timestamp suffix (`-MMDD`) to prevent collisions in concurrent sessions. Example: `004-user-avatar-0319/`
|
|
30
|
-
- If `.prizmkit/specs/` is empty or doesn't exist, start at `001`
|
|
31
|
-
4. Create directory: `.prizmkit/specs/###-feature-name-MMDD/`
|
|
32
|
-
5. Load project context (use first available source):
|
|
33
|
-
- If `.prizmkit/specs/###-feature-name/context-snapshot.md` exists → read Section 3 'Prizm Context' from it (do NOT re-read `.prizm-docs/` files)
|
|
34
|
-
- Otherwise → read `.prizm-docs/root.prizm`
|
|
35
|
-
6. Generate `spec.md` from template (`${SKILL_DIR}/assets/spec-template.md`) focusing on:
|
|
36
|
-
- Feature title and description
|
|
37
|
-
- User stories (As a... I want... So that...)
|
|
38
|
-
- Acceptance criteria (Given/When/Then)
|
|
39
|
-
- Scope boundaries (In scope / Out of scope)
|
|
40
|
-
- Dependencies and constraints
|
|
41
|
-
- `[NEEDS CLARIFICATION]` markers for all ambiguous items
|
|
42
|
-
7. **Database design detection**: If the feature involves data persistence (new entities, new fields, schema changes), add a `## Data Model` section to spec.md (see template):
|
|
43
|
-
- Scan for existing database schema files to understand current conventions:
|
|
44
|
-
```bash
|
|
45
|
-
find . -maxdepth 4 -type f \( -name "*.prisma" -o -name "*.sql" -o -path "*/migrations/*" -o -path "*/models/*" -o -name "schema.*" -o -name "*.entity.*" \) -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -not -path '*/__pycache__/*' | head -20
|
|
46
|
-
```
|
|
47
|
-
- Read existing schema/model files to extract conventions: naming style (snake_case vs camelCase), ID strategy (UUID vs auto-increment), timestamp patterns, soft-delete approach, constraint patterns, relationship patterns
|
|
48
|
-
- Document in spec.md Data Model section: existing schema reference, new entities needed, relationships to existing tables
|
|
49
|
-
- Mark uncertain fields or relationships with `[NEEDS CLARIFICATION]` — these MUST be resolved before planning
|
|
50
|
-
- **RULE**: Never design new tables in isolation — always reference existing schema to maintain style consistency
|
|
51
|
-
8. Run internal quality validation loop (max 3 iterations):
|
|
52
|
-
- Check: All user stories have acceptance criteria?
|
|
53
|
-
- Check: Scope boundaries clearly defined?
|
|
54
|
-
- Check: All `[NEEDS CLARIFICATION]` markers have recommended defaults?
|
|
55
|
-
- Check: If Data Model section exists, are existing schema conventions documented?
|
|
56
|
-
9. Output: `spec.md` path and summary
|
|
57
|
-
|
|
58
|
-
## Writing Principles
|
|
59
|
-
|
|
60
|
-
- **Focus on WHAT and WHY, never HOW** — the spec describes the problem space; implementation choices belong in plan.md. Mixing in tech stack details couples the spec to a specific solution and makes it harder to explore alternatives during planning.
|
|
61
|
-
- **Every user story needs acceptance criteria** in Given/When/Then format — without them, the implementer has no way to verify the feature works correctly, and the code reviewer has no baseline to check against.
|
|
62
|
-
- **Scope boundaries must be explicit** — without "Out of scope" boundaries, implementers tend to gold-plate features with capabilities nobody asked for, wasting time and adding complexity.
|
|
63
|
-
- **Mark all unclear areas with `[NEEDS CLARIFICATION]`** — do not limit the number of markers. Every genuine ambiguity should be surfaced. After spec generation, suggest running `/prizmkit-clarify` to resolve them all interactively.
|
|
64
|
-
- **Feature numbers are zero-padded to 3 digits** (e.g., `001`, `012`) with a `-MMDD` timestamp suffix — ensures consistent sorting and prevents collisions when multiple sessions run concurrently.
|
|
65
|
-
|
|
66
|
-
## Handling Vague Inputs
|
|
67
|
-
|
|
68
|
-
When the user's feature description is vague:
|
|
69
|
-
1. Extract what IS clear and write that into the spec
|
|
70
|
-
2. Mark genuinely ambiguous parts with `[NEEDS CLARIFICATION]` and include a recommended default
|
|
71
|
-
3. Suggest running `/prizmkit-clarify` to resolve ambiguities interactively before proceeding to plan
|
|
72
|
-
|
|
73
|
-
The goal is to never block progress — always produce a usable spec, even if it has open questions.
|
|
74
|
-
|
|
75
|
-
## Example
|
|
76
|
-
|
|
77
|
-
**Input:** "I want users to upload avatars"
|
|
78
|
-
|
|
79
|
-
**Output:** `.prizmkit/specs/003-user-avatar/spec.md`
|
|
80
|
-
```markdown
|
|
81
|
-
# Feature: User Avatar Upload
|
|
82
|
-
|
|
83
|
-
## Overview
|
|
84
|
-
Allow users to upload and manage profile avatar images.
|
|
85
|
-
|
|
86
|
-
## User Stories
|
|
87
|
-
|
|
88
|
-
### US-1: Upload Avatar
|
|
89
|
-
As a registered user, I want to upload a profile picture,
|
|
90
|
-
so that other users can visually identify me.
|
|
91
|
-
|
|
92
|
-
**Acceptance Criteria:**
|
|
93
|
-
- Given I am on my profile page
|
|
94
|
-
- When I select an image file and click upload
|
|
95
|
-
- Then my avatar is updated and visible across the platform
|
|
96
|
-
|
|
97
|
-
### US-2: Remove Avatar
|
|
98
|
-
As a registered user, I want to remove my avatar,
|
|
99
|
-
so that I can revert to a default placeholder.
|
|
100
|
-
|
|
101
|
-
## Scope
|
|
102
|
-
- **In scope:** Upload, display, remove avatar; image format validation
|
|
103
|
-
- **Out of scope:** Image cropping/editing, avatar history
|
|
104
|
-
|
|
105
|
-
## Open Questions
|
|
106
|
-
- [NEEDS CLARIFICATION] Maximum file size limit? Recommended: 10MB
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
**HANDOFF:** `/prizmkit-plan` or `/prizmkit-clarify`
|
|
110
|
-
|
|
111
|
-
## Template
|
|
112
|
-
|
|
113
|
-
The spec template is located at `${SKILL_DIR}/assets/spec-template.md`.
|
|
114
|
-
|
|
115
|
-
## Output
|
|
116
|
-
|
|
117
|
-
All outputs are written to `.prizmkit/specs/###-feature-name/`:
|
|
118
|
-
- `spec.md` — The feature specification
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# Feature: [FEATURE_TITLE]
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
[One paragraph describing the feature purpose and business value]
|
|
5
|
-
|
|
6
|
-
## User Stories
|
|
7
|
-
|
|
8
|
-
### US1: [Story Title]
|
|
9
|
-
**As a** [role]
|
|
10
|
-
**I want** [capability]
|
|
11
|
-
**So that** [benefit]
|
|
12
|
-
|
|
13
|
-
**Acceptance Criteria:**
|
|
14
|
-
- [ ] Given [context], When [action], Then [expected result]
|
|
15
|
-
|
|
16
|
-
## Scope
|
|
17
|
-
|
|
18
|
-
### In Scope
|
|
19
|
-
- [Item 1]
|
|
20
|
-
|
|
21
|
-
### Out of Scope
|
|
22
|
-
- [Item 1]
|
|
23
|
-
|
|
24
|
-
## Dependencies
|
|
25
|
-
- [Dependency 1]: [Why needed]
|
|
26
|
-
|
|
27
|
-
## Data Model (if feature involves database changes)
|
|
28
|
-
|
|
29
|
-
### Existing Schema Reference
|
|
30
|
-
<!-- Read existing schema/model files BEFORE designing new tables. Document observed conventions here. -->
|
|
31
|
-
- Tables reviewed: [list existing tables related to this feature]
|
|
32
|
-
- Naming convention: [snake_case/camelCase — match existing]
|
|
33
|
-
- ID strategy: [UUID/auto-increment — match existing]
|
|
34
|
-
- Timestamp pattern: [created_at/updated_at — match existing]
|
|
35
|
-
- Soft delete: [yes/no, field name — match existing]
|
|
36
|
-
|
|
37
|
-
### New/Modified Entities
|
|
38
|
-
| Entity | Type (new/modify) | Key Fields | Relationships | Constraints |
|
|
39
|
-
|--------|-------------------|------------|---------------|-------------|
|
|
40
|
-
| [entity_name] | new | [field: type] | [FK to existing_table] | [NOT NULL, UNIQUE, etc.] |
|
|
41
|
-
|
|
42
|
-
### Open Data Model Questions
|
|
43
|
-
<!-- All questions here MUST be resolved before /prizmkit-plan generates Tasks -->
|
|
44
|
-
- [NEEDS CLARIFICATION] [Any uncertain data model decisions — field types, nullability, relationships]
|
|
45
|
-
|
|
46
|
-
## Constraints
|
|
47
|
-
- [Constraint 1]
|
|
48
|
-
|
|
49
|
-
## Clarifications
|
|
50
|
-
[NEEDS CLARIFICATION]: [Ambiguous item]
|
|
51
|
-
|
|
52
|
-
## Review Checklist
|
|
53
|
-
- [ ] All user stories have acceptance criteria
|
|
54
|
-
- [ ] Scope boundaries are clearly defined
|
|
55
|
-
- [ ] Dependencies are identified
|
|
56
|
-
- [ ] No implementation details (WHAT not HOW)
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "prizmkit-tool-adr-manager"
|
|
3
|
-
description: [Tier 1] Manage Architecture Decision Records. Create, list, and supersede ADRs with full context. AI excels at documentation tasks. (project)
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PrizmKit ADR Manager
|
|
7
|
-
|
|
8
|
-
Manage Architecture Decision Records (ADRs) to document and track architectural decisions with full context, alternatives, and consequences.
|
|
9
|
-
|
|
10
|
-
## Commands
|
|
11
|
-
|
|
12
|
-
### `/prizmkit-adr`.new \<title\>
|
|
13
|
-
|
|
14
|
-
Create a new Architecture Decision Record.
|
|
15
|
-
|
|
16
|
-
**STEPS:**
|
|
17
|
-
|
|
18
|
-
1. Determine next ADR number from `docs/adr/` directory (scan existing files, increment highest number)
|
|
19
|
-
2. Generate ADR from template (`${SKILL_DIR}/assets/adr-template.md`):
|
|
20
|
-
- **Title**: Provided by user
|
|
21
|
-
- **Date**: Current date
|
|
22
|
-
- **Status**: Proposed
|
|
23
|
-
- **Context**: Ask user what issue is motivating this decision
|
|
24
|
-
- **Decision**: Ask user what change is being proposed
|
|
25
|
-
- **Consequences**: Identify positive and negative consequences
|
|
26
|
-
- **Alternatives considered**: Ask user about alternatives and why they were rejected
|
|
27
|
-
3. Write to `docs/adr/NNNN-title.md` (zero-padded number, kebab-case title)
|
|
28
|
-
4. Record as a DECISION entry in the relevant `.prizm-docs/` L1/L2 file for the affected module
|
|
29
|
-
|
|
30
|
-
### `/prizmkit-adr`.list
|
|
31
|
-
|
|
32
|
-
Show all ADRs with their current status.
|
|
33
|
-
|
|
34
|
-
**STEPS:**
|
|
35
|
-
|
|
36
|
-
1. Scan `docs/adr/` directory for ADR files
|
|
37
|
-
2. Parse each file for number, title, and status
|
|
38
|
-
3. Display table:
|
|
39
|
-
- Number | Title | Status | Date
|
|
40
|
-
- Status values: Proposed, Accepted, Deprecated, Superseded
|
|
41
|
-
4. Highlight any ADRs in Proposed status that may need review
|
|
42
|
-
|
|
43
|
-
### `/prizmkit-adr`.supersede \<number\> \<new-title\>
|
|
44
|
-
|
|
45
|
-
Mark an existing ADR as superseded and create a replacement.
|
|
46
|
-
|
|
47
|
-
**STEPS:**
|
|
48
|
-
|
|
49
|
-
1. Read the existing ADR with the given number from `docs/adr/`
|
|
50
|
-
2. Update its status to "Superseded by [ADR-NNNN]" (the new ADR number)
|
|
51
|
-
3. Create a new ADR using the ``/prizmkit-adr`.new` flow:
|
|
52
|
-
- Pre-populate context with reference to the superseded ADR
|
|
53
|
-
- Include "Supersedes [ADR-NNNN]" in the new ADR
|
|
54
|
-
4. Write both updated files
|
|
55
|
-
|
|
56
|
-
## Template
|
|
57
|
-
|
|
58
|
-
The ADR template is located at `${SKILL_DIR}/assets/adr-template.md` and follows the standard ADR format with Context, Decision, Consequences, and Alternatives sections.
|
|
59
|
-
|
|
60
|
-
## Path References
|
|
61
|
-
|
|
62
|
-
All internal asset paths MUST use `${SKILL_DIR}` placeholder for cross-IDE compatibility.
|
|
63
|
-
|
|
64
|
-
## Output
|
|
65
|
-
|
|
66
|
-
- ADR files in `docs/adr/` directory
|
|
67
|
-
- Updated DECISIONS in relevant `.prizm-docs/` L1/L2 files
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# [NUMBER]. [TITLE]
|
|
2
|
-
|
|
3
|
-
**Date**: YYYY-MM-DD
|
|
4
|
-
**Status**: Proposed | Accepted | Deprecated | Superseded by [ADR-NNNN]
|
|
5
|
-
|
|
6
|
-
## Context
|
|
7
|
-
|
|
8
|
-
[What is the issue that we're seeing that is motivating this decision or change?]
|
|
9
|
-
|
|
10
|
-
## Decision
|
|
11
|
-
|
|
12
|
-
[What is the change that we're proposing and/or doing?]
|
|
13
|
-
|
|
14
|
-
## Consequences
|
|
15
|
-
|
|
16
|
-
### Positive
|
|
17
|
-
- [Consequence 1]
|
|
18
|
-
|
|
19
|
-
### Negative
|
|
20
|
-
- [Consequence 1]
|
|
21
|
-
|
|
22
|
-
## Alternatives Considered
|
|
23
|
-
|
|
24
|
-
### [Alternative 1]
|
|
25
|
-
- **Description**: [What it is]
|
|
26
|
-
- **Reason rejected**: [Why not chosen]
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "prizmkit-tool-api-doc-generator"
|
|
3
|
-
description: [Tier 2] Extract API documentation from source code into OpenAPI/Markdown. May miss undocumented or dynamically generated endpoints. (project)
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PrizmKit API Doc Generator
|
|
7
|
-
|
|
8
|
-
Generate API documentation from source code by scanning routes, controllers, and handlers. Produces OpenAPI 3.0 specs or Markdown reference docs.
|
|
9
|
-
|
|
10
|
-
## Commands
|
|
11
|
-
|
|
12
|
-
### `/prizmkit-api`-docs [api-directory]
|
|
13
|
-
|
|
14
|
-
Generate API documentation from source code.
|
|
15
|
-
|
|
16
|
-
**STEPS:**
|
|
17
|
-
|
|
18
|
-
1. Read `.prizm-docs/` for project tech stack (framework, language, API style: REST / GraphQL / gRPC)
|
|
19
|
-
2. Scan API source files (routes, controllers, handlers):
|
|
20
|
-
- Detect routing patterns based on framework:
|
|
21
|
-
- Express/Fastify: `app.get()`, `router.post()`, etc.
|
|
22
|
-
- Django/Flask: `@app.route()`, `urlpatterns`
|
|
23
|
-
- Spring: `@GetMapping`, `@PostMapping`, etc.
|
|
24
|
-
- Go: `http.HandleFunc`, gorilla/mux, chi routes
|
|
25
|
-
- If `api-directory` is specified, limit scan to that directory
|
|
26
|
-
3. Extract for each endpoint:
|
|
27
|
-
- **HTTP method and path**: GET /api/users/:id
|
|
28
|
-
- **Request parameters**:
|
|
29
|
-
- Path parameters (with types)
|
|
30
|
-
- Query parameters (with types and defaults)
|
|
31
|
-
- Request body schema (from types, validation decorators, or inline definitions)
|
|
32
|
-
- **Response body schemas**: Success and error response structures
|
|
33
|
-
- **Authentication requirements**: Which auth mechanism is required (JWT, API key, session, none)
|
|
34
|
-
- **Error responses**: Common error codes and their meanings (400, 401, 403, 404, 500)
|
|
35
|
-
- **Description**: From JSDoc comments, docstrings, or function/handler names
|
|
36
|
-
4. Generate documentation in requested format:
|
|
37
|
-
- **OpenAPI 3.0 YAML** (default): Full spec with schemas, security definitions, and server info
|
|
38
|
-
- **Markdown API reference**: Human-readable endpoint documentation
|
|
39
|
-
- **Both**: Generate both formats
|
|
40
|
-
5. Include examples for each endpoint:
|
|
41
|
-
- Sample request (curl command)
|
|
42
|
-
- Sample success response (JSON)
|
|
43
|
-
- Sample error response (JSON)
|
|
44
|
-
6. Write to `docs/api/` directory:
|
|
45
|
-
- `docs/api/openapi.yaml` for OpenAPI spec
|
|
46
|
-
- `docs/api/API_REFERENCE.md` for Markdown docs
|
|
47
|
-
|
|
48
|
-
## Path References
|
|
49
|
-
|
|
50
|
-
All internal asset paths MUST use `.claude/commands/prizmkit-api-doc-generator` placeholder for cross-IDE compatibility.
|
|
51
|
-
|
|
52
|
-
## Output
|
|
53
|
-
|
|
54
|
-
- `docs/api/openapi.yaml`: OpenAPI 3.0 specification
|
|
55
|
-
- `docs/api/API_REFERENCE.md`: Markdown API reference
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "prizmkit-tool-bug-reproducer"
|
|
3
|
-
description: [Tier 1] Generate minimal reproduction scripts and test cases from bug descriptions. AI strength in test/script generation. (project)
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# PrizmKit Bug Reproducer
|
|
7
|
-
|
|
8
|
-
Generate minimal reproduction scripts and test cases from bug descriptions to isolate, confirm, and verify fixes.
|
|
9
|
-
|
|
10
|
-
## Commands
|
|
11
|
-
|
|
12
|
-
### `/prizmkit-bug`-reproduce \<bug-description\>
|
|
13
|
-
|
|
14
|
-
Generate a minimal reproduction for a reported bug.
|
|
15
|
-
|
|
16
|
-
**STEPS:**
|
|
17
|
-
|
|
18
|
-
1. Parse bug description: extract expected vs actual behavior, steps to reproduce (if given), environment details
|
|
19
|
-
2. Read `.prizm-docs/` for relevant module context, paying special attention to TRAPS sections that may document known pitfalls
|
|
20
|
-
3. Identify affected code path from description:
|
|
21
|
-
- Map user-facing behavior to source code modules
|
|
22
|
-
- Identify entry points and data flow
|
|
23
|
-
4. Generate minimal reproduction based on bug type:
|
|
24
|
-
a. **For API bugs**: Generate curl/HTTP request sequence
|
|
25
|
-
- Include headers, authentication, request body
|
|
26
|
-
- Show expected vs actual response
|
|
27
|
-
- Add assertions on status code and response body
|
|
28
|
-
b. **For UI bugs**: Generate step-by-step user interaction guide
|
|
29
|
-
- Numbered steps with specific UI elements to interact with
|
|
30
|
-
- Screenshot annotation points (where to look)
|
|
31
|
-
- Browser/device requirements if relevant
|
|
32
|
-
c. **For logic bugs**: Generate unit test that demonstrates the failure
|
|
33
|
-
- Minimal test case with clear arrange/act/assert
|
|
34
|
-
- Test name describes the expected behavior
|
|
35
|
-
- Comments explaining why this should pass
|
|
36
|
-
d. **For data bugs**: Generate seed data + query sequence
|
|
37
|
-
- Minimal dataset that triggers the issue
|
|
38
|
-
- Query or operation sequence to reproduce
|
|
39
|
-
- Expected vs actual result comparison
|
|
40
|
-
5. Write reproduction script/test to a temporary file:
|
|
41
|
-
- Use project's existing test framework and conventions
|
|
42
|
-
- Include setup and teardown
|
|
43
|
-
- Make it self-contained and runnable
|
|
44
|
-
6. Include assertions that:
|
|
45
|
-
- FAIL with current (buggy) behavior
|
|
46
|
-
- PASS with expected (correct) behavior
|
|
47
|
-
- Serve as regression test after fix is applied
|
|
48
|
-
7. Output:
|
|
49
|
-
- Reproduction file path
|
|
50
|
-
- Minimal steps document describing how to run
|
|
51
|
-
- Suggested fix investigation starting points
|
|
52
|
-
|
|
53
|
-
## Path References
|
|
54
|
-
|
|
55
|
-
All internal asset paths MUST use `.claude/commands/prizmkit-bug-reproducer` placeholder for cross-IDE compatibility.
|
|
56
|
-
|
|
57
|
-
## Output
|
|
58
|
-
|
|
59
|
-
- Reproduction script or test file written to project's test directory
|
|
60
|
-
- Minimal steps document printed to console
|
|
61
|
-
- Investigation pointers for the fix
|