sdd-tool 1.2.0 → 1.2.2

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
@@ -3557,7 +3557,8 @@ function getInitDirectories(withDomains = false) {
3557
3557
  ".sdd/archive",
3558
3558
  ".sdd/templates",
3559
3559
  ".claude",
3560
- ".claude/commands"
3560
+ ".claude/commands",
3561
+ ".claude/skills"
3561
3562
  ];
3562
3563
  if (withDomains) {
3563
3564
  dirs.push(".sdd/domains");
@@ -3700,6 +3701,8 @@ async function executeInit(projectPath, options) {
3700
3701
  createdFiles.push(...templateFiles);
3701
3702
  const commandFiles = await createCommandFiles(projectPath);
3702
3703
  createdFiles.push(...commandFiles);
3704
+ const skillFiles = await createSkillFiles(projectPath);
3705
+ createdFiles.push(...skillFiles);
3703
3706
  return success({
3704
3707
  sddPath,
3705
3708
  claudePath,
@@ -3730,6 +3733,405 @@ async function createCommandFiles(projectPath) {
3730
3733
  }
3731
3734
  return files;
3732
3735
  }
3736
+ async function createSkillFiles(projectPath) {
3737
+ const skillsPath = path4.join(projectPath, ".claude", "skills");
3738
+ const files = [];
3739
+ const skills = generateDevSkills();
3740
+ for (const skill of skills) {
3741
+ const skillDir = path4.join(skillsPath, skill.name);
3742
+ await ensureDir(skillDir);
3743
+ await writeFile(path4.join(skillDir, "SKILL.md"), skill.content);
3744
+ files.push(`.claude/skills/${skill.name}/SKILL.md`);
3745
+ }
3746
+ return files;
3747
+ }
3748
+ function generateDevSkills() {
3749
+ return [
3750
+ {
3751
+ name: "dev-implement",
3752
+ content: `---
3753
+ name: dev-implement
3754
+ 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.
3755
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash
3756
+ ---
3757
+
3758
+ # \uC2A4\uD399 \uAE30\uBC18 TDD \uAD6C\uD604
3759
+
3760
+ ## Instructions
3761
+
3762
+ ### 1. \uC2A4\uD399 \uD30C\uC77C \uBD84\uC11D
3763
+
3764
+ \`.sdd/specs/<spec-path>.md\` \uD30C\uC77C\uC5D0\uC11C \uCD94\uCD9C:
3765
+ - **Requirement**: \uAD6C\uD604\uD574\uC57C \uD560 \uAE30\uB2A5
3766
+ - **Scenario**: GIVEN-WHEN-THEN \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4
3767
+ - **RFC 2119 \uD0A4\uC6CC\uB4DC**: SHALL(\uD544\uC218), SHOULD(\uAD8C\uC7A5), MAY(\uC120\uD0DD)
3768
+
3769
+ ### 2. \uC758\uC874\uC131 \uD655\uC778
3770
+
3771
+ 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.
3772
+
3773
+ ### 3. TDD: \uD14C\uC2A4\uD2B8 \uBA3C\uC800 \uC791\uC131
3774
+
3775
+ \uC2A4\uD399\uC758 Scenario\uB97C \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4\uB85C \uBCC0\uD658:
3776
+
3777
+ \`\`\`markdown
3778
+ ### Scenario: \uC720\uD6A8\uD55C \uC2A4\uD399 \uAC80\uC99D \uC131\uACF5
3779
+ - **GIVEN** \uC720\uD6A8\uD55C RFC 2119 \uD0A4\uC6CC\uB4DC\uAC00 \uD3EC\uD568\uB41C \uC2A4\uD399
3780
+ - **WHEN** validate \uBA85\uB839\uC744 \uC2E4\uD589\uD558\uBA74
3781
+ - **THEN** \uC131\uACF5 \uBA54\uC2DC\uC9C0\uAC00 \uCD9C\uB825\uB41C\uB2E4
3782
+ \`\`\`
3783
+
3784
+ \u2193 \uBCC0\uD658
3785
+
3786
+ \`\`\`typescript
3787
+ it('\uC720\uD6A8\uD55C \uC2A4\uD399\uC744 \uAC80\uC99D\uD558\uBA74 \uC131\uACF5\uD55C\uB2E4', () => {
3788
+ // GIVEN
3789
+ const spec = '\uC2DC\uC2A4\uD15C\uC740 X\uB97C \uD574\uC57C \uD55C\uB2E4(SHALL).';
3790
+ // WHEN
3791
+ const result = validateSpec(spec);
3792
+ // THEN
3793
+ expect(result.valid).toBe(true);
3794
+ });
3795
+ \`\`\`
3796
+
3797
+ ### 4. \uAD6C\uD604 \uBC0F \uD14C\uC2A4\uD2B8 \uC2E4\uD589
3798
+
3799
+ \uD14C\uC2A4\uD2B8\uB97C \uD1B5\uACFC\uD558\uB3C4\uB85D \uAD6C\uD604\uD558\uACE0 \uD655\uC778:
3800
+
3801
+ \`\`\`bash
3802
+ pnpm vitest run src/<path>.test.ts
3803
+ \`\`\`
3804
+
3805
+ ## Examples
3806
+
3807
+ **\uC0AC\uC6A9\uC790**: "user-auth \uC2A4\uD399 \uAD6C\uD604\uD574\uC918"
3808
+
3809
+ **\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.
3810
+
3811
+ ## RFC 2119 \uD0A4\uC6CC\uB4DC \uD574\uC11D
3812
+
3813
+ | \uD0A4\uC6CC\uB4DC | \uC758\uBBF8 | \uAD6C\uD604 \uC218\uC900 |
3814
+ |--------|------|----------|
3815
+ | SHALL / MUST | \uD544\uC218 | \uBC18\uB4DC\uC2DC \uAD6C\uD604 |
3816
+ | SHOULD | \uAD8C\uC7A5 | \uAC00\uB2A5\uD558\uBA74 \uAD6C\uD604 |
3817
+ | MAY | \uC120\uD0DD | \uD544\uC694\uC2DC \uAD6C\uD604 |
3818
+ `
3819
+ },
3820
+ {
3821
+ name: "dev-next",
3822
+ content: `---
3823
+ name: dev-next
3824
+ 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.
3825
+ allowed-tools: Read, Glob, Grep, Bash
3826
+ ---
3827
+
3828
+ # \uB2E4\uC74C \uAD6C\uD604 \uC2A4\uD399 \uCD94\uCC9C
3829
+
3830
+ ## Instructions
3831
+
3832
+ ### 1. \uC2A4\uD399 \uBAA9\uB85D \uC2A4\uCE94
3833
+
3834
+ \`.sdd/specs/\` \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uBAA8\uB4E0 \uC2A4\uD399 \uD30C\uC77C\uC744 \uCC3E\uC2B5\uB2C8\uB2E4.
3835
+
3836
+ ### 2. \uC0C1\uD0DC \uBD84\uC11D
3837
+
3838
+ \uAC01 \uC2A4\uD399\uC758 frontmatter\uC5D0\uC11C \uC0C1\uD0DC \uD655\uC778:
3839
+ - \`status: draft\` - \uBBF8\uAD6C\uD604
3840
+ - \`status: implemented\` - \uAD6C\uD604 \uC644\uB8CC
3841
+ - \`status: review\` - \uB9AC\uBDF0 \uC911
3842
+
3843
+ ### 3. \uC758\uC874\uC131 \uADF8\uB798\uD504 \uBD84\uC11D
3844
+
3845
+ \`depends\` \uD544\uB4DC\uB97C \uD655\uC778\uD558\uC5EC:
3846
+ - \uC758\uC874\uC131\uC774 \uC5C6\uB294 \uC2A4\uD399 \uC6B0\uC120
3847
+ - \uC758\uC874\uD558\uB294 \uC2A4\uD399\uC774 \uBAA8\uB450 \uAD6C\uD604\uB41C \uC2A4\uD399 \uCD94\uCC9C
3848
+ - \uC21C\uD658 \uC758\uC874\uC131 \uAC10\uC9C0 \uBC0F \uACBD\uACE0
3849
+
3850
+ ### 4. \uCD94\uCC9C \uACB0\uACFC \uC81C\uC2DC
3851
+
3852
+ \uC6B0\uC120\uC21C\uC704\uC5D0 \uB530\uB77C \uC815\uB82C:
3853
+ 1. \uC758\uC874\uC131 \uC5C6\uC74C + draft \uC0C1\uD0DC
3854
+ 2. \uC758\uC874\uC131 \uD574\uACB0\uB428 + draft \uC0C1\uD0DC
3855
+ 3. \uC758\uC874\uC131 \uBBF8\uD574\uACB0 (\uBE14\uB85C\uD0B9 \uC0C1\uD0DC)
3856
+
3857
+ ## Examples
3858
+
3859
+ **\uC0AC\uC6A9\uC790**: "\uB2E4\uC74C \uBB50 \uAD6C\uD604\uD558\uBA74 \uB3FC?"
3860
+
3861
+ **\uC751\uB2F5**:
3862
+ \`\`\`
3863
+ ## \uB2E4\uC74C \uAD6C\uD604 \uCD94\uCC9C
3864
+
3865
+ ### 1\uC21C\uC704: core/validation (\uC758\uC874\uC131 \uC5C6\uC74C)
3866
+ - \uC0C1\uD0DC: draft
3867
+ - \uC124\uBA85: \uC785\uB825 \uAC80\uC99D \uC720\uD2F8\uB9AC\uD2F0
3868
+
3869
+ ### 2\uC21C\uC704: auth/login (\uC758\uC874: core/validation)
3870
+ - \uC0C1\uD0DC: draft
3871
+ - \uC124\uBA85: \uC0AC\uC6A9\uC790 \uB85C\uADF8\uC778
3872
+ - \uBE14\uB85C\uCEE4: core/validation \uAD6C\uD604 \uD544\uC694
3873
+
3874
+ /sdd.dev-implement core/validation \uC73C\uB85C \uC2DC\uC791\uD558\uC138\uC694.
3875
+ \`\`\`
3876
+ `
3877
+ },
3878
+ {
3879
+ name: "dev-review",
3880
+ content: `---
3881
+ name: dev-review
3882
+ 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.
3883
+ allowed-tools: Read, Glob, Grep, Bash
3884
+ ---
3885
+
3886
+ # \uCF54\uB4DC \uB9AC\uBDF0
3887
+
3888
+ ## Instructions
3889
+
3890
+ ### 1. \uC2A4\uD399 \uB300\uC870 \uAC80\uC99D
3891
+
3892
+ \uAD6C\uD604\uB41C \uCF54\uB4DC\uAC00 \uC2A4\uD399\uC758 \uC694\uAD6C\uC0AC\uD56D\uC744 \uCDA9\uC871\uD558\uB294\uC9C0 \uD655\uC778:
3893
+ - \uBAA8\uB4E0 Scenario\uAC00 \uD14C\uC2A4\uD2B8\uB85C \uCEE4\uBC84\uB418\uB294\uC9C0
3894
+ - RFC 2119 \uD0A4\uC6CC\uB4DC(SHALL/MUST)\uAC00 \uBAA8\uB450 \uAD6C\uD604\uB418\uC5C8\uB294\uC9C0
3895
+
3896
+ ### 2. \uCF54\uB4DC \uD488\uC9C8 \uAC80\uC0AC
3897
+
3898
+ - TypeScript \uD0C0\uC785 \uC548\uC804\uC131
3899
+ - \uC5D0\uB7EC \uCC98\uB9AC \uC644\uC804\uC131
3900
+ - \uCF54\uB4DC \uC911\uBCF5 \uC5EC\uBD80
3901
+ - \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158
3902
+
3903
+ ### 3. \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 \uD655\uC778
3904
+
3905
+ \`\`\`bash
3906
+ pnpm vitest run --coverage
3907
+ \`\`\`
3908
+
3909
+ ### 4. \uB9AC\uBDF0 \uACB0\uACFC \uC791\uC131
3910
+
3911
+ - \u2705 \uD1B5\uACFC \uD56D\uBAA9
3912
+ - \u26A0\uFE0F \uAC1C\uC120 \uAD8C\uC7A5 \uD56D\uBAA9
3913
+ - \u274C \uD544\uC218 \uC218\uC815 \uD56D\uBAA9
3914
+
3915
+ ## Examples
3916
+
3917
+ **\uC0AC\uC6A9\uC790**: "auth/login \uCF54\uB4DC \uB9AC\uBDF0\uD574\uC918"
3918
+
3919
+ **\uC751\uB2F5**:
3920
+ \`\`\`
3921
+ ## \uCF54\uB4DC \uB9AC\uBDF0: auth/login
3922
+
3923
+ ### \uC2A4\uD399 \uCDA9\uC871\uB3C4: 4/5 (80%)
3924
+ - \u2705 REQ-01: \uC774\uBA54\uC77C \uB85C\uADF8\uC778
3925
+ - \u2705 REQ-02: \uBE44\uBC00\uBC88\uD638 \uAC80\uC99D
3926
+ - \u26A0\uFE0F REQ-03: \uB85C\uADF8\uC778 \uC2E4\uD328 \uD69F\uC218 \uC81C\uD55C (\uBBF8\uAD6C\uD604)
3927
+
3928
+ ### \uCF54\uB4DC \uD488\uC9C8
3929
+ - \u2705 \uD0C0\uC785 \uC548\uC804\uC131
3930
+ - \u26A0\uFE0F \uC5D0\uB7EC \uBA54\uC2DC\uC9C0 i18n \uBBF8\uC801\uC6A9
3931
+ - \u2705 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 85%
3932
+
3933
+ ### \uAD8C\uC7A5 \uC0AC\uD56D
3934
+ 1. \uB85C\uADF8\uC778 \uC2E4\uD328 \uD69F\uC218 \uC81C\uD55C \uAE30\uB2A5 \uCD94\uAC00
3935
+ 2. \uC5D0\uB7EC \uBA54\uC2DC\uC9C0 \uAD6D\uC81C\uD654 \uC801\uC6A9
3936
+ \`\`\`
3937
+ `
3938
+ },
3939
+ {
3940
+ name: "dev-scaffold",
3941
+ content: `---
3942
+ name: dev-scaffold
3943
+ 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.
3944
+ allowed-tools: Read, Write, Edit, Glob
3945
+ ---
3946
+
3947
+ # \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uC0DD\uC131
3948
+
3949
+ ## Instructions
3950
+
3951
+ ### 1. \uC0DD\uC131 \uB300\uC0C1 \uD655\uC778
3952
+
3953
+ \uC0AC\uC6A9\uC790 \uC694\uCCAD\uC5D0\uC11C \uC0DD\uC131\uD560 \uD0C0\uC785 \uD30C\uC545:
3954
+ - **command**: CLI \uBA85\uB839\uC5B4
3955
+ - **module**: \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1 \uBAA8\uB4C8
3956
+ - **parser**: \uD30C\uC11C/\uBCC0\uD658\uAE30
3957
+ - **validator**: \uAC80\uC99D\uAE30
3958
+
3959
+ ### 2. \uAE30\uC874 \uD328\uD134 \uBD84\uC11D
3960
+
3961
+ \uD504\uB85C\uC81D\uD2B8\uC758 \uAE30\uC874 \uCF54\uB4DC\uB97C \uBD84\uC11D\uD558\uC5EC \uD328\uD134 \uCD94\uCD9C:
3962
+ - \uB514\uB809\uD1A0\uB9AC \uAD6C\uC870
3963
+ - \uD30C\uC77C \uB124\uC774\uBC0D \uADDC\uCE59
3964
+ - \uC784\uD3EC\uD2B8 \uC2A4\uD0C0\uC77C
3965
+ - \uD0C0\uC785 \uC815\uC758 \uBC29\uC2DD
3966
+
3967
+ ### 3. \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uC0DD\uC131
3968
+
3969
+ \uCD94\uCD9C\uB41C \uD328\uD134\uC744 \uB530\uB77C \uD30C\uC77C \uC0DD\uC131:
3970
+ - \uBA54\uC778 \uAD6C\uD604 \uD30C\uC77C (.ts)
3971
+ - \uD14C\uC2A4\uD2B8 \uD30C\uC77C (.test.ts)
3972
+ - \uD0C0\uC785 \uC815\uC758 (\uD544\uC694\uC2DC)
3973
+ - \uC778\uB371\uC2A4 \uC775\uC2A4\uD3EC\uD2B8 \uC5C5\uB370\uC774\uD2B8
3974
+
3975
+ ## Examples
3976
+
3977
+ **\uC0AC\uC6A9\uC790**: "export \uBA85\uB839\uC5B4 scaffold \uC0DD\uC131\uD574\uC918"
3978
+
3979
+ **\uC751\uB2F5**:
3980
+ \`\`\`
3981
+ ## Scaffold: export \uBA85\uB839\uC5B4
3982
+
3983
+ \uC0DD\uC131 \uD30C\uC77C:
3984
+ - src/cli/commands/export.ts
3985
+ - src/cli/commands/export.test.ts
3986
+
3987
+ \uAE30\uC874 \uD328\uD134 \uCC38\uC870:
3988
+ - src/cli/commands/validate.ts
3989
+
3990
+ [\uD30C\uC77C \uC0DD\uC131 \uC9C4\uD589...]
3991
+ \`\`\`
3992
+ `
3993
+ },
3994
+ {
3995
+ name: "dev-status",
3996
+ content: `---
3997
+ name: dev-status
3998
+ 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.
3999
+ allowed-tools: Read, Glob, Grep, Bash
4000
+ ---
4001
+
4002
+ # \uAD6C\uD604 \uC9C4\uD589 \uC0C1\uD669
4003
+
4004
+ ## Instructions
4005
+
4006
+ ### 1. \uC2A4\uD399 \uD604\uD669 \uC218\uC9D1
4007
+
4008
+ \`.sdd/specs/\` \uB514\uB809\uD1A0\uB9AC \uC2A4\uCE94:
4009
+ - \uC804\uCCB4 \uC2A4\uD399 \uC218
4010
+ - Phase\uBCC4 \uBD84\uB958
4011
+ - \uC0C1\uD0DC\uBCC4 \uBD84\uB958 (draft, implemented, review)
4012
+
4013
+ ### 2. \uAD6C\uD604 \uC644\uB8CC\uC728 \uACC4\uC0B0
4014
+
4015
+ \`\`\`
4016
+ \uC644\uB8CC\uC728 = (implemented \uC2A4\uD399 \uC218) / (\uC804\uCCB4 \uC2A4\uD399 \uC218) \xD7 100
4017
+ \`\`\`
4018
+
4019
+ ### 3. \uD14C\uC2A4\uD2B8 \uC0C1\uD0DC \uD655\uC778
4020
+
4021
+ \`\`\`bash
4022
+ pnpm vitest run --reporter=json
4023
+ \`\`\`
4024
+
4025
+ ### 4. \uB9AC\uD3EC\uD2B8 \uC0DD\uC131
4026
+
4027
+ ## Examples
4028
+
4029
+ **\uC0AC\uC6A9\uC790**: "\uD604\uC7AC \uC9C4\uD589 \uC0C1\uD669 \uC54C\uB824\uC918"
4030
+
4031
+ **\uC751\uB2F5**:
4032
+ \`\`\`
4033
+ ## SDD \uAD6C\uD604 \uD604\uD669
4034
+
4035
+ ### \uC804\uCCB4 \uC9C4\uD589\uB960: 65% (13/20 \uC2A4\uD399)
4036
+
4037
+ ### Phase\uBCC4 \uD604\uD669
4038
+
4039
+ | Phase | \uC804\uCCB4 | \uC644\uB8CC | \uC9C4\uD589\uB960 |
4040
+ |-------|------|------|--------|
4041
+ | Phase 1 | 8 | 8 | 100% |
4042
+ | Phase 2 | 7 | 5 | 71% |
4043
+ | Phase 3 | 5 | 0 | 0% |
4044
+
4045
+ ### \uD14C\uC2A4\uD2B8 \uD604\uD669
4046
+ - \uC804\uCCB4: 45\uAC1C
4047
+ - \uD1B5\uACFC: 42\uAC1C (93%)
4048
+ - \uC2E4\uD328: 3\uAC1C
4049
+
4050
+ ### \uB2E4\uC74C \uC791\uC5C5 \uCD94\uCC9C
4051
+ \u2192 Phase 2\uC758 \uB0A8\uC740 2\uAC1C \uC2A4\uD399 \uC644\uB8CC
4052
+ \`\`\`
4053
+ `
4054
+ },
4055
+ {
4056
+ name: "dev-test",
4057
+ content: `---
4058
+ name: dev-test
4059
+ 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.
4060
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash
4061
+ ---
4062
+
4063
+ # \uD14C\uC2A4\uD2B8 \uC791\uC131 \uBC0F \uC2E4\uD589
4064
+
4065
+ ## Instructions
4066
+
4067
+ ### 1. \uD14C\uC2A4\uD2B8 \uB300\uC0C1 \uBD84\uC11D
4068
+
4069
+ \uB300\uC0C1 \uD30C\uC77C\uC5D0\uC11C \uD14C\uC2A4\uD2B8\uD560 \uD568\uC218/\uD074\uB798\uC2A4 \uC2DD\uBCC4:
4070
+ - export\uB41C \uD568\uC218/\uD074\uB798\uC2A4
4071
+ - \uC8FC\uC694 \uB85C\uC9C1 \uD750\uB984
4072
+ - \uC5E3\uC9C0 \uCF00\uC774\uC2A4
4073
+
4074
+ ### 2. \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4 \uC0DD\uC131
4075
+
4076
+ \uC2A4\uD399\uC758 Scenario\uB97C \uCC38\uC870\uD558\uC5EC \uD14C\uC2A4\uD2B8 \uC791\uC131:
4077
+ - describe: \uD14C\uC2A4\uD2B8 \uADF8\uB8F9
4078
+ - it: \uAC1C\uBCC4 \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4
4079
+ - GIVEN-WHEN-THEN \uAD6C\uC870
4080
+
4081
+ ### 3. \uD14C\uC2A4\uD2B8 \uC2E4\uD589
4082
+
4083
+ \`\`\`bash
4084
+ # \uC804\uCCB4 \uD14C\uC2A4\uD2B8
4085
+ pnpm vitest run
4086
+
4087
+ # \uD2B9\uC815 \uD30C\uC77C
4088
+ pnpm vitest run src/path/to/file.test.ts
4089
+
4090
+ # \uAC10\uC2DC \uBAA8\uB4DC
4091
+ pnpm vitest
4092
+
4093
+ # \uCEE4\uBC84\uB9AC\uC9C0
4094
+ pnpm vitest run --coverage
4095
+ \`\`\`
4096
+
4097
+ ### 4. \uACB0\uACFC \uBD84\uC11D
4098
+
4099
+ - \uD1B5\uACFC/\uC2E4\uD328 \uD604\uD669
4100
+ - \uCEE4\uBC84\uB9AC\uC9C0 \uBD80\uC871 \uC601\uC5ED
4101
+ - \uAC1C\uC120 \uC81C\uC548
4102
+
4103
+ ## Examples
4104
+
4105
+ **\uC0AC\uC6A9\uC790**: "validation.ts \uD14C\uC2A4\uD2B8 \uC791\uC131\uD574\uC918"
4106
+
4107
+ **\uC751\uB2F5**:
4108
+ \`\`\`
4109
+ ## \uD14C\uC2A4\uD2B8 \uBD84\uC11D: src/core/validation.ts
4110
+
4111
+ ### \uBC1C\uACAC\uB41C \uD568\uC218
4112
+ - validateLength(value, min, max)
4113
+ - validateRequired(obj, fields)
4114
+
4115
+ ### \uC0DD\uC131\uD560 \uD14C\uC2A4\uD2B8
4116
+
4117
+ \`\`\`typescript
4118
+ describe('validateLength', () => {
4119
+ it('\uBC94\uC704 \uB0B4 \uBB38\uC790\uC5F4\uC740 \uC720\uD6A8\uD558\uB2E4', () => {
4120
+ expect(validateLength('hello', 1, 10).valid).toBe(true);
4121
+ });
4122
+
4123
+ it('\uCD5C\uC18C \uAE38\uC774 \uBBF8\uB2EC \uC2DC \uC2E4\uD328\uD55C\uB2E4', () => {
4124
+ expect(validateLength('hi', 5, 10).valid).toBe(false);
4125
+ });
4126
+ });
4127
+ \`\`\`
4128
+
4129
+ \uD14C\uC2A4\uD2B8 \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
4130
+ \`\`\`
4131
+ `
4132
+ }
4133
+ ];
4134
+ }
3733
4135
  function generateProposalTemplate() {
3734
4136
  const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
3735
4137
  return `---
@@ -4105,6 +4507,7 @@ async function runInit(options) {
4105
4507
  listItem("templates/", 1);
4106
4508
  listItem(".claude/");
4107
4509
  listItem("commands/", 1);
4510
+ listItem("skills/", 1);
4108
4511
  newline();
4109
4512
  info("Claude \uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC:");
4110
4513
  listItem("/sdd.start - \uC6CC\uD06C\uD50C\uB85C\uC6B0 \uC2DC\uC791 (\uD1B5\uD569 \uC9C4\uC785\uC810)");
@@ -4116,6 +4519,14 @@ async function runInit(options) {
4116
4519
  listItem("/sdd.validate - \uC2A4\uD399 \uAC80\uC99D");
4117
4520
  listItem("/sdd.status - \uC0C1\uD0DC \uD655\uC778");
4118
4521
  listItem("/sdd.change - \uBCC0\uACBD \uC81C\uC548");
4522
+ newline();
4523
+ info("Claude \uAC1C\uBC1C \uC2A4\uD0AC (\uC790\uB3D9 \uC0AC\uC6A9):");
4524
+ listItem("dev-implement - \uC2A4\uD399 \uAE30\uBC18 TDD \uAD6C\uD604");
4525
+ listItem("dev-next - \uB2E4\uC74C \uAD6C\uD604 \uC2A4\uD399 \uCD94\uCC9C");
4526
+ listItem("dev-review - \uCF54\uB4DC \uB9AC\uBDF0");
4527
+ listItem("dev-scaffold - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uC0DD\uC131");
4528
+ listItem("dev-status - \uAD6C\uD604 \uC9C4\uD589 \uC0C1\uD669");
4529
+ listItem("dev-test - \uD14C\uC2A4\uD2B8 \uC791\uC131/\uC2E4\uD589");
4119
4530
  if (!options.skipGitSetup) {
4120
4531
  await promptGitSetup(cwd, options.autoApprove || false);
4121
4532
  }