레고 플랜은(는) 무엇을 하나요?
확정된 변경 사항을 계층적 DAG로 변환합니다: 단순 기본 요소에서 시작하여 완전한 기능에 이릅니다. 계획만 세우고 중단합니다.
그래프는 피라미드입니다: 하단에는 독립적인 블록들, 그 위에는 조합된 블록들, 맨 위에는 하나의 완료 노드가 있습니다. 후속 드라이버는 동일 레이어의 노드를 병렬로 실행하고, status를 변경하며, 이 그래프를 다시 그릴 수 있습니다. 이 스킬은 서브 에이전트를 파견하지 않습니다. 다른 스킬을 로드하지 않습니다.
사용 시기
확정된 변경 사항을 드라이버가 따라갈 수 있는 구현 맵으로 전환해야 할 때 로드합니다.
- 필요: 무엇을 구축할지 이미 결정된 경우. 이 대화에 작업할 파일 목록이나 경로 선택이 이미 있다면 이를 사용합니다. 없다면, 확정된 의도와 코드로부터 파생합니다. 두 번째 시스템 맵을 발명하지 마십시오.
- 건너뜀: 오타, 주석, 포매팅, 코드 없는 문서.
- 의도가 아직 열려 있는 경우: 중단합니다. 변경 사항이 확정될 때까지 질문합니다. 선택되지 않은 기능에 대해 블록을 쌓지 마십시오.
노드 하나도 DAG입니다. 전체 계약을 출력합니다.
하드 게이트
- 계획만. 프로덕션 코드를 작성하지 마십시오. 테스트를 작성하지 마십시오.
done when에 검사를 이름만 적고 여기서 구현하지 마십시오. - 출력 후 중단. 채팅 DAG와 스크래치 파일만 표시합니다. 파견하지 마십시오. 다음 스킬을 로드하지 마십시오.
- 사이클 없음. 블록이 이후 블록에 의존한다면 분할이 잘못된 것입니다. 다시 분할하십시오.
- 승인을 기다리지 마십시오. DAG를 보여주고 중단합니다. 사용자가 잘못된 경우 인터럽트합니다.
- 사용자를 위해 스크래치 파일을 열지 마십시오.
docs/아래에 계획을 작성하지 마십시오.
노드 세분화
그래프 노드 (병렬 단위): 서브 에이전트가 다른 진행 중인 노드를 기다리지 않고 소유할 수 있는 독립적으로 제공 가능한 기본 요소.
예시: write fetchOrder, write OrderCard, wire fetchOrder into the loader.
너무 큼: implement auth. 분할합니다. 너무 작음: rename a variable. 그것이 필요한 노드에 통합합니다.
파트 (노드 내부): 해당 노드가 컴파일되기 위해 함께 배치되어야 하는 함수들. 하나의 서브 에이전트가 순서대로 파트를 수행합니다. 파트를 분기하지 마십시오.
예시 노드 fetch-order:
files:src/fetchOrder.ts,src/fetchOrder.test.tsparts:Order타입, 그 다음fetchOrder, 그 다음src/fetchOrder.test.ts작성 또는 확장- 이러한 파트는 별도의 그래프 노드가 아닙니다.
그래프 형태
- 레이어 0:
depends on: none인 노드. 드라이버가 모두 병렬로 실행할 수 있습니다. - 레이어 N: 모든 의존성이 이전 레이어에 있는 노드.
- 마지막 레이어: 기능이 종단 간 작동함을 의미하는 하나의 노드(또는 밀접한 집합).
- 서로 의존하지 않는 두 노드는 반드시 동일한 레이어를 공유해야 합니다(또는 서로 기다리지 않는 레이어에 위치해야 함).
depends on은 노드 id를 나열하며, 파일 이름을 나열하지 않습니다.
동일 파일: 두 노드가 동일한 경로를 생성하거나 편집하는 경우, 동일한 레이어를 공유해서는 안 됩니다. 병합하거나 depends on 엣지를 추가하여 하나가 기다리게 하십시오. 병렬 실행을 위해 파일을 분할하지 마십시오. 경로를 읽기만 하는 두 노드는 동일한 레이어를 공유할 수 있습니다. files는 생성 또는 편집 경로만 나열합니다. 동일 파일 규칙에는 테스트 파일도 포함됩니다.
노드 필드
모든 노드는 다음 일곱 가지 필드를 갖습니다:
- id: 케밥 케이스, 이 계획 내에서 고유하며 안정적입니다(후속 드라이버가 이 id를 완료로 표시합니다).
- name: 짧은 영어 이름.
- depends on: 다른 id 또는
none. - files: 생성 또는 편집할 경로입니다.
done when의 테스트 경로를 포함합니다. - parts: 순서 있는 C 목록. 마지막 파트는 해당 테스트를 작성하거나 확장하는 것입니다.
done when이 수동 검사이고 테스트 파일이 없는 경우, 마지막 파트는 해당 검사이며files에는 테스트 경로가 없습니다. - done when: 드라이버가 의존성을 시작하기 전에 실행할 수 있는 테스트 파일 또는 명령어.
- status: 이 스킬은 항상
pending을 작성합니다. 후속 드라이버가in-progress또는done을 설정할 수 있습니다. 이 스킬은 결코 이 두 값을 작성하지 않습니다.
계획에 전체 소스 코드를 넣지 마십시오.
라이브 보드
경로: <repo>/.agent/scratch/lego-plan.json
채팅 펜스와 동일한 JSON입니다. 에이전트는 이 파일을 따릅니다. 사용자 대상 제품은 채팅 그림입니다.
- 필요한 경우
.agent/scratch/를 생성합니다. - 항상 덮어씁니다. 기존 노드가
in-progress또는done이더라도 묻지 마십시오. - 저장소에 git이 있는 경우,
.gitignore에.agent/scratch/가 포함되어 있는지 확인합니다..gitignore가 존재하고 해당 줄이 없으면 추가합니다..gitignore가 없으면 해당 한 줄로 생성합니다. - 파일을 열지 마십시오. 채팅에 두 번째 사본으로 덤프하지 마십시오. JSON 펜스가 사용자가 보는 사본입니다.
절차
절차 1: 확정된 변경 사항 확인
- 변경 사항이 명확하면 계속합니다.
- 사용자가 여전히 원하는 것을 선택하고 있다면 중단합니다. 질문합니다. 확정된 후 여기로 돌아옵니다.
절차 2: 세션에 이미 있는 입력 수집
- 이 대화에 이미 완료 기준 파일 목록, 파트 또는 경로 선택이 있다면, 이를 시작 집합으로 사용합니다.
- 그렇지 않으면, 확정된 의도와 파일 이름을 지정하기 위해 읽어야 하는 코드로부터 블록을 파생합니다. 전체 저장소를 둘러보지 마십시오.
절차 3: 노드와 파트로 분할
- 후보 기본 요소(B 세분화)를 나열합니다.
- 각 기본 요소에 대해 함께 컴파일되어야 하는 C-파트를 나열합니다. 테스트(또는 수동 검사)를 작성하거나 확장하는 것으로 끝냅니다.
depends on을 그립니다: 노드는 다른 노드의 결과를 호출하거나 포함하는 경우에만 그 노드에 의존합니다.- 의존성으로부터 레이어를 할당합니다. 독립적인 노드는 동일한 레이어에 배치합니다.
- 두 노드가 동일한 경로를 생성하거나 편집하고 동일한 레이어를 공유하는 경우, 병합하거나 엣지를 추가합니다. 그런 다음 레이어를 재할당합니다.
- 사이클이 나타나면, 잘못된 노드를 분할하고 이 절차를 반복합니다.
절차 4: 각 노드 채우기
일곱 개의 필드를 채웁니다. 모든 노드의 status는 pending입니다.
절차 5: 채팅에 DAG 표시
다음 순서로 표시합니다:
- 레이어: 레이어 0부터 마지막까지. 각 레이어 아래에 해당 레이어의 노드들.
- 노드: 각 id에 대한 일곱 개의 필드.
- Mermaid: 항상. 하나의
flowchart(또는graph TD). 다이어그램의 노드 id는 계획 id와 일치해야 합니다.classDef없음. 상태 색상 없음. 모든 노드는 pending입니다. - JSON 펜스: 라이브 보드 객체가 포함된
json블록. id, 의존성, 파일, 파트,doneWhen및status의 진실 공급원. 레이어는depends에서 파생됩니다.layer필드를 저장하지 마십시오.
그런 다음 절차 6을 수행합니다.
Mermaid 형식:
flowchart TD
fetch-order[fetch-order]
order-card[order-card]
wire-loader[wire-loader]
fetch-order --> wire-loader
order-card --> wire-loader
동일 레이어 노드 사이에는 엣지가 없습니다.
JSON 형식:
{
"version": 1,
"nodes": [
{
"id": "fetch-order",
"name": "fetch order",
"depends": [],
"files": ["src/fetchOrder.ts", "src/fetchOrder.test.ts"],
"parts": ["Order type", "fetchOrder", "write or extend src/fetchOrder.test.ts"],
"doneWhen": "pnpm test src/fetchOrder.test.ts",
"status": "pending"
}
]
}
depends는 id의 배열입니다. 빈 배열은 없음을 의미합니다.
절차 6: 라이브 보드 작성
- 동일한 JSON을
.agent/scratch/lego-plan.json에 씁니다(덮어쓰기). - 라이브 보드에서 설명한 대로
.gitignore가.agent/scratch/를 무시하는지 확인합니다. - 파일을 열지 마십시오.
절차 7: 중단
절차 6 이후 중단합니다. 코드를 작성하지 마십시오. 파견하지 마십시오. 다른 스킬을 로드하지 마십시오.
의사 결정 트리
- 의도가 확정되지 않음 → 절차 1.
- 확정된 변경 사항, 구현 맵 필요 → 절차 2 → 3 → 4 → 5 → 6 → 7.
- 노드 하나 → 여전히 절차 2 → 7 (전체 계약).
- 오타 / 포맷 / 문서 전용 → 이 스킬이 적용되지 않습니다.
- 의존성에 사이클 → 절차 3 단계 6.
- 동일 레이어의 두 노드가 동일한 경로를 편집함 → 절차 3 단계 5.
- 노드가 "전체 기능 구현"임 → 분할 (절차 3).
레드 플래그
| 신호 | 의미 | 대신 할 것 |
|---|---|---|
| 이 스킬에서 fetch 함수 작성 | 계획이 구현이 됨 | 절차 7. 중단. |
| 레이어가 없는 하나의 선형 목록 | 분기 불가능 | 독립 노드를 동일한 레이어에 배치. |
| 여기서 서브 에이전트 파견 | 잎이 드라이버가 됨 | 절차 7. 중단. |
| Mermaid id가 노드 id와 다름 | 드라이버가 완료 표시 불가능 | 두 곳 모두 동일한 케밥 케이스 id 사용. |
| JSON 펜스가 스크래치 파일과 다름 | 두 개의 진실 공급원 | 하나의 객체를 작성. 두 곳 모두에 복사. |
사이클 (a → b → a) | 분할이 잘못됨 | 분할 및 레이어 재할당. |
동일 레이어의 두 노드가 order.ts 편집 | 병렬 쓰기 충돌 | 병합하거나 depends on 엣지 추가. |
| 두 노드가 병렬 실행될 수 있도록 파일 분할 | 요청되지 않은 설계 | 파일 유지. 노드 순서 지정. |
files / 마지막 파트에 테스트 경로 누락 | 노드 제공 불가능 | 절차 3 단계 2. |
계획 Mermaid에 classDef 또는 상태 색상 | 이 스킬이 진행 상황을 그림 | 스타일 없음. 모두 pending. |
| 하나의 노드 파트가 독립적으로 컴파일될 수 없는 병렬 노드로 분할됨 | C가 B로 취급됨 | 해당 파트를 하나의 노드 내에 유지. |
| "Implement auth"가 단일 노드 | 너무 큼 | 기본 요소로 분할. |
| "괜찮아 보이나요?" 대기 | 게이트는 보여주고 중단 | 출력하고 중단. |
| 스크래치 파일 덮어쓰기 전 질문 | 라이브 보드는 하나의 슬롯 | 절차 6. 덮어쓰기. |
.agent/scratch/lego-plan.json 열기 | 사용자 대상 추가 | 채팅만. 파일은 에이전트용. |
docs/lego-plan.md 작성 | 추가 산출물 | 채팅 + 스크래치. docs 계획 파일 없음. |
오류 처리
- 세션에 작업할 파일 목록 없음: 의도와 대상 읽기에서 파생. 파일 이름을 지정할 수 없으면 중단하고 무엇이 누락되었는지 말합니다. 경로를 발명하지 마십시오.
- 사이클: id로 사이클을 보고합니다. 분할합니다. 절차 3을 다시 실행합니다. 사이클릭 Mermaid를 계획으로 표시하지 마십시오.
- 마지막 레이어가 기능이 작동함을 의미하지 않음: 구성된 조각(와이어 업)에 의존하는 완료 노드를 추가하거나, 현재 마지막 레이어가 이미 종단 간 경로인 이유를 설명합니다.
- 사용자가 노드가 잘못되었다고 인터럽트: 해당 노드와 이를 가리키는 모든
depends on을 편집합니다. 노드가 여전히 존재하면 id를 안정적으로 유지합니다. 노드를 삭제하면 Mermaid와 JSON에서도 제거합니다. 스크래치 파일을 덮어씁니다. DAG를 다시 표시합니다. 중단합니다. done when이 모호함 ("it works"): 명령어 또는 테스트 경로로 대체합니다. 프로젝트에 아직 테스트 명령어가 없으면 한 줄로 수동 검사를 이름만 지정합니다. 마지막 파트는 해당 검사입니다.- git 저장소가 아님: 작업 공간이 쓰기 가능한 경우에도
.agent/scratch/lego-plan.json을 작성합니다. gitignore 단계는 건너뜁니다. 채팅에서 한 줄로 말합니다. - 스크래치 쓰기 실패 (권한, 디스크): 여전히 채팅 DAG와 JSON 펜스를 표시합니다. 라이브 보드가 작성되지 않았다고 말합니다. 파일이 존재하는 척하지 마십시오.
- 기존 스크래치 JSON이 유효하지 않거나 실행 중: 덮어씁니다. 병합하지 마십시오. 묻지 마십시오.