crumbs-spec 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +101 -94
- package/README.md +86 -79
- package/dist/src/graph.js +6 -1
- package/dist/src/graph.js.map +1 -1
- package/dist/src/init.js +4 -4
- package/dist/src/init.js.map +1 -1
- package/dist/src/messages.js +2 -2
- package/dist/src/messages.js.map +1 -1
- package/dist/src/templates/agents.js +2 -2
- package/dist/src/templates/agents.js.map +1 -1
- package/dist/src/templates/en.js +1 -1
- package/dist/src/templates/en.js.map +1 -1
- package/dist/src/templates/ko.js +1 -1
- package/dist/src/templates/ko.js.map +1 -1
- package/dist/src/templates/skills-en.js +4 -4
- package/dist/src/templates/skills-en.js.map +1 -1
- package/dist/src/templates/skills-ko.js +4 -4
- package/dist/src/templates/skills-ko.js.map +1 -1
- package/package.json +2 -2
package/README.ko.md
CHANGED
|
@@ -44,34 +44,35 @@ LLM Wiki에서는 원본/위키/스키마 분리, 인덱스 우선, 추가 전
|
|
|
44
44
|
- **결정은 한 곳에.** 질문이 답을 얻으면 로그에 `decision` 항목을 남기고 문서는 날짜 링크 하나로 그 결정을 가리켜요.
|
|
45
45
|
- **두 언어.** `crumbs.json`의 `lang`이 저장소 전체의 템플릿, 스킬, 메시지, AGENTS 블록 언어를 정해요. 기본값은 영어(`en`)이고 `ko`를 쓰면 한국어가 돼요.
|
|
46
46
|
|
|
47
|
-
##
|
|
47
|
+
## 처음 보는 코드에서도 맞게 쓸까요? (RealWorld 실험)
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
[RealWorld](https://github.com/realworld-apps/realworld) "Conduit" API를 구현한 공개 백엔드 두 개에 writer 스킬을 돌리고, 그 프로젝트의 공식 API 테스트로 문서를 채점했어요. 생성된 문서, 프롬프트, 정답지, 채점 행은 모두 [crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit)에 공개했어요.
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
- **준비.** 같은 API를 구현한 두 저장소를 커밋으로 고정했어요. [Nitro + Prisma](https://github.com/realworld-apps/nitro-prisma-zod-realworld-example-app)(TypeScript)와 [Django Ninja](https://github.com/c4ffein/realworld-django-ninja)(Python)예요. 구현체마다 Opus 5.5 에이전트 하나가 코드와 테스트만 보고 문서를 썼어요. 쓰는 동안 실험 저장소에는 공식 스펙 저장소가 없었고, 나중 커밋에서 추가했어요.
|
|
52
|
+
- **정답지.** 두 구현체가 고정해 둔 버전의 공식 Hurl 테스트에서 요청 하나를 한 행으로 삼았어요. 준비·정리 요청을 빼면 130행이에요.
|
|
53
|
+
- **채점.** 다른 모델(Sonnet 5.5)이 모든 행을 채점했어요. `correct`는 상태 코드와 검증하는 값을 문서가 모두 적은 경우, `partial`은 하나라도 빠진 경우, `wrong`은 문서가 반대로 적은 경우, `missing`은 다룬 문서가 없는 경우예요. 정책마다 코드와도 대조했어요.
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
| | Nitro + Prisma | Django Ninja |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| 저장소의 코드 / 테스트 | 약 1,400줄 / 단위 테스트 파일 2개 | 약 2,300줄 / 앱마다 엔드포인트 테스트 |
|
|
58
|
+
| 문서 / 정책 | 28 / 51 | 26 / 91 |
|
|
59
|
+
| 테스트로 확정된 정책 / 질문으로 남긴 정책 | 6 / 45 | 50 / 41 |
|
|
60
|
+
| 공식 테스트 행 정답 | **125 / 130** | **116 / 130** |
|
|
61
|
+
| 부분 / 오답 / 누락 | 5 / 0 / 0 | 14 / 0 / 0 |
|
|
62
|
+
| 지어낸 정책(코드에 없는 것) | 0 | 0 |
|
|
63
|
+
| 일부를 과장한 정책 | 1 | 6 |
|
|
64
|
+
| writer 토큰 / 걸린 시간 | 16.5만 / 2시간 40분 | 20.2만 / 2시간 47분 |
|
|
62
65
|
|
|
63
|
-
|
|
66
|
+
- **공식 테스트와 어긋난 문장도, 지어낸 정책도 없었어요.** 놓친 것은 모두 세부가 빠진 경우예요. Nitro의 부분 정답 5개는 문서가 다루지 않은 `null` 입력과 태그 순서예요. Django의 14개 중 12개는 질문 하나에서 나왔어요. 앱의 오류 처리기와 테스트가 401 응답 본문을 다르게 보여서 writer가 둘 다 적고 질문으로 남겼어요.
|
|
67
|
+
- **질문이 붙은 서술도 대부분 맞았어요.** 아직 `[needs confirmation]`이 붙은 서술만으로 정답 판정을 받은 행이 Nitro 12개, Django 32개예요. "지금은 이렇게 동작해요"에 질문을 붙이는 방식이 테스트가 증명하는 범위를 넘지 않으면서도 문서를 쓸모 있게 했어요.
|
|
68
|
+
- **테스트가 적으면 질문이 많아져요.** Nitro는 단위 테스트 파일이 2개뿐이라 정책 51개 중 45개가 질문으로 남았어요. 그중 29개는 공식 테스트가 답해 주는데, 관리자가 먼저 확정할 목록이 바로 이거예요.
|
|
69
|
+
- **공식 테스트가 다루지 않는 문제도 질문으로 올렸어요.** Django의 글 목록은 토큰을 읽지 않고 세션 사용자를 보고, `createUser` 명령은 마이그레이션에서 이름이 바뀐 필드로 사용자를 찾아요. Nitro 문서는 이메일 형식을 검사하지 않는다고도 그대로 적었는데, 공식 테스트의 더 새 버전은 이걸 검사해요.
|
|
64
70
|
|
|
65
|
-
|
|
71
|
+
한계도 있어요. 구현체마다 한 번씩, writer 모델 하나로 돌렸어요. 채점자도 모델이라 작성자가 인용된 앵커가 모두 있는지 확인하고 일부 행을 직접 대조했어요. RealWorld는 널리 알려진 프로젝트라 저장소에 스펙이 없어도 writer가 학습 중에 봤을 수 있어요. 공식 테스트는 문서 내용의 일부만 검증해서, Nitro 정책 20개와 Django 정책 41개는 코드와만 대조했어요. Django 채점자는 의존성 버전을 고정하지 않고 코드를 실행했기 때문에 "일부 과장" 판정 중 몇 개는 라이브러리 버전에 따라 달라질 수 있어요.
|
|
66
72
|
|
|
67
|
-
|
|
68
|
-
|---|---|---|
|
|
69
|
-
| 정답 | 17 / 18 (부분 1) | 15 / 18 (부분 3) |
|
|
70
|
-
| 읽은 파일 수 합계 | 70 (평균 3.9, 최대 8) | 64 (평균 3.6, 최대 6) |
|
|
71
|
-
| 검색(grep)으로 떨어진 횟수 | 3 | 1 |
|
|
72
|
-
| 토큰 합계 | 232만 | 189만 (−18%) |
|
|
73
|
+
### 앞서 비공개 앱에서 돌린 결과 (일화)
|
|
73
74
|
|
|
74
|
-
기존
|
|
75
|
+
이 실험 전에 비공개 앱의 세 영역(코드 약 4만 줄)을 다시 쓰고, 기존 스펙 체계와 crumbs에 같은 질문 18개를 문서만 보고 답하게 했어요. crumbs는 17개 대 15개로 정답이 적었지만 읽은 파일은 70개 대 64개, 토큰은 18% 적었어요. crumbs의 부분 정답 3개는 writer가 세부를 버린 경우여서 "조건이 붙은 값은 버리지 않는다" 규칙을 스킬에 넣었어요. 작성자가 채점했고, 질문은 기존 스펙에서 나왔고, 데이터는 공개할 수 없어서 일화로 읽어 주세요. 탐색 비용 비교는 아직 공개 코드에서 다시 돌리지 않았어요.
|
|
75
76
|
|
|
76
77
|
## 설치와 빠른 시작
|
|
77
78
|
|
|
@@ -111,7 +112,7 @@ npm에 [`crumbs-spec`](https://www.npmjs.com/package/crumbs-spec)으로 올라
|
|
|
111
112
|
npx crumbs-spec init --spec-dir docs/crumbs --skills claude
|
|
112
113
|
```
|
|
113
114
|
|
|
114
|
-
2. **에이전트가 규칙을 읽게 해요.** Claude Code는 `CLAUDE.md
|
|
115
|
+
2. **에이전트가 규칙을 읽게 해요.** Codex와 Claude Code(v2.1.277 이상)는 `AGENTS.md`를 바로 읽어요. 다만 `CLAUDE.md`(또는 `.claude/CLAUDE.md`, `CLAUDE.local.md`)가 있는 저장소에서는 Claude Code가 그 파일만 읽으니, 거기에 `@AGENTS.md` 한 줄을 넣어 crumbs 블록을 가져와요. 이때 `init`이 안내를 출력해요. 스킬은 `.claude/skills/`(Claude Code)와 `.agents/skills/`(Codex)에서 자동으로 찾아요.
|
|
115
116
|
|
|
116
117
|
3. **기존 문서는 옮기지 않아요.** writer는 코드와 테스트만 원본으로 삼고, 기존 위키·설계 메모·README는 사용자가 원본 자료로 지목하지 않는 한 읽지 않아요. 지금 코드와 맞는지 확인할 수 없기 때문이에요. 기존 문서 중 근거로 쓸 것(기획서, 계약서, 정책 결정 기록)은 `docs/raw/`에 복사해 두고 `crumbs-ingest`로 한 건씩 반영해요.
|
|
117
118
|
|
|
@@ -122,7 +123,7 @@ npm에 [`crumbs-spec`](https://www.npmjs.com/package/crumbs-spec)으로 올라
|
|
|
122
123
|
도메인 디렉터리는 docs/crumbs/billing/이다. 확인하지 못한 정책은 질문으로 남기고 끝까지 해 줘.
|
|
123
124
|
```
|
|
124
125
|
|
|
125
|
-
5. **`check`를 CI에 걸어요.** 오류(
|
|
126
|
+
5. **`check`를 CI에 걸어요.** 오류(아래 검사 규칙 표에서 error인 규칙)만 실패시키고 경고는 무시해요. 스펙 루트 안의 Markdown 가운데 아직 crumbs 문서가 아닌 것은 `crumbs.json`의 `exclude`에 넣어요. 항목은 스펙 루트 기준 상대 경로이고, `/`로 끝나면 그 디렉터리를 제외해요. 글롭 패턴은 없어요. 필수 절이 하나도 없는 문서는 `check`가 알려 줘요.
|
|
126
127
|
|
|
127
128
|
6. **코드를 바꿀 때 문서를 같이 바꿔요.** AGENTS 블록이 "요청이 없어도 같은 변경에서 소유 문서를 갱신한다"를 에이전트에게 요구하니까, PR마다 `check`와 로그 항목이 함께 들어와요. 도메인이 하나씩 늘어나면서 인덱스가 채워져요.
|
|
128
129
|
|
|
@@ -176,47 +177,42 @@ docs/raw/ 계약서·기획 메모 같은 불변 원본
|
|
|
176
177
|
| 확인 필요 사항 | `- [확인 필요] [정책 이름](#앵커) — 질문` |
|
|
177
178
|
| 관련 문서 | 개요로 가는 링크와 이웃 문서. 역링크는 상호여야 해요 |
|
|
178
179
|
|
|
179
|
-
|
|
180
|
+
예시: [RealWorld 실험](#처음-보는-코드에서도-맞게-쓸까요-realworld-실험)에서 writer가 Nitro 코드로 만든 상세 문서를 고치지 않고 그대로 실었어요([원본](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md)). 이 저장소는 `lang: en`이라 제목이 영어예요. 아래 사용 예시 3에서 이 문서의 질문에 답하고 흐름도가 추가돼요.
|
|
180
181
|
|
|
181
182
|
````markdown
|
|
182
|
-
#
|
|
183
|
-
<!--
|
|
184
|
-
|
|
185
|
-
##
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
##
|
|
189
|
-
-
|
|
190
|
-
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
[
|
|
209
|
-
|
|
210
|
-
##
|
|
211
|
-
-
|
|
212
|
-
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
- [확인 필요] [최소 주문 금액](#최소-주문-금액) — 10,000원이라는 기준의 근거는 무엇인가?
|
|
216
|
-
|
|
217
|
-
## 관련 문서
|
|
218
|
-
- [쇼핑 개요](overview.md)
|
|
219
|
-
- [쿠폰 할인](쿠폰-할인.md)
|
|
183
|
+
# Tag list
|
|
184
|
+
<!-- Read ../../index.md first. After changing this document, add an entry to ../../log.md -->
|
|
185
|
+
|
|
186
|
+
## Purpose
|
|
187
|
+
This document owns GET /api/tags, which returns the most used tag names. How tags are attached to articles is owned by [Article creation](article-create.md#article-tag-name-handling). The endpoint allows anonymous viewers as described in [Authentication token](../authentication-token.md), and the list is the same for anonymous and signed-in viewers.
|
|
188
|
+
|
|
189
|
+
## Current behavior
|
|
190
|
+
- The server considers only tags that at least one article uses.
|
|
191
|
+
- The server sorts those tags by the number of articles that use them, most used first.
|
|
192
|
+
- The server returns at most 10 tag names.
|
|
193
|
+
- The server responds with status 200 and {"tags": ["<name>"…]}.
|
|
194
|
+
- If no article uses a tag, the list is empty.
|
|
195
|
+
|
|
196
|
+
## Flow
|
|
197
|
+
None
|
|
198
|
+
|
|
199
|
+
## Policies
|
|
200
|
+
### Popular tag list
|
|
201
|
+
The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first. The order of tags used by the same number of articles is not defined, and the list has no pagination. No test covers this rule.
|
|
202
|
+
[needs confirmation] What is the basis of the 10-tag limit, and what should order tags with the same usage count?
|
|
203
|
+
|
|
204
|
+
## Evidence
|
|
205
|
+
- `server/routes/api/tags/index.get.ts` — selects tags used by at least one article, sorts them by usage and returns at most 10 names
|
|
206
|
+
- `prisma/schema.prisma` — unique tag names and the relation between tags and articles
|
|
207
|
+
|
|
208
|
+
## Open questions
|
|
209
|
+
- [needs confirmation] [Popular tag list](#popular-tag-list) — What is the basis of the 10-tag limit, and what should order tags with the same usage count?
|
|
210
|
+
|
|
211
|
+
## Related
|
|
212
|
+
- [Articles API overview](overview.md)
|
|
213
|
+
- [Article creation](article-create.md)
|
|
214
|
+
- [Article update](article-update.md)
|
|
215
|
+
- [Article deletion](article-delete.md)
|
|
220
216
|
````
|
|
221
217
|
|
|
222
218
|
문서 본문은 간결한 `-한다`체로 써요. 개요의 `## 용어`는 별칭을 소유 정책으로 잇는 링크 목록이에요(`- 정액권(정액제) — [정액권 이용 중 판정](정액권.md#정액권-이용-중-판정)`). 정의만 있는 용어는 여기서 끝나고, 여러 흐름이 분기 축으로 쓰는 개념(채널, 재화, 회원 상태)만 `concepts/`에 소유 문서를 둬요.
|
|
@@ -234,13 +230,15 @@ npx crumbs-spec log add --kind <ingest|query|lint|drift|change|decision> "<제
|
|
|
234
230
|
`check`의 출력은 `파일:줄 심각도 규칙: 메시지` 한 줄씩이고 마지막 줄이 요약이에요.
|
|
235
231
|
|
|
236
232
|
```
|
|
237
|
-
docs/specs/
|
|
238
|
-
docs/specs/
|
|
239
|
-
|
|
240
|
-
crumbs check:
|
|
233
|
+
docs/specs/api/articles/tag-list.md:31 error broken-link: link target not found: ../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list
|
|
234
|
+
docs/specs/api/articles/article-delete.md:44 warning open-question: 1 open question(s)
|
|
235
|
+
…
|
|
236
|
+
crumbs check: 28 documents, 1 error, 20 warnings
|
|
241
237
|
```
|
|
242
238
|
|
|
243
|
-
|
|
239
|
+
사용 예시 3에서 writer가 결정 링크를 고치기 전에 나온 출력이고, 나머지 경고 19개는 생략했어요. 이 저장소는 `lang: en`이라 메시지가 영어예요. `lang: ko`에서는 `링크 대상이 없음`, `미해결 질문 1개`, `crumbs check: 문서 28개, 오류 1개, 경고 20개`처럼 나와요.
|
|
240
|
+
|
|
241
|
+
**지원하는 Markdown.** 제목은 ATX(`#`부터 `######`까지)만 인식하고 setext 제목(밑줄식)은 인식하지 않아요. 인라인 링크와 참조 링크(`[텍스트][라벨]`, `[라벨][]`와 `[라벨]: 경로` 정의)를 검사해요. `[라벨]`만 쓴 축약 참조는 링크가 아니에요. 제목 앵커는 github-slugger 방식이에요. 공백마다 `-`가 되고, `-`와 `_`를 뺀 문장부호는 지우며, 연속된 `-`는 합치지 않아요. 예를 들어 `### 수량 & 한도`는 `#수량--한도`가 돼요. 스펙 루트 아래의 심볼릭 링크 파일과 디렉터리도 따라가요. 근거 경로는 `codeRoot`(기본값은 저장소 루트) 기준으로 해석하고, `rawDir` 아래 경로만 언제나 저장소 루트 기준으로 해석해요. 근거 경로에는 `/`가 있어야 하며 저장소 루트의 파일은 `./package.json`처럼 써요. `:12`, `:12-48`, `:12:5`, `:12-48,60-70` 같은 줄 표기를 받아요. `exclude` 항목은 스펙 루트 기준 상대 경로이고, `/`로 끝나면 그 디렉터리를 제외해요. JSON 출력의 모든 항목에는 `line`이 있어요(더 나은 위치가 없으면 1).
|
|
244
242
|
|
|
245
243
|
### 검사 규칙
|
|
246
244
|
|
|
@@ -265,32 +263,37 @@ crumbs check: 문서 4개, 오류 1개, 경고 1개
|
|
|
265
263
|
|
|
266
264
|
## 로그
|
|
267
265
|
|
|
268
|
-
로그는 한 곳(`docs/specs/log.md`)에 시간순으로 덧붙여요. 제목은 작업명이 아니라 **사용자 결과 한 문장**이고, 본문은 세 줄이에요.
|
|
266
|
+
로그는 한 곳(`docs/specs/log.md`)에 시간순으로 덧붙여요. 제목은 작업명이 아니라 **사용자 결과 한 문장**이고, 본문은 세 줄이에요. 항목은 `log add`로 쓰고, 제목이나 본문에 `<!--`가 있으면 거부해요.
|
|
269
267
|
|
|
270
268
|
```bash
|
|
271
|
-
npx crumbs-spec log add --kind change "
|
|
272
|
-
--body "결과:
|
|
269
|
+
npx crumbs-spec log add --kind change "<사용자 결과 한 문장>" \
|
|
270
|
+
--body "결과: <바뀐 것>. 이유: <까닭>. 문서: [<정책>](<도메인>/<문서>.md#<앵커>)"
|
|
273
271
|
```
|
|
274
272
|
|
|
275
|
-
`
|
|
273
|
+
사용 예시 5에서 남긴 항목이에요. 이 저장소는 `lang: en`이라 본문 머리가 `Result:`, `Reason:`, `Document:`예요.
|
|
276
274
|
|
|
277
|
-
|
|
275
|
+
```markdown
|
|
276
|
+
## [2026-11-03] change | A malformed email on registration, login and account update is rejected with 422 and is invalid
|
|
277
|
+
Result: a malformed email on registration, login and account update gets status 422 with {"errors": {"email": ["is invalid"]}}; 3 api documents updated and 1 open question remains about accepted address forms. Reason: code change in server/schemas/user.schema.ts, reported by the user. Document: [Email format](api/users/registration.md#email-format)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
`[확인 필요]` 질문이 답을 얻으면 `decision` 항목을 남기고, 확정한 정책 본문 끝에 결정 링크 하나를 둬요. 문서 안에 변경 이력을 두지 않는 대신 결정은 로그에 쌓이고 문서는 링크로만 가리켜요. 슬러그는 대괄호·`|`·쉼표·콜론을 빼므로, `|`가 있던 자리는 `--`가 돼요. 사용 예시 3에서 남긴 결정이에요.
|
|
278
281
|
|
|
279
282
|
```markdown
|
|
280
|
-
## [2026-11-
|
|
281
|
-
|
|
283
|
+
## [2026-11-03] decision | Popular tag list: most used first stays, ties are undefined, 10 tags are cut after sorting, and every viewer gets the same unpaginated list
|
|
284
|
+
Result: GET /api/tags keeps the most-used-first order, leaves the order of equally used tags undefined, applies the 10-tag limit after sorting, and returns the same list without pagination to every viewer. Reason: answers from the maintainer; existing clients may rely on most-used-first and the limit keeps the tag sidebar short. Document: [Popular tag list](api/articles/tag-list.md#popular-tag-list)
|
|
282
285
|
```
|
|
283
286
|
|
|
284
287
|
```markdown
|
|
285
|
-
###
|
|
286
|
-
|
|
288
|
+
### Popular tag list
|
|
289
|
+
The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first, and the server applies the 10-tag limit after sorting. … (decision: [2026-11-03](../../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list))
|
|
287
290
|
```
|
|
288
291
|
|
|
289
292
|
kind는 `ingest`(원본 자료 반영), `query`(답을 찾아 환류), `lint`, `drift`, `change`(문서 변경), `decision`(질문 확정)이에요.
|
|
290
293
|
|
|
291
294
|
## 스킬
|
|
292
295
|
|
|
293
|
-
`init --skills`는 에이전트가 crumbs 문서를 다루는 절차를 `.claude/skills/<이름>/SKILL.md`(Claude Code)와 `.agents/skills/<이름>/SKILL.md`(Codex)에 설치해요. 기존 `SKILL.md`는 덮어쓰지 않으니 새 버전으로 바꾸려면 지우고 다시 설치해요. Claude Code
|
|
296
|
+
`init --skills`는 에이전트가 crumbs 문서를 다루는 절차를 `.claude/skills/<이름>/SKILL.md`(Claude Code)와 `.agents/skills/<이름>/SKILL.md`(Codex)에 설치해요. 기존 `SKILL.md`는 덮어쓰지 않으니 새 버전으로 바꾸려면 지우고 다시 설치해요. Claude Code가 crumbs 블록을 언제 읽는지는 [기존 프로젝트에 추가하기](#기존-프로젝트에-추가하기) 2단계에 있어요.
|
|
294
297
|
|
|
295
298
|
생성된 SKILL.md는 frontmatter 바로 뒤에 그것을 만든 crumbs-spec 버전을 적은 주석 한 줄을 둬요. 스킬과 템플릿은 패키지 버전을 따라요. 마이너 릴리스는 문구를 바꿀 수 있고 패치 릴리스는 바꾸지 않아요. 새 버전으로 올리려면 파일을 지우고 `init --skills`를 다시 실행해요.
|
|
296
299
|
|
|
@@ -303,52 +306,56 @@ kind는 `ingest`(원본 자료 반영), `query`(답을 찾아 환류), `lint`, `
|
|
|
303
306
|
|
|
304
307
|
## 사용 예시
|
|
305
308
|
|
|
309
|
+
아래 예시는 모두 실험의 Nitro 백엔드로 crumbs-spec-conduit의 [`usage/`](https://github.com/Sienna94/crumbs-spec-conduit/tree/main/usage) 작업공간에서 실제로 돌린 결과예요. 예시 1은 실험의 Opus 5.5 writer예요. 예시 2~5는 요청문만 받은 Claude Sonnet 5.5 에이전트가 `AGENTS.md`를 읽고 스킬을 스스로 골랐고, 에이전트가 물은 것은 작성자가 관리자 입장에서 답했어요. 요청문은 실제로는 영어로 보냈고, 여기서는 요청문과 `check` 출력을 한국어로 옮겼어요. 작업공간이 `lang: en`이라 실제 문서에는 질문 표시와 절 이름이 영어로 들어가 있어요. 파일을 바꾼 예시는 하나씩 커밋으로 남겨 링크했어요.
|
|
310
|
+
|
|
306
311
|
### 1. 기존 코드를 처음 문서화해요
|
|
307
312
|
|
|
308
313
|
```
|
|
309
|
-
|
|
310
|
-
|
|
314
|
+
../vendor/nitro 아래 코드를 crumbs-writer의 "기존 코드 문서화" 모드로 문서화해 줘.
|
|
315
|
+
코드와 테스트만 근거로 삼고, 확인하지 못한 정책은 질문으로 남기고 끝까지 해 줘.
|
|
311
316
|
```
|
|
312
317
|
|
|
313
|
-
|
|
318
|
+
실험의 [writer 프롬프트](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/eval/prompts/writer.md)를 줄인 형태예요. writer는 라우트 처리기부터 코드를 따라가며 API를 하위 디렉터리 네 개로 나누고, 상세 문서 21개와 개요를 만들었어요. 저장소에 단위 테스트 파일이 2개뿐이라 테스트로 확정된 정책은 6개, `[확인 필요]` 질문은 45개였어요. 마지막에 `check`를 돌리고 로그를 남겼어요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/572b0db)).
|
|
314
319
|
|
|
315
320
|
```
|
|
316
|
-
crumbs check: 문서
|
|
321
|
+
crumbs check: 문서 28개, 오류 0개, 경고 21개
|
|
317
322
|
```
|
|
318
323
|
|
|
319
|
-
경고
|
|
324
|
+
경고 21개는 아직 질문이 남은 상세 문서 21개예요. 각 문서의 확인 필요 사항 절이 관리자가 정해야 할 목록이에요.
|
|
320
325
|
|
|
321
|
-
### 2.
|
|
326
|
+
### 2. 답을 찾아요
|
|
322
327
|
|
|
323
328
|
```
|
|
324
|
-
|
|
329
|
+
GET /api/tags는 태그를 몇 개, 어떤 순서로 돌려줘?
|
|
325
330
|
```
|
|
326
331
|
|
|
327
|
-
|
|
332
|
+
finder는 색인 → API 개요 → 글 개요 → [tag-list.md](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md) 순서로 스펙 문서 4개만 읽고, 코드는 보지 않은 채 답했어요. 태그는 최대 10개이고, 많이 쓰인 순서이며, 글 하나 이상이 쓰는 태그만 나오고 페이지 나눔은 없다고요. 같은 개수인 태그의 순서와 10개 제한의 근거는 아직 `[확인 필요]` 질문이라는 점도 함께 알렸어요. 바뀐 파일은 없어요.
|
|
328
333
|
|
|
329
334
|
### 3. 모르는 정책은 묻고, 답은 결정으로 남겨요
|
|
330
335
|
|
|
331
336
|
```
|
|
332
|
-
|
|
337
|
+
태그 목록의 정렬 방식을 바꾸고 싶어. 먼저 무엇을 확인해야 해?
|
|
333
338
|
```
|
|
334
339
|
|
|
335
|
-
|
|
340
|
+
질문 스킬은 요청이 건드리는 정책 8개를 찾아 코드로 확정된 3개를 표시하고, 나머지를 질문 7개로 만들었어요. "태그 목록이 GET /api/tags인지 글 안의 tagList인지"부터 "기존 클라이언트가 지금 순서에 기대는지"까지예요. 문서는 하나도 고치지 않고 멈췄어요. 답은 이랬어요. 대상은 GET /api/tags뿐이고, 많이 쓰인 순서를 유지하고, 같은 개수의 순서는 일부러 정하지 않으며, 10개 제한은 정렬 뒤에 그대로 적용해요. writer가 정책을 확정하고 `decision` 항목과 결정 링크를 남겼어요([로그](#로그) 참고). 그 과정에서 `check`가 두 가지를 잡았어요. 결정 링크가 `../../log.md`가 아니라 `../log.md`를 가리킨 것(`broken-link`), 그리고 현재 동작이 일곱 단계로 늘었는데 흐름도가 없는 것(`missing-flow`)이에요. 그래서 writer가 흐름도를 추가했어요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/7b86052)).
|
|
336
341
|
|
|
337
342
|
### 4. 원본 자료를 반영해요
|
|
338
343
|
|
|
339
344
|
```
|
|
340
|
-
docs/raw/
|
|
345
|
+
상위 API 스펙이 바뀌었어. docs/raw/realworld-b8a37f1-validate-email-format.diff를 반영해 줘.
|
|
341
346
|
```
|
|
342
347
|
|
|
343
|
-
|
|
348
|
+
자료는 RealWorld 스펙에 이메일 형식 검사를 추가한 실제 상위 커밋이에요. 반영 스킬은 자료를 읽고 색인을 따라 회원가입·로그인·정보 수정 문서를 찾은 뒤, 자료의 주장 4개를 정리했어요. 그리고 충돌에서 멈췄어요. 자료는 형식이 틀린 이메일에 422 "is invalid"를 기대하는데, 문서와 코드는 형식을 검사하지 않는다고 해요. 자료와 코드 중 무엇을 따를지 물어서, 문서는 현재 동작을 설명하므로 코드를 따르기로 했어요. 스킬은 회원가입 문서에 이메일 형식 정책 하나를 두고 현재 동작과 상위 스펙을 인용한 질문을 적었어요. 로그인·정보 수정 문서에는 그 정책으로 가는 문장 하나씩만 넣고 `ingest` 항목을 남겼어요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/130946a)). 변경 목록을 확인받기 전에는 아무것도 고치지 않았어요.
|
|
344
349
|
|
|
345
|
-
### 5.
|
|
350
|
+
### 5. 코드 변경을 문서에 반영해요
|
|
346
351
|
|
|
347
352
|
```
|
|
348
|
-
|
|
353
|
+
회원가입·로그인·정보 수정에 이메일 형식 검사를 추가했어
|
|
354
|
+
(server/schemas/user.schema.ts, 아직 커밋 전). 이제 형식이 틀린 이메일은
|
|
355
|
+
422와 {"errors":{"email":["is invalid"]}}를 받아. 문서를 갱신해 줘.
|
|
349
356
|
```
|
|
350
357
|
|
|
351
|
-
|
|
358
|
+
writer는 `grep -rl 'user.schema' docs/specs`로 소유 문서를 찾았어요. 세 문서 모두 근거 절에 이 파일을 적어 두었기 때문이에요. 이메일 형식 정책을 확정 정책으로 고쳐 예시 4의 질문을 닫고, 로그인·정보 수정의 연결 문장과 흐름도 두 개를 고쳤어요. 코드만으로 정해지지 않는 것, 즉 어떤 주소를 유효로 볼지와 빈 이메일이 "is invalid"도 함께 보고하는지는 추측하지 않고 새 질문으로 남겼어요. 실제로 빈 이메일에는 두 메시지가 모두 나와요. 코드와 문서는 한 커밋이에요([커밋](https://github.com/Sienna94/crumbs-spec-conduit/commit/32fd2f3)).
|
|
352
359
|
|
|
353
360
|
### 6. CI에서 검사해요
|
|
354
361
|
|
|
@@ -384,7 +391,7 @@ jobs:
|
|
|
384
391
|
|
|
385
392
|
## 테스트와 호환성
|
|
386
393
|
|
|
387
|
-
`npm test`는 CI에서 Linux와 macOS 위에서 node:test
|
|
394
|
+
`npm test`는 CI에서 Linux와 macOS 위에서 node:test 테스트를 돌려요(`.github/workflows/ci.yml` 참고). 변경 내역은 [CHANGELOG.md](CHANGELOG.md)에 있어요. 1.0 전에는 마이너 버전에서 검사 규칙, 템플릿, 스킬 문구가 바뀔 수 있고, 패치 버전은 버그만 고쳐요.
|
|
388
395
|
|
|
389
396
|
## 로드맵
|
|
390
397
|
|
|
@@ -394,4 +401,4 @@ jobs:
|
|
|
394
401
|
| 2 | 스킬 4종, `log add`, 흐름 절, 책임 단위 기준, 용어·개념 페이지, 결정 로그 | 완료 |
|
|
395
402
|
| 3 | `crumbs reverse <path>` — 코드에서 초안 생성 명령(지금은 writer 스킬이 대신해요) | 예정 |
|
|
396
403
|
| 4 | `crumbs drift --base <ref>` — diff로 근거가 바뀐 문서를 찾아요 | 예정 |
|
|
397
|
-
| 5 | 예제
|
|
404
|
+
| 5 | 공개 예제([crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit))와 탐색 비용 벤치마크 러너 | 예제 완료, 러너 예정 |
|
package/README.md
CHANGED
|
@@ -44,34 +44,35 @@ From LLM Wiki we kept the raw/wiki/schema split, index-first navigation, the app
|
|
|
44
44
|
- **Decisions in one place.** When a question gets its answer, a `decision` entry goes into the log and the document points at it with a single dated link.
|
|
45
45
|
- **Two languages.** `lang` in `crumbs.json` selects the language of the templates, skills, messages and AGENTS block for the whole repository. It defaults to English (`en`); `ko` gives Korean. This README is the English guide.
|
|
46
46
|
|
|
47
|
-
##
|
|
47
|
+
## Does it work on code it has never seen? (RealWorld experiment)
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
We ran the writer skill on two open-source backends of the [RealWorld](https://github.com/realworld-apps/realworld) "Conduit" API and graded the documents against the project's official API test suite. The generated documents, prompts, ground truth and every grading row are published in [crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit).
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
- **Setup.** Two pinned implementations of the same API: [Nitro + Prisma](https://github.com/realworld-apps/nitro-prisma-zod-realworld-example-app) (TypeScript) and [Django Ninja](https://github.com/c4ffein/realworld-django-ninja) (Python). One Opus 5.5 agent per implementation wrote the documents from code and tests only. The official spec repository was not in the experiment repository while they wrote; it was added in a later commit.
|
|
52
|
+
- **Ground truth.** Each request in the official Hurl suite, at the version both implementations pin, is one row: 130 rows after dropping setup and cleanup requests.
|
|
53
|
+
- **Grading.** A different model (Sonnet 5.5) graded every row. `correct` means the documents state the status and every essential asserted value, `partial` that one is left out, `wrong` that the documents contradict it, `missing` that no document covers it. It also checked every policy against the code.
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
| | Nitro + Prisma | Django Ninja |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| Code / tests in the repository | ~1,400 lines / 2 unit test files | ~2,300 lines / endpoint tests for each app |
|
|
58
|
+
| Documents / policies | 28 / 51 | 26 / 91 |
|
|
59
|
+
| Policies confirmed by tests / left as questions | 6 / 45 | 50 / 41 |
|
|
60
|
+
| Suite rows correct | **125 / 130** | **116 / 130** |
|
|
61
|
+
| Suite rows partial / wrong / missing | 5 / 0 / 0 | 14 / 0 / 0 |
|
|
62
|
+
| Invented policies (code does not do it) | 0 | 0 |
|
|
63
|
+
| Policies partly overstated | 1 | 6 |
|
|
64
|
+
| Writer tokens / wall time | 165k / 2 h 40 min | 202k / 2 h 47 min |
|
|
62
65
|
|
|
63
|
-
**
|
|
66
|
+
- **Nothing contradicted the suite and nothing was invented.** Every miss is a detail left out. Nitro's five partials are `null` inputs the documents never mention and the order of tags. Twelve of Django's fourteen come from one honest question: the app's error handler and its tests disagree on the 401 body, so the writer stated both and asked.
|
|
67
|
+
- **Statements under a question were mostly right.** 12 Nitro rows and 32 Django rows were graded correct on a statement still marked `[needs confirmation]`. "This is what it does now" plus a question kept the documents useful without claiming more than the tests prove.
|
|
68
|
+
- **Fewer tests, more questions.** Nitro has two unit test files, so 45 of its 51 policies stayed questions. The suite answers 29 of them, which is the list a maintainer would confirm first.
|
|
69
|
+
- **The writers raised what no suite row tests.** As questions: Django's article list ignores the token and reads the session user, and its `createUser` command looks users up by a field a migration renamed. The Nitro documents also say plainly that the email format is not checked, which a newer version of the suite does test.
|
|
64
70
|
|
|
65
|
-
|
|
71
|
+
Limits: one run per implementation and one writer model. The grader is also a model; the author checked that every cited anchor exists and spot-checked rows. RealWorld is well known, so the writer may have seen it in training even without the spec in the repository. The suite asserts only part of what the documents say: 20 of Nitro's and 41 of Django's policies were checked against the code alone. The Django grader ran the code with unpinned dependencies, so some of its "partly" verdicts may depend on library versions.
|
|
66
72
|
|
|
67
|
-
|
|
68
|
-
|---|---|---|
|
|
69
|
-
| Correct answers | 17 / 18 (1 partial) | 15 / 18 (3 partial) |
|
|
70
|
-
| Files read in total | 70 (avg 3.9, max 8) | 64 (avg 3.6, max 6) |
|
|
71
|
-
| Fell back to grep | 3 | 1 |
|
|
72
|
-
| Tokens in total | 2.32M | 1.89M (−18%) |
|
|
73
|
+
### An earlier run on a private app (anecdote)
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
Before this we rewrote three areas of a private app (about 40,000 lines) and asked the existing spec system and crumbs the same 18 questions, documents only. crumbs answered 15 against 17, read 64 files against 70 and used 18% fewer tokens. Its three partial answers were details the writer had dropped, which led to the skill rule "do not drop values that carry a condition". The author graded it, the questions came from the existing specs, and the data cannot be published, so read it as an anecdote. The navigation comparison has not been repeated on public code yet.
|
|
75
76
|
|
|
76
77
|
## Install and quick start
|
|
77
78
|
|
|
@@ -111,7 +112,7 @@ The order for a repository that already has code and documents. Start with one d
|
|
|
111
112
|
npx crumbs-spec init --spec-dir docs/crumbs --skills claude
|
|
112
113
|
```
|
|
113
114
|
|
|
114
|
-
2. **Let the agent read the rules.** Claude Code
|
|
115
|
+
2. **Let the agent read the rules.** Codex and Claude Code (v2.1.277 or later) read `AGENTS.md` on their own. In a repository that also has a `CLAUDE.md` (or `.claude/CLAUDE.md` or `CLAUDE.local.md`), Claude Code reads only that file, so add the line `@AGENTS.md` to it to pull in the crumbs block. `init` prints a guide line in that case. Skills are found automatically under `.claude/skills/` (Claude Code) and `.agents/skills/` (Codex).
|
|
115
116
|
|
|
116
117
|
3. **Do not migrate existing documents.** The writer treats code and tests as the only sources and does not read existing wikis, design notes or READMEs unless you name them as sources, because there is no way to know whether they still match the code. Copy the ones worth using as evidence (plans, contracts, decision records) into `docs/raw/` and ingest them one at a time with `crumbs-ingest`.
|
|
117
118
|
|
|
@@ -122,7 +123,7 @@ The order for a repository that already has code and documents. Start with one d
|
|
|
122
123
|
The domain directory is docs/crumbs/billing/. Leave unconfirmed policies as questions and finish the whole thing.
|
|
123
124
|
```
|
|
124
125
|
|
|
125
|
-
5. **Put `check` in CI.** Fail only on errors (
|
|
126
|
+
5. **Put `check` in CI.** Fail only on errors (every rule marked error in the check rules table below) and ignore warnings. Markdown under the spec root that is not a crumbs document yet goes into `exclude` in `crumbs.json`: entries are paths relative to the spec root, an entry ending in `/` excludes that directory, there are no glob patterns, and `check` tells you when a document has none of the required sections.
|
|
126
127
|
|
|
127
128
|
6. **Change the document in the same change as the code.** The AGENTS block tells the agent to "update the owning document in the same change, even when nobody asked", so every PR brings `check` and a log entry with it. The index fills in as domains are added one by one.
|
|
128
129
|
|
|
@@ -176,47 +177,42 @@ The sections of a detail document are fixed. Headings follow `lang` (English by
|
|
|
176
177
|
| Open questions | `- [needs confirmation] [policy name](#anchor) — question` |
|
|
177
178
|
| Related | Link to the overview and neighboring documents; backlinks must be mutual |
|
|
178
179
|
|
|
179
|
-
Example (
|
|
180
|
+
Example: a detail document the writer produced from the Nitro code in [the RealWorld experiment](#does-it-work-on-code-it-has-never-seen-realworld-experiment), unedited ([source](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md)). Usage example 3 below answers its question and adds a flow diagram.
|
|
180
181
|
|
|
181
182
|
````markdown
|
|
182
|
-
#
|
|
183
|
-
<!-- Read
|
|
183
|
+
# Tag list
|
|
184
|
+
<!-- Read ../../index.md first. After changing this document, add an entry to ../../log.md -->
|
|
184
185
|
|
|
185
186
|
## Purpose
|
|
186
|
-
|
|
187
|
+
This document owns GET /api/tags, which returns the most used tag names. How tags are attached to articles is owned by [Article creation](article-create.md#article-tag-name-handling). The endpoint allows anonymous viewers as described in [Authentication token](../authentication-token.md), and the list is the same for anonymous and signed-in viewers.
|
|
187
188
|
|
|
188
189
|
## Current behavior
|
|
189
|
-
-
|
|
190
|
-
-
|
|
190
|
+
- The server considers only tags that at least one article uses.
|
|
191
|
+
- The server sorts those tags by the number of articles that use them, most used first.
|
|
192
|
+
- The server returns at most 10 tag names.
|
|
193
|
+
- The server responds with status 200 and {"tags": ["<name>"…]}.
|
|
194
|
+
- If no article uses a tag, the list is empty.
|
|
191
195
|
|
|
192
196
|
## Flow
|
|
193
|
-
|
|
194
|
-
flowchart TD
|
|
195
|
-
A["Add item"] --> B{"Already in cart?"}
|
|
196
|
-
B -->|yes| C["Add quantities"]
|
|
197
|
-
B -->|no| D["New line"]
|
|
198
|
-
C --> E{"More than 99?"}
|
|
199
|
-
E -->|yes| F["Show notice, do not add"]
|
|
200
|
-
```
|
|
197
|
+
None
|
|
201
198
|
|
|
202
199
|
## Policies
|
|
203
|
-
###
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
### Minimum order amount
|
|
207
|
-
Right now the checkout button is disabled when the total is under 10,000 KRW.
|
|
208
|
-
[needs confirmation] Where does the 10,000 KRW threshold come from?
|
|
200
|
+
### Popular tag list
|
|
201
|
+
The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first. The order of tags used by the same number of articles is not defined, and the list has no pagination. No test covers this rule.
|
|
202
|
+
[needs confirmation] What is the basis of the 10-tag limit, and what should order tags with the same usage count?
|
|
209
203
|
|
|
210
204
|
## Evidence
|
|
211
|
-
- `
|
|
212
|
-
- `
|
|
205
|
+
- `server/routes/api/tags/index.get.ts` — selects tags used by at least one article, sorts them by usage and returns at most 10 names
|
|
206
|
+
- `prisma/schema.prisma` — unique tag names and the relation between tags and articles
|
|
213
207
|
|
|
214
208
|
## Open questions
|
|
215
|
-
- [needs confirmation] [
|
|
209
|
+
- [needs confirmation] [Popular tag list](#popular-tag-list) — What is the basis of the 10-tag limit, and what should order tags with the same usage count?
|
|
216
210
|
|
|
217
211
|
## Related
|
|
218
|
-
- [
|
|
219
|
-
- [
|
|
212
|
+
- [Articles API overview](overview.md)
|
|
213
|
+
- [Article creation](article-create.md)
|
|
214
|
+
- [Article update](article-update.md)
|
|
215
|
+
- [Article deletion](article-delete.md)
|
|
220
216
|
````
|
|
221
217
|
|
|
222
218
|
The overview's "Terms" section is a list of aliases linked to the owning policy (`- Subscription pass(flat-rate pass) — [Pass active check](pass.md#pass-active-check)`). A term that is only a definition stops there; only concepts that several flows branch on (channel, currency, member state) get an owning document under `concepts/`.
|
|
@@ -234,13 +230,15 @@ Common options are `--root <dir>` (repository root, default: current directory),
|
|
|
234
230
|
`check` prints one line per finding as `file:line severity rule: message`, and a summary last.
|
|
235
231
|
|
|
236
232
|
```
|
|
237
|
-
docs/specs/
|
|
238
|
-
docs/specs/
|
|
239
|
-
|
|
240
|
-
crumbs check:
|
|
233
|
+
docs/specs/api/articles/tag-list.md:31 error broken-link: link target not found: ../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list
|
|
234
|
+
docs/specs/api/articles/article-delete.md:44 warning open-question: 1 open question(s)
|
|
235
|
+
…
|
|
236
|
+
crumbs check: 28 documents, 1 error, 20 warnings
|
|
241
237
|
```
|
|
242
238
|
|
|
243
|
-
|
|
239
|
+
This is the check from usage example 3 before the writer fixed its decision link; the other 19 warnings are left out.
|
|
240
|
+
|
|
241
|
+
**Supported Markdown.** Headings must be ATX (`#` to `######`); setext headings are not recognized. Inline links and reference links (`[text][label]`, and `[label][]` with a `[label]: path` definition) are checked; a shortcut reference such as `[label]` alone is not a link. Heading anchors follow github-slugger: each space becomes `-`, punctuation other than `-` and `_` is dropped, and nothing is collapsed, so `### Quantity & limits` becomes `#quantity--limits`. Symlinked files and directories under the spec root are followed. Evidence paths are resolved against `codeRoot` (the repository root by default), except paths under `rawDir`, which are always resolved against the repository root. An evidence path must contain a `/`, so a repository-root file is written `./package.json`; line suffixes such as `:12`, `:12-48`, `:12:5` and `:12-48,60-70` are accepted. Entries in `exclude` are paths relative to the spec root, and an entry ending in `/` excludes that directory. Every finding carries a `line` (1 when there is no better position), so JSON output always includes it.
|
|
244
242
|
|
|
245
243
|
### Check rules
|
|
246
244
|
|
|
@@ -265,32 +263,37 @@ crumbs check: 4 documents, 1 error, 1 warning
|
|
|
265
263
|
|
|
266
264
|
## Log
|
|
267
265
|
|
|
268
|
-
The log is appended in one place (`docs/specs/log.md`) in chronological order. The title is **one sentence about the user outcome**, not the task name, and the body has three lines.
|
|
266
|
+
The log is appended in one place (`docs/specs/log.md`) in chronological order. The title is **one sentence about the user outcome**, not the task name, and the body has three lines. `log add` writes the entry and refuses titles or bodies that contain `<!--`.
|
|
269
267
|
|
|
270
268
|
```bash
|
|
271
|
-
npx crumbs-spec log add --kind change "
|
|
272
|
-
--body "Result:
|
|
269
|
+
npx crumbs-spec log add --kind change "<one sentence about the user outcome>" \
|
|
270
|
+
--body "Result: <what changed>. Reason: <why>. Document: [<policy>](<domain>/<document>.md#<anchor>)"
|
|
273
271
|
```
|
|
274
272
|
|
|
275
|
-
|
|
273
|
+
The entry written in usage example 5:
|
|
276
274
|
|
|
277
|
-
|
|
275
|
+
```markdown
|
|
276
|
+
## [2026-11-03] change | A malformed email on registration, login and account update is rejected with 422 and is invalid
|
|
277
|
+
Result: a malformed email on registration, login and account update gets status 422 with {"errors": {"email": ["is invalid"]}}; 3 api documents updated and 1 open question remains about accepted address forms. Reason: code change in server/schemas/user.schema.ts, reported by the user. Document: [Email format](api/users/registration.md#email-format)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
When a `[needs confirmation]` question gets its answer, add a `decision` entry and put one decision link at the end of the confirmed policy. Instead of change-history tables inside documents, decisions accumulate in the log and documents only point at them. The slug drops the brackets, `|`, commas and colons, so the `|` leaves a double dash in the anchor. From usage example 3:
|
|
278
281
|
|
|
279
282
|
```markdown
|
|
280
|
-
## [2026-11-
|
|
281
|
-
Result: the
|
|
283
|
+
## [2026-11-03] decision | Popular tag list: most used first stays, ties are undefined, 10 tags are cut after sorting, and every viewer gets the same unpaginated list
|
|
284
|
+
Result: GET /api/tags keeps the most-used-first order, leaves the order of equally used tags undefined, applies the 10-tag limit after sorting, and returns the same list without pagination to every viewer. Reason: answers from the maintainer; existing clients may rely on most-used-first and the limit keeps the tag sidebar short. Document: [Popular tag list](api/articles/tag-list.md#popular-tag-list)
|
|
282
285
|
```
|
|
283
286
|
|
|
284
287
|
```markdown
|
|
285
|
-
###
|
|
286
|
-
The
|
|
288
|
+
### Popular tag list
|
|
289
|
+
The tag list holds at most 10 names of tags used by at least one article, sorted by the number of articles that use each tag, most used first, and the server applies the 10-tag limit after sorting. … (decision: [2026-11-03](../../log.md#2026-11-03-decision--popular-tag-list-most-used-first-stays-ties-are-undefined-10-tags-are-cut-after-sorting-and-every-viewer-gets-the-same-unpaginated-list))
|
|
287
290
|
```
|
|
288
291
|
|
|
289
292
|
The kinds are `ingest` (a source was applied), `query` (an answer fed back), `lint`, `drift`, `change` (a document changed) and `decision` (a question was settled).
|
|
290
293
|
|
|
291
294
|
## Skills
|
|
292
295
|
|
|
293
|
-
`init --skills` installs the procedures an agent follows into `.claude/skills/<name>/SKILL.md` (Claude Code) and `.agents/skills/<name>/SKILL.md` (Codex). An existing `SKILL.md` is never overwritten; delete it and run `init --skills` again to upgrade. Claude Code reads the crumbs block
|
|
296
|
+
`init --skills` installs the procedures an agent follows into `.claude/skills/<name>/SKILL.md` (Claude Code) and `.agents/skills/<name>/SKILL.md` (Codex). An existing `SKILL.md` is never overwritten; delete it and run `init --skills` again to upgrade. When Claude Code reads the crumbs block is described in step 2 of [Adding it to an existing project](#adding-it-to-an-existing-project).
|
|
294
297
|
|
|
295
298
|
Each generated SKILL.md starts with a comment naming the crumbs-spec version that produced it. Skills and templates follow the package version: a minor release may change their text, a patch release does not. To upgrade, delete the file and run `init --skills` again.
|
|
296
299
|
|
|
@@ -303,52 +306,56 @@ Each generated SKILL.md starts with a comment naming the crumbs-spec version tha
|
|
|
303
306
|
|
|
304
307
|
## Usage examples
|
|
305
308
|
|
|
309
|
+
Every example below was actually run on the Nitro backend from the experiment, in the [`usage/`](https://github.com/Sienna94/crumbs-spec-conduit/tree/main/usage) workspace of crumbs-spec-conduit. Example 1 is the experiment's Opus 5.5 writer. Examples 2–5 are a Claude Sonnet 5.5 agent that got only the request, read `AGENTS.md` and picked the skill itself; the author answered its questions as the maintainer would. Each example that changed files is one commit, linked below.
|
|
310
|
+
|
|
306
311
|
### 1. Document existing code for the first time
|
|
307
312
|
|
|
308
313
|
```
|
|
309
|
-
Document the code under
|
|
310
|
-
|
|
314
|
+
Document the code under ../vendor/nitro with crumbs-writer in "document existing code" mode,
|
|
315
|
+
from code and tests only. Leave unconfirmed policies as questions and finish the whole thing.
|
|
311
316
|
```
|
|
312
317
|
|
|
313
|
-
|
|
318
|
+
This is a shortened form of the experiment's [writer prompt](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/eval/prompts/writer.md). The writer followed the code from the route handlers, split the API into four subdirectories and produced 21 detail documents with their overviews. The repository has only two unit test files, so 6 policies came out confirmed by tests and 45 as `[needs confirmation]` questions. It ended with `check` and a log entry ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/572b0db)).
|
|
314
319
|
|
|
315
320
|
```
|
|
316
|
-
crumbs check:
|
|
321
|
+
crumbs check: 28 documents, 0 errors, 21 warnings
|
|
317
322
|
```
|
|
318
323
|
|
|
319
|
-
The
|
|
324
|
+
The 21 warnings are the 21 detail documents that still have open questions. Their "Open questions" sections are the list of things the maintainer has to decide.
|
|
320
325
|
|
|
321
|
-
### 2.
|
|
326
|
+
### 2. Find an answer
|
|
322
327
|
|
|
323
328
|
```
|
|
324
|
-
|
|
329
|
+
How many tags does GET /api/tags return, and in what order?
|
|
325
330
|
```
|
|
326
331
|
|
|
327
|
-
The
|
|
332
|
+
The finder went index → API overview → articles overview → [tag-list.md](https://github.com/Sienna94/crumbs-spec-conduit/blob/main/nitro/docs/specs/api/articles/tag-list.md), four spec documents and no code. It answered: at most 10 names, most used first, only tags that at least one article uses, no pagination. It also said that two points are still `[needs confirmation]`: the order of tags with the same count and the basis of the limit. No file changed.
|
|
328
333
|
|
|
329
334
|
### 3. Ask about what is unknown and record the answer as a decision
|
|
330
335
|
|
|
331
336
|
```
|
|
332
|
-
I want to change the
|
|
337
|
+
I want to change how the tag list is ordered. What do I need to confirm first?
|
|
333
338
|
```
|
|
334
339
|
|
|
335
|
-
The interview skill
|
|
340
|
+
The interview skill listed the eight policies the request touches, marked three as confirmed by code, and turned the rest into seven questions, from "does 'tag list' mean GET /api/tags or the tagList inside articles" to "do existing clients depend on the current order". It stopped without editing anything. The answer: only GET /api/tags; keep most used first; ties stay undefined on purpose; the 10-tag limit stays and applies after sorting. The writer then confirmed the policy and added a `decision` entry and the decision link (see [Log](#log)). `check` caught two things on the way: the decision link pointed at `../log.md` instead of `../../log.md` (`broken-link`), and current behavior grew to seven steps without a diagram (`missing-flow`), so the writer added one ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/7b86052)).
|
|
336
341
|
|
|
337
342
|
### 4. Ingest a source document
|
|
338
343
|
|
|
339
344
|
```
|
|
340
|
-
Apply docs/raw/
|
|
345
|
+
The upstream API spec changed. Apply docs/raw/realworld-b8a37f1-validate-email-format.diff.
|
|
341
346
|
```
|
|
342
347
|
|
|
343
|
-
The ingest skill
|
|
348
|
+
The source is the real upstream commit that added email-format validation to the RealWorld spec. The ingest skill read it, found the registration, login and account-update documents through the index and listed four claims. Then it stopped on a conflict: the source expects 422 "is invalid" for a malformed email, while the documents and the code say the format is not checked. Asked whether the source or the code wins, we chose the code, because documents describe current behavior. The skill wrote one `Email format` policy in the registration document with the current behavior and a question that cites the upstream spec, added one linking sentence to the login and update documents, and logged an `ingest` entry ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/130946a)). Nothing was edited before the change list was confirmed.
|
|
344
349
|
|
|
345
|
-
### 5.
|
|
350
|
+
### 5. Reflect a code change
|
|
346
351
|
|
|
347
352
|
```
|
|
348
|
-
|
|
353
|
+
I added email format validation to registration, login and account update
|
|
354
|
+
(server/schemas/user.schema.ts, not committed yet). A malformed email now gets 422
|
|
355
|
+
with {"errors":{"email":["is invalid"]}}. Update the docs.
|
|
349
356
|
```
|
|
350
357
|
|
|
351
|
-
The
|
|
358
|
+
The writer found the owning document with `grep -rl 'user.schema' docs/specs`, since all three documents name that file under Evidence. It rewrote `Email format` as a confirmed policy, which closed the question from example 4, and updated the linking sentences in login and update and two flow diagrams. What the code did not settle, which addresses count as valid and whether a blank email also reports "is invalid", became a new question instead of a guess; a blank email does get both messages. The code and the documents are one commit ([commit](https://github.com/Sienna94/crumbs-spec-conduit/commit/32fd2f3)).
|
|
352
359
|
|
|
353
360
|
### 6. Check in CI
|
|
354
361
|
|
|
@@ -394,6 +401,6 @@ Exit code 1 means there are errors. Warnings (`open-question`, `missing-flow` an
|
|
|
394
401
|
| 2 | Four skills, `log add`, flow section, responsibility-size rules, terms and concept pages, decision log | done |
|
|
395
402
|
| 3 | `crumbs reverse <path>` — a command that drafts from code (the writer skill does this today) | planned |
|
|
396
403
|
| 4 | `crumbs drift --base <ref>` — finds documents whose evidence changed in a diff | planned |
|
|
397
|
-
| 5 |
|
|
404
|
+
| 5 | Public example ([crumbs-spec-conduit](https://github.com/Sienna94/crumbs-spec-conduit)) and a navigation-cost benchmark runner | example done, runner planned |
|
|
398
405
|
|
|
399
406
|
The `lang` setting (`en` by default, `ko` for Korean) selects the language of the templates, skills and messages, so one repository uses one language.
|
package/dist/src/graph.js
CHANGED
|
@@ -98,6 +98,11 @@ function dirsUpTo(start, specAbs) {
|
|
|
98
98
|
}
|
|
99
99
|
return out;
|
|
100
100
|
}
|
|
101
|
+
// 원본 자료(rawDir 아래)는 코드가 아니므로 codeRoot가 아니라 저장소 루트 기준으로 해석한다.
|
|
102
|
+
function isUnderRawDir(path, rawDir) {
|
|
103
|
+
const normalized = path.replace(/^\.\//, '');
|
|
104
|
+
return normalized === rawDir || normalized.startsWith(`${rawDir}/`);
|
|
105
|
+
}
|
|
101
106
|
export function buildGraph(root, config) {
|
|
102
107
|
const specAbs = resolve(root, config.specDir);
|
|
103
108
|
const indexAbs = join(specAbs, config.index);
|
|
@@ -145,7 +150,7 @@ export function buildGraph(root, config) {
|
|
|
145
150
|
const evidencePaths = evidenceCandidates(scan, sections).map((candidate) => ({
|
|
146
151
|
line: candidate.line,
|
|
147
152
|
raw: candidate.raw,
|
|
148
|
-
resolved: resolve(codeRootAbs, candidate.path),
|
|
153
|
+
resolved: resolve(isUnderRawDir(candidate.path, config.rawDir) ? root : codeRootAbs, candidate.path),
|
|
149
154
|
}));
|
|
150
155
|
const policies = sections
|
|
151
156
|
.filter((section) => section.key === 'policies')
|
package/dist/src/graph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"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"}
|
package/dist/src/init.js
CHANGED
|
@@ -103,10 +103,10 @@ export function runInit(root, specDirOption, skillsOption, langOption) {
|
|
|
103
103
|
out.push(m.updated('AGENTS.md'));
|
|
104
104
|
else
|
|
105
105
|
out.push(m.skipped('AGENTS.md'));
|
|
106
|
-
// CLAUDE.md
|
|
107
|
-
const
|
|
108
|
-
if (!
|
|
109
|
-
out.push(m.claudeGuide);
|
|
106
|
+
// Claude Code는 CLAUDE.md가 있으면 AGENTS.md를 읽지 않는다. 고치지 않고, 가져오기 줄이 없을 때만 안내한다.
|
|
107
|
+
const claudeFiles = ['CLAUDE.md', '.claude/CLAUDE.md'].filter((file) => existsSync(join(root, file)));
|
|
108
|
+
if (claudeFiles.length > 0 && !claudeFiles.some((file) => readFileSync(join(root, file), 'utf8').includes('@AGENTS.md'))) {
|
|
109
|
+
out.push(m.claudeGuide(claudeFiles[0]));
|
|
110
110
|
}
|
|
111
111
|
out.push(m.next);
|
|
112
112
|
return out;
|
package/dist/src/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/src/messages.js
CHANGED
|
@@ -54,7 +54,7 @@ Example
|
|
|
54
54
|
created: (path) => `created: ${path}`,
|
|
55
55
|
updated: (path) => `updated: ${path}`,
|
|
56
56
|
next: 'next: npx crumbs-spec check',
|
|
57
|
-
claudeGuide:
|
|
57
|
+
claudeGuide: (file) => `guide: Claude Code reads ${file} instead of AGENTS.md; add "@AGENTS.md" to ${file} so it reads the crumbs rules`,
|
|
58
58
|
agentsMarkers: 'AGENTS.md: crumbs markers are not paired',
|
|
59
59
|
rootMissing: (root) => `root directory not found: ${root}`,
|
|
60
60
|
fileMissing: (where) => `crumbs.json not found in ${where}. Run "npx crumbs-spec init" first.`,
|
|
@@ -152,7 +152,7 @@ log add 옵션
|
|
|
152
152
|
created: (path) => `생성: ${path}`,
|
|
153
153
|
updated: (path) => `갱신: ${path}`,
|
|
154
154
|
next: '다음: npx crumbs-spec check',
|
|
155
|
-
claudeGuide:
|
|
155
|
+
claudeGuide: (file) => `안내: Claude Code는 ${file} 파일이 있으면 AGENTS.md를 읽지 않으니, ${file}에 "@AGENTS.md"를 추가하세요`,
|
|
156
156
|
agentsMarkers: 'AGENTS.md: crumbs 표시가 짝이 맞지 않음',
|
|
157
157
|
rootMissing: (root) => `저장소 루트 디렉터리를 찾을 수 없음: ${root}`,
|
|
158
158
|
fileMissing: (where) => `${where}에 crumbs.json이 없음. 먼저 "npx crumbs-spec init"을 실행하세요.`,
|
package/dist/src/messages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,eAAe,CAAC;AAEtD,sDAAsD;AACtD,+CAA+C;AAC/C,8BAA8B;AAC9B,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,IAAY,EAAU,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAiFzF,MAAM,CAAC,MAAM,QAAQ,GAA2B;IAC9C,EAAE,EAAE;QACF,KAAK,EAAE,wEAAwE;QAC/E,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BT;QACG,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,GAAG;QACnD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,IAAI,wBAAwB;QAC9D,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,IAAI,eAAe;QACxD,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,IAAI,GAAG;QACrD,SAAS,EAAE,kBAAkB;QAC7B,YAAY,EAAE,+BAA+B;QAC7C,YAAY,EAAE,kBAAkB;QAChC,UAAU,EAAE,4CAA4C;QACxD,UAAU,EAAE,gBAAgB;QAC5B,cAAc,EAAE,mCAAmC;QACnD,WAAW,EAAE,wCAAwC;QACrD,gBAAgB,EAAE,sCAAsC;QAExD,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,+DAA+D,MAAM,WAAW;QACxG,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,mBAAmB;QACtD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;QACrC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;QACrC,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ function agentsBlockKo(p) {
|
|
|
18
18
|
- 모든 정책은 정확히 하나의 상세 문서가 소유한다. 아무도 문서 갱신을 요청하지 않았더라도
|
|
19
19
|
코드와 같은 변경에서 그 문서를 갱신한다.
|
|
20
20
|
- 변경이 아니라 현재 동작을 설명한다. 변경 이력이나 요구사항 ID를 넣지 않는다.
|
|
21
|
-
- 근거로 삼은 코드를 "근거" 절에 적는다. 링크는 양방향으로 유지한다: 상세 문서는 개요와
|
|
21
|
+
- 근거로 삼은 코드를 "근거" 절에 \`crumbs.json\`의 \`codeRoot\` 기준 경로로 적고, 원본 자료는 \`${p.rawDir}/<파일>\`로 적는다. 링크는 양방향으로 유지한다: 상세 문서는 개요와
|
|
22
22
|
관련 문서로 링크하고, 그 문서들도 되돌아오는 링크를 둔다.
|
|
23
23
|
- 코드·테스트·승인된 자료로 확인할 수 없는 정책은 \`[확인 필요]\`와 질문을 적는다.
|
|
24
24
|
추측하지 않는다.
|
|
@@ -42,7 +42,7 @@ Rules when behavior changes:
|
|
|
42
42
|
- Every policy is owned by exactly one detail document. Even if nobody asks you to update the document,
|
|
43
43
|
update it in the same change as the code.
|
|
44
44
|
- Describe the current behavior, not the change. Do not add change history or requirement IDs.
|
|
45
|
-
- List the code you relied on in the "Evidence" section. Keep links in both directions: detail documents link to the overview
|
|
45
|
+
- List the code you relied on in the "Evidence" section, with paths relative to \`codeRoot\` in \`crumbs.json\`; cite source material as \`${p.rawDir}/<file>\`. Keep links in both directions: detail documents link to the overview
|
|
46
46
|
and related documents, and those documents link back.
|
|
47
47
|
- If code, tests, or approved material cannot confirm a policy, write \`[needs confirmation]\` and a question.
|
|
48
48
|
Do not guess.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/templates/agents.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAShD,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,CAAc,EAAE,IAAU;IACpD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,CAAc;IACnC,OAAO,GAAG,YAAY;;;WAGb,CAAC,CAAC,OAAO;OACb,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,MAAM
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/templates/agents.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAShD,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,CAAc,EAAE,IAAU;IACpD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,CAAc;IACnC,OAAO,GAAG,YAAY;;;WAGb,CAAC,CAAC,OAAO;OACb,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,MAAM;;;;;;;;;yEASqB,CAAC,CAAC,MAAM;;;;6BAIpD,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;;;;EAI7C,UAAU,EAAE,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,CAAc;IACnC,OAAO,GAAG,YAAY;;;8BAGM,CAAC,CAAC,OAAO;gBACvB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,yCAAyC,CAAC,CAAC,MAAM;;;;;;;;;6IASwD,CAAC,CAAC,MAAM;;;;4EAIzE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;;;EAG5F,UAAU,EAAE,CAAC;AACf,CAAC"}
|
package/dist/src/templates/en.js
CHANGED
|
@@ -51,7 +51,7 @@ A branch with two or more comparison axes, such as channel or state, goes in a t
|
|
|
51
51
|
then write [needs confirmation] and the question on the next line>
|
|
52
52
|
|
|
53
53
|
## Evidence
|
|
54
|
-
- \`<path/to/file.ext>\` — <what it implements> (the path must contain a "/"; write a root file as ./file)
|
|
54
|
+
- \`<path/to/file.ext>\` — <what it implements> (code paths are relative to codeRoot in crumbs.json and source material is written as ${p.rawDir}/<file>; the path must contain a "/"; write a root file as ./file)
|
|
55
55
|
|
|
56
56
|
## Open questions
|
|
57
57
|
- [needs confirmation] [<policy name>](#<policy-anchor>) — <question that would change behavior or scope>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.js","sourceRoot":"","sources":["../../../src/templates/en.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,sDAAsD;AACtD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;mDAOY,CAAC,CAAC,QAAQ;;;UAGnD,CAAC,CAAC,GAAG;CACd;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eAC3B,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;oBAgBnE,CAAC,CAAC,KAAK;CAC1B;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eACzB,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG
|
|
1
|
+
{"version":3,"file":"en.js","sourceRoot":"","sources":["../../../src/templates/en.ts"],"names":[],"mappings":"AAEA,4DAA4D;AAC5D,sDAAsD;AACtD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;mDAOY,CAAC,CAAC,QAAQ;;;UAGnD,CAAC,CAAC,GAAG;CACd;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eAC3B,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;oBAgBnE,CAAC,CAAC,KAAK;CAC1B;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;eACzB,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;;wIAkBiD,CAAC,CAAC,MAAM;;;;;;wBAMxH,CAAC,CAAC,QAAQ;CACjC;IAEC,GAAG,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;MAK5B,KAAK;CACV;IAEC,SAAS,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;0EAG+B,CAAC,CAAC,OAAO;CAClF;CACA,CAAC"}
|
package/dist/src/templates/ko.js
CHANGED
|
@@ -50,7 +50,7 @@ export const ko = {
|
|
|
50
50
|
다음 줄에 [확인 필요]와 질문을 적는다>
|
|
51
51
|
|
|
52
52
|
## 근거
|
|
53
|
-
- \`<path/to/file.ext>\` — <구현하는 내용> (경로에는 /가 있어야 하며 루트 파일은 ./파일 로 쓴다)
|
|
53
|
+
- \`<path/to/file.ext>\` — <구현하는 내용> (코드 경로는 crumbs.json의 codeRoot 기준이고 원본 자료는 ${p.rawDir}/<파일>로 쓴다. 경로에는 /가 있어야 하며 루트 파일은 ./파일 로 쓴다)
|
|
54
54
|
|
|
55
55
|
## 확인 필요 사항
|
|
56
56
|
- [확인 필요] [<정책 이름>](#<정책-앵커>) — <동작이나 범위를 바꾸는 질문>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ko.js","sourceRoot":"","sources":["../../../src/templates/ko.ts"],"names":[],"mappings":"AAQA,qDAAqD;AACrD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;oCAOH,CAAC,CAAC,QAAQ;;;SAGrC,CAAC,CAAC,GAAG;CACb;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAChC,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;gBAgBjC,CAAC,CAAC,KAAK;CACtB;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAC9B,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG
|
|
1
|
+
{"version":3,"file":"ko.js","sourceRoot":"","sources":["../../../src/templates/ko.ts"],"names":[],"mappings":"AAQA,qDAAqD;AACrD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,KAAK,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;oCAOH,CAAC,CAAC,QAAQ;;;SAGrC,CAAC,CAAC,GAAG;CACb;IAEC,QAAQ,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAChC,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;gBAgBjC,CAAC,CAAC,KAAK;CACtB;IAEC,MAAM,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;UAC9B,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;;iFAkBgC,CAAC,CAAC,MAAM;;;;;;eAM1E,CAAC,CAAC,QAAQ;CACxB;IAEC,GAAG,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;MAK5B,KAAK;CACV;IAEC,SAAS,EAAE,CAAC,CAAgB,EAAU,EAAE,CAAC;;;iCAGV,CAAC,CAAC,OAAO;;CAEzC;CACA,CAAC"}
|
|
@@ -13,7 +13,7 @@ Writes or updates a living spec document that explains one responsibility. The d
|
|
|
13
13
|
|
|
14
14
|
1. \`${p.specDir}/${p.index}\`. Always read it first. It lists the domains and overview documents.
|
|
15
15
|
2. The \`${p.overview}\` of the domain the request touches, then the detail documents and their "Related" sections.
|
|
16
|
-
3. \`crumbs.json\`. If \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, or \`headings\` differ from the defaults, use those values.
|
|
16
|
+
3. \`crumbs.json\`. If \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, or \`headings\` differ from the defaults, use those values. Code and test paths under "Evidence" are relative to \`codeRoot\` (the repository root by default); source material under \`${p.rawDir}/\` is always written from the repository root.
|
|
17
17
|
4. \`${p.specDir}/templates/detail.md\` and \`${p.specDir}/templates/overview.md\`. Start new documents from these templates.
|
|
18
18
|
|
|
19
19
|
## Choose a mode
|
|
@@ -29,7 +29,7 @@ Writes or updates a living spec document that explains one responsibility. The d
|
|
|
29
29
|
2. If more than one document looks like the owner, stop and ask which one owns it. Do not write one policy in two documents.
|
|
30
30
|
3. Rewrite "Current behavior" as the behavior after the change. Do not add historical narration such as "previously … now …", change dates, or requirement IDs. If the diagram or table under "Flow" holds that behavior, update it too.
|
|
31
31
|
4. Under "Policies", edit the body of each changed policy, add a new policy as \`### policy name\`, and delete a policy that was removed. If a policy with the same name already exists in another document, that document owns it: edit it there and keep only a link in this document. A confirmed policy may end with one decision link, \`(decision: [YYYY-MM-DD](../${p.log}#<entry-anchor>))\`, after its last sentence. This is the only exception to the rule against change history. Do not write the reason or the source; the link text carries only the decision date. The entry anchor is the slug of the \`decision\` entry title (format in step 1 of "Document existing code").
|
|
32
|
-
5. Update the code and test paths under "Evidence" to match the changed code. Write each path as a backtick path relative to the repository root. If a line range is needed, append it like \`src/auth/session.ts:12-48\`. Attach only one range to each path; if one file has several ranges, list them on separate lines. A path must contain a "/"; write a repository-root file as \`./package.json\`.
|
|
32
|
+
5. Update the code and test paths under "Evidence" to match the changed code. Write each path as a backtick path relative to \`codeRoot\` in \`crumbs.json\` (the repository root by default). If a line range is needed, append it like \`src/auth/session.ts:12-48\`. Attach only one range to each path; if one file has several ranges, list them on separate lines. A path must contain a "/"; write a repository-root file as \`./package.json\`.
|
|
33
33
|
6. Do not describe a policy that code, tests, or material the user supplied does not confirm. Write it as \`[needs confirmation]\` and a question, in the format of step 5 of "Document existing code".
|
|
34
34
|
7. Keep links in both directions. If you added a link to another detail document, add the link back under that document's "Related". If a document's title or scope changed, update its one-line entry in the overview's "Documents" and its line in the index.
|
|
35
35
|
8. Add a log entry. The title is one sentence stating the user-visible result, not the task name. The body is written in the order \`Result:\`, \`Reason:\`, \`Document:\` and does not list files. If the same task touched several documents, group it into one entry per domain and give the count under \`Result:\`.
|
|
@@ -116,7 +116,7 @@ Finds an answer in the spec documents and answers with the source attached. As s
|
|
|
116
116
|
3. Read "Documents" in that domain's \`${p.overview}\` and pick the detail document whose responsibility matches. If the question's wording appears as an alias under "Terms", the link on that line is the owning document.
|
|
117
117
|
4. Read "Current behavior" and "Policies" in the detail document. If the policy's \`### heading\` is here, this document is the owner. Stop here.
|
|
118
118
|
5. If not, follow the document's "Related" links one step only. If it is still not there, the question is not in the documents. Do not search every other domain; answer "not in the documents".
|
|
119
|
-
6. If the documents are silent and the user still wants an answer, read the code paths under "Evidence" and answer. State that the answer came from code.
|
|
119
|
+
6. If the documents are silent and the user still wants an answer, read the code paths under "Evidence" (relative to \`codeRoot\` in \`crumbs.json\`) and answer. State that the answer came from code.
|
|
120
120
|
|
|
121
121
|
## How to answer
|
|
122
122
|
|
|
@@ -233,7 +233,7 @@ Applies one source file to the spec documents. The material is read only and is
|
|
|
233
233
|
- From the "Related" section of each document you found, check one more step for documents the change carries to.
|
|
234
234
|
4. Make the change list and show it. For each item, give the owning document, the section ("Current behavior" or \`### policy name\`), the current wording → the wording the material implies, and the part of the material that is the evidence. If the material conflicts with a current document, mark it as a conflict and ask which is right. If the material states a new policy that no document has, mark it "new" and propose which document should own it.
|
|
235
235
|
5. Wait for confirmation. Do not change documents without it. If only some items are approved, reflect only the approved items.
|
|
236
|
-
6. Update the owning documents. Edit only one owning document per policy; in other documents keep only a link to that policy. When a question policy is confirmed, leave a \`decision\` entry and put a decision link at the end of the confirmed policy text (format in step 1 of crumbs-writer "Document existing code"). If the material confirms a value, write it as a statement; if the material is ambiguous, write it as a \`[needs confirmation]\` question (format in step 5 of crumbs-writer "Document existing code"). Cite the material in "Evidence" as a backtick path (\`${p.rawDir}/<file
|
|
236
|
+
6. Update the owning documents. Edit only one owning document per policy; in other documents keep only a link to that policy. When a question policy is confirmed, leave a \`decision\` entry and put a decision link at the end of the confirmed policy text (format in step 1 of crumbs-writer "Document existing code"). If the material confirms a value, write it as a statement; if the material is ambiguous, write it as a \`[needs confirmation]\` question (format in step 5 of crumbs-writer "Document existing code"). Cite the material in "Evidence" as a backtick path (\`${p.rawDir}/<file>\`, written from the repository root even when \`codeRoot\` is set — \`check\` confirms that it exists). If you need to point to a specific part of the material, give the page or section after \` — \`.
|
|
237
237
|
7. If the scope changed, update the one-line entry in the overview's "Documents" and in the index. If you created a new document, follow steps 3 to 6 of crumbs-writer "Document existing code": start from the template and link it from the overview and the index.
|
|
238
238
|
8. Add a log entry. Name the material file and the changed document in the body.
|
|
239
239
|
\`npx crumbs-spec log add --kind ingest "<one sentence stating the user-visible result>" --body "Result: <changed user-visible result>. Reason: ${p.rawDir}/<file>. Document: [<policy name>](<domain>/<document>.md#<anchor>)"\`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-en.js","sourceRoot":"","sources":["../../../src/templates/skills-en.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,kFAAkF;AAElF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;yFAE4C,CAAC,CAAC,OAAO;;;;;;;;;OAS3F,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;WAChB,CAAC,CAAC,QAAQ
|
|
1
|
+
{"version":3,"file":"skills-en.js","sourceRoot":"","sources":["../../../src/templates/skills-en.ts"],"names":[],"mappings":"AAGA,qFAAqF;AACrF,kFAAkF;AAElF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;yFAE4C,CAAC,CAAC,OAAO;;;;;;;;;OAS3F,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;WAChB,CAAC,CAAC,QAAQ;iQAC4O,CAAC,CAAC,MAAM;OAClQ,CAAC,CAAC,OAAO,gCAAgC,CAAC,CAAC,OAAO;;;;;;;;;;;sLAW6H,CAAC,CAAC,OAAO,gEAAgE,CAAC,CAAC,OAAO,mFAAmF,CAAC,CAAC,OAAO;;;2WAGO,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;gIAiBhP,CAAC,CAAC,QAAQ;8JACoB,CAAC,CAAC,OAAO;wBAC/I,CAAC,CAAC,OAAO,ihBAAihB,CAAC,CAAC,QAAQ;kHAC1c,CAAC,CAAC,GAAG;;;0BAG7F,CAAC,CAAC,OAAO,4DAA4D,CAAC,CAAC,OAAO,sCAAsC,CAAC,CAAC,QAAQ;gCACxH,CAAC,CAAC,OAAO;0BACf,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;mJA0BgH,CAAC,CAAC,QAAQ,6CAA6C,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,+DAA+D,CAAC,CAAC,KAAK;;;;;;;;;;;8BAWtQ,CAAC,CAAC,MAAM;;;;;;;;gEAQ0B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;CACjF,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;iFAEoC,CAAC,CAAC,OAAO;;;;;;;;;YAS9E,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,+HAA+H,CAAC,CAAC,OAAO;+GACzD,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ;yCACtG,CAAC,CAAC,QAAQ;;;;;;;8EAO2B,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCtF,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;;;;;YAWpC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,QAAQ;;;gDAGZ,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CvD,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;wDAEW,CAAC,CAAC,MAAM;;;;;;;;;sFASsB,CAAC,CAAC,MAAM,kEAAkE,CAAC,CAAC,MAAM;;;gBAGxJ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,qBAAqB,CAAC,CAAC,QAAQ;6EACU,CAAC,CAAC,OAAO;oIAC8C,CAAC,CAAC,OAAO;;;;2jBAI8a,CAAC,CAAC,MAAM;;;qJAG9a,CAAC,CAAC,MAAM;;;;;;;+CAO9G,CAAC,CAAC,MAAM;;;;;;CAMtD,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAoD;IACvE,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,MAAM;CACxB,CAAC"}
|
|
@@ -14,7 +14,7 @@ description: crumbs 스펙 문서(${p.specDir}/ 아래의 책임 문서)를 쓰
|
|
|
14
14
|
|
|
15
15
|
1. \`${p.specDir}/${p.index}\`. 매번 먼저 읽는다. 도메인과 개요 문서의 목록이다.
|
|
16
16
|
2. 요청이 건드리는 도메인의 \`${p.overview}\`, 그다음 상세 문서와 그 문서의 "관련 문서".
|
|
17
|
-
3. \`crumbs.json\`. \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, \`headings\`가 기본값과 다르면 그 값을 쓴다.
|
|
17
|
+
3. \`crumbs.json\`. \`specDir\`, \`overview\`, \`log\`, \`rawDir\`, \`headings\`가 기본값과 다르면 그 값을 쓴다. "근거"의 코드·테스트 경로는 \`codeRoot\`(기본값은 저장소 루트) 기준이고, \`${p.rawDir}/\` 아래 원본 자료는 언제나 저장소 루트 기준으로 쓴다.
|
|
18
18
|
4. \`${p.specDir}/templates/detail.md\`와 \`${p.specDir}/templates/overview.md\`. 새 문서는 이 템플릿에서 시작한다.
|
|
19
19
|
|
|
20
20
|
## 모드 고르기
|
|
@@ -30,7 +30,7 @@ description: crumbs 스펙 문서(${p.specDir}/ 아래의 책임 문서)를 쓰
|
|
|
30
30
|
2. 소유 문서가 둘 이상으로 보이면 멈추고 어느 문서가 소유자인지 묻는다. 정책 하나를 두 문서에 적지 않는다.
|
|
31
31
|
3. "현재 동작"을 바뀐 뒤의 동작으로 고쳐 쓴다. "이전에는 … 지금은 …" 같은 이력 서술, 변경 날짜, 요구사항 ID를 넣지 않는다. "흐름"의 도식·표가 그 동작을 담고 있으면 같이 고친다.
|
|
32
32
|
4. "정책"에서 바뀐 정책의 본문을 고치고, 새 정책은 \`### 정책 이름\`으로 더하고, 없어진 정책은 지운다. 같은 이름의 정책이 다른 문서에 이미 있으면 그 문서가 소유자이므로 거기서 고치고, 이 문서에는 링크만 둔다. 확정된 정책은 본문 마지막 문장 뒤에 결정 링크 \`(결정: [YYYY-MM-DD](../${p.log}#<항목 앵커>))\`를 하나 둘 수 있다. 이것이 변경 이력을 넣지 않는다는 규칙의 유일한 예외다. 이유와 원본은 적지 않고, 링크 글자에 결정 날짜만 쓴다. 항목 앵커는 \`decision\` 항목 제목의 슬러그다(형식은 "기존 코드 문서화" 1단계).
|
|
33
|
-
5. "근거"의 코드·테스트 경로를 바뀐 코드에 맞춘다. 경로는 저장소 루트 기준 백틱 경로로 적고, 줄 범위가 필요하면 \`src/auth/session.ts:12-48\`처럼 붙인다. 범위는 경로 하나에 하나만 붙이고, 한 파일에 범위가 여럿이면 줄을 나눠 적는다. 경로에는 \`/\`가 있어야 하며 루트 파일은 \`./package.json\`처럼 쓴다.
|
|
33
|
+
5. "근거"의 코드·테스트 경로를 바뀐 코드에 맞춘다. 경로는 \`crumbs.json\`의 \`codeRoot\`(기본값은 저장소 루트) 기준 백틱 경로로 적고, 줄 범위가 필요하면 \`src/auth/session.ts:12-48\`처럼 붙인다. 범위는 경로 하나에 하나만 붙이고, 한 파일에 범위가 여럿이면 줄을 나눠 적는다. 경로에는 \`/\`가 있어야 하며 루트 파일은 \`./package.json\`처럼 쓴다.
|
|
34
34
|
6. 코드·테스트·사용자가 준 자료로 확인되지 않은 정책은 서술하지 않고 "기존 코드 문서화" 5번 형식대로 \`[확인 필요]\`와 질문으로 적는다.
|
|
35
35
|
7. 링크를 양방향으로 맞춘다. 다른 상세 문서로 링크를 더했으면 그 문서의 "관련 문서"에 되돌아오는 링크를 더한다. 문서 제목이나 범위가 바뀌었으면 개요의 "문서 목록" 한 줄과 인덱스의 한 줄을 고친다.
|
|
36
36
|
8. 로그 항목을 추가한다. 제목은 작업명이 아니라 사용자 결과 한 문장이고, 본문은 \`결과:\`·\`이유:\`·\`문서:\` 순서로 쓰며 파일 목록은 적지 않는다. 같은 작업을 여러 문서에 반복했으면 도메인마다 한 항목으로 묶고 \`결과:\`에 수량을 적는다.
|
|
@@ -119,7 +119,7 @@ description: crumbs 스펙 문서(${p.specDir}/)에서 현재 동작과 정책
|
|
|
119
119
|
3. 그 도메인의 \`${p.overview}\`에서 "문서 목록"을 읽고 책임이 맞는 상세 문서를 고른다. 질문의 표현이 "용어" 절의 별칭에 있으면 그 줄의 링크가 소유 문서다.
|
|
120
120
|
4. 상세 문서의 "현재 동작"과 "정책"을 읽는다. 질문한 정책의 \`### 제목\`이 여기 있으면 이 문서가 소유자다. 여기서 멈춘다.
|
|
121
121
|
5. 없으면 그 문서의 "관련 문서"를 한 단계만 따라간다. 그래도 없으면 질문은 문서에 없는 것이다. 다른 도메인을 모두 뒤지지 말고 "문서에 없음"으로 답한다.
|
|
122
|
-
6. 문서가 침묵하고 사용자가 원하면 "근거"의 코드
|
|
122
|
+
6. 문서가 침묵하고 사용자가 원하면 "근거"의 코드 경로(\`crumbs.json\`의 \`codeRoot\` 기준)를 읽어 답한다. 이때 답이 코드에서 왔다고 밝힌다.
|
|
123
123
|
|
|
124
124
|
## 답하는 방식
|
|
125
125
|
|
|
@@ -238,7 +238,7 @@ description: ${p.rawDir}/ 아래에 새로 놓인 원본 자료(계약서, 기
|
|
|
238
238
|
- 찾은 문서의 "관련 문서"에서 영향이 이어지는 문서를 한 단계 더 본다.
|
|
239
239
|
4. 변경 목록을 만들어 보여 준다. 항목마다 소유 문서, 절("현재 동작" 또는 \`### 정책 이름\`), 지금 서술 → 자료에 따른 서술, 자료의 어느 부분이 근거인지를 적는다. 자료와 현재 문서가 충돌하면 충돌로 표시하고 어느 쪽이 맞는지 묻는다. 자료가 기존 문서에 없는 새 정책을 말하면 "신규"로 표시하고 어느 문서가 소유할지 제안한다.
|
|
240
240
|
5. 확인을 기다린다. 확인 없이 문서를 바꾸지 않는다. 일부만 승인되면 승인된 항목만 반영한다.
|
|
241
|
-
6. 소유 문서를 갱신한다. 정책마다 소유 문서 하나만 고치고, 다른 문서에는 그 정책으로 가는 링크만 둔다. 질문 정책이 확정되면 \`decision\` 항목을 남기고, 확정한 정책 본문 끝에 결정 링크를 둔다. 자료가 값을 확정하면 서술로 적고, 자료가 모호하면 \`[확인 필요]\` 질문으로 적는다(형식은 crumbs-writer "기존 코드 문서화" 5번). "근거"에 자료를 백틱 경로로 인용한다(\`${p.rawDir}
|
|
241
|
+
6. 소유 문서를 갱신한다. 정책마다 소유 문서 하나만 고치고, 다른 문서에는 그 정책으로 가는 링크만 둔다. 질문 정책이 확정되면 \`decision\` 항목을 남기고, 확정한 정책 본문 끝에 결정 링크를 둔다. 자료가 값을 확정하면 서술로 적고, 자료가 모호하면 \`[확인 필요]\` 질문으로 적는다(형식은 crumbs-writer "기존 코드 문서화" 5번). "근거"에 자료를 백틱 경로로 인용한다(\`${p.rawDir}/<파일>\`, \`codeRoot\`를 바꿨어도 저장소 루트 기준 — \`check\`가 존재를 확인한다). 자료의 특정 부분을 가리켜야 하면 \` — \` 뒤에 쪽이나 절을 적는다.
|
|
242
242
|
7. 범위가 바뀌었으면 개요의 "문서 목록" 한 줄과 인덱스의 한 줄을 고친다. 새 문서를 만들었으면 crumbs-writer의 "기존 코드 문서화" 3~6단계대로 템플릿에서 시작해 개요와 인덱스에 연결한다.
|
|
243
243
|
8. 로그 항목을 추가한다. 본문에 자료 파일과 수정한 문서를 적는다.
|
|
244
244
|
\`npx crumbs-spec log add --kind ingest "<사용자 결과 한 문장>" --body "결과: <바뀐 사용자 결과>. 이유: ${p.rawDir}/<파일>. 문서: [<정책 이름>](<도메인>/<문서>.md#<앵커>)"\`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-ko.js","sourceRoot":"","sources":["../../../src/templates/skills-ko.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,uDAAuD;AAEvD,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;4BAEjB,CAAC,CAAC,OAAO;;;;;;;;;;OAU9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;qBACN,CAAC,CAAC,QAAQ
|
|
1
|
+
{"version":3,"file":"skills-ko.js","sourceRoot":"","sources":["../../../src/templates/skills-ko.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,uDAAuD;AAEvD,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;4BAEjB,CAAC,CAAC,OAAO;;;;;;;;;;OAU9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK;qBACN,CAAC,CAAC,QAAQ;yJAC0H,CAAC,CAAC,MAAM;OAC1J,CAAC,CAAC,OAAO,6BAA6B,CAAC,CAAC,OAAO;;;;;;;;;;;kFAW4B,CAAC,CAAC,OAAO,qCAAqC,CAAC,CAAC,OAAO,mCAAmC,CAAC,CAAC,OAAO;;;oLAGD,CAAC,CAAC,GAAG;;;;;;;;;;;;;;;;;oEAiBrH,CAAC,CAAC,QAAQ;sEACR,CAAC,CAAC,OAAO;uIACwD,CAAC,CAAC,OAAO,kIAAkI,CAAC,CAAC,QAAQ;uEACrN,CAAC,CAAC,GAAG;;;kBAG1D,CAAC,CAAC,OAAO,wBAAwB,CAAC,CAAC,OAAO,mCAAmC,CAAC,CAAC,QAAQ;gBACzF,CAAC,CAAC,OAAO;SAChB,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;SA2BT,CAAC,CAAC,QAAQ,6DAA6D,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,iCAAiC,CAAC,CAAC,QAAQ,kDAAkD,CAAC,CAAC,KAAK;;;;;;;;;;;MAWlM,CAAC,CAAC,MAAM;;;;;;;;mCAQqB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;CACpD,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;4BAEjB,CAAC,CAAC,OAAO;;;;;;;;;;OAU9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,0DAA0D,CAAC,CAAC,OAAO;0BACpE,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ;cAC5C,CAAC,CAAC,QAAQ;;;;;;;iCAOS,CAAC,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCzC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;;;;;;;;;;;OAYzC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,2BAA2B,CAAC,CAAC,QAAQ;;;uBAGzC,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C9B,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC;;eAE9B,CAAC,CAAC,MAAM;;;;;;;;;;iCAUU,CAAC,CAAC,MAAM,4CAA4C,CAAC,CAAC,MAAM;;;SAGpF,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,QAAQ;0CACX,CAAC,CAAC,OAAO;mEACgB,CAAC,CAAC,OAAO;;;;uOAI2J,CAAC,CAAC,MAAM;;;0FAGrJ,CAAC,CAAC,MAAM;;;;;;;MAO5F,CAAC,CAAC,MAAM;;;;;;CAMb,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAoD;IACvE,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,SAAS;IAC7B,eAAe,EAAE,MAAM;CACxB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crumbs-spec",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Living specs for coding agents: one owner per policy, a machine-checked link graph, and skills that write, find, ask and ingest.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spec",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"build": "tsc -p tsconfig.json",
|
|
43
43
|
"prepare": "npm run build",
|
|
44
44
|
"postbuild": "node -e \"require('fs').chmodSync('dist/src/cli.js', 0o755)\"",
|
|
45
|
-
"test": "npm run build && node --test dist/test
|
|
45
|
+
"test": "npm run build && node --test dist/test/*.test.js",
|
|
46
46
|
"prepublishOnly": "npm test"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|