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 +412 -1
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
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
|
}
|