Merge commit 'acd1bab8f2737640f3d6209d44f0aa790c267c04' as '.vendor/myagent-kit'

This commit is contained in:
2026-04-13 23:25:23 +09:00
19 changed files with 1058 additions and 0 deletions
+152
View File
@@ -0,0 +1,152 @@
# myagent-kit
Reusable Copilot Development workflow assets.
## Contents
- `base/.github/prompts`: reusable prompts
- `base/.github/instructions`: reusable file instructions
- `base/.github/ISSUE_TEMPLATE`: reusable issue templates
- `base/.github/copilot-instructions.md`: managed Copilot baseline gate template (opt-in merge)
- `base/.github/pull_request_template.md`: PR traceability gate template
- `templates/docs/SRS/REQ-template.md`: REQ starter template
- `templates/docs/SRS/TRACEABILITY-template.md`: traceability matrix starter template
- `bootstrap/install.sh`: copy base assets into a target project
### Pre-flight Scope Decision (Step 0)
새 기능이나 변경 요청이 들어오면, requirement drafting을 시작하기 **전에** 먼저 아래 명령으로 SRS 대상 여부를 판정한다.
| Asset | 용도 |
|---|---|
| `base/.github/prompts/decide-requirement-scope.prompt.md` | 변경 요청을 입력받아 4종 판정 결과 반환 |
| `base/.github/instructions/requirement-scope-decision.instructions.md` | 판정 기준 및 출력 형식 가이드 |
| `base/.github/prompts/reopen-requirement-status.prompt.md` | `Approved/Implemented/Deprecated` requirement를 `Proposed`(또는 `Re-review`)로 되돌리기 위한 결정/충돌 검토 |
| `base/.github/instructions/reopen-requirement-discovery.instructions.md` | REQ 미지정 입력 시 후보 탐색(키워드/점수/동점 처리) 커스터마이징 가이드 |
**판정 결과 4종**
1. `New SRS requirement needed` — 새 REQ 문서 작성
2. `Update existing SRS requirement` — 기존 REQ 문서 수정
3. `Technical spec only` — SRS 변경 없이 technical spec만 업데이트
4. `Needs owner decision` — 운영 리스크/책임이 불명확하여 소유자 결정 필요
## Install into a project
```bash
bash .vendor/myagent-kit/bootstrap/install.sh /path/to/project
```
변경 적용 없이 계획만 확인하려면 dry-run을 사용한다.
```bash
bash .vendor/myagent-kit/bootstrap/install.sh /path/to/project --dry-run
```
옵션: 기존 `.github/copilot-instructions.md`를 덮어쓰지 않고 병합하려면 opt-in 플래그를 사용한다.
```bash
bash .vendor/myagent-kit/bootstrap/install.sh /path/to/project --merge-copilot-instructions
```
병합 정책 요약:
- marker 이름은 `myagent-kit`로 고정된다.
- 기존 파일이 있으면 `.github/copilot-instructions.md.bak`으로 최근 1개 백업 후 병합한다.
- 병합은 `myagent-kit` 관리 섹션만 갱신하고 `project-specific` 섹션은 유지한다.
- marker 쌍이 손상된 경우 병합을 중단하고 백업본으로 롤백한다.
In subtree-based usage:
```bash
git subtree add --prefix=.vendor/myagent-kit https://github.com/<owner>/myagent-kit.git main --squash
bash .vendor/myagent-kit/bootstrap/install.sh .
bash .vendor/myagent-kit/bootstrap/install.sh . --dry-run
bash .vendor/myagent-kit/bootstrap/install.sh . --merge-copilot-instructions
bash .vendor/myagent-kit/bootstrap/install.sh . --merge-copilot-instructions --dry-run
```
## 운영 규칙
- SRS는 계약 문서, 구현 문서는 실행 기록으로 분리합니다.
- 모든 요구사항에 고유 ID를 부여합니다. 예: REQ-001
- 구현/테스트/릴리즈까지 같은 ID를 계속 사용합니다.
- 상태 기반으로 관리합니다: Draft → Approved → Implemented → Verified → Released
## 추적/운영 표준
### 1) 식별자 규칙
- Requirement ID는 `REQ-XXX` 형식을 사용합니다. 예: `REQ-001`
- Acceptance Criteria는 requirement 내부에서 `AC1`, `AC2`처럼 번호를 고정합니다.
- 이슈/PR 제목에는 requirement ID를 포함합니다. 예: `[REQ-001] ...`
### 2) 증거(Evidence) 연결 규칙
- 구현 이슈에는 `Acceptance Criteria Mapping`을 작성합니다. (`ACx -> Task`)
- PR에는 어떤 AC가 어떤 변경으로 충족되었는지 명시합니다.
- 테스트 이름 또는 테스트 설명에도 requirement ID를 포함합니다.
- 릴리즈 노트에는 포함된 requirement ID 목록을 남깁니다.
### 3) 추적 문서 운영
- 추적 매트릭스는 `docs/SRS/traceability-matrix.md`로 운영합니다.
- 초기 작성은 `templates/docs/SRS/TRACEABILITY-template.md`를 복사해 사용합니다.
- 매트릭스의 각 행은 최소한 `REQ ID`, `AC`, `Issue/PR`, `Test`, `Status`를 채웁니다.
### 4) 최소 운영 절차
1. Requirement 작성 및 ID 확정
2. Requirement를 `Approved`로 전환
3. Implementation Issue 생성 (AC 매핑 포함)
4. PR 생성 (REQ/AC 충족 근거 기입)
5. 테스트 증거 업데이트
6. Requirement 상태를 `Implemented`/`Verified`로 전환
7. 릴리즈 시 매트릭스와 릴리즈 노트에 REQ ID 반영
## myagent-kit Development Life Cycle
### Phase 0. Workspace Bootstrap
- 프로젝트에 myagent-kit 자산을 설치한다.
- `bootstrap/install.sh`를 실행해 `.github` 워크플로 자산을 동기화한다.
### Phase 0.5. Pre-flight Scope Decision *(새 기능/변경 요청 진입 시 필수)*
- `decide-requirement-scope.prompt.md`로 변경 요청이 SRS 대상인지 먼저 판정한다.
- 판정 결과에 따라 다음 단계를 결정한다.
- `New SRS requirement needed` → Phase 1로 진행
- `Update existing SRS requirement` → 해당 REQ 파일을 수정하고 Phase 2로 진행
- `Technical spec only` → SRS 변경 없이 technical spec / implementation note만 업데이트
- `Needs owner decision` → 소유자와 협의 후 위 3가지 중 하나로 재판정
### Phase 1. Requirement Drafting
- `templates/docs/SRS/REQ-template.md`로 REQ 문서를 작성한다.
- REQ ID(`REQ-XXX`)를 확정하고, `Acceptance Criteria`를 test 가능한 문장으로 작성한다.
### Phase 2. Requirement Quality Gate
- `validate-requirement.prompt.md`로 requirement 품질 검토를 수행한다.
- 모호성, 누락 필드, impacted area, change log 누락을 수정한다.
### Phase 3. Requirement Approval Gate
- `approve-requirement.prompt.md`로 `Proposed -> Approved` 전환 가능 여부를 확인한다.
- 승인 이력(Change Log)을 남기고 상태를 `Approved`로 변경한다.
### Phase 3.5. Requirement Reopen / Re-review
- 구현 전/후에 계약 변경, acceptance criteria 재정의, 리스크 재평가가 필요하면 `reopen-requirement-status.prompt.md`를 사용한다.
- 입력 예시: `REQ-003, REQ-011; API 응답 필드 계약을 다시 정리해야 해서 재검토 필요`.
- 결과에서 사용자 결정 항목(목표 상태: `Proposed` vs `Re-review`)과 충돌 후보 REQ를 먼저 확인한 뒤 REQ 문서/인덱스를 수정한다.
### Phase 4. Pre-Implementation Design Review
- Implementation Issue를 생성하고 설계검토 체크리스트를 작성한다.
- 아키텍처, 인터페이스, 데이터, 오류 처리, 보안/성능, 테스트 전략을 합의한다.
- 미해결 항목은 `Open Items / Assumptions`에 기록한다.
### Phase 5. Implementation Planning
- `create-implementation-issue.prompt.md`로 구현 이슈를 생성한다.
- `Acceptance Criteria Mapping`으로 AC와 작업 항목을 연결한다.
- AI Agent 작업과 Human 작업을 분리한다.
### Phase 6. Implementation & PR
- 구현을 진행하고 PR을 생성한다.
- `.github/pull_request_template.md`로 REQ ID, AC 커버리지, 테스트 증거를 기록한다.
### Phase 7. Verification & Status Transition
- 자동/수동 검증 결과를 반영한다.
- `mark-requirement-implemented.prompt.md`로 `Approved -> Implemented` 전환 가능 여부를 점검한다.
- 충족 여부가 확인되면 requirement 상태를 전환한다.
### Phase 8. Traceability & Release
- `docs/SRS/traceability-matrix.md`를 갱신한다.
- 릴리즈 노트에 반영된 REQ ID를 기록한다.
- 필요 시 운영 문서/회고 문서에 residual risk를 남긴다.
@@ -0,0 +1,72 @@
---
name: "Implementation From Approved Requirement"
about: "Create an implementation issue from an Approved SRS requirement"
title: "[REQ-XXX] Implement <short title>"
labels: ["implementation", "requirement"]
assignees: []
---
<!-- 기본 작성 언어는 한국어로 유지하고, 중요한 technical term는 영어 원문을 유지하거나 괄호로 병기한다. -->
## 배경 (Context)
- Requirement ID:
- Requirement Link:
- Status Check: Approved
## 범위 (Scope)
- In Scope:
- Out of Scope:
## 구현 전 설계검토 체크리스트 (Pre-Implementation Design Review)
- [ ] Architecture approach is documented and agreed
- [ ] Public interface/API contract changes are identified
- [ ] Data model/schema impact is reviewed
- [ ] Error handling and fallback strategy is defined
- [ ] Security/privacy impact is reviewed
- [ ] Performance/scalability impact is reviewed
- [ ] Test strategy (unit/integration/e2e/manual) is defined
- [ ] Rollback or feature-flag strategy is defined when needed
- [ ] Unknowns, assumptions, and decision owners are recorded
- [ ] Human review sign-off completed (or `No additional design review required.`)
### 설계 결정 요약 (Design Decisions)
- Decision 1:
- Decision 2:
### 미해결 항목 / 가정 (Open Items / Assumptions)
-
## AI Agent 작업 (AI Agent Work)
- [ ] Code change task 1
- [ ] Code change task 2
- [ ] Automated validation task
## 사람 작업 (Human Work)
- [ ] Approve scope or open questions
- [ ] Perform required manual verification
## Acceptance Criteria Mapping
- REQ AC1 -> Task(s):
- REQ AC2 -> Task(s):
## AI 검증 요약 (AI Validation Summary)
- Automated tests/checks to run:
- Expected evidence:
## 사람 확인 체크리스트 (Human Verification Checklist)
- [ ] Verify:
- [ ] Confirm:
- If no human verification is required, write: `No manual verification required.`
## 열린 질문 (Open Questions)
-
## 리스크 (Risks)
-
## 완료 조건 (Definition of Done)
- [ ] All mapped acceptance criteria are satisfied
- [ ] Tests are added or updated
- [ ] AI-completable work is finished and evidence is attached
- [ ] Human-only work is completed or explicitly marked not required
- [ ] Docs or change notes are updated if needed
@@ -0,0 +1,16 @@
# myagent-kit Managed Copilot Instructions
아래 규칙은 myagent-kit가 관리하는 기본 게이트다.
## SRS-first Code Change Gate
- 소스 코드 변경이 필요한 요청이면 먼저 `docs/SRS/index.md`와 관련 REQ/SRS 문서를 확인한다.
- SRS와 기술 문서(`docs/technical/`) 기준과 코드 변경 방향이 충돌하면 즉시 사용자에게 선택을 요청한다.
- 사용자가 SRS 변경을 선택하면 `/reopen-requirement-status` 절차를 먼저 수행한다.
- 사용자가 코드 변경 지속을 선택하면 해당 결정을 명시적으로 기록한 뒤 진행한다.
## No-Conflict Path
- 충돌이 없으면 기술 문서 업데이트가 필요한지 먼저 확인하고, 필요 시 기술 문서를 선반영한 뒤 소스 수정을 진행한다.
## Traceability
- 코드 변경 시 관련 REQ ID를 확인하고, 가능하면 PR/이슈/테스트 증거와 연결한다.
- 판단이 불충분하면 가정하지 말고 사용자에게 필요한 결정을 질문한다.
@@ -0,0 +1,50 @@
---
description: "Use when customizing REQ candidate discovery rules for /reopen-requirement-status command, including keyword dictionary, scoring, tie-breaks, and normalization policy."
applyTo: ".github/prompts/reopen-requirement-status.prompt.md"
---
# Reopen Requirement Discovery Guidelines
## 목적
`/reopen-requirement-status` 입력에 REQ ID가 없을 때, 관련 REQ 후보를 일관된 기준으로 탐색하고 우선순위를 정한다.
## 후보 탐색 우선순위
1. 계약 키워드 일치
- `API`, `endpoint`, `request`, `response`, `schema`, `field`, `CLI`, `command`, `option`, `UI`, `event`, `config`, `env`, `deploy`, `integration`
2. 영향 영역 일치
- 입력의 변경 대상 모듈/문서/테스트와 REQ의 `Impacted Area` 교집합
3. 목적/행동 일치
- 입력의 동사/의도(추가, 제거, 변경, 완화, 강화, 비활성화 등)와 REQ `Intent`/`Requirement`의 의미 유사도
4. 상태 가중치
- 현재 상태가 `Approved`, `Implemented`, `Deprecated`인 REQ 우선
## 점수 및 신뢰도
- 점수식: `키워드(0-5) + 영향영역(0-3) + 의미유사(0-2) + 상태가중치(0-1)`
- 정렬: 총점 내림차순
- 신뢰도:
- `High(7-11)`
- `Medium(4-6)`
- `Low(0-3)`
## 도메인 키워드 사전 (커스터마이즈 가능)
- Auth & Access: `auth`, `login`, `oauth`, `token`, `permission`, `rbac`, `role`, `scope`
- Billing & Subscription: `billing`, `invoice`, `payment`, `subscription`, `plan`, `quota`, `credit`
- Data & Migration: `schema`, `migration`, `backfill`, `etl`, `import`, `export`, `retention`
- API & Contract: `api`, `endpoint`, `request`, `response`, `versioning`, `webhook`, `payload`
- Runtime & Operations: `deploy`, `rollback`, `release`, `monitoring`, `alert`, `slo`, `incident`
- Configuration: `config`, `env`, `feature flag`, `toggle`, `secret`, `parameter`
- UX & Interface: `ui`, `ux`, `screen`, `form`, `flow`, `command`, `cli`, `option`
- Testing & Quality: `test`, `e2e`, `regression`, `coverage`, `validation`, `acceptance`
## 정규화 규칙
- 사전에 없는 표현이 입력에 등장하면 의미가 유사한 사전 키워드로 1회 정규화해 근거에 표기한다.
- 예: `권한` -> `permission`, `과금` -> `billing`
## 동점 처리
- 동일 점수 후보가 여러 개면 최신 Change Log 항목이 있는 REQ를 우선한다.
- 여전히 동점이면 현재 active 상태(`Approved`/`Implemented`) REQ를 우선한다.
- 추가 동점이면 REQ ID가 작은 항목을 우선한다.
## 출력 권장
- 후보는 최대 5개 제시
- 각 후보에 `REQ ID`, `신뢰도`, `점수`, `근거 키워드`, `영향 영역`을 포함
- 확정 전에는 `Immediate Questions`로 최종 대상 REQ 선택을 먼저 요청
@@ -0,0 +1,52 @@
---
description: "Use when evaluating whether a new feature or change request requires a new or updated SRS requirement, a technical spec update only, or needs owner decision. Apply before starting requirement drafting."
applyTo: "docs/SRS/**/*.md"
---
# Requirement Scope Decision Guidelines
## 목적
새 기능 요청이나 변경 사항이 들어왔을 때, SRS에 등록해야 하는지(신규 또는 기존 REQ 수정) 아니면 technical spec / implementation note만 업데이트하면 되는지를 먼저 판정한다.
이 판정을 거침으로써 불필요한 REQ 생성을 방지하고, SRS에 등록돼야 할 변경이 누락되는 것을 예방한다.
## 판정 결과 분류 (4종)
1. **New SRS requirement needed** — 새 REQ 문서를 작성해야 한다.
2. **Update existing SRS requirement** — 기존 REQ 문서를 수정해야 한다.
3. **Technical spec only** — SRS 변경 없이 technical spec / implementation note만 업데이트한다.
4. **Needs owner decision** — 운영 리스크나 승인 기준이 불명확하여 소유자(Owner) 결정이 필요하다.
## SRS 대상 판정 기준 (다음 중 하나라도 해당하면 SRS)
### 외부 계약 변화
- 사용자 또는 외부 시스템이 관찰하는 계약이 바뀌는 경우
- API / CLI / UI / Event / Data schema / Config / Deployment / Integration 요구사항이 변경되는 경우
### 측정 가능한 Non-Functional 변경
- 성능, 보안, 가용성, 확장성 등 측정 기준이 추가되거나 변경되는 경우
### Acceptance Criteria 및 승인 게이트 필요
- 변경 사항에 대해 명시적 수락 기준과 승인 이력이 필요한 경우
## Technical Spec Only 판정 기준 (다음에 해당하면 SRS 불필요)
- 내부 리팩터링 (외부 계약 변화 없음)
- 라이브러리 교체 (동일한 외부 인터페이스 유지)
- 코드 구조 / 패턴 변경 (기능 동작 동일)
- 외부 계약을 바꾸지 않는 구현 최적화
## Borderline / Needs Owner Decision 판정 기준
- 운영 리스크나 승인 책임이 불명확한 경우
- 제품 의도가 불분명하거나 범위가 애매한 경우
- 위 기준만으로 분류가 확정되지 않는 경우
## New vs. Update 구분 기준
- 동일 기능/계약 범위의 변경 → `Update existing SRS requirement`
- 새 기능/계약/인터페이스의 추가 → `New SRS requirement needed`
- 기존 REQ 검색 시 `docs/SRS/index.md`의 Requirement Register를 먼저 확인한다.
## 판정 출력 형식
판정 결과는 항상 다음 항목을 포함해야 한다.
1. **Decision** — 위 4종 중 하나
2. **Why** — 판정 근거 (구체적으로 어떤 기준에 해당하는지)
3. **Recommended Type** — SRS 대상인 경우, 해당 requirement type (Interface / Data / Deployment 등)
4. **Existing REQ candidates** — Update 가능성이 있는 기존 REQ ID 목록 (해당 시)
5. **Next Action** — 판정 결과에 따른 다음 단계 안내
6. **Open Questions** — 추가 확인이 필요한 사항 (없으면 `없음`)
@@ -0,0 +1,53 @@
---
description: "Use when writing or editing SRS documents, requirement files, acceptance criteria, change logs, or impacted area entries under docs/SRS. Ensures requirement quality, traceability, and testable wording."
applyTo: "docs/SRS/**/*.md"
---
# SRS Document Guidelines
## Requirement 타입 분류
### 분류 의사결정 규칙 (우선순위 순)
1. **Installation**: "시스템 설치, 환경 구성, 초기화 절차를 정의하는가?" → YES면 Installation
- 예: Docker 이미지 빌드, 데이터베이스 마이그레이션, 사전 조건 설정
2. **Interface**: "사용자가 직접 조작하거나 실행하는 방식을 정의하는가?" → YES면 Interface
- 예: CLI 명령어, API 엔드포인트, 웹 UI 기능, 제어 방식
3. **Configuration**: "시스템 또는 기능의 설정 옵션, 커스터마이징을 정의하는가?" → YES면 Configuration
- 예: 설정 파라미터, 옵션 항목, 환경 변수, 커스터마이징 포인트
4. **Data**: "데이터 저장, 로드, 구조, 파일 형식, 스키마를 정의하는가?" → YES면 Data
- 예: 설정 파일 형식, 데이터베이스 스키마, API 요청/응답 구조
5. **Exception & Error Handling**: "오류 처리, 예외 복구, 재시도 전략을 중심으로 하는가?" → YES면 Exception & Error Handling
- 예: 네트워크 오류 재시도, 데이터 검증 실패 처리, 복구 절차
6. **Deployment**: "배포 방식, 운영 절차, 배포 환경을 정의하는가?" → YES면 Deployment
- 예: 컨테이너 배포, 스택 관리, 운영 가이드
7. **Documentation**: "문서 작성, 가이드, 매뉴얼, 안내서를 정의하는가?" → YES면 Documentation
- 예: 사용자 가이드, API 문서, 운영 매뉴얼, 튜토리얼
8. **Integration**: "외부 시스템 연동, 플러그인, 확장 기능을 정의하는가?" → YES면 Integration
- 예: 3rd party 서비스 연동, 플러그인 인터페이스, 확장 메커니즘
9. **Migration**: "데이터 이전, 버전 업그레이드, 마이그레이션을 정의하는가?" → YES면 Migration
- 예: 데이터 마이그레이션, 버전 호환성, 업그레이드 절차
10. **Testing**: "테스트 전략, QA 요구사항, 검증 방식을 정의하는가?" → YES면 Testing
- 예: 테스트 커버리지, 회귀 테스트, 수락 테스트 기준
11. **Non-Functional**: 위 모든 경우에 해당하지 않으면 → Non-Functional
- 예: 성능 목표, 보안 정책, 확장성, 호환성, 신뢰성 요구사항
**주의**: requirement가 여러 분류에 해당하면 주된 제약 또는 목적에 따라 하나로만 선택한다. 예를 들어:
- "Docker Compose로 배포할 수 있어야 한다" → Deployment
- "배포 시 환경 변수로 설정 가능해야 한다" → Configuration
- "배포 전에 다음 점검 항목을 검증해야 한다" → Testing/Documentation
- `docs/SRS/index.md`는 SRS 운영 기준과 Requirement Register를 관리하는 문서로 유지한다.
- `docs/SRS/REQ-XXX_*.md`는 하나의 requirement만 다루고, 다른 requirement 내용을 섞지 않는다. 파일은 Type별 폴더에 저장한다. 예: `docs/SRS/Deployment/REQ-001_docker-compose-release.md`
- 새 requirement 번호의 source of truth는 `docs/SRS/index.md`의 `Next Requirement ID`다.
- requirement 본문에는 최소한 `Status`, `Type`, `Priority`, `Owner`, `Intent`, `Requirement`, `Acceptance Criteria`, `Impacted Area`, `Change Log`가 포함되어야 한다.
- `Acceptance Criteria`는 관찰 가능하고 test 가능한 문장으로 작성한다.
- 모호한 표현("개선한다", "적절히 처리한다", "최적화한다")은 측정 기준 없이 사용하지 않는다.
- requirement를 수정하면 해당 REQ 파일의 `Change Log`도 함께 갱신한다.
- `Impacted Area`는 `Docs`, `Modules`, `Tests`를 모두 검토한 뒤 작성한다. 해당 항목이 없으면 `없음`으로 명시한다.
- implementation issue/PR를 생성하거나 병합할 때는 `docs/SRS/traceability-matrix.md`에서 해당 REQ 행의 `Issue/PR`, `Tests`, `Status`를 갱신한다.
- 새로운 Type으로 requirement를 추가할 때는 `docs/SRS/<Type>/` 폴더 하위에 저장한다. 아직 없는 Type 폴더면 생성한다.
- 새로운 requirement를 추가하면 `docs/SRS/index.md`의 Requirement Register에도 같은 ID를 추가한다.
- 새로운 requirement를 추가하거나 Register가 바뀌면 `docs/SRS/index.md`의 `Next Requirement ID`도 함께 갱신한다.
- `docs/SRS/index.md`의 `Recent Change Log Summary`는 최신 5건만 유지하고 최신 항목을 위에 둔다.
- requirement ID와 파일명 prefix는 일치해야 한다. 예: `REQ-002`는 `docs/SRS/<Type>/REQ-002_<slug>.md`.
- requirement 상태를 `Approved` 또는 `Implemented`로 바꿀 때는 acceptance criteria와 change history가 누락되지 않았는지 먼저 검토한다.
- requirement 상태를 전환할 때는 `docs/SRS/index.md`의 `Status Transition Evidence` 기준을 따른다.
@@ -0,0 +1,26 @@
---
description: "Use when: decide whether a Proposed requirement is ready to move to Approved and generate the required status-change edits"
name: "Approve Requirement"
argument-hint: "Paste a Proposed REQ file or select requirement text"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 requirement 문서가 `Proposed`에서 `Approved`로 전환 가능한지 검토한다.
입력:
${input}
검토 규칙:
- 기준 문서는 [SRS index](../../docs/SRS/index.md) 의 `Status Transition Evidence`와 해당 requirement 문서 구조다.
- `Status`, `Type`, `Priority`, `Owner`, `Intent`, `Requirement`, `Acceptance Criteria`, `Impacted Area`, `Change Log` 존재 여부를 검토한다.
- Type이 SRS index의 분류 도표에 정의된 타입 중 정확하게 하나로 지정되었는지 확인한다.
- `Acceptance Criteria`가 구현 기준으로 충분히 구체적인지 판단한다.
- 중요한 assumption 또는 open question이 남아 있으면 승인 blocker로 본다.
- 승인 가능하면 status 변경과 Change Log 추가 초안을 함께 제안한다.
- 승인 불가하면 blocker를 우선순위 순으로 정리한다.
출력 형식:
1. Approval Decision: `Approved-ready` 또는 `Not ready`
2. Blockers
3. Suggested Edits
4. Approval Change Log Draft
@@ -0,0 +1,32 @@
---
description: "Use when: complete a partial SRS requirement draft into a full REQ file with acceptance criteria and impacted area"
name: "Complete Requirement Draft"
argument-hint: "Paste a partial requirement draft or describe the feature"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 입력을 기반으로 SRS requirement 초안을 완성한다.
입력:
${input}
작업 규칙:
- SRS 기준 문서는 [SRS index](../../docs/SRS/index.md) 와 관련 [REQ template](../../docs/SRS/REQ-template.md) 를 따른다.
- 입력에 `REQ-XXX` 형식의 명시적 ID가 없으면, [SRS index](../../docs/SRS/index.md)의 `Next Requirement ID`를 우선 읽어 그 값을 사용한다. `Next Requirement ID`가 없거나 신뢰할 수 없으면 `Requirement Register`와 기존 REQ 파일들 기준의 최고 번호에 1을 더한 값을 사용한다.
- 사용자가 이미 특정 REQ ID를 명시했으면 그 ID를 유지하고 임의로 바꾸지 않는다.
- requirement의 유형을 인식하고 `Type` 필드를 정확하게 지정한다. 분류는 [SRS index](../../docs/SRS/index.md)의 "Requirement 작성 규칙" 또는 [SRS instructions](../../.github/instructions/srs.instructions.md)의 "분류 의사결정 규칙"을 따른다.
- 최종 `Type`과 `REQ ID`를 이용해 추천 파일 경로를 함께 제시한다. 형식은 `docs/SRS/<Type>/REQ-XXX_<slug>.md`를 사용한다.
- `<slug>`는 requirement 제목을 기반으로 소문자 kebab-case 영문으로 생성한다. 공백은 `-`로 치환하고, 영문/숫자/`-`만 남긴다.
- 제목이 한글이거나 slug 생성이 불명확하면 의미를 유지하는 짧은 영문 slug를 보수적으로 제안한다.
- 사용자가 제공한 의도와 핵심 동작을 보존한다.
- 빠진 항목은 보수적으로 보완하되, 추정이 필요한 내용은 `Notes`에 assumption으로 분리한다.
- `Acceptance Criteria`는 반드시 test 가능하게 작성한다.
- `Impacted Area`는 Docs, Modules, Tests로 구분한다.
- 새로 할당한 ID를 문서 제목 `# REQ-XXX: ...`에 반영한다.
- 결과는 REQ 파일에 바로 붙여넣을 수 있는 Markdown 형식으로만 출력한다.
- 코드 구현 계획은 포함하지 않는다.
출력 형식:
1. `Recommended File Path: docs/SRS/<Type>/REQ-XXX_<slug>.md` 한 줄
2. 실제 할당된 ID가 반영된 `# REQ-XXX: ...` 형식의 전체 문서 본문
3. `## Change Log` 아래에 초안 생성용 `CHG-YYYYMMDD-01` 항목 1개 포함
@@ -0,0 +1,42 @@
---
description: "Use when: create an implementation plan and GitHub issue draft from an Approved requirement"
name: "Create Implementation Issue"
argument-hint: "Paste an Approved REQ file"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 `Approved` requirement 문서를 기반으로 implementation issue 초안을 생성한다.
입력:
${input}
작업 규칙:
- 기준 문서는 [SRS index](../../docs/SRS/index.md) 와 해당 REQ 문서다.
- 출력 언어는 기본적으로 한국어로 작성한다.
- section 제목, 설명, 작업 지시문은 한국어를 우선 사용하되, 중요한 technical term는 영어를 유지하거나 한국어 뒤 괄호로 병기한다. 예: `AI Agent Work`, `Human Verification Checklist`, `Acceptance Criteria`, `Open Questions`, `Risk`, `Definition of Done`.
- 코드 식별자, 파일 경로, 명령어, API 이름, 테스트 이름, UI 라벨 등 구현 대상과 직접 연결되는 literal은 영어 원문을 유지한다.
- requirement의 `Acceptance Criteria`를 구현 task로 분해한다.
- task는 구현 단위로 나누고, 각 task를 `AI Agent가 완료 가능한 작업`과 `Human이 수행해야 하는 작업`으로 구분한다.
- test task를 반드시 포함한다.
- 각 acceptance criteria 또는 task에 대해 다음을 판단한다:
- AI Agent가 코드 변경과 자동 검증까지 완료할 수 있는가
- Human이 직접 확인해야 하는 수동 검증이 남는가
- Human이 직접 확인해야 하는 항목이 있으면 `Human Verification Checklist`에 구체적인 확인 절차와 기대 결과를 작성한다.
- AI Agent가 자체적으로 테스트를 완료할 수 있어 Human 확인이 불필요하면 `Human Verification Checklist`에 `No manual verification required.`를 명시하고 그 근거를 `AI Validation Summary`에 적는다.
- `Impacted Area`를 기반으로 module/docs/test 변경 범위를 제시한다.
- 미해결 가정이나 리스크가 있으면 issue 본문에 `Open Questions`와 `Risks`로 명시한다.
- 출력은 GitHub issue에 바로 붙여 넣을 수 있는 Markdown 형식으로만 작성한다.
출력 형식:
1. Issue Title
2. 배경 (Context)
3. 범위 (Scope)
4. AI Agent 작업 (AI Agent Work) 체크리스트
5. 사람 작업 (Human Work) 체크리스트
6. Acceptance Criteria Mapping (REQ 기준)
7. AI 검증 요약 (AI Validation Summary)
8. 사람 확인 체크리스트 (Human Verification Checklist)
9. 열린 질문 (Open Questions)
10. 리스크 (Risks)
11. 완료 조건 (Definition of Done)
12. GitHub Issue Create Command (`gh issue create`) 예시
@@ -0,0 +1,38 @@
---
description: "Use when: evaluate whether a new feature or change request needs a new SRS requirement, an update to an existing one, a technical spec update only, or owner decision — before starting requirement drafting"
name: "Decide Requirement Scope"
argument-hint: "Describe the feature or change request: include feature description, issue body, and/or PR/diff summary"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 입력을 기반으로, 이 변경이 SRS 대상인지 아닌지를 판정한다.
입력:
${input}
판정 규칙:
- 기준 문서는 [requirement-scope-decision instructions](../../.github/instructions/requirement-scope-decision.instructions.md) 와 [SRS index](../../docs/SRS/index.md) 의 Requirement Register다.
- 다음 4가지 결과 중 하나를 반드시 반환한다.
1. `New SRS requirement needed`
2. `Update existing SRS requirement`
3. `Technical spec only`
4. `Needs owner decision`
- 판정 기준을 순서대로 적용한다.
- 사용자/외부 시스템이 관찰하는 계약(API, CLI, UI, Event, Data schema, Config, Deployment, Integration)이 바뀌는가? → YES면 SRS
- 측정 가능한 Non-Functional requirement(성능, 보안, 가용성 등)가 추가/변경되는가? → YES면 SRS
- Acceptance Criteria 및 명시적 승인 게이트가 필요한가? → YES면 SRS
- 위 기준에 모두 해당하지 않으면서 내부 리팩터링·라이브러리 교체·코드 구조 변경·구현 최적화인가? → Technical spec only
- 위 기준만으로 분류가 확정되지 않거나 운영 책임/리스크가 불명확한가? → Needs owner decision
- SRS 대상으로 판정되면, 신규 기능/계약인지 기존 REQ 범위 내 변경인지를 구분한다.
- 기존 REQ에 해당하는 경우 [SRS index](../../docs/SRS/index.md) 의 Requirement Register에서 후보 REQ ID를 찾아 제시한다.
- Technical spec only로 판정되면, 불필요한 REQ 생성을 명시적으로 피하도록 안내한다.
- 결과에는 항상 `Why`와 `Next Action`을 포함한다.
- `Open Questions`가 없으면 `없음`으로 명시한다.
출력 형식:
1. **Decision**: `New SRS requirement needed` / `Update existing SRS requirement` / `Technical spec only` / `Needs owner decision` 중 하나
2. **Why**: 판정 근거 — 어떤 기준에 해당하는지 구체적으로 설명
3. **Recommended Type**: (SRS 대상인 경우만) Interface / Data / Deployment / Configuration 등 해당 requirement type
4. **Existing REQ candidates**: (Update 가능성이 있는 경우만) 관련 REQ ID와 제목 목록. 해당 없으면 생략
5. **Next Action**: 판정 결과에 따른 다음 단계 안내
6. **Open Questions**: 추가 확인이 필요한 사항. 없으면 `없음`
@@ -0,0 +1,25 @@
---
description: "Use when: decide whether an Approved requirement is ready to move to Implemented and generate the required status-change edits"
name: "Mark Requirement Implemented"
argument-hint: "Paste an Approved REQ file and implementation evidence"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 requirement 문서와 implementation evidence를 검토해 `Approved`에서 `Implemented`로 전환 가능한지 판단한다.
입력:
${input}
검토 규칙:
- 기준 문서는 [SRS index](../../docs/SRS/index.md) 의 `Status Transition Evidence`와 해당 requirement 문서 구조다.
- requirement의 `Acceptance Criteria`가 implementation evidence, tests, 또는 manual verification으로 충족되었는지 확인한다.
- 충족되지 않은 acceptance criteria가 있으면 구현 완료로 판정하지 않는다.
- 구현 완료 가능하면 status 변경, 잔여 리스크, Change Log 추가 초안을 함께 제안한다.
- 구현 완료 불가하면 미충족 기준과 필요한 검증 항목을 정리한다.
출력 형식:
1. Implementation Decision: `Implemented-ready` 또는 `Not ready`
2. Unverified Criteria
3. Suggested Edits
4. Implementation Change Log Draft
5. Residual Risk
@@ -0,0 +1,44 @@
---
description: "Use when: move Approved, Implemented, or Deprecated requirements back to Proposed (or Re-review) with decision checkpoints, conflict candidates, and fallback REQ discovery"
name: "Reopen Requirement Status"
argument-hint: "(선택) REQ-XXX, REQ-XXX; 변경 의도와 범위 설명"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 입력을 기준으로 지정된 requirement를 재검토 상태로 되돌리는 변경안을 만든다.
입력:
${input}
입력 해석 규칙:
- 입력 형식은 기본적으로 `REQ-XXX, REQ-XXX; 이렇게 이렇게 변경할거야.` 를 따른다.
- `;` 앞은 대상 REQ ID 목록, 뒤는 변경 의도/배경으로 해석한다.
- 구분자는 쉼표/공백을 모두 허용하되, 최종적으로 중복 없는 REQ ID 목록으로 정규화한다.
- 입력에 REQ ID가 없으면 전체 입력을 변경 의도/배경으로 간주한다.
작업 규칙:
- 기준 문서는 `docs/SRS/index.md`, 해당 REQ 파일, [SRS instructions](../../.github/instructions/srs.instructions.md), [Reopen requirement discovery instructions](../../.github/instructions/reopen-requirement-discovery.instructions.md) 다.
- 대상 REQ ID가 명시되지 않으면 `docs/SRS/index.md` Requirement Register와 REQ 파일 제목/Intent/Requirement/Impacted Area를 기반으로 관련 후보를 탐색한다.
- 후보 탐색, 점수화, 신뢰도, 동점 처리, 도메인 키워드 정규화는 [Reopen requirement discovery instructions](../../.github/instructions/reopen-requirement-discovery.instructions.md)를 그대로 따른다.
- REQ 미지정 시 후보는 최대 5개까지 제시하고, 신뢰도(High/Medium/Low)와 근거(키워드/영향 영역)를 함께 제시한다.
- REQ 미지정 시 확정 전에는 상태 변경안을 단정하지 말고, `Immediate Questions`에서 최종 대상 REQ 확인 질문을 먼저 제시한다.
- 사용자가 후보 중 선택하면 선택된 REQ 기준으로 상태 되돌림 변경안을 완성한다.
- 대상 REQ의 현재 상태가 `Approved`, `Implemented`, `Deprecated` 중 하나인지 확인한다.
- 상태 되돌림의 목표 상태는 기본 `Proposed`로 제안한다.
- 팀이 `재검토 상태`를 별도로 운용하면 목표 상태를 `Re-review`(또는 팀 표기)로 제안할 수 있다. 단, 최종 상태값은 사용자 결정 항목으로 분리한다.
- 각 REQ마다 왜 되돌려야 하는지(계약 변경, acceptance criteria 변경, 리스크 발견, 구현 불일치 등) 근거를 1-2줄로 요약한다.
- 변경 전/후 영향으로 충돌 가능성이 있는 REQ 후보를 `docs/SRS/index.md` Requirement Register 기준으로 제시한다.
- 충돌 후보는 다음 기준으로 찾는다: 동일 기능 영역, 동일 인터페이스/API/CLI/데이터 스키마, 같은 모듈/문서 영향 범위, 기존 acceptance criteria 중복/상충.
- 사용자가 결정해야 할 항목을 별도 섹션으로 분리한다.
- 결정 누락 시 즉시 물어야 할 질문을 먼저 제시한다.
- 실제 문서 변경을 수행하는 대신, 바로 적용 가능한 수정안(상태, Change Log, impacted area 재검토 포인트)을 제시한다.
출력 형식:
1. Reopen Decision
2. Immediate Questions (없으면 `없음`)
3. Detected REQ Candidates (REQ 미지정인 경우 필수, 지정된 경우 생략 가능)
4. User Decisions Required
5. Suggested Status Changes (REQ별: `from -> to`)
6. Conflict Candidate REQs (REQ별 후보 ID와 충돌 이유)
7. Suggested REQ Edits (Status, Intent/Requirement/Acceptance Criteria 영향, Change Log 초안)
8. Next Action
@@ -0,0 +1,28 @@
---
description: "Use when: update docs/SRS/index.md Requirement Register or Recent Change Log Summary after adding or editing REQ files"
name: "Sync SRS Index"
argument-hint: "Paste changed REQ files or describe what changed in SRS"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 입력을 기준으로 `docs/SRS/index.md`를 갱신하기 위한 제안을 만든다.
입력:
${input}
작업 규칙:
- 기준 문서는 [SRS index](../../docs/SRS/index.md) 이다.
- 새 requirement가 추가되었거나 Register가 바뀌면 `Requirement Register`의 최고 번호를 기준으로 다음 번호를 계산해 `Next Requirement ID`도 함께 갱신한다.
- 새 requirement가 추가되었으면 `Requirement Register`에 들어갈 행을 만든다.
- 기존 requirement가 수정되었으면 `Recent Change Log Summary`에 들어갈 요약 항목을 만든다.
- 기존 구조를 바꾸지 말고, 필요한 행과 요약만 제안한다.
- `Next Requirement ID`는 `Requirement Register`에 있는 가장 큰 REQ 번호보다 정확히 1 큰 값이어야 한다.
- `Recent Change Log Summary`는 최신 변경을 위에 두고, 짧은 요약 1줄로 작성한다.
- `Recent Change Log Summary`는 최신 5건만 유지하도록 제안한다. 5건을 초과하면 제거 또는 대체해야 할 가장 오래된 항목도 함께 설명한다.
- 출력은 사람이 `docs/SRS/index.md`에 바로 반영할 수 있는 Markdown 조각으로만 작성한다.
출력 형식:
1. `Next Requirement ID`에 반영할 Markdown bullet
2. `Requirement Register`에 추가 또는 수정할 Markdown table row
3. `Recent Change Log Summary`에 추가할 Markdown section
4. 필요한 경우 only, index에서 제거 또는 갱신해야 할 기존 항목 설명
@@ -0,0 +1,34 @@
---
description: "Use when: verify one or more REQ IDs are Approved and create or update the matching docs/technical specifications"
name: "Sync Technical Specs"
argument-hint: "Enter REQ IDs, e.g. REQ-011, REQ-007, REQ-012"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 입력으로 지정된 requirement ID 목록에 대해, 승인 상태를 확인하고 해당하는 `docs/technical/` 문서를 실제로 갱신한다.
입력:
${input}
작업 규칙:
- 입력에서 `REQ-XXX` 목록을 추출한다. 쉼표 또는 공백으로 구분된 여러 ID를 지원한다.
- 먼저 `docs/SRS/index.md`의 `Requirement Register`와 각 REQ 파일의 `Status`를 함께 확인한다.
- 두 곳 모두 `Approved`인 requirement만 기술명세 업데이트 대상으로 포함한다.
- 하나라도 `Approved`가 아니거나 파일을 찾지 못하면 해당 REQ는 blocker로 보고하고, 그 REQ에 대한 technical doc은 수정하지 않는다.
- `docs/technical/index.md`와 각 technical doc 상단의 `Related REQ`를 기준으로 기존 연결 문서를 찾는다.
- 연결 문서가 있으면 현재 승인된 requirement에 맞게 내용을 실제로 업데이트한다.
- 연결 문서가 없으면 `docs/technical/` 아래에 새 문서를 생성하고 `docs/technical/index.md`에 항목을 추가한다.
- 기술 문서는 SRS를 source of truth로 따르며, 외부 계약이나 acceptance criteria를 재정의하지 않는다. 대신 구현 상세(모듈 책임, 파일 위치, 설정/환경값, 런타임 흐름, validation notes, open implementation points)를 정리한다.
- 문서 상단에는 반드시 `- Related REQ: ...`를 유지하거나 추가한다.
- `REQ-011`, `REQ-007`, `REQ-012`는 다음 문서를 우선 후보로 사용한다:
- `REQ-011` → `docs/technical/project-structure-baseline.md`
- `REQ-007` → `docs/technical/python-runtime-and-packaging.md`
- `REQ-012` → `docs/technical/settings-and-env-loading.md`
- `docs/technical/index.md`의 문서 목록과 연관 REQ 표도 문서 생성/연결 변경 사항에 맞게 함께 갱신한다.
- 실제 파일 변경을 수행한 뒤, 변경된 파일과 각 REQ의 승인 확인 결과를 요약한다.
출력 형식:
1. Approval Check
2. Technical Spec Updates
3. Files Changed
4. Remaining Blockers or Notes
@@ -0,0 +1,24 @@
---
description: "Use when: review an SRS requirement for ambiguity, missing acceptance criteria, missing impacted area, and change-log gaps"
name: "Validate Requirement Quality"
argument-hint: "Paste a REQ file or select requirement text"
agent: "agent"
model: "GPT-5 (copilot)"
---
다음 requirement 문서를 검토한다.
입력:
${input}
검토 규칙:
- 기준은 [SRS index](../../docs/SRS/index.md) 와 관련 requirement 문서 구조를 따른다.
- 다음 항목을 우선 검토한다: 모호한 표현, test 불가능한 문장, 누락된 acceptance criteria, 누락된 impacted area, 상태/유형/우선순위/owner 누락, Type이 의사결정 규칙에 따라 정확하게 지정되었는지, Change Log 누락 또는 불일치.
- Type 분류 규칙: 사용자 조작 방식 → Interface, 데이터 저장/구조 → Data, 오류 처리 → Exception & Error Handling, 그 외 → Non-Functional
- 중요한 문제부터 우선순위 순으로 정리한다.
- 문제가 없으면 `No critical findings.` 로 시작한다.
- requirement 본문을 직접 다시 작성하지 말고, 수정 제안 위주로 답한다.
출력 형식:
1. Findings
2. Open Questions
3. Suggested Edits
@@ -0,0 +1,24 @@
## Requirement Traceability
- Requirement ID: REQ-XXX
- Requirement Link: docs/SRS/<Type>/REQ-XXX_<slug>.md
- Related Issue: #
## Acceptance Criteria Coverage
- [ ] AC1: <how this PR satisfies it>
- [ ] AC2: <how this PR satisfies it>
## Test Evidence
- Automated:
- <test command and result summary>
- Manual:
- <verification steps and result>
- If not required: `No manual verification required.`
## Impacted Area Check
- Docs:
- Modules:
- Tests:
## Release Notes Input
- [ ] Added REQ ID to release notes (or tracked release note draft)
+263
View File
@@ -0,0 +1,263 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
KIT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
MERGE_COPILOT_INSTRUCTIONS=0
DRY_RUN=0
PROJECT_ROOT=""
usage() {
cat <<'EOF'
Usage: bootstrap/install.sh [PROJECT_ROOT] [--merge-copilot-instructions] [--dry-run]
Options:
--merge-copilot-instructions Opt-in: safely merge .github/copilot-instructions.md
--dry-run Print planned changes without modifying files
-h, --help Show this help message
EOF
}
log_action() {
local message="$1"
if [[ "$DRY_RUN" -eq 1 ]]; then
echo "[dry-run] $message"
else
echo "$message"
fi
}
run_or_dry() {
if [[ "$DRY_RUN" -eq 1 ]]; then
log_action "$*"
return 0
fi
"$@"
}
while [[ $# -gt 0 ]]; do
case "$1" in
--merge-copilot-instructions)
MERGE_COPILOT_INSTRUCTIONS=1
shift
;;
--dry-run)
DRY_RUN=1
shift
;;
-h|--help)
usage
exit 0
;;
-*)
echo "Unknown option: $1" >&2
usage >&2
exit 1
;;
*)
if [[ -z "$PROJECT_ROOT" ]]; then
PROJECT_ROOT="$1"
shift
else
echo "Unexpected extra argument: $1" >&2
usage >&2
exit 1
fi
;;
esac
done
PROJECT_ROOT="${PROJECT_ROOT:-$(pwd)}"
MANAGED_BEGIN='<!-- BEGIN: myagent-kit (managed - do not edit) -->'
MANAGED_END='<!-- END: myagent-kit -->'
PROJECT_BEGIN='<!-- BEGIN: project-specific (safe to edit) -->'
PROJECT_END='<!-- END: project-specific -->'
count_occurrence() {
local needle="$1"
local file="$2"
grep -cF "$needle" "$file" || true
}
build_managed_block() {
local kit_file="$1"
{
printf '%s\n' "$MANAGED_BEGIN"
cat "$kit_file"
printf '\n%s\n' "$MANAGED_END"
}
}
append_project_section_if_missing() {
local file="$1"
local project_begin_count
local project_end_count
project_begin_count="$(count_occurrence "$PROJECT_BEGIN" "$file")"
project_end_count="$(count_occurrence "$PROJECT_END" "$file")"
if [[ "$project_begin_count" -eq 0 && "$project_end_count" -eq 0 ]]; then
cat >> "$file" <<EOF
$PROJECT_BEGIN
<!-- Add host-project-specific Copilot rules here. -->
$PROJECT_END
EOF
elif [[ "$project_begin_count" -ne "$project_end_count" ]]; then
return 1
fi
}
validate_merged_copilot_file() {
local file="$1"
local managed_begin_count
local managed_end_count
local project_begin_count
local project_end_count
managed_begin_count="$(count_occurrence "$MANAGED_BEGIN" "$file")"
managed_end_count="$(count_occurrence "$MANAGED_END" "$file")"
project_begin_count="$(count_occurrence "$PROJECT_BEGIN" "$file")"
project_end_count="$(count_occurrence "$PROJECT_END" "$file")"
[[ "$managed_begin_count" -eq 1 ]] || return 1
[[ "$managed_end_count" -eq 1 ]] || return 1
[[ "$project_begin_count" -eq 1 ]] || return 1
[[ "$project_end_count" -eq 1 ]] || return 1
}
merge_copilot_instructions() {
local kit_file="$KIT_ROOT/base/.github/copilot-instructions.md"
local host_file="$PROJECT_ROOT/.github/copilot-instructions.md"
local backup_file="$host_file.bak"
local tmp_file
local managed_block
local managed_begin_count
local managed_end_count
if [[ "$MERGE_COPILOT_INSTRUCTIONS" -ne 1 ]]; then
return 0
fi
if [[ ! -f "$kit_file" ]]; then
log_action "Skipped Copilot merge: kit template not found at $kit_file"
return 0
fi
if [[ "$DRY_RUN" -eq 1 ]]; then
if [[ ! -f "$host_file" ]]; then
log_action "Would create and initialize $host_file with managed + project-specific sections"
return 0
fi
managed_begin_count="$(count_occurrence "$MANAGED_BEGIN" "$host_file")"
managed_end_count="$(count_occurrence "$MANAGED_END" "$host_file")"
log_action "Would back up $host_file to $host_file.bak"
if [[ "$managed_begin_count" -eq 1 && "$managed_end_count" -eq 1 ]]; then
log_action "Would update managed myagent-kit section in $host_file"
elif [[ "$managed_begin_count" -eq 0 && "$managed_end_count" -eq 0 ]]; then
log_action "Would append managed myagent-kit section to $host_file"
else
log_action "Would fail: malformed managed marker pair in $host_file"
return 1
fi
local project_begin_count
local project_end_count
project_begin_count="$(count_occurrence "$PROJECT_BEGIN" "$host_file")"
project_end_count="$(count_occurrence "$PROJECT_END" "$host_file")"
if [[ "$project_begin_count" -eq 0 && "$project_end_count" -eq 0 ]]; then
log_action "Would append project-specific editable section to $host_file"
elif [[ "$project_begin_count" -ne "$project_end_count" ]]; then
log_action "Would fail: malformed project-specific marker pair in $host_file"
return 1
fi
return 0
fi
managed_block="$(build_managed_block "$kit_file")"
tmp_file="$(mktemp)"
if [[ ! -f "$host_file" ]]; then
{
printf '%s\n' "$managed_block"
printf '\n%s\n' "$PROJECT_BEGIN"
printf '<!-- Add host-project-specific Copilot rules here. -->\n'
printf '%s\n' "$PROJECT_END"
} > "$host_file"
validate_merged_copilot_file "$host_file"
log_action "Created and initialized $host_file"
rm -f "$tmp_file"
return 0
fi
cp "$host_file" "$backup_file"
managed_begin_count="$(count_occurrence "$MANAGED_BEGIN" "$host_file")"
managed_end_count="$(count_occurrence "$MANAGED_END" "$host_file")"
if [[ "$managed_begin_count" -eq 1 && "$managed_end_count" -eq 1 ]]; then
awk \
-v begin="$MANAGED_BEGIN" \
-v end="$MANAGED_END" \
-v block="$managed_block" '
BEGIN {
in_block = 0
replaced = 0
}
$0 == begin {
if (!replaced) {
print block
replaced = 1
}
in_block = 1
next
}
$0 == end {
in_block = 0
next
}
!in_block {
print
}
END {
if (!replaced) {
print ""
print block
}
}
' "$host_file" > "$tmp_file"
elif [[ "$managed_begin_count" -eq 0 && "$managed_end_count" -eq 0 ]]; then
{
cat "$host_file"
printf '\n%s\n' "$managed_block"
} > "$tmp_file"
else
echo "Malformed managed marker pair in $host_file" >&2
cp "$backup_file" "$host_file"
rm -f "$tmp_file"
return 1
fi
mv "$tmp_file" "$host_file"
append_project_section_if_missing "$host_file"
validate_merged_copilot_file "$host_file"
log_action "Merged $host_file (backup: $backup_file)"
}
run_or_dry mkdir -p "$PROJECT_ROOT/.github/prompts" \
"$PROJECT_ROOT/.github/instructions" \
"$PROJECT_ROOT/.github/ISSUE_TEMPLATE"
run_or_dry cp "$KIT_ROOT/base/.github/prompts/"*.prompt.md "$PROJECT_ROOT/.github/prompts/"
run_or_dry cp "$KIT_ROOT/base/.github/instructions/"*.instructions.md "$PROJECT_ROOT/.github/instructions/"
run_or_dry cp "$KIT_ROOT/base/.github/ISSUE_TEMPLATE/"*.md "$PROJECT_ROOT/.github/ISSUE_TEMPLATE/"
if [[ -f "$KIT_ROOT/base/.github/pull_request_template.md" ]]; then
run_or_dry cp "$KIT_ROOT/base/.github/pull_request_template.md" "$PROJECT_ROOT/.github/pull_request_template.md"
fi
merge_copilot_instructions
log_action "Installed myagent-kit assets into $PROJECT_ROOT/.github"
@@ -0,0 +1,55 @@
# REQ-XXX: <요구사항 제목>
- Status: Proposed | Approved | Implemented | Deprecated
- Type: Interface | Data | Exception & Error Handling | Installation | Configuration | Deployment | Documentation | Integration | Testing | Non-Functional
- Priority: High | Medium | Low
- Owner: <담당자 또는 팀>
## Intent
- <이 요구사항이 필요한 이유와 달성하려는 목표를 1~3문장으로 작성>
## Requirement
- <시스템이 반드시 수행해야 하는 동작을 단정형 문장으로 작성>
## Acceptance Criteria
1. Given <선행 조건>, When <행동>, Then <기대 결과>
2. Given <선행 조건>, When <행동>, Then <기대 결과>
## Impacted Area
- Docs: <영향 받는 문서 경로>
- Modules: <영향 받는 모듈/컴포넌트>
- Tests: <추가/수정해야 하는 테스트>
## Notes
- <가정, 제약, 미해결 이슈>
## Change Log
### CHG-YYYYMMDD-01
- Date: YYYY-MM-DD
- Author: <작성자>
#### Change Summary
- <무엇이 변경되었는지>
#### Intent
- <왜 변경했는지>
#### Acceptance Criteria Delta
- Added:
- <추가된 기준>
- Updated:
- <변경된 기준>
- Removed:
- <삭제된 기준>
#### Impacted Area Delta
- Docs:
- <문서 영향>
- Modules:
- <코드 영향>
- Tests:
- <테스트 영향>
#### Validation Plan
- <검증 방법과 완료 조건>
@@ -0,0 +1,28 @@
# SRS Traceability Matrix
<!--
Usage:
1. Copy this file to docs/SRS/traceability-matrix.md in your target repository.
2. Keep one row per requirement.
3. Update Issue/PR, Test Evidence, and Status whenever implementation progresses.
-->
## Status Definition
- Planned: Requirement is defined but not yet implemented.
- In Progress: Implementation issue/PR exists and work is ongoing.
- Implemented: Code is merged and mapped acceptance criteria are complete.
- Verified: Required tests and manual checks are completed.
- Released: Included in a released version.
## Matrix
| REQ ID | AC Mapping | Requirement File | Implementation Issue | PR | Test Evidence | Requirement Status | Delivery Status | Last Updated |
|---|---|---|---|---|---|---|---|---|
| REQ-001 | AC1, AC2 | docs/SRS/<Type>/REQ-001_<slug>.md | #123 | #456 | tests/... , CI run link | Approved | Planned | YYYY-MM-DD |
## Update Rules
- REQ ID must exactly match the SRS requirement file prefix.
- AC Mapping should reference concrete IDs such as AC1, AC2.
- Test Evidence should point to executable artifacts: test file path, CI job, or manual verification note.
- Last Updated uses YYYY-MM-DD.
- If there is no value yet, use `TBD`.