solmate-skills 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +6 -2
- package/README.md +142 -20
- package/awesome-design-md/.github/FUNDING.yml +4 -0
- package/awesome-design-md/.github/ISSUE_TEMPLATE/design-md-request.yml +46 -0
- package/awesome-design-md/CONTRIBUTING.md +28 -0
- package/awesome-design-md/LICENSE +21 -0
- package/awesome-design-md/README.md +172 -0
- package/awesome-design-md/design-md/airbnb/DESIGN.md +246 -0
- package/awesome-design-md/design-md/airbnb/README.md +23 -0
- package/awesome-design-md/design-md/airbnb/preview-dark.html +234 -0
- package/awesome-design-md/design-md/airbnb/preview.html +233 -0
- package/awesome-design-md/design-md/airtable/DESIGN.md +89 -0
- package/awesome-design-md/design-md/airtable/README.md +23 -0
- package/awesome-design-md/design-md/airtable/preview-dark.html +165 -0
- package/awesome-design-md/design-md/airtable/preview.html +164 -0
- package/awesome-design-md/design-md/apple/DESIGN.md +313 -0
- package/awesome-design-md/design-md/apple/README.md +24 -0
- package/awesome-design-md/design-md/apple/preview-dark.html +422 -0
- package/awesome-design-md/design-md/apple/preview.html +416 -0
- package/awesome-design-md/design-md/bmw/DESIGN.md +180 -0
- package/awesome-design-md/design-md/bmw/README.md +23 -0
- package/awesome-design-md/design-md/bmw/preview-dark.html +211 -0
- package/awesome-design-md/design-md/bmw/preview.html +210 -0
- package/awesome-design-md/design-md/cal/DESIGN.md +259 -0
- package/awesome-design-md/design-md/cal/README.md +23 -0
- package/awesome-design-md/design-md/cal/preview-dark.html +449 -0
- package/awesome-design-md/design-md/cal/preview.html +575 -0
- package/awesome-design-md/design-md/claude/DESIGN.md +312 -0
- package/awesome-design-md/design-md/claude/README.md +24 -0
- package/awesome-design-md/design-md/claude/preview-dark.html +803 -0
- package/awesome-design-md/design-md/claude/preview.html +826 -0
- package/awesome-design-md/design-md/clay/DESIGN.md +304 -0
- package/awesome-design-md/design-md/clay/README.md +23 -0
- package/awesome-design-md/design-md/clay/preview-dark.html +318 -0
- package/awesome-design-md/design-md/clay/preview.html +317 -0
- package/awesome-design-md/design-md/clickhouse/DESIGN.md +281 -0
- package/awesome-design-md/design-md/clickhouse/README.md +24 -0
- package/awesome-design-md/design-md/clickhouse/preview-dark.html +834 -0
- package/awesome-design-md/design-md/clickhouse/preview.html +786 -0
- package/awesome-design-md/design-md/cohere/DESIGN.md +266 -0
- package/awesome-design-md/design-md/cohere/README.md +24 -0
- package/awesome-design-md/design-md/cohere/preview-dark.html +810 -0
- package/awesome-design-md/design-md/cohere/preview.html +814 -0
- package/awesome-design-md/design-md/coinbase/DESIGN.md +129 -0
- package/awesome-design-md/design-md/coinbase/README.md +23 -0
- package/awesome-design-md/design-md/coinbase/preview-dark.html +164 -0
- package/awesome-design-md/design-md/coinbase/preview.html +163 -0
- package/awesome-design-md/design-md/composio/DESIGN.md +307 -0
- package/awesome-design-md/design-md/composio/README.md +24 -0
- package/awesome-design-md/design-md/composio/preview-dark.html +958 -0
- package/awesome-design-md/design-md/composio/preview.html +933 -0
- package/awesome-design-md/design-md/cursor/DESIGN.md +309 -0
- package/awesome-design-md/design-md/cursor/README.md +24 -0
- package/awesome-design-md/design-md/cursor/preview-dark.html +395 -0
- package/awesome-design-md/design-md/cursor/preview.html +385 -0
- package/awesome-design-md/design-md/elevenlabs/DESIGN.md +265 -0
- package/awesome-design-md/design-md/elevenlabs/README.md +23 -0
- package/awesome-design-md/design-md/elevenlabs/preview-dark.html +254 -0
- package/awesome-design-md/design-md/elevenlabs/preview.html +253 -0
- package/awesome-design-md/design-md/expo/DESIGN.md +281 -0
- package/awesome-design-md/design-md/expo/README.md +24 -0
- package/awesome-design-md/design-md/expo/preview-dark.html +536 -0
- package/awesome-design-md/design-md/expo/preview.html +536 -0
- package/awesome-design-md/design-md/figma/DESIGN.md +220 -0
- package/awesome-design-md/design-md/figma/README.md +24 -0
- package/awesome-design-md/design-md/figma/preview-dark.html +831 -0
- package/awesome-design-md/design-md/figma/preview.html +841 -0
- package/awesome-design-md/design-md/framer/DESIGN.md +246 -0
- package/awesome-design-md/design-md/framer/README.md +23 -0
- package/awesome-design-md/design-md/framer/preview-dark.html +904 -0
- package/awesome-design-md/design-md/framer/preview.html +885 -0
- package/awesome-design-md/design-md/hashicorp/DESIGN.md +278 -0
- package/awesome-design-md/design-md/hashicorp/README.md +24 -0
- package/awesome-design-md/design-md/hashicorp/preview-dark.html +1206 -0
- package/awesome-design-md/design-md/hashicorp/preview.html +1195 -0
- package/awesome-design-md/design-md/ibm/DESIGN.md +332 -0
- package/awesome-design-md/design-md/ibm/README.md +24 -0
- package/awesome-design-md/design-md/ibm/preview-dark.html +445 -0
- package/awesome-design-md/design-md/ibm/preview.html +430 -0
- package/awesome-design-md/design-md/intercom/DESIGN.md +146 -0
- package/awesome-design-md/design-md/intercom/README.md +23 -0
- package/awesome-design-md/design-md/intercom/preview-dark.html +185 -0
- package/awesome-design-md/design-md/intercom/preview.html +184 -0
- package/awesome-design-md/design-md/kraken/DESIGN.md +125 -0
- package/awesome-design-md/design-md/kraken/README.md +23 -0
- package/awesome-design-md/design-md/kraken/preview-dark.html +169 -0
- package/awesome-design-md/design-md/kraken/preview.html +168 -0
- package/awesome-design-md/design-md/linear.app/DESIGN.md +367 -0
- package/awesome-design-md/design-md/linear.app/README.md +24 -0
- package/awesome-design-md/design-md/linear.app/preview-dark.html +385 -0
- package/awesome-design-md/design-md/linear.app/preview.html +375 -0
- package/awesome-design-md/design-md/lovable/DESIGN.md +298 -0
- package/awesome-design-md/design-md/lovable/README.md +24 -0
- package/awesome-design-md/design-md/lovable/preview-dark.html +351 -0
- package/awesome-design-md/design-md/lovable/preview.html +350 -0
- package/awesome-design-md/design-md/minimax/DESIGN.md +257 -0
- package/awesome-design-md/design-md/minimax/README.md +24 -0
- package/awesome-design-md/design-md/minimax/preview-dark.html +1267 -0
- package/awesome-design-md/design-md/minimax/preview.html +1253 -0
- package/awesome-design-md/design-md/mintlify/DESIGN.md +326 -0
- package/awesome-design-md/design-md/mintlify/README.md +24 -0
- package/awesome-design-md/design-md/mintlify/preview-dark.html +411 -0
- package/awesome-design-md/design-md/mintlify/preview.html +400 -0
- package/awesome-design-md/design-md/miro/DESIGN.md +108 -0
- package/awesome-design-md/design-md/miro/README.md +23 -0
- package/awesome-design-md/design-md/miro/preview-dark.html +174 -0
- package/awesome-design-md/design-md/miro/preview.html +173 -0
- package/awesome-design-md/design-md/mistral.ai/DESIGN.md +261 -0
- package/awesome-design-md/design-md/mistral.ai/README.md +24 -0
- package/awesome-design-md/design-md/mistral.ai/preview-dark.html +813 -0
- package/awesome-design-md/design-md/mistral.ai/preview.html +812 -0
- package/awesome-design-md/design-md/mongodb/DESIGN.md +266 -0
- package/awesome-design-md/design-md/mongodb/README.md +23 -0
- package/awesome-design-md/design-md/mongodb/preview-dark.html +262 -0
- package/awesome-design-md/design-md/mongodb/preview.html +261 -0
- package/awesome-design-md/design-md/notion/DESIGN.md +309 -0
- package/awesome-design-md/design-md/notion/README.md +24 -0
- package/awesome-design-md/design-md/notion/preview-dark.html +374 -0
- package/awesome-design-md/design-md/notion/preview.html +366 -0
- package/awesome-design-md/design-md/nvidia/DESIGN.md +293 -0
- package/awesome-design-md/design-md/nvidia/README.md +24 -0
- package/awesome-design-md/design-md/nvidia/preview-dark.html +376 -0
- package/awesome-design-md/design-md/nvidia/preview.html +368 -0
- package/awesome-design-md/design-md/ollama/DESIGN.md +267 -0
- package/awesome-design-md/design-md/ollama/README.md +24 -0
- package/awesome-design-md/design-md/ollama/preview-dark.html +678 -0
- package/awesome-design-md/design-md/ollama/preview.html +678 -0
- package/awesome-design-md/design-md/opencode.ai/DESIGN.md +281 -0
- package/awesome-design-md/design-md/opencode.ai/README.md +24 -0
- package/awesome-design-md/design-md/opencode.ai/preview-dark.html +368 -0
- package/awesome-design-md/design-md/opencode.ai/preview.html +359 -0
- package/awesome-design-md/design-md/pinterest/DESIGN.md +230 -0
- package/awesome-design-md/design-md/pinterest/README.md +23 -0
- package/awesome-design-md/design-md/pinterest/preview-dark.html +233 -0
- package/awesome-design-md/design-md/pinterest/preview.html +232 -0
- package/awesome-design-md/design-md/posthog/DESIGN.md +256 -0
- package/awesome-design-md/design-md/posthog/README.md +23 -0
- package/awesome-design-md/design-md/posthog/preview-dark.html +701 -0
- package/awesome-design-md/design-md/posthog/preview.html +751 -0
- package/awesome-design-md/design-md/raycast/DESIGN.md +268 -0
- package/awesome-design-md/design-md/raycast/README.md +23 -0
- package/awesome-design-md/design-md/raycast/preview-dark.html +608 -0
- package/awesome-design-md/design-md/raycast/preview.html +690 -0
- package/awesome-design-md/design-md/replicate/DESIGN.md +261 -0
- package/awesome-design-md/design-md/replicate/README.md +24 -0
- package/awesome-design-md/design-md/replicate/preview-dark.html +828 -0
- package/awesome-design-md/design-md/replicate/preview.html +831 -0
- package/awesome-design-md/design-md/resend/DESIGN.md +303 -0
- package/awesome-design-md/design-md/resend/README.md +23 -0
- package/awesome-design-md/design-md/resend/preview-dark.html +357 -0
- package/awesome-design-md/design-md/resend/preview.html +356 -0
- package/awesome-design-md/design-md/revolut/DESIGN.md +185 -0
- package/awesome-design-md/design-md/revolut/README.md +23 -0
- package/awesome-design-md/design-md/revolut/preview-dark.html +234 -0
- package/awesome-design-md/design-md/revolut/preview.html +233 -0
- package/awesome-design-md/design-md/runwayml/DESIGN.md +244 -0
- package/awesome-design-md/design-md/runwayml/README.md +24 -0
- package/awesome-design-md/design-md/runwayml/preview-dark.html +664 -0
- package/awesome-design-md/design-md/runwayml/preview.html +665 -0
- package/awesome-design-md/design-md/sanity/DESIGN.md +357 -0
- package/awesome-design-md/design-md/sanity/README.md +24 -0
- package/awesome-design-md/design-md/sanity/preview-dark.html +995 -0
- package/awesome-design-md/design-md/sanity/preview.html +1140 -0
- package/awesome-design-md/design-md/sentry/DESIGN.md +262 -0
- package/awesome-design-md/design-md/sentry/README.md +24 -0
- package/awesome-design-md/design-md/sentry/preview-dark.html +628 -0
- package/awesome-design-md/design-md/sentry/preview.html +953 -0
- package/awesome-design-md/design-md/spacex/DESIGN.md +194 -0
- package/awesome-design-md/design-md/spacex/README.md +23 -0
- package/awesome-design-md/design-md/spacex/preview-dark.html +223 -0
- package/awesome-design-md/design-md/spacex/preview.html +222 -0
- package/awesome-design-md/design-md/spotify/DESIGN.md +246 -0
- package/awesome-design-md/design-md/spotify/README.md +23 -0
- package/awesome-design-md/design-md/spotify/preview-dark.html +231 -0
- package/awesome-design-md/design-md/spotify/preview.html +230 -0
- package/awesome-design-md/design-md/stripe/DESIGN.md +322 -0
- package/awesome-design-md/design-md/stripe/README.md +24 -0
- package/awesome-design-md/design-md/stripe/preview-dark.html +430 -0
- package/awesome-design-md/design-md/stripe/preview.html +421 -0
- package/awesome-design-md/design-md/supabase/DESIGN.md +255 -0
- package/awesome-design-md/design-md/supabase/README.md +24 -0
- package/awesome-design-md/design-md/supabase/preview-dark.html +977 -0
- package/awesome-design-md/design-md/supabase/preview.html +955 -0
- package/awesome-design-md/design-md/superhuman/DESIGN.md +252 -0
- package/awesome-design-md/design-md/superhuman/README.md +23 -0
- package/awesome-design-md/design-md/superhuman/preview-dark.html +975 -0
- package/awesome-design-md/design-md/superhuman/preview.html +953 -0
- package/awesome-design-md/design-md/together.ai/DESIGN.md +263 -0
- package/awesome-design-md/design-md/together.ai/README.md +24 -0
- package/awesome-design-md/design-md/together.ai/preview-dark.html +892 -0
- package/awesome-design-md/design-md/together.ai/preview.html +897 -0
- package/awesome-design-md/design-md/uber/DESIGN.md +295 -0
- package/awesome-design-md/design-md/uber/README.md +24 -0
- package/awesome-design-md/design-md/uber/preview-dark.html +1164 -0
- package/awesome-design-md/design-md/uber/preview.html +1163 -0
- package/awesome-design-md/design-md/vercel/DESIGN.md +310 -0
- package/awesome-design-md/design-md/vercel/README.md +24 -0
- package/awesome-design-md/design-md/vercel/preview-dark.html +370 -0
- package/awesome-design-md/design-md/vercel/preview.html +369 -0
- package/awesome-design-md/design-md/voltagent/DESIGN.md +323 -0
- package/awesome-design-md/design-md/voltagent/README.md +24 -0
- package/awesome-design-md/design-md/voltagent/preview-dark.html +487 -0
- package/awesome-design-md/design-md/voltagent/preview.html +766 -0
- package/awesome-design-md/design-md/warp/DESIGN.md +253 -0
- package/awesome-design-md/design-md/warp/README.md +23 -0
- package/awesome-design-md/design-md/warp/preview-dark.html +502 -0
- package/awesome-design-md/design-md/warp/preview.html +535 -0
- package/awesome-design-md/design-md/webflow/DESIGN.md +92 -0
- package/awesome-design-md/design-md/webflow/README.md +23 -0
- package/awesome-design-md/design-md/webflow/preview-dark.html +147 -0
- package/awesome-design-md/design-md/webflow/preview.html +146 -0
- package/awesome-design-md/design-md/wise/DESIGN.md +173 -0
- package/awesome-design-md/design-md/wise/README.md +23 -0
- package/awesome-design-md/design-md/wise/preview-dark.html +230 -0
- package/awesome-design-md/design-md/wise/preview.html +229 -0
- package/awesome-design-md/design-md/x.ai/DESIGN.md +257 -0
- package/awesome-design-md/design-md/x.ai/README.md +24 -0
- package/awesome-design-md/design-md/x.ai/preview-dark.html +358 -0
- package/awesome-design-md/design-md/x.ai/preview.html +409 -0
- package/awesome-design-md/design-md/zapier/DESIGN.md +328 -0
- package/awesome-design-md/design-md/zapier/README.md +24 -0
- package/awesome-design-md/design-md/zapier/preview-dark.html +382 -0
- package/awesome-design-md/design-md/zapier/preview.html +374 -0
- package/bin/cli.js +1 -1
- package/business-plan/SKILL.md +227 -0
- package/dev-docs/SKILL.md +178 -0
- package/k-skill/.changeset/config.json +11 -0
- package/k-skill/.github/release-please/python-config.json +3 -0
- package/k-skill/.github/release-please/python-manifest.json +1 -0
- package/k-skill/.github/workflows/ci.yml +21 -0
- package/k-skill/.github/workflows/release-npm.yml +51 -0
- package/k-skill/.github/workflows/release-python.yml +41 -0
- package/k-skill/AGENTS.md +36 -0
- package/k-skill/CLAUDE.md +5 -0
- package/k-skill/LICENSE +21 -0
- package/k-skill/README.md +83 -0
- package/k-skill/blue-ribbon-nearby/SKILL.md +132 -0
- package/k-skill/coupang-product-search/SKILL.md +136 -0
- package/k-skill/daiso-product-search/SKILL.md +165 -0
- package/k-skill/delivery-tracking/SKILL.md +368 -0
- package/k-skill/docs/assets/k-skill-thumbnail.png +0 -0
- package/k-skill/docs/features/blue-ribbon-nearby.md +128 -0
- package/k-skill/docs/features/coupang-product-search.md +103 -0
- package/k-skill/docs/features/daiso-product-search.md +83 -0
- package/k-skill/docs/features/delivery-tracking.md +301 -0
- package/k-skill/docs/features/fine-dust-location.md +128 -0
- package/k-skill/docs/features/hwp.md +105 -0
- package/k-skill/docs/features/k-skill-proxy.md +82 -0
- package/k-skill/docs/features/kakao-bar-nearby.md +107 -0
- package/k-skill/docs/features/kakaotalk-mac.md +60 -0
- package/k-skill/docs/features/kbo-results.md +49 -0
- package/k-skill/docs/features/kleague-results.md +62 -0
- package/k-skill/docs/features/korean-law-search.md +127 -0
- package/k-skill/docs/features/ktx-booking.md +99 -0
- package/k-skill/docs/features/lotto-results.md +41 -0
- package/k-skill/docs/features/seoul-subway-arrival.md +61 -0
- package/k-skill/docs/features/srt-booking.md +67 -0
- package/k-skill/docs/features/toss-securities.md +83 -0
- package/k-skill/docs/features/used-car-price-search.md +86 -0
- package/k-skill/docs/features/zipcode-search.md +100 -0
- package/k-skill/docs/install.md +167 -0
- package/k-skill/docs/releasing.md +51 -0
- package/k-skill/docs/roadmap.md +135 -0
- package/k-skill/docs/security-and-secrets.md +69 -0
- package/k-skill/docs/setup.md +75 -0
- package/k-skill/docs/sources.md +47 -0
- package/k-skill/ecosystem.config.cjs +16 -0
- package/k-skill/examples/secrets.env.example +7 -0
- package/k-skill/fine-dust-location/SKILL.md +99 -0
- package/k-skill/hwp/SKILL.md +182 -0
- package/k-skill/k-skill-setup/SKILL.md +180 -0
- package/k-skill/kakao-bar-nearby/SKILL.md +86 -0
- package/k-skill/kakaotalk-mac/SKILL.md +167 -0
- package/k-skill/kbo-results/SKILL.md +92 -0
- package/k-skill/kleague-results/SKILL.md +102 -0
- package/k-skill/korean-law-search/SKILL.md +174 -0
- package/k-skill/ktx-booking/SKILL.md +138 -0
- package/k-skill/lotto-results/SKILL.md +90 -0
- package/k-skill/package.json +25 -0
- package/k-skill/packages/blue-ribbon-nearby/CHANGELOG.md +7 -0
- package/k-skill/packages/blue-ribbon-nearby/README.md +80 -0
- package/k-skill/packages/blue-ribbon-nearby/package.json +32 -0
- package/k-skill/packages/blue-ribbon-nearby/src/index.js +255 -0
- package/k-skill/packages/blue-ribbon-nearby/src/parse.js +309 -0
- package/k-skill/packages/blue-ribbon-nearby/test/fixtures/restaurants-map.json +48 -0
- package/k-skill/packages/blue-ribbon-nearby/test/fixtures/search-zone.html +17 -0
- package/k-skill/packages/blue-ribbon-nearby/test/index.test.js +159 -0
- package/k-skill/packages/daiso-product-search/CHANGELOG.md +7 -0
- package/k-skill/packages/daiso-product-search/README.md +80 -0
- package/k-skill/packages/daiso-product-search/package.json +32 -0
- package/k-skill/packages/daiso-product-search/src/index.js +183 -0
- package/k-skill/packages/daiso-product-search/src/parse.js +385 -0
- package/k-skill/packages/daiso-product-search/test/fixtures/online-stock.json +11 -0
- package/k-skill/packages/daiso-product-search/test/fixtures/search-goods.json +72 -0
- package/k-skill/packages/daiso-product-search/test/fixtures/store-detail.json +19 -0
- package/k-skill/packages/daiso-product-search/test/fixtures/store-pickup-stock.json +13 -0
- package/k-skill/packages/daiso-product-search/test/fixtures/store-search.json +38 -0
- package/k-skill/packages/daiso-product-search/test/index.test.js +454 -0
- package/k-skill/packages/k-lotto/CHANGELOG.md +7 -0
- package/k-skill/packages/k-lotto/README.md +44 -0
- package/k-skill/packages/k-lotto/package.json +31 -0
- package/k-skill/packages/k-lotto/src/index.js +107 -0
- package/k-skill/packages/k-lotto/src/parse.js +209 -0
- package/k-skill/packages/k-lotto/test/fixtures/latest-result.html +6 -0
- package/k-skill/packages/k-lotto/test/fixtures/round-1216.json +43 -0
- package/k-skill/packages/k-lotto/test/index.test.js +95 -0
- package/k-skill/packages/k-skill-proxy/README.md +40 -0
- package/k-skill/packages/k-skill-proxy/package.json +18 -0
- package/k-skill/packages/k-skill-proxy/src/airkorea.js +427 -0
- package/k-skill/packages/k-skill-proxy/src/server.js +448 -0
- package/k-skill/packages/k-skill-proxy/test/airkorea.test.js +195 -0
- package/k-skill/packages/k-skill-proxy/test/server.test.js +324 -0
- package/k-skill/packages/kakao-bar-nearby/CHANGELOG.md +7 -0
- package/k-skill/packages/kakao-bar-nearby/README.md +73 -0
- package/k-skill/packages/kakao-bar-nearby/package.json +33 -0
- package/k-skill/packages/kakao-bar-nearby/src/index.js +231 -0
- package/k-skill/packages/kakao-bar-nearby/src/parse.js +308 -0
- package/k-skill/packages/kakao-bar-nearby/test/fixtures/anchor-panel.json +21 -0
- package/k-skill/packages/kakao-bar-nearby/test/fixtures/anchor-search.html +22 -0
- package/k-skill/packages/kakao-bar-nearby/test/fixtures/bar-search.html +47 -0
- package/k-skill/packages/kakao-bar-nearby/test/fixtures/closed-bar-panel.json +72 -0
- package/k-skill/packages/kakao-bar-nearby/test/fixtures/non-bar-panel.json +28 -0
- package/k-skill/packages/kakao-bar-nearby/test/fixtures/open-bar-panel.json +80 -0
- package/k-skill/packages/kakao-bar-nearby/test/index.test.js +457 -0
- package/k-skill/packages/kleague-results/CHANGELOG.md +7 -0
- package/k-skill/packages/kleague-results/README.md +65 -0
- package/k-skill/packages/kleague-results/package.json +31 -0
- package/k-skill/packages/kleague-results/src/index.js +139 -0
- package/k-skill/packages/kleague-results/src/parse.js +387 -0
- package/k-skill/packages/kleague-results/test/fixtures/schedule-kleague1-2026-03.json +2195 -0
- package/k-skill/packages/kleague-results/test/fixtures/standings-kleague1-2026.json +1102 -0
- package/k-skill/packages/kleague-results/test/index.test.js +154 -0
- package/k-skill/packages/toss-securities/CHANGELOG.md +7 -0
- package/k-skill/packages/toss-securities/README.md +73 -0
- package/k-skill/packages/toss-securities/package.json +32 -0
- package/k-skill/packages/toss-securities/src/index.js +98 -0
- package/k-skill/packages/toss-securities/src/parse.js +123 -0
- package/k-skill/packages/toss-securities/test/index.test.js +103 -0
- package/k-skill/packages/used-car-price-search/CHANGELOG.md +7 -0
- package/k-skill/packages/used-car-price-search/README.md +50 -0
- package/k-skill/packages/used-car-price-search/package.json +32 -0
- package/k-skill/packages/used-car-price-search/src/index.js +51 -0
- package/k-skill/packages/used-car-price-search/src/providers/sk-tagobuy.js +123 -0
- package/k-skill/packages/used-car-price-search/src/search.js +87 -0
- package/k-skill/packages/used-car-price-search/src/util.js +41 -0
- package/k-skill/packages/used-car-price-search/test/fixtures/tb-empty.html +2 -0
- package/k-skill/packages/used-car-price-search/test/fixtures/tb-page.html +7 -0
- package/k-skill/packages/used-car-price-search/test/index.test.js +175 -0
- package/k-skill/python-packages/README.md +17 -0
- package/k-skill/scripts/check-setup.sh +29 -0
- package/k-skill/scripts/fine_dust.py +542 -0
- package/k-skill/scripts/fixtures/delivery-tracking-public-provenance.json +10 -0
- package/k-skill/scripts/fixtures/delivery-tracking-public-samples.json +51 -0
- package/k-skill/scripts/fixtures/fine-dust-measurements.json +35 -0
- package/k-skill/scripts/fixtures/fine-dust-stations.json +26 -0
- package/k-skill/scripts/ktx_booking.py +760 -0
- package/k-skill/scripts/run-k-skill-proxy.sh +15 -0
- package/k-skill/scripts/skill-docs.test.js +1104 -0
- package/k-skill/scripts/test_fine_dust.py +284 -0
- package/k-skill/scripts/test_ktx_booking.py +204 -0
- package/k-skill/scripts/validate-skills.sh +56 -0
- package/k-skill/seoul-subway-arrival/SKILL.md +95 -0
- package/k-skill/srt-booking/SKILL.md +150 -0
- package/k-skill/toss-securities/SKILL.md +106 -0
- package/k-skill/tsconfig.json +24 -0
- package/k-skill/used-car-price-search/SKILL.md +119 -0
- package/k-skill/zipcode-search/SKILL.md +144 -0
- package/manage-docs/SKILL.md +60 -327
- package/package.json +1 -1
- package/pitch-deck/SKILL.md +272 -0
- package/plan-docs/SKILL.md +156 -0
- package/product-workflow/SKILL.md +278 -0
- package/role-team-lead/SKILL.md +65 -0
- package/role-team-member/SKILL.md +74 -0
- package/verify-docs/SKILL.md +91 -16
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# 한국 법령 검색 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- `korean-law-mcp` 로 법령명 검색
|
|
6
|
+
- 특정 법령의 조문 본문 조회
|
|
7
|
+
- 판례 / 유권해석 / 자치법규 검색
|
|
8
|
+
- MCP 또는 CLI 경로 중 현재 환경에 맞는 방식 선택
|
|
9
|
+
- 기존 경로 장애 시 `법망` fallback으로 이어가기
|
|
10
|
+
|
|
11
|
+
## 가장 중요한 규칙
|
|
12
|
+
|
|
13
|
+
한국 법령 관련 검색/조회가 필요할 때는 **`korean-law-mcp`를 먼저 사용**합니다.
|
|
14
|
+
기존 서비스가 동작하지 않을 때만 승인된 fallback 표면인 **`법망`(`https://api.beopmang.org`)** 으로 전환합니다.
|
|
15
|
+
별도 repo package, 별도 python package, 임의 크롤러를 새로 만들지 않습니다.
|
|
16
|
+
|
|
17
|
+
## 먼저 필요한 것
|
|
18
|
+
|
|
19
|
+
- 인터넷 연결
|
|
20
|
+
- `node` 18+
|
|
21
|
+
- `npm install -g korean-law-mcp` (로컬 CLI/로컬 MCP server 경로일 때)
|
|
22
|
+
- remote MCP endpoint를 쓸 MCP 클라이언트
|
|
23
|
+
- `법망` fallback (`https://api.beopmang.org`) 에 접근할 수 있는 네트워크
|
|
24
|
+
|
|
25
|
+
무료 API key 발급처: `https://open.law.go.kr`
|
|
26
|
+
|
|
27
|
+
로컬 CLI 또는 로컬 MCP server 경로는 `LAW_OC` 가 필요하다.
|
|
28
|
+
remote MCP endpoint는 사용자 `LAW_OC` 없이 `url`만으로 연결한다.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install -g korean-law-mcp
|
|
32
|
+
export LAW_OC=your-api-key
|
|
33
|
+
|
|
34
|
+
korean-law list
|
|
35
|
+
korean-law help search_law
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
로컬 설치가 막히면 먼저 `https://korean-law-mcp.fly.dev/mcp` remote endpoint를 사용한다. 그 경로도 응답하지 않거나 서비스 장애가 나면 `법망`(`https://api.beopmang.org`) MCP/REST를 fallback으로 사용한다.
|
|
39
|
+
|
|
40
|
+
## MCP 연결 예시
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"korean-law": {
|
|
46
|
+
"command": "korean-law-mcp",
|
|
47
|
+
"env": {
|
|
48
|
+
"LAW_OC": "your-api-key"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
remote endpoint 예시:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"mcpServers": {
|
|
60
|
+
"korean-law": {
|
|
61
|
+
"url": "https://korean-law-mcp.fly.dev/mcp"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
위 remote 예시는 upstream 문서 기준으로 사용자 `LAW_OC` 를 따로 넣지 않는다. 사용자 쪽에서 준비할 것은 `url` 등록뿐이다.
|
|
68
|
+
|
|
69
|
+
## fallback: 법망
|
|
70
|
+
|
|
71
|
+
기존 `korean-law-mcp` 경로가 동작하지 않을 때만 `법망`을 사용한다.
|
|
72
|
+
|
|
73
|
+
### MCP fallback
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"mcpServers": {
|
|
78
|
+
"beopmang": {
|
|
79
|
+
"url": "https://api.beopmang.org/mcp"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### REST fallback 예시
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
curl "https://api.beopmang.org/api/v4/law?action=search&q=관세법"
|
|
89
|
+
curl "https://api.beopmang.org/api/v4/tools?action=overview&law_id=001706"
|
|
90
|
+
curl "https://api.beopmang.org/api/v4/law?action=get&law_id=001706&article=제750조"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 기본 흐름
|
|
94
|
+
|
|
95
|
+
1. 질의가 법령/판례/행정해석/자치법규 중 어디에 가까운지 분류한다.
|
|
96
|
+
2. 법령명만 찾으면 `search_law` 를 먼저 쓴다.
|
|
97
|
+
3. 특정 조문이 필요하면 `search_law` 또는 `search_all` 로 식별자(`mst`)를 확인한 뒤 `get_law_text` 를 호출한다.
|
|
98
|
+
4. 판례는 `search_precedents`, 유권해석은 `search_interpretations`, 자치법규는 `search_ordinance` 를 우선 사용한다.
|
|
99
|
+
5. 범주가 애매하면 `search_all` 로 시작한다.
|
|
100
|
+
6. `korean-law-mcp` 경로가 설치/네트워크/서비스 장애로 막히면 `법망` fallback으로 전환한다.
|
|
101
|
+
7. fallback 검색 결과가 0건이어도 바로 "관련 규범이 없다"고 단정하지 말고 검색어와 범주를 다시 확인한다.
|
|
102
|
+
|
|
103
|
+
## CLI 예시
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
korean-law search_law --query "관세법"
|
|
107
|
+
korean-law get_law_text --mst 160001 --jo "제38조"
|
|
108
|
+
korean-law search_precedents --query "부당해고"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 운영 팁
|
|
112
|
+
|
|
113
|
+
- `화관법` 같은 약칭은 `search_law` / `search_all` 로 정식 법령명을 먼저 확인한다.
|
|
114
|
+
- 조문 번호가 헷갈리면 `get_law_text` 전에 법령 식별자부터 다시 확인한다.
|
|
115
|
+
- 로컬 CLI/MCP 경로를 쓰는데 `LAW_OC` 가 없으면 credential resolution order에 따라 확보를 안내한다.
|
|
116
|
+
- remote MCP endpoint를 쓰면 사용자 `LAW_OC` 없이 `url` 등록 상태만 확인한다.
|
|
117
|
+
- 기존 `korean-law-mcp` 경로가 실패하면 `https://api.beopmang.org/mcp` 또는 `/api/v4/law?action=search` 경로를 fallback으로 쓴다.
|
|
118
|
+
- 요약은 할 수 있지만 법률 자문처럼 단정적으로 결론을 내리지는 않는다.
|
|
119
|
+
|
|
120
|
+
## 라이브 확인 메모
|
|
121
|
+
|
|
122
|
+
2026-04-01 기준 smoke test 에서 아래 명령은 실제로 정상 동작했다.
|
|
123
|
+
|
|
124
|
+
- `korean-law list`
|
|
125
|
+
- `korean-law help search_law`
|
|
126
|
+
|
|
127
|
+
즉, `korean-law-mcp` CLI 설치와 기본 명령 진입은 검증했다. 실제 법령 검색은 로컬 CLI/MCP 경로라면 `LAW_OC` 가 준비된 환경에서 바로 이어서 사용할 수 있고, remote MCP endpoint는 사용자 `LAW_OC` 없이 URL 등록만으로 붙일 수 있다. 기존 경로 장애 시에는 `법망` fallback을 사용할 수 있다.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# KTX 예매 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- KTX/Korail 열차 조회
|
|
6
|
+
- 좌석 가능 여부 확인
|
|
7
|
+
- 예약 진행
|
|
8
|
+
- 예약 내역 확인
|
|
9
|
+
- 예약 취소
|
|
10
|
+
|
|
11
|
+
## 먼저 필요한 것
|
|
12
|
+
|
|
13
|
+
- Python 3.10+
|
|
14
|
+
- `python3 -m pip install korail2 pycryptodome`
|
|
15
|
+
- [공통 설정 가이드](../setup.md) 완료
|
|
16
|
+
- [보안/시크릿 정책](../security-and-secrets.md) 확인
|
|
17
|
+
|
|
18
|
+
## 필요한 환경변수
|
|
19
|
+
|
|
20
|
+
- `KSKILL_KTX_ID`
|
|
21
|
+
- `KSKILL_KTX_PASSWORD`
|
|
22
|
+
|
|
23
|
+
### Credential resolution order
|
|
24
|
+
|
|
25
|
+
1. **이미 환경변수에 있으면** 그대로 사용한다.
|
|
26
|
+
2. **에이전트가 자체 secret vault(1Password CLI, Bitwarden CLI, macOS Keychain 등)를 사용 중이면** 거기서 꺼내 환경변수로 주입해도 된다.
|
|
27
|
+
3. **`~/.config/k-skill/secrets.env`** (기본 fallback) — plain dotenv 파일, 퍼미션 `0600`.
|
|
28
|
+
4. **아무것도 없으면** 유저에게 물어서 2 또는 3에 저장한다.
|
|
29
|
+
|
|
30
|
+
## 입력값
|
|
31
|
+
|
|
32
|
+
- 출발역
|
|
33
|
+
- 도착역
|
|
34
|
+
- 날짜: `YYYYMMDD`
|
|
35
|
+
- 희망 시작 시각: `HHMMSS`
|
|
36
|
+
- 인원 수와 승객 유형
|
|
37
|
+
- 좌석 선호
|
|
38
|
+
- 조회 결과에서 복사한 `train_id`
|
|
39
|
+
|
|
40
|
+
## 왜 helper 를 쓰는가
|
|
41
|
+
|
|
42
|
+
현재 공개 배포된 `korail2` 0.4.0 예제만으로는 Korail 모바일 표면의 Dynapath anti-bot 체크에 막혀 `MACRO ERROR` 가 발생할 수 있다.
|
|
43
|
+
|
|
44
|
+
이 저장소의 `scripts/ktx_booking.py` 는 다음 값을 보강해서 실제 KTX 예약 흐름을 복구한다.
|
|
45
|
+
|
|
46
|
+
- `x-dynapath-m-token`
|
|
47
|
+
- `Sid`
|
|
48
|
+
- 최신 app version `250601002`
|
|
49
|
+
- 최신 Android user-agent
|
|
50
|
+
|
|
51
|
+
## 기본 흐름
|
|
52
|
+
|
|
53
|
+
1. `korail2` 또는 `pycryptodome` 패키지가 없으면 다른 방법으로 우회하지 말고 먼저 전역 설치한다.
|
|
54
|
+
2. `KSKILL_KTX_ID`, `KSKILL_KTX_PASSWORD` 가 없으면 credential resolution order에 따라 확보한다.
|
|
55
|
+
3. helper 로 먼저 열차를 조회한다.
|
|
56
|
+
4. 후보 열차의 `index`, `train_id`, 출발/도착 시각, KTX 여부, 좌석 여부를 보여준다.
|
|
57
|
+
5. 대상 열차가 명확할 때만 예약한다.
|
|
58
|
+
6. 예약 확인/취소는 대상 예약을 다시 식별한 뒤 진행한다.
|
|
59
|
+
|
|
60
|
+
## 예시
|
|
61
|
+
|
|
62
|
+
조회:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
python3 scripts/ktx_booking.py search 서울 부산 20260328 090000 --limit 5
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
좌석이 없는 열차까지 같이 보고 싶으면 `--include-no-seats`, 예약 대기 가능 열차도 같이 보고 싶으면 `--include-waiting-list` 를 붙인다.
|
|
69
|
+
|
|
70
|
+
응답 JSON 의 `train_id` 는 검색 시점의 정확한 열차를 가리키는 stable selector 다. 예약할 때는 이 값을 그대로 복사해서 쓴다. 같은 열차가 더 이상 조회되지 않으면 helper 가 실패하고 새로 조회하게 만든다.
|
|
71
|
+
|
|
72
|
+
예약:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
python3 scripts/ktx_booking.py reserve 서울 부산 20260328 090000 --train-id <train_id> --seat-option general-first
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
좌석이 없을 때 예약 대기까지 시도하려면 조회 단계에서도 `--include-waiting-list` 를 켜고, 예약 단계에서 `--try-waiting` 을 추가한다.
|
|
79
|
+
|
|
80
|
+
예약 확인:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
python3 scripts/ktx_booking.py reservations
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
취소:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
python3 scripts/ktx_booking.py cancel <reservation_id>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
응답은 JSON 으로 나오며 예약번호, 구입기한, 운임 확인에 바로 쓸 수 있다. **결제는 제외** 하고 예약까지만 자동화한다.
|
|
93
|
+
|
|
94
|
+
## 주의할 점
|
|
95
|
+
|
|
96
|
+
- SRT 예매와는 별도 표면이므로 혼용하지 않는다.
|
|
97
|
+
- credential은 환경변수로 주입한다.
|
|
98
|
+
- 결제 완료까지 자동화하는 범위는 아니다.
|
|
99
|
+
- Korail anti-bot 규칙이 다시 바뀌면 helper 도 함께 점검해야 한다.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 로또 결과 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- 최신 회차 확인
|
|
6
|
+
- 특정 회차 당첨번호 조회
|
|
7
|
+
- 번호 대조로 몇 등인지 확인
|
|
8
|
+
- 상세 당첨금 정보 확인
|
|
9
|
+
|
|
10
|
+
## 먼저 필요한 것
|
|
11
|
+
|
|
12
|
+
- Node.js 18+
|
|
13
|
+
- 배포 후: `npm install -g k-lotto`
|
|
14
|
+
- 실행 전: `export NODE_PATH="$(npm root -g)"`
|
|
15
|
+
- 이 저장소에서 개발할 때: 루트에서 `npm install`
|
|
16
|
+
|
|
17
|
+
## 입력값
|
|
18
|
+
|
|
19
|
+
- 회차 번호 또는 `latest`
|
|
20
|
+
- 선택 사항: 사용자의 번호 6개
|
|
21
|
+
|
|
22
|
+
## 기본 흐름
|
|
23
|
+
|
|
24
|
+
1. 패키지가 없으면 다른 방법으로 우회하지 말고 먼저 전역 설치합니다.
|
|
25
|
+
2. 최신 회차 또는 요청 회차를 확인합니다.
|
|
26
|
+
3. 당첨번호와 추첨일, 당첨금 분포를 요약합니다.
|
|
27
|
+
4. 사용자 번호가 있으면 일치 번호와 등수를 계산합니다.
|
|
28
|
+
|
|
29
|
+
## 예시
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
NODE_PATH="$(npm root -g)" node - <<'JS'
|
|
33
|
+
const lotto = require("k-lotto");
|
|
34
|
+
lotto.getDetailResult(1216).then((result) => console.log(JSON.stringify(result, null, 2)));
|
|
35
|
+
JS
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 주의할 점
|
|
39
|
+
|
|
40
|
+
- 사용자 번호는 영구 저장하지 않는 것을 기준으로 합니다.
|
|
41
|
+
- 최신 회차는 결과 페이지 HTML에서 읽고, 상세 결과는 공식 JSON 응답을 사용합니다.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# 서울 지하철 도착정보 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- 역 기준 실시간 도착 예정 열차 조회
|
|
6
|
+
- 상/하행 또는 외/내선 정보 확인
|
|
7
|
+
- 첫 번째/두 번째 도착 메시지 확인
|
|
8
|
+
- 개인 OpenAPI key 없이 `k-skill-proxy` 경유 조회
|
|
9
|
+
|
|
10
|
+
## 먼저 필요한 것
|
|
11
|
+
|
|
12
|
+
- [공통 설정 가이드](../setup.md) 완료
|
|
13
|
+
- [보안/시크릿 정책](../security-and-secrets.md) 확인
|
|
14
|
+
- self-host 또는 배포 확인이 끝난 proxy base URL: `KSKILL_PROXY_BASE_URL`
|
|
15
|
+
|
|
16
|
+
## 필요한 환경변수
|
|
17
|
+
|
|
18
|
+
- `KSKILL_PROXY_BASE_URL` (필수: self-host 또는 배포 확인이 끝난 proxy base URL)
|
|
19
|
+
|
|
20
|
+
사용자가 서울 열린데이터 광장 OpenAPI key를 직접 발급할 필요는 없다. 대신 `KSKILL_PROXY_BASE_URL` 은 `/v1/seoul-subway/arrival` route가 실제로 배포된 proxy를 가리켜야 한다. upstream key는 proxy 서버에서만 관리한다.
|
|
21
|
+
|
|
22
|
+
### Proxy resolution order
|
|
23
|
+
|
|
24
|
+
1. **`KSKILL_PROXY_BASE_URL` 이 있으면** 그 값을 사용합니다.
|
|
25
|
+
2. **없으면** 사용자/운영자에게 self-host 또는 배포 확인이 끝난 proxy URL 을 먼저 확보합니다.
|
|
26
|
+
3. **직접 proxy를 운영하는 경우에만** proxy 서버 upstream key를 서버 쪽에만 설정합니다.
|
|
27
|
+
|
|
28
|
+
## 입력값
|
|
29
|
+
|
|
30
|
+
- 역명
|
|
31
|
+
- 선택 사항: 가져올 건수
|
|
32
|
+
|
|
33
|
+
## 기본 흐름
|
|
34
|
+
|
|
35
|
+
1. `KSKILL_PROXY_BASE_URL` 로 self-host 또는 배포 확인이 끝난 proxy base URL 을 확인합니다.
|
|
36
|
+
2. `/v1/seoul-subway/arrival?stationName=...` 로 역명 기준 실시간 도착정보를 조회합니다.
|
|
37
|
+
3. 호선, 진행 방향, 도착 메시지, 조회 시점을 함께 요약합니다.
|
|
38
|
+
|
|
39
|
+
## 예시
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
curl -fsS --get 'https://your-proxy.example.com/v1/seoul-subway/arrival' \
|
|
43
|
+
--data-urlencode 'stationName=강남'
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
범위를 줄이거나 늘리고 싶으면:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
curl -fsS --get 'https://your-proxy.example.com/v1/seoul-subway/arrival' \
|
|
50
|
+
--data-urlencode 'stationName=서울역' \
|
|
51
|
+
--data-urlencode 'startIndex=0' \
|
|
52
|
+
--data-urlencode 'endIndex=4'
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 주의할 점
|
|
56
|
+
|
|
57
|
+
- 실시간 데이터라 몇 초 단위로 바뀔 수 있습니다.
|
|
58
|
+
- 역명 표기가 다르면 결과가 비어 있을 수 있습니다.
|
|
59
|
+
- 일일 호출 제한이나 quota 초과 가능성이 있습니다.
|
|
60
|
+
- public hosted route rollout 이 끝나기 전까지는 `KSKILL_PROXY_BASE_URL` 을 반드시 명시합니다.
|
|
61
|
+
- self-host proxy 설정은 [k-skill 프록시 서버 가이드](k-skill-proxy.md)를 봅니다.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# SRT 예매 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- 수서 출발 SRT 열차 조회
|
|
6
|
+
- 좌석 가능 여부 확인
|
|
7
|
+
- 예약 진행
|
|
8
|
+
- 예약 내역 확인
|
|
9
|
+
- 예약 취소
|
|
10
|
+
|
|
11
|
+
## 먼저 필요한 것
|
|
12
|
+
|
|
13
|
+
- Python 3.10+
|
|
14
|
+
- `python3 -m pip install SRTrain`
|
|
15
|
+
- [공통 설정 가이드](../setup.md) 완료
|
|
16
|
+
- [보안/시크릿 정책](../security-and-secrets.md) 확인
|
|
17
|
+
|
|
18
|
+
## 필요한 환경변수
|
|
19
|
+
|
|
20
|
+
- `KSKILL_SRT_ID`
|
|
21
|
+
- `KSKILL_SRT_PASSWORD`
|
|
22
|
+
|
|
23
|
+
### Credential resolution order
|
|
24
|
+
|
|
25
|
+
1. **이미 환경변수에 있으면** 그대로 사용한다.
|
|
26
|
+
2. **에이전트가 자체 secret vault(1Password CLI, Bitwarden CLI, macOS Keychain 등)를 사용 중이면** 거기서 꺼내 환경변수로 주입해도 된다.
|
|
27
|
+
3. **`~/.config/k-skill/secrets.env`** (기본 fallback) — plain dotenv 파일, 퍼미션 `0600`.
|
|
28
|
+
4. **아무것도 없으면** 유저에게 물어서 2 또는 3에 저장한다.
|
|
29
|
+
|
|
30
|
+
## 입력값
|
|
31
|
+
|
|
32
|
+
- 출발역
|
|
33
|
+
- 도착역
|
|
34
|
+
- 날짜: `YYYYMMDD`
|
|
35
|
+
- 희망 시작 시각: `HHMMSS`
|
|
36
|
+
- 인원 수
|
|
37
|
+
- 좌석 선호
|
|
38
|
+
|
|
39
|
+
## 기본 흐름
|
|
40
|
+
|
|
41
|
+
1. `SRTrain` 패키지가 없으면 다른 방법으로 우회하지 말고 먼저 전역 설치합니다.
|
|
42
|
+
2. `KSKILL_SRT_ID`, `KSKILL_SRT_PASSWORD` 가 없으면 credential resolution order에 따라 확보합니다.
|
|
43
|
+
3. 먼저 열차를 조회합니다.
|
|
44
|
+
4. 후보 열차의 출발/도착 시각, 좌석 여부, 운임을 보여줍니다.
|
|
45
|
+
5. 대상 열차가 명확할 때만 예약합니다.
|
|
46
|
+
6. 예약 확인/취소는 예약을 다시 식별한 뒤 진행합니다.
|
|
47
|
+
|
|
48
|
+
## 예시
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
python3 - <<'PY'
|
|
52
|
+
import os
|
|
53
|
+
from SRT import SRT
|
|
54
|
+
|
|
55
|
+
srt = SRT(os.environ["KSKILL_SRT_ID"], os.environ["KSKILL_SRT_PASSWORD"])
|
|
56
|
+
trains = srt.search_train("수서", "부산", "20260328", "080000", time_limit="120000")
|
|
57
|
+
|
|
58
|
+
for idx, train in enumerate(trains[:5], start=1):
|
|
59
|
+
print(idx, train)
|
|
60
|
+
PY
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 주의할 점
|
|
64
|
+
|
|
65
|
+
- credential은 환경변수로 주입합니다.
|
|
66
|
+
- 결제 완료까지 자동화하는 문서는 아닙니다.
|
|
67
|
+
- 매진 시 공격적인 재시도 루프는 피합니다.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# 토스증권 조회 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- `tossctl` 기반 토스증권 계좌 목록 / 계좌 요약 조회
|
|
6
|
+
- 포트폴리오 보유 종목 / 자산 비중 조회
|
|
7
|
+
- 단일 종목 / 다중 종목 시세 조회
|
|
8
|
+
- 미체결 주문 / 월간 체결 내역 조회
|
|
9
|
+
- 관심종목 목록 조회
|
|
10
|
+
|
|
11
|
+
## 먼저 필요한 것
|
|
12
|
+
|
|
13
|
+
- macOS + Homebrew
|
|
14
|
+
- `tossctl` 설치
|
|
15
|
+
- `tossctl auth login` 으로 브라우저 세션 확보
|
|
16
|
+
- `node` 18+
|
|
17
|
+
|
|
18
|
+
## upstream 설치와 로그인
|
|
19
|
+
|
|
20
|
+
이 기능은 `JungHoonGhae/tossinvest-cli` 의 `tossctl` 을 그대로 사용한다.
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
brew tap JungHoonGhae/tossinvest-cli
|
|
24
|
+
brew install tossctl
|
|
25
|
+
tossctl doctor
|
|
26
|
+
tossctl auth doctor
|
|
27
|
+
tossctl auth login
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
로그인이 끝나기 전에는 계좌/포트폴리오 조회를 시도하지 않는다.
|
|
31
|
+
|
|
32
|
+
## 지원하는 read-only 명령
|
|
33
|
+
|
|
34
|
+
- `tossctl account list --output json`
|
|
35
|
+
- `tossctl account summary --output json`
|
|
36
|
+
- `tossctl portfolio positions --output json`
|
|
37
|
+
- `tossctl portfolio allocation --output json`
|
|
38
|
+
- `tossctl quote get TSLA --output json`
|
|
39
|
+
- `tossctl quote batch TSLA 005930 VOO --output json`
|
|
40
|
+
- `tossctl orders list --output json`
|
|
41
|
+
- `tossctl orders completed --market all --output json`
|
|
42
|
+
- `tossctl watchlist list --output json`
|
|
43
|
+
|
|
44
|
+
## Node.js 예시
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
const {
|
|
48
|
+
getAccountSummary,
|
|
49
|
+
getPortfolioPositions,
|
|
50
|
+
getQuote,
|
|
51
|
+
listCompletedOrders
|
|
52
|
+
} = require("toss-securities");
|
|
53
|
+
|
|
54
|
+
async function main() {
|
|
55
|
+
const summary = await getAccountSummary();
|
|
56
|
+
const positions = await getPortfolioPositions();
|
|
57
|
+
const quote = await getQuote("TSLA");
|
|
58
|
+
const completed = await listCompletedOrders({ market: "all" });
|
|
59
|
+
|
|
60
|
+
console.log(summary.data);
|
|
61
|
+
console.log(positions.data);
|
|
62
|
+
console.log(quote.data);
|
|
63
|
+
console.log(completed.data);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
main().catch((error) => {
|
|
67
|
+
console.error(error);
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 운영 팁
|
|
73
|
+
|
|
74
|
+
- 계좌 요약과 포트폴리오는 로그인 세션이 있어야만 동작한다.
|
|
75
|
+
- `TSLA`, `VOO`, `005930` 같이 심볼을 그대로 넘기면 된다.
|
|
76
|
+
- 주문 관련 답변은 **조회 결과만** 정리하고, 실거래로 이어지는 행동은 권하지 않는다.
|
|
77
|
+
- 민감한 계좌 정보는 꼭 필요한 값만 답한다.
|
|
78
|
+
|
|
79
|
+
## 주의할 점
|
|
80
|
+
|
|
81
|
+
- `tossctl` 은 비공식 CLI 이므로 웹 내부 API 변경에 영향을 받을 수 있다.
|
|
82
|
+
- 브라우저 세션이 만료되면 `tossctl auth login` 을 다시 해야 할 수 있다.
|
|
83
|
+
- 이 레포의 `toss-securities` 패키지는 read-only wrapper 이며, 거래 mutation 명령은 공개 API에 포함하지 않는다.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# 중고차 가격 조회 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- 주요 한국 렌터카 업체를 먼저 비교한 뒤 v1 공급자를 선택하기
|
|
6
|
+
- `SK렌터카 다이렉트 타고BUY` inventory snapshot 에서 차종별 중고차 가격 조회
|
|
7
|
+
- `인수가`, `월 렌트료`, `연식`, `주행거리`, `연료`, `변속기` 정리
|
|
8
|
+
- 같은 구조의 조회를 **최소 10회 이상** 반복해도 안정적으로 응답하는지 검증
|
|
9
|
+
|
|
10
|
+
## 먼저 알아둘 점
|
|
11
|
+
|
|
12
|
+
### 현재 공급자 선정 결과
|
|
13
|
+
|
|
14
|
+
이 저장소와 현재 세션에는 중고차 가격 조회용 전용 **MCP** 나 **Skill** 이 없어서, 먼저 대표 렌터카 업체의 공개 표면을 비교했다.
|
|
15
|
+
|
|
16
|
+
| 업체 | 점검한 공개 표면 | API / 크롤링 판단 | 선택 여부 |
|
|
17
|
+
| --- | --- | --- | --- |
|
|
18
|
+
| SK렌터카 | `https://www.skdirect.co.kr/tb` | 별도 공개 API 문서는 못 찾았지만, 공개 HTML 안 `__NEXT_DATA__` 에 `carListProd` inventory snapshot 이 들어 있다. 로그인 없이 반복 조회가 가능해 가장 구현이 쉽다. | 선택 |
|
|
19
|
+
| 롯데렌탈(롯데오토옥션) | `https://www.lotteautoauction.net/hp/pub/cmm/viewMain.do` | 공개 진입점은 열리지만 legacy `.do` 화면 중심이고, 공개 일반 매물 목록 계약을 안정적으로 고정하기 어려웠다. | 보류 |
|
|
20
|
+
| 레드캡렌터카 | `https://biz.redcap.co.kr/rent/` | business portal 만 확인되었고 공개 중고차 inventory 검색/API 표면을 찾지 못했다. | 보류 |
|
|
21
|
+
|
|
22
|
+
즉, v1 은 **SK렌터카 다이렉트 타고BUY** 를 사용한다.
|
|
23
|
+
|
|
24
|
+
## 입력값
|
|
25
|
+
|
|
26
|
+
- 차종/모델 키워드
|
|
27
|
+
- 예: `아반떼`
|
|
28
|
+
- 예: `현대 아반떼`
|
|
29
|
+
- 예: `K3`
|
|
30
|
+
- 예: `캐스퍼`
|
|
31
|
+
|
|
32
|
+
차종 키워드가 없으면 먼저 물어본다.
|
|
33
|
+
|
|
34
|
+
## 공식 표면
|
|
35
|
+
|
|
36
|
+
- SK direct 타고BUY inventory page: `https://www.skdirect.co.kr/tb`
|
|
37
|
+
|
|
38
|
+
## 기본 흐름
|
|
39
|
+
|
|
40
|
+
1. 차종 키워드를 받는다.
|
|
41
|
+
2. `https://www.skdirect.co.kr/tb` HTML 을 가져온다.
|
|
42
|
+
3. HTML 안의 `__NEXT_DATA__` JSON 에서 `carListProd` 를 읽는다.
|
|
43
|
+
4. 차종 키워드와 `maker/model/grade` 조합으로 필터링한다.
|
|
44
|
+
5. `인수가`, `월 렌트료`, `연식`, `주행거리`, `연료`, `변속기`를 정리한다.
|
|
45
|
+
6. 같은 차종이라도 재고가 변할 수 있으므로 snapshot 시점 기준 결과라고 답한다.
|
|
46
|
+
|
|
47
|
+
## Node.js 예시
|
|
48
|
+
|
|
49
|
+
```js
|
|
50
|
+
const { lookupUsedCarPrices } = require("used-car-price-search")
|
|
51
|
+
|
|
52
|
+
async function main() {
|
|
53
|
+
const result = await lookupUsedCarPrices("K3", { limit: 3 })
|
|
54
|
+
|
|
55
|
+
console.log({
|
|
56
|
+
provider: result.provider,
|
|
57
|
+
matchedCount: result.matchedCount,
|
|
58
|
+
summary: result.summary,
|
|
59
|
+
items: result.items
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
main().catch((error) => {
|
|
64
|
+
console.error(error)
|
|
65
|
+
process.exitCode = 1
|
|
66
|
+
})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 응답 예시 포맷
|
|
70
|
+
|
|
71
|
+
- 공급자: `SK렌터카 다이렉트 타고BUY`
|
|
72
|
+
- 검색어: `아반떼`
|
|
73
|
+
- 매칭 수: `N대`
|
|
74
|
+
- 인수가 범위: `1,290만원 ~ 1,590만원`
|
|
75
|
+
- 월 렌트료 범위: `39.2만원 ~ 44.1만원`
|
|
76
|
+
- 대표 매물: 연식 / 주행거리 / 연료 / 변속기 순으로 2~5대
|
|
77
|
+
|
|
78
|
+
## 구현 메모
|
|
79
|
+
|
|
80
|
+
- 별도의 공개 REST API 문서는 확인하지 못했다.
|
|
81
|
+
- 대신 공개 HTML 에 들어 있는 `__NEXT_DATA__` inventory snapshot 을 읽는 방식이라 anti-bot 우회나 로그인 세션 없이도 동작한다.
|
|
82
|
+
- v1 은 차종 검색과 가격 요약에 집중하고, 계약/상담/결제 자동화는 하지 않는다.
|
|
83
|
+
|
|
84
|
+
## 라이브 검증 메모
|
|
85
|
+
|
|
86
|
+
2026-04-02T07:52:24Z 기준 `https://www.skdirect.co.kr/tb` 에 대해 live smoke run 을 다시 수행했고, inventory 규모는 시점에 따라 변동될 수 있었지만 `캐스퍼`, `K3`, `티볼리`, `아반떼`, `쏘나타`, `투싼`, `싼타페`, `QM6`, `그랜저`, `스포티지` 순으로 **10회** 차종 조회를 반복해도 구조화된 결과를 계속 얻을 수 있었다.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 우편번호 검색 가이드
|
|
2
|
+
|
|
3
|
+
## 이 기능으로 할 수 있는 일
|
|
4
|
+
|
|
5
|
+
- 주소 키워드로 공식 우체국 우편번호 조회
|
|
6
|
+
- 같은 도로명/건물명 후보가 여러 개일 때 상위 결과 비교
|
|
7
|
+
- 검색 결과가 없을 때 바로 재검색 키워드 조정
|
|
8
|
+
|
|
9
|
+
## 먼저 필요한 것
|
|
10
|
+
|
|
11
|
+
- 인터넷 연결
|
|
12
|
+
- `curl`
|
|
13
|
+
- 선택 사항: `python3`
|
|
14
|
+
|
|
15
|
+
## 입력값
|
|
16
|
+
|
|
17
|
+
- 주소 키워드
|
|
18
|
+
- 예: `세종대로 209`
|
|
19
|
+
- 예: `판교역로 235`
|
|
20
|
+
|
|
21
|
+
## 기본 흐름
|
|
22
|
+
|
|
23
|
+
1. 비공식 지도/블로그 검색으로 우회하지 말고 우체국 공식 검색 페이지를 먼저 조회합니다.
|
|
24
|
+
2. 주소 키워드를 `keyword` 파라미터로 넘겨 HTML 결과를 받습니다.
|
|
25
|
+
3. 결과에서 우편번호(`sch_zipcode`)와 표준 주소(`sch_address1`), 건물명(`sch_bdNm`)을 추출합니다.
|
|
26
|
+
4. 후보가 여러 개면 상위 3~5개만 간단히 비교해 줍니다.
|
|
27
|
+
5. 전송 timeout/reset이 나면 `curl` 재시도 옵션을 유지한 채 한 번 더 돌리고, 그래도 실패하면 `세종대로 209` 같은 짧은 도로명 + 건물번호 → `서울 종로구 세종대로 209` 같은 시/군/구 포함 전체 주소 → 동/리 + 지번 순으로 재시도합니다.
|
|
28
|
+
|
|
29
|
+
## 예시
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
python3 - <<'PY'
|
|
33
|
+
import html
|
|
34
|
+
import re
|
|
35
|
+
import subprocess
|
|
36
|
+
|
|
37
|
+
query = "세종대로 209"
|
|
38
|
+
cmd = [
|
|
39
|
+
"curl",
|
|
40
|
+
"--http1.1",
|
|
41
|
+
"--tls-max",
|
|
42
|
+
"1.2",
|
|
43
|
+
"--silent",
|
|
44
|
+
"--show-error",
|
|
45
|
+
"--location",
|
|
46
|
+
"--retry",
|
|
47
|
+
"3",
|
|
48
|
+
"--retry-all-errors",
|
|
49
|
+
"--retry-delay",
|
|
50
|
+
"1",
|
|
51
|
+
"--max-time",
|
|
52
|
+
"20",
|
|
53
|
+
"--get",
|
|
54
|
+
"--data-urlencode",
|
|
55
|
+
f"keyword={query}",
|
|
56
|
+
"https://parcel.epost.go.kr/parcel/comm/zipcode/comm_newzipcd_list.jsp",
|
|
57
|
+
]
|
|
58
|
+
result = subprocess.run(
|
|
59
|
+
cmd,
|
|
60
|
+
check=True,
|
|
61
|
+
capture_output=True,
|
|
62
|
+
text=True,
|
|
63
|
+
encoding="utf-8",
|
|
64
|
+
)
|
|
65
|
+
page = result.stdout
|
|
66
|
+
|
|
67
|
+
matches = re.findall(
|
|
68
|
+
r'name="sch_zipcode"\s+value="([^"]+)".*?name="sch_address1"\s+value="([^"]+)".*?name="sch_bdNm"\s+value="([^"]*)"',
|
|
69
|
+
page,
|
|
70
|
+
re.S,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if not matches:
|
|
74
|
+
raise SystemExit("검색 결과가 없습니다.")
|
|
75
|
+
|
|
76
|
+
for zip_code, address, building in matches[:5]:
|
|
77
|
+
suffix = f" ({building})" if building else ""
|
|
78
|
+
print(f"{zip_code}\t{html.unescape(address)}{suffix}")
|
|
79
|
+
PY
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 실전 운영 팁
|
|
83
|
+
|
|
84
|
+
- 쉘 래퍼나 에이전트 환경에서는 here-doc + Python one-liner보다 `mktemp` 같은 임시 파일에 HTML을 저장한 뒤 파싱하는 쪽이 더 안전합니다.
|
|
85
|
+
- 응답 일부만 빨리 보려고 `curl ... | head` 를 붙이면 다운스트림이 먼저 닫히면서 `curl: (23)` 이 보일 수 있습니다. 이때는 전체 응답을 임시 파일에 저장한 뒤 확인합니다.
|
|
86
|
+
- 재시도 순서는 보통 `세종대로 209` 같은 짧은 도로명 + 건물번호 → `서울 종로구 세종대로 209` 같은 전체 주소 → 동/리 + 지번 순이 가장 덜 헷갈립니다.
|
|
87
|
+
|
|
88
|
+
## 프로토콜/클라이언트 제약
|
|
89
|
+
|
|
90
|
+
- 현재 ePost 엔드포인트는 로컬 기본 `urllib` 전송으로 붙으면 TLS/HTTP 협상 중 연결 reset이 날 수 있습니다.
|
|
91
|
+
- 현재 ePost 엔드포인트는 같은 curl 플래그여도 간헐적인 timeout/reset이 있을 수 있으므로 문서 기본 예시는 `--retry 3 --retry-all-errors --retry-delay 1`을 포함합니다.
|
|
92
|
+
- 문서 기본 예시는 `curl --http1.1 --tls-max 1.2` 전송을 사용하고, Python은 응답 파싱/정리에만 사용합니다.
|
|
93
|
+
- 바깥쪽 Python `timeout`은 두지 않고 `curl` 자체 제한(`--max-time` + `--retry`)으로 전체 전송 시간을 제어합니다.
|
|
94
|
+
- 다른 클라이언트를 쓰더라도 최소한 HTTP/1.1 + TLS 1.2 경로에서 실제 응답을 먼저 확인한 뒤 정규식 추출을 붙입니다.
|
|
95
|
+
|
|
96
|
+
## 주의할 점
|
|
97
|
+
|
|
98
|
+
- 같은 번지라도 건물명에 따라 여러 행이 나올 수 있으니 첫 결과만 바로 확정하지 않습니다.
|
|
99
|
+
- 결과가 너무 많으면 시/군/구를 포함해 검색어를 더 구체화합니다.
|
|
100
|
+
- 조회형 스킬이므로 개인정보를 저장하지 않습니다.
|