mirror of
https://github.com/NomaDamas/k-skill.git
synced 2026-06-24 02:04:11 +00:00
Merge dev into main (#197)
* fix(toss-securities): clarify session expiry and quote 403 handling * Clarify toss empty-output session expiry Portfolio and watchlist reads can exit successfully with empty payloads when the stored Toss session has expired. The empty-output path now verifies the session before JSON parsing and only promotes confirmed invalid auth doctor data into TossSessionExpiredError. Constraint: Scope is limited to toss-securities issue #126 follow-up on PR #192 Rejected: Treat auth doctor execution failures as expired sessions | unsupported or failing doctor output is inconclusive without parsed session.valid=false Confidence: high Scope-risk: narrow Directive: Keep empty-result session expiry classification tied to explicit auth doctor confirmation Tested: npm run test --workspace toss-securities; npm run lint --workspace toss-securities; npm run ci; manual mock tossctl blank stdout invalid/inconclusive doctor checks * Avoid false session-expiry labels for validation errors The toss wrapper now treats bare validation_error text as an upstream command failure instead of a session-expired signal. Structured auth doctor JSON remains the source of truth for empty portfolio/watchlist invalid-session promotion, while known stored-session-invalid stderr still maps to TossSessionExpiredError.\n\nConstraint: PR #192 follow-up must stay scoped to issue #126 toss-securities behavior.\nRejected: Keep validation_error in the global regex | it mislabels auth doctor transport failures and quote 403 validation errors as session expiry.\nConfidence: high\nScope-risk: narrow\nDirective: Do not broaden the free-text session classifier without regressions for auth doctor and quote upstream validation failures.\nTested: npm run lint --workspace toss-securities; npm run test --workspace toss-securities; npm run ci; manual mock tossctl validation_error checks; architect verification CLEAR\nNot-tested: Live tossctl network/auth session against real Toss upstream * Align court auction lookup with monthly site search (#196) The court auction notice page posts a YYYYMM search key from its 조회 button and returns a month of rows. Keep day inputs as a compatibility filter over the monthly response and normalize the current nested detail payload shape. Constraint: courtauction.go.kr has no public API and blocks bursty automated calls. Rejected: querying every day independently | the upstream search surface is month-based and day calls return false empty results. Confidence: high Scope-risk: narrow Directive: Preserve the site-observed YYYYMM notice search contract unless the PGJ143M01 XHR changes again. Tested: npm --workspace packages/court-auction-notice-search test; npm run ci; live 서울중앙지방법원 2026-05 notice/detail smoke lookup. Not-tested: PR CI after push. Co-authored-by: OmX <omx@oh-my-codex.dev> * Guide crawler skills toward reusable discovery (#195) * chore: version packages * Guide crawler skills toward reusable discovery Constraint: User requested insane-search-style guidance for future crawling k-skills without unrelated implementation changes. Rejected: Adding crawler code or a standalone template | too broad for a docs guidance change and risks dependency creep. Confidence: high Scope-risk: narrow Directive: Keep site-specific access details inside individual skills after a site-agnostic discovery pass. Tested: npm run ci Not-tested: Live crawler behavior; documentation-only change. * Clarify crawler skill discovery guidance Constraint: Crawling k-skills need site-dependent recipes, but should derive them through a reusable discovery pass. Rejected: Leaving guidance only in docs/adding-a-skill.md | AGENTS.md and CLAUDE.md also guide future agents. Confidence: high Scope-risk: narrow Directive: Use site-agnostic discovery to find, then explicitly package, the target site's stable access path. Tested: npm run ci Not-tested: Live crawler behavior; documentation-only change. --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Ground corporate registration guidance in official form sources Keep the consulting skill focused on draft/checklist support while pointing users to current IROS and law.go.kr form sources for submission-ready artifacts. Constraint: official registry forms can change outside the repository and must be re-downloaded at use time Rejected: committing copied official HWP/HWPX/PDF forms | they would become stale and risk misleading users Confidence: high Scope-risk: narrow Directive: do not treat Markdown templates as substitutes for official registry submission forms Tested: npm test * Ground incorporation drafting in real HWP forms Bundle official court incorporation forms plus public startup incorporation attachments, and make rhwp-filled HWP outputs the default drafting path for the corporate-registration skill. Replace the listed-company articles reference with a startup-suitable Ministry of Justice stock-company form and record source manifests for bundled binaries. Constraint: user requires actual sourced HWP templates, not generated placeholder binaries. Rejected: markdown-only drafting | it cannot produce submission-shaped Korean registry forms. Rejected: listed-company standard articles as the default reference | it is mismatched for typical startup incorporation. Confidence: high Scope-risk: moderate Directive: keep bundled HWP forms source-backed, sanitized, and edited only through copied working files. Tested: node --test scripts/skill-docs.test.js; npm run lint; k-skill-rhwp info on bundled HWP files; kordoc conversion spot checks. Not-tested: manual opening every HWP in Hancom Office and live registry submission. Co-authored-by: OmX <omx@oh-my-codex.dev> * Streamline corporate registration forms workflow Prioritize saved HWP forms for ordinary stock-company promoter incorporations, make required court-registry receipts and director identity certificates explicit, and remove the redundant markdown articles template so the skill stays HWP-first. Constraint: 법원등기소 기준 체크리스트 must include fee receipts, director seal/signature certificates, and resident-record documents. Rejected: Keeping a separate markdown articles template | duplicated the stored HWP articles workflow and encouraged non-HWP drafting. Confidence: high Scope-risk: narrow Directive: Keep corporate-registration-consulting focused on stored HWP form copies and explicit issued-document checklists. Tested: node --test --test-name-pattern 'corporate-registration-consulting' scripts/skill-docs.test.js; node --check scripts/skill-docs.test.js; ./scripts/validate-skills.sh; git diff --check Not-tested: Full npm run ci was not run because this is a skill documentation/template refactor, not release or package automation. --------- Co-authored-by: galvaomica <galvaomica@galvaomicaui-MacBookAir.local> Co-authored-by: OmX <omx@oh-my-codex.dev> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
parent
fe3060678c
commit
d7aca1bcbe
39 changed files with 861 additions and 298 deletions
5
.changeset/fix-court-auction-month-search.md
Normal file
5
.changeset/fix-court-auction-month-search.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"court-auction-notice-search": patch
|
||||
---
|
||||
|
||||
Fix sale notice search to post the court site month key (`YYYYMM`) and filter exact-day requests locally; normalize the current nested notice-detail response shape and HTML-formatted prices.
|
||||
|
|
@ -28,6 +28,13 @@ These rules are repo-specific and apply to everything under this directory.
|
|||
- Respect existing home-directory indirection such as symlinks when syncing `~/.agents/skills`.
|
||||
- Do **not** create repo-local `.claude` or `.agents` directories for skill installation unless the user explicitly asks for a repository-local test fixture.
|
||||
|
||||
## Crawling/search skill authoring
|
||||
|
||||
- For any k-skill that crawls or searches a website, the expected output is a site-dependent recipe packaged into that skill.
|
||||
- Before fixing that recipe, use an insane-search-style, site-agnostic discovery pass: identify public entry points, observe browser-visible data flows when needed, prefer stable public/data endpoints over brittle screen scraping, and classify login/CAPTCHA/empty/blocked responses as explicit failure modes.
|
||||
- Record the discovered site-dependent access path, fallback order, inputs/outputs, and failure modes in `SKILL.md` and any helper package code. See `docs/adding-a-skill.md` for the canonical checklist.
|
||||
- Do not add crawling dependencies by default; first prefer existing runtime capabilities, public endpoints, or narrow allowlisted proxy routes.
|
||||
|
||||
## Free API proxy policy
|
||||
|
||||
- The built-in `k-skill-proxy` is for **free APIs only**.
|
||||
|
|
|
|||
|
|
@ -4,6 +4,13 @@
|
|||
|
||||
- **Never write tests that assert `.changeset/*.md` files exist.** Changesets are consumed (deleted) by `changeset version` during the release flow. Any test guarding changeset file presence will break CI on the version-bump commit and block the release pipeline.
|
||||
|
||||
## Crawling/search skill authoring
|
||||
|
||||
- 크롤링/검색 k-skill의 목표는 최종적으로 대상 사이트에 맞는 site-dependent 접근 방법을 스킬에 패키징하는 것이다.
|
||||
- 다만 방법을 고정하기 전에 `insane-search`식 site-agnostic discovery를 먼저 수행한다: 공개 입구, 브라우저에서 보이는 데이터 흐름, RSS/sitemap/정적 JSON/모바일 페이지, 차단·빈 응답·로그인벽 실패 모드를 확인한다.
|
||||
- 발견한 검색 URL, 필수 입력값, 결과 해석 규칙, fallback 순서, 실패 모드는 `SKILL.md`와 helper 코드에 명확히 남긴다. 자세한 체크리스트는 `docs/adding-a-skill.md`를 따른다.
|
||||
- 새 크롤링 dependency는 기본값으로 추가하지 말고 기존 기능, 공개 endpoint, 좁은 proxy route로 해결 가능한지 먼저 확인한다.
|
||||
|
||||
## Proxy server development
|
||||
|
||||
- 개발 repo: `/Users/jeffrey/Projects/k-skill` (이 디렉토리, `dev` 브랜치)
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ Claude Code, Codex, OpenCode, OpenClaw/ClawHub 등 각종 코딩 에이전트
|
|||
| 한강 수위 정보 조회 | `han-river-water-level` | 한강 관측소 기준 현재 수위·유량·기준수위 확인 | 불필요 | [한강 수위 정보 가이드](docs/features/han-river-water-level.md) |
|
||||
| 한국 법령 검색 | `korean-law-search` | 한국 법령/조문/판례/유권해석 검색 | 불필요 | [한국 법령 검색 가이드](docs/features/korean-law-search.md) |
|
||||
| 등기부등본 자동화 | `iros-registry-automation` | 인터넷등기소(IROS)에서 법인/부동산 등기부등본 장바구니, 수동 결제 후 열람·저장 흐름을 보조 | 필요(수동 로그인·결제/TouchEn) | [등기부등본 자동화 가이드](docs/features/iros-registry-automation.md) |
|
||||
| 법인등기 신청 컨설팅 | `corporate-registration-consulting` | 법인명·이사·주소 등 사용자 결정사항을 받아 표준 정관, 설립등기 첨부서류, 등록면허세·과밀억제권역 중과 체크, rhwp 기반 HWP 양식 작성 흐름을 참고용으로 안내 | 불필요 | [법인등기 신청 컨설팅 가이드](docs/features/corporate-registration-consulting.md) |
|
||||
| 법인등기 신청 컨설팅 | `corporate-registration-consulting` | 일반 영리 주식회사 발기설립 기준으로 법인명·이사·주소 등 사용자 결정사항을 받아 표준 정관, 설립등기 첨부서류, 등록면허세·과밀억제권역 중과 체크, rhwp 기반 HWP 양식 순차 작성 흐름을 참고용으로 안내 | 불필요 | [법인등기 신청 컨설팅 가이드](docs/features/corporate-registration-consulting.md) |
|
||||
| 한국 사업자 장부 자동화 | `korean-jangbu-for` | `kimlawtech/korean-jangbu-for` 기반 카드·은행·영수증·세금계산서 입력 → 표준 거래내역·계정과목·세무사 전달 CSV·경영 리포트 생성 thin wrapper | 선택사항(CODEF BYOK 자동 수집 시 필요) | [한국 사업자 장부 자동화 가이드](docs/features/korean-jangbu-for.md) |
|
||||
| 한국 개인정보처리방침·이용약관 자동 생성 | `korean-privacy-terms` | Next.js 프로젝트에 개인정보보호법·약관규제법·전자상거래법 기반 개인정보처리방침/이용약관/쿠키 배너/동의 모달을 생성하는 `kimlawtech/korean-privacy-terms` (Apache-2.0) thin wrapper | 불필요 | [한국 개인정보처리방침·이용약관 자동 생성 가이드](docs/features/korean-privacy-terms.md) |
|
||||
| 한국 부동산 실거래가 조회 | `real-estate-search` | 아파트/오피스텔/빌라/단독주택 실거래가·전월세·지역코드 조회 | 불필요 | [한국 부동산 실거래가 조회 가이드](docs/features/real-estate-search.md) |
|
||||
|
|
|
|||
|
|
@ -1,11 +1,10 @@
|
|||
---
|
||||
name: corporate-registration-consulting
|
||||
description: 법인등기소/인터넷등기소 상업등기 신청을 처음 하는 사용자를 위해 주식회사 설립등기 절차, 정관·첨부서류 템플릿, 등록면허세·과밀억제권역 중과 체크, rhwp 기반 HWP 양식 작성 흐름을 참고용으로 안내한다.
|
||||
description: 법인등기소/인터넷등기소 상업등기 신청을 처음 하는 사용자를 위해 일반 영리 주식회사 발기설립 절차, 정관·첨부서류 실제 HWP 양식 작성, 등록면허세·과밀억제권역 중과 체크, rhwp 기반 순차 검토 흐름을 참고용으로 안내한다.
|
||||
license: MIT
|
||||
metadata:
|
||||
category: legal-documents
|
||||
locale: ko-KR
|
||||
phase: v1
|
||||
---
|
||||
|
||||
# 법인등기 신청 컨설팅
|
||||
|
|
@ -27,23 +26,16 @@ metadata:
|
|||
1. **사용자 결정 사항만 묻고 나머지는 에이전트가 처리한다.** 법인명, 본점 주소, 목적, 자본금, 1주의 금액, 발기인/주주, 이사/감사, 공고방법, 결산기, 주금납입 은행, 제출 방식처럼 사용자가 결정해야 하는 값만 확인한다.
|
||||
2. **쉬운 말로 설명한다.** “발기인=처음 회사를 세우는 사람”, “정관=회사 기본 규칙”, “등록면허세=등기 전에 내는 지방세”처럼 어려운 말을 풀어쓴다.
|
||||
3. **최신 확인이 필요한 법령·세율은 공식 출처를 다시 확인한다.** 법령은 국가법령정보센터(law.go.kr), 신청 절차는 인터넷등기소(iros.go.kr) 또는 온라인법인설립시스템(startbiz.go.kr), 지방세는 위택스(wetax.go.kr)·관할 지자체를 우선한다.
|
||||
4. **표준 정관은 ‘보수적 기본안’으로 낸다.** 등기소에서 거부되지 않는 표현을 목표로 하되, 실제 수리 보장을 하지 않는다. 특수한 우선주, 스톡옵션, 종류주식, 전환사채, 외국인투자, 인허가 업종은 전문가 검토로 보낸다.
|
||||
5. **HWP 편집은 기존 rhwp 계열 스킬을 재사용한다.** 문서 생성/편집은 [`rhwp-edit`](../rhwp-edit/SKILL.md)의 `k-skill-rhwp`, HWP/HWPX 조회·필드 추출은 [`hwp`](../hwp/SKILL.md), 레이아웃 디버깅은 [`rhwp-advanced`](../rhwp-advanced/SKILL.md)를 사용한다.
|
||||
6. **사람만 할 수 있는 최종 행위를 대신하지 않는다.** 에이전트는 초안·체크리스트·자리표시자 치환까지만 돕고, 인터넷등기소/위택스 로그인, 전자서명, 세금 납부, 등기 제출, 사용자 사칭, 최종 법률 판단, 최종 세무 판단은 수행하지 않는다.
|
||||
7. **개인정보는 최소화한다.** 초안 단계에서는 가능한 한 `{{OFFICER_NAME}}`, `{{OFFICER_ADDRESS}}` 같은 자리표시자를 쓰고, 실제 생성 직전에 필요한 필드만 받는다. 주민등록번호 원문, 신분증 이미지, 인감증명서 스캔본은 꼭 필요한 경우가 아니면 요구하지 않으며, 요약·로그·테스트·PR에는 이름/주소/생년월일 등 개인정보를 마스킹한다. 채워진 산출물은 로컬에만 두고 레포에 커밋하지 말라고 안내한다.
|
||||
|
||||
## 전문가/공식 확인 필요 또는 v1 범위 밖
|
||||
|
||||
아래 사실이 하나라도 있으면 표준 초안 흐름을 계속 진행하지 말고, “이 사안은 v1 기본 설립등기 범위를 벗어나므로 관할 등기소·법무사·변호사·세무사 확인 후 문구를 확정해야 합니다”라고 먼저 안내한다.
|
||||
|
||||
- 발기설립이 아닌 **모집설립**.
|
||||
- 현금 납입만이 아닌 **현물출자**, 재산인수, 사후설립 등 **변태설립사항**.
|
||||
- **자본금 10억** 원 이상이거나 감사/이사회/기관 설계가 일반 소규모 주식회사와 다른 경우.
|
||||
- 유한회사, 합명회사, 합자회사, 유한책임회사, 사단법인 등 **주식회사 외** 법인 유형.
|
||||
- 설립과 동시에 본점 외 **지점**을 여러 곳 두거나 관할이 복수인 경우.
|
||||
- **외국인** 임원·주주, 외국법인 주주, 외국인투자신고·아포스티유·번역공증이 필요한 경우.
|
||||
- 금융, 의료, 교육, 여행, 통신판매 외 별도 허가·등록·신고가 선행되는 **인허가 업종**.
|
||||
- 종류주식, 스톡옵션, 전환사채, 투자계약, 주주간계약처럼 표준 정관 밖의 권리 설계가 있는 경우.
|
||||
4. **정관은 최대한 저장된 표준정관을 그대로 따른다.** 불필요한 창작 문구를 만들지 말고 `templates/attachment-hwp/standard-articles-startup-moj.hwp`, `templates/attachment-hwp/articles-of-incorporation.hwp`의 구조와 표현을 우선 유지한다. 목적/업태·종목, 상호, 본점, 주식 수, 임원, 결산기처럼 사용자 회사에 맞게 바꿔야 하는 부분만 고치고, 애매한 부분은 에이전트가 법령·양식·기존 템플릿을 더 확인해 가능한 초안을 제시한다.
|
||||
5. **일반 영리 주식회사 발기설립을 기본값으로 빠르게 진행한다.** 모집설립은 일반적이지 않으므로 기본 플로우에서는 제외하고, 사용자가 별도로 요청하지 않는 한 저장된 발기설립 양식과 첨부서류 양식을 채우는 데 집중한다.
|
||||
6. **이미 저장해 둔 HWP 양식을 우선 활용해 완성한다.** 에이전트가 매번 공식 양식을 새로 찾게 하지 말고, 이 스킬에 저장된 `templates/official/form-65-1-stock-company-incorporation-promoter.hwp`와 `templates/attachment-hwp/*.hwp` 사본을 레포 밖 작업 디렉터리에 복사해 채운다. 최신 양식 확인은 제출 전 대조 안내로만 두고, 실제 초안 작성의 기본 경로는 저장된 양식 채우기다. 발기설립 신청서는 `scripts/fill_official_hwp.py`와 `templates/official/form-65-1-fill-map.json`으로 작성하고, 정관·주식발행사항동의서·주식인수증·발기인회의사록·주주명부·조사보고서·취임승낙서·이사회의사록·인감신고서·위임장 등은 `templates/attachment-hwp/`의 저장된 HWP 양식을 채운다.
|
||||
7. **사용자가 서류 작성을 요청하면 기본 산출물은 실제 HWP 파일이다.** 단순 절차 설명만 요청한 경우가 아니면 Markdown만 반환하지 말고, 레포 밖 비공개 작업 디렉터리에 공식 신청서와 첨부서류 HWP 사본을 만들고, `rhwp-edit`/`k-skill-rhwp`로 그 사본의 자리표시자와 표 셀에 사용자 값을 입력한다. Markdown은 검토용 요약·체크리스트·정관 대조본으로만 보조 제공한다.
|
||||
8. **HWP 편집은 기존 rhwp 계열 스킬을 적극적으로 재사용한다.** 문서 생성/편집은 [`rhwp-edit`](../rhwp-edit/SKILL.md)의 `k-skill-rhwp`, HWP/HWPX 조회·필드 추출은 [`hwp`](../hwp/SKILL.md), 레이아웃 디버깅은 [`rhwp-advanced`](../rhwp-advanced/SKILL.md)를 사용한다. 본문 자리표시자는 `replace-all`, 공식 신청서와 표 기반 첨부서류는 `set-cell-text`, 구조 확인은 `info`/`list-paragraphs`, 생성 후 확인은 `info`와 가능하면 `render` 또는 `kordoc` 변환으로 검증한다.
|
||||
9. **양식의 어느 부분을 고칠지 문서마다 명시한다.** 특히 정관은 앞부분 제2조 목적/사업 내용에 실제 수행할 업태와 종목을 빠짐없이 채우고, 맨 마지막 부칙 아래 작성일자·발기인 성명·서명/기명날인란을 제출일·발기인별 실제 인감 날인 기준으로 확인한다. 각 첨부서류는 상단 법인명/본점, 중간 결의·인수·취임 내용, 하단 날짜·성명·날인란을 순서대로 확인한다.
|
||||
10. **dummy 값을 지양하고 필요한 개인정보를 직접 받아 로컬 제출본에 채운다.** 빠른 초안을 위해 기본값을 제안하되, 제출용 HWP에는 `홍길동`, `서울특별시 ...`, `000000-0000000` 같은 dummy를 남기지 않는다. 사용자가 실제 이름·주소·생년월일·주식 수·인감 관련 표시 등 필요한 정보를 입력하면 에이전트가 그 값을 레포 밖 사본에 반영한다. 모르는 항목만 자리표시자로 남기고, 남은 자리표시자 목록을 사용자에게 알려준다.
|
||||
11. **간인·법인인감 준비를 반드시 안내한다.** 정관처럼 여러 장으로 된 문서, 의사록/결정서, 위임장 등 원본성이 중요한 문서는 제출 전 각 장 사이에 간인이 필요한지 관할 등기소 요구를 확인하고 간인하도록 안내한다. 법인인감은 인감신고서와 함께 사용할 실제 도장을 미리 제작·준비해야 하며, 발기인/임원 개인 인감 또는 서명 요구와 구분해 설명한다.
|
||||
12. **사람만 할 수 있는 최종 행위를 대신하지 않는다.** 에이전트는 초안·체크리스트·자리표시자 치환까지만 돕고, 인터넷등기소/위택스 로그인, 전자서명, 세금 납부, 등기 제출, 사용자 사칭, 최종 법률 판단, 최종 세무 판단은 수행하지 않는다.
|
||||
13. **개인정보는 최소화하되 제출용 작성에는 실제 값을 받는다.** 초안 단계에서는 가능한 한 `{{OFFICER_NAME}}`, `{{OFFICER_ADDRESS}}` 같은 자리표시자를 쓰고, 실제 생성 직전에 필요한 필드만 받는다. 주민등록번호 원문, 신분증 이미지, 인감증명서 스캔본은 꼭 필요한 경우가 아니면 요구하지 않으며, 요약·로그·테스트·PR에는 이름/주소/생년월일 등 개인정보를 마스킹한다. 채워진 산출물은 로컬에만 두고 레포에 커밋하지 말라고 안내한다.
|
||||
|
||||
## 먼저 묻는 최소 정보
|
||||
|
||||
|
|
@ -53,10 +45,10 @@ metadata:
|
|||
| --- | --- | --- |
|
||||
| 법인명/상호 | 회사 이름. 같은 특별시·광역시·시·군 안의 같은 업종·같은 상호는 문제가 될 수 있어 인터넷등기소 상호검색을 먼저 한다. | `주식회사 {{COMPANY_NAME}}` |
|
||||
| 본점 주소 | 회사 주소. 과밀억제권역/대도시 중과 판단의 핵심이다. | 임대차계약서 주소 그대로 |
|
||||
| 사업 목적 | 등기부에 올라가는 업무 범위. 너무 넓거나 불명확하면 보정될 수 있다. | 소프트웨어 개발 및 공급업, 정보통신업, 전자상거래업 등 필요한 목적만 |
|
||||
| 사업 목적/업태·종목 | 등기부와 정관 제2조 앞부분에 들어가는 실제 수행 사업. 너무 넓거나 불명확하면 보정될 수 있고, 업태·종목은 사업자등록·세금 검토에도 이어진다. | 소프트웨어 개발 및 공급업, 정보통신업, 전자상거래업 등 실제 할 목적만 |
|
||||
| 자본금·1주의 금액 | 초기 자금과 주식 한 장 가격. 등록면허세 계산에도 쓰인다. | 자본금 1,000,000원 / 1주 100원 또는 500원 |
|
||||
| 발기인/주주 | 회사를 세우고 주식을 인수하는 사람. | 대표 1인 설립 가능 |
|
||||
| 이사/대표이사/감사 | 등기 이사와 대표자. 소규모 회사는 감사 생략 가능 여부를 검토한다. | 1인 이사 회사 기본안 |
|
||||
| 발기인/주주 실제 정보 | 회사를 세우고 주식을 인수하는 사람. 제출용에는 성명, 주소, 생년월일/주민등록번호 필요 여부, 인수 주식 수, 날인 방식이 필요하다. | 대표 1인 설립 가능 |
|
||||
| 이사/대표이사/감사 실제 정보 | 등기 이사와 대표자. 제출용 취임승낙서에는 성명, 주소, 생년월일, 취임일, 개인 인감/서명 방식이 필요하다. 소규모 회사는 감사 생략 가능 여부를 검토한다. | 1인 이사 회사 기본안 |
|
||||
| 공고방법 | 회사 공고를 어디에 낼지. | 회사 홈페이지, 없으면 일간신문 |
|
||||
| 결산기 | 회계연도 종료일. | 매년 12월 31일 |
|
||||
| 주금납입 증빙 | 자본금이 입금됐다는 은행 잔고증명/거래내역. | 대표/발기인 명의 계좌 잔고증명 |
|
||||
|
|
@ -66,15 +58,54 @@ metadata:
|
|||
|
||||
1. **상호·본점·목적 결정**: 인터넷등기소 상호검색으로 같은 관할 내 충돌 가능성을 확인한다.
|
||||
2. **과밀억제권역/대도시 세금 체크**: 본점 주소가 수도권 과밀억제권역 등 중과 대상인지 먼저 본다. 대도시 법인 설립은 등록면허세가 중과될 수 있다.
|
||||
3. **정관 작성**: `templates/standard-articles-of-incorporation.md`를 기반으로 법인명, 목적, 주식, 기관, 결산기, 공고방법을 채운다.
|
||||
4. **발기인 결정서·주식인수·주금납입**: 발기인이 주식을 인수하고 자본금을 입금한 뒤 잔고증명서 또는 주금납입보관증명에 준하는 증빙을 준비한다.
|
||||
5. **임원 취임승낙서·인감·주민등록/주소 증빙 준비**: 이사·대표이사·감사가 취임을 승낙했다는 서류와 인감 관련 서류를 준비한다. 주민등록번호·신분증·인감증명 같은 민감정보는 원문을 대화나 로그에 남기지 말고 제출 직전 로컬 문서에만 반영한다.
|
||||
6. **조사보고서/이사회·발기인 의사록 작성**: 현물출자 등 특수 사정이 없더라도 설립 경과를 확인하는 문서를 준비한다. 1인 회사면 결정을 단순화한다.
|
||||
7. **등록면허세 신고·납부 준비**: 위택스 또는 관할 지자체 납부 화면에 넣을 금액·근거·체크리스트를 정리한다. 사용자/전문가가 실제 신고와 세금 납부를 직접 수행하고 영수필확인서를 확보한다.
|
||||
8. **등기신청서 작성·첨부서류 묶기**: `templates/incorporation-document-pack.md`의 순서대로 신청서, 정관, 취임승낙서, 조사보고서, 주금납입 증빙, 인감신고서, 세금 영수증을 점검한다.
|
||||
9. **인터넷등기소/관할 등기소 제출 준비**: 전자신청이면 인증서·전자서명·스캔본 품질 체크리스트를 만들고, 방문이면 원본/사본과 도장 확인 목록을 만든다. 사용자/전문가가 실제 로그인, 전자서명, 등기 제출 절차를 직접 완료한다.
|
||||
10. **보정 대응**: 등기소가 보정명령을 내리면 문구·첨부서류·세금 계산을 수정한다. 보정 사유를 쉬운 말로 풀고 다음 조치만 제시한다.
|
||||
11. **등기 완료 후 후속 작업**: 법인등기사항증명서, 법인인감증명서, 사업자등록, 4대보험, 은행 법인계좌, 통신판매업/소프트웨어사업자 신고 등 후속 일정을 안내한다.
|
||||
3. **저장된 HWP 양식 준비**: 먼저 `templates/official/form-65-1-stock-company-incorporation-promoter.hwp`와 `templates/attachment-hwp/`의 필요한 양식을 레포 밖 작업 디렉터리에 복사한다. 에이전트가 새 양식을 찾는 흐름이 아니라, 저장된 양식 사본을 채워 서류 초안을 완성하는 흐름을 기본으로 한다.
|
||||
4. **정관 및 첨부서면 HWP 작성**: `templates/attachment-hwp/articles-of-incorporation.hwp`, `founder-meeting-minutes.hwp`, `share-subscription.hwp`, `share-issuance-consent.hwp`, `inspection-report.hwp`, `officer-acceptance-director-ceo.hwp / officer-acceptance-auditor.hwp` 등 공개 배포 HWP 양식을 레포 밖 작업 디렉터리에 복사해 자리표시자를 채운다. 각 HWP는 한 장 한 장 열람/구조 확인 후 상단·본문·하단·날인란을 순차 점검하며, replace-all은 shortcut일 뿐 최종 검토를 대체하지 않는다.
|
||||
5. **발기인 결정서·주식인수·주금납입**: 발기인이 주식을 인수하고 자본금을 입금한 뒤 잔고증명서 또는 주금납입보관증명에 준하는 증빙을 준비한다.
|
||||
6. **임원 취임승낙서·인감·주민등록/주소 증빙 준비**: 이사·대표이사·감사가 취임을 승낙했다는 서류와 인감 관련 서류를 준비한다. **등기이사는 개인 인감증명서 또는 본인서명사실확인서, 주민등록초본/등본 등 주소·신원 확인 발급서류가 필요하다는 점을 사용자에게 반드시 안내한다.** 법인인감 도장을 미리 준비하고 인감신고서 날인란과 위임장/의사록 날인 요구를 확인한다. 주민등록번호·신분증·인감증명 같은 민감정보는 원문을 대화나 로그에 남기지 말고 제출 직전 로컬 문서에만 반영한다.
|
||||
7. **조사보고서/이사회·발기인 의사록 작성**: 현물출자 등 특수 사정이 없더라도 설립 경과를 확인하는 문서를 준비한다. 1인 회사면 결정을 단순화한다.
|
||||
8. **등록면허세 신고·납부 준비**: 위택스 또는 관할 지자체 납부 화면에 넣을 금액·근거·체크리스트를 정리한다. 사용자가 실제 신고와 세금 납부를 직접 수행하고 영수필확인서를 확보한다.
|
||||
9. **등기신청서 작성·첨부서류 묶기**: `templates/incorporation-document-pack.md`의 순서대로 신청서, 정관, 취임승낙서, 조사보고서, 주금납입 증빙, 인감신고서, 세금 영수증을 점검한다. 정관 등 여러 장 문서는 간인 필요 여부를 확인하고, 실제 간인·날인은 사용자가 원본에 수행하도록 안내한다.
|
||||
10. **인터넷등기소/관할 등기소 제출 준비**: 전자신청이면 인증서·전자서명·스캔본 품질 체크리스트를 만들고, 방문이면 원본/사본과 도장 확인 목록을 만든다. 사용자가 실제 로그인, 전자서명, 등기 제출 절차를 직접 완료한다.
|
||||
11. **보정 대응**: 등기소가 보정명령을 내리면 문구·첨부서류·세금 계산을 수정한다. 보정 사유를 쉬운 말로 풀고 다음 조치만 제시한다.
|
||||
12. **등기 완료 후 후속 작업**: 법인등기사항증명서, 법인인감증명서, 사업자등록, 4대보험, 은행 법인계좌, 통신판매업/소프트웨어사업자 신고 등 후속 일정을 안내한다.
|
||||
|
||||
|
||||
## 반드시 작성할 문서와 저장된 양식 경로
|
||||
|
||||
아래 표를 기준으로 법원등기소/인터넷등기소 기준 설립등기 필요 문서명과 실제 양식 경로를 대조한다. 사용자가 서류 작성을 요청하면 이 경로의 원본을 레포 밖 작업 디렉터리에 복사해 채우고, 원본 파일은 수정하지 않는다. 저장 양식이 없는 영수필확인서, 등기이사 인감증명서/본인서명사실확인서, 주민등록초본/등본은 사용자가 직접 발급해야 하는 필수 첨부서류로 체크리스트에 남긴다.
|
||||
|
||||
| 필요 문서 | 저장된 양식 경로 | 고쳐야 하는 부분 | 제출 전 확인 |
|
||||
| --- | --- | --- | --- |
|
||||
| 주식회사설립등기신청서(발기설립) | `corporate-registration-consulting/templates/official/form-65-1-stock-company-incorporation-promoter.hwp` | 상호, 본점, 등기 목적, 자본금, 발행주식, 임원, 첨부서류 목록, 신청인/대리인, 날짜 | 첨부서류 통수와 실제 묶음 일치 |
|
||||
| 정관 | `corporate-registration-consulting/templates/attachment-hwp/standard-articles-startup-moj.hwp` 또는 `corporate-registration-consulting/templates/attachment-hwp/articles-of-incorporation.hwp` | 앞부분 제1조 상호, **제2조 목적/사업 내용의 업태·종목**, 본점, 주식 수/1주의 금액, 임원 규정, 결산기, 부칙 | 맨 마지막 작성일자, 발기인 성명, 서명/기명날인, 여러 장이면 간인 |
|
||||
| 발기인이 정한 주식발행사항 등 증명정보(상법 제291조 사항) | `corporate-registration-consulting/templates/attachment-hwp/share-issuance-consent.hwp` | 발행주식 수, 1주의 금액, 납입기일, 발기인 동의 내용, 날짜·날인란 | 정관·신청서의 주식 수와 일치 |
|
||||
| 주식인수증 | `corporate-registration-consulting/templates/attachment-hwp/share-subscription.hwp` | 인수인별 주식 수와 인수가액, 인수일, 성명·주소·날인란 | 인수 주식 수 합계가 설립 시 발행주식 수와 일치 |
|
||||
| 발기인회의사록 | `corporate-registration-consulting/templates/attachment-hwp/founder-meeting-minutes.hwp` | 회의 일시·장소, 의안, 발기인, 결의 내용, 날짜, 날인란 | 1인/복수 발기인 구조와 맞는지, 여러 장이면 간인 |
|
||||
| 발기인총회 기간단축 동의서 | `corporate-registration-consulting/templates/attachment-hwp/founder-meeting-period-shortening-consent.hwp` | 동의자, 기간단축 대상 절차, 날짜, 날인란 | 실제 절차상 필요한 경우에만 포함 |
|
||||
| 주주명부 | `corporate-registration-consulting/templates/attachment-hwp/shareholder-register.hwp` | 주주 성명/주소, 주식 수, 1주 금액, 총액 | 정관·주식인수증·신청서의 주식 수와 일치 |
|
||||
| 조사보고서 | `corporate-registration-consulting/templates/attachment-hwp/inspection-report.hwp` | 조사자, 조사 대상, 주금납입 확인, 변태설립사항 유무, 날짜, 날인란 | 근거 확인 가능한 표현으로 작성 |
|
||||
| 이사/대표이사 취임승낙서 | `corporate-registration-consulting/templates/attachment-hwp/officer-acceptance-director-ceo.hwp` | 임원 성명, 주소, 생년월일, 직책, 취임일, 날짜, 서명/개인 인감 날인란 | 등기 임원 명단과 일치 |
|
||||
| 감사 취임승낙서 | `corporate-registration-consulting/templates/attachment-hwp/officer-acceptance-auditor.hwp` | 감사 성명, 주소, 생년월일, 취임일, 날짜, 서명/개인 인감 날인란 | 감사 선임 시에만 포함 |
|
||||
| 이사회의사록 | `corporate-registration-consulting/templates/attachment-hwp/board-minutes.hwp` | 대표이사 선임 등 결의, 일시·장소, 출석 이사, 날인란 | 이사회가 있는 구조에서만 사용 |
|
||||
| 인감신고서 | `corporate-registration-consulting/templates/attachment-hwp/corporate-seal-report.hwp` | 상호, 본점, 대표자, 법인인감 날인란, 개인 인감/서명 관련 칸 | 실제 법인인감 도장 준비 및 날인 위치 |
|
||||
| 위임장 | `corporate-registration-consulting/templates/attachment-hwp/power-of-attorney.hwp` | 위임인, 수임인, 위임 범위, 날짜, 날인란 | 대리 제출 시 원본 날인·간인 요구 확인 |
|
||||
| 등록면허세 영수필확인서 | 저장 양식 없음. 위택스/지자체 납부 결과물 첨부 | 납부번호, 납부자, 세액, 관할 | **필수 발급/첨부.** 최종 신고·납부 결과 기준 |
|
||||
| 등기신청수수료 영수필확인서 | 저장 양식 없음. 인터넷등기소/등기소 수수료 납부 결과물 첨부 | 납부번호, 납부자, 수수료, 신청 사건 | **필수 발급/첨부.** 등록면허세 영수필확인서와 별도 문서로 관리 |
|
||||
| 등기이사 개인 인감증명서 또는 본인서명사실확인서 | 저장 양식 없음. 주민센터/정부24 등에서 임원 본인이 발급 | 등기이사별 성명, 발급일, 인감/서명 확인 정보 | **등기이사는 무조건 준비해야 하는 발급서류로 안내.** 주민등록번호·인감 정보는 로컬 제출본에만 보관 |
|
||||
| 등기이사 주민등록초본/등본 등 주소·주민등록번호 확인 증빙 | 저장 양식 없음. 주민센터/정부24 등에서 임원 본인이 발급 | 등기이사별 성명, 주소, 주민등록번호/생년월일 확인 정보 | **등기이사는 무조건 준비해야 하는 발급서류로 안내.** 발급일·주민등록번호 표시 범위는 관할 요구 확인 |
|
||||
| 주금납입/잔고증명 | 저장 양식 없음. 은행 증명서 또는 거래내역 첨부 | 계좌명의, 납입금액, 기준일 | 자본금·주식인수 금액과 일치 |
|
||||
|
||||
|
||||
### 조건부 추가 서류 체크
|
||||
|
||||
아래는 일반 영리 주식회사 발기설립에서도 사실관계에 따라 추가될 수 있다. 해당 여부를 사용자에게 물어보고, 해당하면 체크리스트와 첨부서류 목록에 추가한다.
|
||||
|
||||
| 조건 | 추가 확인/서류 | 안내 방식 |
|
||||
| --- | --- | --- |
|
||||
| 명의개서대리인을 둔 경우 | 명의개서대리인 계약 또는 선임을 증명하는 정보 | 정관·주식 관련 문서와 일치 여부 확인 |
|
||||
| 현물출자, 재산인수, 설립비용 등 변태설립사항이 있는 경우 | 검사인/공증인 조사보고, 감정인 감정, 관련 재판서류 등 상업등기규칙 제129조상 첨부정보 | 표준 1인/현금출자 설립보다 복잡하므로 사실관계를 먼저 정리하고 필요한 양식을 별도 작성 |
|
||||
| 인허가가 필요한 업종인 경우 | 허가·인가·등록·신고 수리 증명 등 영업 가능 증빙 | 목적/업태·종목을 정관 제2조와 신청서 목적에 넣기 전 인허가 필요 여부 확인 |
|
||||
| 자본금 10억 원 이상 또는 소규모회사 특례를 벗어나는 경우 | 정관 공증, 의사록 인증, 감사/이사회 구성 등 추가 요건 | 저장된 표준 양식은 유지하되 공증·인증 필요 여부를 제출 전 체크 |
|
||||
|
||||
## 등록면허세·중과·소프트웨어 업종 체크
|
||||
|
||||
|
|
@ -83,46 +114,15 @@ metadata:
|
|||
- **소프트웨어 업종**: 소프트웨어 개발·공급, 정보통신업은 창업중소기업 세액감면(조세특례제한법 제6조) 또는 대도시 중과 제외 업종 검토 대상이 될 수 있다. 단, 감면·제외는 업종코드, 실제 사업내용, 창업 요건, 이전/합병/개인사업 전환 여부에 따라 달라지므로 세무사/지자체 확인 전에는 확정 표현을 쓰지 않는다.
|
||||
- **응답 방식**: 세금은 “예상 체크리스트”로 안내하고, 최종 금액은 위택스/관할 시군구 계산 결과를 기준으로 한다.
|
||||
|
||||
## 문서 자동화 흐름
|
||||
|
||||
1. 사용자 입력을 JSON으로 정규화한다. 공유용 예시는 개인정보를 마스킹하고, 실제 문서 생성 전까지는 주소·생년월일·인감 관련 값 대신 자리표시자를 유지한다.
|
||||
|
||||
```json
|
||||
{
|
||||
"company_name": "예시소프트 주식회사",
|
||||
"head_office_address": "서울특별시 ...",
|
||||
"purposes": ["소프트웨어 개발 및 공급업", "정보통신업"],
|
||||
"capital_krw": 1000000,
|
||||
"par_value_krw": 100,
|
||||
"founders": [{ "name": "홍길동", "shares": 10000 }],
|
||||
"directors": [{ "name": "홍길동", "role": "대표이사" }],
|
||||
"fiscal_year_end": "12월 31일"
|
||||
}
|
||||
```
|
||||
|
||||
2. `templates/standard-articles-of-incorporation.md`와 `templates/incorporation-document-pack.md`의 `{{PLACEHOLDER}}`를 채워 Markdown 초안을 만든다.
|
||||
3. HWPX가 필요하면 `hwp` 스킬의 kordoc `markdownToHwpx` 경로를 사용한다.
|
||||
4. 기존 HWP 양식을 편집해야 하면 `rhwp-edit` 스킬의 `k-skill-rhwp replace-all` 또는 `set-cell-text`로 자리표시자를 채운다. `replace-all`은 본문 문단 자리표시자 치환에만 우선 사용하고, 표/셀 안의 입력란은 `k-skill-rhwp info`로 구조를 확인한 뒤 `set-cell-text` 같은 셀 인식 명령으로 채운다. 법원·등기소 공식 HWP 양식은 표가 많으므로 제출 전에는 반드시 사람이 열어 레이아웃과 누락 셀을 검토한다.
|
||||
5. 채워진 HWP에는 이름·주소·생년월일 같은 개인정보가 들어갈 수 있으므로 레포 밖의 비공개 임시 디렉터리나 사용자가 지정한 안전한 로컬 폴더에만 저장한다. 예시는 `mktemp -d`와 `chmod 700`으로 저장소 외부 작업 디렉터리를 만든 뒤 사용한다.
|
||||
|
||||
```bash
|
||||
workdir="$(mktemp -d "${TMPDIR:-/tmp}/corp-reg.XXXXXX")"
|
||||
chmod 700 "$workdir"
|
||||
npx k-skill-rhwp replace-all ./templates/court-form.hwp "$workdir/court-form-filled.hwp" \
|
||||
--query '{{COMPANY_NAME}}' --replacement '예시소프트 주식회사'
|
||||
k-skill-rhwp info "$workdir/court-form-filled.hwp"
|
||||
```
|
||||
|
||||
6. 생성 직후 `k-skill-rhwp info "$workdir/court-form-filled.hwp"`로 round-trip 여부를 확인하고, 사용자가 제출 전 읽을 수 있도록 쉬운 말 요약본을 함께 만든다. 채워진 산출물 경로는 PR·테스트 로그·공유 요약에 노출하지 않는다.
|
||||
|
||||
## 응답 끝에 항상 붙일 문구
|
||||
|
||||
> 이 안내와 문서 초안은 참고용이며 법률·세무 자문이 아닙니다. 실제 등기 제출 전 관할 등기소, 위택스/지자체 세무부서, 법무사·변호사·세무사 확인을 권합니다.
|
||||
|
||||
## 출처 확인 우선순위
|
||||
|
||||
- 대법원 인터넷등기소: https://www.iros.go.kr
|
||||
- `templates/official-form-sources.md`: 저장된 공식/공개 HWP 양식 목록, 문서별 양식 경로, 공식 출처 대조 메모
|
||||
- 대법원 인터넷등기소: https://www.iros.go.kr (등기신청양식, 첨부서면예시)
|
||||
- 온라인법인설립시스템: https://www.startbiz.go.kr
|
||||
- 위택스: https://www.wetax.go.kr
|
||||
- 국가법령정보센터 지방세법/지방세법 시행령/상법/상업등기법: https://www.law.go.kr
|
||||
- 국가법령정보센터 지방세법/지방세법 시행령/상법/상업등기법/상업등기규칙/상업등기신청서의 양식에 관한 예규: https://www.law.go.kr
|
||||
- 국세청 창업중소기업 세액감면 안내 및 조세특례제한법 제6조: https://www.nts.go.kr / https://www.law.go.kr
|
||||
|
|
|
|||
106
corporate-registration-consulting/scripts/fill_official_hwp.py
Executable file
106
corporate-registration-consulting/scripts/fill_official_hwp.py
Executable file
|
|
@ -0,0 +1,106 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Fill the bundled official Korean stock-company incorporation HWP form.
|
||||
|
||||
This script intentionally writes to a caller-provided output path and never
|
||||
modifies the bundled official source form in place.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
SCRIPT_DIR = Path(__file__).resolve().parent
|
||||
SKILL_DIR = SCRIPT_DIR.parent
|
||||
OFFICIAL_DIR = SKILL_DIR / "templates" / "official"
|
||||
DEFAULT_FORM = OFFICIAL_DIR / "form-65-1-stock-company-incorporation-promoter.hwp"
|
||||
DEFAULT_MAP = OFFICIAL_DIR / "form-65-1-fill-map.json"
|
||||
|
||||
|
||||
def load_json(path: Path) -> dict:
|
||||
with path.open("r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def stringify(value) -> str:
|
||||
if value is None:
|
||||
return ""
|
||||
if isinstance(value, list):
|
||||
return "\n".join(str(item) for item in value if item is not None)
|
||||
if isinstance(value, (int, float)):
|
||||
return f"{value:,.0f}"
|
||||
return str(value)
|
||||
|
||||
|
||||
def run_set_cell(current: Path, output: Path, spec: dict, text: str, cwd: Path) -> None:
|
||||
cmd = [
|
||||
"npx",
|
||||
"k-skill-rhwp",
|
||||
"set-cell-text",
|
||||
str(current),
|
||||
str(output),
|
||||
"--section",
|
||||
str(spec["section"]),
|
||||
"--parent-paragraph",
|
||||
str(spec["parentParagraph"]),
|
||||
"--control",
|
||||
str(spec["control"]),
|
||||
"--cell",
|
||||
str(spec["cell"]),
|
||||
"--text",
|
||||
text,
|
||||
]
|
||||
result = subprocess.run(cmd, cwd=cwd, text=True, capture_output=True)
|
||||
if result.returncode != 0:
|
||||
raise RuntimeError(result.stderr.strip() or result.stdout.strip())
|
||||
|
||||
|
||||
def fill_form(data: dict, form_path: Path, map_path: Path, output_path: Path, cwd: Path) -> list[str]:
|
||||
fill_map = load_json(map_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
temp_path = output_path.with_suffix(output_path.suffix + ".tmp")
|
||||
shutil.copyfile(form_path, temp_path)
|
||||
written: list[str] = []
|
||||
|
||||
for field_name, spec in fill_map["fields"].items():
|
||||
if field_name in data:
|
||||
text = stringify(data[field_name])
|
||||
elif "default" in spec:
|
||||
text = stringify(spec["default"])
|
||||
else:
|
||||
continue
|
||||
next_path = output_path.with_suffix(output_path.suffix + f".{len(written)}.tmp")
|
||||
run_set_cell(temp_path, next_path, spec, text, cwd)
|
||||
temp_path.unlink(missing_ok=True)
|
||||
temp_path = next_path
|
||||
written.append(field_name)
|
||||
|
||||
shutil.move(str(temp_path), str(output_path))
|
||||
return written
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
parser = argparse.ArgumentParser(description="Fill official form 65-1 HWP with JSON data")
|
||||
parser.add_argument("--input-json", required=True, type=Path, help="JSON file with form field values")
|
||||
parser.add_argument("--output", required=True, type=Path, help="Output HWP path outside the repository")
|
||||
parser.add_argument("--form", type=Path, default=DEFAULT_FORM, help="Official HWP source form")
|
||||
parser.add_argument("--map", dest="map_path", type=Path, default=DEFAULT_MAP, help="HWP cell fill map")
|
||||
parser.add_argument("--cwd", type=Path, default=Path.cwd(), help="Directory where npx k-skill-rhwp is available")
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
data = load_json(args.input_json)
|
||||
written = fill_form(data, args.form, args.map_path, args.output, args.cwd)
|
||||
print(json.dumps({"ok": True, "output": str(args.output), "fields_written": written}, ensure_ascii=False, indent=2))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
raise SystemExit(main())
|
||||
except Exception as exc: # noqa: BLE001 - CLI boundary
|
||||
print(f"fill_official_hwp.py: {exc}", file=sys.stderr)
|
||||
raise SystemExit(1)
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,124 @@
|
|||
{
|
||||
"downloaded_at": "2026-05-02",
|
||||
"note": "Publicly downloadable HWP templates collected from the listed source pages. Where a downloaded form contained real/sample company names, personal names, addresses, resident-registration-like numbers, bank names, or concrete sample dates, those values were sanitized to placeholders after download. The bundled standard articles reference is a general Ministry of Justice stock-company articles form suitable as a non-listed/startup reference, not a listed-company standard articles form. Verify suitability, licensing, and current official requirements before submission.",
|
||||
"files": [
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "정관.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/kPhhH/btqvUyGvYvl/AAAAAAAAAAAAAAAAAAAAAMldtkYuC46ZKQT-PZBrQ5xlYghtGK_BcJDzi8M3oORj/%EC%A0%95%EA%B4%80.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=2tn9fayBdYzwsfZua4mPP2qzQtc%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "articles-of-incorporation.hwp",
|
||||
"sha256": "244f5eddd3bda1b200ad28c2a4bd1295182949c502255821d418f6605dc8cb52",
|
||||
"bytes": 21504
|
||||
},
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "주식발행사항동의서.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/uWZvQ/btqvTVWemNI/AAAAAAAAAAAAAAAAAAAAAAv4YzUGetrPiGJ6nrBjJ0mHUZrBAHcP2SNRqEK06V3E/%EC%A3%BC%EC%8B%9D%EB%B0%9C%ED%96%89%EC%82%AC%ED%95%AD%EB%8F%99%EC%9D%98%EC%84%9C.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=5URf5oei3BwYKvi1vppdNRGziqg%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "share-issuance-consent.hwp",
|
||||
"sha256": "cacdf5e9b95f734fc708b9258f72836c6acb9dfc0f0550a52a0ca36df6b1f3eb",
|
||||
"bytes": 9216
|
||||
},
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "주식인수증.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/cFhyio/btqvUPOKPBe/AAAAAAAAAAAAAAAAAAAAAFzsXsWe7nQ6V43IEUWYpDMn7zjIQs_36miFqzw0x2s7/%EC%A3%BC%EC%8B%9D%EC%9D%B8%EC%88%98%EC%A6%9D.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=S2yCAsjaWS%2Fs6XKOcPgq%2BTH3AQE%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "share-subscription.hwp",
|
||||
"sha256": "4b6cd23af21211294362dea2ff5c0e3018c7a8ccc93543d28e1cdd1f8ef5dad8",
|
||||
"bytes": 9216
|
||||
},
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "발기인총회 기간단축 동의서.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/blsbID/btqvTVhH67A/AAAAAAAAAAAAAAAAAAAAAH87uTWGvHw4EvRi6tHMRf6XpLm2pCDhng0o98F5RteI/%EB%B0%9C%EA%B8%B0%EC%9D%B8%EC%B4%9D%ED%9A%8C%20%EA%B8%B0%EA%B0%84%EB%8B%A8%EC%B6%95%20%EB%8F%99%EC%9D%98%EC%84%9C.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=WU3918ycgKAZPT3UU%2BzZygmysfI%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "founder-meeting-period-shortening-consent.hwp",
|
||||
"sha256": "d65e2f21cfa29ee98a24770965ba5f3c9e78dbaee4e6062f0e01c19e5bf1f31b",
|
||||
"bytes": 9216
|
||||
},
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "조사보고서.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/bzY2if/btqvUQ1dSyn/AAAAAAAAAAAAAAAAAAAAAKsezsmgGy42M8uVt_hjH5SKf4ix8QS2uqM70wZF8RsY/%EC%A1%B0%EC%82%AC%EB%B3%B4%EA%B3%A0%EC%84%9C.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=PkaZuqkfncOKJxmyaEkj%2BjULtkk%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "inspection-report.hwp",
|
||||
"sha256": "7ad5c9bbfb416a4196352ab91715b6e7ed87d329714c81f624285a46b6c437ea",
|
||||
"bytes": 10752
|
||||
},
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "취임승낙서(감사).hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/lmctu/btqvWp2GinG/AAAAAAAAAAAAAAAAAAAAAPjANE6MFT3qQ8FxVKmZtyWc3tp76wLpjBvx59m-Znka/%EC%B7%A8%EC%9E%84%EC%8A%B9%EB%82%99%EC%84%9C(%EA%B0%90%EC%82%AC).hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=KjnFd3mTy6ip1UNPWBNwd8bJD50%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "officer-acceptance-auditor.hwp",
|
||||
"sha256": "6d9ca0907faf7ddb976b8d7e2569d87f7d5efc7c9e1550d12a7d90aed7a517c6",
|
||||
"bytes": 8704
|
||||
},
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "취임승낙서(이사.대표이사).hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/bv9fD4/btqvTGrs7v5/AAAAAAAAAAAAAAAAAAAAAJxrlq6pQhlDomIn1bvd3jd_AVSEMyMmkUOriHaLw20E/%EC%B7%A8%EC%9E%84%EC%8A%B9%EB%82%99%EC%84%9C(%EC%9D%B4%EC%82%AC.%EB%8C%80%ED%91%9C%EC%9D%B4%EC%82%AC).hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=9WNbZDPbyDtjx09ZwrpNTzSGQQM%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "officer-acceptance-director-ceo.hwp",
|
||||
"sha256": "7c5f4e7d44d69db6578c1a12640a2ef5ef0c2f3279f7faad7c65fca505878f24",
|
||||
"bytes": 8704
|
||||
},
|
||||
{
|
||||
"source_name": "위시라이트 블로그 공개 주식회사 설립 첨부서류 HWP",
|
||||
"page_url": "https://wishright81.tistory.com/23",
|
||||
"original_name": "이사회의사록.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/bR9OJQ/btqvUQNG0yZ/AAAAAAAAAAAAAAAAAAAAADd7sShQDM0Pv6_Df3LIL5H7wovm-TBSqcfMlaMpK_N2/%EC%9D%B4%EC%82%AC%ED%9A%8C%EC%9D%98%EC%82%AC%EB%A1%9D.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=gdXVuFaDSUNHNCuMoXihjRDGWSQ%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "board-minutes.hwp",
|
||||
"sha256": "735eaece6ec2fc617d8768bd30098f1f4808099aeeeed91aebf48e988238d003",
|
||||
"bytes": 10752
|
||||
},
|
||||
{
|
||||
"source_name": "우택스 블로그 공개 주식회사 설립등기 첨부서류 HWP",
|
||||
"page_url": "https://wootax.tistory.com/entry/%EC%A3%BC%EC%8B%9D%ED%9A%8C%EC%82%AC-%EC%84%A4%EB%A6%BD%ED%95%98%EA%B8%B0-%EB%B2%95%EC%9D%B8%EB%93%B1%EA%B8%B0%EB%B6%80%EB%93%B1%EB%B3%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0",
|
||||
"original_name": "5. 발기인회의사록.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/bwE3eR/btso6ks6Rz1/AAAAAAAAAAAAAAAAAAAAAGXjN0fmZvlgAGf9McFFnfvkxxo5s51mVwOvolJ6MSFN/5.%20%EB%B0%9C%EA%B8%B0%EC%9D%B8%ED%9A%8C%EC%9D%98%EC%82%AC%EB%A1%9D.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=Gmc9qugkolm7QOXIFEvUg7AfO7c%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "founder-meeting-minutes.hwp",
|
||||
"sha256": "62971efa2ace88d8df7fa827538fc6b9d31b60d14e945d0769327531fee6a77b",
|
||||
"bytes": 58368
|
||||
},
|
||||
{
|
||||
"source_name": "우택스 블로그 공개 주식회사 설립등기 첨부서류 HWP",
|
||||
"page_url": "https://wootax.tistory.com/entry/%EC%A3%BC%EC%8B%9D%ED%9A%8C%EC%82%AC-%EC%84%A4%EB%A6%BD%ED%95%98%EA%B8%B0-%EB%B2%95%EC%9D%B8%EB%93%B1%EA%B8%B0%EB%B6%80%EB%93%B1%EB%B3%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0",
|
||||
"original_name": "6. 주주명부.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/Yu8V2/btso10oEbPP/AAAAAAAAAAAAAAAAAAAAAAVv7HSE5W8icMvgAPu5O1oDuYfJU9papuMZ17SolMpe/6.%20%EC%A3%BC%EC%A3%BC%EB%AA%85%EB%B6%80.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=L%2F17AHZt9FAz%2Fuvkv4fhWQfrGSU%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "shareholder-register.hwp",
|
||||
"sha256": "5dc27e306c0384bad4c59073c402f0bd3085d1049c24afe68cc75dc83702c3af",
|
||||
"bytes": 36352
|
||||
},
|
||||
{
|
||||
"source_name": "우택스 블로그 공개 주식회사 설립등기 첨부서류 HWP",
|
||||
"page_url": "https://wootax.tistory.com/entry/%EC%A3%BC%EC%8B%9D%ED%9A%8C%EC%82%AC-%EC%84%A4%EB%A6%BD%ED%95%98%EA%B8%B0-%EB%B2%95%EC%9D%B8%EB%93%B1%EA%B8%B0%EB%B6%80%EB%93%B1%EB%B3%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0",
|
||||
"original_name": "9. 인감신고서.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/K8StW/btso08AvjvK/AAAAAAAAAAAAAAAAAAAAAAg8rnGRLiZrbNJpvZ3uaK1vS0_QZ_wd9oAYMPZPWjJe/9.%20%EC%9D%B8%EA%B0%90%EC%8B%A0%EA%B3%A0%EC%84%9C.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=ZOKfYeOyzgqyx05a30tMlcPfhPQ%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "corporate-seal-report.hwp",
|
||||
"sha256": "26aa32cce44a4cb1d3a92e5684c02fc210c65b2d344acaa470ebc91c2579bd5b",
|
||||
"bytes": 52736
|
||||
},
|
||||
{
|
||||
"source_name": "우택스 블로그 공개 주식회사 설립등기 첨부서류 HWP",
|
||||
"page_url": "https://wootax.tistory.com/entry/%EC%A3%BC%EC%8B%9D%ED%9A%8C%EC%82%AC-%EC%84%A4%EB%A6%BD%ED%95%98%EA%B8%B0-%EB%B2%95%EC%9D%B8%EB%93%B1%EA%B8%B0%EB%B6%80%EB%93%B1%EB%B3%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0",
|
||||
"original_name": "10. 위임장.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/beg039/btso1ui7lKh/AAAAAAAAAAAAAAAAAAAAAAwYRb3rbFNGA338GYRNAaxNjLxi81b6M-HeAya9eRDY/10.%20%EC%9C%84%EC%9E%84%EC%9E%A5.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=Wx7HctsqSHGJzFsBs9gNxTHrN%2Bs%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "power-of-attorney.hwp",
|
||||
"sha256": "d9141458d779dd781178ca187c2466fe9c2ec7467971b9fcdb6ad52e4ff42d66",
|
||||
"bytes": 33280
|
||||
},
|
||||
{
|
||||
"source_name": "법무부 주식회사 표준정관 공개 재배포 HWP",
|
||||
"page_url": "https://mbolt.tistory.com/60",
|
||||
"original_name": "주식회사표준정관_법무부.hwp",
|
||||
"url": "https://blog.kakaocdn.net/dna/bnYmGS/btqQmP25auG/AAAAAAAAAAAAAAAAAAAAAOftXuAiup09pc65AD9memsLydWwWBZ3dWCh-W5jgLvF/%EC%A3%BC%EC%8B%9D%ED%9A%8C%EC%82%AC%ED%91%9C%EC%A4%80%EC%A0%95%EA%B4%80_%EB%B2%95%EB%AC%B4%EB%B6%80.hwp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1780239599&allow_ip=&allow_referer=&signature=P9ehS7wc0K3d%2FsEuWvvUJvwxJrE%3D&attach=1&knm=tfile.hwp",
|
||||
"path": "standard-articles-startup-moj.hwp",
|
||||
"sha256": "64d84ff1bd9ba10db1f5ba9c7ee0442725385ce44b587730e7984c69bd3034d6",
|
||||
"bytes": 19456,
|
||||
"note": "상장회사 표준정관이 아니라 일반 비상장/스타트업 발기설립 정관 참고용으로 쓰는 법무부 주식회사 표준정관 HWP 재배포본."
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
|
@ -19,17 +19,42 @@
|
|||
| 순서 | 문서 | 쉬운 설명 | 준비 상태 |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | 설립등기신청서 | 등기소에 “이 회사를 등기해 달라”고 내는 표지 서류 | {{STATUS_APPLICATION}} |
|
||||
| 2 | 정관 | 회사의 기본 규칙 | {{STATUS_ARTICLES}} |
|
||||
| 2 | 정관 | 회사의 기본 규칙. 앞부분 제2조 목적/업태·종목과 맨 마지막 날짜·발기인 서명/기명날인·간인을 중점 확인 | {{STATUS_ARTICLES}} |
|
||||
| 3 | 발기인 의사록/결정서 | 회사를 세우기로 정했다는 기록 | {{STATUS_FOUNDERS_MINUTES}} |
|
||||
| 4 | 주식인수증 | 누가 몇 주를 가져가는지 적은 문서 | {{STATUS_SHARE_SUBSCRIPTION}} |
|
||||
| 5 | 주금납입 증빙/잔고증명 | 자본금이 실제로 입금됐다는 증빙 | {{STATUS_BANK_BALANCE}} |
|
||||
| 6 | 조사보고서 | 설립 과정과 재산 상태를 확인했다는 보고 | {{STATUS_INSPECTION_REPORT}} |
|
||||
| 7 | 취임승낙서 | 이사/감사가 직책을 맡겠다고 동의한 문서 | {{STATUS_ACCEPTANCE}} |
|
||||
| 8 | 인감신고서 | 법인인감을 등기소에 신고하는 서류 | {{STATUS_SEAL_REPORT}} |
|
||||
| 9 | 등록면허세 영수필확인서 | 등기 전 지방세를 냈다는 증명 | {{STATUS_TAX_RECEIPT}} |
|
||||
| 10 | 주민등록/주소/인감 관련 증빙 | 임원·발기인 신원과 도장 확인 | {{STATUS_IDENTITY_DOCS}} |
|
||||
| 8 | 인감신고서 | 법인인감을 등기소에 신고하는 서류. 실제 법인인감 도장을 미리 준비 | {{STATUS_SEAL_REPORT}} |
|
||||
| 9 | 등록면허세 영수필확인서 | 등기 전 지방세를 냈다는 증명. 납부 후 반드시 발급/첨부 | {{STATUS_TAX_RECEIPT}} |
|
||||
| 10 | 등기신청수수료 영수필확인서 | 등기 신청 수수료를 냈다는 증명. 등록면허세와 별도로 반드시 발급/첨부 | {{STATUS_REGISTRY_FEE_RECEIPT}} |
|
||||
| 11 | 등기이사 개인 인감증명서 또는 본인서명사실확인서 | 등기이사 본인의 인감/서명을 확인하는 발급서류. 등기이사는 무조건 준비해야 함 | {{STATUS_DIRECTOR_SEAL_CERTS}} |
|
||||
| 12 | 등기이사 주민등록초본/등본 등 주소 확인 증빙 | 등기이사 주소·주민등록번호/생년월일 확인 발급서류. 등기이사는 무조건 준비해야 함 | {{STATUS_DIRECTOR_RESIDENT_DOCS}} |
|
||||
|
||||
공유용 체크리스트에는 위 증빙의 보유 여부만 표시하고, 주민등록번호·상세 주소·인감증명서 번호 같은 개인정보/민감정보 원문은 적지 않는다.
|
||||
공유용 체크리스트에는 위 증빙의 보유 여부만 표시하고, 주민등록번호·상세 주소·인감증명서 번호 같은 개인정보/민감정보 원문은 적지 않는다. 등기이사에게는 개인 인감증명서/본인서명사실확인서와 주민등록초본/등본이 별도 발급서류로 필요하다는 점을 누락 없이 안내한다.
|
||||
|
||||
|
||||
## 2-1. 양식별 수정 위치·간인·인감 체크
|
||||
|
||||
| 문서 | 어느 부분을 고칠지 | 제출 전 추가 확인 |
|
||||
| --- | --- | --- |
|
||||
| 설립등기신청서 | 상단 상호/본점, 등기 목적, 자본금·주식 수, 임원, 첨부서류 목록, 신청일·신청인 | 발기설립 양식 제65-1호인지 확인. 모집설립 양식은 사용하지 않음 |
|
||||
| 정관 | 제1조 상호, **제2조 목적의 실제 사업 업태·종목**, 본점, 주식/임원/결산 규정, 부칙 | 맨 마지막 날짜와 발기인 전원 서명/기명날인, 여러 장이면 간인 |
|
||||
| 주식인수/주식발행 동의 | 인수인, 주식 수, 1주의 금액, 인수가액, 납입기일 | 합계가 신청서·정관과 일치 |
|
||||
| 발기인회의사록/결정서 | 일시·장소, 의안, 결의 내용, 발기인, 날짜, 날인란 | 여러 장이면 간인 필요 여부 확인 |
|
||||
| 조사보고서 | 조사자, 주금납입 확인, 변태설립사항 유무, 결론 문구 | 최종 적법 판단을 에이전트가 단정하지 않음 |
|
||||
| 취임승낙서 | 임원 성명, 주소, 생년월일, 직책, 취임일, 날짜, 개인 인감/서명 | 등기 임원 명단과 일치 |
|
||||
| 인감신고서 | 대표자, 상호/본점, 법인인감 날인란 | 법인인감 도장 준비 및 날인 위치 확인 |
|
||||
| 위임장 | 위임인·수임인, 위임 범위, 날짜, 날인란 | 대리 제출 시 원본 날인·간인 요구 확인 |
|
||||
|
||||
## 2-2. 조건부 추가서류
|
||||
|
||||
| 조건 | 추가서류/확인 | 준비 상태 |
|
||||
| --- | --- | --- |
|
||||
| 명의개서대리인을 둔 경우 | 명의개서대리인 계약 또는 선임 증명 | {{STATUS_TRANSFER_AGENT}} |
|
||||
| 현물출자/재산인수 등 변태설립사항이 있는 경우 | 검사인·공증인 조사보고, 감정인 감정, 관련 재판서류 | {{STATUS_SPECIAL_FORMATION_DOCS}} |
|
||||
| 인허가 업종인 경우 | 허가·인가·등록·신고 수리 증명 | {{STATUS_LICENSE_DOCS}} |
|
||||
| 자본금 10억 원 이상 또는 소규모회사 특례 밖인 경우 | 정관 공증, 의사록 인증, 감사/이사회 요건 확인 | {{STATUS_NOTARIZATION_REVIEW}} |
|
||||
|
||||
## 3. 취임승낙서 초안
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,91 @@
|
|||
# 주식회사 설립등기 공식 양식 출처 맵
|
||||
|
||||
> 이 파일은 스킬에 **이미 저장된 HWP 양식 경로**와 제출 전 대조 기준을 정리한 매핑 문서입니다. 에이전트는 새 양식을 찾는 것부터 시작하지 말고, 2026-05-02 기준 저장된 `templates/official/` 및 `templates/attachment-hwp/` 파일 사본을 레포 밖 작업 디렉터리에 복사해 채웁니다. 인터넷등기소/법원 제공 HWP/HWPX/PDF 원본은 수시로 바뀔 수 있으므로 제출 직전 최신본과 대조만 안내합니다.
|
||||
|
||||
## 저장 양식 우선 사용 순서
|
||||
|
||||
1. **번들 HWP 스냅샷** `templates/official/`
|
||||
- `form-65-1-stock-company-incorporation-promoter.hwp`: [양식 제65-1호] 주식회사 설립 등기(발기설립).
|
||||
- `form-65-2-stock-company-incorporation-subscription.hwp`: [양식 제65-2호] 주식회사 설립 등기(모집설립). 모집설립은 일반적이지 않으므로 이 스킬은 대응하지 않고 대조자료로만 둔다.
|
||||
- `form-65-1-fill-map.json`: 발기설립 공식 HWP의 주요 입력 셀 매핑.
|
||||
- `source-manifest.json`: 다운로드일, flSeq, SHA-256, 원천 URL 메타데이터.
|
||||
2. **국가법령정보센터 등기예규** `상업등기신청서의 양식에 관한 예규`
|
||||
- 대조할 양식: **양식 제65-1호(주식회사설립등기신청서·발기설립)**, **양식 제65-2호(주식회사설립등기신청서·모집설립)**.
|
||||
- 용도: 인터넷등기소 양식이 최신 예규의 별지 양식과 맞는지 확인.
|
||||
3. **찾기쉬운 생활법령정보: 주식회사 설립등기**
|
||||
- 용도: 신청 방식, 신청정보, 첨부정보 목록의 쉬운 말 확인.
|
||||
- 확인 포인트: 생활법령 페이지는 인터넷등기소에 등기신청서·첨부서류 양식 및 작성방식이 있다고 안내하고, 첨부서면은 등기예규 제65-1호/제65-2호를 보라고 안내한다.
|
||||
4. **온라인법인설립시스템** `https://www.startbiz.go.kr`
|
||||
- 용도: 온라인 법인설립 진행 시 실제 입력 흐름, 기관 연계 제출 흐름 확인.
|
||||
|
||||
|
||||
## 실제 공개 배포 첨부서류 HWP 양식 묶음
|
||||
|
||||
공식 설립등기신청서 외에 실제 발기설립에서 자주 필요한 첨부서면은 `templates/attachment-hwp/`에 **공개 웹에서 실제 배포되는 HWP 파일**로 함께 둔다. 이 파일들은 에이전트가 임의 생성한 양식이 아니며, 각 파일의 출처 URL·원 파일명·SHA-256은 `templates/attachment-hwp/source-manifest.json`에 기록한다. 공개 배포본에 포함되어 있던 실제/샘플 법인명·성명·주소·주민등록번호형 문자열·은행명·구체 날짜는 HWP 안에서 자리표시자로 치환했다. 다만 공식 양식이 아닌 민간/공개 배포 양식은 제출 전 인터넷등기소 첨부서면예시, 상법 제289조, 상업등기규칙 제129조, 관할 등기소 요구와 반드시 대조한다.
|
||||
|
||||
- `articles-of-incorporation.hwp`: 공개 배포 정관 양식.
|
||||
- `standard-articles-startup-moj.hwp`: 법무부 주식회사 표준정관 공개 재배포 HWP. 상장회사 표준정관이 아니라 비상장/스타트업 발기설립 정관 참고용으로 사용한다.
|
||||
- `share-issuance-consent.hwp`: 주식발행사항동의서.
|
||||
- `share-subscription.hwp`: 주식인수증.
|
||||
- `founder-meeting-minutes.hwp`: 발기인회의사록.
|
||||
- `founder-meeting-period-shortening-consent.hwp`: 발기인총회 기간단축 동의서.
|
||||
- `shareholder-register.hwp`: 주주명부.
|
||||
- `inspection-report.hwp`: 조사보고서.
|
||||
- `officer-acceptance-director-ceo.hwp`: 이사/대표이사 취임승낙서.
|
||||
- `officer-acceptance-auditor.hwp`: 감사 취임승낙서.
|
||||
- `board-minutes.hwp`: 이사회의사록.
|
||||
- `corporate-seal-report.hwp`: 인감신고서.
|
||||
- `power-of-attorney.hwp`: 위임장.
|
||||
|
||||
## 표준 발기설립 문서별 공식/초안 대응
|
||||
|
||||
| 문서 | 공식 확인 위치 | 레포 내 HWP/보조자료 | 사용 원칙 |
|
||||
| --- | --- | --- | --- |
|
||||
| 주식회사설립등기신청서(발기설립) | 인터넷등기소 등기신청양식, 등기예규 양식 제65-1호, 번들 `templates/official/form-65-1-stock-company-incorporation-promoter.hwp` | `templates/incorporation-document-pack.md`의 기본정보 섹션 및 `scripts/fill_official_hwp.py` | 번들 HWP에 주요 값을 자동 작성하되, 제출 전 최신 공식본 대조와 사람 검토 필수 |
|
||||
| 주식회사설립등기신청서(모집설립) | 등기예규 양식 제65-2호, 번들 `templates/official/form-65-2-stock-company-incorporation-subscription.hwp` | 기본 플로우에서는 사용하지 않음 | 모집설립은 일반적이지 않으므로 사용자가 별도 요청하지 않는 한 발기설립 양식을 채운다 |
|
||||
| 정관 | 상법, 상업등기규칙, 인터넷등기소 첨부서면예시, 공개 배포 정관 HWP | `templates/attachment-hwp/articles-of-incorporation.hwp`, `templates/attachment-hwp/standard-articles-startup-moj.hwp` | 실제 공개 배포 HWP를 우선 복사해 작성한다. 앞부분 제2조 목적에는 실제 사업 업태·종목을 채우고, 맨 마지막 날짜·발기인 서명/기명날인·간인을 확인한다. 종류주식·스톡옵션·투자계약 등은 표준정관 구조를 우선 확인해 별도 조항으로 보강 |
|
||||
| 발기인 의사록/결정서 | 인터넷등기소 첨부서면예시, 공개 배포 발기인회의사록 HWP | `templates/attachment-hwp/founder-meeting-minutes.hwp`, `templates/attachment-hwp/founder-meeting-period-shortening-consent.hwp` | 공개 배포 HWP를 복사해 회사 구조별 필수 결의사항을 공식 예시와 대조 |
|
||||
| 주식인수증/주식청약서 | 인터넷등기소 첨부서면예시, 상업등기규칙 제129조, 공개 배포 HWP | `templates/attachment-hwp/share-subscription.hwp`, `templates/attachment-hwp/share-issuance-consent.hwp` | 발기설립은 주식 인수를 증명하는 정보, 모집설립은 청약 관련 정보가 달라질 수 있음 |
|
||||
| 조사보고서 | 인터넷등기소 첨부서면예시, 상법 조사보고 조항, 공개 배포 HWP | `templates/attachment-hwp/inspection-report.hwp` | 공개 배포 HWP를 복사해 작성하되, 에이전트가 최종 적법 판단 문구를 단정하지 않음 |
|
||||
| 취임승낙서 | 인터넷등기소 첨부서면예시, 상업등기규칙 제129조, 공개 배포 HWP | `templates/attachment-hwp/officer-acceptance-director-ceo.hwp`, `templates/attachment-hwp/officer-acceptance-auditor.hwp` | 성명·주소·생년월일 등 개인정보는 로컬 제출본에만 입력 |
|
||||
| 등기이사 개인 인감증명서 또는 본인서명사실확인서 | 상업등기규칙 제129조 및 관할 등기소 요구 | 저장 양식 없음. 주민센터/정부24 등에서 등기이사 본인이 발급 | 등기이사는 무조건 필요한 발급서류로 안내하고 원문 정보는 로컬 제출본에만 보관 |
|
||||
| 등기이사 주민등록초본/등본 등 주소 확인 증빙 | 상업등기규칙 제129조 및 관할 등기소 요구 | 저장 양식 없음. 주민센터/정부24 등에서 등기이사 본인이 발급 | 등기이사는 무조건 필요한 발급서류로 안내하고 발급일·주민등록번호 표시 범위 확인 |
|
||||
| 인감신고서 | 인터넷등기소 등기신청양식/첨부서면예시, 공개 배포 HWP | `templates/attachment-hwp/corporate-seal-report.hwp` | 공개 배포 HWP를 참고하되 법인인감 날인·인감 관련 증빙은 공식 요구 확인 |
|
||||
| 등록면허세 영수필확인서 | 위택스/관할 지자체 | `templates/incorporation-document-pack.md` 세금 확인 메모 | 필수 발급/첨부. 최종 세액·납부번호는 위택스/지자체 결과 기준 |
|
||||
| 등기신청수수료 영수필확인서 | 인터넷등기소/등기소 수수료 납부 | `templates/incorporation-document-pack.md` 체크리스트 | 필수 발급/첨부. 등록면허세 영수필확인서와 별도 문서로 관리 |
|
||||
|
||||
## 조건부 추가서류 대조
|
||||
|
||||
- 명의개서대리인을 둔 경우: 명의개서대리인 계약 또는 선임 증명 정보를 첨부서류 목록에 추가한다.
|
||||
- 현물출자·재산인수·설립비용 등 변태설립사항이 있는 경우: 상업등기규칙 제129조상 검사인/공증인 조사보고, 감정인 감정, 관련 재판서류 등 해당 증명정보를 별도로 확인한다.
|
||||
- 인허가 업종인 경우: 허가·인가·등록·신고 수리 증명 등 영업 가능 증빙을 추가한다.
|
||||
- 자본금 10억 원 이상 또는 소규모회사 특례 밖인 경우: 정관 공증, 의사록 인증, 감사/이사회 구성 필요 여부를 확인한다.
|
||||
|
||||
## 에이전트 답변에 포함할 공식 양식 안내 문구
|
||||
|
||||
- “실제 제출 양식은 인터넷등기소의 **등기신청양식**과 **첨부서면예시**에서 최신 HWP/HWPX/PDF를 다시 내려받아 사용하세요.”
|
||||
- “주식회사 발기설립 신청서는 국가법령정보센터의 `상업등기신청서의 양식에 관한 예규` **양식 제65-1호**, 모집설립은 **양식 제65-2호**와 대조하세요.”
|
||||
- “이 레포의 공개 배포 HWP 묶음과 Markdown 템플릿은 작성 보조자료이며, 최신 공식 양식·관할 등기소 요구를 대체하지 않습니다.”
|
||||
|
||||
## 저장 양식 기반 작성 흐름
|
||||
|
||||
1. 레포 밖 비공개 작업 디렉터리를 만든다.
|
||||
2. 위 표의 저장된 HWP 양식을 작업 디렉터리로 복사한다.
|
||||
3. 사용자 입력 JSON을 만든다. 주민등록번호 원문은 마스킹하거나 제출 직전 로컬 파일에만 둔다.
|
||||
4. `scripts/fill_official_hwp.py`로 번들 [양식 제65-1호] HWP에 주요 셀을 채운다.
|
||||
5. 첨부서류는 저장된 `templates/attachment-hwp/*.hwp` 사본을 한 장씩 확인하며 채운다. 단순 replace-all은 shortcut이므로 모든 양식을 순차 확인하고, 정관·의사록·위임장 등 간인 대상 가능 문서와 법인인감 준비 여부를 별도 체크한다.
|
||||
|
||||
```bash
|
||||
workdir="$(mktemp -d "${TMPDIR:-/tmp}/corp-reg.XXXXXX")"
|
||||
chmod 700 "$workdir"
|
||||
python3 corporate-registration-consulting/scripts/fill_official_hwp.py \
|
||||
--input-json "$workdir/form-data.json" \
|
||||
--output "$workdir/form-65-1-filled.hwp"
|
||||
npx k-skill-rhwp info "$workdir/form-65-1-filled.hwp"
|
||||
```
|
||||
|
||||
## HWP/HWPX 처리 주의
|
||||
|
||||
- 공식 파일을 새로 내려받거나 번들 HWP를 채운 산출물은 레포 밖 임시 디렉터리에 보관한다.
|
||||
- `k-skill-rhwp info <공식양식>`로 구조를 확인한 뒤 표/셀은 `set-cell-text`, 본문 자리표시자는 `replace-all`을 우선 사용한다. 다만 replace-all에 의존하지 말고 각 양식의 앞부분·본문·하단 날짜·서명/날인란을 순차 검토한다. 번들 발기설립 HWP는 `form-65-1-fill-map.json`의 셀 매핑을 사용한다.
|
||||
- 공식 양식은 표와 칸이 많으므로 자동 치환 후 반드시 사람이 한컴오피스/호환 뷰어로 열어 누락 셀, 줄바꿈, 날인란, 첨부서류 목록을 확인한다.
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"form": "form-65-1-stock-company-incorporation-promoter.hwp",
|
||||
"title": "[양식 제65-1호] 주식회사 설립 등기(발기설립)",
|
||||
"engine": "k-skill-rhwp set-cell-text",
|
||||
"warning": "이 매핑은 국가법령정보센터 HWP 별지 양식의 표 셀 인덱스에 맞춘 보조 자동작성 맵입니다. 자동 작성 후 한컴오피스/호환 뷰어에서 셀 위치, 줄바꿈, 날인란, 첨부서면 통수를 반드시 사람이 확인하세요.",
|
||||
"fields": {
|
||||
"registration_purpose": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 18, "default": "주식회사설립" },
|
||||
"registration_reason": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 19 },
|
||||
"company_name": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 21 },
|
||||
"head_office_address": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 23 },
|
||||
"public_notice_method": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 25 },
|
||||
"par_value_krw": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 27 },
|
||||
"authorized_shares": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 29 },
|
||||
"issued_shares_summary": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 31 },
|
||||
"capital_krw": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 33 },
|
||||
"purposes_text": { "section": 0, "parentParagraph": 2, "control": 0, "cell": 35 },
|
||||
"directors_auditors_text": { "section": 0, "parentParagraph": 3, "control": 0, "cell": 2 },
|
||||
"ceo_name_address": { "section": 0, "parentParagraph": 3, "control": 0, "cell": 4 },
|
||||
"share_class_details": { "section": 0, "parentParagraph": 3, "control": 0, "cell": 6, "default": "해당없음" },
|
||||
"branches": { "section": 0, "parentParagraph": 3, "control": 0, "cell": 8, "default": "해당없음" },
|
||||
"duration_or_dissolution": { "section": 0, "parentParagraph": 3, "control": 0, "cell": 10, "default": "해당없음" },
|
||||
"other_registration_items": { "section": 0, "parentParagraph": 3, "control": 0, "cell": 12 },
|
||||
"registration_tax_krw": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 1 },
|
||||
"local_education_tax_krw": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 3 },
|
||||
"special_rural_tax_krw": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 5, "default": "0" },
|
||||
"tax_total_krw": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 7 },
|
||||
"application_fee_krw": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 9 },
|
||||
"fee_payment_number": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 11 },
|
||||
"tax_base_krw": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 13 },
|
||||
"application_date": { "section": 0, "parentParagraph": 6, "control": 0, "cell": 17 }
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"downloaded_at": "2026-05-02",
|
||||
"source": {
|
||||
"name": "국가법령정보센터 상업등기신청서의 양식에 관한 예규",
|
||||
"page_url": "https://www.law.go.kr/행정규칙/상업등기신청서의양식에관한예규",
|
||||
"adm_rul_seq": "2200000106061",
|
||||
"note": "별지 양식 HWP 다운로드 링크(flDownload.do)에서 내려받은 공식 별지 서식입니다. 제출 전에는 최신 예규/인터넷등기소 양식과 다시 대조하세요."
|
||||
},
|
||||
"files": [
|
||||
{
|
||||
"path": "form-65-1-stock-company-incorporation-promoter.hwp",
|
||||
"title": "[양식 제65-1호] 주식회사 설립 등기(발기설립)",
|
||||
"flSeq": "146330897",
|
||||
"bylClsCd": "200206",
|
||||
"sha256": "793dc933df06bd7dee117c6613e369d6918be22114d8682d6e8c5f54850ddc98",
|
||||
"bytes": 17408
|
||||
},
|
||||
{
|
||||
"path": "form-65-2-stock-company-incorporation-subscription.hwp",
|
||||
"title": "[양식 제65-2호] 주식회사 설립 등기(모집설립)",
|
||||
"flSeq": "146330901",
|
||||
"bylClsCd": "200206",
|
||||
"sha256": "aefa665b1d57f856041a648bb8b9cbcfd291049112d683e9504310295d2a7848",
|
||||
"bytes": 17408
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
# {{COMPANY_NAME}} 정관 초안
|
||||
|
||||
> 참고용 표준 정관 초안입니다. 법률 자문이 아니며, 제출 전 전문가 검토가 필요합니다.
|
||||
|
||||
## 제1장 총칙
|
||||
|
||||
### 제1조(상호)
|
||||
이 회사는 {{COMPANY_NAME}}라 한다. 영문으로는 {{COMPANY_NAME_EN}}라 표기한다.
|
||||
|
||||
### 제2조(목적)
|
||||
이 회사는 다음 사업을 영위함을 목적으로 한다.
|
||||
|
||||
1. {{BUSINESS_PURPOSE_1}}
|
||||
2. {{BUSINESS_PURPOSE_2}}
|
||||
3. 위 각 호에 부대하거나 관련되는 일체의 사업
|
||||
|
||||
### 제3조(본점 소재지)
|
||||
이 회사의 본점은 {{HEAD_OFFICE_CITY}}에 둔다.
|
||||
|
||||
### 제4조(공고방법)
|
||||
이 회사의 공고는 {{PUBLIC_NOTICE_METHOD}}에 게재한다.
|
||||
|
||||
## 제2장 주식
|
||||
|
||||
### 제5조(발행예정주식총수)
|
||||
이 회사가 발행할 주식의 총수는 {{AUTHORIZED_SHARES}}주로 한다.
|
||||
|
||||
### 제6조(1주의 금액)
|
||||
이 회사가 발행하는 주식 1주의 금액은 금 {{PAR_VALUE_KRW}}원으로 한다.
|
||||
|
||||
### 제7조(설립 시 발행주식)
|
||||
이 회사가 설립 시 발행하는 주식의 총수는 {{INCORPORATION_SHARES}}주로 한다.
|
||||
|
||||
### 제8조(주식의 종류)
|
||||
이 회사가 발행하는 주식은 보통주식으로 한다. 종류주식, 전환주식, 상환주식은 별도 전문가 검토 후 정한다.
|
||||
|
||||
## 제3장 주주총회
|
||||
|
||||
### 제9조(소집)
|
||||
정기주주총회는 매 사업연도 종료 후 3개월 이내에 소집하고, 임시주주총회는 필요에 따라 소집한다.
|
||||
|
||||
### 제10조(의결권)
|
||||
주주의 의결권은 1주마다 1개로 한다.
|
||||
|
||||
## 제4장 임원
|
||||
|
||||
### 제11조(이사)
|
||||
이 회사의 이사는 {{DIRECTOR_COUNT}}명 이상으로 한다.
|
||||
|
||||
### 제12조(대표이사)
|
||||
대표이사 선정 방식은 이사 수와 이사회 설치 여부에 따라 다음 중 하나를 선택하고, 제출 전 관할 등기소 또는 전문가 확인을 받는다.
|
||||
|
||||
1. 이사가 3명 이상이고 이사회가 있는 경우: 대표이사는 이사회 결의로 선정한다.
|
||||
2. 이사가 2명인 소규모 회사로 이사회가 없는 경우: 각 이사가 회사를 대표하는 기본 구조인지, 특정 이사 1명을 대표이사로 둘 수 있는지 정관·주주총회 결의·등기 실무를 관할 등기소 또는 전문가에게 확인한 뒤 문구를 확정한다. 이 경우 이사회 결의라는 표현은 쓰지 않는다.
|
||||
3. 이사가 1명인 경우: 그 이사가 회사를 대표한다.
|
||||
|
||||
### 제13조(감사)
|
||||
감사는 {{AUDITOR_RULE}}. 소규모 회사의 감사 선임 생략 가능 여부는 상법 요건을 별도로 확인한다.
|
||||
|
||||
## 제5장 계산
|
||||
|
||||
### 제14조(사업연도)
|
||||
이 회사의 사업연도는 매년 1월 1일부터 {{FISCAL_YEAR_END}}까지로 한다.
|
||||
|
||||
### 제15조(이익배당)
|
||||
이익배당은 주주총회 결의로 정한다.
|
||||
|
||||
## 부칙
|
||||
|
||||
### 제1조(최초 임원)
|
||||
설립 당시 이사 및 대표이사는 다음과 같다.
|
||||
|
||||
- 대표이사: {{CEO_NAME}}
|
||||
- 이사: {{DIRECTOR_NAMES}}
|
||||
- 감사: {{AUDITOR_NAME_OR_NONE}}
|
||||
|
||||
### 제2조(발기인)
|
||||
발기인의 성명, 주소, 인수 주식 수는 다음과 같다.
|
||||
|
||||
| 발기인 | 주소 | 인수 주식 수 | 인수가액 |
|
||||
| --- | --- | ---: | ---: |
|
||||
| {{FOUNDER_1_NAME}} | {{FOUNDER_1_ADDRESS}} | {{FOUNDER_1_SHARES}} | {{FOUNDER_1_AMOUNT}}원 |
|
||||
|
||||
{{ADOPTION_DATE}}
|
||||
|
||||
발기인 {{FOUNDER_1_NAME}} (인)
|
||||
|
|
@ -39,7 +39,7 @@ metadata:
|
|||
|
||||
## Inputs
|
||||
|
||||
- `date` — 매각기일 (YYYY-MM-DD 또는 YYYYMMDD). 필수.
|
||||
- `date` — 매각기일 월(YYYY-MM 또는 YYYYMM) 또는 특정일(YYYY-MM-DD 또는 YYYYMMDD). 필수. 실제 사이트 검색 버튼은 월(YYYYMM) 단위로 조회하므로 특정일 입력은 월 조회 후 해당 일자만 필터링한다.
|
||||
- `courtCode` — 법원사무소코드 (예: `B000210` = 서울중앙지방법원). 비우면 전체. `getCourtCodes()` 또는 `codes courts` 로 받아온다.
|
||||
- `bidType` — `date` (= 기일입찰, code 000331) 또는 `period` (= 기간입찰, code 000332). 빈값이면 둘 다.
|
||||
- `caseNumber` — 사건번호. `2024타경100001` 형식 권장. `2024-100001` 도 받아서 `2024타경100001` 로 정규화한다.
|
||||
|
|
@ -147,7 +147,7 @@ court-auction-notice-search codes courts --pretty | head -40
|
|||
court-auction-notice-search codes bid-types --pretty
|
||||
|
||||
# 3. 매각공고 목록
|
||||
court-auction-notice-search notices --date 2026-04-27 --court-code B000210 --bid-type date --pretty
|
||||
court-auction-notice-search notices --date 2026-04 --court-code B000210 --bid-type date --pretty
|
||||
|
||||
# 4. 매각공고 상세 — list 응답의 row 의 raw 필드를 그대로 detail 호출에 사용한다.
|
||||
# (CLI 단발 호출에서는 list -> detail 으로 결과를 파이프할 수 있도록 jq 등을 함께 사용)
|
||||
|
|
|
|||
|
|
@ -156,6 +156,38 @@ upstream API 키를 사용자에게 노출하지 않으려면 `k-skill-proxy`를
|
|||
|
||||
---
|
||||
|
||||
## 크롤링/검색 스킬을 만들 때: site-agnostic discovery 먼저
|
||||
|
||||
웹사이트를 조회하거나 크롤링하는 스킬의 최종 산출물은 결국 **그 사이트에 맞는 site-dependent 접근 방법**이다. 다만 처음부터 특정 화면 구조나 임시 우회법을 감으로 고정하지 않는다. 먼저 `insane-search`식 접근처럼 **사이트에 상관없이 반복 가능한 탐색 절차**를 적용해 대상 사이트에서 실제로 안정적인 경로를 찾아낸 뒤, 그 발견 결과를 해당 스킬의 site-dependent 지식으로 패키징한다.
|
||||
|
||||
적용 대상:
|
||||
|
||||
- 검색 결과/상세 페이지를 읽어야 하는 스킬
|
||||
- 공식 API 문서가 없거나 불완전한 사이트
|
||||
- PC 페이지, 모바일 페이지, RSS, sitemap, 정적 JSON, 공개 데이터 호출 등 여러 입구가 있을 수 있는 사이트
|
||||
- 브라우저에서는 보이지만 단순 HTTP 요청에서는 빈 화면/차단/로그인 유도만 보이는 사이트
|
||||
|
||||
권장 절차:
|
||||
|
||||
1. **공개 입구부터 찾기**: 공식 API, 공개 JSON, RSS/Atom, sitemap, 검색 폼, 모바일 페이지, 정적 파일처럼 사이트가 공개적으로 제공하는 경로를 먼저 확인한다.
|
||||
2. **브라우저 동작을 관찰하기**: 화면을 직접 긁기 전에 검색/상세 화면이 어떤 공개 데이터 요청을 통해 채워지는지 확인한다.
|
||||
3. **안정적인 경로를 우선하기**: 화면 선택자보다 공개 데이터 호출, 문서화된 endpoint, RSS/sitemap처럼 구조가 덜 흔들리는 경로를 선호한다.
|
||||
4. **차단과 빈 응답을 실패로 분리하기**: HTTP 성공만으로 완료로 보지 말고, 실제 결과 본문이 있는지 확인한다. 로그인벽, 봇 검사, 빈 껍데기 페이지는 별도 실패 모드로 적는다.
|
||||
5. **site-dependent 방법을 명시적으로 패키징하기**: 탐색 과정에서 확인한 검색 URL, 필수 파라미터, 결과 해석 규칙, fallback 순서를 `SKILL.md`와 패키지 코드에 좁고 명확하게 기록한다.
|
||||
6. **권한 경계를 지키기**: 인증, 결제, CAPTCHA, 약관상 제한이 필요한 경로는 자동화하지 말고 사용자 개입 또는 실패 모드로 처리한다.
|
||||
|
||||
`SKILL.md`에는 최소한 아래 내용을 남긴다.
|
||||
|
||||
- 어떤 공개 접근 경로를 선택했는지와 그 이유
|
||||
- 검색/상세 조회의 입력값과 출력값
|
||||
- 기본 경로가 실패했을 때의 fallback 순서
|
||||
- 빈 결과, 차단, 로그인 필요, upstream 변경 등 실패 모드
|
||||
- 시크릿/인증이 필요한지 여부와 저장소에 절대 넣지 않을 값
|
||||
|
||||
새 dependency는 기본값으로 추가하지 않는다. 기존 Node.js/Python 표준 기능, 이미 있는 패키지, 또는 `k-skill-proxy`의 좁은 allowlist route로 해결할 수 있는지 먼저 확인한다.
|
||||
|
||||
---
|
||||
|
||||
## 스킬 등록 & 검증
|
||||
|
||||
스킬은 **별도 레지스트리 없이 디렉토리 스캔으로 자동 발견**된다.
|
||||
|
|
@ -204,6 +236,7 @@ npm run ci
|
|||
- [ ] npm 패키지라면 `packages/`에 구현체와 테스트 추가
|
||||
- [ ] npm 패키지라면 `.changeset/*.md` 파일 추가 (반드시 **기능 PR에서**, Version Packages PR에서 추가하지 말 것)
|
||||
- [ ] 프록시 경유라면 `k-skill-proxy/src/server.js`에 route 추가하고 main에 merge
|
||||
- [ ] 크롤링/검색 스킬이라면 공개 접근 경로, fallback 순서, 차단/로그인/빈 결과 실패 모드 문서화
|
||||
- [ ] 시크릿이 있다면 `KSKILL_` 접두사 규칙 준수 및 `docs/setup.md` 업데이트
|
||||
- [ ] `docs/features/my-new-skill.md` 작성 (선택, 상세 가이드)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,79 +1,38 @@
|
|||
# 법인등기 신청 컨설팅
|
||||
|
||||
`corporate-registration-consulting`은 주식회사 설립등기를 처음 진행하는 사용자를 위해 절차 설명, 표준 정관 초안, 첨부서류 묶음, 세금 체크, HWP 양식 작성 흐름을 한 곳에 모은 참고용 스킬이다.
|
||||
`corporate-registration-consulting`은 일반 영리 주식회사 **발기설립** 등기를 처음 진행하는 사용자를 위해 저장된 HWP 양식 사본을 채우는 법인설립등기 준비 스킬이다. 모집설립은 일반적이지 않으므로 기본 플로우에서 제외한다.
|
||||
|
||||
## 할 수 있는 일
|
||||
## 핵심 원칙
|
||||
|
||||
- 법인명·본점·목적·자본금·이사·주소 같은 사용자 결정 사항을 구조화한다.
|
||||
- 인터넷등기소/온라인법인설립시스템 기준의 상업등기 준비 흐름을 쉬운 말로 설명한다.
|
||||
- 법원등기소에서 보정 가능성을 줄이는 보수적 **표준 정관** 초안을 만든다.
|
||||
- 취임승낙서, 조사보고서, 주금납입/잔고증명, 인감신고서, 등록면허세 영수증 등 첨부서류 체크리스트를 만든다.
|
||||
- 등록면허세, 지방교육세, 과밀억제권역·대도시 중과, 소프트웨어 업종의 중과 제외/세액감면 검토 포인트를 안내한다.
|
||||
- `rhwp-edit`의 `k-skill-rhwp` 또는 `hwp`의 kordoc 경로로 Markdown/HWP/HWPX 양식 초안을 생성하거나 자리표시자를 채운다.
|
||||
- 런타임 지침은 `corporate-registration-consulting/SKILL.md`가 담당한다.
|
||||
- 실제 작성은 Markdown 초안이 아니라 저장된 HWP 양식 사본을 레포 밖 비공개 작업 디렉터리에 복사해 진행한다. 최종 산출물은 실제 `.hwp` 사본이다.
|
||||
- 정관은 `templates/attachment-hwp/standard-articles-startup-moj.hwp` 또는 `templates/attachment-hwp/articles-of-incorporation.hwp`를 우선 사용한다.
|
||||
- 단순 `replace-all`은 shortcut일 뿐이며, 각 HWP의 상단·본문·표 셀·하단 날짜·서명/날인란을 한 장 한 장 순차 확인한다.
|
||||
- 자리표시자와 실제 사용자 입력값을 구분하고, 개인정보가 들어간 산출물은 레포에 커밋하지 않는다.
|
||||
|
||||
## 법률·세무 면책
|
||||
## 필수 문서와 양식
|
||||
|
||||
이 기능은 **참고용**이다. 법률 자문, 세무 자문, 법무사 대행이 아니다. 실제 제출 전 관할 등기소, 위택스/지방자치단체 세무부서, 세무사, 법무사, 변호사 확인을 권한다.
|
||||
인터넷등기소/온라인법인설립시스템 제출 전 대조용 저장된 양식 경로와 공식 출처 대조는 `corporate-registration-consulting/templates/official-form-sources.md`, 제출 체크리스트는 `corporate-registration-consulting/templates/incorporation-document-pack.md`를 기준으로 한다.
|
||||
|
||||
에이전트는 초안·체크리스트·자리표시자 치환만 지원한다. 인터넷등기소/위택스 로그인, 전자서명, 세금 납부, 등기 제출, 사용자 사칭, 최종 법률 판단, 최종 세무 판단은 지원하지 않는다. 이러한 최종 행위와 판단은 사용자가 직접 또는 전문가를 통해 수행해야 한다.
|
||||
반드시 포함할 항목:
|
||||
|
||||
## 개인정보 처리 원칙
|
||||
- 주식회사설립등기신청서(발기설립): `templates/official/form-65-1-stock-company-incorporation-promoter.hwp`
|
||||
- 정관, 주식발행사항 동의/상법 제291조 사항 증명정보, 주식인수증, 발기인회의사록, 주주명부, 조사보고서, 취임승낙서, 이사회의사록, 인감신고서, 위임장: `templates/attachment-hwp/*.hwp`
|
||||
- 등록면허세 영수필확인서, 등기신청수수료 영수필확인서
|
||||
- 등기이사 개인 인감증명서 또는 본인서명사실확인서
|
||||
- 등기이사 주민등록초본/등본 등 주소 확인 증빙
|
||||
- 주금납입/잔고증명
|
||||
|
||||
- 필요한 항목만 묻고, 초안 단계에서는 이름·주소·생년월일·인감 관련 값 대신 자리표시자를 우선 사용한다.
|
||||
- 주민등록번호 원문, 신분증 이미지, 인감증명서 스캔본은 꼭 필요한 로컬 제출본이 아니면 요청하지 않는다.
|
||||
- 요약·로그·테스트·PR에는 개인정보/민감정보를 마스킹하고, 채워진 HWP·Markdown 서류는 레포에 커밋하지 않는다.
|
||||
조건부로 명의개서대리인, 현물출자·재산인수 등 변태설립사항, 인허가 업종, 정관 공증·의사록 인증 필요 여부를 확인한다.
|
||||
|
||||
## 전문가/공식 확인 필요 또는 v1 범위 밖
|
||||
## 중점 확인
|
||||
|
||||
다음 사안은 기본 주식회사 발기설립 초안 흐름으로 단정하지 않는다. 먼저 관할 등기소, 법무사, 변호사, 세무사 등 전문가/공식 확인이 필요하다고 안내한다.
|
||||
- 정관 제2조 목적에는 실제 사업 업태·종목을 채운다.
|
||||
- 정관 맨 마지막 작성일자, 발기인 성명, 서명/기명날인, 여러 장 문서의 간인을 확인한다.
|
||||
- 인감신고서 제출을 위해 실제 법인인감 도장을 준비하도록 안내한다.
|
||||
- 등록면허세·지방교육세·과밀억제권역/대도시 중과는 지방세법 제28조 및 위택스/관할 지자체 결과를 기준으로 확인한다.
|
||||
- 소프트웨어 업종은 조세특례제한법 제6조 등 감면/중과 제외 가능성을 체크하되 확정하지 않는다.
|
||||
|
||||
- 발기설립이 아닌 **모집설립**.
|
||||
- 현금 납입만이 아닌 **현물출자**, 재산인수, 사후설립 등 **변태설립사항**.
|
||||
- **자본금 10억** 원 이상이거나 감사/이사회/기관 설계가 일반 소규모 주식회사와 다른 경우.
|
||||
- 유한회사, 합명회사, 합자회사, 유한책임회사, 사단법인 등 **주식회사 외** 법인 유형.
|
||||
- 설립과 동시에 본점 외 **지점**을 여러 곳 두거나 관할이 복수인 경우.
|
||||
- **외국인** 임원·주주, 외국법인 주주, 외국인투자신고·아포스티유·번역공증이 필요한 경우.
|
||||
- 금융, 의료, 교육, 여행, 통신판매 외 별도 허가·등록·신고가 선행되는 **인허가 업종**.
|
||||
- 종류주식, 스톡옵션, 전환사채, 투자계약, 주주간계약처럼 표준 정관 밖의 권리 설계가 있는 경우.
|
||||
## 면책
|
||||
|
||||
## 기본 워크플로우
|
||||
|
||||
1. 상호·본점·목적을 정하고 인터넷등기소에서 상호 충돌 가능성을 확인한다.
|
||||
2. 본점 주소가 과밀억제권역 또는 지방세법상 대도시 중과 검토 대상인지 확인한다.
|
||||
3. `corporate-registration-consulting/templates/standard-articles-of-incorporation.md`를 채워 정관 초안을 만든다.
|
||||
4. 발기인, 주식인수, 주금납입 또는 잔고증명을 준비한다.
|
||||
5. 이사·감사 취임승낙서, 조사보고서, 인감신고서, 주소/신분 관련 증빙을 준비한다.
|
||||
6. 위택스 또는 지자체 등록면허세·지방교육세 신고·납부 체크리스트를 만들고, 사용자/전문가가 실제 신고·납부를 수행한다.
|
||||
7. 인터넷등기소 전자신청 또는 관할 등기소 방문 제출 체크리스트를 만들고, 사용자/전문가가 실제 제출 절차를 완료한다.
|
||||
8. 보정명령이 오면 어려운 표현을 쉬운 말로 풀어 원인·수정 문구·추가서류만 정리한다.
|
||||
9. 등기 완료 후 사업자등록, 법인계좌, 4대보험, 업종별 신고를 이어서 안내한다.
|
||||
|
||||
## 세금 체크 포인트
|
||||
|
||||
- **등록면허세**: 지방세법 제28조가 법인 설립등기 때 문제되는 등록면허세 세율의 직접 근거다. 자본금과 소재지에 따라 산정하며 지방교육세가 추가된다.
|
||||
- **과밀억제권역/대도시 중과**: 본점이 수도권 과밀억제권역 등 대도시에 있으면 지방세법 제28조 제2항의 법인등기 중과가 문제될 수 있다. 지방세법 제13조는 취득세 쟁점이 있을 때만 별도로 확인한다.
|
||||
- **소프트웨어 업종**: 실제 사업이 소프트웨어 개발·공급 또는 정보통신업이면 지방세법 시행령의 중과 제외 업종, 조세특례제한법 제6조의 창업중소기업 세액감면 가능성을 검토한다. 단, 창업 요건과 업종코드, 이전/합병/개인사업 전환 여부에 따라 달라지므로 확정 안내는 하지 않는다.
|
||||
|
||||
## HWP/RHWP 연계
|
||||
|
||||
- 새 초안은 Markdown 템플릿을 먼저 채운다.
|
||||
- HWPX 산출이 필요하면 `hwp` 스킬의 kordoc `markdownToHwpx` 경로를 사용한다.
|
||||
- 이미 받은 법원/법무사 HWP 양식이 있으면 `rhwp-edit` 스킬의 `k-skill-rhwp replace-all`로 `{{COMPANY_NAME}}`, `{{CEO_NAME}}`, `{{HEAD_OFFICE_ADDRESS}}` 같은 자리표시자를 채운다.
|
||||
- `replace-all`은 본문 문단 자리표시자 치환용으로 우선 사용한다. 표/셀 안의 입력란은 `k-skill-rhwp info`로 구조를 확인하고 `set-cell-text` 같은 셀 인식 명령으로 채운 뒤, 복잡한 공식 양식은 사람이 열어 레이아웃과 누락 셀을 검토한다.
|
||||
- 생성 후 `k-skill-rhwp info`로 파일이 열리는지 확인하고, 사람이 읽는 제출 전 체크리스트를 함께 제공한다.
|
||||
- 채워진 HWP에는 개인정보가 들어갈 수 있으므로 레포 밖의 비공개 임시 디렉터리나 사용자가 지정한 안전한 로컬 폴더에 저장하고, PR·테스트 로그·공유 요약에는 경로와 원문 개인정보를 노출하지 않는다.
|
||||
|
||||
## 공식 확인 출처
|
||||
|
||||
- 인터넷등기소: https://www.iros.go.kr
|
||||
- 온라인법인설립시스템: https://www.startbiz.go.kr
|
||||
- 위택스: https://www.wetax.go.kr
|
||||
- 국가법령정보센터 지방세법, 지방세법 시행령, 상법, 상업등기법: https://www.law.go.kr
|
||||
- 국가법령정보센터 조세특례제한법 제6조: https://www.law.go.kr
|
||||
|
||||
## 완료 기준
|
||||
|
||||
- 사용자가 결정해야 하는 항목과 에이전트가 대신 처리할 항목이 분리됐다.
|
||||
- 표준 정관과 첨부서류 묶음 초안이 생성됐다.
|
||||
- 등록면허세, 과밀억제권역/대도시 중과, 소프트웨어 업종 감면/제외 가능성 안내가 포함됐다.
|
||||
- 모든 답변 끝에 참고용/비자문 면책이 들어갔다.
|
||||
이 기능은 참고용이며 법률·세무 자문, 법무사 대행이 아니다. 에이전트는 인터넷등기소/위택스 로그인, 전자서명, 세금 납부, 등기 제출, 사용자 사칭, 최종 법률 판단, 최종 세무 판단을 지원하지 않는다. 실제 제출은 사용자가 직접 수행하고 제출 전 관할 등기소·위택스/지자체·법무사·변호사·세무사 확인을 권한다.
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
court-auction-notice-search -h
|
||||
court-auction-notice-search codes courts --pretty | head -40
|
||||
court-auction-notice-search codes bid-types --pretty
|
||||
court-auction-notice-search notices --date 2026-04-27 --court-code B000210 --bid-type date --pretty
|
||||
court-auction-notice-search notices --date 2026-04 --court-code B000210 --bid-type date --pretty
|
||||
court-auction-notice-search case --court-code B000210 --case-number "2024타경100001" --pretty
|
||||
```
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ const {
|
|||
} = require("court-auction-notice-search");
|
||||
|
||||
const notices = await searchSaleNotices({
|
||||
date: "2026-04-27",
|
||||
date: "2026-04", // 월 전체 조회. 일자 입력은 같은 월 조회 후 해당일만 필터링
|
||||
courtCode: "B000210",
|
||||
bidType: "date"
|
||||
});
|
||||
|
|
@ -73,7 +73,7 @@ const caseInfo = await getCaseByCaseNumber({
|
|||
|
||||
| 목적 | 메소드 + 경로 | request body |
|
||||
| --- | --- | --- |
|
||||
| 매각공고 목록 | `POST /pgj/pgj143/selectRletDspslPbanc.on` | `{"dma_srchDspslPbanc":{"srchYmd","cortOfcCd","bidDvsCd","srchBtnYn":"Y"}}` |
|
||||
| 매각공고 목록 | `POST /pgj/pgj143/selectRletDspslPbanc.on` | `{"dma_srchDspslPbanc":{"srchYmd","cortOfcCd","bidDvsCd","srchBtnYn":"Y"}}` (`srchYmd`는 사이트 검색 버튼과 동일하게 `YYYYMM`) |
|
||||
| 매각공고 상세 | `POST /pgj/pgj143/selectRletDspslPbancDtl.on` | `{"dma_srchGnrlPbanc":{"cortOfcCd","dspslDxdyYmd","jdbnCd",...}}` |
|
||||
| 사건 단건 | `POST /pgj/pgj15A/selectAuctnCsSrchRslt.on` | `{"dma_srchCsDtlInf":{"cortOfcCd","csNo"}}` |
|
||||
| 법원사무소 코드 | `POST /pgj/pgjComm/selectCortOfcCdLst.on` | `{}` |
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
],
|
||||
"scripts": {
|
||||
"build": "npm run build --workspaces --if-present",
|
||||
"lint": "node --check scripts/skill-docs.test.js scripts/korean_character_count.js scripts/test_korean_character_count.js && python3 -m py_compile scripts/k_skill_cleaner.py scripts/test_k_skill_cleaner.py k-skill-cleaner/scripts/k_skill_cleaner.py scripts/fine_dust.py scripts/test_fine_dust.py scripts/ktx_booking.py scripts/test_ktx_booking.py scripts/sillok_search.py scripts/test_sillok_search.py scripts/korean_spell_check.py scripts/test_korean_spell_check.py scripts/patent_search.py scripts/test_patent_search.py scripts/mfds_drug_safety.py scripts/test_mfds_drug_safety.py scripts/mfds_food_safety.py scripts/test_mfds_food_safety.py scripts/zipcode_search.py scripts/test_zipcode_search.py scripts/subway_lost_property.py scripts/test_subway_lost_property.py scripts/geeknews_search.py scripts/test_geeknews_search.py scripts/test_naver_blog_search.py scripts/test_korean_slang_writing.py scripts/kakaotalk_mac.py scripts/test_kakaotalk_mac.py scripts/test_coupang_partners_mcp_wrapper.py coupang-product-search/scripts/coupang_partners_mcp.py kakaotalk-mac/scripts/kakaotalk_mac.py naver-blog-research/scripts/_naver_http.py naver-blog-research/scripts/naver_search.py naver-blog-research/scripts/naver_read.py naver-blog-research/scripts/naver_download_images.py korean-slang-writing/scripts/_slang_http.py korean-slang-writing/scripts/slang_search.py korean-slang-writing/scripts/slang_lookup.py korean-scholarship-search/scripts/scholarship_filter.py korean-scholarship-search/scripts/test_scholarship_filter.py korean-scholarship-search/scripts/university_search_plan.py && npm run lint --workspaces --if-present && ./scripts/validate-skills.sh",
|
||||
"lint": "node --check scripts/skill-docs.test.js scripts/korean_character_count.js scripts/test_korean_character_count.js && python3 -m py_compile scripts/k_skill_cleaner.py scripts/test_k_skill_cleaner.py corporate-registration-consulting/scripts/fill_official_hwp.py k-skill-cleaner/scripts/k_skill_cleaner.py scripts/fine_dust.py scripts/test_fine_dust.py scripts/ktx_booking.py scripts/test_ktx_booking.py scripts/sillok_search.py scripts/test_sillok_search.py scripts/korean_spell_check.py scripts/test_korean_spell_check.py scripts/patent_search.py scripts/test_patent_search.py scripts/mfds_drug_safety.py scripts/test_mfds_drug_safety.py scripts/mfds_food_safety.py scripts/test_mfds_food_safety.py scripts/zipcode_search.py scripts/test_zipcode_search.py scripts/subway_lost_property.py scripts/test_subway_lost_property.py scripts/geeknews_search.py scripts/test_geeknews_search.py scripts/test_naver_blog_search.py scripts/test_korean_slang_writing.py scripts/kakaotalk_mac.py scripts/test_kakaotalk_mac.py scripts/test_coupang_partners_mcp_wrapper.py coupang-product-search/scripts/coupang_partners_mcp.py kakaotalk-mac/scripts/kakaotalk_mac.py naver-blog-research/scripts/_naver_http.py naver-blog-research/scripts/naver_search.py naver-blog-research/scripts/naver_read.py naver-blog-research/scripts/naver_download_images.py korean-slang-writing/scripts/_slang_http.py korean-slang-writing/scripts/slang_search.py korean-slang-writing/scripts/slang_lookup.py korean-scholarship-search/scripts/scholarship_filter.py korean-scholarship-search/scripts/test_scholarship_filter.py korean-scholarship-search/scripts/university_search_plan.py && npm run lint --workspaces --if-present && ./scripts/validate-skills.sh",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "node --test scripts/skill-docs.test.js scripts/test_korean_character_count.js && PYTHONPATH=.:scripts python3 -m unittest scripts.test_k_skill_cleaner scripts.test_fine_dust scripts.test_ktx_booking scripts.test_sillok_search scripts.test_korean_spell_check scripts.test_patent_search scripts.test_mfds_drug_safety scripts.test_mfds_food_safety scripts.test_zipcode_search scripts.test_subway_lost_property scripts.test_geeknews_search scripts.test_naver_blog_search scripts.test_korean_slang_writing scripts.test_kakaotalk_mac scripts.test_coupang_partners_mcp_wrapper && PYTHONPATH=.:scripts:korean-scholarship-search/scripts python3 -m unittest discover -s korean-scholarship-search/scripts -p 'test_scholarship_filter.py' && npm run test --workspaces --if-present && ./scripts/validate-skills.sh",
|
||||
"pack:dry-run": "npm pack --workspace k-lotto --dry-run && npm pack --workspace daiso-product-search --dry-run && npm pack --workspace market-kurly-search --dry-run && npm pack --workspace blue-ribbon-nearby --dry-run && npm pack --workspace kakao-bar-nearby --dry-run && npm pack --workspace cheap-gas-nearby --dry-run && npm pack --workspace public-restroom-nearby --dry-run && npm pack --workspace parking-lot-search --dry-run && npm pack --workspace kbl-results --dry-run && npm pack --workspace kleague-results --dry-run && npm pack --workspace lck-analytics --dry-run && npm pack --workspace toss-securities --dry-run && npm pack --workspace hipass-receipt --dry-run && npm pack --workspace used-car-price-search --dry-run && npm pack --workspace k-skill-rhwp --dry-run",
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ console.log(courts.items.find((c) => c.name === "서울중앙지방법원"));
|
|||
// { code: "B000210", name: "서울중앙지방법원", branchName: "서울중앙지방법원" }
|
||||
|
||||
const notices = await searchSaleNotices({
|
||||
date: "2026-04-27",
|
||||
date: "2026-04", // 월 전체 조회. "2026-04-27"처럼 일자를 주면 같은 월을 조회한 뒤 해당 일자만 필터링
|
||||
courtCode: "B000210",
|
||||
bidType: "date" // "기일입찰" / "000331" 도 모두 받음
|
||||
});
|
||||
|
|
@ -76,14 +76,14 @@ if (caseInfo.found) {
|
|||
court-auction-notice-search -h
|
||||
court-auction-notice-search codes courts --pretty
|
||||
court-auction-notice-search codes bid-types --pretty
|
||||
court-auction-notice-search notices --date 2026-04-27 --court-code B000210 --bid-type date --pretty
|
||||
court-auction-notice-search notices --date 2026-04 --court-code B000210 --bid-type date --pretty
|
||||
court-auction-notice-search case --court-code B000210 --case-number "2024타경100001" --pretty
|
||||
```
|
||||
|
||||
## Public API
|
||||
|
||||
- `searchSaleNotices({ date, courtCode?, bidType?, includeRaw?, client? })`
|
||||
- `date`: `"YYYY-MM-DD"` 또는 `"YYYYMMDD"` (필수)
|
||||
- `date`: `"YYYY-MM"`/`"YYYYMM"` 또는 `"YYYY-MM-DD"`/`"YYYYMMDD"` (필수). 실제 사이트 검색 버튼은 월(`YYYYMM`) 단위로 조회하므로, 일자를 주면 같은 월을 조회한 뒤 해당 매각기일만 필터링한다
|
||||
- `courtCode`: `"B000210"` 형식 또는 `""`(전체)
|
||||
- `bidType`: `"date"` / `"period"` / `"기일입찰"` / `"기간입찰"` / `"000331"` / `"000332"` / `""`
|
||||
- returns `{ requestedDate, requestedCourtCode, requestedBidType, count, items[] }`
|
||||
|
|
@ -133,7 +133,7 @@ discovery 시 직접 캡처한 사이트 내부 endpoint:
|
|||
|
||||
| 목적 | 메소드 + 경로 | request body 핵심 키 |
|
||||
| --- | --- | --- |
|
||||
| 매각공고 목록 | `POST /pgj/pgj143/selectRletDspslPbanc.on` | `dma_srchDspslPbanc.{srchYmd, cortOfcCd, bidDvsCd, srchBtnYn:"Y"}` |
|
||||
| 매각공고 목록 | `POST /pgj/pgj143/selectRletDspslPbanc.on` | `dma_srchDspslPbanc.{srchYmd, cortOfcCd, bidDvsCd, srchBtnYn:"Y"}` — `srchYmd`는 사이트 검색 버튼과 동일하게 `YYYYMM` 월 단위 |
|
||||
| 매각공고 상세 | `POST /pgj/pgj143/selectRletDspslPbancDtl.on` | `dma_srchGnrlPbanc.{cortOfcCd, dspslDxdyYmd, jdbnCd, ...}` |
|
||||
| 사건 단건 | `POST /pgj/pgj15A/selectAuctnCsSrchRslt.on` | `dma_srchCsDtlInf.{cortOfcCd, csNo}` |
|
||||
| 법원사무소 | `POST /pgj/pgjComm/selectCortOfcCdLst.on` | `{}` |
|
||||
|
|
|
|||
|
|
@ -36,6 +36,31 @@ function toYmd(input, label) {
|
|||
return compact;
|
||||
}
|
||||
|
||||
function toNoticeSearchDate(input, label) {
|
||||
if (input === null || input === undefined || input === "") {
|
||||
throw new Error(`${label} is required (YYYY-MM, YYYYMM, YYYY-MM-DD, or YYYYMMDD)`);
|
||||
}
|
||||
|
||||
const value = String(input).trim();
|
||||
const compact = value.replace(/[^0-9]/g, "");
|
||||
if (/^\d{6}$/.test(compact)) {
|
||||
return { queryYmd: compact, exactYmd: null };
|
||||
}
|
||||
if (/^\d{8}$/.test(compact)) {
|
||||
return { queryYmd: compact.slice(0, 6), exactYmd: compact };
|
||||
}
|
||||
|
||||
throw new Error(`${label} must be YYYY-MM, YYYYMM, YYYY-MM-DD or YYYYMMDD, got "${input}"`);
|
||||
}
|
||||
|
||||
function formatCompactMonth(value) {
|
||||
return `${value.slice(0, 4)}-${value.slice(4, 6)}`;
|
||||
}
|
||||
|
||||
function formatCompactDate(value) {
|
||||
return `${value.slice(0, 4)}-${value.slice(4, 6)}-${value.slice(6, 8)}`;
|
||||
}
|
||||
|
||||
function normalizeCaseNumber(input) {
|
||||
if (input === null || input === undefined) {
|
||||
throw new Error("caseNumber is required (e.g. 2024타경100001)");
|
||||
|
|
@ -88,7 +113,7 @@ function ensureClient(client, options) {
|
|||
}
|
||||
|
||||
async function searchSaleNotices(params = {}) {
|
||||
const date = toYmd(params.date, "date");
|
||||
const searchDate = toNoticeSearchDate(params.date, "date");
|
||||
const courtCodeRaw =
|
||||
params.courtCode === undefined || params.courtCode === null ? "" : String(params.courtCode).trim();
|
||||
const courtCode = courtCodeRaw === "" ? "" : ensureCourtCode(courtCodeRaw);
|
||||
|
|
@ -97,7 +122,9 @@ async function searchSaleNotices(params = {}) {
|
|||
const client = ensureClient(params.client, params);
|
||||
const body = {
|
||||
dma_srchDspslPbanc: {
|
||||
srchYmd: date,
|
||||
// The PGJ143M01 "검색" button posts a month key (YYYYMM), not a day key.
|
||||
// Day-level API compatibility is preserved by filtering the returned month rows below.
|
||||
srchYmd: searchDate.queryYmd,
|
||||
cortOfcCd: courtCode,
|
||||
bidDvsCd: bidTypeCode,
|
||||
srchBtnYn: "Y"
|
||||
|
|
@ -105,14 +132,27 @@ async function searchSaleNotices(params = {}) {
|
|||
};
|
||||
|
||||
const raw = await client.postJson("notices", body);
|
||||
return normalizeNoticeListResponse(raw, {
|
||||
requestedDate: `${date.slice(0, 4)}-${date.slice(4, 6)}-${date.slice(6, 8)}`,
|
||||
const normalized = normalizeNoticeListResponse(raw, {
|
||||
requestedDate: searchDate.exactYmd
|
||||
? formatCompactDate(searchDate.exactYmd)
|
||||
: formatCompactMonth(searchDate.queryYmd),
|
||||
requestedMonth: formatCompactMonth(searchDate.queryYmd),
|
||||
requestedCourtCode: courtCode || null,
|
||||
requestedBidType: bidTypeCode
|
||||
? { code: bidTypeCode, name: describeBidTypeCode(bidTypeCode) }
|
||||
: null,
|
||||
includeRaw: params.includeRaw !== false
|
||||
});
|
||||
|
||||
if (searchDate.exactYmd) {
|
||||
normalized.items = normalized.items.filter((item) => {
|
||||
const rawYmd = item.raw && item.raw.dspslDxdyYmd ? String(item.raw.dspslDxdyYmd) : "";
|
||||
return rawYmd === searchDate.exactYmd;
|
||||
});
|
||||
normalized.count = normalized.items.length;
|
||||
}
|
||||
|
||||
return normalized;
|
||||
}
|
||||
|
||||
function pickNoticeKeys(notice) {
|
||||
|
|
|
|||
|
|
@ -8,13 +8,29 @@ function nullIfBlank(value) {
|
|||
return trimmed === "" ? null : trimmed;
|
||||
}
|
||||
|
||||
function stripHtml(value) {
|
||||
if (value === null || value === undefined) return null;
|
||||
const text = String(value)
|
||||
.replace(/<img\b[^>]*>/gi, " ")
|
||||
.replace(/<br\s*\/?\s*>/gi, " ")
|
||||
.replace(/<[^>]+>/g, " ")
|
||||
.replace(/ /gi, " ")
|
||||
.replace(/&/gi, "&")
|
||||
.replace(/</gi, "<")
|
||||
.replace(/>/gi, ">")
|
||||
.replace(/\s+/g, " ")
|
||||
.trim();
|
||||
return text === "" ? null : text;
|
||||
}
|
||||
|
||||
function parseAmount(value) {
|
||||
if (value === null || value === undefined) return null;
|
||||
const trimmed = String(value).trim();
|
||||
if (trimmed === "") return null;
|
||||
const cleaned = trimmed.replace(/[, ]/g, "").replace(/원$/, "");
|
||||
if (cleaned === "" || cleaned === "-") return null;
|
||||
const num = Number(cleaned);
|
||||
const stripped = stripHtml(value);
|
||||
if (!stripped) return null;
|
||||
if (stripped === "-") return null;
|
||||
const amountMatch = stripped.match(/\d{1,3}(?:,\d{3})+|\d+/);
|
||||
if (!amountMatch) return null;
|
||||
const num = Number(amountMatch[0].replace(/[, ]/g, ""));
|
||||
return Number.isFinite(num) ? num : null;
|
||||
}
|
||||
|
||||
|
|
@ -49,6 +65,7 @@ function normalizeNoticeListResponse(rawPayload, options = {}) {
|
|||
|
||||
return {
|
||||
requestedDate: options.requestedDate || null,
|
||||
requestedMonth: options.requestedMonth || null,
|
||||
requestedCourtCode: options.requestedCourtCode || null,
|
||||
requestedBidType: options.requestedBidType || null,
|
||||
count: items.length,
|
||||
|
|
@ -98,9 +115,23 @@ function collectSaleTimes(row) {
|
|||
|
||||
function normalizeNoticeDetailResponse(rawPayload, options = {}) {
|
||||
const data = rawPayload && typeof rawPayload === "object" ? rawPayload.data : null;
|
||||
const meta = data && typeof data.dma_srchGnrlPbanc === "object" ? data.dma_srchGnrlPbanc : {};
|
||||
const resultData = data && typeof data.result === "object" ? data.result : null;
|
||||
const nestedInput = resultData && typeof resultData.inputData === "object" ? resultData.inputData : null;
|
||||
const meta =
|
||||
nestedInput ||
|
||||
(data && typeof data.dma_srchGnrlPbanc === "object" ? data.dma_srchGnrlPbanc : {});
|
||||
const nestedPbanc =
|
||||
resultData &&
|
||||
resultData.dspslPbanc &&
|
||||
typeof resultData.dspslPbanc.pbancInfo === "object"
|
||||
? resultData.dspslPbanc.pbancInfo
|
||||
: null;
|
||||
const list =
|
||||
data && Array.isArray(data.dlt_gnrlPbancLst) ? data.dlt_gnrlPbancLst : [];
|
||||
nestedPbanc && Array.isArray(nestedPbanc.lst)
|
||||
? nestedPbanc.lst
|
||||
: data && Array.isArray(data.dlt_gnrlPbancLst)
|
||||
? data.dlt_gnrlPbancLst
|
||||
: [];
|
||||
|
||||
const includeRaw = options.includeRaw !== false;
|
||||
|
||||
|
|
@ -110,7 +141,7 @@ function normalizeNoticeDetailResponse(rawPayload, options = {}) {
|
|||
bidStartDate: formatYmd(meta.bidBgngYmd),
|
||||
bidEndDate: formatYmd(meta.bidEndYmd),
|
||||
judgeDeptCode: nullIfBlank(meta.jdbnCd),
|
||||
judgeDeptName: nullIfBlank(meta.cortAuctnJdbnNm),
|
||||
judgeDeptName: nullIfBlank(meta.cortAuctnJdbnNm) || nullIfBlank(nestedPbanc && nestedPbanc.chargDept),
|
||||
judgeDeptPhone: nullIfBlank(meta.jdbnTelno),
|
||||
salePlace: nullIfBlank(meta.dspslPlcNm),
|
||||
saleTimes: collectSaleTimes(meta),
|
||||
|
|
@ -126,7 +157,9 @@ function normalizeNoticeDetailResponse(rawPayload, options = {}) {
|
|||
items
|
||||
};
|
||||
if (includeRaw) {
|
||||
result.raw = { dma_srchGnrlPbanc: { ...meta } };
|
||||
result.raw = nestedPbanc
|
||||
? { inputData: { ...meta }, pbancInfo: { ...nestedPbanc } }
|
||||
: { dma_srchGnrlPbanc: { ...meta } };
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -134,13 +167,13 @@ function normalizeNoticeDetailResponse(rawPayload, options = {}) {
|
|||
function normalizeNoticeDetailRow(rawRow, includeRaw) {
|
||||
const row = ensureRow(rawRow);
|
||||
const out = {
|
||||
caseNumber: nullIfBlank(row.csNo),
|
||||
caseNumber: stripHtml(row.csNo),
|
||||
itemSeq: nullIfBlank(row.dspslSeq),
|
||||
usage: nullIfBlank(row.usgNm),
|
||||
address: nullIfBlank(row.st),
|
||||
usage: stripHtml(row.usgNm),
|
||||
address: stripHtml(row.st),
|
||||
appraisedPrice: parseAmount(row.aeeEvlAmt),
|
||||
minimumSalePrice: parseAmount(row.lwsDspslPrc),
|
||||
remarks: nullIfBlank(row.dspslRmk)
|
||||
remarks: stripHtml(row.dspslRmk)
|
||||
};
|
||||
if (includeRaw) {
|
||||
out.raw = { ...row };
|
||||
|
|
@ -319,6 +352,7 @@ module.exports = {
|
|||
normalizeCourtCodesResponse,
|
||||
normalizeCaseDetailResponse,
|
||||
parseAmount,
|
||||
stripHtml,
|
||||
formatYmd,
|
||||
formatHm
|
||||
};
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ test("CLI rejects --date with an obviously invalid format", () => {
|
|||
{ encoding: "utf8" }
|
||||
);
|
||||
assert.notEqual(result.status, 0);
|
||||
assert.match(result.stderr, /must be YYYY-MM-DD or YYYYMMDD/);
|
||||
assert.match(result.stderr, /must be YYYY-MM, YYYYMM, YYYY-MM-DD or YYYYMMDD/);
|
||||
});
|
||||
|
||||
test("CLI prints usage and exits non-zero on unknown command", () => {
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ test("describeBidTypeCode returns the Korean name", () => {
|
|||
assert.equal(describeBidTypeCode(""), "");
|
||||
});
|
||||
|
||||
test("searchSaleNotices builds the expected request body and normalizes the response", async () => {
|
||||
test("searchSaleNotices posts the month key used by the site search button and normalizes the response", async () => {
|
||||
const client = makeFakeClient((endpoint) => {
|
||||
assert.equal(endpoint, "notices");
|
||||
return loadFixture("notices-sample.json");
|
||||
|
|
@ -83,7 +83,7 @@ test("searchSaleNotices builds the expected request body and normalizes the resp
|
|||
assert.equal(client.calls.length, 1);
|
||||
assert.deepEqual(client.calls[0].body, {
|
||||
dma_srchDspslPbanc: {
|
||||
srchYmd: "20260427",
|
||||
srchYmd: "202604",
|
||||
cortOfcCd: "B000210",
|
||||
bidDvsCd: "000331",
|
||||
srchBtnYn: "Y"
|
||||
|
|
@ -92,20 +92,33 @@ test("searchSaleNotices builds the expected request body and normalizes the resp
|
|||
|
||||
assert.equal(result.count, 2);
|
||||
assert.equal(result.requestedDate, "2026-04-27");
|
||||
assert.equal(result.requestedMonth, "2026-04");
|
||||
assert.equal(result.requestedCourtCode, "B000210");
|
||||
assert.deepEqual(result.requestedBidType, { code: "000331", name: "기일입찰" });
|
||||
assert.equal(result.items[0].caseNumber, undefined);
|
||||
assert.equal(result.items[0].noticeId, "REAL_ID_2026042701");
|
||||
});
|
||||
|
||||
test("searchSaleNotices accepts compact YYYYMMDD dates and rejects garbage", async () => {
|
||||
const client = makeFakeClient(() => loadFixture("notices-empty.json"));
|
||||
await searchSaleNotices({ date: "20260427", client });
|
||||
assert.equal(client.calls[0].body.dma_srchDspslPbanc.srchYmd, "20260427");
|
||||
test("searchSaleNotices accepts compact dates/months and filters exact day requests", async () => {
|
||||
const client = makeFakeClient(() => loadFixture("notices-sample.json"));
|
||||
|
||||
const exactDay = await searchSaleNotices({ date: "20260427", client });
|
||||
assert.equal(client.calls[0].body.dma_srchDspslPbanc.srchYmd, "202604");
|
||||
assert.equal(exactDay.count, 2);
|
||||
|
||||
const emptyDay = await searchSaleNotices({ date: "2026-04-28", client });
|
||||
assert.equal(client.calls[1].body.dma_srchDspslPbanc.srchYmd, "202604");
|
||||
assert.equal(emptyDay.count, 0);
|
||||
|
||||
const month = await searchSaleNotices({ date: "2026-04", client });
|
||||
assert.equal(client.calls[2].body.dma_srchDspslPbanc.srchYmd, "202604");
|
||||
assert.equal(month.requestedDate, "2026-04");
|
||||
assert.equal(month.requestedMonth, "2026-04");
|
||||
assert.equal(month.count, 2);
|
||||
|
||||
await assert.rejects(
|
||||
() => searchSaleNotices({ date: "not-a-date", client }),
|
||||
/must be YYYY-MM-DD or YYYYMMDD/
|
||||
/must be YYYY-MM, YYYYMM, YYYY-MM-DD or YYYYMMDD/
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ test("parseAmount strips commas/won/spaces and rejects non-numeric", () => {
|
|||
assert.equal(parseAmount("1,500,000,000"), 1500000000);
|
||||
assert.equal(parseAmount("1,500,000,000원"), 1500000000);
|
||||
assert.equal(parseAmount(" 850000000 "), 850000000);
|
||||
assert.equal(
|
||||
parseAmount('<img src="/images/number_01.gif" alt="첫번째"> 9,600,000<br>입찰시간(10:00)<br>'),
|
||||
9600000
|
||||
);
|
||||
assert.equal(parseAmount(""), null);
|
||||
assert.equal(parseAmount("-"), null);
|
||||
assert.equal(parseAmount("not-a-number"), null);
|
||||
|
|
|
|||
|
|
@ -3216,28 +3216,83 @@ test("corporate-registration-consulting skill covers court registry workflow, ta
|
|||
|
||||
assert.ok(fs.existsSync(skillPath), "expected corporate-registration-consulting/SKILL.md to exist");
|
||||
assert.ok(fs.existsSync(featureDocPath), "expected corporate-registration-consulting feature doc to exist");
|
||||
const articlesTemplatePath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"templates",
|
||||
"standard-articles-of-incorporation.md",
|
||||
);
|
||||
const documentPackTemplatePath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"templates",
|
||||
"incorporation-document-pack.md",
|
||||
);
|
||||
|
||||
assert.ok(
|
||||
fs.existsSync(path.join(repoRoot, articlesTemplatePath)),
|
||||
"expected a standard articles template artifact",
|
||||
const officialFormSourcesPath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"templates",
|
||||
"official-form-sources.md",
|
||||
);
|
||||
const officialPromoterHwpPath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"templates",
|
||||
"official",
|
||||
"form-65-1-stock-company-incorporation-promoter.hwp",
|
||||
);
|
||||
const officialSubscriptionHwpPath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"templates",
|
||||
"official",
|
||||
"form-65-2-stock-company-incorporation-subscription.hwp",
|
||||
);
|
||||
const officialFillMapPath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"templates",
|
||||
"official",
|
||||
"form-65-1-fill-map.json",
|
||||
);
|
||||
const officialSourceManifestPath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"templates",
|
||||
"official",
|
||||
"source-manifest.json",
|
||||
);
|
||||
const officialFillScriptPath = path.join(
|
||||
"corporate-registration-consulting",
|
||||
"scripts",
|
||||
"fill_official_hwp.py",
|
||||
);
|
||||
const attachmentHwpDir = path.join("corporate-registration-consulting", "templates", "attachment-hwp");
|
||||
const attachmentHwpArtifacts = [
|
||||
"articles-of-incorporation.hwp",
|
||||
"standard-articles-startup-moj.hwp",
|
||||
"share-issuance-consent.hwp",
|
||||
"share-subscription.hwp",
|
||||
"founder-meeting-minutes.hwp",
|
||||
"founder-meeting-period-shortening-consent.hwp",
|
||||
"shareholder-register.hwp",
|
||||
"inspection-report.hwp",
|
||||
"officer-acceptance-director-ceo.hwp",
|
||||
"officer-acceptance-auditor.hwp",
|
||||
"board-minutes.hwp",
|
||||
"corporate-seal-report.hwp",
|
||||
"power-of-attorney.hwp",
|
||||
].map((fileName) => path.join(attachmentHwpDir, fileName));
|
||||
|
||||
assert.ok(
|
||||
fs.existsSync(path.join(repoRoot, documentPackTemplatePath)),
|
||||
"expected an incorporation document pack template artifact",
|
||||
);
|
||||
assert.ok(
|
||||
fs.existsSync(path.join(repoRoot, officialFormSourcesPath)),
|
||||
"expected an official form sources artifact",
|
||||
);
|
||||
for (const artifactPath of [officialPromoterHwpPath, officialSubscriptionHwpPath, officialFillMapPath, officialSourceManifestPath, officialFillScriptPath, ...attachmentHwpArtifacts, path.join(attachmentHwpDir, "source-manifest.json")]) {
|
||||
assert.ok(fs.existsSync(path.join(repoRoot, artifactPath)), `expected ${artifactPath} to exist`);
|
||||
}
|
||||
|
||||
const articlesTemplate = read(articlesTemplatePath);
|
||||
const documentPackTemplate = read(documentPackTemplatePath);
|
||||
const officialFormSources = read(officialFormSourcesPath);
|
||||
const officialFillMap = JSON.parse(read(officialFillMapPath));
|
||||
const officialSourceManifest = JSON.parse(read(officialSourceManifestPath));
|
||||
const attachmentSourceManifest = JSON.parse(read(path.join(attachmentHwpDir, "source-manifest.json")));
|
||||
for (const hwpPath of [officialPromoterHwpPath, officialSubscriptionHwpPath, ...attachmentHwpArtifacts]) {
|
||||
const hwpMagic = fs.readFileSync(path.join(repoRoot, hwpPath)).subarray(0, 8).toString("hex");
|
||||
assert.equal(hwpMagic, "d0cf11e0a1b11ae1", `${hwpPath} should be an OLE HWP file`);
|
||||
}
|
||||
const skill = read(path.join("corporate-registration-consulting", "SKILL.md"));
|
||||
const featureDoc = read(path.join("docs", "features", "corporate-registration-consulting.md"));
|
||||
const readme = read("README.md");
|
||||
|
|
@ -3264,45 +3319,114 @@ test("corporate-registration-consulting skill covers court registry workflow, ta
|
|||
assert.match(skill, /최종 법률 판단[\s\S]*수행하지 않는다/);
|
||||
assert.match(skill, /최종 세무 판단[\s\S]*수행하지 않는다/);
|
||||
assert.match(skill, /모집설립/);
|
||||
assert.match(skill, /현물출자/);
|
||||
assert.match(skill, /변태설립사항/);
|
||||
assert.match(skill, /자본금 10억/);
|
||||
assert.match(skill, /주식회사 외/);
|
||||
assert.match(skill, /지점/);
|
||||
assert.match(skill, /외국인/);
|
||||
assert.match(skill, /인허가 업종/);
|
||||
assert.match(skill, /모집설립은 일반적이지[\s\S]*기본 플로우에서는 제외/);
|
||||
assert.match(skill, /저장된 발기설립 양식과 첨부서류 양식/);
|
||||
assert.match(skill, /등기신청양식/);
|
||||
assert.match(skill, /첨부서면예시/);
|
||||
assert.match(skill, /상업등기신청서의 양식에 관한 예규/);
|
||||
assert.match(skill, /official-form-sources\.md/);
|
||||
assert.match(skill, /form-65-1-stock-company-incorporation-promoter\.hwp/);
|
||||
assert.match(skill, /fill_official_hwp\.py/);
|
||||
assert.match(skill, /form-65-1-fill-map\.json/);
|
||||
assert.match(skill, /기본 산출물은 실제 HWP 파일/);
|
||||
assert.match(skill, /Markdown만 반환하지 말고/);
|
||||
assert.match(skill, /dummy[\s\S]*지양|dummy[\s\S]*남기지 않는다/);
|
||||
assert.match(skill, /반드시 작성할 문서와 저장된 양식 경로/);
|
||||
assert.match(skill, /저장해 둔 HWP 양식을 우선 활용|저장된 HWP 양식을 우선 활용/);
|
||||
assert.match(skill, /에이전트가 매번 공식 양식을 새로 찾게 하지 말고/);
|
||||
assert.match(skill, /정관은 최대한 저장된 표준정관을 그대로 따른다/);
|
||||
assert.match(skill, /정관[\s\S]*제2조[\s\S]*업태·종목/);
|
||||
assert.match(skill, /정관[\s\S]*맨 마지막[\s\S]*작성일자[\s\S]*서명|정관[\s\S]*맨 마지막[\s\S]*날짜[\s\S]*기명날인/);
|
||||
assert.match(skill, /간인/);
|
||||
assert.match(skill, /법인인감/);
|
||||
assert.match(skill, /templates\/attachment-hwp\//);
|
||||
assert.match(skill, /자리표시자/);
|
||||
assert.match(skill, /articles-of-incorporation\.hwp/);
|
||||
assert.match(skill, /founder-meeting-minutes\.hwp/);
|
||||
assert.match(skill, /share-subscription\.hwp/);
|
||||
assert.match(skill, /inspection-report\.hwp/);
|
||||
assert.match(skill, /officer-acceptance-director-ceo\.hwp/);
|
||||
assert.match(skill, /rhwp-edit/);
|
||||
assert.match(skill, /k-skill-rhwp/);
|
||||
assert.match(skill, /replace-all.*본문/);
|
||||
assert.match(skill, /본문[\s\S]*replace-all|replace-all[\s\S]*본문/);
|
||||
assert.match(skill, /replace-all[\s\S]*shortcut/);
|
||||
assert.match(skill, /한 장 한 장[\s\S]*순차/);
|
||||
assert.match(skill, /set-cell-text/);
|
||||
assert.match(skill, /info.*list-paragraphs/);
|
||||
assert.match(skill, /render|kordoc/);
|
||||
assert.match(skill, /표.*셀/);
|
||||
assert.match(skill, /mktemp -d/);
|
||||
assert.match(skill, /chmod 700/);
|
||||
assert.match(skill, /레포.*밖|레포.*외부|저장소.*밖|저장소.*외부/);
|
||||
assert.doesNotMatch(skill, /\.\/out\/court-form-filled\.hwp/);
|
||||
assert.match(skill, /등기신청수수료 영수필확인서/);
|
||||
assert.match(skill, /등기이사[\s\S]*인감증명서 또는 본인서명사실확인서/);
|
||||
assert.match(skill, /등기이사[\s\S]*주민등록초본\/등본/);
|
||||
assert.match(skill, /상법 제291조/);
|
||||
assert.match(skill, /명의개서대리인/);
|
||||
assert.match(skill, /현물출자[\s\S]*재산인수/);
|
||||
assert.match(skill, /인허가/);
|
||||
assert.match(skill, /정관 공증|의사록 인증/);
|
||||
assert.match(skill, /법인명/);
|
||||
assert.match(skill, /이사/);
|
||||
assert.match(skill, /주소/);
|
||||
assert.match(skill, /쉬운 말/);
|
||||
assert.match(skill, /사용자 결정/);
|
||||
assert.match(articlesTemplate, /\{\{COMPANY_NAME\}\}/);
|
||||
assert.match(articlesTemplate, /발기인/);
|
||||
assert.match(articlesTemplate, /1주의 금액/);
|
||||
assert.match(articlesTemplate, /3명 이상.*이사회/);
|
||||
assert.match(articlesTemplate, /2명.*이사회가 없는/);
|
||||
assert.match(articlesTemplate, /이사회 결의라는 표현은 쓰지 않는다/);
|
||||
assert.match(articlesTemplate, /1명.*그 이사가 회사를 대표/);
|
||||
assert.match(articlesTemplate, /관할 등기소|전문가/);
|
||||
assert.match(documentPackTemplate, /취임승낙서/);
|
||||
assert.match(documentPackTemplate, /인감신고서/);
|
||||
assert.match(documentPackTemplate, /등록면허세/);
|
||||
assert.match(documentPackTemplate, /등기신청수수료 영수필확인서/);
|
||||
assert.match(documentPackTemplate, /등기이사[\s\S]*인감증명서 또는 본인서명사실확인서/);
|
||||
assert.match(documentPackTemplate, /등기이사[\s\S]*주민등록초본\/등본/);
|
||||
assert.match(documentPackTemplate, /명의개서대리인/);
|
||||
assert.match(documentPackTemplate, /현물출자[\s\S]*재산인수/);
|
||||
assert.match(documentPackTemplate, /인허가/);
|
||||
assert.match(documentPackTemplate, /정관 공증|의사록 인증/);
|
||||
assert.match(documentPackTemplate, /개인정보|민감정보/);
|
||||
assert.match(documentPackTemplate, /양식별 수정 위치/);
|
||||
assert.match(documentPackTemplate, /간인/);
|
||||
assert.match(documentPackTemplate, /법인인감/);
|
||||
assert.match(documentPackTemplate, /레포.*커밋/);
|
||||
assert.match(documentPackTemplate, /\{\{INSPECTION_CONCLUSION_AFTER_USER_OR_EXPERT_REVIEW\}\}/);
|
||||
assert.doesNotMatch(documentPackTemplate, /중대한 흠이 없음을 보고합니다/);
|
||||
assert.match(officialFormSources, /인터넷등기소/);
|
||||
assert.match(officialFormSources, /등기신청양식/);
|
||||
assert.match(officialFormSources, /첨부서면예시/);
|
||||
assert.match(officialFormSources, /상업등기신청서의 양식에 관한 예규/);
|
||||
assert.match(officialFormSources, /양식 제65-1호/);
|
||||
assert.match(officialFormSources, /양식 제65-2호/);
|
||||
assert.match(officialFormSources, /이미 저장된 HWP 양식 경로/);
|
||||
assert.match(officialFormSources, /새 양식을 찾는 것부터 시작하지 말고/);
|
||||
assert.match(officialFormSources, /모집설립[\s\S]*기본 플로우에서는 사용하지 않음/);
|
||||
assert.match(officialFormSources, /HWP\/HWPX\/PDF/);
|
||||
assert.match(officialFormSources, /templates\/official/);
|
||||
assert.match(officialFormSources, /form-65-1-stock-company-incorporation-promoter\.hwp/);
|
||||
assert.match(officialFormSources, /form-65-2-stock-company-incorporation-subscription\.hwp/);
|
||||
assert.match(officialFormSources, /fill_official_hwp\.py/);
|
||||
assert.match(officialFormSources, /templates\/attachment-hwp\//);
|
||||
assert.match(officialFormSources, /실제 공개 배포 첨부서류 HWP 양식 묶음/);
|
||||
assert.match(officialFormSources, /자리표시자/);
|
||||
assert.match(officialFormSources, /articles-of-incorporation\.hwp/);
|
||||
assert.match(officialFormSources, /corporate-seal-report\.hwp/);
|
||||
assert.match(officialFormSources, /최신본을 다시 확인|최신 예규/);
|
||||
assert.match(officialFormSources, /replace-all[\s\S]*shortcut/);
|
||||
assert.match(officialFormSources, /간인/);
|
||||
assert.match(officialFormSources, /법인인감/);
|
||||
assert.match(officialFormSources, /등기신청수수료 영수필확인서/);
|
||||
assert.match(officialFormSources, /등기이사[\s\S]*인감증명서 또는 본인서명사실확인서/);
|
||||
assert.match(officialFormSources, /등기이사[\s\S]*주민등록초본\/등본/);
|
||||
assert.match(officialFormSources, /상업등기규칙 제129조/);
|
||||
assert.match(officialFormSources, /명의개서대리인/);
|
||||
assert.match(officialFormSources, /현물출자[\s\S]*재산인수/);
|
||||
assert.match(officialFormSources, /인허가/);
|
||||
assert.match(officialFormSources, /정관 공증|의사록 인증/);
|
||||
assert.equal(officialFillMap.fields.company_name.cell, 21);
|
||||
assert.equal(officialFillMap.fields.head_office_address.cell, 23);
|
||||
assert.equal(officialFillMap.fields.capital_krw.cell, 33);
|
||||
assert.equal(officialSourceManifest.source.adm_rul_seq, "2200000106061");
|
||||
assert.match(officialSourceManifest.files[0].sha256, /^[a-f0-9]{64}$/);
|
||||
assert.match(attachmentSourceManifest.note, /sanitized to placeholders|자리표시자/);
|
||||
|
||||
assert.match(featureDoc, /법인등기 신청 컨설팅/);
|
||||
assert.match(featureDoc, /표준 정관/);
|
||||
assert.match(featureDoc, /정관/);
|
||||
assert.match(featureDoc, /등록면허세/);
|
||||
assert.match(featureDoc, /과밀억제권역/);
|
||||
assert.match(featureDoc, /조세특례제한법 제6조/);
|
||||
|
|
@ -3312,20 +3436,38 @@ test("corporate-registration-consulting skill covers court registry workflow, ta
|
|||
assert.match(featureDoc, /최종 법률 판단[\s\S]*(지원하지 않는다|수행하지 않는다|사용자가 직접 또는 전문가)/);
|
||||
assert.match(featureDoc, /최종 세무 판단[\s\S]*(지원하지 않는다|수행하지 않는다|사용자가 직접 또는 전문가)/);
|
||||
assert.match(featureDoc, /개인정보|민감정보/);
|
||||
assert.match(featureDoc, /자리표시자/);
|
||||
assert.match(featureDoc, /최종 산출물은 실제 `?\.hwp`? 사본/);
|
||||
assert.match(featureDoc, /저장된 HWP 양식 사본/);
|
||||
assert.match(featureDoc, /표 셀|set-cell-text/);
|
||||
assert.match(featureDoc, /모집설립/);
|
||||
assert.match(featureDoc, /현물출자/);
|
||||
assert.match(featureDoc, /변태설립사항/);
|
||||
assert.match(featureDoc, /자본금 10억/);
|
||||
assert.match(featureDoc, /주식회사 외/);
|
||||
assert.match(featureDoc, /지점/);
|
||||
assert.match(featureDoc, /외국인/);
|
||||
assert.match(featureDoc, /인허가 업종/);
|
||||
assert.match(featureDoc, /replace-all.*본문/);
|
||||
assert.match(featureDoc, /set-cell-text/);
|
||||
assert.match(featureDoc, /모집설립은 일반적이지[\s\S]*기본 플로우/);
|
||||
assert.match(featureDoc, /저장된 양식 경로/);
|
||||
assert.match(featureDoc, /필수 문서와 양식/);
|
||||
assert.match(featureDoc, /replace-all/);
|
||||
assert.match(featureDoc, /replace-all[\s\S]*shortcut/);
|
||||
assert.match(featureDoc, /한 장 한 장[\s\S]*순차/);
|
||||
assert.match(featureDoc, /표 셀|set-cell-text/);
|
||||
assert.match(featureDoc, /간인/);
|
||||
assert.match(featureDoc, /법인인감/);
|
||||
assert.match(featureDoc, /등기신청수수료 영수필확인서/);
|
||||
assert.match(featureDoc, /등기이사[\s\S]*인감증명서\/본인서명사실확인서|등기이사[\s\S]*인감증명서 또는 본인서명사실확인서/);
|
||||
assert.match(featureDoc, /등기이사[\s\S]*주민등록초본\/등본/);
|
||||
assert.match(featureDoc, /상법 제291조/);
|
||||
assert.match(featureDoc, /명의개서대리인/);
|
||||
assert.match(featureDoc, /현물출자[\s\S]*재산인수/);
|
||||
assert.match(featureDoc, /인허가/);
|
||||
assert.match(featureDoc, /정관 공증|의사록 인증/);
|
||||
assert.match(featureDoc, /업태·종목/);
|
||||
assert.match(featureDoc, /표.*셀/);
|
||||
assert.match(featureDoc, /사용자\/전문가가.*신고.*납부|사용자.*신고.*납부/);
|
||||
assert.match(featureDoc, /사용자\/전문가가.*제출|사용자.*제출/);
|
||||
assert.match(featureDoc, /세금 납부/);
|
||||
assert.match(featureDoc, /실제 제출은 사용자가 직접/);
|
||||
assert.match(featureDoc, /인터넷등기소|온라인법인설립시스템/);
|
||||
assert.match(featureDoc, /form-65-1-stock-company-incorporation-promoter\.hwp/);
|
||||
assert.doesNotMatch(featureDoc, /양식 제65-2호/);
|
||||
assert.match(featureDoc, /templates\/official\/\*\.hwp|templates\/official\//);
|
||||
assert.match(featureDoc, /templates\/attachment-hwp\//);
|
||||
assert.match(featureDoc, /templates\/attachment-hwp\/\*\.hwp|첨부/);
|
||||
assert.match(featureDoc, /참고용/);
|
||||
|
||||
assert.match(readme, /\| 법인등기 신청 컨설팅 \|/);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue