create-ai-project 1.23.4 → 1.23.5
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/.claude/agents-en/acceptance-test-generator.md +6 -30
- package/.claude/agents-en/code-reviewer.md +15 -24
- package/.claude/agents-en/code-verifier.md +3 -32
- package/.claude/agents-en/codebase-analyzer.md +10 -78
- package/.claude/agents-en/document-reviewer.md +10 -57
- package/.claude/agents-en/integration-test-reviewer.md +6 -37
- package/.claude/agents-en/investigator.md +6 -59
- package/.claude/agents-en/quality-fixer-frontend.md +1 -5
- package/.claude/agents-en/quality-fixer.md +1 -5
- package/.claude/agents-en/requirement-analyzer.md +3 -14
- package/.claude/agents-en/rule-advisor.md +3 -16
- package/.claude/agents-en/scope-discoverer.md +5 -29
- package/.claude/agents-en/security-reviewer.md +2 -13
- package/.claude/agents-en/skill-creator.md +3 -6
- package/.claude/agents-en/skill-reviewer.md +7 -43
- package/.claude/agents-en/solver.md +9 -24
- package/.claude/agents-en/task-decomposer.md +17 -0
- package/.claude/agents-en/task-executor-frontend.md +14 -19
- package/.claude/agents-en/task-executor.md +14 -19
- package/.claude/agents-en/ui-analyzer.md +16 -115
- package/.claude/agents-en/verifier.md +9 -53
- package/.claude/agents-ja/acceptance-test-generator.md +6 -30
- package/.claude/agents-ja/code-reviewer.md +15 -24
- package/.claude/agents-ja/code-verifier.md +3 -32
- package/.claude/agents-ja/codebase-analyzer.md +10 -78
- package/.claude/agents-ja/document-reviewer.md +10 -57
- package/.claude/agents-ja/integration-test-reviewer.md +6 -37
- package/.claude/agents-ja/investigator.md +6 -59
- package/.claude/agents-ja/quality-fixer-frontend.md +1 -5
- package/.claude/agents-ja/quality-fixer.md +1 -5
- package/.claude/agents-ja/requirement-analyzer.md +3 -14
- package/.claude/agents-ja/rule-advisor.md +3 -16
- package/.claude/agents-ja/scope-discoverer.md +5 -29
- package/.claude/agents-ja/security-reviewer.md +2 -13
- package/.claude/agents-ja/skill-creator.md +3 -6
- package/.claude/agents-ja/skill-reviewer.md +7 -43
- package/.claude/agents-ja/solver.md +9 -24
- package/.claude/agents-ja/task-decomposer.md +17 -0
- package/.claude/agents-ja/task-executor-frontend.md +14 -19
- package/.claude/agents-ja/task-executor.md +14 -19
- package/.claude/agents-ja/ui-analyzer.md +16 -115
- package/.claude/agents-ja/verifier.md +9 -53
- package/.claude/skills-en/documentation-criteria/references/plan-template.md +1 -1
- package/.claude/skills-en/documentation-criteria/references/task-template.md +8 -0
- package/.claude/skills-en/frontend-technical-spec/SKILL.md +4 -8
- package/.claude/skills-en/frontend-typescript-rules/SKILL.md +4 -2
- package/.claude/skills-en/frontend-typescript-testing/SKILL.md +5 -11
- package/.claude/skills-en/technical-spec/SKILL.md +4 -3
- package/.claude/skills-en/typescript-testing/SKILL.md +4 -4
- package/.claude/skills-ja/documentation-criteria/references/plan-template.md +1 -1
- package/.claude/skills-ja/documentation-criteria/references/task-template.md +8 -0
- package/.claude/skills-ja/frontend-technical-spec/SKILL.md +4 -8
- package/.claude/skills-ja/frontend-typescript-rules/SKILL.md +4 -2
- package/.claude/skills-ja/frontend-typescript-testing/SKILL.md +5 -11
- package/.claude/skills-ja/task-analyzer/references/skills-index.yaml +3 -3
- package/.claude/skills-ja/technical-spec/SKILL.md +4 -3
- package/.claude/skills-ja/typescript-testing/SKILL.md +4 -4
- package/CHANGELOG.md +8 -0
- package/package.json +1 -1
|
@@ -165,142 +165,43 @@ skills: frontend-typescript-rules, frontend-technical-spec, project-context
|
|
|
165
165
|
|
|
166
166
|
```json
|
|
167
167
|
{
|
|
168
|
-
"analysisScope": {
|
|
169
|
-
"filesAnalyzed": ["path/to/component.tsx"],
|
|
170
|
-
"stylesAnalyzed": ["path/to/styles.module.css"],
|
|
171
|
-
"uiConventions": {
|
|
172
|
-
"componentExtension": ".tsx",
|
|
173
|
-
"styleStrategy": "css-modules|vanilla-css|css-in-js|utility-classes",
|
|
174
|
-
"storybook": true,
|
|
175
|
-
"testRunner": "vitest|jest|other"
|
|
176
|
-
}
|
|
177
|
-
},
|
|
168
|
+
"analysisScope": {"filesAnalyzed": ["path/to/component.tsx"], "stylesAnalyzed": ["path/to/styles.module.css"], "uiConventions": {"componentExtension": ".tsx", "styleStrategy": "css-modules|vanilla-css|css-in-js|utility-classes", "storybook": true, "testRunner": "vitest|jest|other"}},
|
|
178
169
|
"externalResources": {
|
|
179
170
|
"status": "fetched|partial|not_recorded",
|
|
180
|
-
"designOrigin": {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
},
|
|
185
|
-
"designSystem": {
|
|
186
|
-
"fetch_status": "fetched|mcp_unavailable|skipped|not_applicable",
|
|
187
|
-
"accessMethod": "...",
|
|
188
|
-
"fetched_summary": "components catalogued, tokens captured, anti-pattern identifiers"
|
|
189
|
-
},
|
|
190
|
-
"guidelines": {
|
|
191
|
-
"fetch_status": "fetched|skipped|not_applicable",
|
|
192
|
-
"accessMethod": "...",
|
|
193
|
-
"fetched_summary": "rule categories captured (CSS, accessibility, i18n, etc.)"
|
|
194
|
-
},
|
|
195
|
-
"visualVerification": {
|
|
196
|
-
"fetch_status": "available|mcp_unavailable|not_applicable",
|
|
197
|
-
"accessMethod": "...",
|
|
198
|
-
"notes": "how rendered output is verified during implementation"
|
|
199
|
-
}
|
|
171
|
+
"designOrigin": {"fetch_status": "fetched|mcp_unavailable|skipped|not_applicable", "accessMethod": "MCP name | URL | file path | existing-implementation-only", "fetched_summary": "brief description of fetched content (e.g., screen names, frame ids, token snapshot)"},
|
|
172
|
+
"designSystem": {"fetch_status": "fetched|mcp_unavailable|skipped|not_applicable", "accessMethod": "...", "fetched_summary": "components catalogued, tokens captured, anti-pattern identifiers"},
|
|
173
|
+
"guidelines": {"fetch_status": "fetched|skipped|not_applicable", "accessMethod": "...", "fetched_summary": "rule categories captured (CSS, accessibility, i18n, etc.)"},
|
|
174
|
+
"visualVerification": {"fetch_status": "available|mcp_unavailable|not_applicable", "accessMethod": "...", "notes": "how rendered output is verified during implementation"}
|
|
200
175
|
},
|
|
201
176
|
"componentStructure": [
|
|
202
|
-
{
|
|
203
|
-
"name": "ComponentName",
|
|
204
|
-
"filePath": "path/to/file:lineNumber",
|
|
205
|
-
"propsInterface": "name and brief shape",
|
|
206
|
-
"topLevelElement": "tag or component name",
|
|
207
|
-
"domOrder": ["child1", "child2", "child3"],
|
|
208
|
-
"conditionalBranches": [
|
|
209
|
-
{"predicate": "condition expression", "renderedSubtree": "brief description"}
|
|
210
|
-
],
|
|
211
|
-
"callSites": ["path/to/consumer:line"]
|
|
212
|
-
}
|
|
177
|
+
{"name": "ComponentName", "filePath": "path/to/file:lineNumber", "propsInterface": "name and brief shape", "topLevelElement": "tag or component name", "domOrder": ["child1", "child2", "child3"], "conditionalBranches": [{"predicate": "condition expression", "renderedSubtree": "brief description"}], "callSites": ["path/to/consumer:line"]}
|
|
213
178
|
],
|
|
214
179
|
"propsPatterns": [
|
|
215
|
-
{
|
|
216
|
-
"component": "ComponentName",
|
|
217
|
-
"callSite": "path/to/file:line",
|
|
218
|
-
"props": {"variant": "primary", "size": "md"},
|
|
219
|
-
"computedProps": ["onClick (useCallback)"],
|
|
220
|
-
"groupKey": "primary-md"
|
|
221
|
-
}
|
|
180
|
+
{"component": "ComponentName", "callSite": "path/to/file:line", "props": {"variant": "primary", "size": "md"}, "computedProps": ["onClick (useCallback)"], "groupKey": "primary-md"}
|
|
222
181
|
],
|
|
223
182
|
"cssLayout": [
|
|
224
|
-
{
|
|
225
|
-
"filePath": "path/to/styles.module.css",
|
|
226
|
-
"classNamingConvention": "camelCase|kebab-case|BEM",
|
|
227
|
-
"baseClass": "root",
|
|
228
|
-
"layouts": [
|
|
229
|
-
{
|
|
230
|
-
"selector": ".className",
|
|
231
|
-
"display": "flex|grid|block",
|
|
232
|
-
"direction": "row|column|grid-template",
|
|
233
|
-
"gap": "8px|none",
|
|
234
|
-
"wrap": "wrap|nowrap|absent",
|
|
235
|
-
"logicalProperties": true,
|
|
236
|
-
"stateSelectors": ["[data-state=active]", "[aria-selected=true]"]
|
|
237
|
-
}
|
|
238
|
-
],
|
|
239
|
-
"responsiveBreakpoints": ["768px", "1024px"]
|
|
240
|
-
}
|
|
183
|
+
{"filePath": "path/to/styles.module.css", "classNamingConvention": "camelCase|kebab-case|BEM", "baseClass": "root", "layouts": [{"selector": ".className", "display": "flex|grid|block", "direction": "row|column|grid-template", "gap": "8px|none", "wrap": "wrap|nowrap|absent", "logicalProperties": true, "stateSelectors": ["[data-state=active]", "[aria-selected=true]"]}], "responsiveBreakpoints": ["768px", "1024px"]}
|
|
241
184
|
],
|
|
242
185
|
"stateDisplay": [
|
|
243
|
-
{
|
|
244
|
-
"component": "ComponentName",
|
|
245
|
-
"states": [
|
|
246
|
-
{"name": "loading|empty|partial|error|ready|disabled", "trigger": "what causes this state", "renders": "brief description"}
|
|
247
|
-
],
|
|
248
|
-
"unsupportedStates": ["states the component does not currently express"]
|
|
249
|
-
}
|
|
186
|
+
{"component": "ComponentName", "states": [{"name": "loading|empty|partial|error|ready|disabled", "trigger": "what causes this state", "renders": "brief description"}], "unsupportedStates": ["states the component does not currently express"]}
|
|
250
187
|
],
|
|
251
188
|
"displayConditions": [
|
|
252
|
-
{
|
|
253
|
-
"component": "ComponentName",
|
|
254
|
-
"condition": "feature_flag|role|route|region|tenant|page_context",
|
|
255
|
-
"predicateLocation": "path/to/file:line",
|
|
256
|
-
"predicate": "expression",
|
|
257
|
-
"gatedSubtree": "brief description"
|
|
258
|
-
}
|
|
189
|
+
{"component": "ComponentName", "condition": "feature_flag|role|route|region|tenant|page_context", "predicateLocation": "path/to/file:line", "predicate": "expression", "gatedSubtree": "brief description"}
|
|
259
190
|
],
|
|
260
|
-
"i18n": {
|
|
261
|
-
"format": "csv|json|code-catalog|other",
|
|
262
|
-
"structuralConventions": {"csvColumns": 2, "trailingComma": false, "jsonNestingDepth": 1},
|
|
263
|
-
"keyNamingConvention": "pattern with examples",
|
|
264
|
-
"locales": ["ja-JP", "en-US"],
|
|
265
|
-
"localeGaps": ["keys present in one locale only"],
|
|
266
|
-
"generatedTypings": {"command": "generator command", "outputPath": "path/to/output"}
|
|
267
|
-
},
|
|
191
|
+
"i18n": {"format": "csv|json|code-catalog|other", "structuralConventions": {"csvColumns": 2, "trailingComma": false, "jsonNestingDepth": 1}, "keyNamingConvention": "pattern with examples", "locales": ["ja-JP", "en-US"], "localeGaps": ["keys present in one locale only"], "generatedTypings": {"command": "generator command", "outputPath": "path/to/output"}},
|
|
268
192
|
"accessibility": [
|
|
269
|
-
{
|
|
270
|
-
"component": "ComponentName",
|
|
271
|
-
"ariaAttributes": ["role=button", "aria-label fed by prop accessibleName"],
|
|
272
|
-
"keyboardHandling": "Enter and Space mapped to onClick",
|
|
273
|
-
"focusStyling": "focus-visible outline",
|
|
274
|
-
"testCoverage": "axe checks present|absent"
|
|
275
|
-
}
|
|
193
|
+
{"component": "ComponentName", "ariaAttributes": ["role=button", "aria-label fed by prop accessibleName"], "keyboardHandling": "Enter and Space mapped to onClick", "focusStyling": "focus-visible outline", "testCoverage": "axe checks present|absent"}
|
|
276
194
|
],
|
|
277
195
|
"generatedArtifacts": [
|
|
278
|
-
{
|
|
279
|
-
"kind": "css-module-typings|message-catalog-typings|route-typings|other",
|
|
280
|
-
"command": "generator command",
|
|
281
|
-
"trigger": "on *.module.css change|manual|other",
|
|
282
|
-
"consumers": ["typecheck", "test", "build", "runtime"]
|
|
283
|
-
}
|
|
196
|
+
{"kind": "css-module-typings|message-catalog-typings|route-typings|other", "command": "generator command", "trigger": "on *.module.css change|manual|other", "consumers": ["typecheck", "test", "build", "runtime"]}
|
|
284
197
|
],
|
|
285
198
|
"focusAreas": [
|
|
286
|
-
{
|
|
287
|
-
"fact_id": "src/components/Card/Card.tsx:Card",
|
|
288
|
-
"area": "Brief UI area name",
|
|
289
|
-
"evidence": "componentStructure[name=Card] | cssLayout[selector=.root] | propsPatterns[groupKey=...] | externalResources.designOrigin",
|
|
290
|
-
"factsToAddress": "Concrete UI facts the designer or implementer must respect",
|
|
291
|
-
"risk": "What inconsistency results if these facts are omitted"
|
|
292
|
-
}
|
|
199
|
+
{"fact_id": "src/components/Card/Card.tsx:Card", "area": "Brief UI area name", "evidence": "componentStructure[name=Card] | cssLayout[selector=.root] | propsPatterns[groupKey=...] | externalResources.designOrigin", "factsToAddress": "Concrete UI facts the designer or implementer must respect", "risk": "What inconsistency results if these facts are omitted"}
|
|
293
200
|
],
|
|
294
201
|
"candidateWriteSet": [
|
|
295
|
-
{
|
|
296
|
-
"path": "src/components/Card/Card.tsx",
|
|
297
|
-
"reasonRef": "focusAreas[fact_id=src/components/Card/Card.tsx:Card]",
|
|
298
|
-
"confidence": "high|medium|low"
|
|
299
|
-
}
|
|
202
|
+
{"path": "src/components/Card/Card.tsx", "reasonRef": "focusAreas[fact_id=src/components/Card/Card.tsx:Card]", "confidence": "high|medium|low"}
|
|
300
203
|
],
|
|
301
|
-
"limitations": [
|
|
302
|
-
"Areas the analysis could not reach with confidence"
|
|
303
|
-
]
|
|
204
|
+
"limitations": ["Areas the analysis could not reach with confidence"]
|
|
304
205
|
}
|
|
305
206
|
```
|
|
306
207
|
|
|
@@ -61,7 +61,8 @@ skills: project-context, technical-spec, coding-standards
|
|
|
61
61
|
|
|
62
62
|
1. **未トレースパス**: 症状が到達しうるのに調査でトレースされていないコードパスはないか(例: エラーハンドリング分岐、非同期フォーク、フォールバックパス)
|
|
63
63
|
2. **未チェックノード**: トレース済みパス上でチェックされていないノードはないか
|
|
64
|
-
3.
|
|
64
|
+
3. **隣接ケース**: 調査が `bug-fix` / `regression` / `state-change` / `boundary-change` に関わる場合(デバッグフローには Change Category フィールドが無いため、調査自体から判断する)、同一の経路・契約・永続状態・外部境界を共有し同じ障害を抱えうるケースはないか。妥当な隣接ケースをすべてトレースするか、トレースしないものは明示的に正当化する
|
|
65
|
+
4. **追加の障害点**: 未トレースパス・未チェックノード・隣接ケースから新たな障害が見つかった場合は記録する
|
|
65
66
|
|
|
66
67
|
目的は、調査のパスカバレッジが十分であるかを検証すること。
|
|
67
68
|
|
|
@@ -115,78 +116,33 @@ skills: project-context, technical-spec, coding-standards
|
|
|
115
116
|
"identifiedGaps": ["未トレースパスや未チェックノード"]
|
|
116
117
|
},
|
|
117
118
|
"triangulationSupplements": [
|
|
118
|
-
{
|
|
119
|
-
"source": "追加で調査した情報源",
|
|
120
|
-
"findings": "発見した内容",
|
|
121
|
-
"impactOnFailurePoints": "既存の障害点への影響"
|
|
122
|
-
}
|
|
119
|
+
{"source": "追加で調査した情報源", "findings": "発見した内容", "impactOnFailurePoints": "既存の障害点への影響"}
|
|
123
120
|
],
|
|
124
121
|
"externalResearch": [
|
|
125
|
-
{
|
|
126
|
-
"query": "検索したクエリ",
|
|
127
|
-
"source": "情報源",
|
|
128
|
-
"findings": "発見した関連情報",
|
|
129
|
-
"impactOnFailurePoints": "障害点への影響"
|
|
130
|
-
}
|
|
122
|
+
{"query": "検索したクエリ", "source": "情報源", "findings": "発見した関連情報", "impactOnFailurePoints": "障害点への影響"}
|
|
131
123
|
],
|
|
132
124
|
"coverageCheck": {
|
|
133
125
|
"missingPaths": ["調査入力でトレースされていないパス"],
|
|
134
126
|
"uncheckedNodes": ["トレース済みパス上の未チェックノード"],
|
|
135
127
|
"additionalFailurePoints": [
|
|
136
|
-
{
|
|
137
|
-
"id": "AFP1",
|
|
138
|
-
"nodeId": "ノード参照",
|
|
139
|
-
"symptomId": "症状参照",
|
|
140
|
-
"description": "新たに発見された障害",
|
|
141
|
-
"checkStatus": "supported|weakened|blocked|not_reached",
|
|
142
|
-
"evidence": [
|
|
143
|
-
{"type": "supporting", "detail": "証拠の詳細", "source": "file:line"}
|
|
144
|
-
]
|
|
145
|
-
}
|
|
128
|
+
{"id": "AFP1", "nodeId": "ノード参照", "symptomId": "症状参照", "description": "新たに発見された障害", "checkStatus": "supported|weakened|blocked|not_reached", "evidence": [{"type": "supporting", "detail": "証拠の詳細", "source": "file:line"}]}
|
|
146
129
|
]
|
|
147
130
|
},
|
|
148
131
|
"devilsAdvocateFindings": [
|
|
149
|
-
{
|
|
150
|
-
"targetFailurePoint": "FP1",
|
|
151
|
-
"alternativeExplanation": "正常な動作である可能性は?",
|
|
152
|
-
"hiddenAssumptions": ["暗黙の前提"],
|
|
153
|
-
"potentialCounterEvidence": ["見落とされている可能性のある反証"]
|
|
154
|
-
}
|
|
132
|
+
{"targetFailurePoint": "FP1", "alternativeExplanation": "正常な動作である可能性は?", "hiddenAssumptions": ["暗黙の前提"], "potentialCounterEvidence": ["見落とされている可能性のある反証"]}
|
|
155
133
|
],
|
|
156
134
|
"failurePointEvaluation": [
|
|
157
|
-
{
|
|
158
|
-
"failurePointId": "FP1またはAFP1",
|
|
159
|
-
"description": "障害点の記述",
|
|
160
|
-
"originalCheckStatus": "調査入力のcheckStatus(検証段階で発見されたAFPはnull)",
|
|
161
|
-
"finalStatus": "supported|weakened|blocked|not_reached",
|
|
162
|
-
"statusChangeReason": "ステータスが変更された理由(変更があった場合)",
|
|
163
|
-
"remainingUncertainty": ["残る不確実性"]
|
|
164
|
-
}
|
|
135
|
+
{"failurePointId": "FP1またはAFP1", "description": "障害点の記述", "originalCheckStatus": "調査入力のcheckStatus(検証段階で発見されたAFPはnull)", "finalStatus": "supported|weakened|blocked|not_reached", "statusChangeReason": "ステータスが変更された理由(変更があった場合)", "remainingUncertainty": ["残る不確実性"]}
|
|
165
136
|
],
|
|
166
137
|
"conclusion": {
|
|
167
138
|
"confirmedFailurePoints": [
|
|
168
|
-
{
|
|
169
|
-
"failurePointId": "FP1",
|
|
170
|
-
"description": "障害の内容",
|
|
171
|
-
"location": "file:line",
|
|
172
|
-
"symptomId": "S1",
|
|
173
|
-
"symptomExplained": "この障害が観察された症状にどうつながるか",
|
|
174
|
-
"causeCategory": "typo|logic_error|missing_constraint|design_gap|external_factor",
|
|
175
|
-
"finalStatus": "supported|weakened",
|
|
176
|
-
"causalChain": ["現象", "→ 直接原因", "→ 根本原因"],
|
|
177
|
-
"impactScope": ["影響を受けるファイルパス"],
|
|
178
|
-
"recurrenceRisk": "low|medium|high"
|
|
179
|
-
}
|
|
139
|
+
{"failurePointId": "FP1", "description": "障害の内容", "location": "file:line", "symptomId": "S1", "symptomExplained": "この障害が観察された症状にどうつながるか", "causeCategory": "typo|logic_error|missing_constraint|design_gap|external_factor", "finalStatus": "supported|weakened", "causalChain": ["現象", "→ 直接原因", "→ 根本原因"], "impactScope": ["影響を受けるファイルパス"], "recurrenceRisk": "low|medium|high"}
|
|
180
140
|
],
|
|
181
141
|
"refutedFailurePoints": [
|
|
182
142
|
{"failurePointId": "FP2", "reason": "反証された理由"}
|
|
183
143
|
],
|
|
184
144
|
"failurePointRelationships": [
|
|
185
|
-
{
|
|
186
|
-
"points": ["FP1", "FP3"],
|
|
187
|
-
"relationship": "independent|dependent|same_chain",
|
|
188
|
-
"detail": "障害点間の関係の説明"
|
|
189
|
-
}
|
|
145
|
+
{"points": ["FP1", "FP3"], "relationship": "independent|dependent|same_chain", "detail": "障害点間の関係の説明"}
|
|
190
146
|
],
|
|
191
147
|
"coverageAssessment": "sufficient|partial|insufficient",
|
|
192
148
|
"unresolvedSymptoms": ["確認された障害点で完全に説明できない症状"],
|
|
@@ -212,7 +212,7 @@ This phase is required for ALL implementation approaches.
|
|
|
212
212
|
- [ ] Security review: Verify security considerations from Design Doc are implemented
|
|
213
213
|
- [ ] Quality checks (types, lint, format)
|
|
214
214
|
- [ ] Execute all tests (including integration/E2E from test skeletons, when provided)
|
|
215
|
-
- [ ] Coverage
|
|
215
|
+
- [ ] Coverage reviewed as a gap signal on critical paths (any enforced threshold per project CI config)
|
|
216
216
|
- [ ] Document updates
|
|
217
217
|
|
|
218
218
|
### Quality Assurance
|
|
@@ -17,6 +17,13 @@ Metadata:
|
|
|
17
17
|
Files to read before starting implementation (file path, with optional search hint):
|
|
18
18
|
- [e.g., src/orders/checkout (processOrder function) — determined during task decomposition based on task nature]
|
|
19
19
|
|
|
20
|
+
## Change Category
|
|
21
|
+
(Include this field only when the task is a bug fix, regression, state-change, or boundary-change — populated during task decomposition. Omit otherwise.)
|
|
22
|
+
|
|
23
|
+
`Change Category: <one or more of bug-fix, regression, state-change, boundary-change — comma-separated>`
|
|
24
|
+
|
|
25
|
+
When present, the implementation sweeps the cases sharing the same path, contract, persisted state, or external boundary for the same class of defect (see Implementation Steps Red Phase).
|
|
26
|
+
|
|
20
27
|
## Binding Decisions
|
|
21
28
|
(Include this section when the work plan's ADR Bindings table covers this task. Omit otherwise.)
|
|
22
29
|
|
|
@@ -32,6 +39,7 @@ Each row is an ADR decision the implementation in this task must comply with.
|
|
|
32
39
|
## Implementation Steps (TDD: Red-Green-Refactor)
|
|
33
40
|
### 1. Red Phase
|
|
34
41
|
- [ ] Read all Investigation Targets and record key observations
|
|
42
|
+
- [ ] (When Change Category is set) Sweep the adjacent cases sharing the same path/contract/state/boundary for the same class of defect; fold any found within scope into the failing tests
|
|
35
43
|
- [ ] Review dependency deliverables (if any)
|
|
36
44
|
- [ ] Verify/create contract definitions
|
|
37
45
|
- [ ] Write failing tests
|
|
@@ -133,14 +133,10 @@ Quality checks are mandatory upon implementation completion:
|
|
|
133
133
|
- `test:coverage:fresh` - Coverage measurement
|
|
134
134
|
- `check:all` - Overall integrated check
|
|
135
135
|
|
|
136
|
-
### Coverage
|
|
137
|
-
-
|
|
138
|
-
-
|
|
139
|
-
|
|
140
|
-
- Molecules: 65% or higher
|
|
141
|
-
- Organisms: 60% or higher
|
|
142
|
-
- Custom Hooks: 65% or higher
|
|
143
|
-
- Utils: 70% or higher
|
|
136
|
+
### Coverage
|
|
137
|
+
- Treat coverage as a diagnostic signal for finding untested areas, not a target (a target gets gamed into trivial tests — Goodhart's Law)
|
|
138
|
+
- Concentrate test rigor on foundational, high-reuse units (shared components, custom hooks, utils) whose regression has the widest blast radius; higher-composition surfaces (organisms, pages) lean on integration/E2E coverage instead
|
|
139
|
+
- Any enforced numeric threshold is the project's CI/coverage config, not a goal in itself
|
|
144
140
|
|
|
145
141
|
### Non-functional Requirements
|
|
146
142
|
- **Browser Compatibility**: Chrome/Firefox/Safari/Edge (latest 2 versions)
|
|
@@ -34,6 +34,7 @@ const user = raw // narrowed to User
|
|
|
34
34
|
- **Custom hooks** are the unit of logic reuse and dependency injection (inject collaborators through the hook for testability).
|
|
35
35
|
- **Function parameters:** 0-2 positional; for 3+ take a single options object.
|
|
36
36
|
- **State shape:** type state explicitly; for multi-field state with discrete transitions, use `useReducer` with a discriminated-union action type rather than many `useState` calls.
|
|
37
|
+
- **Server/Client boundary** (RSC frameworks only — e.g. Next.js App Router): default to server components for data fetching/rendering and isolate interactivity behind a `"use client"` boundary at the smallest scope that needs it; keep browser-only APIs (`window`, `localStorage`, event handlers) inside client components, since calling them in a server component breaks the render. N/A for client-only SPAs (e.g. Vite) — skip when the project has no server-component runtime.
|
|
37
38
|
|
|
38
39
|
## Error Handling
|
|
39
40
|
- Surface every error: log and handle, or propagate — never swallow.
|
|
@@ -41,6 +42,7 @@ const user = raw // narrowed to User
|
|
|
41
42
|
- Represent expected failures as values with a `Result` type; reserve `throw` for unexpected/unrecoverable cases.
|
|
42
43
|
- Use purpose-specific error classes extending a base `AppError` carrying a `code` (e.g. ValidationError, ApiError, NotFoundError).
|
|
43
44
|
- **Layer responsibilities:** the API layer converts transport errors into domain errors; hooks propagate `AppError` upward; an Error Boundary catches render-time errors and shows fallback UI.
|
|
45
|
+
- **Effect race/cleanup:** guard `useEffect` data fetches against out-of-order responses and post-unmount state updates — abort or ignore stale results (`AbortController` or a mounted flag), or use a server-state library (React Query/SWR) that cancels and dedupes. `try-catch` alone does not cover this.
|
|
44
46
|
- Never log secrets (password, token, apiKey, creditCard).
|
|
45
47
|
|
|
46
48
|
```typescript
|
|
@@ -63,8 +65,8 @@ class ErrorBoundary extends React.Component<{ children: React.ReactNode; fallbac
|
|
|
63
65
|
```
|
|
64
66
|
|
|
65
67
|
## Project Conventions
|
|
66
|
-
- **Environment variables:** read through the
|
|
67
|
-
- **Bundle & performance:** monitor with the `build` script
|
|
68
|
+
- **Environment variables:** read client-side env through the bundler's exposed accessor — only vars carrying its public prefix reach the browser; an unprefixed var is `undefined` there. Match the project's bundler: Vite `import.meta.env.VITE_*`, Next.js public `process.env.NEXT_PUBLIC_*`, CRA `process.env.REACT_APP_*`. Keep all secrets server-side — frontend code ships to the client.
|
|
69
|
+
- **Bundle & performance:** monitor bundle size with the `build` script against the project's budget; code-split with `React.lazy` + `Suspense`; structure state to minimize re-renders. Memoization: when React Compiler is enabled, rely on it; reach for manual `React.memo`/`useMemo`/`useCallback` only as a profiler- or identity-justified escape hatch (a measured bottleneck, or stable reference identity for third-party APIs / effect dependencies).
|
|
68
70
|
- **Naming:** components/types `PascalCase`; variables/functions `camelCase`; hooks `use`-prefixed; constants `SCREAMING_SNAKE_CASE`.
|
|
69
71
|
- **Imports:** absolute paths from `src/`; order: React → external libs → internal (absolute) → internal (relative) → type-only → styles/assets.
|
|
70
72
|
- **Formatting:** follow Biome (semicolons and style come from project config).
|
|
@@ -24,21 +24,15 @@ description: Designs tests with React Testing Library, MSW, and Playwright E2E.
|
|
|
24
24
|
## Basic Testing Policy
|
|
25
25
|
|
|
26
26
|
### Quality Requirements
|
|
27
|
-
- **Coverage**:
|
|
27
|
+
- **Coverage**: prioritize meaningful assertions on critical paths and high-reuse components; treat coverage as a signal for gaps, not a target (a target gets gamed into trivial tests — Goodhart's Law). Any numeric threshold is the project's CI config
|
|
28
28
|
- **Independence**: Each test can run independently without depending on other tests
|
|
29
29
|
- **Reproducibility**: Tests are environment-independent and always return the same results
|
|
30
30
|
- **Readability**: Test code maintains the same quality as production code
|
|
31
31
|
|
|
32
|
-
###
|
|
33
|
-
|
|
34
|
-
**Component-specific targets**:
|
|
35
|
-
- Atoms (Button, Text, etc.): 70% or higher
|
|
36
|
-
- Molecules (FormField, etc.): 65% or higher
|
|
37
|
-
- Organisms (Header, Footer, etc.): 60% or higher
|
|
38
|
-
- Custom Hooks: 65% or higher
|
|
39
|
-
- Utils: 70% or higher
|
|
32
|
+
### Where to concentrate test rigor
|
|
33
|
+
Test foundational, high-reuse units the hardest — shared components, custom hooks, and utils reused across many features carry the widest blast radius. Higher-composition surfaces (organisms, pages) lean on integration/E2E coverage instead. Any numeric threshold is the project's CI config.
|
|
40
34
|
|
|
41
|
-
**Metrics
|
|
35
|
+
**Metrics** (what coverage reports break down): Statements, Branches, Functions, Lines
|
|
42
36
|
|
|
43
37
|
### Test Types and Scope
|
|
44
38
|
1. **Unit Tests (React Testing Library)**
|
|
@@ -74,7 +68,7 @@ src/
|
|
|
74
68
|
|
|
75
69
|
**Rationale**:
|
|
76
70
|
- React Testing Library best practice
|
|
77
|
-
-
|
|
71
|
+
- Co-location principle: tests live alongside the implementation they cover
|
|
78
72
|
- Easy to find and maintain tests alongside implementation
|
|
79
73
|
|
|
80
74
|
### Naming Conventions
|
|
@@ -92,6 +92,7 @@ Quality checks are mandatory upon implementation completion:
|
|
|
92
92
|
- **Cache issues**: Run the `test:coverage:fresh` script
|
|
93
93
|
- **Dependency errors**: Clean reinstall dependencies
|
|
94
94
|
|
|
95
|
-
### Coverage
|
|
96
|
-
-
|
|
97
|
-
-
|
|
95
|
+
### Coverage
|
|
96
|
+
- Treat coverage as a diagnostic signal for finding untested areas, not a target (a target gets gamed into trivial tests — Goodhart's Law). Concentrate tests on critical paths and business logic whose regression would matter
|
|
97
|
+
- Any enforced numeric threshold is the project's CI/coverage config, not a goal in itself
|
|
98
|
+
- **Metrics** (what coverage reports break down): Statements, Branches, Functions, Lines
|
|
@@ -14,14 +14,14 @@ description: Applies Vitest test design and quality standards. Provides coverage
|
|
|
14
14
|
## Basic Testing Policy
|
|
15
15
|
|
|
16
16
|
### Quality Requirements
|
|
17
|
-
- **Coverage**:
|
|
17
|
+
- **Coverage**: treat coverage as a diagnostic signal for finding untested areas, not a target (a target gets gamed into trivial tests — Goodhart's Law). Concentrate tests on critical paths, business logic, and behavior whose regression would matter. Any numeric threshold is the project's CI config
|
|
18
18
|
- **Independence**: Each test can run independently without depending on other tests
|
|
19
19
|
- **Reproducibility**: Tests are environment-independent and always return the same results
|
|
20
20
|
- **Readability**: Test code maintains the same quality as production code
|
|
21
21
|
|
|
22
|
-
### Coverage
|
|
23
|
-
|
|
24
|
-
**Metrics
|
|
22
|
+
### Coverage
|
|
23
|
+
- Prioritize meaningful assertions over the coverage number; raise coverage where a gap leaves a real regression unguarded, not to hit a percentage
|
|
24
|
+
- **Metrics** (what coverage reports break down): Statements, Branches, Functions, Lines
|
|
25
25
|
|
|
26
26
|
### Test Types and Scope
|
|
27
27
|
1. **Unit Tests**
|
|
@@ -212,7 +212,7 @@ Design Docの実装アプローチに基づいてフェーズ構成をひとつ
|
|
|
212
212
|
- [ ] セキュリティレビュー: Design Docのセキュリティ考慮事項が実装されていることを確認
|
|
213
213
|
- [ ] 品質チェック(型、lint、format)
|
|
214
214
|
- [ ] 全テスト実行(テストスケルトン提供時は統合/E2Eテスト含む)
|
|
215
|
-
- [ ]
|
|
215
|
+
- [ ] クリティカルパスのギャップシグナルとしてカバレッジを確認(強制しきい値はプロジェクトの CI 設定に従う)
|
|
216
216
|
- [ ] ドキュメント更新
|
|
217
217
|
|
|
218
218
|
### 品質保証
|
|
@@ -17,6 +17,13 @@ Metadata:
|
|
|
17
17
|
実装開始前に読むべきファイル(ファイルパス、任意でサーチヒント付き):
|
|
18
18
|
- [例: src/orders/checkout (processOrder関数) — タスクの性質に基づきタスク分解時に決定]
|
|
19
19
|
|
|
20
|
+
## Change Category
|
|
21
|
+
(タスクがバグ修正・リグレッション・状態変更・境界変更の場合のみ本フィールドを記載する — タスク分解時に設定。それ以外は省略する。)
|
|
22
|
+
|
|
23
|
+
`Change Category: <bug-fix, regression, state-change, boundary-change のうち該当するものをカンマ区切りで>`
|
|
24
|
+
|
|
25
|
+
記載がある場合、実装は同一の経路・契約・永続状態・外部境界を共有するケースを、同一クラスの欠陥について走査する(Implementation Steps の Red Phase 参照)。
|
|
26
|
+
|
|
20
27
|
## Binding Decisions
|
|
21
28
|
(作業計画書のADR Bindings表がこのタスクをカバーする場合に本セクションを記載する。それ以外は省略する。)
|
|
22
29
|
|
|
@@ -32,6 +39,7 @@ Metadata:
|
|
|
32
39
|
## Implementation Steps (TDD: Red-Green-Refactor)
|
|
33
40
|
### 1. Red Phase
|
|
34
41
|
- [ ] 全ての Investigation Targets を読み、主要な所見を記録
|
|
42
|
+
- [ ] (Change Category が設定されている場合)同一の経路/契約/状態/境界を共有する隣接ケースを同一クラスの欠陥について走査し、スコープ内で見つかったものを失敗するテストに取り込む
|
|
35
43
|
- [ ] Dependencies の成果物を確認(ある場合)
|
|
36
44
|
- [ ] 契約定義を確認・作成
|
|
37
45
|
- [ ] 失敗するテストを書く
|
|
@@ -133,14 +133,10 @@ package.jsonの`packageManager`フィールドに応じた実行コマンドを
|
|
|
133
133
|
- `test:coverage:fresh` - カバレッジ測定
|
|
134
134
|
- `check:all` - 全体統合チェック
|
|
135
135
|
|
|
136
|
-
###
|
|
137
|
-
-
|
|
138
|
-
-
|
|
139
|
-
|
|
140
|
-
- Molecules: 65%以上
|
|
141
|
-
- Organisms: 60%以上
|
|
142
|
-
- Custom Hooks: 65%以上
|
|
143
|
-
- Utils: 70%以上
|
|
136
|
+
### カバレッジ
|
|
137
|
+
- カバレッジは目標ではなく未テスト領域を見つける診断シグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)
|
|
138
|
+
- 基盤的で再利用度の高いユニット(共有コンポーネント、カスタムフック、utils)にテストの重点を置く — リグレッション時の影響範囲が最も広い。合成度の高い面(organisms、ページ)は統合/E2Eのカバレッジに委ねる
|
|
139
|
+
- 強制する数値しきい値はプロジェクトの CI / カバレッジ設定であり、それ自体が目的ではない
|
|
144
140
|
|
|
145
141
|
### 非機能要件
|
|
146
142
|
- **ブラウザ互換性**: Chrome/Firefox/Safari/Edge(最新2バージョン)
|
|
@@ -34,6 +34,7 @@ const user = raw // User に絞り込み済み
|
|
|
34
34
|
- **Custom hook** をロジック再利用と依存注入の単位とする(テスト容易性のため、協調オブジェクトは hook 経由で注入する)。
|
|
35
35
|
- **関数引数:** 位置引数は 0〜2 個。3 個以上は単一の options オブジェクトで受ける。
|
|
36
36
|
- **状態の形:** 状態は明示的に型付けする。複数フィールドかつ離散的な遷移を持つ状態は、複数の `useState` ではなく discriminated union の action 型を用いた `useReducer` にする。
|
|
37
|
+
- **Server/Client 境界**(RSC フレームワークのみ — 例: Next.js App Router): データ取得とレンダリングは既定でサーバーコンポーネントに置き、インタラクティブ性は必要最小のスコープで `"use client"` 境界の内側に隔離する。ブラウザ専用 API(`window`、`localStorage`、イベントハンドラ)はクライアントコンポーネント内に留める — サーバーコンポーネントで呼ぶとレンダリングが壊れる。クライアントのみの SPA(例: Vite)では N/A — サーバーコンポーネントランタイムが無いプロジェクトではスキップする。
|
|
37
38
|
|
|
38
39
|
## エラーハンドリング
|
|
39
40
|
- すべてのエラーを表に出す: ログして処理するか伝播する — 握り潰さない。
|
|
@@ -41,6 +42,7 @@ const user = raw // User に絞り込み済み
|
|
|
41
42
|
- 想定内の失敗は `Result` 型で値として表現する。`throw` は想定外/回復不能なケースに限る。
|
|
42
43
|
- 目的別のエラークラスは `code` を持つ基底 `AppError` を継承する(例: ValidationError, ApiError, NotFoundError)。
|
|
43
44
|
- **層の責務:** API 層は transport エラーをドメインエラーへ変換する。hook は `AppError` を上位へ伝播する。Error Boundary はレンダリング時のエラーを捕捉しフォールバック UI を表示する。
|
|
45
|
+
- **Effect の競合/クリーンアップ:** `useEffect` 内のデータ取得は、順序が入れ替わった応答とアンマウント後の状態更新に対してガードする — `AbortController` か mounted フラグで stale な結果を中断・無視するか、キャンセルと重複排除を行うサーバー状態ライブラリ(React Query/SWR)を使う。`try-catch` だけではこれをカバーできない。
|
|
44
46
|
- 機微情報(password, token, apiKey, creditCard)をログに出さない。
|
|
45
47
|
|
|
46
48
|
```typescript
|
|
@@ -63,8 +65,8 @@ class ErrorBoundary extends React.Component<{ children: React.ReactNode; fallbac
|
|
|
63
65
|
```
|
|
64
66
|
|
|
65
67
|
## プロジェクト規約
|
|
66
|
-
- **環境変数:**
|
|
67
|
-
- **バンドルとパフォーマンス:** `build`
|
|
68
|
+
- **環境変数:** クライアント側の環境変数はバンドラが公開するアクセサ経由で読む — 公開プレフィックスを持つ変数だけがブラウザに届き、プレフィックスの無い変数はブラウザでは `undefined` になる。プロジェクトのバンドラに合わせる: Vite は `import.meta.env.VITE_*`、Next.js の公開変数は `process.env.NEXT_PUBLIC_*`、CRA は `process.env.REACT_APP_*`。秘密情報はすべてサーバーサイドに置く — フロントエンドのコードはクライアントに配信される。
|
|
69
|
+
- **バンドルとパフォーマンス:** バンドルサイズは `build` スクリプトでプロジェクトの予算に対して監視する。`React.lazy` + `Suspense` でコード分割する。再レンダリングを最小化する状態構造にする。メモ化: React Compiler が有効なときはそれに任せる。手動の `React.memo`/`useMemo`/`useCallback` は、プロファイラまたは参照同一性で正当化される逃げ道としてのみ用いる(実測されたボトルネック、またはサードパーティ API や effect 依存に対する安定した参照同一性)。
|
|
68
70
|
- **命名:** コンポーネント/型は `PascalCase`、変数/関数は `camelCase`、hook は `use` 接頭辞、定数は `SCREAMING_SNAKE_CASE`。
|
|
69
71
|
- **インポート:** `src/` からの絶対パス。順序: React → 外部ライブラリ → 内部(絶対)→ 内部(相対)→ 型のみ → スタイル/アセット。
|
|
70
72
|
- **フォーマット:** Biome に従う(セミコロンやスタイルはプロジェクト設定に従う)。
|
|
@@ -24,21 +24,15 @@ description: React Testing Library、MSW、Playwright E2Eでテストを設計
|
|
|
24
24
|
## テストの基本方針
|
|
25
25
|
|
|
26
26
|
### 品質要件
|
|
27
|
-
- **カバレッジ**:
|
|
27
|
+
- **カバレッジ**: クリティカルパスと高再利用コンポーネントに対する意味のあるアサーションを優先する。カバレッジは目標ではなくギャップ検出のシグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)。数値しきい値はプロジェクトの CI 設定に委ねる
|
|
28
28
|
- **独立性**: 各テストは他のテストに依存せず実行可能
|
|
29
29
|
- **再現性**: テストは環境に依存せず、常に同じ結果を返す
|
|
30
30
|
- **可読性**: テストコードも製品コードと同様の品質を維持
|
|
31
31
|
|
|
32
|
-
###
|
|
33
|
-
|
|
34
|
-
**コンポーネント別目標**:
|
|
35
|
-
- Atoms(Button、Text等): 70%以上
|
|
36
|
-
- Molecules(FormField等): 65%以上
|
|
37
|
-
- Organisms(Header、Footer等): 60%以上
|
|
38
|
-
- Custom Hooks: 65%以上
|
|
39
|
-
- Utils: 70%以上
|
|
32
|
+
### テストの重点配分
|
|
33
|
+
基盤的で再利用度の高いユニット(共有コンポーネント、カスタムフック、utils)を最も厚くテストする — 多くの機能から再利用されるものほど、リグレッション時の影響範囲が広い。合成度の高い面(organisms、ページ)は統合/E2Eのカバレッジに委ねる。数値しきい値はプロジェクトの CI 設定に委ねる。
|
|
40
34
|
|
|
41
|
-
|
|
35
|
+
**指標**(カバレッジレポートの内訳): Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
|
|
42
36
|
|
|
43
37
|
### テストの種類と範囲
|
|
44
38
|
1. **単体テスト(React Testing Library)**
|
|
@@ -74,7 +68,7 @@ src/
|
|
|
74
68
|
|
|
75
69
|
**理由**:
|
|
76
70
|
- React Testing Libraryのベストプラクティス
|
|
77
|
-
-
|
|
71
|
+
- Co-location原則: テストはそれがカバーする実装と同じ場所に置く
|
|
78
72
|
- 実装と一緒にテストを見つけやすく、保守しやすい
|
|
79
73
|
|
|
80
74
|
### 命名規則
|
|
@@ -51,7 +51,7 @@ skills:
|
|
|
51
51
|
typescript-testing:
|
|
52
52
|
skill: "typescript-testing"
|
|
53
53
|
tags: [quality, testing, coverage, vitest, backend, implementation]
|
|
54
|
-
typical-use: "バックエンドテスト作成、Vitest
|
|
54
|
+
typical-use: "バックエンドテスト作成、Vitest設定、カバレッジ方針、テスト品質基準"
|
|
55
55
|
size: small
|
|
56
56
|
key-references:
|
|
57
57
|
- "Vitest公式ドキュメント"
|
|
@@ -200,12 +200,12 @@ skills:
|
|
|
200
200
|
frontend-typescript-testing:
|
|
201
201
|
skill: "frontend-typescript-testing"
|
|
202
202
|
tags: [frontend, react, quality, testing, coverage, vitest, react-testing-library, msw, component-testing, implementation, playwright, e2e]
|
|
203
|
-
typical-use: "Reactコンポーネントのテスト作成、React Testing Library、MSW
|
|
203
|
+
typical-use: "Reactコンポーネントのテスト作成、React Testing Library、MSW、カバレッジ方針、Co-location、Playwright E2Eテスト"
|
|
204
204
|
size: small
|
|
205
205
|
key-references:
|
|
206
206
|
- "React Testing Library - Kent C. Dodds"
|
|
207
207
|
- "MSW (Mock Service Worker) - API Mocking"
|
|
208
|
-
- "
|
|
208
|
+
- "Co-location原則"
|
|
209
209
|
- "references/e2e.md - Playwright E2Eパターン"
|
|
210
210
|
sections:
|
|
211
211
|
- "参照"
|
|
@@ -92,6 +92,7 @@ package.jsonの`packageManager`フィールドに応じた実行コマンドを
|
|
|
92
92
|
- **キャッシュ問題**: `test:coverage:fresh` スクリプトを実行
|
|
93
93
|
- **依存関係エラー**: 依存関係のクリーンインストールを実行
|
|
94
94
|
|
|
95
|
-
###
|
|
96
|
-
-
|
|
97
|
-
-
|
|
95
|
+
### カバレッジ
|
|
96
|
+
- カバレッジは目標ではなく未テスト領域を見つける診断シグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)。クリティカルパスとビジネスロジックなど、リグレッションが問題になる箇所にテストを集中させる
|
|
97
|
+
- 強制する数値しきい値はプロジェクトの CI / カバレッジ設定であり、それ自体が目的ではない
|
|
98
|
+
- **メトリクス**(カバレッジレポートの内訳): Statements、Branches、Functions、Lines
|
|
@@ -14,14 +14,14 @@ description: Vitestテスト設計と品質基準を適用。カバレッジ要
|
|
|
14
14
|
## テストの基本方針
|
|
15
15
|
|
|
16
16
|
### 品質要件
|
|
17
|
-
- **カバレッジ**:
|
|
17
|
+
- **カバレッジ**: カバレッジは目標ではなく未テスト領域を見つける診断シグナルとして扱う(目標化すると自明なテストに歪む — グッドハートの法則)。クリティカルパス・ビジネスロジック・リグレッションが問題になる振る舞いにテストを集中させる。数値しきい値はプロジェクトの CI 設定に委ねる
|
|
18
18
|
- **独立性**: 各テストは他のテストに依存せず実行可能
|
|
19
19
|
- **再現性**: テストは環境に依存せず、常に同じ結果を返す
|
|
20
20
|
- **可読性**: テストコードも製品コードと同様の品質を維持
|
|
21
21
|
|
|
22
|
-
###
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
### カバレッジ
|
|
23
|
+
- カバレッジ数値よりも意味のあるアサーションを優先する。パーセンテージ達成のためではなく、ギャップが実際のリグレッションを無防備にしている箇所でカバレッジを上げる
|
|
24
|
+
- **指標**(カバレッジレポートの内訳): Statements(文)、Branches(分岐)、Functions(関数)、Lines(行)
|
|
25
25
|
|
|
26
26
|
### テストの種類と範囲
|
|
27
27
|
1. **単体テスト(Unit Tests)**
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.23.5] - 2026-06-14
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **Adjacent-case sweep** (agents, skills) — bug-fix / regression / state-change / boundary-change tasks carry a `Change Category` that drives a scoped sweep of sibling cases sharing the change's path, contract, state, or boundary: `task-decomposer` extends Investigation Targets, `task-executor` / `-frontend` fold in-scope residuals into tests and escalate confirmed out-of-scope siblings, `code-reviewer` adds an `adjacent_residual` finding (with optional `taskFiles` input and a self-classification fallback), and `verifier` / `solver` trace adjacent cases. Applied across en/ja.
|
|
13
|
+
- **Frontend rules modernization** (skills) — `frontend-typescript-rules` adopts bundler-agnostic env access (Vite / Next.js / CRA prefixes), React Compiler-aware memoization, a `useEffect` race/cleanup guard, RSC Server/Client boundary guidance, and a project-defined bundle budget in place of a fixed size.
|
|
14
|
+
- **Coverage reframed as a signal** (agents, skills) — coverage is a diagnostic signal rather than a target (Goodhart's Law), with any threshold deferred to the project's CI config; removed an invented standard label and a dangling ADR reference across the testing/spec skills.
|
|
15
|
+
|
|
8
16
|
## [1.23.4] - 2026-06-09
|
|
9
17
|
|
|
10
18
|
### Changed
|