sdd-tool 1.2.0 → 1.2.3

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/dist/cli/index.js CHANGED
@@ -1856,8 +1856,8 @@ sdd start --workflow validate
1856
1856
 
1857
1857
  \uBAA8\uB4E0 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uBA74:
1858
1858
  1. \`sdd validate\`\uB85C \uCD5C\uC885 \uAC80\uC99D
1859
- 2. PR \uC0DD\uC131 \uB610\uB294 \uBA38\uC9C0
1860
- 3. \uD544\uC694\uC2DC \`/sdd.archive\`\uB85C \uC544\uCE74\uC774\uBE0C
1859
+ 2. \uCEE4\uBC0B \uD6C4 PR \uC0DD\uC131 \uB610\uB294 \uBA38\uC9C0
1860
+ 3. \`/sdd.status\`\uB85C \uC804\uCCB4 \uC9C4\uD589 \uC0C1\uD669 \uD655\uC778
1861
1861
  `
1862
1862
  },
1863
1863
  {
@@ -1892,6 +1892,19 @@ sdd validate --strict
1892
1892
 
1893
1893
  \uAC80\uC99D \uC2E4\uD328 \uC2DC \uD574\uB2F9 \uD30C\uC77C\uC744 \uC5F4\uC5B4 \uC624\uB958\uB97C \uC218\uC815\uD558\uC138\uC694.
1894
1894
  \uAC01 \uC624\uB958 \uBA54\uC2DC\uC9C0\uC5D0\uB294 \uD574\uACB0 \uBC29\uBC95\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.
1895
+
1896
+ ## \uB2E4\uC74C \uB2E8\uACC4
1897
+
1898
+ \uAC80\uC99D \uACB0\uACFC\uC5D0 \uB530\uB77C:
1899
+
1900
+ - **\uBAA8\uB450 \uD1B5\uACFC**: \uCEE4\uBC0B \uD6C4 PR \uC0DD\uC131 \uB610\uB294 \uBA38\uC9C0
1901
+ - **\uC624\uB958 \uBC1C\uC0DD**: \uC624\uB958 \uC218\uC815 \uD6C4 \`sdd validate\` \uC7AC\uC2E4\uD589
1902
+ - **\uACBD\uACE0\uB9CC \uBC1C\uC0DD**: \uACBD\uACE0 \uAC80\uD1A0 \uD6C4 \uC9C4\uD589 \uC5EC\uBD80 \uACB0\uC815
1903
+
1904
+ \uAC80\uC99D \uD1B5\uACFC \uD6C4 \uAD8C\uC7A5 \uC6CC\uD06C\uD50C\uB85C\uC6B0:
1905
+ 1. \`git add .sdd/\` - \uC2A4\uD399 \uBCC0\uACBD \uC2A4\uD14C\uC774\uC9D5
1906
+ 2. \`git commit -m "spec: <\uC124\uBA85>"\` - \uCEE4\uBC0B
1907
+ 3. PR \uC0DD\uC131 \uBC0F \uB9AC\uBDF0 \uC694\uCCAD
1895
1908
  `
1896
1909
  },
1897
1910
  {
@@ -3080,6 +3093,263 @@ sdd export user-auth --no-toc
3080
3093
  \`\`\`
3081
3094
 
3082
3095
  \uB0B4\uBCF4\uB0B8 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC744 \uD655\uC778\uD558\uACE0 \uD544\uC694\uC2DC \uCD94\uAC00 \uD615\uC2DD\uC73C\uB85C \uB0B4\uBCF4\uB0B4\uC138\uC694.
3096
+ `
3097
+ },
3098
+ // 도메인 & 역추출 커맨드들
3099
+ {
3100
+ name: "sdd.reverse",
3101
+ content: `\uB808\uAC70\uC2DC \uCF54\uB4DC\uBCA0\uC774\uC2A4\uC5D0\uC11C SDD \uC2A4\uD399\uC744 \uC5ED\uCD94\uCD9C\uD569\uB2C8\uB2E4.
3102
+
3103
+ ## \uAC1C\uC694
3104
+
3105
+ \uAE30\uC874 \uCF54\uB4DC\uB97C \uBD84\uC11D\uD558\uC5EC SDD \uC2A4\uD399 \uCD08\uC548\uC744 \uC790\uB3D9 \uC0DD\uC131\uD569\uB2C8\uB2E4.
3106
+ \uB9AC\uBDF0\uC640 \uC2B9\uC778 \uACFC\uC815\uC744 \uD1B5\uD574 \uC815\uC2DD \uC2A4\uD399\uC73C\uB85C \uD655\uC815\uD569\uB2C8\uB2E4.
3107
+
3108
+ ## \uD558\uC704 \uBA85\uB839\uC5B4
3109
+
3110
+ \`\`\`
3111
+ /sdd.reverse scan [path] # \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870 \uC2A4\uCE94
3112
+ /sdd.reverse extract [path] # \uCF54\uB4DC\uC5D0\uC11C \uC2A4\uD399 \uCD94\uCD9C
3113
+ /sdd.reverse review [spec-id] # \uCD94\uCD9C\uB41C \uC2A4\uD399 \uB9AC\uBDF0
3114
+ /sdd.reverse finalize [spec-id] # \uC2B9\uC778\uB41C \uC2A4\uD399 \uD655\uC815
3115
+ \`\`\`
3116
+
3117
+ ## \uC6CC\uD06C\uD50C\uB85C\uC6B0
3118
+
3119
+ \`\`\`
3120
+ scan \u2192 extract \u2192 review \u2192 finalize
3121
+ \`\`\`
3122
+
3123
+ ### 1. Scan (\uC2A4\uCE94)
3124
+
3125
+ \uD504\uB85C\uC81D\uD2B8\uB97C \uBD84\uC11D\uD558\uC5EC \uB514\uB809\uD1A0\uB9AC \uAD6C\uC870, \uC5B8\uC5B4 \uBD84\uD3EC, \uB3C4\uBA54\uC778\uC744 \uCD94\uC815\uD569\uB2C8\uB2E4.
3126
+
3127
+ \`\`\`bash
3128
+ sdd reverse scan
3129
+ sdd reverse scan src/
3130
+ \`\`\`
3131
+
3132
+ ### 2. Extract (\uCD94\uCD9C)
3133
+
3134
+ \uC2A4\uCE94 \uACB0\uACFC\uB97C \uAE30\uBC18\uC73C\uB85C \uCF54\uB4DC\uC5D0\uC11C \uC2A4\uD399 \uCD08\uC548\uC744 \uCD94\uCD9C\uD569\uB2C8\uB2E4.
3135
+
3136
+ \`\`\`bash
3137
+ sdd reverse extract
3138
+ sdd reverse extract --domain auth
3139
+ sdd reverse extract --depth deep
3140
+ \`\`\`
3141
+
3142
+ **\uC635\uC158:**
3143
+ - \`--domain <name>\`: \uD2B9\uC815 \uB3C4\uBA54\uC778\uB9CC \uCD94\uCD9C
3144
+ - \`--depth <level>\`: \uBD84\uC11D \uAE4A\uC774 (shallow, medium, deep)
3145
+ - \`--min-confidence <n>\`: \uCD5C\uC18C \uC2E0\uB8B0\uB3C4 \uD544\uD130
3146
+
3147
+ ### 3. Review (\uB9AC\uBDF0)
3148
+
3149
+ \uCD94\uCD9C\uB41C \uC2A4\uD399 \uCD08\uC548\uC744 \uB9AC\uBDF0\uD558\uACE0 \uC2B9\uC778/\uAC70\uBD80\uD569\uB2C8\uB2E4.
3150
+
3151
+ \`\`\`bash
3152
+ sdd reverse review # \uB9AC\uBDF0 \uB300\uAE30 \uBAA9\uB85D
3153
+ sdd reverse review auth/login # \uD2B9\uC815 \uC2A4\uD399 \uC0C1\uC138
3154
+ \`\`\`
3155
+
3156
+ ### 4. Finalize (\uD655\uC815)
3157
+
3158
+ \uC2B9\uC778\uB41C \uC2A4\uD399\uC744 \uC815\uC2DD SDD \uC2A4\uD399\uC73C\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.
3159
+
3160
+ \`\`\`bash
3161
+ sdd reverse finalize --all # \uBAA8\uB4E0 \uC2B9\uC778 \uC2A4\uD399 \uD655\uC815
3162
+ sdd reverse finalize auth/login # \uD2B9\uC815 \uC2A4\uD399 \uD655\uC815
3163
+ \`\`\`
3164
+
3165
+ ## \uCD9C\uB825 \uD30C\uC77C
3166
+
3167
+ | \uD30C\uC77C | \uC124\uBA85 |
3168
+ |------|------|
3169
+ | \`.sdd/.reverse-meta.json\` | \uC2A4\uCE94 \uACB0\uACFC \uBA54\uD0C0\uB370\uC774\uD130 |
3170
+ | \`.sdd/.reverse-drafts/\` | \uC2A4\uD399 \uCD08\uC548 \uB514\uB809\uD1A0\uB9AC |
3171
+ | \`.sdd/specs/\` | \uD655\uC815\uB41C \uC2A4\uD399 \uB514\uB809\uD1A0\uB9AC |
3172
+
3173
+ ## \uB2E4\uC74C \uB2E8\uACC4
3174
+
3175
+ - \uD655\uC815 \uD6C4: \`/sdd.validate\`\uB85C \uC2A4\uD399 \uAC80\uC99D
3176
+ - \uB3C4\uBA54\uC778 \uC815\uB9AC: \`/sdd.domain\`\uC73C\uB85C \uB3C4\uBA54\uC778 \uAD6C\uC870\uD654
3177
+ `
3178
+ },
3179
+ {
3180
+ name: "sdd.domain",
3181
+ content: `\uB3C4\uBA54\uC778\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.
3182
+
3183
+ ## \uAC1C\uC694
3184
+
3185
+ SDD \uD504\uB85C\uC81D\uD2B8\uC758 \uB3C4\uBA54\uC778\uC744 \uC0DD\uC131, \uC870\uD68C, \uC218\uC815, \uC0AD\uC81C\uD569\uB2C8\uB2E4.
3186
+ \uB300\uADDC\uBAA8 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC2A4\uD399\uC744 \uB17C\uB9AC\uC801\uC73C\uB85C \uADF8\uB8F9\uD654\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
3187
+
3188
+ ## \uD558\uC704 \uBA85\uB839\uC5B4
3189
+
3190
+ \`\`\`
3191
+ /sdd.domain create <name> # \uB3C4\uBA54\uC778 \uC0DD\uC131
3192
+ /sdd.domain list # \uB3C4\uBA54\uC778 \uBAA9\uB85D
3193
+ /sdd.domain show <name> # \uC0C1\uC138 \uC815\uBCF4
3194
+ /sdd.domain link <domain> <spec> # \uC2A4\uD399 \uC5F0\uACB0
3195
+ /sdd.domain graph # \uC758\uC874\uC131 \uADF8\uB798\uD504
3196
+ \`\`\`
3197
+
3198
+ ### create
3199
+
3200
+ \uC0C8 \uB3C4\uBA54\uC778\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4.
3201
+
3202
+ \`\`\`bash
3203
+ sdd domain create auth
3204
+ sdd domain create payment --description "\uACB0\uC81C \uCC98\uB9AC"
3205
+ \`\`\`
3206
+
3207
+ ### list
3208
+
3209
+ \uBAA8\uB4E0 \uB3C4\uBA54\uC778\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4.
3210
+
3211
+ \`\`\`bash
3212
+ sdd domain list
3213
+ sdd domain list --tree # \uD2B8\uB9AC \uD615\uD0DC
3214
+ \`\`\`
3215
+
3216
+ ### show
3217
+
3218
+ \uD2B9\uC815 \uB3C4\uBA54\uC778\uC758 \uC0C1\uC138 \uC815\uBCF4\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.
3219
+
3220
+ \`\`\`bash
3221
+ sdd domain show auth
3222
+ \`\`\`
3223
+
3224
+ ### link / unlink
3225
+
3226
+ \uC2A4\uD399\uC744 \uB3C4\uBA54\uC778\uC5D0 \uC5F0\uACB0\uD558\uAC70\uB098 \uD574\uC81C\uD569\uB2C8\uB2E4.
3227
+
3228
+ \`\`\`bash
3229
+ sdd domain link auth user-login
3230
+ sdd domain unlink auth user-login
3231
+ \`\`\`
3232
+
3233
+ ### depends
3234
+
3235
+ \uB3C4\uBA54\uC778 \uAC04 \uC758\uC874\uC131\uC744 \uC124\uC815\uD569\uB2C8\uB2E4.
3236
+
3237
+ \`\`\`bash
3238
+ sdd domain depends payment --on auth
3239
+ \`\`\`
3240
+
3241
+ ### graph
3242
+
3243
+ \uB3C4\uBA54\uC778 \uC758\uC874\uC131 \uADF8\uB798\uD504\uB97C \uC2DC\uAC01\uD654\uD569\uB2C8\uB2E4.
3244
+
3245
+ \`\`\`bash
3246
+ sdd domain graph # Mermaid \uD615\uC2DD
3247
+ sdd domain graph --format dot # DOT \uD615\uC2DD
3248
+ \`\`\`
3249
+
3250
+ ### validate
3251
+
3252
+ \uB3C4\uBA54\uC778 \uAD6C\uC870\uB97C \uAC80\uC99D\uD569\uB2C8\uB2E4.
3253
+
3254
+ \`\`\`bash
3255
+ sdd domain validate
3256
+ \`\`\`
3257
+
3258
+ \uAC80\uC99D \uD56D\uBAA9:
3259
+ - \uC21C\uD658 \uC758\uC874\uC131 \uAC10\uC9C0
3260
+ - \uACE0\uC544 \uC2A4\uD399 \uD655\uC778
3261
+ - \uC2A4\uD0A4\uB9C8 \uC720\uD6A8\uC131
3262
+
3263
+ ## \uB2E4\uC74C \uB2E8\uACC4
3264
+
3265
+ - \uB3C4\uBA54\uC778 \uC0DD\uC131 \uD6C4: \`/sdd.context set <domain>\`\uC73C\uB85C \uC791\uC5C5 \uCEE8\uD14D\uC2A4\uD2B8 \uC124\uC815
3266
+ - \uC2A4\uD399 \uC5F0\uACB0 \uD6C4: \`/sdd.domain graph\`\uB85C \uAD6C\uC870 \uD655\uC778
3267
+ `
3268
+ },
3269
+ {
3270
+ name: "sdd.context",
3271
+ content: `\uC791\uC5C5 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAD00\uB9AC\uD569\uB2C8\uB2E4.
3272
+
3273
+ ## \uAC1C\uC694
3274
+
3275
+ \uD604\uC7AC \uC791\uC5C5 \uC911\uC778 \uB3C4\uBA54\uC778 \uBC94\uC704\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.
3276
+ \uB300\uADDC\uBAA8 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uAD00\uB828 \uC2A4\uD399\uB9CC \uC9D1\uC911\uD558\uC5EC \uC791\uC5C5\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
3277
+
3278
+ ## \uD558\uC704 \uBA85\uB839\uC5B4
3279
+
3280
+ \`\`\`
3281
+ /sdd.context set <domain...> # \uCEE8\uD14D\uC2A4\uD2B8 \uC124\uC815
3282
+ /sdd.context show # \uD604\uC7AC \uCEE8\uD14D\uC2A4\uD2B8
3283
+ /sdd.context clear # \uCEE8\uD14D\uC2A4\uD2B8 \uD574\uC81C
3284
+ /sdd.context specs # \uCEE8\uD14D\uC2A4\uD2B8 \uB0B4 \uC2A4\uD399 \uBAA9\uB85D
3285
+ /sdd.context export # \uD504\uB86C\uD504\uD2B8 \uB0B4\uBCF4\uB0B4\uAE30
3286
+ \`\`\`
3287
+
3288
+ ### set
3289
+
3290
+ \uC791\uC5C5 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.
3291
+
3292
+ \`\`\`bash
3293
+ sdd context set auth
3294
+ sdd context set auth payment order
3295
+ sdd context set auth --include-deps # \uC758\uC874 \uB3C4\uBA54\uC778 \uD3EC\uD568
3296
+ \`\`\`
3297
+
3298
+ ### show
3299
+
3300
+ \uD604\uC7AC \uC124\uC815\uB41C \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.
3301
+
3302
+ \`\`\`bash
3303
+ sdd context show
3304
+ \`\`\`
3305
+
3306
+ ### add / remove
3307
+
3308
+ \uCEE8\uD14D\uC2A4\uD2B8\uC5D0 \uB3C4\uBA54\uC778\uC744 \uCD94\uAC00\uD558\uAC70\uB098 \uC81C\uAC70\uD569\uB2C8\uB2E4.
3309
+
3310
+ \`\`\`bash
3311
+ sdd context add order
3312
+ sdd context remove payment
3313
+ \`\`\`
3314
+
3315
+ ### clear
3316
+
3317
+ \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uD574\uC81C\uD569\uB2C8\uB2E4.
3318
+
3319
+ \`\`\`bash
3320
+ sdd context clear
3321
+ \`\`\`
3322
+
3323
+ ### specs
3324
+
3325
+ \uCEE8\uD14D\uC2A4\uD2B8 \uB0B4 \uC2A4\uD399 \uBAA9\uB85D\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.
3326
+
3327
+ \`\`\`bash
3328
+ sdd context specs
3329
+ \`\`\`
3330
+
3331
+ ### export
3332
+
3333
+ \uCEE8\uD14D\uC2A4\uD2B8 \uAE30\uBC18 \uD504\uB86C\uD504\uD2B8\uB97C \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4.
3334
+
3335
+ \`\`\`bash
3336
+ sdd context export
3337
+ sdd context export --format markdown
3338
+ \`\`\`
3339
+
3340
+ ## \uCEE8\uD14D\uC2A4\uD2B8 \uD6A8\uACFC
3341
+
3342
+ \uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uC124\uC815\uB418\uBA74:
3343
+
3344
+ 1. **\uC2A4\uD399 \uC0DD\uC131**: \`/sdd.new\`\uC5D0\uC11C \uB3C4\uBA54\uC778 \uC790\uB3D9 \uAC10\uC9C0
3345
+ 2. **\uAC80\uC99D**: \`/sdd.validate\`\uC5D0\uC11C \uD574\uB2F9 \uB3C4\uBA54\uC778\uB9CC \uAC80\uC99D
3346
+ 3. **\uBAA9\uB85D**: \`/sdd.list\`\uC5D0\uC11C \uCEE8\uD14D\uC2A4\uD2B8 \uC2A4\uD399\uB9CC \uD45C\uC2DC
3347
+ 4. **\uAD6C\uD604**: \uAD6C\uD604 \uC2DC \uAD00\uB828 \uC2A4\uD399 \uCC38\uC870
3348
+
3349
+ ## \uB2E4\uC74C \uB2E8\uACC4
3350
+
3351
+ - \uCEE8\uD14D\uC2A4\uD2B8 \uC124\uC815 \uD6C4: \`/sdd.new\`\uB85C \uC2A4\uD399 \uC791\uC131
3352
+ - \uC791\uC5C5 \uC644\uB8CC \uD6C4: \`/sdd.context clear\`\uB85C \uD574\uC81C
3083
3353
  `
3084
3354
  }
3085
3355
  ];
@@ -3557,7 +3827,8 @@ function getInitDirectories(withDomains = false) {
3557
3827
  ".sdd/archive",
3558
3828
  ".sdd/templates",
3559
3829
  ".claude",
3560
- ".claude/commands"
3830
+ ".claude/commands",
3831
+ ".claude/skills"
3561
3832
  ];
3562
3833
  if (withDomains) {
3563
3834
  dirs.push(".sdd/domains");
@@ -3700,6 +3971,8 @@ async function executeInit(projectPath, options) {
3700
3971
  createdFiles.push(...templateFiles);
3701
3972
  const commandFiles = await createCommandFiles(projectPath);
3702
3973
  createdFiles.push(...commandFiles);
3974
+ const skillFiles = await createSkillFiles(projectPath);
3975
+ createdFiles.push(...skillFiles);
3703
3976
  return success({
3704
3977
  sddPath,
3705
3978
  claudePath,
@@ -3730,6 +4003,405 @@ async function createCommandFiles(projectPath) {
3730
4003
  }
3731
4004
  return files;
3732
4005
  }
4006
+ async function createSkillFiles(projectPath) {
4007
+ const skillsPath = path4.join(projectPath, ".claude", "skills");
4008
+ const files = [];
4009
+ const skills = generateDevSkills();
4010
+ for (const skill of skills) {
4011
+ const skillDir = path4.join(skillsPath, skill.name);
4012
+ await ensureDir(skillDir);
4013
+ await writeFile(path4.join(skillDir, "SKILL.md"), skill.content);
4014
+ files.push(`.claude/skills/${skill.name}/SKILL.md`);
4015
+ }
4016
+ return files;
4017
+ }
4018
+ function generateDevSkills() {
4019
+ return [
4020
+ {
4021
+ name: "dev-implement",
4022
+ content: `---
4023
+ name: dev-implement
4024
+ description: .sdd/specs/\uC758 \uC2A4\uD399 \uBB38\uC11C\uB97C \uC77D\uACE0 TDD \uBC29\uC2DD\uC73C\uB85C TypeScript \uCF54\uB4DC\uB97C \uAD6C\uD604\uD569\uB2C8\uB2E4. GIVEN-WHEN-THEN \uC2DC\uB098\uB9AC\uC624\uB97C \uD14C\uC2A4\uD2B8\uB85C \uBCC0\uD658\uD558\uACE0 \uCF54\uB4DC\uB97C \uC791\uC131\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 "\uAD6C\uD604\uD574", "\uAC1C\uBC1C\uD574", "\uCF54\uB529\uD574", "implement" \uB4F1\uC744 \uC694\uCCAD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
4025
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash
4026
+ ---
4027
+
4028
+ # \uC2A4\uD399 \uAE30\uBC18 TDD \uAD6C\uD604
4029
+
4030
+ ## Instructions
4031
+
4032
+ ### 1. \uC2A4\uD399 \uD30C\uC77C \uBD84\uC11D
4033
+
4034
+ \`.sdd/specs/<spec-path>.md\` \uD30C\uC77C\uC5D0\uC11C \uCD94\uCD9C:
4035
+ - **Requirement**: \uAD6C\uD604\uD574\uC57C \uD560 \uAE30\uB2A5
4036
+ - **Scenario**: GIVEN-WHEN-THEN \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4
4037
+ - **RFC 2119 \uD0A4\uC6CC\uB4DC**: SHALL(\uD544\uC218), SHOULD(\uAD8C\uC7A5), MAY(\uC120\uD0DD)
4038
+
4039
+ ### 2. \uC758\uC874\uC131 \uD655\uC778
4040
+
4041
+ frontmatter\uC758 \`depends\` \uD544\uB4DC\uB97C \uD655\uC778\uD558\uACE0, \uC758\uC874 \uC2A4\uD399\uC774 \uBBF8\uAD6C\uD604\uC774\uBA74 \uACBD\uACE0\uD569\uB2C8\uB2E4.
4042
+
4043
+ ### 3. TDD: \uD14C\uC2A4\uD2B8 \uBA3C\uC800 \uC791\uC131
4044
+
4045
+ \uC2A4\uD399\uC758 Scenario\uB97C \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4\uB85C \uBCC0\uD658:
4046
+
4047
+ \`\`\`markdown
4048
+ ### Scenario: \uC720\uD6A8\uD55C \uC2A4\uD399 \uAC80\uC99D \uC131\uACF5
4049
+ - **GIVEN** \uC720\uD6A8\uD55C RFC 2119 \uD0A4\uC6CC\uB4DC\uAC00 \uD3EC\uD568\uB41C \uC2A4\uD399
4050
+ - **WHEN** validate \uBA85\uB839\uC744 \uC2E4\uD589\uD558\uBA74
4051
+ - **THEN** \uC131\uACF5 \uBA54\uC2DC\uC9C0\uAC00 \uCD9C\uB825\uB41C\uB2E4
4052
+ \`\`\`
4053
+
4054
+ \u2193 \uBCC0\uD658
4055
+
4056
+ \`\`\`typescript
4057
+ it('\uC720\uD6A8\uD55C \uC2A4\uD399\uC744 \uAC80\uC99D\uD558\uBA74 \uC131\uACF5\uD55C\uB2E4', () => {
4058
+ // GIVEN
4059
+ const spec = '\uC2DC\uC2A4\uD15C\uC740 X\uB97C \uD574\uC57C \uD55C\uB2E4(SHALL).';
4060
+ // WHEN
4061
+ const result = validateSpec(spec);
4062
+ // THEN
4063
+ expect(result.valid).toBe(true);
4064
+ });
4065
+ \`\`\`
4066
+
4067
+ ### 4. \uAD6C\uD604 \uBC0F \uD14C\uC2A4\uD2B8 \uC2E4\uD589
4068
+
4069
+ \uD14C\uC2A4\uD2B8\uB97C \uD1B5\uACFC\uD558\uB3C4\uB85D \uAD6C\uD604\uD558\uACE0 \uD655\uC778:
4070
+
4071
+ \`\`\`bash
4072
+ pnpm vitest run src/<path>.test.ts
4073
+ \`\`\`
4074
+
4075
+ ## Examples
4076
+
4077
+ **\uC0AC\uC6A9\uC790**: "user-auth \uC2A4\uD399 \uAD6C\uD604\uD574\uC918"
4078
+
4079
+ **\uC751\uB2F5**: \uC2A4\uD399\uC744 \uBD84\uC11D\uD558\uACE0 \uD14C\uC2A4\uD2B8\uBD80\uD130 \uC791\uC131\uD55C \uB4A4 \uAD6C\uD604\uC744 \uC9C4\uD589\uD569\uB2C8\uB2E4.
4080
+
4081
+ ## RFC 2119 \uD0A4\uC6CC\uB4DC \uD574\uC11D
4082
+
4083
+ | \uD0A4\uC6CC\uB4DC | \uC758\uBBF8 | \uAD6C\uD604 \uC218\uC900 |
4084
+ |--------|------|----------|
4085
+ | SHALL / MUST | \uD544\uC218 | \uBC18\uB4DC\uC2DC \uAD6C\uD604 |
4086
+ | SHOULD | \uAD8C\uC7A5 | \uAC00\uB2A5\uD558\uBA74 \uAD6C\uD604 |
4087
+ | MAY | \uC120\uD0DD | \uD544\uC694\uC2DC \uAD6C\uD604 |
4088
+ `
4089
+ },
4090
+ {
4091
+ name: "dev-next",
4092
+ content: `---
4093
+ name: dev-next
4094
+ description: \uC758\uC874\uC131 \uADF8\uB798\uD504\uB97C \uBD84\uC11D\uD558\uC5EC \uB2E4\uC74C \uAD6C\uD604\uD560 \uC2A4\uD399\uC744 \uCD94\uCC9C\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 "\uB2E4\uC74C \uBB50 \uD574", "\uB2E4\uC74C \uC791\uC5C5", "\uBB50 \uAD6C\uD604\uD560\uAE4C", "next" \uB4F1\uC744 \uC694\uCCAD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
4095
+ allowed-tools: Read, Glob, Grep, Bash
4096
+ ---
4097
+
4098
+ # \uB2E4\uC74C \uAD6C\uD604 \uC2A4\uD399 \uCD94\uCC9C
4099
+
4100
+ ## Instructions
4101
+
4102
+ ### 1. \uC2A4\uD399 \uBAA9\uB85D \uC2A4\uCE94
4103
+
4104
+ \`.sdd/specs/\` \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uBAA8\uB4E0 \uC2A4\uD399 \uD30C\uC77C\uC744 \uCC3E\uC2B5\uB2C8\uB2E4.
4105
+
4106
+ ### 2. \uC0C1\uD0DC \uBD84\uC11D
4107
+
4108
+ \uAC01 \uC2A4\uD399\uC758 frontmatter\uC5D0\uC11C \uC0C1\uD0DC \uD655\uC778:
4109
+ - \`status: draft\` - \uBBF8\uAD6C\uD604
4110
+ - \`status: implemented\` - \uAD6C\uD604 \uC644\uB8CC
4111
+ - \`status: review\` - \uB9AC\uBDF0 \uC911
4112
+
4113
+ ### 3. \uC758\uC874\uC131 \uADF8\uB798\uD504 \uBD84\uC11D
4114
+
4115
+ \`depends\` \uD544\uB4DC\uB97C \uD655\uC778\uD558\uC5EC:
4116
+ - \uC758\uC874\uC131\uC774 \uC5C6\uB294 \uC2A4\uD399 \uC6B0\uC120
4117
+ - \uC758\uC874\uD558\uB294 \uC2A4\uD399\uC774 \uBAA8\uB450 \uAD6C\uD604\uB41C \uC2A4\uD399 \uCD94\uCC9C
4118
+ - \uC21C\uD658 \uC758\uC874\uC131 \uAC10\uC9C0 \uBC0F \uACBD\uACE0
4119
+
4120
+ ### 4. \uCD94\uCC9C \uACB0\uACFC \uC81C\uC2DC
4121
+
4122
+ \uC6B0\uC120\uC21C\uC704\uC5D0 \uB530\uB77C \uC815\uB82C:
4123
+ 1. \uC758\uC874\uC131 \uC5C6\uC74C + draft \uC0C1\uD0DC
4124
+ 2. \uC758\uC874\uC131 \uD574\uACB0\uB428 + draft \uC0C1\uD0DC
4125
+ 3. \uC758\uC874\uC131 \uBBF8\uD574\uACB0 (\uBE14\uB85C\uD0B9 \uC0C1\uD0DC)
4126
+
4127
+ ## Examples
4128
+
4129
+ **\uC0AC\uC6A9\uC790**: "\uB2E4\uC74C \uBB50 \uAD6C\uD604\uD558\uBA74 \uB3FC?"
4130
+
4131
+ **\uC751\uB2F5**:
4132
+ \`\`\`
4133
+ ## \uB2E4\uC74C \uAD6C\uD604 \uCD94\uCC9C
4134
+
4135
+ ### 1\uC21C\uC704: core/validation (\uC758\uC874\uC131 \uC5C6\uC74C)
4136
+ - \uC0C1\uD0DC: draft
4137
+ - \uC124\uBA85: \uC785\uB825 \uAC80\uC99D \uC720\uD2F8\uB9AC\uD2F0
4138
+
4139
+ ### 2\uC21C\uC704: auth/login (\uC758\uC874: core/validation)
4140
+ - \uC0C1\uD0DC: draft
4141
+ - \uC124\uBA85: \uC0AC\uC6A9\uC790 \uB85C\uADF8\uC778
4142
+ - \uBE14\uB85C\uCEE4: core/validation \uAD6C\uD604 \uD544\uC694
4143
+
4144
+ "core/validation \uAD6C\uD604\uD574\uC918" \uB77C\uACE0 \uC694\uCCAD\uD558\uC138\uC694.
4145
+ \`\`\`
4146
+ `
4147
+ },
4148
+ {
4149
+ name: "dev-review",
4150
+ content: `---
4151
+ name: dev-review
4152
+ description: \uAD6C\uD604\uB41C \uCF54\uB4DC\uAC00 \uC2A4\uD399\uC744 \uCDA9\uC871\uD558\uB294\uC9C0 \uAC80\uC99D\uD558\uACE0 \uCF54\uB4DC \uD488\uC9C8, \uD0C0\uC785 \uC548\uC804\uC131, \uC5D0\uB7EC \uCC98\uB9AC\uB97C \uAC80\uD1A0\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 "\uB9AC\uBDF0\uD574\uC918", "\uCF54\uB4DC \uAC80\uD1A0", "\uD488\uC9C8 \uD655\uC778", "review" \uB4F1\uC744 \uC694\uCCAD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
4153
+ allowed-tools: Read, Glob, Grep, Bash
4154
+ ---
4155
+
4156
+ # \uCF54\uB4DC \uB9AC\uBDF0
4157
+
4158
+ ## Instructions
4159
+
4160
+ ### 1. \uC2A4\uD399 \uB300\uC870 \uAC80\uC99D
4161
+
4162
+ \uAD6C\uD604\uB41C \uCF54\uB4DC\uAC00 \uC2A4\uD399\uC758 \uC694\uAD6C\uC0AC\uD56D\uC744 \uCDA9\uC871\uD558\uB294\uC9C0 \uD655\uC778:
4163
+ - \uBAA8\uB4E0 Scenario\uAC00 \uD14C\uC2A4\uD2B8\uB85C \uCEE4\uBC84\uB418\uB294\uC9C0
4164
+ - RFC 2119 \uD0A4\uC6CC\uB4DC(SHALL/MUST)\uAC00 \uBAA8\uB450 \uAD6C\uD604\uB418\uC5C8\uB294\uC9C0
4165
+
4166
+ ### 2. \uCF54\uB4DC \uD488\uC9C8 \uAC80\uC0AC
4167
+
4168
+ - TypeScript \uD0C0\uC785 \uC548\uC804\uC131
4169
+ - \uC5D0\uB7EC \uCC98\uB9AC \uC644\uC804\uC131
4170
+ - \uCF54\uB4DC \uC911\uBCF5 \uC5EC\uBD80
4171
+ - \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158
4172
+
4173
+ ### 3. \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 \uD655\uC778
4174
+
4175
+ \`\`\`bash
4176
+ pnpm vitest run --coverage
4177
+ \`\`\`
4178
+
4179
+ ### 4. \uB9AC\uBDF0 \uACB0\uACFC \uC791\uC131
4180
+
4181
+ - \u2705 \uD1B5\uACFC \uD56D\uBAA9
4182
+ - \u26A0\uFE0F \uAC1C\uC120 \uAD8C\uC7A5 \uD56D\uBAA9
4183
+ - \u274C \uD544\uC218 \uC218\uC815 \uD56D\uBAA9
4184
+
4185
+ ## Examples
4186
+
4187
+ **\uC0AC\uC6A9\uC790**: "auth/login \uCF54\uB4DC \uB9AC\uBDF0\uD574\uC918"
4188
+
4189
+ **\uC751\uB2F5**:
4190
+ \`\`\`
4191
+ ## \uCF54\uB4DC \uB9AC\uBDF0: auth/login
4192
+
4193
+ ### \uC2A4\uD399 \uCDA9\uC871\uB3C4: 4/5 (80%)
4194
+ - \u2705 REQ-01: \uC774\uBA54\uC77C \uB85C\uADF8\uC778
4195
+ - \u2705 REQ-02: \uBE44\uBC00\uBC88\uD638 \uAC80\uC99D
4196
+ - \u26A0\uFE0F REQ-03: \uB85C\uADF8\uC778 \uC2E4\uD328 \uD69F\uC218 \uC81C\uD55C (\uBBF8\uAD6C\uD604)
4197
+
4198
+ ### \uCF54\uB4DC \uD488\uC9C8
4199
+ - \u2705 \uD0C0\uC785 \uC548\uC804\uC131
4200
+ - \u26A0\uFE0F \uC5D0\uB7EC \uBA54\uC2DC\uC9C0 i18n \uBBF8\uC801\uC6A9
4201
+ - \u2705 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 85%
4202
+
4203
+ ### \uAD8C\uC7A5 \uC0AC\uD56D
4204
+ 1. \uB85C\uADF8\uC778 \uC2E4\uD328 \uD69F\uC218 \uC81C\uD55C \uAE30\uB2A5 \uCD94\uAC00
4205
+ 2. \uC5D0\uB7EC \uBA54\uC2DC\uC9C0 \uAD6D\uC81C\uD654 \uC801\uC6A9
4206
+ \`\`\`
4207
+ `
4208
+ },
4209
+ {
4210
+ name: "dev-scaffold",
4211
+ content: `---
4212
+ name: dev-scaffold
4213
+ description: SDD CLI\uC758 \uC0C8 \uBA85\uB839\uC5B4, \uBAA8\uB4C8, \uD30C\uC11C, \uAC80\uC99D\uAE30\uC758 TypeScript \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uCF54\uB4DC\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 "\uC0C8 \uBA85\uB839\uC5B4 \uB9CC\uB4E4\uC5B4", "\uBAA8\uB4C8 \uCD94\uAC00", "scaffold", "\uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8" \uB4F1\uC744 \uC694\uCCAD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
4214
+ allowed-tools: Read, Write, Edit, Glob
4215
+ ---
4216
+
4217
+ # \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uC0DD\uC131
4218
+
4219
+ ## Instructions
4220
+
4221
+ ### 1. \uC0DD\uC131 \uB300\uC0C1 \uD655\uC778
4222
+
4223
+ \uC0AC\uC6A9\uC790 \uC694\uCCAD\uC5D0\uC11C \uC0DD\uC131\uD560 \uD0C0\uC785 \uD30C\uC545:
4224
+ - **command**: CLI \uBA85\uB839\uC5B4
4225
+ - **module**: \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1 \uBAA8\uB4C8
4226
+ - **parser**: \uD30C\uC11C/\uBCC0\uD658\uAE30
4227
+ - **validator**: \uAC80\uC99D\uAE30
4228
+
4229
+ ### 2. \uAE30\uC874 \uD328\uD134 \uBD84\uC11D
4230
+
4231
+ \uD504\uB85C\uC81D\uD2B8\uC758 \uAE30\uC874 \uCF54\uB4DC\uB97C \uBD84\uC11D\uD558\uC5EC \uD328\uD134 \uCD94\uCD9C:
4232
+ - \uB514\uB809\uD1A0\uB9AC \uAD6C\uC870
4233
+ - \uD30C\uC77C \uB124\uC774\uBC0D \uADDC\uCE59
4234
+ - \uC784\uD3EC\uD2B8 \uC2A4\uD0C0\uC77C
4235
+ - \uD0C0\uC785 \uC815\uC758 \uBC29\uC2DD
4236
+
4237
+ ### 3. \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uC0DD\uC131
4238
+
4239
+ \uCD94\uCD9C\uB41C \uD328\uD134\uC744 \uB530\uB77C \uD30C\uC77C \uC0DD\uC131:
4240
+ - \uBA54\uC778 \uAD6C\uD604 \uD30C\uC77C (.ts)
4241
+ - \uD14C\uC2A4\uD2B8 \uD30C\uC77C (.test.ts)
4242
+ - \uD0C0\uC785 \uC815\uC758 (\uD544\uC694\uC2DC)
4243
+ - \uC778\uB371\uC2A4 \uC775\uC2A4\uD3EC\uD2B8 \uC5C5\uB370\uC774\uD2B8
4244
+
4245
+ ## Examples
4246
+
4247
+ **\uC0AC\uC6A9\uC790**: "export \uBA85\uB839\uC5B4 scaffold \uC0DD\uC131\uD574\uC918"
4248
+
4249
+ **\uC751\uB2F5**:
4250
+ \`\`\`
4251
+ ## Scaffold: export \uBA85\uB839\uC5B4
4252
+
4253
+ \uC0DD\uC131 \uD30C\uC77C:
4254
+ - src/cli/commands/export.ts
4255
+ - src/cli/commands/export.test.ts
4256
+
4257
+ \uAE30\uC874 \uD328\uD134 \uCC38\uC870:
4258
+ - src/cli/commands/validate.ts
4259
+
4260
+ [\uD30C\uC77C \uC0DD\uC131 \uC9C4\uD589...]
4261
+ \`\`\`
4262
+ `
4263
+ },
4264
+ {
4265
+ name: "dev-status",
4266
+ content: `---
4267
+ name: dev-status
4268
+ description: SDD CLI \uAD6C\uD604 \uC9C4\uD589 \uC0C1\uD669\uC744 \uBD84\uC11D\uD558\uACE0 Phase\uBCC4 \uC2A4\uD399 \uD604\uD669, \uAD6C\uD604 \uC644\uB8CC\uC728, \uD14C\uC2A4\uD2B8 \uD1B5\uACFC\uC728\uC744 \uBCF4\uACE0\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 "\uD604\uD669", "\uC9C4\uD589 \uC0C1\uD669", "\uC5BC\uB9C8\uB098 \uB410\uC5B4", "status" \uB4F1\uC744 \uC694\uCCAD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
4269
+ allowed-tools: Read, Glob, Grep, Bash
4270
+ ---
4271
+
4272
+ # \uAD6C\uD604 \uC9C4\uD589 \uC0C1\uD669
4273
+
4274
+ ## Instructions
4275
+
4276
+ ### 1. \uC2A4\uD399 \uD604\uD669 \uC218\uC9D1
4277
+
4278
+ \`.sdd/specs/\` \uB514\uB809\uD1A0\uB9AC \uC2A4\uCE94:
4279
+ - \uC804\uCCB4 \uC2A4\uD399 \uC218
4280
+ - Phase\uBCC4 \uBD84\uB958
4281
+ - \uC0C1\uD0DC\uBCC4 \uBD84\uB958 (draft, implemented, review)
4282
+
4283
+ ### 2. \uAD6C\uD604 \uC644\uB8CC\uC728 \uACC4\uC0B0
4284
+
4285
+ \`\`\`
4286
+ \uC644\uB8CC\uC728 = (implemented \uC2A4\uD399 \uC218) / (\uC804\uCCB4 \uC2A4\uD399 \uC218) \xD7 100
4287
+ \`\`\`
4288
+
4289
+ ### 3. \uD14C\uC2A4\uD2B8 \uC0C1\uD0DC \uD655\uC778
4290
+
4291
+ \`\`\`bash
4292
+ pnpm vitest run --reporter=json
4293
+ \`\`\`
4294
+
4295
+ ### 4. \uB9AC\uD3EC\uD2B8 \uC0DD\uC131
4296
+
4297
+ ## Examples
4298
+
4299
+ **\uC0AC\uC6A9\uC790**: "\uD604\uC7AC \uC9C4\uD589 \uC0C1\uD669 \uC54C\uB824\uC918"
4300
+
4301
+ **\uC751\uB2F5**:
4302
+ \`\`\`
4303
+ ## SDD \uAD6C\uD604 \uD604\uD669
4304
+
4305
+ ### \uC804\uCCB4 \uC9C4\uD589\uB960: 65% (13/20 \uC2A4\uD399)
4306
+
4307
+ ### Phase\uBCC4 \uD604\uD669
4308
+
4309
+ | Phase | \uC804\uCCB4 | \uC644\uB8CC | \uC9C4\uD589\uB960 |
4310
+ |-------|------|------|--------|
4311
+ | Phase 1 | 8 | 8 | 100% |
4312
+ | Phase 2 | 7 | 5 | 71% |
4313
+ | Phase 3 | 5 | 0 | 0% |
4314
+
4315
+ ### \uD14C\uC2A4\uD2B8 \uD604\uD669
4316
+ - \uC804\uCCB4: 45\uAC1C
4317
+ - \uD1B5\uACFC: 42\uAC1C (93%)
4318
+ - \uC2E4\uD328: 3\uAC1C
4319
+
4320
+ ### \uB2E4\uC74C \uC791\uC5C5 \uCD94\uCC9C
4321
+ \u2192 Phase 2\uC758 \uB0A8\uC740 2\uAC1C \uC2A4\uD399 \uC644\uB8CC
4322
+ \`\`\`
4323
+ `
4324
+ },
4325
+ {
4326
+ name: "dev-test",
4327
+ content: `---
4328
+ name: dev-test
4329
+ description: Vitest\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD14C\uC2A4\uD2B8\uB97C \uC791\uC131\uD558\uAC70\uB098 \uC2E4\uD589\uD569\uB2C8\uB2E4. \uB300\uC0C1 \uD30C\uC77C\uC744 \uBD84\uC11D\uD558\uC5EC \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4\uB97C \uC0DD\uC131\uD558\uACE0 \uCEE4\uBC84\uB9AC\uC9C0\uB97C \uD655\uC778\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 "\uD14C\uC2A4\uD2B8 \uC791\uC131", "\uD14C\uC2A4\uD2B8 \uC2E4\uD589", "\uCEE4\uBC84\uB9AC\uC9C0", "vitest" \uB4F1\uC744 \uC694\uCCAD\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
4330
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash
4331
+ ---
4332
+
4333
+ # \uD14C\uC2A4\uD2B8 \uC791\uC131 \uBC0F \uC2E4\uD589
4334
+
4335
+ ## Instructions
4336
+
4337
+ ### 1. \uD14C\uC2A4\uD2B8 \uB300\uC0C1 \uBD84\uC11D
4338
+
4339
+ \uB300\uC0C1 \uD30C\uC77C\uC5D0\uC11C \uD14C\uC2A4\uD2B8\uD560 \uD568\uC218/\uD074\uB798\uC2A4 \uC2DD\uBCC4:
4340
+ - export\uB41C \uD568\uC218/\uD074\uB798\uC2A4
4341
+ - \uC8FC\uC694 \uB85C\uC9C1 \uD750\uB984
4342
+ - \uC5E3\uC9C0 \uCF00\uC774\uC2A4
4343
+
4344
+ ### 2. \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4 \uC0DD\uC131
4345
+
4346
+ \uC2A4\uD399\uC758 Scenario\uB97C \uCC38\uC870\uD558\uC5EC \uD14C\uC2A4\uD2B8 \uC791\uC131:
4347
+ - describe: \uD14C\uC2A4\uD2B8 \uADF8\uB8F9
4348
+ - it: \uAC1C\uBCC4 \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4
4349
+ - GIVEN-WHEN-THEN \uAD6C\uC870
4350
+
4351
+ ### 3. \uD14C\uC2A4\uD2B8 \uC2E4\uD589
4352
+
4353
+ \`\`\`bash
4354
+ # \uC804\uCCB4 \uD14C\uC2A4\uD2B8
4355
+ pnpm vitest run
4356
+
4357
+ # \uD2B9\uC815 \uD30C\uC77C
4358
+ pnpm vitest run src/path/to/file.test.ts
4359
+
4360
+ # \uAC10\uC2DC \uBAA8\uB4DC
4361
+ pnpm vitest
4362
+
4363
+ # \uCEE4\uBC84\uB9AC\uC9C0
4364
+ pnpm vitest run --coverage
4365
+ \`\`\`
4366
+
4367
+ ### 4. \uACB0\uACFC \uBD84\uC11D
4368
+
4369
+ - \uD1B5\uACFC/\uC2E4\uD328 \uD604\uD669
4370
+ - \uCEE4\uBC84\uB9AC\uC9C0 \uBD80\uC871 \uC601\uC5ED
4371
+ - \uAC1C\uC120 \uC81C\uC548
4372
+
4373
+ ## Examples
4374
+
4375
+ **\uC0AC\uC6A9\uC790**: "validation.ts \uD14C\uC2A4\uD2B8 \uC791\uC131\uD574\uC918"
4376
+
4377
+ **\uC751\uB2F5**:
4378
+ \`\`\`
4379
+ ## \uD14C\uC2A4\uD2B8 \uBD84\uC11D: src/core/validation.ts
4380
+
4381
+ ### \uBC1C\uACAC\uB41C \uD568\uC218
4382
+ - validateLength(value, min, max)
4383
+ - validateRequired(obj, fields)
4384
+
4385
+ ### \uC0DD\uC131\uD560 \uD14C\uC2A4\uD2B8
4386
+
4387
+ \`\`\`typescript
4388
+ describe('validateLength', () => {
4389
+ it('\uBC94\uC704 \uB0B4 \uBB38\uC790\uC5F4\uC740 \uC720\uD6A8\uD558\uB2E4', () => {
4390
+ expect(validateLength('hello', 1, 10).valid).toBe(true);
4391
+ });
4392
+
4393
+ it('\uCD5C\uC18C \uAE38\uC774 \uBBF8\uB2EC \uC2DC \uC2E4\uD328\uD55C\uB2E4', () => {
4394
+ expect(validateLength('hi', 5, 10).valid).toBe(false);
4395
+ });
4396
+ });
4397
+ \`\`\`
4398
+
4399
+ \uD14C\uC2A4\uD2B8 \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
4400
+ \`\`\`
4401
+ `
4402
+ }
4403
+ ];
4404
+ }
3733
4405
  function generateProposalTemplate() {
3734
4406
  const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
3735
4407
  return `---
@@ -4105,6 +4777,7 @@ async function runInit(options) {
4105
4777
  listItem("templates/", 1);
4106
4778
  listItem(".claude/");
4107
4779
  listItem("commands/", 1);
4780
+ listItem("skills/", 1);
4108
4781
  newline();
4109
4782
  info("Claude \uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC:");
4110
4783
  listItem("/sdd.start - \uC6CC\uD06C\uD50C\uB85C\uC6B0 \uC2DC\uC791 (\uD1B5\uD569 \uC9C4\uC785\uC810)");
@@ -4116,6 +4789,14 @@ async function runInit(options) {
4116
4789
  listItem("/sdd.validate - \uC2A4\uD399 \uAC80\uC99D");
4117
4790
  listItem("/sdd.status - \uC0C1\uD0DC \uD655\uC778");
4118
4791
  listItem("/sdd.change - \uBCC0\uACBD \uC81C\uC548");
4792
+ newline();
4793
+ info("Claude \uAC1C\uBC1C \uC2A4\uD0AC (\uC790\uB3D9 \uC0AC\uC6A9):");
4794
+ listItem("dev-implement - \uC2A4\uD399 \uAE30\uBC18 TDD \uAD6C\uD604");
4795
+ listItem("dev-next - \uB2E4\uC74C \uAD6C\uD604 \uC2A4\uD399 \uCD94\uCC9C");
4796
+ listItem("dev-review - \uCF54\uB4DC \uB9AC\uBDF0");
4797
+ listItem("dev-scaffold - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uC0DD\uC131");
4798
+ listItem("dev-status - \uAD6C\uD604 \uC9C4\uD589 \uC0C1\uD669");
4799
+ listItem("dev-test - \uD14C\uC2A4\uD2B8 \uC791\uC131/\uC2E4\uD589");
4119
4800
  if (!options.skipGitSetup) {
4120
4801
  await promptGitSetup(cwd, options.autoApprove || false);
4121
4802
  }