sdd-tool 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -434,6 +434,269 @@ sdd validate --strict # \uACBD\uACE0\uB3C4 \uC5D0\uB7EC\uB85C \uCC98\uB9AC
434
434
  `;
435
435
  }
436
436
 
437
+ // src/generators/claude-commands.ts
438
+ function generateClaudeCommands() {
439
+ return [
440
+ {
441
+ name: "sdd-new",
442
+ content: `\uC0C8\uB85C\uC6B4 \uAE30\uB2A5 \uBA85\uC138\uB97C \uC791\uC131\uD569\uB2C8\uB2E4.
443
+
444
+ ## \uC9C0\uC2DC\uC0AC\uD56D
445
+
446
+ 1. \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uAE30\uB2A5\uBA85\uACFC \uAC04\uB2E8\uD55C \uC124\uBA85\uC744 \uC694\uCCAD\uD558\uC138\uC694
447
+ 2. \`sdd new <feature-id> --all\` \uBA85\uB839\uC5B4\uB97C \uC2E4\uD589\uD558\uC5EC \uAE30\uBCF8 \uAD6C\uC870\uB97C \uC0DD\uC131\uD558\uC138\uC694
448
+ 3. \uC0DD\uC131\uB41C \`.sdd/specs/<feature-id>/spec.md\` \uD30C\uC77C\uC744 \uC5F4\uC5B4 \uB0B4\uC6A9\uC744 \uC791\uC131\uD558\uC138\uC694
449
+
450
+ ## \uBA85\uC138 \uC791\uC131 \uADDC\uCE59
451
+
452
+ - RFC 2119 \uD0A4\uC6CC\uB4DC \uC0AC\uC6A9: SHALL, MUST, SHOULD, MAY, SHALL NOT
453
+ - GIVEN-WHEN-THEN \uD615\uC2DD\uC758 \uC2DC\uB098\uB9AC\uC624 \uD3EC\uD568 \uD544\uC218
454
+ - \uAC01 \uC694\uAD6C\uC0AC\uD56D\uC5D0 \uACE0\uC720 ID \uBD80\uC5EC (REQ-001, REQ-002, ...)
455
+
456
+ ## \uC608\uC2DC
457
+
458
+ \`\`\`markdown
459
+ ### REQ-01: \uC0AC\uC6A9\uC790 \uC778\uC99D
460
+
461
+ \uC2DC\uC2A4\uD15C\uC740 \uC774\uBA54\uC77C\uACFC \uBE44\uBC00\uBC88\uD638\uB85C \uC0AC\uC6A9\uC790\uB97C \uC778\uC99D\uD574\uC57C \uD55C\uB2E4(SHALL).
462
+
463
+ ### Scenario: \uC62C\uBC14\uB978 \uC790\uACA9 \uC99D\uBA85\uC73C\uB85C \uB85C\uADF8\uC778
464
+
465
+ - **GIVEN** \uB4F1\uB85D\uB41C \uC0AC\uC6A9\uC790\uAC00 \uC874\uC7AC\uD560 \uB54C
466
+ - **WHEN** \uC62C\uBC14\uB978 \uC774\uBA54\uC77C\uACFC \uBE44\uBC00\uBC88\uD638\uB85C \uB85C\uADF8\uC778\uC744 \uC2DC\uB3C4\uD558\uBA74
467
+ - **THEN** \uC561\uC138\uC2A4 \uD1A0\uD070\uC774 \uBC1C\uAE09\uB418\uC5B4\uC57C \uD55C\uB2E4
468
+ \`\`\`
469
+
470
+ \uC644\uB8CC \uD6C4 \`sdd validate\`\uB85C \uBA85\uC138\uB97C \uAC80\uC99D\uD558\uC138\uC694.
471
+ `
472
+ },
473
+ {
474
+ name: "sdd-plan",
475
+ content: `\uAE30\uB2A5 \uBA85\uC138\uC5D0 \uB300\uD55C \uAD6C\uD604 \uACC4\uD68D\uC744 \uC791\uC131\uD569\uB2C8\uB2E4.
476
+
477
+ ## \uC9C0\uC2DC\uC0AC\uD56D
478
+
479
+ 1. \`.sdd/specs/\` \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C \uACC4\uD68D\uC744 \uC791\uC131\uD560 \uAE30\uB2A5\uC744 \uD655\uC778\uD558\uC138\uC694
480
+ 2. \uD574\uB2F9 \uAE30\uB2A5\uC758 \`spec.md\`\uB97C \uC77D\uACE0 \uC694\uAD6C\uC0AC\uD56D\uC744 \uBD84\uC11D\uD558\uC138\uC694
481
+ 3. \`sdd new plan <feature-id>\` \uBA85\uB839\uC5B4\uB85C \uACC4\uD68D \uD15C\uD50C\uB9BF\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uAE30\uC874 \`plan.md\`\uB97C \uC218\uC815\uD558\uC138\uC694
482
+
483
+ ## \uACC4\uD68D \uC791\uC131 \uADDC\uCE59
484
+
485
+ - \uAE30\uC220 \uACB0\uC815\uC0AC\uD56D\uACFC \uADF8 \uADFC\uAC70\uB97C \uBA85\uC2DC
486
+ - \uAD6C\uD604 \uB2E8\uACC4(Phase)\uB97C \uB098\uB204\uC5B4 \uC815\uC758
487
+ - \uAC01 \uB2E8\uACC4\uBCC4 \uC0B0\uCD9C\uBB3C \uBAA9\uB85D \uC791\uC131
488
+ - \uB9AC\uC2A4\uD06C \uBD84\uC11D \uBC0F \uC644\uD654 \uC804\uB7B5 \uD3EC\uD568
489
+ - \uD14C\uC2A4\uD2B8 \uC804\uB7B5 \uC218\uB9BD
490
+
491
+ ## \uACC4\uD68D \uAD6C\uC870
492
+
493
+ \`\`\`markdown
494
+ ## \uAE30\uC220 \uACB0\uC815
495
+ ### \uACB0\uC815 1: [\uC81C\uBAA9]
496
+ **\uADFC\uAC70:** [\uC65C \uC774 \uAE30\uC220/\uBC29\uC2DD\uC744 \uC120\uD0DD\uD588\uB294\uC9C0]
497
+
498
+ ## \uAD6C\uD604 \uB2E8\uACC4
499
+ ### Phase 1: \uAE30\uBC18 \uAD6C\uC870
500
+ [\uC124\uBA85]
501
+ **\uC0B0\uCD9C\uBB3C:**
502
+ - [ ] \uC0B0\uCD9C\uBB3C 1
503
+ - [ ] \uC0B0\uCD9C\uBB3C 2
504
+
505
+ ## \uB9AC\uC2A4\uD06C \uBD84\uC11D
506
+ | \uB9AC\uC2A4\uD06C | \uC601\uD5A5\uB3C4 | \uC644\uD654 \uC804\uB7B5 |
507
+ \`\`\`
508
+
509
+ \uC644\uB8CC \uD6C4 \`/sdd-tasks\`\uB85C \uC791\uC5C5\uC744 \uBD84\uD574\uD558\uC138\uC694.
510
+ `
511
+ },
512
+ {
513
+ name: "sdd-tasks",
514
+ content: `\uAD6C\uD604 \uACC4\uD68D\uC744 \uC2E4\uD589 \uAC00\uB2A5\uD55C \uC791\uC5C5\uC73C\uB85C \uBD84\uD574\uD569\uB2C8\uB2E4.
515
+
516
+ ## \uC9C0\uC2DC\uC0AC\uD56D
517
+
518
+ 1. \uD574\uB2F9 \uAE30\uB2A5\uC758 \`plan.md\`\uB97C \uC77D\uACE0 \uAD6C\uD604 \uB2E8\uACC4\uB97C \uD655\uC778\uD558\uC138\uC694
519
+ 2. \`sdd new tasks <feature-id>\` \uBA85\uB839\uC5B4\uB85C \uC791\uC5C5 \uBAA9\uB85D\uC744 \uC0DD\uC131\uD558\uC138\uC694
520
+ 3. \uAC01 \uC791\uC5C5\uC5D0 \uC6B0\uC120\uC21C\uC704\uC640 \uC0C1\uD0DC\uB97C \uC9C0\uC815\uD558\uC138\uC694
521
+
522
+ ## \uC791\uC5C5 \uBD84\uD574 \uADDC\uCE59
523
+
524
+ - \uAC01 \uC791\uC5C5\uC740 2-4\uC2DC\uAC04 \uB0B4 \uC644\uB8CC \uAC00\uB2A5\uD55C \uD06C\uAE30\uB85C \uBD84\uD574
525
+ - \uC791\uC5C5 \uAC04 \uC758\uC874\uC131\uC744 \uBA85\uD655\uD788 \uD45C\uC2DC
526
+ - \uC6B0\uC120\uC21C\uC704: HIGH(\u{1F534}), MEDIUM(\u{1F7E1}), LOW(\u{1F7E2})
527
+ - \uC0C1\uD0DC: \uB300\uAE30, \uC9C4\uD589 \uC911, \uC644\uB8CC, \uCC28\uB2E8\uB428
528
+
529
+ ## \uC791\uC5C5 \uAD6C\uC870
530
+
531
+ \`\`\`markdown
532
+ ### <feature>-task-001: [\uC791\uC5C5 \uC81C\uBAA9]
533
+
534
+ - **\uC0C1\uD0DC:** \uB300\uAE30
535
+ - **\uC6B0\uC120\uC21C\uC704:** \u{1F534} HIGH
536
+ - **\uC758\uC874\uC131:** \uC5C6\uC74C
537
+
538
+ #### \uC124\uBA85
539
+ [\uC791\uC5C5 \uC0C1\uC138 \uC124\uBA85]
540
+
541
+ #### \uC644\uB8CC \uC870\uAC74
542
+ - [ ] \uC870\uAC74 1
543
+ - [ ] \uC870\uAC74 2
544
+ \`\`\`
545
+
546
+ \uC644\uB8CC \uD6C4 \`/sdd-implement\`\uB85C \uAD6C\uD604\uC744 \uC2DC\uC791\uD558\uC138\uC694.
547
+ `
548
+ },
549
+ {
550
+ name: "sdd-implement",
551
+ content: `\uC791\uC5C5 \uBAA9\uB85D\uC744 \uAE30\uBC18\uC73C\uB85C \uC21C\uCC28\uC801\uC73C\uB85C \uAD6C\uD604\uD569\uB2C8\uB2E4.
552
+
553
+ ## \uC9C0\uC2DC\uC0AC\uD56D
554
+
555
+ 1. \`sdd status\`\uB85C \uD604\uC7AC \uC9C4\uD589 \uC0C1\uD669\uC744 \uD655\uC778\uD558\uC138\uC694
556
+ 2. \uD574\uB2F9 \uAE30\uB2A5\uC758 \`tasks.md\`\uB97C \uC77D\uACE0 \uB2E4\uC74C \uC791\uC5C5\uC744 \uD655\uC778\uD558\uC138\uC694
557
+ 3. \uC791\uC5C5\uC744 \uAD6C\uD604\uD558\uACE0 \uC644\uB8CC \uC2DC \uC0C1\uD0DC\uB97C \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694
558
+
559
+ ## \uAD6C\uD604 \uADDC\uCE59
560
+
561
+ - \uD55C \uBC88\uC5D0 \uD558\uB098\uC758 \uC791\uC5C5\uB9CC \uC9C4\uD589
562
+ - \uAC01 \uC791\uC5C5 \uC644\uB8CC \uD6C4 \uD14C\uC2A4\uD2B8 \uC791\uC131 \uD544\uC218
563
+ - \uCEE4\uBC0B \uBA54\uC2DC\uC9C0\uC5D0 \uC791\uC5C5 ID \uD3EC\uD568
564
+ - \`.sdd/constitution.md\`\uC758 \uC6D0\uCE59 \uC900\uC218
565
+
566
+ ## \uC791\uC5C5 \uD750\uB984
567
+
568
+ 1. \uC791\uC5C5 \uC0C1\uD0DC\uB97C "\uC9C4\uD589 \uC911"\uC73C\uB85C \uBCC0\uACBD
569
+ 2. \uCF54\uB4DC \uAD6C\uD604
570
+ 3. \uD14C\uC2A4\uD2B8 \uC791\uC131 \uBC0F \uC2E4\uD589
571
+ 4. \uC791\uC5C5 \uC0C1\uD0DC\uB97C "\uC644\uB8CC"\uB85C \uBCC0\uACBD
572
+ 5. \uCEE4\uBC0B: \`feat(<feature>): <task-id> - <\uC124\uBA85>\`
573
+
574
+ ## \uC644\uB8CC \uC870\uAC74
575
+
576
+ \uBAA8\uB4E0 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uBA74:
577
+ 1. \`sdd validate\`\uB85C \uCD5C\uC885 \uAC80\uC99D
578
+ 2. PR \uC0DD\uC131 \uB610\uB294 \uBA38\uC9C0
579
+ 3. \uD544\uC694\uC2DC \`/sdd-archive\`\uB85C \uC544\uCE74\uC774\uBE0C
580
+ `
581
+ },
582
+ {
583
+ name: "sdd-validate",
584
+ content: `\uC2A4\uD399 \uD30C\uC77C\uC758 \uD615\uC2DD\uACFC \uADDC\uCE59\uC744 \uAC80\uC99D\uD569\uB2C8\uB2E4.
585
+
586
+ ## \uC9C0\uC2DC\uC0AC\uD56D
587
+
588
+ \`sdd validate\` \uBA85\uB839\uC5B4\uB97C \uC2E4\uD589\uD558\uC5EC \uBAA8\uB4E0 \uC2A4\uD399\uC744 \uAC80\uC99D\uD558\uC138\uC694.
589
+
590
+ ## \uAC80\uC99D \uD56D\uBAA9
591
+
592
+ 1. **RFC 2119 \uD0A4\uC6CC\uB4DC**: SHALL, MUST, SHOULD, MAY \uB4F1 \uD3EC\uD568 \uC5EC\uBD80
593
+ 2. **GIVEN-WHEN-THEN**: \uC2DC\uB098\uB9AC\uC624 \uD615\uC2DD \uC900\uC218 \uC5EC\uBD80
594
+ 3. **\uBA54\uD0C0\uB370\uC774\uD130**: YAML frontmatter \uD544\uC218 \uD544\uB4DC \uD655\uC778
595
+ 4. **\uAD6C\uC870**: \uD544\uC218 \uC139\uC158 \uC874\uC7AC \uC5EC\uBD80
596
+
597
+ ## \uC0AC\uC6A9\uBC95
598
+
599
+ \`\`\`bash
600
+ # \uC804\uCCB4 \uC2A4\uD399 \uAC80\uC99D
601
+ sdd validate
602
+
603
+ # \uD2B9\uC815 \uD30C\uC77C \uAC80\uC99D
604
+ sdd validate .sdd/specs/user-auth/spec.md
605
+
606
+ # \uC5C4\uACA9 \uBAA8\uB4DC (\uACBD\uACE0\uB3C4 \uC5D0\uB7EC\uB85C \uCC98\uB9AC)
607
+ sdd validate --strict
608
+ \`\`\`
609
+
610
+ ## \uC624\uB958 \uD574\uACB0
611
+
612
+ \uAC80\uC99D \uC2E4\uD328 \uC2DC \uD574\uB2F9 \uD30C\uC77C\uC744 \uC5F4\uC5B4 \uC624\uB958\uB97C \uC218\uC815\uD558\uC138\uC694.
613
+ \uAC01 \uC624\uB958 \uBA54\uC2DC\uC9C0\uC5D0\uB294 \uD574\uACB0 \uBC29\uBC95\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.
614
+ `
615
+ },
616
+ {
617
+ name: "sdd-status",
618
+ content: `\uD604\uC7AC SDD \uD504\uB85C\uC81D\uD2B8 \uC0C1\uD0DC\uB97C \uD655\uC778\uD569\uB2C8\uB2E4.
619
+
620
+ ## \uC9C0\uC2DC\uC0AC\uD56D
621
+
622
+ \`sdd status\` \uBA85\uB839\uC5B4\uB97C \uC2E4\uD589\uD558\uC5EC \uD504\uB85C\uC81D\uD2B8 \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uC138\uC694.
623
+
624
+ ## \uD655\uC778 \uD56D\uBAA9
625
+
626
+ - \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870 (constitution.md, AGENTS.md \uC874\uC7AC \uC5EC\uBD80)
627
+ - \uAE30\uB2A5 \uBAA9\uB85D \uBC0F \uC0C1\uD0DC
628
+ - \uD604\uC7AC Git \uBE0C\uB79C\uCE58
629
+ - \uB2E4\uC74C \uB2E8\uACC4 \uC81C\uC548
630
+
631
+ ## \uCD94\uAC00 \uBA85\uB839\uC5B4
632
+
633
+ \`\`\`bash
634
+ # \uD504\uB85C\uC81D\uD2B8 \uC694\uC57D
635
+ sdd list
636
+
637
+ # \uAE30\uB2A5 \uBAA9\uB85D
638
+ sdd list features
639
+
640
+ # \uC2A4\uD399 \uD30C\uC77C \uBAA9\uB85D
641
+ sdd list specs
642
+
643
+ # JSON \uD615\uC2DD \uCD9C\uB825
644
+ sdd status --json
645
+ \`\`\`
646
+ `
647
+ },
648
+ {
649
+ name: "sdd-change",
650
+ content: `\uAE30\uC874 \uC2A4\uD399\uC5D0 \uB300\uD55C \uBCC0\uACBD\uC744 \uC81C\uC548\uD569\uB2C8\uB2E4.
651
+
652
+ ## \uC9C0\uC2DC\uC0AC\uD56D
653
+
654
+ 1. \uBCC0\uACBD\uC774 \uD544\uC694\uD55C \uC2A4\uD399\uC744 \uD655\uC778\uD558\uC138\uC694
655
+ 2. \`.sdd/changes/\` \uB514\uB809\uD1A0\uB9AC\uC5D0 \uBCC0\uACBD \uC81C\uC548\uC11C\uB97C \uC791\uC131\uD558\uC138\uC694
656
+ 3. \uBCC0\uACBD \uC720\uD615(ADDED, MODIFIED, REMOVED)\uC744 \uBA85\uC2DC\uD558\uC138\uC694
657
+
658
+ ## \uBCC0\uACBD \uC81C\uC548\uC11C \uAD6C\uC870
659
+
660
+ \`\`\`markdown
661
+ ---
662
+ id: CHG-001
663
+ status: draft
664
+ created: YYYY-MM-DD
665
+ ---
666
+
667
+ # \uBCC0\uACBD \uC81C\uC548: [\uC81C\uBAA9]
668
+
669
+ ## \uBC30\uACBD
670
+ \uC65C \uC774 \uBCC0\uACBD\uC774 \uD544\uC694\uD55C\uAC00?
671
+
672
+ ## \uC601\uD5A5 \uBC94\uC704
673
+ ### \uC601\uD5A5\uBC1B\uB294 \uC2A4\uD399
674
+ - \`specs/user-auth/spec.md\`
675
+
676
+ ### \uBCC0\uACBD \uC720\uD615
677
+ - [x] \uC218\uC815 (MODIFIED)
678
+
679
+ ## \uBCC0\uACBD \uB0B4\uC6A9
680
+
681
+ ### MODIFIED
682
+
683
+ #### Before
684
+ \`\`\`markdown
685
+ \uAE30\uC874 \uB0B4\uC6A9
686
+ \`\`\`
687
+
688
+ #### After
689
+ \`\`\`markdown
690
+ \uBCC0\uACBD\uB41C \uB0B4\uC6A9
691
+ \`\`\`
692
+ \`\`\`
693
+
694
+ \uAC80\uD1A0 \uD6C4 \uC2B9\uC778\uB418\uBA74 \uC2A4\uD399\uC5D0 \uBC18\uC601\uD558\uC138\uC694.
695
+ `
696
+ }
697
+ ];
698
+ }
699
+
437
700
  // src/cli/commands/init.ts
438
701
  function registerInitCommand(program2) {
439
702
  program2.command("init").description("SDD \uD504\uB85C\uC81D\uD2B8\uB97C \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4").option("-f, --force", "\uAE30\uC874 .sdd/ \uB514\uB809\uD1A0\uB9AC \uB36E\uC5B4\uC4F0\uAE30").action(async (options) => {
@@ -461,7 +724,9 @@ async function runInit(options) {
461
724
  ".sdd/specs",
462
725
  ".sdd/changes",
463
726
  ".sdd/archive",
464
- ".sdd/templates"
727
+ ".sdd/templates",
728
+ ".claude",
729
+ ".claude/commands"
465
730
  ];
466
731
  for (const dir of directories) {
467
732
  const result = await ensureDir(path2.join(cwd, dir));
@@ -472,6 +737,7 @@ async function runInit(options) {
472
737
  }
473
738
  await createDefaultFiles(cwd);
474
739
  await copyTemplates(cwd);
740
+ await createClaudeCommands(cwd);
475
741
  success2("SDD \uD504\uB85C\uC81D\uD2B8\uAC00 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
476
742
  newline();
477
743
  info("\uC0DD\uC131\uB41C \uAD6C\uC870:");
@@ -482,10 +748,21 @@ async function runInit(options) {
482
748
  listItem("changes/", 1);
483
749
  listItem("archive/", 1);
484
750
  listItem("templates/", 1);
751
+ listItem(".claude/");
752
+ listItem("commands/", 1);
753
+ newline();
754
+ info("Claude \uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC:");
755
+ listItem("/sdd-new - \uC0C8 \uAE30\uB2A5 \uBA85\uC138 \uC791\uC131");
756
+ listItem("/sdd-plan - \uAD6C\uD604 \uACC4\uD68D \uC791\uC131");
757
+ listItem("/sdd-tasks - \uC791\uC5C5 \uBD84\uD574");
758
+ listItem("/sdd-implement - \uAD6C\uD604 \uC9C4\uD589");
759
+ listItem("/sdd-validate - \uC2A4\uD399 \uAC80\uC99D");
760
+ listItem("/sdd-status - \uC0C1\uD0DC \uD655\uC778");
761
+ listItem("/sdd-change - \uBCC0\uACBD \uC81C\uC548");
485
762
  newline();
486
763
  info("\uB2E4\uC74C \uB2E8\uACC4:");
487
764
  listItem("constitution.md\uB97C \uC218\uC815\uD558\uC5EC \uD504\uB85C\uC81D\uD2B8 \uC6D0\uCE59\uC744 \uC815\uC758\uD558\uC138\uC694");
488
- listItem("`sdd validate`\uB85C \uC2A4\uD399\uC744 \uAC80\uC99D\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");
765
+ listItem("/sdd-new \uB85C \uCCAB \uBC88\uC9F8 \uAE30\uB2A5 \uBA85\uC138\uB97C \uC791\uC131\uD558\uC138\uC694");
489
766
  }
490
767
  async function createDefaultFiles(cwd) {
491
768
  const projectName = path2.basename(cwd);
@@ -709,6 +986,15 @@ graph LR
709
986
  await writeFile(path2.join(cwd, ".sdd", "templates", "delta.md"), deltaTemplate);
710
987
  await writeFile(path2.join(cwd, ".sdd", "templates", "tasks.md"), tasksTemplate);
711
988
  }
989
+ async function createClaudeCommands(cwd) {
990
+ const commands = generateClaudeCommands();
991
+ for (const cmd of commands) {
992
+ await writeFile(
993
+ path2.join(cwd, ".claude", "commands", `${cmd.name}.md`),
994
+ cmd.content
995
+ );
996
+ }
997
+ }
712
998
 
713
999
  // src/cli/commands/validate.ts
714
1000
  import path4 from "path";