agent-work-loop 0.6.22 → 0.6.25
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.md +89 -20
- package/dist/{brief-Z3JKXEUP.js → brief-LZ6JC5V5.js} +5 -5
- package/dist/{changelog-R7BNBF2C.js → changelog-ZCPSFDX3.js} +5 -5
- package/dist/{chunk-X5LMP5J7.js → chunk-4MWV4RBI.js} +4 -4
- package/dist/{chunk-TKPHC32G.js → chunk-57EWVAZO.js} +4 -4
- package/dist/{chunk-UOPWVM2H.js → chunk-5TFILHLH.js} +2 -2
- package/dist/{chunk-I77CXOEX.js → chunk-6MG6CQBD.js} +3 -3
- package/dist/{chunk-CCMG377E.js → chunk-7KIVLJG3.js} +6 -6
- package/dist/{chunk-BUWGQVHT.js → chunk-ELQ4VANN.js} +1 -1
- package/dist/{chunk-LMWAVN7B.js → chunk-F7Z3S5LD.js} +8 -8
- package/dist/{chunk-O7GRZZPJ.js → chunk-FBRW7KKY.js} +5 -5
- package/dist/{chunk-VU6IPRRM.js → chunk-JQN653ZS.js} +2 -2
- package/dist/{chunk-ZLTOL3D3.js → chunk-MJT6UANJ.js} +2 -2
- package/dist/{chunk-7SYRDDTX.js → chunk-OTN2QONN.js} +11 -2
- package/dist/{chunk-C7TN3LM3.js → chunk-QLUBNGHR.js} +13 -8
- package/dist/{chunk-FBEUJR2P.js → chunk-R2RZC5NQ.js} +5 -5
- package/dist/{chunk-4OCSYHYB.js → chunk-SBX6LOQE.js} +2 -2
- package/dist/{chunk-F5LHXBH7.js → chunk-WRNCUSNU.js} +2 -2
- package/dist/{chunk-6E7XEQOH.js → chunk-ZYXKMNHC.js} +1 -1
- package/dist/cli.js +89 -52
- package/dist/{commit-APXIVOSD.js → commit-4XEKMCJF.js} +6 -6
- package/dist/{config-TFMW7O4T.js → config-BZDCXBQ5.js} +3 -3
- package/dist/{doctor-BU6HWXE4.js → doctor-ST67JMQ6.js} +8 -8
- package/dist/{evolve-NNQX2A43.js → evolve-ZBSIUZXP.js} +7 -7
- package/dist/{feedback-KAXNFMUY.js → feedback-HVNBFJBW.js} +5 -5
- package/dist/{gotchas-CW4KZDEF.js → gotchas-642PZ5AQ.js} +7 -7
- package/dist/{hold-recheck-SLI7NDLU.js → hold-recheck-N3UCEIXL.js} +16 -16
- package/dist/{init-UDM5AXKI.js → init-2FPJSD64.js} +2 -2
- package/dist/lane-7AB53N4M.js +41 -0
- package/dist/{loop-summary-XAI6KOGB.js → loop-summary-22VD3BDL.js} +6 -6
- package/dist/{metrics-WLRZZRTK.js → metrics-4OT2R3GT.js} +4 -4
- package/dist/{record-UKDIUJ5T.js → record-CJONXDR2.js} +5 -5
- package/dist/{review-NTZ3HY3N.js → review-L52UGCIJ.js} +13 -13
- package/dist/{rules-4VDP5LZW.js → rules-U7UCVU5O.js} +8 -8
- package/dist/{state-XM7NZ2HA.js → state-3G4XAB6P.js} +4 -4
- package/dist/status-7V4W52VA.js +40 -0
- package/dist/{uninstall-MOHJDMQH.js → uninstall-M7Z6SO7L.js} +15 -15
- package/dist/{update-AYTBYAHI.js → update-LQBVQIXW.js} +2 -2
- package/dist/{verify-6YF5FXWM.js → verify-PYZXB67X.js} +10 -10
- package/dist/version-check-QQDDSBU7.js +14 -0
- package/dist/{work-6MMIQMUC.js → work-VTHTF4AQ.js} +14 -14
- package/engine/skills/claude/awl-pipeline/SKILL.md +6 -0
- package/engine/version.json +1 -1
- package/package.json +2 -2
- package/dist/lane-MIVLTDEU.js +0 -41
- package/dist/status-I3MQOCQM.js +0 -40
- package/dist/version-check-G27JYMTZ.js +0 -14
package/README.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
`agent-work-loop`(명령어: `awl`)은 AI 에이전트가 같은 실패를 두 번 반복하지 않도록 돕는 도구입니다. 에이전트가 작업하며 남긴 기록, 검증 결과, 완료 조건, 규칙, 교훈, 막힘을 파일로 관리합니다.
|
|
4
4
|
|
|
5
|
-
이 README는 **실용
|
|
5
|
+
이 README는 **실용 문서**입니다. 설치부터 첫 루프까지, 손으로 따라 할 수 있는 순서만 다룹니다. "왜 이렇게 만들었는가"(하네스 개념, 게이트 위치, narrative 실증 사례)는 [`docs/presentation/storyline.md`](docs/presentation/storyline.md)에 따로 정리했습니다. 명령어 하나하나의 자세한 사용법은 [`docs/presentation/commands.md`](docs/presentation/commands.md)를 참고하세요.
|
|
6
6
|
|
|
7
7
|
**awl 자체는 판단하지 않습니다.** LLM을 호출하지 않고, 파일과 상태만 결정적으로 다룹니다. 무엇을 배우고 어떤 규칙을 세울지는 이미 설치된 에이전트(Claude Code, Codex)가 스킬로 판단합니다.
|
|
8
8
|
|
|
9
|
-
크로스 환경을 처음부터 전제로 합니다. macOS와 Windows, Claude Code와 Codex를 모두 지원하는 것을 목표로 합니다(Windows는 아직 macOS만큼 검증되지
|
|
9
|
+
크로스 환경을 처음부터 전제로 합니다. macOS와 Windows, Claude Code와 Codex를 모두 지원하는 것을 목표로 합니다(Windows는 아직 macOS만큼 검증되지 않았습니다. [알려진 위험](docs/decisions.md)을 참고하세요).
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
세 단계로 나뉩니다. 자세한 판단 기준은 [`storyline.md` 3절](docs/presentation/storyline.md)에 있고, 여기서는 요약만 둡니다.
|
|
16
16
|
|
|
17
|
-
1. **요구사항
|
|
18
|
-
2. **완료 조건이 여러 개고 되돌아볼 가치가 있는
|
|
19
|
-
3. **여러 워크아이템을 동시에 격리해서 돌려야 할
|
|
17
|
+
1. **요구사항 하나**: 그냥 합니다. awl이 필요 없습니다.
|
|
18
|
+
2. **완료 조건이 여러 개고 되돌아볼 가치가 있는 작업**: `/awl-loop`. 조사→게이트1→자율 반복→게이트2→evolve를 한 세션이 진행합니다.
|
|
19
|
+
3. **여러 워크아이템을 동시에 격리해서 돌려야 할 때**: `/awl-pipeline`(Claude Code 전용). `awl lane`으로 격리 워크트리를 만들고, 오케스트레이터가 plan/exec/review를 스폰합니다.
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -105,10 +105,10 @@ $ awl init
|
|
|
105
105
|
|
|
106
106
|
`awl init`이 만든 것:
|
|
107
107
|
|
|
108
|
-
- **`.awl/config.json
|
|
109
|
-
- **`.awl/state.json
|
|
110
|
-
- **`.claude/skills/`** 또는 **`AGENTS.md
|
|
111
|
-
- **`.git/hooks/pre-push
|
|
108
|
+
- **`.awl/config.json`**: 검증 명령과 프로젝트 성격. **커밋하세요.** 팀원이 같이 씁니다.
|
|
109
|
+
- **`.awl/state.json`**: 지금 어느 워크아이템의 어느 단계인지. gitignore 대상입니다.
|
|
110
|
+
- **`.claude/skills/`** 또는 **`AGENTS.md`**: 작업 루프 스킬. 선택한 에이전트에 설치됩니다.
|
|
111
|
+
- **`.git/hooks/pre-push`**: `AWL_ALLOW_PUSH=1` 없이는 `git push`를 막는 훅. "push는 사람이 한다"는 규칙을 git 레벨에서도 강제합니다(사람이 push할 때는 `AWL_ALLOW_PUSH=1 git push`로 명시적으로 통과시킵니다).
|
|
112
112
|
|
|
113
113
|
이제 에이전트(Claude Code / Codex)를 열고 목표를 서술문으로 줍니다.
|
|
114
114
|
|
|
@@ -124,6 +124,75 @@ awl status # 지금 어디까지 왔는지 한눈에
|
|
|
124
124
|
|
|
125
125
|
---
|
|
126
126
|
|
|
127
|
+
## LLM과 함께 실제로 쓰는 시나리오
|
|
128
|
+
|
|
129
|
+
위 5분 시작이 워크아이템 하나를 트리거하는 법이었다면, 여기서는 설치부터 여러 워크아이템을 동시에 돌리는 것까지 이어 붙입니다.
|
|
130
|
+
|
|
131
|
+
### 워크아이템 하나: `/awl-loop`
|
|
132
|
+
|
|
133
|
+
위 "5분 시작"에서 다룬 흐름 그대로입니다. `awl init`이 설치한 스킬로 에이전트를 열고 목표 하나를 서술문으로 던지면, 한 세션이 조사부터 게이트1·게이트2까지 진행합니다. 무관한 작업을 여러 개 동시에 돌리고 싶을 때는 다음으로 넘어갑니다.
|
|
134
|
+
|
|
135
|
+
### 여러 워크아이템 동시에: `/awl-pipeline`
|
|
136
|
+
|
|
137
|
+
무관한 작업 여러 개를 병행하고 싶으면 `/awl-pipeline <레인명> <mode>`를 씁니다.
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
/awl-pipeline design-tokens gate-medium
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**지금은 Claude Code 전용입니다.** `engine/skills/codex/`엔 `AGENTS.awl.md` 파일 하나뿐이고 그 안엔 `awl-loop` 블록만 있습니다. Codex에서 `awl init`을 다시 돌려도 `awl-pipeline` 트리거는 설치되지 않습니다.
|
|
144
|
+
|
|
145
|
+
**레인명(첫 인자)**: 이름을 주면 `.awl-worktrees/<이름>`에 격리 워크트리를 만들어(없으면 자동으로 `awl lane new`) 그 안에서 돕니다. 인자를 생략하면(mode만 주거나 아무 인자도 없으면) cwd 대신 `unknown-lane-<N>`을 자동으로 만들어 격리해서 돕니다. cwd에 이미 다른 파이프라인이 돌고 있을 때 스폰이 엉키는 사고를 막기 위한 기본값입니다. `.`을 명시하면(`/awl-pipeline . gate-low`) 자동 격리 없이 지금 cwd를 그대로 씁니다. cwd에 라이브 파이프라인이 없다고 확신할 때만 쓰는 탈출구입니다.
|
|
146
|
+
|
|
147
|
+
**mode(둘째 인자)**: 게이트 밀도입니다. 생략하면 `gate-high`.
|
|
148
|
+
|
|
149
|
+
| mode | 축약 | 뜻 |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| `gate-high`(기본) | `--gh` | 게이트마다 사람 승인을 기다립니다. 개입 최대 |
|
|
152
|
+
| `gate-medium` | `--gm` | 승인은 자동 진행하되, 심각도 `high`인 항목만 큐에 모아 사이클 끝에 따로 보고합니다 |
|
|
153
|
+
| `gate-low` | `--gl` | 전부 자율로 진행하고, 사이클 끝에 요약만 한 번 보여줍니다. 개입 최소 |
|
|
154
|
+
|
|
155
|
+
### 실행 시점에 실제로 벌어지는 일
|
|
156
|
+
|
|
157
|
+
`/awl-pipeline`을 받은 세션은 **오케스트레이터(plan 역할)**가 됩니다. 목표를 조사해 그 레인의 `.tasks/plan/<name>.md`로 쓰고, **exec·review를 백그라운드 LLM CLI 에이전트로 스폰**합니다. 한 레인에 워크아이템이 여러 개 쌓여도 exec는 자기 워처로 **하나씩 순차 소비**합니다(리뷰 피드백 반영이 신규 착수보다 항상 먼저). 여러 워크아이템을 동시에 붙잡고 뒤섞는 대신 한 번에 하나씩 끝내는 게 꼬임을 막는 방법입니다. 오케스트레이터는 그사이 새 목표를 계속 plan으로 흘려보낼 뿐, 실제 구현·검증은 스폰된 세션이 합니다.
|
|
158
|
+
|
|
159
|
+
### 완료 시점에 남는 기록
|
|
160
|
+
|
|
161
|
+
워크아이템이 게이트2를 통과하면 `awl evolve`가 그 워크아이템의 기록을 훑어 다음을 남깁니다.
|
|
162
|
+
|
|
163
|
+
- **`~/.awl/records/`**: 있었던 일의 전수(시도·실패·리뷰·게이트 결정 전부). 지우지 않습니다.
|
|
164
|
+
- **`~/.awl/gotchas/`**: evolve가 실패·리뷰 기록에서 뽑은 재사용 가능한 교훈 한 줄. 강제력 없습니다.
|
|
165
|
+
- **`~/.awl/generations/<project>/<WI>.json`**: 이 워크아이템의 세대 지표(완료조건 수, 평균 시도, 막힘 비율, 리뷰 지적 수 등) 스냅샷.
|
|
166
|
+
- 같은 gotcha가 2번 반복되면 사람이 `awl rules promote`로 **`~/.awl/rules/active/`**에 규칙으로 승격할 수 있습니다(자동 승격은 없습니다).
|
|
167
|
+
|
|
168
|
+
### 기록 보는 법
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
awl records --json # 있었던 일 전수(타입·워크아이템으로 필터 가능)
|
|
172
|
+
awl gotchas # 아직 규칙 안 된 교훈
|
|
173
|
+
awl rules # 이 프로젝트에 적용되는 규칙
|
|
174
|
+
awl metrics --compare # 워크아이템 세대별 지표 추세
|
|
175
|
+
awl brief # 오늘(KST) 진행분만 모아 보기
|
|
176
|
+
awl defer-summary # gate-medium/gate-low에서 보류된 중요 항목 최종 확인
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`~/.awl`을 직접 열어보면 이렇게 생겼습니다.
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
~/.awl/
|
|
183
|
+
engine/ 설치된 스킬 원본. awl update가 덮어쓰므로 손대지 않습니다
|
|
184
|
+
records/YYYY-MM.jsonl 월별 기록(append-only)
|
|
185
|
+
gotchas/*.json 아직 규칙 안 된 교훈
|
|
186
|
+
rules/active/R-NNN.md 승격된 규칙(상한 15개)
|
|
187
|
+
generations/<project>/ 워크아이템별 세대 지표 스냅샷
|
|
188
|
+
templates/ 개인 초안 기본값(강제 아님)
|
|
189
|
+
projects.json 등록된 프로젝트 목록
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
각 칸의 역할과 이걸 사람 단위로 쌓는 이유는 [`storyline.md` 4절·5절](docs/presentation/storyline.md)에서 더 다룹니다.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
127
196
|
## 명령어 요약
|
|
128
197
|
|
|
129
198
|
자주 쓰는 것만 적습니다. 25개 명령(사람용 17 + 스킬용 8) 전부와 실제 실행 예시는 [`commands.md`](docs/presentation/commands.md)에 있습니다.
|
|
@@ -141,7 +210,7 @@ awl feedback # awl 도구 자체에 대한 피드백
|
|
|
141
210
|
|
|
142
211
|
---
|
|
143
212
|
|
|
144
|
-
## 설정(config)
|
|
213
|
+
## 설정(config): 검증 명령과 모노레포
|
|
145
214
|
|
|
146
215
|
`.awl/config.json`은 프로젝트의 검증 명령을 담습니다. `awl verify`가 이 명령들을 실제로 실행해 통과/실패를 가릅니다.
|
|
147
216
|
|
|
@@ -201,7 +270,7 @@ awl rules promote G-003 \
|
|
|
201
270
|
--counter "이미 디자인 토큰 시스템이 없는 프로젝트"
|
|
202
271
|
```
|
|
203
272
|
|
|
204
|
-
교훈(gotcha, `~/.awl/gotchas`)과 awl 도구 자체 피드백(`~/.awl/records`, `awl record awl-feedback`)은 다른
|
|
273
|
+
교훈(gotcha, `~/.awl/gotchas`)과 awl 도구 자체 피드백(`~/.awl/records`, `awl record awl-feedback`)은 다른 종류입니다. 전자는 작업 대상 코드에 대한 것이고, 후자는 "awl commit이 이래서 아팠다" 같은 도구 자체의 문제입니다.
|
|
205
274
|
|
|
206
275
|
---
|
|
207
276
|
|
|
@@ -219,17 +288,17 @@ awl work switch <ID> # 보관된 워크아이템으로 전환
|
|
|
219
288
|
|
|
220
289
|
---
|
|
221
290
|
|
|
222
|
-
## 오케스트레이션
|
|
291
|
+
## 오케스트레이션 파이프라인: 여러 레인을 나란히
|
|
223
292
|
|
|
224
293
|
위 "워크아이템 병행"이 한 워크트리 안에서 작업을 순차로 오가는 **작업 루프**라면, 오케스트레이션은 워크아이템마다 전용 워크트리(레인)를 두고 **나란히** 진행하는 층입니다. 세 조각으로 씁니다.
|
|
225
294
|
|
|
226
|
-
- **`awl lane
|
|
227
|
-
- **`awl status --pipeline
|
|
228
|
-
- **역할 스킬(`awl-pipeline` 계열)
|
|
295
|
+
- **`awl lane`**: 격리 레인을 만듭니다. `awl lane new <이름>`은 전용 워크트리와 별도 `AWL_HOME`, 스킬 한 벌을 깔고 기동 안내를 찍습니다. `awl lane ls`로 현존 레인을 보고, `awl lane rm <이름>`으로 정리합니다.
|
|
296
|
+
- **`awl status --pipeline`**: 레인별 진행을 한 화면에 모읍니다. 각 레인 안의 plan/exec/review 단계 상태를 배지로 훑습니다.
|
|
297
|
+
- **역할 스킬(`awl-pipeline` 계열)**: 오케스트레이터(`/awl-pipeline`)가 plan 역할로 들어가 exec·review를 스폰합니다. `awl init`에서 Claude Code를 선택하면 함께 설치됩니다.
|
|
229
298
|
|
|
230
299
|
개념(왜 3단으로 나뉘는지, `pipeline-hold-recheck` 실증 사례)은 [`storyline.md` 3절·6절](docs/presentation/storyline.md)에서, 명령별 실행 예시는 [`commands.md`](docs/presentation/commands.md)에서 다룹니다.
|
|
231
300
|
|
|
232
|
-
**로드맵**: 지금은 오케스트레이터가 레인을 만들고 그 안에서 plan/exec/review 세션을 사람이 직접 엽니다. 목표 하나만 던지면 세션까지 자동으로 뜨는 auto-spawn은 설계만 있고 아직 탑재되지 않았습니다.
|
|
301
|
+
**로드맵**: 지금은 오케스트레이터가 레인을 만들고 그 안에서 plan/exec/review 세션을 사람이 직접 엽니다. 목표 하나만 던지면 세션까지 자동으로 뜨는 auto-spawn은 설계만 있고 아직 탑재되지 않았습니다. Codex 지원도 아직입니다. `awl-pipeline` 계열 스킬은 `engine/skills/claude/`에만 있고, Codex용 등가물은 없습니다.
|
|
233
302
|
|
|
234
303
|
---
|
|
235
304
|
|
|
@@ -239,7 +308,7 @@ awl work switch <ID> # 보관된 워크아이템으로 전환
|
|
|
239
308
|
`pnpm setup`을 실행하고 터미널을 새로 엽니다. pnpm 전역 bin이 PATH에 없어서입니다.
|
|
240
309
|
|
|
241
310
|
**`npm install -g agent-work-loop`를 했는데 `awl`이 아무것도 못 한다**
|
|
242
|
-
위 설치
|
|
311
|
+
위 설치 섹션을 참고하세요. 아직 npm에 `0.0.0` placeholder만 배포돼 있습니다. 저장소를 클론해 `pnpm install && pnpm run build && pnpm link --global`로 설치하세요.
|
|
243
312
|
|
|
244
313
|
**`awl --version`이 엔진 버전 불일치를 경고한다**
|
|
245
314
|
`awl`을 업그레이드했는데 `~/.awl/engine`은 예전 버전 그대로일 때 나옵니다. `awl update`로 엔진을 갱신하면 맞춰집니다(프로젝트 설정은 안 건드립니다). `awl version-check`로 어긋난 버전 쌍(package.json, 설치된 엔진, 프로젝트 config, 설치된 스킬)을 직접 봅니다. 프로젝트 config가 엔진보다 낡았다면 `awl init --yes`를 다시 실행합니다.
|
|
@@ -254,16 +323,16 @@ awl work switch <ID> # 보관된 워크아이템으로 전환
|
|
|
254
323
|
`verify.<name>.cwd`를 그 패키지 디렉토리로 지정하세요. `cwd` 없이 프로젝트 루트에서 실행하면 `../../node_modules/.bin/tsc` 같은 상대경로가 안 풀립니다.
|
|
255
324
|
|
|
256
325
|
**`awl commit`이 "hunk가 남의 변경과 겹칠 수 있다"며 거부한다**
|
|
257
|
-
정확한
|
|
326
|
+
정확한 동작입니다. 확신할 수 없으면 커밋하지 않고 사람에게 알리도록 설계했습니다. `git status`/`git diff`로 실제로 무엇이 섞였는지 확인하세요. 완료 조건마다 `awl commit <AC> -m`으로 닫고 넘어가는 습관을 들이세요(`awl commit --start`를 편집보다 먼저 호출하지 않으면 그 편집이 스냅샷에 흡수돼 격리 커밋이 무의미해집니다).
|
|
258
327
|
|
|
259
328
|
**`git push`가 막힌다**
|
|
260
329
|
`awl init`이 심는 pre-push 훅 때문입니다(위 5분 시작 참고). 정말 push하려면 `AWL_ALLOW_PUSH=1 git push`를 씁니다.
|
|
261
330
|
|
|
262
331
|
**게이트에서 스킬이 안 멈추고 그냥 진행한다**
|
|
263
|
-
스킬 문서가 게이트에서 반드시 도구를 호출하도록 지시돼 있습니다. 계속 안 멈추면 스킬이 최신인지
|
|
332
|
+
스킬 문서가 게이트에서 반드시 도구를 호출하도록 지시돼 있습니다. 계속 안 멈추면 스킬이 최신인지 확인하세요. `awl doctor`가 `claude-skill-vs-engine` 불일치를 경고하면 `awl init --yes`로 재설치합니다.
|
|
264
333
|
|
|
265
334
|
**awl을 완전히 제거하려면**
|
|
266
|
-
`awl uninstall`을
|
|
335
|
+
`awl uninstall`을 실행합니다. 기본은 드라이런이라 먼저 무엇이 지워질지 보여주고, 실제로 지우려면 `--yes`를 붙입니다. 기본은 이 프로젝트만 지우고, `~/.awl`까지 지우려면 `--global`을 명시해야 합니다. 자세한 플래그와 실제 출력은 [`commands.md`의 `awl uninstall`](docs/presentation/commands.md#awl-uninstall)을 참고하세요.
|
|
267
336
|
|
|
268
337
|
---
|
|
269
338
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadProjectName,
|
|
3
3
|
readRecords
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6MG6CQBD.js";
|
|
5
5
|
import {
|
|
6
6
|
loadState
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-SBX6LOQE.js";
|
|
8
8
|
import {
|
|
9
9
|
resolveProjectRoot,
|
|
10
10
|
run
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-5TFILHLH.js";
|
|
12
|
+
import "./chunk-ELQ4VANN.js";
|
|
13
|
+
import "./chunk-OTN2QONN.js";
|
|
14
14
|
|
|
15
15
|
// src/commands/brief.ts
|
|
16
16
|
var KST_OFFSET_MS = 9 * 60 * 60 * 1e3;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
readRecords
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6MG6CQBD.js";
|
|
4
4
|
import {
|
|
5
5
|
loadState
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SBX6LOQE.js";
|
|
7
7
|
import {
|
|
8
8
|
resolveProjectRoot
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-5TFILHLH.js";
|
|
10
|
+
import "./chunk-ELQ4VANN.js";
|
|
11
11
|
import {
|
|
12
12
|
caps,
|
|
13
13
|
signal
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-OTN2QONN.js";
|
|
15
15
|
|
|
16
16
|
// src/commands/changelog.ts
|
|
17
17
|
function runChangelogDraft(opts) {
|
|
@@ -5,22 +5,22 @@ import {
|
|
|
5
5
|
runWorkNew,
|
|
6
6
|
sanitizeForGit,
|
|
7
7
|
worktreeDirtyTracked
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-F7Z3S5LD.js";
|
|
9
9
|
import {
|
|
10
10
|
loadState,
|
|
11
11
|
writeState
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-SBX6LOQE.js";
|
|
13
13
|
import {
|
|
14
14
|
resolveProjectRoot,
|
|
15
15
|
run
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-5TFILHLH.js";
|
|
17
17
|
import {
|
|
18
18
|
caps,
|
|
19
19
|
card,
|
|
20
20
|
feedback,
|
|
21
21
|
makeColors,
|
|
22
22
|
signal
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-OTN2QONN.js";
|
|
24
24
|
|
|
25
25
|
// src/commands/lane.ts
|
|
26
26
|
import fs from "fs";
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
getLatestVersionCached,
|
|
4
4
|
name,
|
|
5
5
|
version
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JQN653ZS.js";
|
|
7
7
|
import {
|
|
8
8
|
resolveProjectRoot
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-5TFILHLH.js";
|
|
10
10
|
import {
|
|
11
11
|
packageEngineDir,
|
|
12
12
|
skillsVersionPath
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ELQ4VANN.js";
|
|
14
14
|
import {
|
|
15
15
|
caps,
|
|
16
16
|
card,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
makeSymbols,
|
|
20
20
|
makeTokens,
|
|
21
21
|
signal
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-OTN2QONN.js";
|
|
23
23
|
|
|
24
24
|
// src/commands/version-check.ts
|
|
25
25
|
import fs from "fs";
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
ask,
|
|
5
5
|
buildScreens,
|
|
6
6
|
promptNumber
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ELQ4VANN.js";
|
|
8
8
|
import {
|
|
9
9
|
caps,
|
|
10
10
|
card,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
makeColors,
|
|
13
13
|
makeSymbols,
|
|
14
14
|
signal
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-OTN2QONN.js";
|
|
16
16
|
|
|
17
17
|
// src/commands/config.ts
|
|
18
18
|
import fs from "fs";
|
|
@@ -2,18 +2,18 @@ import {
|
|
|
2
2
|
getCriterion,
|
|
3
3
|
loadState,
|
|
4
4
|
writeState
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-SBX6LOQE.js";
|
|
6
6
|
import {
|
|
7
7
|
resolveProjectRoot,
|
|
8
8
|
run
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-5TFILHLH.js";
|
|
10
10
|
import {
|
|
11
11
|
caps,
|
|
12
12
|
card,
|
|
13
13
|
makeColors,
|
|
14
14
|
recordsDir,
|
|
15
15
|
signal
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OTN2QONN.js";
|
|
17
17
|
|
|
18
18
|
// src/commands/record.ts
|
|
19
19
|
import crypto from "crypto";
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
gatherVersionInputs
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-57EWVAZO.js";
|
|
4
4
|
import {
|
|
5
5
|
checkVersions
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JQN653ZS.js";
|
|
7
7
|
import {
|
|
8
8
|
loadProjectName,
|
|
9
9
|
readRecords
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-6MG6CQBD.js";
|
|
11
11
|
import {
|
|
12
12
|
loadState,
|
|
13
13
|
readStateLock
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-SBX6LOQE.js";
|
|
15
15
|
import {
|
|
16
16
|
CommandNotFoundError,
|
|
17
17
|
run,
|
|
18
18
|
tokenize
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-5TFILHLH.js";
|
|
20
20
|
import {
|
|
21
21
|
caps,
|
|
22
22
|
card,
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
rulesDir,
|
|
33
33
|
signal,
|
|
34
34
|
visibleWidth
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-OTN2QONN.js";
|
|
36
36
|
|
|
37
37
|
// src/commands/doctor.ts
|
|
38
38
|
import fs from "fs";
|
|
@@ -7,29 +7,29 @@ import {
|
|
|
7
7
|
isCheckPassed,
|
|
8
8
|
runVerifyChecks,
|
|
9
9
|
writeVerifyBaseline
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-FBRW7KKY.js";
|
|
11
11
|
import {
|
|
12
12
|
gitBranch
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-7KIVLJG3.js";
|
|
14
14
|
import {
|
|
15
15
|
parseRuleFile
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-MJT6UANJ.js";
|
|
17
17
|
import {
|
|
18
18
|
nextGotchaId
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-QLUBNGHR.js";
|
|
20
20
|
import {
|
|
21
21
|
loadState,
|
|
22
22
|
migrateState,
|
|
23
23
|
writeState
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-SBX6LOQE.js";
|
|
25
25
|
import {
|
|
26
26
|
loadConfig,
|
|
27
27
|
resolveProjectRoot,
|
|
28
28
|
run
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-5TFILHLH.js";
|
|
30
30
|
import {
|
|
31
31
|
installClaudeSkill
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-ELQ4VANN.js";
|
|
33
33
|
import {
|
|
34
34
|
caps,
|
|
35
35
|
card,
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
makeSymbols,
|
|
40
40
|
makeTokens,
|
|
41
41
|
signal
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-OTN2QONN.js";
|
|
43
43
|
|
|
44
44
|
// src/commands/work.ts
|
|
45
45
|
import fs2 from "fs";
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
protectedFilesMessage
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZYXKMNHC.js";
|
|
4
4
|
import {
|
|
5
5
|
gitDirtyFiles
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-7KIVLJG3.js";
|
|
7
7
|
import {
|
|
8
8
|
applyVerificationAttempts,
|
|
9
9
|
loadState,
|
|
10
10
|
writeState
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-SBX6LOQE.js";
|
|
12
12
|
import {
|
|
13
13
|
CommandNotFoundError,
|
|
14
14
|
VERIFY_ORDER,
|
|
15
15
|
requireConfig,
|
|
16
16
|
run
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-5TFILHLH.js";
|
|
18
18
|
import {
|
|
19
19
|
caps,
|
|
20
20
|
card,
|
|
21
21
|
makeColors,
|
|
22
22
|
signal
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-OTN2QONN.js";
|
|
24
24
|
|
|
25
25
|
// src/commands/verify.ts
|
|
26
26
|
import fs from "fs";
|
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
acquireLock,
|
|
3
3
|
loadGotchaList,
|
|
4
4
|
releaseLock
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-QLUBNGHR.js";
|
|
6
6
|
import {
|
|
7
7
|
caps,
|
|
8
8
|
card,
|
|
9
9
|
makeColors,
|
|
10
10
|
rulesDir,
|
|
11
11
|
signal
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OTN2QONN.js";
|
|
13
13
|
|
|
14
14
|
// src/commands/rules.ts
|
|
15
15
|
import { spawnSync } from "child_process";
|
|
@@ -476,12 +476,21 @@ function makeColors(enabled) {
|
|
|
476
476
|
gray: (s) => ansi(90, s, enabled)
|
|
477
477
|
};
|
|
478
478
|
}
|
|
479
|
+
var RAINBOW = [196, 208, 226, 46, 51, 33, 129];
|
|
479
480
|
function gradient(lines, c) {
|
|
480
481
|
if (!c.color) {
|
|
481
482
|
return lines;
|
|
482
483
|
}
|
|
483
|
-
const
|
|
484
|
-
return lines.map((line
|
|
484
|
+
const maxWidth = Math.max(...lines.map((l) => [...l].length), 1);
|
|
485
|
+
return lines.map((line) => {
|
|
486
|
+
const chars = [...line];
|
|
487
|
+
return chars.map((ch, col) => {
|
|
488
|
+
if (ch === " ") return ch;
|
|
489
|
+
const ratio = maxWidth <= 1 ? 0 : col / (maxWidth - 1);
|
|
490
|
+
const idx = RAINBOW[Math.min(RAINBOW.length - 1, Math.floor(ratio * RAINBOW.length))];
|
|
491
|
+
return `\x1B[38;5;${idx}m${ch}${RESET}`;
|
|
492
|
+
}).join("");
|
|
493
|
+
});
|
|
485
494
|
}
|
|
486
495
|
var color = makeColors(caps().color);
|
|
487
496
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
computeDurationMs
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WRNCUSNU.js";
|
|
4
4
|
import {
|
|
5
5
|
computeCoverage,
|
|
6
6
|
readRecords
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6MG6CQBD.js";
|
|
8
8
|
import {
|
|
9
9
|
loadState
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-SBX6LOQE.js";
|
|
11
11
|
import {
|
|
12
12
|
requireConfig
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-5TFILHLH.js";
|
|
14
14
|
import {
|
|
15
15
|
caps,
|
|
16
16
|
generationsDir,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
lockFile,
|
|
20
20
|
makeColors,
|
|
21
21
|
signal
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-OTN2QONN.js";
|
|
23
23
|
|
|
24
24
|
// src/commands/evolve.ts
|
|
25
25
|
import fs from "fs";
|
|
@@ -267,10 +267,15 @@ function collectEvolve(project, workitem, state, scope) {
|
|
|
267
267
|
function writeGeneration(project, workitem, metrics, at, extra) {
|
|
268
268
|
const dir = generationsDir(project);
|
|
269
269
|
fs.mkdirSync(dir, { recursive: true });
|
|
270
|
-
const
|
|
270
|
+
const stamp = at.replace(/[:.]/g, "-");
|
|
271
|
+
const wi = workitem?.trim() ? workitem : "unknown";
|
|
272
|
+
const name = `${stamp}-${wi}.json`;
|
|
271
273
|
const file = path.join(dir, name);
|
|
272
|
-
fs.writeFileSync(
|
|
273
|
-
|
|
274
|
+
fs.writeFileSync(
|
|
275
|
+
file,
|
|
276
|
+
`${JSON.stringify({ workitem: wi, at, ...metrics, ...extra }, null, 2)}
|
|
277
|
+
`
|
|
278
|
+
);
|
|
274
279
|
return file;
|
|
275
280
|
}
|
|
276
281
|
function recordGotcha(input, at) {
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
WORKTREES_DIR
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4MWV4RBI.js";
|
|
4
4
|
import {
|
|
5
5
|
readRecords
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-6MG6CQBD.js";
|
|
7
7
|
import {
|
|
8
8
|
loadState
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-SBX6LOQE.js";
|
|
10
10
|
import {
|
|
11
11
|
resolveProjectRoot,
|
|
12
12
|
run
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-5TFILHLH.js";
|
|
14
14
|
import {
|
|
15
15
|
caps,
|
|
16
16
|
card,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
signal,
|
|
22
22
|
statusBadge,
|
|
23
23
|
stringWidth
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-OTN2QONN.js";
|
|
25
25
|
|
|
26
26
|
// src/commands/status.ts
|
|
27
27
|
import fs2 from "fs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
requireConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-5TFILHLH.js";
|
|
4
4
|
import {
|
|
5
5
|
caps,
|
|
6
6
|
card,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
makeColors,
|
|
9
9
|
padEndDisplay,
|
|
10
10
|
stringWidth
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-OTN2QONN.js";
|
|
12
12
|
|
|
13
13
|
// src/commands/metrics.ts
|
|
14
14
|
import fs from "fs";
|