공유 정책 위치: docs/DISCOVERY.md, docs/WORKFLOW.md,
docs/LAUNCH-MIGRATION.md, docs/STANDALONE-ENTRY.md, docs/PROCESS.md, docs/using/README.md, docs/using/mirrors.md는 해결된 Hatsu 플러그인 루트에 속하며, 소비 저장소에 속하지 않습니다. 설치된 서피스에서는 ten이 출력한 절대 루트를 사용하여 해당 파일을 읽습니다(해당 스킬을 통해 다시 해결). 아래의 상대 링크는 소스 위치를 식별합니다. 소비자 docs/ 복사본이 없다고 해서 정책이 누락된 것이 아니며, 중복 신고를 트리거해서는 안 됩니다. 대상 저장소에 두 번째 정책을 복사하거나 작성하지 마십시오.
Ao — 브랜치, 최신 상태로
성질: 조작계. 기본 브랜치에 대해 브랜치를 조정하는 것은 git 측의 작업이며, 당신만의 작업이 아닙니다. 어떤 성질이 diff를 작성했든 상관없습니다.
기본 브랜치를 내 아래에 두고, 텍스트만 해결하고, 의미가 있는 것은 나에게 넘겨라.
Ao는 $murasaki의 첫 번째 단계, $aka의 세 번째 단계,
그리고 $en이 PR이 뒤처졌을 때 실행하는 단계입니다. 또한 단독으로 호출할 수도 있습니다.
이 스킬의 전체 규율은 하나의 구분 — 텍스트 대 의미(text versus meaning) — 과 하나의 거절로 이루어져 있습니다. 즉, 자신이 생성한 것을 절대 푸시하지 않습니다.
0. 단독 진입점 — 이미 완전함
Ao는 이미 호출자가 아닌 체크아웃을 읽습니다. § 2는 아무 작업 전에 상태를 읽고, § 3은 퍼블리시된 것이 있는지 여부에 따라 리베이스 대 머지를 결정하며, from <base>는 nen/workflow.json → branch.base 아래에 기본 브랜치를 전달합니다. docs/STANDALONE-ENTRY.md § 4는 이를 이미 완전한 것으로 나열합니다. 적용되는 절은 P1 — 복합 실행기가 실행하지 않은 경우 $ten ao가 이 단계의 전제 조건을 따라잡음(ten § 6) — 그리고 가져온 origin/ ref에 대해 기본 브랜치를 해결하는 것(§ 3에서 이미 요구함)입니다.
단독 호출에 대해 § 6이 완화되지 않습니다: 의미적 충돌은 양쪽을 모두 보여주는 G5 중단이며, 실행을 계속 진행시키는 쪽을 선택하여 해결되지 않습니다. Ao는 여전히 절대 푸시하지 않고, 절대 포스 푸시하지 않으며, 이미 리모트에 있는 커밋을 절대 다시 쓰지 않습니다.
반환. 연결된 실행에서 다음: 브랜치를 최신 상태로 필요로 했던 호출자 —
$murasaki, $aka 또는 $en. 아무것도 푸시되지 않았으며, 이 따라잡기 전에 수집된 증거는 추적된 경로가 이동했다면 유효하지 않습니다.
1. 호출
$ao [from <base>]
nen parse ao --grammar "from [<base>]" --line "<호출, $ao 접두사 제외>"
v0.3.0(docs/ab/ao.md § 2.1)에서 라이브 검증됨: from release/1.4 → base: release/1.4; 빈 from은 절이 없는 것으로 구문 분석되며, 종료 코드 0입니다. 이 절은 $spiritual-message § 1에 기록된 이유로 리터럴 뒤에 고정됩니다.
**절이 없으면 기본 브랜치는 nen/workflow.json → branch.base이며, 키나 파일이 없으면 기본값은 main**입니다. 가져오기 전에 기본 브랜치를 이름으로 명시하십시오. 잘못된 기본 브랜치에 대해 조용히 따라잡힌 브랜치는 나중에 아무도 읽을 수 없는 diff입니다.
누락된 인수 또는 설정 항목은 인라인으로 요청하고 설정합니다(missing-argument, missing-configuration, WORKFLOW.md § 4 요청, 설정, 계속).
2. 먼저 체크아웃 읽기
nen wc classify --repo <path> --base <base> --json
v0.3.0(docs/ab/ao.md § 2.2)에서 라이브 검증됨, --json은 이 스킬이 아무것도 건드리기 전에 필요한 정확한 정보를 전달합니다: state.branch, state.isTrunk, state.dirty, state.aheadOfBase, state.existingCommitSubjects[], state.uncommittedPaths[].
nen wc classify 케이스 | Ao가 수행하는 작업 |
|---|---|
must-move — 트렁크에 있음 | 거절. 따라잡을 것이 없습니다: 트렁크 자체가 기본 브랜치입니다. 그렇게 말하고 호출자를 $breath 또는 $tensho 중 상황에 맞는 쪽에 넘깁니다 |
on-branch-dirty | 거절하며, 명령어가 출력한 커밋되지 않은 경로를 이름으로 지정합니다. 커밋되지 않은 작업 위의 머지 또는 리베이스는 git 자체에서 거절하거나 아무도 풀 수 없는 충돌 속에 작업을 묻어버립니다. 커밋($kokusen)하거나 의도적으로 스태시한 후 다시 실행하십시오 |
on-branch-clean | § 3으로 진행 |
nen wc classify는 충돌 감지기가 아니며, 완료되지 않은 머지는 일반적인 쓰레기로 읽힙니다 — 라이브 검증됨(docs/ab/ao.md§ 2.2). 해결되지 않은 머지 내에서 실행하면 충돌 경로를 "커밋되지 않은 경로"에 포함하여on-branch-dirty를 보고하며, 진행 중인 머지에 대해 아무것도 말하지 않습니다. 따라서 분류하기 전에 git에 먼저 물어보십시오. 디스크의.git/에서 하지 마십시오(연결된 워크트리에서.git은 파일입니다):git rev-parse -q --verify MERGE_HEAD가 해결되거나,git rebase --show-current-patch가 종료 코드0으로 종료되면(패치에서 중단된 리베이스: 충돌 또는edit중단) 이전 작업이 여기서 중단되었음을 의미하며, 이 실행은 해당 상태를 보고하고 아무것도 시작하지 않습니다 — 그 위에 두 번째 작업을 절대 수행하지 않으며, 여기서wc catch-up을 다시 실행하지 않습니다. 그러면 git의 기본 메시지와 재증명되지 않은 빌드(§ 5)로 머지를 커밋하게 됩니다. 프로브의 다른 답변:1(현재 패치 없이 일시 중지된 리베이스,break또는 실패한exec에서)은 ao의 것이 아니므로, 실행은 git 자체의--continue/--abort로 보고하고 여기서 중단됩니다. 따라잡기가 이를 거절하는 것에 의존하지 않습니다. nen 0.18.0 또는 0.18.1에 있는 호스트는 그렇게 하지 않기 때문입니다(zheref/hatsu#182).128은 리베이스가 아니므로 분류합니다. 다른 모든 것은 § 3의 응답되지 않은 프로브 행에 남겨둡니다.
3. 어떤 작업 — 리베이스 또는 머지, 퍼블리시된 것이 있는지 여부로 결정
이 브랜치에 아무것도 퍼블리시되지 않았으면 리베이스합니다. 무언가 퍼블리시되었으면 머지합니다. 다른 사람이 이미 가져왔을 수 있는 커밋을 다시 쓰는 것은 다른 사람의 작업을 소모시키는 유일한 git 작업이며, 로컬 플레인은 절대 그렇게 하지 않습니다.
nen wc catch-up --repo <path> --base <base> [--strategy rebase|merge|auto] [--dry-run] [--json]
이 명령어는 먼저 가져온 다음 결정하며, 결정은 origin이 지금 말하는 것을 기준으로 이루어집니다.
이 체크아웃이 마지막으로 들은 것을 기준으로 하지 않습니다. auto(ao가 전달하는 값)는 브랜치의 어떤 것도 @{upstream}에 없으면 리베이스하고, 그렇지 않으면 머지합니다. --strategy rebase|merge는 호출자에게 이유가 있고 명시적으로 말한 경우에만 하나를 지정합니다. 종료 코드 0은
{base, strategy, before, after, behindBefore, aheadBefore, noOp}를 보고하며, noOp: true여도 두 SHA와 함께 보고되며, "할 일 없음"으로 보고되지 않습니다. 다른 모든 종료 코드는 nen v0.20.0 기준:
| 종료 코드 | 설명 | Ao의 동작 |
|---|---|---|
1, 그리고 conflicted[]가 비어 있지 않은 보고서 | 충돌; 중단 라인이 출력됨 | § 4가 인계받음 |
3, conflicted[] 경로가 모두 nen/contract.json의 최상위 mechanical 블록(v0.20.0)에 있는 보고서 | nen이 매니페스트, 체인지로그 또는 미러로 분류한 충돌; 중단 라인과 각 클래스의 명령어가 출력되지만 실행되지 않음 | § 4가 인계받으며, nen의 클래스와 명령어를 증거로 인용; § 4는 여전히 모든 경로를 자체적으로 분류함 |
1, 보고서 없음 | 가져오기, 상태 또는 HEAD 읽기 실패, 충돌 없이 리베이스 또는 머지 실패, 또는 --continue 실패 | 중단: nen의 stderr 문장을 그대로 인용하고, 트리는 git이 남긴 그대로라고 말함; 절대 § 4로 가지 않음 |
2, break 또는 실패한 exec(v0.18.2)에서 일시 중지된 리베이스 | ao의 리베이스가 아님 | nen의 문장을 인용하고, git rebase --continue / --abort를 언급함; 계속하거나 중단하지 않음 |
2, git이 응답하지 않은 리베이스 프로브(v0.18.2) | 리베이스가 전혀 없을 수 있음 | nen의 문장을 인용하고 중단하며, 어떤 git 명령어도 언급하지 않음 |
2, 다른 모든 것 | 변형 전 거부: 더티 트리, --base를 git이 거부, --strategy가 진행 중인 작업과 충돌, --end-of-options에 너무 오래된 git, 저장소 루트 없음 | 그대로 인용하고 중단 |
| 다른 종료 코드 | 예상치 못함 | 중단하고 인용 |
strategy: merge→ 브랜치가 리모트에 존재함 → 기본 브랜치가 머지됨.strategy: rebase→ 아무것도 퍼블리시되지 않음 → 브랜치가origin/<base>위로 재생됨.
리베이스할 것이 없어도 리베이스는 SHA를 다시 쓰며, 이는 예상된 동작입니다. 라이브 검증됨: 이미
origin/<base>의 팁 위에 있는 브랜치가 "Successfully rebased and updated"라고 응답하고HEAD를c8826c7에서84b0444로 이동시켰습니다 — 동일한 트리, 동일한 메시지, 새로운 커밋 객체입니다. 리베이스가 필요하지 않음을 인지하지 않고 커밋을 재생하기 때문입니다. 여기서는 해롭지 않으며 오직 여기서만 해롭지 않습니다: § 3은 오직 퍼블리시되지 않은 브랜치만 리베이스하므로, 다시 쓰여진 커밋은 아무도 가져오지 않은 것입니다. "할 일 없음"으로 보고하는 것은 해롭습니다 — § 7은 기본 브랜치와 그 해결된 SHA를 요청하며,HEAD가 이동했는데 변경 없음이라고 말하는 실행은 이후의 모든 이전 SHA 참조를 조용히 잘못되게 만듭니다.
명령어가 선택한 것과 그 이유를 한 줄로 보고서에서 말하고, 갱신을 이름으로 지정하십시오:
"origin을 가져왔습니다; 브랜치가 @{upstream}에 있으므로 strategy: merge이며, 리베이스가 아닙니다."
nen
0.5에서 폐기,0.13에서 대체됨. 머지 부분은nen pr cascade-main --repo <path> --trunk <base> --no-push(v0.5.0,docs/ab/ao.md§ Retired at nen 0.5에서 라이브 검증됨)를 통해 실행되었고, 리베이스 부분은 어떤 플래그에도 명령어가 없었습니다. 두 부분 모두 이제nen wc catch-up의 것이며, 절대 푸시하지 않습니다.cascade-main은--no-push를 포함하여 izanami의 자동화 테이블에mutating행을 유지하지만, 더 이상 ao가 호출하는 대상이 아닙니다.
4. 해결하기 전에 모든 충돌 경로 분류
git -C <path> status --porcelain # 충돌 행
git -C <path> diff --name-only --diff-filter=U # 충돌 경로만
git -C <path> ls-files -u # 각 경로의 스테이지
각각 하나씩 포함하도록 구성된 픽스처에 대해 라이브 검증됨(docs/ab/ao.md § 2.4):
| Porcelain | 종류 | 존재하는 스테이지 |
|---|---|---|
UU | both-modified — 양쪽이 동일한 파일을 변경함 | 1 기본, 2 ours, 3 theirs |
AA | add-add — 양쪽이 동일한 경로를 생성함 | 2 ours, 3 theirs; 기본 없음 |
UD / DU | delete-modify — 한쪽이 다른 쪽이 편집한 것을 삭제함 | 살아남은 쪽만 |
DD, AU, UA | 더 드문 형태; 동일한 표로 분류하고 이름을 지정 | git이 보고하는 대로 |
nen wc catch-up --json은 종료 코드1또는3에서conflicted[]를 전달하며, 병합되지 않은 각 경로당 하나의 항목으로ours와theirs를 그대로 포함합니다(그리고nen.wc.catch-up/v0.2부터는 nen의class도 포함). 전달하지 않는 것은 종류이므로, 위의 porcelain 표는 여전히 그것을 위해 읽으며, § 6은 명령어가 출력한 대로ours/theirs를 정확히 보여줍니다. 명령어의 자체 규칙은 그것이 도달하는 곳에서 인용할 가치가 있는 규칙입니다: 절대 한쪽을 선택하지 않습니다.
어느 것도 해결하기 전에 모든 경로를 분류하고, 표를 출력하십시오. 처음 세 개를 해결하고 네 번째가 의미적임을 발견한 실행은 이미 유지보수자의 신뢰를 처음 세 개에서 소모했습니다.
5. 기계적, 또는 의미적
기계적(Mechanical) — 해결은 저장소에 의해 결정되며, 누군가에 의해 선택되지 않습니다:
- 양쪽이 추가한 추가 전용 영역(임포트 블록,
.gitignore, 체인지로그 목록) — 파일 자체의 관례에 따라 순서대로 둘 다 유지; - 저장소가 재생성하는 생성되거나 잠긴 파일(락파일, 스냅샷, 미러) — 기본 쪽을 취하고 재생성(Hatsu 미러:
bash scripts/surface_mirror_regenerate.sh), 그런 다음 선언된 빌드(nen shu build; 종료 표는$rasengan§ 6의 것)로 증명; - 동작 차이가 없는 순수한 포맷팅 또는 공백 차이;
- 양쪽에서 동일하게 이루어진 변경.
Hatsu 버전 충돌은 깨끗한 따라잡기에서 살아남을 수 있습니다: 병렬 브랜치가 동일한 번호를 선택했을 수 있습니다. 모든 따라잡기 후에 두 실제 매니페스트(.claude-plugin/plugin.json 및 .codex-plugin/plugin.json)를 새로운 기본 브랜치와 비교하십시오. 브랜치의 버전이 기본 브랜치의 버전보다 같거나 낮으면, 준비 전에 둘 다 기본 브랜치보다 엄격히 위인 동일한 버전으로 다시 범프하십시오. 이 작업의 기존 changelog.d/ 조각에서 버전 줄도 업데이트하십시오. 이는 Hatsu 저작이며, 자동 nen wc catch-up 재범프가 아닙니다. 다음 버전이 결정된 후 bash scripts/plugin_version_refs.sh --from <old> --to <new> --body-file <local-draft>를 실행하여 추적된 참조와 초안 줄을 나열하십시오. --write를 추가하여 선언된 추적 형태와 모호하지 않은 초안 줄의 모든 정확한 이전 버전 토큰을 다시 쓰십시오. 변경되지 않은 출력된 review 줄을 읽으십시오. 도우미는 버전을 선택하지 않으며, 생성된 미러를 다시 쓰거나 원격 PR을 편집하지 않습니다. 위의 명령어로 미러를 재생성한 다음, 따라잡기에 의해 무효화된 본문 사실을 새로 고치십시오:
| 본문 사실 | 따라잡기 후 재유도 |
|---|---|
| 플러그인 버전 | 범프를 커밋한 후 git show HEAD:.claude-plugin/plugin.json 및 git show HEAD:.codex-plugin/plugin.json |
| 헤드 및 기본 커밋 | 최종 커밋 및 가져오기 후 git rev-parse HEAD origin/<base> |
| 기본 브랜치에 대해 측정된 수치(바이트, diff, 커버리지, 리뷰 증거) | 해당 새로운 기본 브랜치와 최종 헤드에 대해 재측정 |
| Drive 줄의 PR 번호 | gh pr list --repo <owner/name> --state open --head <branch> --json number,url; 반환된 현재 PR을 사용 |
| 체인지로그 조각 전제 조건 줄 | 따라잡힌 의존성 계약 및 이 작업의 실제 전제 조건에 대해 재측정 |
새로 고쳐진 로컬 초안을 검토한 다음, nen pr edit-body를 원격 작성자로 사용하십시오.
새로운 기본 브랜치에 대해 범프 검사를 다시 실행하십시오. 원래 브랜치 지점은 이 비교를 증명할 수 없습니다.
의미적(Semantic) — 사람이 한 의도를 다른 의도보다 선호해야 하는 모든 것. UD/DU는 항상 의미적입니다: "삭제됨"과 "여전히 편집 중"은 어떤 것이 존재하는지에 대한 두 가지 믿음이며, 어떤 머지 알고리즘도 그 믿음을 보유하지 않습니다. 양쪽이 동일한 동작을 변경한 UU와 두 파일이 동일한 파일이 아닌 AA도 마찬가지입니다.
교과서적인 경우, 라이브 검증됨(
docs/ab/ao.md§ 2.5):DU— 한쪽은 여전히 파일을 편집 중이고, 다른 쪽은 더 이상 존재하지 않는다고 생각합니다.keep ours,keep theirs,keep both중 어느 쪽도 선택되지 않습니다. 양쪽 내용이conflicted아래에 인쇄되며, 명령어는 절대 한쪽을 선택하지 않는다는 메모와 함께 인쇄됩니다. § 6의 G5 중단은ours와theirs를 그대로 보여줍니다.
...
[이하 생략]