@simplysm/sd-claude 14.0.65 → 14.0.66
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/references/sd-requirement-source-handling.md +64 -0
- package/claude/references/sd-simplysm14/README.md +44 -40
- package/claude/references/sd-simplysm14/apis/angular/README.md +95 -0
- package/claude/references/sd-simplysm14/apis/angular/app-structure.md +49 -0
- package/claude/references/sd-simplysm14/apis/angular/buttons.md +42 -0
- package/claude/references/sd-simplysm14/apis/angular/crud.md +35 -0
- package/claude/references/sd-simplysm14/apis/angular/forms.md +63 -0
- package/claude/references/sd-simplysm14/apis/angular/infrastructure.md +80 -0
- package/claude/references/sd-simplysm14/apis/angular/kanban.md +33 -0
- package/claude/references/sd-simplysm14/apis/angular/layout.md +41 -0
- package/claude/references/sd-simplysm14/apis/angular/modal.md +63 -0
- package/claude/references/sd-simplysm14/apis/angular/routing.md +45 -0
- package/claude/references/sd-simplysm14/apis/angular/select-dropdown.md +35 -0
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +50 -0
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +42 -0
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +52 -0
- package/claude/references/sd-simplysm14/apis/angular/toast.md +46 -0
- package/claude/references/sd-simplysm14/apis/angular/visual.md +41 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +76 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +83 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +80 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +39 -0
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +112 -0
- package/claude/references/sd-simplysm14/apis/core-common/README.md +53 -0
- package/claude/references/sd-simplysm14/apis/core-common/extensions.md +123 -0
- package/claude/references/sd-simplysm14/apis/core-common/features.md +46 -0
- package/claude/references/sd-simplysm14/apis/core-common/types.md +114 -0
- package/claude/references/sd-simplysm14/apis/core-common/utils.md +158 -0
- package/claude/references/sd-simplysm14/apis/core-node/README.md +12 -0
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +64 -0
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +52 -0
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +53 -0
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +81 -0
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +55 -0
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +111 -0
- package/claude/references/sd-simplysm14/apis/excel/README.md +81 -0
- package/claude/references/sd-simplysm14/apis/lint/README.md +80 -0
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +33 -0
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +77 -0
- package/claude/references/sd-simplysm14/apis/orm-common/executable.md +20 -0
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +92 -0
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +98 -0
- package/claude/references/sd-simplysm14/apis/orm-common/schema-builders.md +128 -0
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +59 -0
- package/claude/references/sd-simplysm14/apis/sd-claude/README.md +9 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +50 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config.md +155 -0
- package/claude/references/sd-simplysm14/apis/service-client/README.md +92 -0
- package/claude/references/sd-simplysm14/apis/service-common/README.md +29 -0
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +63 -0
- package/claude/references/sd-simplysm14/apis/service-common/messages.md +56 -0
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +64 -0
- package/claude/references/sd-simplysm14/apis/service-common/service-types.md +43 -0
- package/claude/references/sd-simplysm14/apis/service-server/README.md +20 -0
- package/claude/references/sd-simplysm14/apis/service-server/auth.md +31 -0
- package/claude/references/sd-simplysm14/apis/service-server/builtin-services.md +47 -0
- package/claude/references/sd-simplysm14/apis/service-server/define-service.md +71 -0
- package/claude/references/sd-simplysm14/apis/service-server/internals.md +41 -0
- package/claude/references/sd-simplysm14/apis/service-server/server.md +66 -0
- package/claude/references/sd-simplysm14/apis/storage/README.md +69 -0
- package/claude/references/sd-simplysm14/{client-component.md → manuals/client-component.md} +133 -128
- package/claude/references/sd-simplysm14/manuals/client-crud.md +102 -0
- package/claude/references/sd-simplysm14/manuals/client-demo.md +128 -0
- package/claude/references/sd-simplysm14/manuals/client-rules.md +7 -0
- package/claude/references/sd-simplysm14/{client-setup.md → manuals/client-setup.md} +2 -2
- package/claude/references/sd-simplysm14/{client-tab.md → manuals/client-tab.md} +13 -11
- package/claude/references/sd-simplysm14/{orm-union.md → manuals/orm-union.md} +1 -1
- package/claude/references/sd-simplysm14/manuals/orm.md +75 -0
- package/claude/rules/sd-base-rules.md +172 -79
- package/claude/sd-check-bash.py +5 -0
- package/claude/sd-statusline.py +7 -12
- package/claude/skills/sd-commit/SKILL.md +7 -3
- package/claude/skills/sd-demo/SKILL.md +81 -62
- package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +42 -0
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +75 -0
- package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/golden.jsonl +5 -3
- package/claude/skills/sd-dev/SKILL.md +33 -63
- package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/golden.jsonl +3 -3
- package/claude/skills/sd-docs/SKILL.md +53 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +7 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +3 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +6 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +1 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +8 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +7 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +3 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +3 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +6 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +1 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +8 -0
- package/claude/skills/sd-docs/evals/golden.jsonl +2 -0
- package/claude/skills/sd-docs/references/subagent-prompt.md +100 -0
- package/claude/skills/sd-impl/SKILL.md +125 -46
- package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/250/353/215/270.txt +1 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.txt +1 -0
- package/claude/skills/sd-impl/evals/golden.jsonl +2 -3
- package/claude/skills/sd-skill/SKILL.md +3 -3
- package/claude/skills/sd-skill/evals/golden.jsonl +0 -1
- package/claude/skills/sd-skill/references/eval-authoring.md +15 -0
- package/claude/skills/sd-skill/references/eval-run.md +1 -1
- package/claude/skills/sd-skill/references/skill-authoring.md +8 -5
- package/claude/skills/sd-skill/scripts/run_eval.py +39 -60
- package/claude/skills/sd-spec/SKILL.md +163 -105
- package/claude/skills/sd-spec/references/example-spec.md +585 -0
- package/claude/skills/sd-spec/references/spec-authoring.md +287 -0
- package/claude/skills/sd-spec/references/spec-md-template.md +15 -93
- package/claude/skills/sd-unpack/SKILL.md +7 -1
- package/claude/skills/sd-unpack/scripts/handlers/_common.py +10 -0
- package/claude/skills/sd-unpack/scripts/handlers/eml_handler.py +5 -13
- package/claude/skills/sd-unpack/scripts/handlers/msg_handler.py +3 -12
- package/claude/skills/sd-unpack/scripts/handlers/office_com.py +23 -37
- package/claude/skills/sd-unpack/scripts/handlers/office_worker.py +1 -4
- package/claude/skills/sd-unpack/scripts/handlers/pdf_handler.py +4 -13
- package/claude/skills/sd-unpack/scripts/unpack.py +4 -4
- package/claude/skills/sd-use/SKILL.md +1 -0
- package/claude/skills/sd-wip/SKILL.md +38 -0
- package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/_wip.md +3 -0
- package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/spec.md +15 -0
- package/claude/skills/sd-wip/evals/fixtures/with-existing-wip/.wips/260101120000_acct.md +6 -0
- package/claude/skills/sd-wip/evals/fixtures/with-existing-wip-for-compact/.wips/260101120000_acct.md +14 -0
- package/claude/skills/sd-wip/evals/golden.jsonl +4 -0
- package/claude/skills/sd-wip/references/compact.md +79 -0
- package/package.json +1 -1
- package/claude/references/sd-simplysm14/orm.md +0 -11
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -27
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/overview.md +0 -12
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Button.tsx +0 -12
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Input.tsx +0 -27
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -25
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/overview.md +0 -12
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/components/Input.tsx +0 -25
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-001-RTP/354/236/205/353/240/245/355/231/224/353/251/264/spec.md +0 -19
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-002-RTP/354/266/234/353/240/245/355/231/224/353/251/264/spec.md +0 -20
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/overview.md +0 -16
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Button.tsx +0 -6
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Input.tsx +0 -15
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-demo/references/demo-md-template.md +0 -92
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260301_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/232/224/354/262/255.eml +0 -5
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260305_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/354/232/224/354/262/255.eml +0 -6
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260310_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234.eml +0 -6
- package/claude/skills/sd-dev/evals/fixtures/single-req-auto-chain/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/start-from-plan/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-dev/evals/fixtures/start-from-plan/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/plan.md +0 -28
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -14
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/components/Input.tsx +0 -6
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/plan.md +0 -40
- package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/spec.md +0 -13
- package/claude/skills/sd-impl/evals/fixtures/multi-r/src/components/Input.tsx +0 -25
- package/claude/skills/sd-impl/evals/fixtures/multi-r/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -26
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-impl/references/impl-md-template.md +0 -87
- package/claude/skills/sd-impl/references/modes-and-failure.md +0 -65
- package/claude/skills/sd-plan/SKILL.md +0 -130
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -14
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/api/user.ts +0 -13
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/components/Input.tsx +0 -15
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/pages/UserList.tsx +0 -29
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -17
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/components/Input.tsx +0 -6
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/DEMO-001-/352/261/260/353/236/230/354/262/230/demo.md +0 -26
- package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -15
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/components/Input.tsx +0 -25
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/data/mock-customer.ts +0 -16
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/pages/CustomerList.tsx +0 -25
- package/claude/skills/sd-plan/evals/golden.jsonl +0 -3
- package/claude/skills/sd-plan/references/plan-md-template.md +0 -138
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260122_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/260/234/354/204/240/354/232/224/354/262/255.eml +0 -20
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260205_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/355/231/224/353/251/264/352/264/200/353/240/250.eml +0 -17
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260301_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234/354/262/264/352/263/204.eml +0 -18
- package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs/20260317_/352/263/240/352/260/235/354/202/254_/352/270/264/352/270/211/354/262/230/353/246/254/353/260/251/354/271/250.eml +0 -17
- package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs//355/232/214/354/235/230/353/214/200/353/263/270_20260320.txt +0 -13
- package/claude/skills/sd-spec/evals/fixtures/direct-simple/.gitkeep +0 -0
- package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/REQ-001-test/spec.md +0 -19
- package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/overview.md +0 -18
- package/claude/skills/sd-spec/evals/golden.jsonl +0 -4
- package/claude/skills/sd-spec/references/overview-md-template.md +0 -89
- package/claude/skills/sd-spec/references/raw-input-handling.md +0 -96
- package/claude/skills/sd-verify/SKILL.md +0 -96
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/impl.md +0 -20
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -14
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.test.ts +0 -11
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.ts +0 -7
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/impl.md +0 -21
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/plan.md +0 -21
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/src/pages/UserList.tsx +0 -19
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/impl.md +0 -19
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/plan.md +0 -14
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.test.ts +0 -10
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.ts +0 -7
- package/claude/skills/sd-verify/evals/golden.jsonl +0 -3
- package/claude/skills/sd-verify/references/verify-md-template.md +0 -99
- /package/claude/skills/{sd-demo/evals/fixtures/basic-single-req/src/pages → sd-wip/evals/fixtures/empty}/.gitkeep +0 -0
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# REQ-001-입고지시서긴급표시 / Plan
|
|
2
|
-
|
|
3
|
-
## 메타
|
|
4
|
-
- 상태: planned
|
|
5
|
-
- 생성일: 2026-05-03
|
|
6
|
-
- 마지막 갱신: 2026-05-03
|
|
7
|
-
- 결과: proceed
|
|
8
|
-
|
|
9
|
-
## 결과 사유
|
|
10
|
-
proceed — R1 미구현, 신규 페이지 + 체크박스 추가 필요.
|
|
11
|
-
|
|
12
|
-
## R 단위 계획
|
|
13
|
-
- [ ] R1: 입고지시서 화면 헤더 우측에 "긴급" 체크박스 추가
|
|
14
|
-
- **현황**: 미구현 (입고지시서 페이지 자체가 없음)
|
|
15
|
-
- **변경 위치**:
|
|
16
|
-
- `src/pages/InboundOrder.tsx` (신설) - `InboundOrderForm` 컴포넌트
|
|
17
|
-
- **변경 방식**:
|
|
18
|
-
- 입고지시서 폼 화면 신설. 헤더 우측에 `<Checkbox label="긴급" />` 배치, formState.urgent와 연동.
|
|
19
|
-
- **테스트**:
|
|
20
|
-
- 방식: 사후 테스트 (UI 변경)
|
|
21
|
-
- 케이스: 체크박스 클릭 → 상태 토글 확인
|
|
22
|
-
|
|
23
|
-
## 작업 순서
|
|
24
|
-
- 의존: 없음 (R1 단독)
|
|
25
|
-
- 권장 순서: R1
|
|
26
|
-
|
|
27
|
-
## 통합/E2E 테스트
|
|
28
|
-
- 입고지시서 폼 진입 → 긴급 체크박스 표시 확인 → 클릭 → 체크 상태 변화 확인
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
// 디자인 시스템 stub
|
|
2
|
-
import React from 'react'
|
|
3
|
-
|
|
4
|
-
export const Checkbox: React.FC<{ checked: boolean; onChange: (v: boolean) => void; label?: string }> = ({ checked, onChange, label }) => {
|
|
5
|
-
return <label><input type="checkbox" checked={checked} onChange={(e) => onChange(e.target.checked)} /> {label}</label>
|
|
6
|
-
}
|
|
File without changes
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# REQ-001-거래처목록 / Plan
|
|
2
|
-
|
|
3
|
-
## 메타
|
|
4
|
-
- 상태: planned
|
|
5
|
-
- 결과: proceed
|
|
6
|
-
|
|
7
|
-
## 결과 사유
|
|
8
|
-
proceed — 모두 미구현, 신규 페이지 + 데이터 + 로직 추가 필요.
|
|
9
|
-
|
|
10
|
-
## R 단위 계획
|
|
11
|
-
- [ ] R1: 거래처 목록 표시 (이름/사업자번호/담당자/연락처)
|
|
12
|
-
- **현황**: 미구현
|
|
13
|
-
- **변경 위치**:
|
|
14
|
-
- `src/pages/CustomerList.tsx` (신설) - `CustomerList` 컴포넌트
|
|
15
|
-
- `src/data/customers.ts` (신설) - 샘플 데이터
|
|
16
|
-
- **변경 방식**: Table 컴포넌트로 4개 컬럼 표시
|
|
17
|
-
- **테스트**: 사후 (UI 변경)
|
|
18
|
-
|
|
19
|
-
- [ ] R2: 거래처명 검색
|
|
20
|
-
- **현황**: 미구현
|
|
21
|
-
- **변경 위치**:
|
|
22
|
-
- `src/pages/CustomerList.tsx` - `CustomerList` 검색 로직 추가
|
|
23
|
-
- `src/lib/customer-filter.ts` (신설) - 필터 함수
|
|
24
|
-
- **변경 방식**: Input으로 검색어 받고, 부분 일치 필터링
|
|
25
|
-
- **테스트**: TDD (필터 함수 단위 테스트)
|
|
26
|
-
|
|
27
|
-
- [ ] R3: 페이지네이션 (한 페이지 20건)
|
|
28
|
-
- **현황**: 미구현
|
|
29
|
-
- **변경 위치**:
|
|
30
|
-
- `src/pages/CustomerList.tsx` - 페이지네이션 로직
|
|
31
|
-
- `src/lib/paginate.ts` (신설) - 페이지 분할 함수
|
|
32
|
-
- **변경 방식**: 20건씩 슬라이스, Pagination 컴포넌트 사용
|
|
33
|
-
- **테스트**: TDD (페이지 함수 단위 테스트)
|
|
34
|
-
|
|
35
|
-
## 작업 순서
|
|
36
|
-
- 의존: R3는 R2(필터 결과)에 의존
|
|
37
|
-
- 권장 순서: R1 → R2 → R3
|
|
38
|
-
|
|
39
|
-
## 통합/E2E 테스트
|
|
40
|
-
- 목록 진입 → 검색 → 결과 페이지네이션 동작 확인
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// 디자인 시스템 stub
|
|
2
|
-
import React from 'react'
|
|
3
|
-
|
|
4
|
-
export const Input: React.FC<{ value: string; onChange: (v: string) => void; placeholder?: string }> = ({ value, onChange, placeholder }) => {
|
|
5
|
-
return <input value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} />
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const Table: React.FC<{ rows: any[]; columns: { key: string; label: string }[] }> = ({ rows, columns }) => {
|
|
9
|
-
return (
|
|
10
|
-
<table>
|
|
11
|
-
<thead><tr>{columns.map((c) => <th key={c.key}>{c.label}</th>)}</tr></thead>
|
|
12
|
-
<tbody>{rows.map((r, i) => <tr key={i}>{columns.map((c) => <td key={c.key}>{r[c.key]}</td>)}</tr>)}</tbody>
|
|
13
|
-
</table>
|
|
14
|
-
)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const Pagination: React.FC<{ page: number; total: number; onChange: (p: number) => void }> = ({ page, total, onChange }) => {
|
|
18
|
-
return (
|
|
19
|
-
<div>
|
|
20
|
-
<button onClick={() => onChange(page - 1)}>이전</button>
|
|
21
|
-
<span>{page} / {total}</span>
|
|
22
|
-
<button onClick={() => onChange(page + 1)}>다음</button>
|
|
23
|
-
</div>
|
|
24
|
-
)
|
|
25
|
-
}
|
|
File without changes
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# REQ-001-할인계산 / Plan
|
|
2
|
-
|
|
3
|
-
## 메타
|
|
4
|
-
- 상태: planned
|
|
5
|
-
- 결과: proceed
|
|
6
|
-
|
|
7
|
-
## 결과 사유
|
|
8
|
-
proceed — 비즈니스 로직 신규 구현 필요.
|
|
9
|
-
|
|
10
|
-
## R 단위 계획
|
|
11
|
-
- [ ] R1: 할인율 계산 함수 (금액별 차등)
|
|
12
|
-
- **현황**: 미구현
|
|
13
|
-
- **변경 위치**:
|
|
14
|
-
- `src/lib/discount.ts` (신설) - `calcDiscountRate(amount: number): number` 함수
|
|
15
|
-
- **변경 방식**:
|
|
16
|
-
- 100만원 이상: 0.15 / 50만원 이상: 0.10 / 10만원 이상: 0.05 / 그 외: 0
|
|
17
|
-
- 큰 구간부터 비교
|
|
18
|
-
- **테스트**:
|
|
19
|
-
- **방식: TDD** (순수 함수, 비즈니스 로직)
|
|
20
|
-
- 케이스: 0원, 99999원, 100000원, 499999원, 500000원, 999999원, 1000000원
|
|
21
|
-
|
|
22
|
-
## 작업 순서
|
|
23
|
-
- 의존: 없음
|
|
24
|
-
|
|
25
|
-
## 통합/E2E 테스트
|
|
26
|
-
- 단위 함수만 있으므로 통합 시나리오 X (단위 테스트로 충분)
|
|
File without changes
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# impl.md 템플릿
|
|
2
|
-
|
|
3
|
-
위치: `.specs/{yyMMdd_HHmmss}/REQ-XXX-슬러그/impl.md`
|
|
4
|
-
|
|
5
|
-
## 템플릿
|
|
6
|
-
|
|
7
|
-
```markdown
|
|
8
|
-
# REQ-001-슬러그 / Implementation
|
|
9
|
-
|
|
10
|
-
## 메타
|
|
11
|
-
- 상태: implementing | implemented
|
|
12
|
-
- 생성일: YYYY-MM-DD
|
|
13
|
-
- 마지막 갱신: YYYY-MM-DD
|
|
14
|
-
|
|
15
|
-
## R 단위 구현 결과
|
|
16
|
-
|
|
17
|
-
### R1: <요구 제목>
|
|
18
|
-
- **상태**: 진행중 | 완료 | 막힘 | 보류
|
|
19
|
-
- **모드**: TDD | 사후 | 생략
|
|
20
|
-
- **변경 파일**:
|
|
21
|
-
- `<파일경로>`
|
|
22
|
-
- 변경 함수: `<함수/컴포넌트명>`
|
|
23
|
-
- 변경 종류: 추가 | 수정 | 삭제 | 신설
|
|
24
|
-
- **테스트**:
|
|
25
|
-
- 추가/수정: `<테스트 파일>`
|
|
26
|
-
- 케이스: <케이스 이름들>
|
|
27
|
-
- 결과: PASS / FAIL
|
|
28
|
-
- **plan 대비 차이**: 없음 | <차이 설명>
|
|
29
|
-
- **변경 의도**: spec.md R1 + plan.md R1 그대로 | <사유>
|
|
30
|
-
- **이슈/결정**: (있을 때만) <막힘/시도/결정 기록>
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 섹션별 역할
|
|
34
|
-
|
|
35
|
-
| 섹션 | 용도 |
|
|
36
|
-
|---|---|
|
|
37
|
-
| `## 메타` | 상태 |
|
|
38
|
-
| `## R 단위 구현 결과` | R별 상태/모드/변경/테스트/차이/의도 인라인 통합 |
|
|
39
|
-
|
|
40
|
-
## R 항목 내부 요소
|
|
41
|
-
|
|
42
|
-
| 요소 | 의미 |
|
|
43
|
-
|---|---|
|
|
44
|
-
| **상태** | `완료` / `진행중` / `막힘` / `보류` (종료 시엔 모두 `완료`) |
|
|
45
|
-
| **모드** | TDD / 사후 / 생략 |
|
|
46
|
-
| **변경 파일** | 파일 경로 + 변경 함수 + 변경 종류 (라인 번호 X) |
|
|
47
|
-
| **테스트** | 추가/수정 테스트 + 케이스 + 결과 |
|
|
48
|
-
| **plan 대비 차이** | 계획 vs 실제 (verify가 활용) |
|
|
49
|
-
| **변경 의도** | 자명하면 "그대로", 자명하지 않으면 사유 |
|
|
50
|
-
| **이슈/결정** | (있을 때만) 막힘 상황, 시도 횟수, 결정 |
|
|
51
|
-
|
|
52
|
-
`plan 대비 차이`가 "없음"이 아니거나 `이슈/결정`에 결정이 발생한 경우, 결정 출처를 `근거:` 줄로 명시한다.
|
|
53
|
-
|
|
54
|
-
## 예시
|
|
55
|
-
|
|
56
|
-
```markdown
|
|
57
|
-
### R1: 입고지시서 화면에 "긴급" 체크박스 추가
|
|
58
|
-
- **상태**: 완료
|
|
59
|
-
- **모드**: 사후 테스트
|
|
60
|
-
- **변경 파일**:
|
|
61
|
-
- `src/pages/InboundOrder.tsx`
|
|
62
|
-
- 변경 함수: `InboundOrderForm`
|
|
63
|
-
- 변경 종류: 추가 (Checkbox 컴포넌트, formState.urgent 연동)
|
|
64
|
-
- **테스트**:
|
|
65
|
-
- 추가: `src/pages/InboundOrder.test.tsx`
|
|
66
|
-
- 케이스: "체크박스 클릭 → 저장 → 재조회 시 상태 유지"
|
|
67
|
-
- 결과: PASS (1/1)
|
|
68
|
-
- **plan 대비 차이**: 없음
|
|
69
|
-
- **변경 의도**: spec.md R1 + plan.md R1 그대로
|
|
70
|
-
|
|
71
|
-
### R3: 권한 체크 추가
|
|
72
|
-
- **상태**: 완료
|
|
73
|
-
- **모드**: TDD
|
|
74
|
-
- **변경 파일**:
|
|
75
|
-
- `src/contexts/PermissionContext.tsx` (신설)
|
|
76
|
-
- **테스트**:
|
|
77
|
-
- 추가: `src/contexts/PermissionContext.test.tsx`
|
|
78
|
-
- 케이스: "권한 있는 사용자 → true" / "권한 없는 사용자 → false"
|
|
79
|
-
- 결과: PASS (2/2)
|
|
80
|
-
- **plan 대비 차이**: PermissionContext 신설 (plan은 기존 hasPermission 가정)
|
|
81
|
-
- 근거: 사용자 답변 (2026-05-04)
|
|
82
|
-
- **이슈/결정**:
|
|
83
|
-
- 이슈: hasPermission 패턴이 사용 안 되고 있음 발견
|
|
84
|
-
- 시도: 1회
|
|
85
|
-
- 결정: PermissionContext 신설
|
|
86
|
-
- 근거: 사용자 답변 (2026-05-04)
|
|
87
|
-
```
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# 모드별 표준 흐름 + 막힘 처리
|
|
2
|
-
|
|
3
|
-
## 모드별 표준 흐름
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
### TDD (비즈니스 로직, 알고리즘)
|
|
7
|
-
```
|
|
8
|
-
1. 실패하는 테스트 작성 (RED)
|
|
9
|
-
2. 테스트 실행 → 실패 확인
|
|
10
|
-
3. 통과하는 최소 코드 (GREEN)
|
|
11
|
-
4. 테스트 실행 → 통과 확인
|
|
12
|
-
5. 정리 (REFACTOR)
|
|
13
|
-
6. 테스트 재실행 → 통과 유지
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
### 사후 테스트 (UI, 외부 API)
|
|
17
|
-
```
|
|
18
|
-
1. 코드 작성
|
|
19
|
-
2. 동작 확인
|
|
20
|
-
3. 테스트 작성
|
|
21
|
-
4. 테스트 실행 → 통과 확인
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### 생략 (마이그레이션, 일회성 스크립트)
|
|
25
|
-
```
|
|
26
|
-
1. 코드 작성
|
|
27
|
-
2. 타입체크/린트 통과 확인
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### 모드 변경 정책
|
|
31
|
-
|
|
32
|
-
implement 도중 "이 R은 plan과 다른 모드 적합" 판단되면:
|
|
33
|
-
- **자동 변경 금지**. 사용자에게 Q → 승인 받으면 변경 + impl.md `이슈/결정` 기록.
|
|
34
|
-
|
|
35
|
-
## 막힘 처리
|
|
36
|
-
|
|
37
|
-
### 자동 시도
|
|
38
|
-
단순 에러(타입/린트/단순 테스트 실패)는 **자동 N=2회 시도**:
|
|
39
|
-
- 성공 → 다음 단계, impl.md `이슈/결정`에 "N회 시도 후 해결" 기록
|
|
40
|
-
- 실패 → 종류별 분기 (아래)
|
|
41
|
-
|
|
42
|
-
### 막힘 종류 (4가지)
|
|
43
|
-
|
|
44
|
-
| 종류 | 예시 | 처리 |
|
|
45
|
-
|---|---|---|
|
|
46
|
-
| 단순 에러 | 타입/린트/단순 테스트 실패 | 자동 N=2회 |
|
|
47
|
-
| 코드 문제 | 회귀 검증 실패, 비단순 테스트 실패 | impl.md `상태: 막힘` + Q (해결 방안) |
|
|
48
|
-
| 계획 문제 | plan.md ↔ 실제 코드 모순 | impl.md `상태: 보류` + plan 재진입 알림 |
|
|
49
|
-
| 정보 부족 | 패턴 모름, 옵션 선택 필요 | impl.md `상태: 막힘` + Q (정보 요청) |
|
|
50
|
-
|
|
51
|
-
### 사용자 답변 후
|
|
52
|
-
|
|
53
|
-
- 해결 방안 적용 → 다음 시도
|
|
54
|
-
- 우회 → 적용 + impl.md `결정` 기록
|
|
55
|
-
- 중단 → implement 단계 중단, plan 재진입
|
|
56
|
-
|
|
57
|
-
### 계획 재진입 절차
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
1. impl.md `상태: 보류` + 사유 기록
|
|
61
|
-
2. plan.md 메타 `상태: re-planning`
|
|
62
|
-
3. 사용자 알림 ("implement 중 X 발견. plan 재토론 필요")
|
|
63
|
-
4. plan 재진입 → 변경된 부분만 재계획 → 새 체크포인트
|
|
64
|
-
5. implement 재개 (보류된 R만 재구현)
|
|
65
|
-
```
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sd-plan
|
|
3
|
-
description: spec.md(요구사항)를 기존 코드베이스에 매핑하고 R별 변경 계획(위치/방식/테스트)과 작업 순서를 plan.md로 작성하는 스킬. Use when spec 단계 후 implement 진입 전, 변경 계획 수립이 필요할 때
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# plan 단계
|
|
7
|
-
|
|
8
|
-
대상 spec.md 및 관련 자료를 읽고 → 현황 매핑 + 변경 계획 (R별 변경 위치/방식/테스트 + R 간 작업 순서).
|
|
9
|
-
|
|
10
|
-
## 산출물
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
.specs/{yyMMdd_HHmmss}/REQ-XXX-슬러그/
|
|
14
|
-
spec.md ← 입력 (이미 존재)
|
|
15
|
-
plan.md ← 본 단계 산출물
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 워크플로
|
|
19
|
-
|
|
20
|
-
1. 입력: 대상 REQ ID
|
|
21
|
-
|
|
22
|
-
2. 읽기: 대상 spec.md + overview.md + raw input(있으면) + 관련 타 spec.md 및 plan.md + 기존 코드베이스
|
|
23
|
-
- 특히 "spec.md, overview.md, raw input(있으면), 관련 타 spec.md 및 plan.md"는 반드시 통독할것
|
|
24
|
-
|
|
25
|
-
3. 초안 plan.md 작성 (템플릿: [references/plan-md-template.md](references/plan-md-template.md))
|
|
26
|
-
- **R별 현황 매핑** (4단계: 구현/부분/미구현/차이있음)
|
|
27
|
-
- **R별 설계** (R 성격별 조건부 — 아래 "R 성격별 설계 정보" 참조)
|
|
28
|
-
- **R별 변경 위치** (파일 경로 + 함수/컴포넌트 이름. 라인 번호 X)
|
|
29
|
-
- **R별 변경 방식** (자연어. 복잡한 로직만 의사코드)
|
|
30
|
-
- **R별 테스트** (방식: TDD/사후/생략 + 케이스)
|
|
31
|
-
- **작업 순서** (R 간 의존성, 권장 순서, 병렬 가능 여부)
|
|
32
|
-
- **통합/E2E 테스트** (R 간 흐름)
|
|
33
|
-
- **결과** 메타 필드 (`proceed` | `skip-to-verify`)
|
|
34
|
-
- 결정 근거 없는 부분 → Q. 모든 결정은 plan.md에 근거 출처 명시.
|
|
35
|
-
|
|
36
|
-
4. Q 다이얼로그 (한 번에 하나씩) → 사용자 답변 → 즉시 plan.md 갱신
|
|
37
|
-
- **spec 모순 발견 시**: Q로 알림 → 사용자 답변 받아 spec.md 수정 + spec.md 메타 `이력` 기록 → 변경된 R 부분만 재계획. plan 단계 종료 X.
|
|
38
|
-
|
|
39
|
-
5. Q 0개 도달 시 종료 절차:
|
|
40
|
-
```
|
|
41
|
-
loop:
|
|
42
|
-
plan.md 전체 재검토 (R별 현황/변경 위치/방식 정합성 / 누락 결정거리 / 작업 순서 / 테스트 모드 / 모호 표현 / 미해결 의존)
|
|
43
|
-
if 신규 Q 등록됨:
|
|
44
|
-
"Q 다이얼로그" 재진입 → Q 0 도달
|
|
45
|
-
continue
|
|
46
|
-
break
|
|
47
|
-
|
|
48
|
-
loop:
|
|
49
|
-
역방향 문서 검토 (overview, spec, demo)
|
|
50
|
-
if 신규 모순/수정 등록됨:
|
|
51
|
-
"Q 다이얼로그" 재진입 → Q 0 도달
|
|
52
|
-
continue
|
|
53
|
-
break
|
|
54
|
-
|
|
55
|
-
산출물 소비자 친화적 보고
|
|
56
|
-
상태 ← planned
|
|
57
|
-
```
|
|
58
|
-
- 보고: 산출물 소비자가 그대로 읽어도 의도가 전달되는 수준 자연어. REQ 차원 "어디를 어떻게 바꿀지" 요약 (R별 변경 위치/방식 핵심) + 작업 순서 + 결과. 기술 용어 최소화 (단, 파일·함수명 같은 위치 식별자는 필요). 안내 텍스트라 별도 사용자 승인 게이트 X.
|
|
59
|
-
|
|
60
|
-
## 현황 분류 (4단계)
|
|
61
|
-
|
|
62
|
-
| 분류 | 의미 |
|
|
63
|
-
|---|---|
|
|
64
|
-
| **구현** | spec R 의도가 코드에 이미 반영됨 |
|
|
65
|
-
| **부분** | R 일부만 구현됨 (예: UI는 있으나 로직 없음) |
|
|
66
|
-
| **미구현** | 관련 코드 없음 |
|
|
67
|
-
| **차이있음** | 구현되어 있으나 R 의도와 불일치 |
|
|
68
|
-
|
|
69
|
-
## 변경 계획 입도
|
|
70
|
-
|
|
71
|
-
- **변경 위치**: 파일 경로 + 함수/컴포넌트 이름 (라인 번호 X — 코드 변경에 취약)
|
|
72
|
-
- **변경 방식**: 자연어. 복잡한 로직(상태 머신, 알고리즘)만 의사코드. 완전한 코드 스니펫 X (implement 단계 의미 무력화)
|
|
73
|
-
|
|
74
|
-
## R 성격별 설계 정보
|
|
75
|
-
|
|
76
|
-
R의 성격에 따라 "변경 위치/방식"만으로는 산출물 소비자가 그림을 그릴 수 없는 경우가 있다. 아래 표에 해당하는 R은 **설계** 서브섹션을 추가한다. 단순 변경(예: 색상/문구/상수 값)은 생략한다.
|
|
77
|
-
|
|
78
|
-
| R 성격 | 설계 서브섹션 내용 |
|
|
79
|
-
|---|---|
|
|
80
|
-
| **UI** | 레이아웃(좌우 분할/배치/주요 영역), 사용자 이벤트 흐름(클릭→모달→저장 같은 시퀀스), 상태 변화 |
|
|
81
|
-
| **API** | 엔드포인트(메서드+경로), 요청/응답 스키마, 에러 케이스, 인증/권한 |
|
|
82
|
-
| **데이터 모델** | 스키마 변경(테이블/컬럼/제약), 마이그레이션 전략, 기존 데이터 처리 |
|
|
83
|
-
| **외부 연동** | 호출 시퀀스, 실패/재시도/타임아웃 정책, 멱등성 |
|
|
84
|
-
| **단순 변경** | (생략) |
|
|
85
|
-
|
|
86
|
-
표현은 **자연어 우선**. 그림이 꼭 필요하면 짧은 ASCII 박스 허용하되 강제는 아님. 예: "좌측 목록 / 우측 상세 폼, 우상단 + 버튼 → 신규 등록 모달".
|
|
87
|
-
|
|
88
|
-
**demo 산출물이 있는 UI R**: 레이아웃/이벤트 흐름은 demo.md를 정본으로 삼고, plan에서는 "demo.md 참조" + plan에서 추가로 결정해야 할 부분만 짧게 적는다 (중복 작성 X).
|
|
89
|
-
|
|
90
|
-
## 테스트 모드 선택
|
|
91
|
-
|
|
92
|
-
**우선순위: TDD > 사후 테스트 > 생략**. 위에서부터 적용 가능 여부를 따져 가능한 **가장 높은** 모드를 고른다. 낮은 모드로 내려갈수록 테스트가 실제로 작성되지 않을 위험이 커지므로, 안일하게 떨어뜨리지 않는다.
|
|
93
|
-
|
|
94
|
-
| 모드 | 적용 조건 | 일반적인 R 성격 |
|
|
95
|
-
|---|---|---|
|
|
96
|
-
| **TDD** | 입력 → 출력을 코드로 단언 가능 | 비즈니스 로직, 알고리즘, 데이터 변환, 순수 함수, mock 가능한 외부 연동 |
|
|
97
|
-
| **사후 테스트** | TDD 불가하지만 동작 후 상태/응답을 코드로 단언 가능 | UI 동작, 실제 외부 API 응답, DB 변경 결과 |
|
|
98
|
-
| **생략** | 위 둘 다 불가하거나 검증 비용 대비 가치 낮음 | 일회성 스크립트, 단순 마이그레이션 |
|
|
99
|
-
|
|
100
|
-
판단 모호 → Q. 특히 "TDD로 끌어올릴 여지가 있나?"를 먼저 검토.
|
|
101
|
-
|
|
102
|
-
## 결과
|
|
103
|
-
|
|
104
|
-
| 결과 | 의미 | 다음 동작 |
|
|
105
|
-
|---|---|---|
|
|
106
|
-
| `proceed` | 변경할 R 있음 | implement 진행 |
|
|
107
|
-
| `skip-to-verify` | 모든 R 이미 구현됨 | verify 직행 |
|
|
108
|
-
|
|
109
|
-
(`back-to-spec` 분기는 없음. spec 모순은 plan 안에서 처리 후 계속.)
|
|
110
|
-
|
|
111
|
-
## 핵심 원칙
|
|
112
|
-
|
|
113
|
-
- self-contained 블록 (R 블록 안에 현황/변경/테스트 인라인)
|
|
114
|
-
- raw input 불변
|
|
115
|
-
- ID 불변
|
|
116
|
-
- 자동 판단 금지: 결정 근거 없으면 Q 등록 (현황/모드 판단 포함). 모든 결정은 plan.md에 근거 출처 명시.
|
|
117
|
-
- 한 번에 하나씩 Q
|
|
118
|
-
|
|
119
|
-
## 안티패턴
|
|
120
|
-
|
|
121
|
-
- ❌ 라인 번호로 변경 위치 표기
|
|
122
|
-
- ❌ 변경 방식에 완전한 코드 스니펫
|
|
123
|
-
- ❌ 결정 근거 없는 추정을 Q 없이 단정
|
|
124
|
-
- ❌ R 단위 정보를 별도 섹션으로 분리 (self-contained 블록 깨짐)
|
|
125
|
-
- ❌ 작업 순서를 R 안에 적기 (R 간 관계는 별도 섹션)
|
|
126
|
-
- ❌ 마지막 Q 답변 직후 plan.md 전체 재검토 없이 planned 전환
|
|
127
|
-
- ❌ 역방향 검토 없이 planned 전환
|
|
128
|
-
- ❌ 단순 변경 R(색상/문구/상수)에 설계 서브섹션 추가
|
|
129
|
-
- ❌ demo.md가 있는 UI R인데 plan에 레이아웃/이벤트 흐름 중복 작성
|
|
130
|
-
- ❌ UI/API/데이터 모델/외부 연동 R인데 설계 서브섹션 누락
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// 실제 구현된 API 호출
|
|
2
|
-
export interface User {
|
|
3
|
-
id: string
|
|
4
|
-
name: string
|
|
5
|
-
email: string
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export async function fetchUsers(emailQuery?: string): Promise<User[]> {
|
|
9
|
-
const url = emailQuery ? `/api/users?email=${encodeURIComponent(emailQuery)}` : '/api/users'
|
|
10
|
-
const res = await fetch(url)
|
|
11
|
-
if (!res.ok) throw new Error('Failed to fetch users')
|
|
12
|
-
return res.json()
|
|
13
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// 디자인 시스템 stub
|
|
2
|
-
import React from 'react'
|
|
3
|
-
|
|
4
|
-
export const Input: React.FC<{ value: string; onChange: (v: string) => void; placeholder?: string }> = ({ value, onChange, placeholder }) => {
|
|
5
|
-
return <input value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} />
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const Table: React.FC<{ rows: any[]; columns: { key: string; label: string }[] }> = ({ rows, columns }) => {
|
|
9
|
-
return (
|
|
10
|
-
<table>
|
|
11
|
-
<thead><tr>{columns.map((c) => <th key={c.key}>{c.label}</th>)}</tr></thead>
|
|
12
|
-
<tbody>{rows.map((r, i) => <tr key={i}>{columns.map((c) => <td key={c.key}>{r[c.key]}</td>)}</tr>)}</tbody>
|
|
13
|
-
</table>
|
|
14
|
-
)
|
|
15
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// 이미 구현된 사용자 목록 화면 (실제 API 호출, 검색 동작)
|
|
2
|
-
import React, { useState, useEffect } from 'react'
|
|
3
|
-
import { Input, Table } from '../components/Input'
|
|
4
|
-
import { fetchUsers, User } from '../api/user'
|
|
5
|
-
|
|
6
|
-
export const UserList: React.FC = () => {
|
|
7
|
-
const [search, setSearch] = useState('')
|
|
8
|
-
const [users, setUsers] = useState<User[]>([])
|
|
9
|
-
const [loading, setLoading] = useState(false)
|
|
10
|
-
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
setLoading(true)
|
|
13
|
-
fetchUsers(search || undefined)
|
|
14
|
-
.then(setUsers)
|
|
15
|
-
.finally(() => setLoading(false))
|
|
16
|
-
}, [search])
|
|
17
|
-
|
|
18
|
-
const columns = [
|
|
19
|
-
{ key: 'name', label: '이름' },
|
|
20
|
-
{ key: 'email', label: '이메일' },
|
|
21
|
-
]
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<div>
|
|
25
|
-
<Input value={search} onChange={setSearch} placeholder="이메일 검색" />
|
|
26
|
-
{loading ? <p>로딩 중...</p> : <Table rows={users} columns={columns} />}
|
|
27
|
-
</div>
|
|
28
|
-
)
|
|
29
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# REQ-001-입고지시서긴급표시
|
|
2
|
-
|
|
3
|
-
## 메타
|
|
4
|
-
- 상태: specified
|
|
5
|
-
- 생성일: 2026-05-03
|
|
6
|
-
- 마지막 갱신: 2026-05-03
|
|
7
|
-
- 관련 영역: WMS / 입고관리
|
|
8
|
-
|
|
9
|
-
## 요약
|
|
10
|
-
입고지시서에 긴급 여부 표시 기능 추가.
|
|
11
|
-
|
|
12
|
-
## 세부 요구
|
|
13
|
-
- [ ] R1: 입고지시서 화면 헤더 우측에 "긴급" 체크박스 추가
|
|
14
|
-
- **A**: 디폴트 unchecked
|
|
15
|
-
|
|
16
|
-
- [ ] R2: 긴급 표시 PDF 빨간색 강조
|
|
17
|
-
- **A**: 빨간색은 #D32F2F
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
// 디자인 시스템 stub
|
|
2
|
-
import React from 'react'
|
|
3
|
-
|
|
4
|
-
export const Checkbox: React.FC<{ checked: boolean; onChange: (v: boolean) => void; label?: string }> = ({ checked, onChange, label }) => {
|
|
5
|
-
return <label><input type="checkbox" checked={checked} onChange={(e) => onChange(e.target.checked)} /> {label}</label>
|
|
6
|
-
}
|
|
File without changes
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# DEMO-001-거래처 / Demo
|
|
2
|
-
|
|
3
|
-
## 메타
|
|
4
|
-
- 상태: done
|
|
5
|
-
- 대상 REQ: REQ-001
|
|
6
|
-
- 생성일: 2026-05-03
|
|
7
|
-
- 마지막 갱신: 2026-05-03
|
|
8
|
-
- 라운드: 1
|
|
9
|
-
|
|
10
|
-
## 시나리오
|
|
11
|
-
1. 거래처 목록 화면 진입 → mock 데이터 표시
|
|
12
|
-
2. 검색창에 텍스트 입력 → 시각적 필터 (실제 검색 X)
|
|
13
|
-
3. 페이지네이션 버튼 클릭 → 다음 페이지 표시 (mock)
|
|
14
|
-
|
|
15
|
-
## 만든 파일
|
|
16
|
-
- `src/pages/CustomerList.tsx` (신규)
|
|
17
|
-
- `src/data/mock-customer.ts` (mock data)
|
|
18
|
-
|
|
19
|
-
## Mock Data 요약
|
|
20
|
-
- 위치: `src/data/mock-customer.ts`
|
|
21
|
-
- 샘플: 25건
|
|
22
|
-
|
|
23
|
-
## 산출물 소비자 피드백 라운드
|
|
24
|
-
### 라운드 1 (2026-05-03)
|
|
25
|
-
- **산출물 소비자 피드백**: OK
|
|
26
|
-
- **처리**: demo 종료
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// 디자인 시스템 stub
|
|
2
|
-
import React from 'react'
|
|
3
|
-
|
|
4
|
-
export const Input: React.FC<{ value: string; onChange: (v: string) => void; placeholder?: string }> = ({ value, onChange, placeholder }) => {
|
|
5
|
-
return <input value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} />
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const Table: React.FC<{ rows: any[]; columns: { key: string; label: string }[] }> = ({ rows, columns }) => {
|
|
9
|
-
return (
|
|
10
|
-
<table>
|
|
11
|
-
<thead><tr>{columns.map((c) => <th key={c.key}>{c.label}</th>)}</tr></thead>
|
|
12
|
-
<tbody>{rows.map((r, i) => <tr key={i}>{columns.map((c) => <td key={c.key}>{r[c.key]}</td>)}</tr>)}</tbody>
|
|
13
|
-
</table>
|
|
14
|
-
)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const Pagination: React.FC<{ page: number; total: number; onChange: (p: number) => void }> = ({ page, total, onChange }) => {
|
|
18
|
-
return (
|
|
19
|
-
<div>
|
|
20
|
-
<button onClick={() => onChange(page - 1)}>이전</button>
|
|
21
|
-
<span>{page} / {total}</span>
|
|
22
|
-
<button onClick={() => onChange(page + 1)}>다음</button>
|
|
23
|
-
</div>
|
|
24
|
-
)
|
|
25
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// MOCK DATA - replaced in implement stage
|
|
2
|
-
export interface Customer {
|
|
3
|
-
id: string
|
|
4
|
-
name: string
|
|
5
|
-
bizNumber: string
|
|
6
|
-
manager: string
|
|
7
|
-
phone: string
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export const MOCK_CUSTOMER_LIST: Customer[] = Array.from({ length: 25 }, (_, i) => ({
|
|
11
|
-
id: `c-${i + 1}`,
|
|
12
|
-
name: `샘플거래처 ${i + 1}`,
|
|
13
|
-
bizNumber: `123-45-${String(i).padStart(5, '0')}`,
|
|
14
|
-
manager: `담당자 ${i + 1}`,
|
|
15
|
-
phone: `010-0000-${String(i).padStart(4, '0')}`,
|
|
16
|
-
}))
|