oh-my-oop 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/MCP_STRUCTURE.md +301 -0
- package/README.md +167 -0
- package/SCOPE.md +27 -0
- package/dist/application/discovery.d.ts +133 -0
- package/dist/application/discovery.js +62 -0
- package/dist/application/discovery.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/collaborators.d.ts +2 -0
- package/dist/domain/collaborators.js +26 -0
- package/dist/domain/collaborators.js.map +1 -0
- package/dist/domain/ids.d.ts +4 -0
- package/dist/domain/ids.js +23 -0
- package/dist/domain/ids.js.map +1 -0
- package/dist/domain/model.d.ts +71 -0
- package/dist/domain/model.js +2 -0
- package/dist/domain/model.js.map +1 -0
- package/dist/domain/schemas.d.ts +213 -0
- package/dist/domain/schemas.js +79 -0
- package/dist/domain/schemas.js.map +1 -0
- package/dist/domain/stereotypes.d.ts +7 -0
- package/dist/domain/stereotypes.js +65 -0
- package/dist/domain/stereotypes.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/io/classStore.d.ts +9 -0
- package/dist/io/classStore.js +39 -0
- package/dist/io/classStore.js.map +1 -0
- package/dist/io/collaborationStore.d.ts +7 -0
- package/dist/io/collaborationStore.js +32 -0
- package/dist/io/collaborationStore.js.map +1 -0
- package/dist/io/design.d.ts +3 -0
- package/dist/io/design.js +22 -0
- package/dist/io/design.js.map +1 -0
- package/dist/io/designIndex.d.ts +6 -0
- package/dist/io/designIndex.js +49 -0
- package/dist/io/designIndex.js.map +1 -0
- package/dist/io/frontmatter.d.ts +8 -0
- package/dist/io/frontmatter.js +31 -0
- package/dist/io/frontmatter.js.map +1 -0
- package/dist/io/history.d.ts +10 -0
- package/dist/io/history.js +38 -0
- package/dist/io/history.js.map +1 -0
- package/dist/io/useCaseStore.d.ts +8 -0
- package/dist/io/useCaseStore.js +36 -0
- package/dist/io/useCaseStore.js.map +1 -0
- package/dist/io/workspace.d.ts +14 -0
- package/dist/io/workspace.js +82 -0
- package/dist/io/workspace.js.map +1 -0
- package/dist/oop/commands.d.ts +446 -0
- package/dist/oop/commands.js +319 -0
- package/dist/oop/commands.js.map +1 -0
- package/dist/oop/conformance.d.ts +16 -0
- package/dist/oop/conformance.js +30 -0
- package/dist/oop/conformance.js.map +1 -0
- package/dist/prompts/discovery.d.ts +2 -0
- package/dist/prompts/discovery.js +41 -0
- package/dist/prompts/discovery.js.map +1 -0
- package/dist/prompts/imagineWithoutController.d.ts +2 -0
- package/dist/prompts/imagineWithoutController.js +75 -0
- package/dist/prompts/imagineWithoutController.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/phasePressureTest.d.ts +2 -0
- package/dist/prompts/phasePressureTest.js +69 -0
- package/dist/prompts/phasePressureTest.js.map +1 -0
- package/dist/prompts/rddIntro.d.ts +2 -0
- package/dist/prompts/rddIntro.js +53 -0
- package/dist/prompts/rddIntro.js.map +1 -0
- package/dist/prompts/review.d.ts +2 -0
- package/dist/prompts/review.js +45 -0
- package/dist/prompts/review.js.map +1 -0
- package/dist/prompts/stateMachineIntrospect.d.ts +2 -0
- package/dist/prompts/stateMachineIntrospect.js +80 -0
- package/dist/prompts/stateMachineIntrospect.js.map +1 -0
- package/dist/prompts/tellDontAskRephrase.d.ts +2 -0
- package/dist/prompts/tellDontAskRephrase.js +66 -0
- package/dist/prompts/tellDontAskRephrase.js.map +1 -0
- package/dist/render/diff.d.ts +21 -0
- package/dist/render/diff.js +84 -0
- package/dist/render/diff.js.map +1 -0
- package/dist/render/mermaid.d.ts +24 -0
- package/dist/render/mermaid.js +53 -0
- package/dist/render/mermaid.js.map +1 -0
- package/dist/render/sideBySide.d.ts +14 -0
- package/dist/render/sideBySide.js +91 -0
- package/dist/render/sideBySide.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.js +349 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/alternatives.d.ts +2 -0
- package/dist/tools/alternatives.js +9 -0
- package/dist/tools/alternatives.js.map +1 -0
- package/dist/tools/classes.d.ts +2 -0
- package/dist/tools/classes.js +13 -0
- package/dist/tools/classes.js.map +1 -0
- package/dist/tools/collaborations.d.ts +2 -0
- package/dist/tools/collaborations.js +8 -0
- package/dist/tools/collaborations.js.map +1 -0
- package/dist/tools/compare.d.ts +2 -0
- package/dist/tools/compare.js +9 -0
- package/dist/tools/compare.js.map +1 -0
- package/dist/tools/conformance.d.ts +3 -0
- package/dist/tools/conformance.js +11 -0
- package/dist/tools/conformance.js.map +1 -0
- package/dist/tools/diagram.d.ts +2 -0
- package/dist/tools/diagram.js +9 -0
- package/dist/tools/diagram.js.map +1 -0
- package/dist/tools/discovery.d.ts +2 -0
- package/dist/tools/discovery.js +23 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/init.d.ts +2 -0
- package/dist/tools/init.js +9 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/oop.d.ts +9 -0
- package/dist/tools/oop.js +26 -0
- package/dist/tools/oop.js.map +1 -0
- package/dist/tools/responsibilities.d.ts +2 -0
- package/dist/tools/responsibilities.js +13 -0
- package/dist/tools/responsibilities.js.map +1 -0
- package/dist/tools/state.d.ts +2 -0
- package/dist/tools/state.js +8 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/useCases.d.ts +2 -0
- package/dist/tools/useCases.js +18 -0
- package/dist/tools/useCases.js.map +1 -0
- package/dist/tools/validate.d.ts +2 -0
- package/dist/tools/validate.js +9 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tradeoff/engine.d.ts +61 -0
- package/dist/tradeoff/engine.js +171 -0
- package/dist/tradeoff/engine.js.map +1 -0
- package/dist/tradeoff/heuristics/classSplit.d.ts +3 -0
- package/dist/tradeoff/heuristics/classSplit.js +94 -0
- package/dist/tradeoff/heuristics/classSplit.js.map +1 -0
- package/dist/tradeoff/heuristics/collaborationShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collaborationShape.js +82 -0
- package/dist/tradeoff/heuristics/collaborationShape.js.map +1 -0
- package/dist/tradeoff/heuristics/collectionShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/collectionShape.js +113 -0
- package/dist/tradeoff/heuristics/collectionShape.js.map +1 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.d.ts +2 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js +114 -0
- package/dist/tradeoff/heuristics/dualSubjectComparison.js.map +1 -0
- package/dist/tradeoff/heuristics/errorHandling.d.ts +2 -0
- package/dist/tradeoff/heuristics/errorHandling.js +110 -0
- package/dist/tradeoff/heuristics/errorHandling.js.map +1 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.d.ts +23 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js +183 -0
- package/dist/tradeoff/heuristics/responsibilitySplit.js.map +1 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.d.ts +2 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js +23 -0
- package/dist/tradeoff/heuristics/stereotypeChoice.js.map +1 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.d.ts +2 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js +110 -0
- package/dist/tradeoff/heuristics/strategyOrPolicy.js.map +1 -0
- package/dist/tradeoff/heuristics/valueObjectShape.d.ts +2 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js +111 -0
- package/dist/tradeoff/heuristics/valueObjectShape.js.map +1 -0
- package/dist/tradeoff/templates.d.ts +2 -0
- package/dist/tradeoff/templates.js +33 -0
- package/dist/tradeoff/templates.js.map +1 -0
- package/dist/util/log.d.ts +1 -0
- package/dist/util/log.js +7 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/mcp.d.ts +4 -0
- package/dist/util/mcp.js +18 -0
- package/dist/util/mcp.js.map +1 -0
- package/dist/validate/cohesion.d.ts +3 -0
- package/dist/validate/cohesion.js +88 -0
- package/dist/validate/cohesion.js.map +1 -0
- package/dist/validate/collectionWrapper.d.ts +3 -0
- package/dist/validate/collectionWrapper.js +131 -0
- package/dist/validate/collectionWrapper.js.map +1 -0
- package/dist/validate/coupling.d.ts +3 -0
- package/dist/validate/coupling.js +47 -0
- package/dist/validate/coupling.js.map +1 -0
- package/dist/validate/cycle.d.ts +3 -0
- package/dist/validate/cycle.js +101 -0
- package/dist/validate/cycle.js.map +1 -0
- package/dist/validate/dataDuplication.d.ts +3 -0
- package/dist/validate/dataDuplication.js +150 -0
- package/dist/validate/dataDuplication.js.map +1 -0
- package/dist/validate/dependencyDirection.d.ts +3 -0
- package/dist/validate/dependencyDirection.js +106 -0
- package/dist/validate/dependencyDirection.js.map +1 -0
- package/dist/validate/dualUseKnowing.d.ts +3 -0
- package/dist/validate/dualUseKnowing.js +137 -0
- package/dist/validate/dualUseKnowing.js.map +1 -0
- package/dist/validate/emptyObjectFill.d.ts +3 -0
- package/dist/validate/emptyObjectFill.js +119 -0
- package/dist/validate/emptyObjectFill.js.map +1 -0
- package/dist/validate/findings.d.ts +22 -0
- package/dist/validate/findings.js +12 -0
- package/dist/validate/findings.js.map +1 -0
- package/dist/validate/functionDecompositionExcess.d.ts +3 -0
- package/dist/validate/functionDecompositionExcess.js +120 -0
- package/dist/validate/functionDecompositionExcess.js.map +1 -0
- package/dist/validate/functionNotObject.d.ts +3 -0
- package/dist/validate/functionNotObject.js +80 -0
- package/dist/validate/functionNotObject.js.map +1 -0
- package/dist/validate/godObject.d.ts +6 -0
- package/dist/validate/godObject.js +76 -0
- package/dist/validate/godObject.js.map +1 -0
- package/dist/validate/presentationInDomain.d.ts +3 -0
- package/dist/validate/presentationInDomain.js +57 -0
- package/dist/validate/presentationInDomain.js.map +1 -0
- package/dist/validate/primitiveWrapper.d.ts +3 -0
- package/dist/validate/primitiveWrapper.js +106 -0
- package/dist/validate/primitiveWrapper.js.map +1 -0
- package/dist/validate/rules.d.ts +24 -0
- package/dist/validate/rules.js +269 -0
- package/dist/validate/rules.js.map +1 -0
- package/dist/validate/singletonStatefulHolder.d.ts +3 -0
- package/dist/validate/singletonStatefulHolder.js +128 -0
- package/dist/validate/singletonStatefulHolder.js.map +1 -0
- package/dist/validate/strategyAsymmetry.d.ts +3 -0
- package/dist/validate/strategyAsymmetry.js +131 -0
- package/dist/validate/strategyAsymmetry.js.map +1 -0
- package/dist/validate/testability.d.ts +5 -0
- package/dist/validate/testability.js +157 -0
- package/dist/validate/testability.js.map +1 -0
- package/dist/validate/vagueName.d.ts +3 -0
- package/dist/validate/vagueName.js +136 -0
- package/dist/validate/vagueName.js.map +1 -0
- package/dist/validate/validationLocation.d.ts +3 -0
- package/dist/validate/validationLocation.js +120 -0
- package/dist/validate/validationLocation.js.map +1 -0
- package/lessons/STYLE_GUIDE.md +304 -0
- package/lessons/woowacourse-kotlin-blackjack/2chang5/33-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +293 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/52-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +106 -0
- package/lessons/woowacourse-kotlin-blackjack/Choisehyeon/9-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/14-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +182 -0
- package/lessons/woowacourse-kotlin-blackjack/DYGames/37-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +122 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/12-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +117 -0
- package/lessons/woowacourse-kotlin-blackjack/EmilyCh0/38-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +291 -0
- package/lessons/woowacourse-kotlin-blackjack/HANDOVER.md +1475 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/119-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +251 -0
- package/lessons/woowacourse-kotlin-blackjack/HamBeomJoon/137-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +459 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/100-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +282 -0
- package/lessons/woowacourse-kotlin-blackjack/Hevton/82-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +303 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/71-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +134 -0
- package/lessons/woowacourse-kotlin-blackjack/Hogu59/96-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +323 -0
- package/lessons/woowacourse-kotlin-blackjack/JoYehyun99/66-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +210 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/101-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +191 -0
- package/lessons/woowacourse-kotlin-blackjack/Junyoung-WON/80-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/108-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +516 -0
- package/lessons/woowacourse-kotlin-blackjack/Leeyerin0210/133-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +541 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/22-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/RightHennessy/48-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/16-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +228 -0
- package/lessons/woowacourse-kotlin-blackjack/SeongHoonC/54-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +227 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/76-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +203 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/105-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +162 -0
- package/lessons/woowacourse-kotlin-blackjack/aprilgom/64-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/18-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/boogi-woogi/36-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +769 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/19-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +226 -0
- package/lessons/woowacourse-kotlin-blackjack/briandr97/59-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +193 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/70-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/chaehyuns/98-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/123-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +277 -0
- package/lessons/woowacourse-kotlin-blackjack/chanho0908/150-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/26-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +259 -0
- package/lessons/woowacourse-kotlin-blackjack/chws0508/43-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +189 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/109-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +351 -0
- package/lessons/woowacourse-kotlin-blackjack/cucumber99/149-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +147 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/121-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +168 -0
- package/lessons/woowacourse-kotlin-blackjack/devfeijoa/153-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +116 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/126-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +680 -0
- package/lessons/woowacourse-kotlin-blackjack/doabletuple/142-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +739 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/116-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/donghyun81/147-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +244 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/78-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +232 -0
- package/lessons/woowacourse-kotlin-blackjack/dpcks0509/88-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +137 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/112-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/etama123/148-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +240 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/102-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +146 -0
- package/lessons/woowacourse-kotlin-blackjack/gaeun5744/69-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/118-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +397 -0
- package/lessons/woowacourse-kotlin-blackjack/gahyunkim/141-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +215 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/106-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +395 -0
- package/lessons/woowacourse-kotlin-blackjack/giovannijunseokim/134-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +219 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/62-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +230 -0
- package/lessons/woowacourse-kotlin-blackjack/haeum808/89-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +169 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/110-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/hwannow/132-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +573 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/103-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +188 -0
- package/lessons/woowacourse-kotlin-blackjack/hxeyexn/81-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +301 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/21-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +613 -0
- package/lessons/woowacourse-kotlin-blackjack/hyemdooly/35-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +691 -0
- package/lessons/woowacourse-kotlin-blackjack/hyunji1203/13-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +206 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/79-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +153 -0
- package/lessons/woowacourse-kotlin-blackjack/ii2001/85-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +318 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/128-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/ijh1298/135-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +269 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/28-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +346 -0
- package/lessons/woowacourse-kotlin-blackjack/inseonyun/49-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +360 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/30-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +152 -0
- package/lessons/woowacourse-kotlin-blackjack/ippnsj/42-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +213 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/73-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +247 -0
- package/lessons/woowacourse-kotlin-blackjack/jaeyeongjo/87-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +900 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/125-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +248 -0
- package/lessons/woowacourse-kotlin-blackjack/jerry8282/151-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +243 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/63-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +281 -0
- package/lessons/woowacourse-kotlin-blackjack/jinuemong/92-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +283 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/113-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +348 -0
- package/lessons/woowacourse-kotlin-blackjack/jiyuneel/140-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/61-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +270 -0
- package/lessons/woowacourse-kotlin-blackjack/junjange/93-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +465 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/107-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +296 -0
- package/lessons/woowacourse-kotlin-blackjack/junseo511/145-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +316 -0
- package/lessons/woowacourse-kotlin-blackjack/ki960213/11-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +175 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/72-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +458 -0
- package/lessons/woowacourse-kotlin-blackjack/kimhm0728/97-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +225 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/68-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +221 -0
- package/lessons/woowacourse-kotlin-blackjack/kkosang/94-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +158 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/65-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +252 -0
- package/lessons/woowacourse-kotlin-blackjack/kmkim2689/90-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +460 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/32-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/krrong/46-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +285 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/122-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +177 -0
- package/lessons/woowacourse-kotlin-blackjack/m6z1/144-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +155 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/130-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/medAndro/143-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +678 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/114-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +262 -0
- package/lessons/woowacourse-kotlin-blackjack/moondev03/131-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +498 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/77-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +287 -0
- package/lessons/woowacourse-kotlin-blackjack/murjune/91-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +280 -0
- package/lessons/woowacourse-kotlin-blackjack/no1msh/31-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +250 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/24-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +302 -0
- package/lessons/woowacourse-kotlin-blackjack/otter66/58-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +391 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/111-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/oungsi2000/136-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +540 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/117-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +819 -0
- package/lessons/woowacourse-kotlin-blackjack/parkjiminnnn/139-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +683 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/20-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +258 -0
- package/lessons/woowacourse-kotlin-blackjack/pingu244/41-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +171 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/34-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +289 -0
- package/lessons/woowacourse-kotlin-blackjack/re4rk/8-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +297 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/17-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +279 -0
- package/lessons/woowacourse-kotlin-blackjack/rhkrwngud445/50-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +145 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/23-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +253 -0
- package/lessons/woowacourse-kotlin-blackjack/rhthrhrl0/39-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/129-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +726 -0
- package/lessons/woowacourse-kotlin-blackjack/rosemin928/138-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +845 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/67-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +220 -0
- package/lessons/woowacourse-kotlin-blackjack/s6m1n/99-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +229 -0
- package/lessons/woowacourse-kotlin-blackjack/s9hn/10-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +284 -0
- package/lessons/woowacourse-kotlin-blackjack/sh1mj1/75-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +224 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/74-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +238 -0
- package/lessons/woowacourse-kotlin-blackjack/songpink/95-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +216 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/15-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +132 -0
- package/lessons/woowacourse-kotlin-blackjack/sujin9/47-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +265 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/29-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tmdgh1592/51-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +278 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/115-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +305 -0
- package/lessons/woowacourse-kotlin-blackjack/tobae-time/154-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +298 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/25-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +235 -0
- package/lessons/woowacourse-kotlin-blackjack/whk06061/53-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +130 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/124-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +486 -0
- package/lessons/woowacourse-kotlin-blackjack/wondroid-world/152-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +482 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/120-1/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +194 -0
- package/lessons/woowacourse-kotlin-blackjack/yrsel/146-2/353/213/250/352/263/204-/353/270/224/353/236/231/354/236/255.md +444 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/27-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/2chang5/52-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +187 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/14-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +206 -0
- package/lessons/woowacourse-kotlin-lotto/Choisehyeon/47-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/2-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/DYGames/34-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +88 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/12-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/EmilyCh0/40-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +135 -0
- package/lessons/woowacourse-kotlin-lotto/HANDOVER.md +217 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/121-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/HamBeomJoon/139-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +75 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/76-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/Hevton/92-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +122 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/100-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +110 -0
- package/lessons/woowacourse-kotlin-lotto/Hogu59/68-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +84 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/60-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/JoYehyun99/96-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/61-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/Junyoung-WON/93-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +16 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/109-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +57 -0
- package/lessons/woowacourse-kotlin-lotto/Leeyerin0210/135-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/PROGRESS.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/README.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/32-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/RightHennessy/5-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/SUMMARY.md +369 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/25-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/SeongHoonC/37-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +27 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/72-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +137 -0
- package/lessons/woowacourse-kotlin-lotto/Yunseok-Nam/86-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +17 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/102-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +62 -0
- package/lessons/woowacourse-kotlin-lotto/aprilgom/64-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/11-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/boogi-woogi/29-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/26-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/briandr97/51-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +123 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/71-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +115 -0
- package/lessons/woowacourse-kotlin-lotto/chaehyuns/97-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/124-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/chanho0908/129-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/24-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +117 -0
- package/lessons/woowacourse-kotlin-lotto/chws0508/50-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +167 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/116-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/cucumber99/147-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +223 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/125-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/devfeijoa/153-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +107 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/119-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/doabletuple/138-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +77 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/111-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/donghyun81/152-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/80-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/dpcks0509/87-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +134 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/112-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +170 -0
- package/lessons/woowacourse-kotlin-lotto/etama123/148-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +183 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/101-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/gaeun5744/78-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/107-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +83 -0
- package/lessons/woowacourse-kotlin-lotto/gahyunkim/136-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +51 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/106-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/giovannijunseokim/137-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +111 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/67-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/haeum808/95-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/113-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +235 -0
- package/lessons/woowacourse-kotlin-lotto/hwannow/132-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/77-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +141 -0
- package/lessons/woowacourse-kotlin-lotto/hxeyexn/98-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +162 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/17-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/hyemdooly/28-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +23 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/15-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +171 -0
- package/lessons/woowacourse-kotlin-lotto/hyunji1203/48-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/62-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/ii2001/88-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/122-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/ijh1298/133-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/3-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +222 -0
- package/lessons/woowacourse-kotlin-lotto/inseonyun/49-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +166 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/16-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +154 -0
- package/lessons/woowacourse-kotlin-lotto/ippnsj/55-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/59-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +68 -0
- package/lessons/woowacourse-kotlin-lotto/jaeyeongjo/83-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +53 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/115-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/jerry8282/134-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/63-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +144 -0
- package/lessons/woowacourse-kotlin-lotto/jinuemong/89-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/128-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +52 -0
- package/lessons/woowacourse-kotlin-lotto/jiyuneel/144-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +149 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/58-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +148 -0
- package/lessons/woowacourse-kotlin-lotto/junjange/81-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/120-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +153 -0
- package/lessons/woowacourse-kotlin-lotto/junseo511/131-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +188 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/43-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +24 -0
- package/lessons/woowacourse-kotlin-lotto/ki960213/8-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +159 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/74-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +50 -0
- package/lessons/woowacourse-kotlin-lotto/kimhm0728/94-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +176 -0
- package/lessons/woowacourse-kotlin-lotto/kkosang/85-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +145 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/70-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +97 -0
- package/lessons/woowacourse-kotlin-lotto/kmkim2689/82-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +157 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/19-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +161 -0
- package/lessons/woowacourse-kotlin-lotto/krrong/41-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +73 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/105-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +67 -0
- package/lessons/woowacourse-kotlin-lotto/m6z1/151-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/127-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +186 -0
- package/lessons/woowacourse-kotlin-lotto/medAndro/130-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +132 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/110-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/moondev03/141-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +155 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/69-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/murjune/90-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +177 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/20-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +69 -0
- package/lessons/woowacourse-kotlin-lotto/no1msh/46-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/13-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +178 -0
- package/lessons/woowacourse-kotlin-lotto/otter66/53-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +160 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/126-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +71 -0
- package/lessons/woowacourse-kotlin-lotto/oungsi2000/149-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +56 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/117-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/parkjiminnnn/146-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +173 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/33-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/54-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/pingu244/7-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +19 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/31-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +143 -0
- package/lessons/woowacourse-kotlin-lotto/re4rk/4-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +66 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/23-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +26 -0
- package/lessons/woowacourse-kotlin-lotto/rhkrwngud445/38-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +129 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/21-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +146 -0
- package/lessons/woowacourse-kotlin-lotto/rhthrhrl0/36-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +150 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/123-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +179 -0
- package/lessons/woowacourse-kotlin-lotto/rosemin928/140-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +126 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/103-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +119 -0
- package/lessons/woowacourse-kotlin-lotto/s6m1n/66-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +118 -0
- package/lessons/woowacourse-kotlin-lotto/s9hn/18-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +112 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/75-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +104 -0
- package/lessons/woowacourse-kotlin-lotto/sh1mj1/91-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +140 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/65-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +96 -0
- package/lessons/woowacourse-kotlin-lotto/songpink/99-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +64 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/10-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/sujin9/35-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/22-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +30 -0
- package/lessons/woowacourse-kotlin-lotto/tmdgh1592/30-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +20 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/114-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +158 -0
- package/lessons/woowacourse-kotlin-lotto/tobae-time/145-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +120 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/42-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +21 -0
- package/lessons/woowacourse-kotlin-lotto/whk06061/9-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +89 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/118-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +100 -0
- package/lessons/woowacourse-kotlin-lotto/wondroid-world/150-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +142 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/108-1/353/213/250/352/263/204-/353/241/234/353/230/220.md +124 -0
- package/lessons/woowacourse-kotlin-lotto/yrsel/143-2/353/213/250/352/263/204-/353/241/234/353/230/220.md +108 -0
- package/lessons/woowacourse-racingcar/2chang5/33-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/2chang5/75-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/CFalws/85-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Choisehyeon/46-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/DYGames/49-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/40-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +64 -0
- package/lessons/woowacourse-racingcar/EmilyCh0/57-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/137-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/HamBeomJoon/170-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Hevton/106-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/Hevton/118-/353/246/254/355/214/251/355/204/260/353/247/201.md +51 -0
- package/lessons/woowacourse-racingcar/Hogu59/108-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/Hogu59/125-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/111-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/JoYehyun99/88-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/127-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Junyoung-WON/90-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/133-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/Leeyerin0210/159-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/PROGRESS.md +94 -0
- package/lessons/woowacourse-racingcar/README.md +69 -0
- package/lessons/woowacourse-racingcar/RightHennessy/51-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/RightHennessy/58-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/RunaNam/81-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/SUMMARY.md +339 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/37-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/SeongHoonC/66-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/Songusika/84-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/114-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/Yunseok-Nam/96-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/aprilgom/130-/353/246/254/355/214/251/355/204/260/353/247/201.md +52 -0
- package/lessons/woowacourse-racingcar/aprilgom/97-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/awesomeo184/23-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/35-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/boogi-woogi/59-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/briandr97/54-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/chaehyuns/131-/353/246/254/355/214/251/355/204/260/353/247/201.md +49 -0
- package/lessons/woowacourse-racingcar/chaehyuns/99-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/chanho0908/147-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/chanho0908/160-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/chws0508/45-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/chws0508/73-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/cucumber99/132-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/cucumber99/177-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/devfeijoa/146-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/doabletuple/149-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/doabletuple/175-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/donghyun81/154-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/dpcks0509/103-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/dpcks0509/112-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/drunkenhw/82-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/etama123/145-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/gaeun5744/124-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/gaeun5744/93-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/gahyunkim/134-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/gahyunkim/164-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/giovannijunseokim/140-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/haeum808/101-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/haeum808/129-/353/246/254/355/214/251/355/204/260/353/247/201.md +46 -0
- package/lessons/woowacourse-racingcar/hwannow/141-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/hwannow/157-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +45 -0
- package/lessons/woowacourse-racingcar/hxeyexn/109-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/hxeyexn/128-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/hyemdooly/50-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/hyemdooly/68-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/hyunji1203/29-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/hyunji1203/60-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/ii2001/102-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/ii2001/122-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/ijh1298/144-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/injoon2019/24-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/inseonyun/44-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/inseonyun/76-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/ippnsj/36-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/ippnsj/67-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/110-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/jaeyeongjo/89-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +46 -0
- package/lessons/woowacourse-racingcar/jinuemong/104-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/jinuemong/117-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +42 -0
- package/lessons/woowacourse-racingcar/jiyuneel/142-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/junjange/113-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +41 -0
- package/lessons/woowacourse-racingcar/junjange/87-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +39 -0
- package/lessons/woowacourse-racingcar/junseo511/148-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/junseo511/165-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/ki960213/32-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/ki960213/63-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/kimhm0728/100-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/kimhm0728/116-/353/246/254/355/214/251/355/204/260/353/247/201.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/105-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/kkosang/126-/353/246/254/355/214/251/355/204/260/353/247/201.md +53 -0
- package/lessons/woowacourse-racingcar/kmkim2689/123-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/kmkim2689/92-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/krrong/34-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +63 -0
- package/lessons/woowacourse-racingcar/m6z1/150-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/m6z1/156-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +40 -0
- package/lessons/woowacourse-racingcar/medAndro/153-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/moondev03/135-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +57 -0
- package/lessons/woowacourse-racingcar/moondev03/161-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/murjune/121-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/murjune/95-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/no1msh/43-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/no1msh/69-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/otter66/48-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/otter66/77-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +52 -0
- package/lessons/woowacourse-racingcar/oungsi2000/152-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +56 -0
- package/lessons/woowacourse-racingcar/oungsi2000/187-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/143-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/parkjiminnnn/158-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/pingu244/38-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/pingu244/62-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/lessons/woowacourse-racingcar/re4rk/28-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +60 -0
- package/lessons/woowacourse-racingcar/re4rk/55-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/42-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rhkrwngud445/74-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/rhthrhrl0/31-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/rosemin928/138-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/rosemin928/171-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +38 -0
- package/lessons/woowacourse-racingcar/s6m1n/120-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +54 -0
- package/lessons/woowacourse-racingcar/s6m1n/91-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +62 -0
- package/lessons/woowacourse-racingcar/s9hn/53-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +44 -0
- package/lessons/woowacourse-racingcar/s9hn/78-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/sh1mj1/107-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sh1mj1/115-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +61 -0
- package/lessons/woowacourse-racingcar/songpink/119-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/songpink/98-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +55 -0
- package/lessons/woowacourse-racingcar/sujin9/52-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +48 -0
- package/lessons/woowacourse-racingcar/sujin9/61-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +47 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/47-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/tmdgh1592/64-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/tobae-time/151-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +51 -0
- package/lessons/woowacourse-racingcar/tobae-time/167-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +43 -0
- package/lessons/woowacourse-racingcar/whk06061/41-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +58 -0
- package/lessons/woowacourse-racingcar/wondroid-world/136-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +49 -0
- package/lessons/woowacourse-racingcar/wondroid-world/166-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +50 -0
- package/lessons/woowacourse-racingcar/yrsel/139-1/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +53 -0
- package/lessons/woowacourse-racingcar/yujamint/83-2/353/213/250/352/263/204-/354/236/220/353/217/231/354/260/250-/352/262/275/354/243/274.md +59 -0
- package/package.json +46 -0
- package/skills/oh-my-oop/SKILL.md +39 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import { type OopOperationName } from "../oop/commands.js";
|
|
4
|
+
/** MCP presentation and environment resolution stay outside the OOP application. */
|
|
5
|
+
export declare function registerOopOperation(server: McpServer, name: OopOperationName, metadata: {
|
|
6
|
+
title: string;
|
|
7
|
+
description: string;
|
|
8
|
+
outputSchema?: z.ZodRawShape;
|
|
9
|
+
}): void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { resolveConfig } from "../config.js";
|
|
2
|
+
import { OOP_OPERATIONS } from "../oop/commands.js";
|
|
3
|
+
import { errorResult, jsonResult } from "../util/mcp.js";
|
|
4
|
+
// These legacy handlers let the SDK format failures without the custom "Error: " prefix.
|
|
5
|
+
const sdkManagedErrors = new Set([
|
|
6
|
+
"oop_init", "oop_use_case_add", "oop_use_case_list", "oop_class_list",
|
|
7
|
+
]);
|
|
8
|
+
/** MCP presentation and environment resolution stay outside the OOP application. */
|
|
9
|
+
export function registerOopOperation(server, name, metadata) {
|
|
10
|
+
const operation = OOP_OPERATIONS[name];
|
|
11
|
+
server.registerTool(name, {
|
|
12
|
+
...metadata,
|
|
13
|
+
inputSchema: operation.inputSchema.shape,
|
|
14
|
+
}, async (args) => {
|
|
15
|
+
try {
|
|
16
|
+
const result = await operation.execute(resolveConfig(), args);
|
|
17
|
+
return jsonResult(result.data, result.text);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (sdkManagedErrors.has(name))
|
|
21
|
+
throw error;
|
|
22
|
+
return errorResult(error.message);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=oop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oop.js","sourceRoot":"","sources":["../../src/tools/oop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAyB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEzD,yFAAyF;AACzF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAmB;IACjD,UAAU,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB;CACtE,CAAC,CAAC;AAEH,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,IAAsB,EACtB,QAA8E;IAE9E,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;QACxB,GAAG,QAAQ;QACX,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC,KAAK;KACzC,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9D,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,KAAK,CAAC;YAC5C,OAAO,WAAW,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { registerOopOperation } from "./oop.js";
|
|
2
|
+
export function registerResponsibilities(server) {
|
|
3
|
+
registerOopOperation(server, "oop_propose_responsibilities", {
|
|
4
|
+
title: "Propose responsibility decompositions (책임 분해 N안)",
|
|
5
|
+
description: "[USE WHEN] 사용자가 객체지향/OOP/RDD/책임 주도 설계 맥락에서 '이 유스케이스의 책임을 어떻게 나눌까', '어떤 클래스가 필요할까', '누가 무엇을 알고 무엇을 해야 하는가'를 묻거나 책임/협력 구조를 고민할 때. " +
|
|
6
|
+
"유스케이스로부터 책임을 분해하는 N개의 대안(by-noun, by-verb, by-stereotype, single-class)을 트레이드오프와 함께 제안. 단일 답을 내지 않음 — 조영호님의 '설계는 제약 아래 답을 찾는 행위' 원칙.",
|
|
7
|
+
});
|
|
8
|
+
registerOopOperation(server, "oop_assign_responsibility", {
|
|
9
|
+
title: "Assign a responsibility to a class",
|
|
10
|
+
description: "선택된 책임을 특정 클래스의 knowing 또는 doing 목록에 추가합니다(idempotent).",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=responsibilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responsibilities.js","sourceRoot":"","sources":["../../src/tools/responsibilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,oBAAoB,CAAC,MAAM,EAAE,8BAA8B,EAAE;QAC3D,KAAK,EAAE,kDAAkD;QACzD,WAAW,EACT,kIAAkI;YAClI,sIAAsI;KACzI,CAAC,CAAC;IACH,oBAAoB,CAAC,MAAM,EAAE,2BAA2B,EAAE;QACxD,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EAAE,yDAAyD;KACvE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { registerOopOperation } from "./oop.js";
|
|
2
|
+
export function registerState(server) {
|
|
3
|
+
registerOopOperation(server, "oop_state_read", {
|
|
4
|
+
title: "Read consolidated design state",
|
|
5
|
+
description: "현재 .oop/의 전체 설계 상태(스냅샷)를 한 번에 반환합니다.",
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tools/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,EAAE;QAC7C,KAAK,EAAE,gCAAgC;QACvC,WAAW,EAAE,sCAAsC;KACpD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { registerOopOperation } from "./oop.js";
|
|
3
|
+
export function registerUseCases(server) {
|
|
4
|
+
registerOopOperation(server, "oop_use_case_add", {
|
|
5
|
+
title: "Add a use case",
|
|
6
|
+
description: "도메인 유스케이스를 .oop/use-cases/<id>.md로 저장합니다.",
|
|
7
|
+
outputSchema: {
|
|
8
|
+
id: z.string(),
|
|
9
|
+
path: z.string(),
|
|
10
|
+
created: z.boolean(),
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
registerOopOperation(server, "oop_use_case_list", {
|
|
14
|
+
title: "List use cases",
|
|
15
|
+
description: "현재 정의된 유스케이스 목록을 반환합니다.",
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=useCases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCases.js","sourceRoot":"","sources":["../../src/tools/useCases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE;QAC/C,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,2CAA2C;QACxD,YAAY,EAAE;YACZ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;YACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;SACrB;KACF,CAAC,CAAC;IACH,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,EAAE;QAChD,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,yBAAyB;KACvC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { registerOopOperation } from "./oop.js";
|
|
2
|
+
export function registerValidate(server) {
|
|
3
|
+
registerOopOperation(server, "oop_design_validate", {
|
|
4
|
+
title: "Validate current OOP design (책임/결합도/테스터빌리티 권고)",
|
|
5
|
+
description: "[USE WHEN] 사용자가 객체지향 설계를 '리뷰'/'검토'/'평가'해달라거나, '이거 좋은 설계인가', 'god object 같지 않아?', '결합도/응집도 어때', '테스트하기 어렵지 않을까', 'Tell-Don't-Ask 위배 아냐?'를 물을 때. " +
|
|
6
|
+
"현재 .oop/ 설계를 20여 개 룰(god-object, mixed-stereotype, low-cohesion, too-many-collaborators, feature-envy, non-newable, side-effect-in-holder, mocking-pressure, cycle, orphan-class, dependency-direction, presentation-in-domain 등)로 검사. 모든 finding은 항상 ≥2개의 대안 remedies를 포함. 결과는 권고일 뿐 차단하지 않음 — 코드 통제권은 개발자에게.",
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,EAAE;QAClD,KAAK,EAAE,gDAAgD;QACvD,WAAW,EACT,iJAAiJ;YACjJ,gTAAgT;KACnT,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Design } from "../domain/model.js";
|
|
2
|
+
import type { Stereotype } from "../domain/stereotypes.js";
|
|
3
|
+
import type { TradeoffQuestion } from "../domain/schemas.js";
|
|
4
|
+
export interface DesignDelta {
|
|
5
|
+
added_classes?: Array<{
|
|
6
|
+
name: string;
|
|
7
|
+
stereotype: Stereotype;
|
|
8
|
+
}>;
|
|
9
|
+
removed_classes?: string[];
|
|
10
|
+
moved_responsibilities?: Array<{
|
|
11
|
+
text: string;
|
|
12
|
+
from: string;
|
|
13
|
+
to: string;
|
|
14
|
+
}>;
|
|
15
|
+
added_collaborations?: Array<{
|
|
16
|
+
from: string;
|
|
17
|
+
to: string;
|
|
18
|
+
message: string;
|
|
19
|
+
}>;
|
|
20
|
+
removed_collaborations?: Array<{
|
|
21
|
+
from: string;
|
|
22
|
+
to: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
export interface ChoYounghosLens {
|
|
26
|
+
cohesion: "improves" | "neutral" | "hurts";
|
|
27
|
+
coupling: "improves" | "neutral" | "hurts";
|
|
28
|
+
testability: "improves" | "neutral" | "hurts";
|
|
29
|
+
notes: string;
|
|
30
|
+
}
|
|
31
|
+
export interface AlternativeSeed {
|
|
32
|
+
id: string;
|
|
33
|
+
label: string;
|
|
34
|
+
summary: string;
|
|
35
|
+
design_delta: DesignDelta;
|
|
36
|
+
tradeoffs: {
|
|
37
|
+
pros: string[];
|
|
38
|
+
cons: string[];
|
|
39
|
+
};
|
|
40
|
+
cho_younghos_lens: ChoYounghosLens;
|
|
41
|
+
/**
|
|
42
|
+
* 우아한테크코스 racingcar 133 PR에서 추출된 두 가지 보편 질문.
|
|
43
|
+
* 모든 대안 카드에 강제로 첨부되어, 사용자가 *분리의 정당화*와 *확장 시 부담*을
|
|
44
|
+
* 동시에 가늠할 수 있게 한다.
|
|
45
|
+
*/
|
|
46
|
+
reflection_questions?: {
|
|
47
|
+
testability_justification: string;
|
|
48
|
+
expansion_pressure: string;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface AlternativesResult {
|
|
52
|
+
alternatives: AlternativeSeed[];
|
|
53
|
+
expansion_prompt: string;
|
|
54
|
+
}
|
|
55
|
+
export interface AlternativesContext {
|
|
56
|
+
description: string;
|
|
57
|
+
class_id?: string;
|
|
58
|
+
use_case_id?: string;
|
|
59
|
+
involved?: string[];
|
|
60
|
+
}
|
|
61
|
+
export declare function generateAlternatives(question: TradeoffQuestion, context: AlternativesContext, design: Design, n: number): AlternativesResult;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { classSplitSeeds } from "./heuristics/classSplit.js";
|
|
2
|
+
import { collaborationShapeSeeds } from "./heuristics/collaborationShape.js";
|
|
3
|
+
import { stereotypeChoiceSeeds } from "./heuristics/stereotypeChoice.js";
|
|
4
|
+
import { valueObjectShapeSeeds } from "./heuristics/valueObjectShape.js";
|
|
5
|
+
import { strategyOrPolicySeeds } from "./heuristics/strategyOrPolicy.js";
|
|
6
|
+
import { errorHandlingSeeds } from "./heuristics/errorHandling.js";
|
|
7
|
+
import { collectionShapeSeeds } from "./heuristics/collectionShape.js";
|
|
8
|
+
import { dualSubjectComparisonSeeds } from "./heuristics/dualSubjectComparison.js";
|
|
9
|
+
import { expansionPromptAlternatives } from "./templates.js";
|
|
10
|
+
export function generateAlternatives(question, context, design, n) {
|
|
11
|
+
let seeds;
|
|
12
|
+
switch (question) {
|
|
13
|
+
case "class_split":
|
|
14
|
+
seeds = classSplitSeeds(findClass(design, context.class_id));
|
|
15
|
+
break;
|
|
16
|
+
case "collaboration_shape":
|
|
17
|
+
seeds = collaborationShapeSeeds(context.involved ?? []);
|
|
18
|
+
break;
|
|
19
|
+
case "stereotype_choice":
|
|
20
|
+
seeds = stereotypeChoiceSeeds(findClass(design, context.class_id)?.name ?? "Target");
|
|
21
|
+
break;
|
|
22
|
+
case "responsibility_split":
|
|
23
|
+
seeds = classSplitSeeds(findClass(design, context.class_id));
|
|
24
|
+
break;
|
|
25
|
+
case "value_object_shape":
|
|
26
|
+
seeds = valueObjectShapeSeeds(findClass(design, context.class_id)?.name ?? "Value");
|
|
27
|
+
break;
|
|
28
|
+
case "strategy_or_policy":
|
|
29
|
+
seeds = strategyOrPolicySeeds(findClass(design, context.class_id)?.name ?? "Decision");
|
|
30
|
+
break;
|
|
31
|
+
case "error_handling":
|
|
32
|
+
seeds = errorHandlingSeeds(findClass(design, context.class_id)?.name ?? "Input");
|
|
33
|
+
break;
|
|
34
|
+
case "collection_shape":
|
|
35
|
+
seeds = collectionShapeSeeds(findClass(design, context.class_id)?.name ?? "Items");
|
|
36
|
+
break;
|
|
37
|
+
case "dual_subject_comparison":
|
|
38
|
+
seeds = dualSubjectComparisonSeeds(context.involved ?? []);
|
|
39
|
+
break;
|
|
40
|
+
case "free_form":
|
|
41
|
+
seeds = freeFormSeeds(context);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
const capped = seeds.slice(0, Math.max(2, Math.min(n, seeds.length)));
|
|
45
|
+
const enriched = capped.map(attachReflectionQuestions);
|
|
46
|
+
// 모든 propose_alternatives 호출에 *"이 객체/분리를 만들지 않는다"* 카드를
|
|
47
|
+
// 0번 슬롯으로 자동 첨부. 가상 객체 회피의 학습 장치.
|
|
48
|
+
const nullOpt = nullOptionFor(question);
|
|
49
|
+
const withNull = nullOpt
|
|
50
|
+
? [attachReflectionQuestions(nullOpt), ...enriched]
|
|
51
|
+
: enriched;
|
|
52
|
+
return {
|
|
53
|
+
alternatives: withNull,
|
|
54
|
+
expansion_prompt: expansionPromptAlternatives(question, context.description),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 모든 propose_alternatives 호출에 *"이 객체/분리를 만들지 않는다"* 카드를 0번 슬롯에 첨부.
|
|
59
|
+
* 학생이 *주어진 대안 중에서* 선택하는 게 아니라 *문제 자체를 거부*하는 카드를
|
|
60
|
+
* 항상 보도록 강제하는 학습 장치. 가상 객체 회피의 핵심.
|
|
61
|
+
*
|
|
62
|
+
* @laco-dev (woowacourse-kotlin-blackjack tobae-time/115):
|
|
63
|
+
* "현실세계라면 블랙잭 게임의 규칙이지만, 객체지향 세계에서 객체는 모두 스스로 일을 합니다."
|
|
64
|
+
*/
|
|
65
|
+
function nullOptionFor(question) {
|
|
66
|
+
// free_form 은 freeFormSeeds 의 'free-keep' 카드가 이미 이 역할을 한다.
|
|
67
|
+
if (question === "free_form")
|
|
68
|
+
return null;
|
|
69
|
+
const labelMap = {
|
|
70
|
+
class_split: "분리하지 않는다 — 현 클래스 유지",
|
|
71
|
+
responsibility_split: "책임을 옮기지 않는다 — 현 위치 유지",
|
|
72
|
+
collaboration_shape: "이 협력 자체를 만들지 않는다",
|
|
73
|
+
stereotype_choice: "이 객체 자체를 재검토 — 어떤 stereotype 도 적절하지 않다",
|
|
74
|
+
value_object_shape: "원시 타입 유지 — 값 객체로 감싸지 않는다",
|
|
75
|
+
strategy_or_policy: "정책을 객체로 만들지 않는다 — 인라인 분기 유지",
|
|
76
|
+
error_handling: "오류를 명시 처리하지 않는다 — 호출처 결정에 위임",
|
|
77
|
+
collection_shape: "단순 List 유지 — 일급 컬렉션화 X",
|
|
78
|
+
dual_subject_comparison: "비교 자체를 미룬다 — 지금 비교가 필요한가?",
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
id: "null-option",
|
|
82
|
+
label: labelMap[question],
|
|
83
|
+
summary: `통증이 *추측에 기반한다면* 일단 변경하지 않고 관찰한다. 새 객체/분리에 ` +
|
|
84
|
+
`*자기 행동*과 *자기 데이터*가 있는지, 책임이 *기존 객체*에 이미 있는지 먼저 확인.`,
|
|
85
|
+
design_delta: {},
|
|
86
|
+
tradeoffs: {
|
|
87
|
+
pros: [
|
|
88
|
+
"*가상 객체* 회피 — 행동 없는 명사를 만들지 않는다",
|
|
89
|
+
"객체 수/협력 그래프 단순",
|
|
90
|
+
"*현실 메타포에 매몰*되지 않고 *책임이 있는가*를 먼저 묻는다",
|
|
91
|
+
],
|
|
92
|
+
cons: [
|
|
93
|
+
"*통증이 누적*되면 변경 비용 증가",
|
|
94
|
+
"*책임이 정말 다른 곳에 있는가*를 입증해야 함",
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
cho_younghos_lens: {
|
|
98
|
+
cohesion: "improves",
|
|
99
|
+
coupling: "improves",
|
|
100
|
+
testability: "neutral",
|
|
101
|
+
notes: "@laco-dev: \"객체는 모두 스스로 일을 합니다.\" 새 객체에 *자기 행동* + *자기 데이터* 가 없다면 이 카드가 첫 답.",
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* @ghojeong (PR #128): "분리해도 테스트가 더 명확해지지 않으면 분리할 이유 없음."
|
|
107
|
+
* @Gyuil-Hwnag (PR #142): "KoreanCar/EnglishCar로 늘어나도 이 구조가 견디는가?"
|
|
108
|
+
*/
|
|
109
|
+
function attachReflectionQuestions(seed) {
|
|
110
|
+
return {
|
|
111
|
+
...seed,
|
|
112
|
+
reflection_questions: {
|
|
113
|
+
testability_justification: `이 대안(${seed.label})을 적용하면 단위 테스트가 *더 명확*해지는가? ` +
|
|
114
|
+
`아니라면 분리/변경의 정당화가 약합니다. (조영호 렌즈: testability 평가 = ${seed.cho_younghos_lens.testability})`,
|
|
115
|
+
expansion_pressure: `이 대안(${seed.label})이 도메인이 N배(예: 1종 → 10종)로 늘어났을 때도 견디는가? ` +
|
|
116
|
+
`늘면 god-object/god-folder로 무너진다면 지금 대안을 다시 보세요.`,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function findClass(design, id) {
|
|
121
|
+
if (!id)
|
|
122
|
+
return undefined;
|
|
123
|
+
return design.classes.find((c) => c.id === id);
|
|
124
|
+
}
|
|
125
|
+
function freeFormSeeds(context) {
|
|
126
|
+
return [
|
|
127
|
+
{
|
|
128
|
+
id: "free-keep",
|
|
129
|
+
label: "현 상태 유지",
|
|
130
|
+
summary: `"${context.description}"에 대해 변경하지 않고 통증을 더 관찰한다.`,
|
|
131
|
+
design_delta: {},
|
|
132
|
+
tradeoffs: {
|
|
133
|
+
pros: ["변경 비용 0", "잘못된 추측 위험 회피"],
|
|
134
|
+
cons: ["통증이 누적되면 변경 비용 상승"],
|
|
135
|
+
},
|
|
136
|
+
cho_younghos_lens: {
|
|
137
|
+
cohesion: "neutral",
|
|
138
|
+
coupling: "neutral",
|
|
139
|
+
testability: "neutral",
|
|
140
|
+
notes: "조영호님: '경험이 없으면 일단 해보고 고치자' — 단, 통증을 지켜볼 것.",
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: "free-extract",
|
|
145
|
+
label: "새 클래스로 추출",
|
|
146
|
+
summary: "관련된 책임을 새 클래스로 분리한다.",
|
|
147
|
+
design_delta: { added_classes: [{ name: "ExtractedTarget", stereotype: "ServiceProvider" }] },
|
|
148
|
+
tradeoffs: { pros: ["응집도 향상", "테스트 단위 축소"], cons: ["객체 수 증가"] },
|
|
149
|
+
cho_younghos_lens: {
|
|
150
|
+
cohesion: "improves",
|
|
151
|
+
coupling: "neutral",
|
|
152
|
+
testability: "improves",
|
|
153
|
+
notes: "통증의 출처가 한 클래스의 비대함이라면 효과적.",
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
id: "free-invert",
|
|
158
|
+
label: "메시지 방향 반전 (Tell-Don't-Ask)",
|
|
159
|
+
summary: "데이터 소유자에게 행위를 옮긴다.",
|
|
160
|
+
design_delta: {},
|
|
161
|
+
tradeoffs: { pros: ["조회 감소", "캡슐화 강화"], cons: ["수신자 비대"] },
|
|
162
|
+
cho_younghos_lens: {
|
|
163
|
+
cohesion: "improves",
|
|
164
|
+
coupling: "improves",
|
|
165
|
+
testability: "improves",
|
|
166
|
+
notes: "구조 변경 없이도 큰 효과를 낼 수 있는 카드.",
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/tradeoff/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export function classSplitSeeds(card) {
|
|
2
|
+
const name = card?.name ?? "Target";
|
|
3
|
+
return [
|
|
4
|
+
{
|
|
5
|
+
id: "split-extract-collaborator",
|
|
6
|
+
label: "협력자로 추출",
|
|
7
|
+
summary: `${name}의 doing 책임 중 가장 응집된 묶음을 새 ServiceProvider로 빼고, ${name}이 그에게 위임하도록 한다.`,
|
|
8
|
+
design_delta: {
|
|
9
|
+
added_classes: [{ name: `${name}Service`, stereotype: "ServiceProvider" }],
|
|
10
|
+
moved_responsibilities: [
|
|
11
|
+
{ text: "<응집된 doing 묶음>", from: card?.id ?? "target", to: `${slug(name)}-service` },
|
|
12
|
+
],
|
|
13
|
+
added_collaborations: [
|
|
14
|
+
{ from: card?.id ?? "target", to: `${slug(name)}-service`, message: "perform()" },
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
tradeoffs: {
|
|
18
|
+
pros: ["원본 클래스가 가벼워진다", "테스트 단위가 작아진다"],
|
|
19
|
+
cons: ["호출자 입장에서 협력자 수가 늘어남", "추출 경계가 모호하면 인위적"],
|
|
20
|
+
},
|
|
21
|
+
cho_younghos_lens: {
|
|
22
|
+
cohesion: "improves",
|
|
23
|
+
coupling: "neutral",
|
|
24
|
+
testability: "improves",
|
|
25
|
+
notes: "응집된 행위가 한곳에 모이고, 단위테스트 대상이 명확해진다.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "split-extract-strategy",
|
|
30
|
+
label: "Strategy로 추출",
|
|
31
|
+
summary: `${name}의 가변 부분(알고리즘/정책)을 인터페이스 뒤로 빼고 구현체를 주입한다.`,
|
|
32
|
+
design_delta: {
|
|
33
|
+
added_classes: [{ name: `${name}Strategy`, stereotype: "ServiceProvider" }],
|
|
34
|
+
added_collaborations: [
|
|
35
|
+
{ from: card?.id ?? "target", to: `${slug(name)}-strategy`, message: "decide()" },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
tradeoffs: {
|
|
39
|
+
pros: ["테스트에서 페이크 주입 용이", "변형 추가가 OCP에 가까워짐"],
|
|
40
|
+
cons: ["인터페이스 1개 증가", "정책이 1개뿐이라면 과설계"],
|
|
41
|
+
},
|
|
42
|
+
cho_younghos_lens: {
|
|
43
|
+
cohesion: "improves",
|
|
44
|
+
coupling: "neutral",
|
|
45
|
+
testability: "improves",
|
|
46
|
+
notes: "non-newable 의존(난수/시각/외부)을 격리하는 데 특히 유리.",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "split-extract-value",
|
|
51
|
+
label: "값 객체로 추출",
|
|
52
|
+
summary: `${name}의 knowing 묶음을 InformationHolder(값 객체)로 빼낸다.`,
|
|
53
|
+
design_delta: {
|
|
54
|
+
added_classes: [{ name: `${name}Value`, stereotype: "InformationHolder" }],
|
|
55
|
+
moved_responsibilities: [
|
|
56
|
+
{ text: "<응집된 knowing 묶음>", from: card?.id ?? "target", to: `${slug(name)}-value` },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
tradeoffs: {
|
|
60
|
+
pros: ["원시 타입 강박이 사라진다", "유효성 검증이 한곳에 모임"],
|
|
61
|
+
cons: ["진짜 도메인 개념이 아니면 표면적인 추상"],
|
|
62
|
+
},
|
|
63
|
+
cho_younghos_lens: {
|
|
64
|
+
cohesion: "improves",
|
|
65
|
+
coupling: "improves",
|
|
66
|
+
testability: "improves",
|
|
67
|
+
notes: "데이터 무결성 책임이 값 객체로 모여 사이드이펙트 노출이 줄어든다.",
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "split-keep-and-shrink",
|
|
72
|
+
label: "현재 위치 유지 + 책임 축소",
|
|
73
|
+
summary: "분리 대신 일부 책임을 제거하거나 더 작은 표현으로 바꾼다.",
|
|
74
|
+
design_delta: {},
|
|
75
|
+
tradeoffs: {
|
|
76
|
+
pros: ["변경 비용 최소", "과설계 회피"],
|
|
77
|
+
cons: ["god-object 가능성이 남아 있음"],
|
|
78
|
+
},
|
|
79
|
+
cho_younghos_lens: {
|
|
80
|
+
cohesion: "neutral",
|
|
81
|
+
coupling: "neutral",
|
|
82
|
+
testability: "neutral",
|
|
83
|
+
notes: "통증이 본격적으로 보이지 않으면 가장 안전한 선택이 될 수 있다.",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
function slug(s) {
|
|
89
|
+
return s
|
|
90
|
+
.replace(/([a-z])([A-Z])/g, "$1-$2")
|
|
91
|
+
.toLowerCase()
|
|
92
|
+
.replace(/[^a-z0-9-]/g, "-");
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=classSplit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classSplit.js","sourceRoot":"","sources":["../../../src/tradeoff/heuristics/classSplit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export function collaborationShapeSeeds(involved) {
|
|
2
|
+
const [a = "A", b = "B"] = involved;
|
|
3
|
+
return [
|
|
4
|
+
{
|
|
5
|
+
id: "shape-tell-dont-ask",
|
|
6
|
+
label: "Tell-Don't-Ask",
|
|
7
|
+
summary: `${a}이 ${b}에게 작업을 명령한다. ${b}이 자신의 데이터로 결정/행동을 수행.`,
|
|
8
|
+
design_delta: {
|
|
9
|
+
added_collaborations: [{ from: a, to: b, message: "perform()" }],
|
|
10
|
+
},
|
|
11
|
+
tradeoffs: {
|
|
12
|
+
pros: ["조회 메시지 감소", "데이터 곁에 행위", "캡슐화 강화"],
|
|
13
|
+
cons: ["수신자가 무거워질 수 있음"],
|
|
14
|
+
},
|
|
15
|
+
cho_younghos_lens: {
|
|
16
|
+
cohesion: "improves",
|
|
17
|
+
coupling: "improves",
|
|
18
|
+
testability: "improves",
|
|
19
|
+
notes: "조영호님이 강조하는 객체지향의 기본기. 우선 시도 가치가 가장 높음.",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "shape-pull",
|
|
24
|
+
label: "Pull (조회) 모델",
|
|
25
|
+
summary: `${a}이 ${b}에게서 데이터를 조회한 뒤 ${a} 자신이 결정/행동한다.`,
|
|
26
|
+
design_delta: {
|
|
27
|
+
added_collaborations: [{ from: a, to: b, message: "getState()" }],
|
|
28
|
+
},
|
|
29
|
+
tradeoffs: {
|
|
30
|
+
pros: ["호출자가 흐름을 한곳에서 통제"],
|
|
31
|
+
cons: ["Feature Envy 발생 가능", "캡슐화 약화"],
|
|
32
|
+
},
|
|
33
|
+
cho_younghos_lens: {
|
|
34
|
+
cohesion: "neutral",
|
|
35
|
+
coupling: "hurts",
|
|
36
|
+
testability: "neutral",
|
|
37
|
+
notes: "Tell-Don't-Ask가 어려운 경우(외부 시스템 데이터 등)에만 사용.",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: "shape-event",
|
|
42
|
+
label: "이벤트/알림 모델",
|
|
43
|
+
summary: `${a}이 사건을 발행하고 관심 있는 ${b}이 이를 구독해 자체적으로 반응한다.`,
|
|
44
|
+
design_delta: {
|
|
45
|
+
added_collaborations: [{ from: a, to: b, message: "<event>" }],
|
|
46
|
+
},
|
|
47
|
+
tradeoffs: {
|
|
48
|
+
pros: ["발신자가 수신자를 알 필요 없음", "확장 용이"],
|
|
49
|
+
cons: ["흐름 추적이 어려워짐", "디버깅 비용 증가"],
|
|
50
|
+
},
|
|
51
|
+
cho_younghos_lens: {
|
|
52
|
+
cohesion: "improves",
|
|
53
|
+
coupling: "improves",
|
|
54
|
+
testability: "neutral",
|
|
55
|
+
notes: "도메인 이벤트가 자연스러운 모델일 때만 채택.",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "shape-mediator",
|
|
60
|
+
label: "Mediator 도입",
|
|
61
|
+
summary: `${a}과 ${b} 사이에 Mediator를 두고 양쪽 모두 Mediator만 안다.`,
|
|
62
|
+
design_delta: {
|
|
63
|
+
added_classes: [{ name: `${a}${b}Mediator`, stereotype: "Coordinator" }],
|
|
64
|
+
added_collaborations: [
|
|
65
|
+
{ from: a, to: `${a}${b}Mediator`.toLowerCase(), message: "notify()" },
|
|
66
|
+
{ from: `${a}${b}Mediator`.toLowerCase(), to: b, message: "perform()" },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
tradeoffs: {
|
|
70
|
+
pros: ["양쪽 직접 결합이 사라진다"],
|
|
71
|
+
cons: ["객체 수 증가", "단순 호출에는 과한 구조"],
|
|
72
|
+
},
|
|
73
|
+
cho_younghos_lens: {
|
|
74
|
+
cohesion: "neutral",
|
|
75
|
+
coupling: "improves",
|
|
76
|
+
testability: "neutral",
|
|
77
|
+
notes: "협력 그래프 사이클이나 다대다 결합이 있을 때만 고려.",
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=collaborationShape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collaborationShape.js","sourceRoot":"","sources":["../../../src/tradeoff/heuristics/collaborationShape.ts"],"names":[],"mappings":"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"}
|