okstra 0.3.0 → 0.5.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.kr.md +157 -0
- package/README.md +103 -1245
- package/bin/okstra +23 -6
- package/docs/kr/architecture.md +900 -0
- package/docs/kr/cli.md +400 -0
- package/package.json +4 -2
- package/runtime/BUILD.json +2 -2
- package/runtime/skills/okstra-history/SKILL.md +19 -0
- package/runtime/skills/okstra-report-finder/SKILL.md +19 -0
- package/runtime/skills/okstra-run/SKILL.md +11 -3
- package/runtime/skills/okstra-schedule/SKILL.md +22 -0
- package/runtime/skills/{setup-okstra → okstra-setup}/SKILL.md +3 -3
- package/runtime/skills/okstra-status/SKILL.md +22 -0
- package/runtime/skills/okstra-time-summary/SKILL.md +19 -0
- package/src/check-project.mjs +188 -0
- package/src/doctor.mjs +1 -1
- package/src/install.mjs +16 -2
- package/src/setup.mjs +243 -0
- package/src/uninstall.mjs +2 -2
package/docs/kr/cli.md
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
# okstra — CLI 인자 / 옵션 매뉴얼 (한국어)
|
|
2
|
+
|
|
3
|
+
> 이 문서는 [README.kr.md](../../README.kr.md) 의 보충 문서입니다. 내부 아키텍처와 storage / workflow 계약은 [architecture.md](architecture.md) 를 참고하세요.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Command forms
|
|
8
|
+
|
|
9
|
+
기본 명령(첫 진입 / full args):
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
scripts/okstra.sh [--render-only] [--yes] [--refresh-assets] --task-type <task-type> [--workers worker1,worker2] [--lead-model <model>] [--claude-model <model>] [--codex-model <model>] [--gemini-model <model>] [--report-writer-model <model>] [--related-tasks taskA,taskB] [--clarification-response <previous-final-report>] --project-id <project-id> --task-group <task-group> --task-id <task-id> --task-brief <brief-path> [--directive <directive>]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
후속 phase 단축 형식(기존 task-manifest.json이 존재할 때):
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
scripts/okstra.sh --task-key <project-id>:<task-group>:<task-id> [--task-type <task-type>]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Clarification 답변 즉시 재실행:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
scripts/okstra.sh --resume-clarification --task-key <project-id>:<task-group>:<task-id>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
interactive terminal에서 실행하면 다음 규칙이 추가로 적용됩니다.
|
|
28
|
+
|
|
29
|
+
- 필수 인자가 비어 있으면 stdin으로 직접 입력을 받습니다.
|
|
30
|
+
- 입력이 모두 준비되면 실행 전 요약을 보여줍니다.
|
|
31
|
+
- `y` 또는 `yes`를 입력했을 때만 실제 생성 또는 실행 단계로 진행합니다.
|
|
32
|
+
- interactive가 아닌 실행에서는 누락 인자를 prompt하지 않고 에러로 종료합니다.
|
|
33
|
+
- `--yes`를 사용하면 prompt와 confirmation을 모두 건너뛰지만, 이때는 모든 필수 인자가 반드시 이미 채워져 있어야 합니다.
|
|
34
|
+
- 우선순위는 `명시적 CLI 인자 > interactive prompt 또는 non-interactive 에러`입니다.
|
|
35
|
+
|
|
36
|
+
## Required arguments
|
|
37
|
+
|
|
38
|
+
### `--project-id`
|
|
39
|
+
|
|
40
|
+
전역에서 고유해야 하는 프로젝트 ID입니다. 첫 실행 시 `<PROJECT_ROOT>/.project-docs/okstra/project.json` 에 자기 등록(self-registration)되며, 동일 PROJECT_ROOT 에서 재실행할 때 인자값과 저장된 `projectId` 가 다르면 즉시 에러로 종료합니다.
|
|
41
|
+
|
|
42
|
+
예:
|
|
43
|
+
|
|
44
|
+
- `fontradar-v2-api`
|
|
45
|
+
- `jobs`
|
|
46
|
+
|
|
47
|
+
### `--task-group`
|
|
48
|
+
|
|
49
|
+
관련 task를 묶는 논리 그룹입니다.
|
|
50
|
+
|
|
51
|
+
예:
|
|
52
|
+
|
|
53
|
+
- `feature-8858`
|
|
54
|
+
- `bugfix-auth`
|
|
55
|
+
- `tasks`
|
|
56
|
+
|
|
57
|
+
### `--task-id`
|
|
58
|
+
|
|
59
|
+
같은 그룹 안에서 안정적으로 재사용할 task 식별자입니다.
|
|
60
|
+
|
|
61
|
+
예:
|
|
62
|
+
|
|
63
|
+
- `email-recipient-loss`
|
|
64
|
+
- `8852`
|
|
65
|
+
|
|
66
|
+
### `--task-type`
|
|
67
|
+
|
|
68
|
+
이번 run의 목적과 profile 선택, run directory 세그먼트, lifecycle phase 라우팅을 결정하는 단일 입력값입니다.
|
|
69
|
+
표준 값과 phase별 책임은 위 [Task type](#task-type) 섹션을 참고합니다.
|
|
70
|
+
|
|
71
|
+
### `--task-brief`
|
|
72
|
+
|
|
73
|
+
분석의 기준이 되는 task brief 문서 경로입니다.
|
|
74
|
+
상대 경로는 대상 프로젝트 루트를 기준으로 해석됩니다.
|
|
75
|
+
|
|
76
|
+
예:
|
|
77
|
+
|
|
78
|
+
- `.project-docs/linear/feature/8858/okstra-task-brief.md`
|
|
79
|
+
- `.project-docs/tasks/8852/BUG_REPORT.md`
|
|
80
|
+
|
|
81
|
+
### `--yes`
|
|
82
|
+
|
|
83
|
+
interactive prompt와 confirmation을 생략합니다.
|
|
84
|
+
|
|
85
|
+
대신 아래 조건이 강제됩니다.
|
|
86
|
+
|
|
87
|
+
- `project-id`
|
|
88
|
+
- `task-group`
|
|
89
|
+
- `task-id`
|
|
90
|
+
- `task-type`
|
|
91
|
+
- `brief-path`
|
|
92
|
+
|
|
93
|
+
즉, 필수 인자가 하나라도 비어 있으면 prompt하지 않고 즉시 종료합니다.
|
|
94
|
+
|
|
95
|
+
예:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
scripts/okstra.sh --yes --render-only --task-type error-analysis --project-id jobs --task-group tasks --task-id 8852 --task-brief .project-docs/tasks/8852/BUG_REPORT.md
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Optional arguments and options
|
|
102
|
+
|
|
103
|
+
### `--task-key`
|
|
104
|
+
|
|
105
|
+
기존 task에 대한 후속 phase를 시작할 때 `--project-id`/`--task-group`/`--task-id`를 한 번에 전달하는 단축 형식입니다.
|
|
106
|
+
|
|
107
|
+
- 입력 형식: `<project-id>:<task-group>:<task-id>`
|
|
108
|
+
- 동작:
|
|
109
|
+
- 세 ID로 split하여 `PROJECT_ID`/`TASK_GROUP`/`TASK_ID`에 채웁니다.
|
|
110
|
+
- 명시적으로 같은 값들이 함께 들어오면 일치할 때만 허용하고, 충돌하면 즉시 에러로 종료합니다.
|
|
111
|
+
- 해당 task의 `task-manifest.json`이 존재하면 누락된 `--task-brief`를 manifest의 `taskBriefPath` 로, 누락된 `--task-type`을 `workflow.nextRecommendedPhase` 로 자동 채웁니다.
|
|
112
|
+
- manifest가 없으면(첫 진입) 기존 누락-인자 검증이 그대로 동작합니다(=full args 강제).
|
|
113
|
+
- 명시적으로 전달된 인자가 항상 manifest 값보다 우선합니다.
|
|
114
|
+
- `nextRecommendedPhase`가 `pending-routing-decision` 또는 `done-or-follow-up`이면 자동 채움하지 않고, 사용자가 명시적으로 `--task-type`을 주거나 brief을 보강한 뒤 다시 실행해야 합니다.
|
|
115
|
+
|
|
116
|
+
예:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
scripts/okstra.sh --task-key jobs:tasks:8852
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
scripts/okstra.sh --task-key jobs:tasks:8852 --task-type final-verification
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### `--clarification-response`
|
|
127
|
+
|
|
128
|
+
이전 run의 final report(`Section 5. Clarification Requests for the Next Run`에 사용자가 답변을 inline으로 채운 파일)를 다음 run으로 carry-in합니다.
|
|
129
|
+
|
|
130
|
+
- 입력: `<previous-run>/reports/final-report-<task-type>-<seq>.md` 경로
|
|
131
|
+
- 동작: 파일을 현재 run의 `instruction-set/clarification-response.md`로 복사하고, lead가 Section 0에서 prior `Q*` 행의 `Status`(`resolved` / `obsolete`)를 갱신한 뒤 진행합니다.
|
|
132
|
+
- 사용 시점: `requirements-discovery`, `error-analysis`처럼 미해결 질문을 남기는 phase 이후, 사용자가 답변을 채워 다음 phase로 넘길 때.
|
|
133
|
+
|
|
134
|
+
예:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
scripts/okstra.sh \
|
|
138
|
+
--task-type implementation-planning \
|
|
139
|
+
--project-id jobs --task-group tasks --task-id 8852 \
|
|
140
|
+
--task-brief .project-docs/tasks/8852/BUG_REPORT.md \
|
|
141
|
+
--clarification-response .project-docs/okstra/tasks/tasks/8852/runs/2026-04-29/error-analysis/reports/final-report-2026-04-29_10-15-30.md
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### `--resume-clarification`
|
|
145
|
+
|
|
146
|
+
직전 `requirements-discovery` 또는 `error-analysis` run의 final report를 즉시 편집하고, 같은 phase를 자동으로 재실행합니다. `--clarification-response` 경로를 사용자가 직접 들고 다닐 필요가 없습니다.
|
|
147
|
+
|
|
148
|
+
- 입력: task identity (`--project-id` + `--task-group` + `--task-id`, 또는 `--task-key <p>:<g>:<i>`)
|
|
149
|
+
- 동작 순서:
|
|
150
|
+
1. task의 `runs/{requirements-discovery,error-analysis}/reports/final-report-*.md` 중 가장 최신 timestamp 파일을 자동 선택합니다.
|
|
151
|
+
2. `$EDITOR`(미설정 시 `vi`)로 해당 파일을 엽니다. 사용자는 Section 5의 `Q*` 행에 답변을 inline으로 채운 뒤 저장하고 종료합니다.
|
|
152
|
+
3. okstra가 같은 task-type으로 자기 자신을 `exec` 재호출하면서 편집된 파일을 `--clarification-response`로 carry-in 합니다.
|
|
153
|
+
4. 이후 confirmation, render, Claude handoff 흐름은 일반 실행과 동일합니다.
|
|
154
|
+
- 명시적 `--task-type`을 함께 주면 그 task type의 reports/ 만 검색합니다. 생략 시 `error-analysis` → `requirements-discovery` 순으로 검색하고 timestamp가 더 큰 보고서를 사용합니다.
|
|
155
|
+
- 다음 옵션과 함께 쓸 수 없습니다: `--render-only`, `--clarification-response`, `--approved-plan`.
|
|
156
|
+
- `EDITOR`를 비대화형 도구(예: `true`)로 설정하면 답변 편집을 건너뛴 채 곧바로 재실행됩니다. 디버깅용으로만 권장합니다.
|
|
157
|
+
|
|
158
|
+
예:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
scripts/okstra.sh --resume-clarification --task-key jobs:tasks:8852
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
EDITOR=code\ -w scripts/okstra.sh --resume-clarification --project-id jobs --task-group tasks --task-id 8852
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
내부적으로는 다음과 동등합니다.
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
$EDITOR <project-root>/.project-docs/okstra/tasks/<group>/<id>/runs/<task-type>/reports/final-report-<latest>.md
|
|
172
|
+
scripts/okstra.sh --task-type <same-type> \
|
|
173
|
+
--project-id <p> --task-group <g> --task-id <i> \
|
|
174
|
+
--task-brief <from manifest> \
|
|
175
|
+
--clarification-response <edited final-report-<latest>.md>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### `--project-root`
|
|
179
|
+
|
|
180
|
+
대상 프로젝트의 절대 경로입니다. 명시하지 않으면 `okstra.sh` 가 다음 우선순위로 자동 해석합니다.
|
|
181
|
+
|
|
182
|
+
1. cwd 또는 그 조상 디렉토리 중 `.project-docs/okstra/project.json` 보유 위치를 찾아 PROJECT_ROOT 로 채택합니다.
|
|
183
|
+
2. 위가 실패하면 `git rev-parse --show-toplevel` 결과를 사용합니다.
|
|
184
|
+
3. 모두 실패하면 즉시 에러로 종료합니다.
|
|
185
|
+
|
|
186
|
+
해석된 PROJECT_ROOT 에서 첫 실행이라면 `<PROJECT_ROOT>/.project-docs/okstra/project.json` 이 다음 스키마로 자동 생성됩니다.
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"projectId": "<--project-id 인자 값>",
|
|
191
|
+
"projectRoot": "<resolved absolute path>",
|
|
192
|
+
"createdAt": "<ISO8601 UTC>",
|
|
193
|
+
"updatedAt": "<ISO8601 UTC>"
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
이미 존재하면 `projectId` 일치 검사 후 `projectRoot`/`updatedAt` 만 갱신합니다. `projectId` 가 다르면 즉시 에러로 종료해 동일 디렉토리에서 두 개의 ID 가 혼용되는 것을 막습니다.
|
|
198
|
+
|
|
199
|
+
예:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
scripts/okstra.sh --task-type error-analysis --project-id jobs --project-root /Volumes/Workspaces/workspace/projects/jobs ...
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### `--directive`
|
|
206
|
+
|
|
207
|
+
사용자 의도를 자유 텍스트로 lead·worker·downstream skill에 전달하는 채널입니다. 값은 `instruction-set/analysis-material.md` 끝에 `## Directive` 섹션으로 임베딩되고, 동시에 `instruction-set/directive.txt`로 백업됩니다.
|
|
208
|
+
|
|
209
|
+
용도:
|
|
210
|
+
|
|
211
|
+
- 기본 heuristic을 뒤집고 싶을 때 — 예: "단일 XL task여도 Gantt 그려줘 (Phase 2개, 총 ~10d)", "Gantt 생략 사유를 명시해줘" (참고: `## Cumulative Timeline`은 schedule contract에서 제거되었으므로 더 이상 toggle 대상이 아닙니다)
|
|
212
|
+
- 분석/계획의 강조점 지시 — 예: "rollout 리스크 우선 분석", "test 커버리지 부재를 별도 finding으로"
|
|
213
|
+
- Phase/Step 분할이나 day 추정을 미리 제시 — 예: "Part 1: 4d, measure: 0.5d, Part 2: 4d, ops: 1d"
|
|
214
|
+
|
|
215
|
+
해석 규칙:
|
|
216
|
+
|
|
217
|
+
- lead·worker는 `analysis-material.md`를 이미 end-to-end로 읽으므로 별도 작업 없이 자동 전파됩니다.
|
|
218
|
+
- skill 측은 자체 contract보다 user prompt를 **우선** 적용해야 하며 (예: `okstra-schedule` 스킬의 "Directive override (highest priority)" 절), heuristic을 뒤집은 경우 결과 문서에 그 사실을 한 줄로 표시합니다.
|
|
219
|
+
|
|
220
|
+
예:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
scripts/okstra.sh --task-type implementation-planning ... \
|
|
224
|
+
--directive "Phase 2개(Part 1 ~4d, Part 2 ~5d, 순차)로 총 ~10d. Gantt 꼭 그려줘 (임계 경로 표시)."
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### `--workers`
|
|
228
|
+
|
|
229
|
+
이번 run에서 사용할 worker 목록을 직접 지정합니다.
|
|
230
|
+
생략하면 기본값 `claude,codex,gemini,report-writer`를 사용합니다.
|
|
231
|
+
지정하면 전달한 worker subset만 dedupe 후 기록됩니다.
|
|
232
|
+
|
|
233
|
+
예:
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
scripts/okstra.sh --task-type implementation-planning --workers claude,codex --project-id jobs --task-group tasks --task-id 8852 --task-brief .project-docs/tasks/8852/BUG_REPORT.md
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### `--claude-model`
|
|
240
|
+
|
|
241
|
+
`Claude worker`에 사용할 모델을 지정합니다.
|
|
242
|
+
지정하지 않으면 중앙 기본값 `OKSTRA_DEFAULT_CLAUDE_MODEL` 또는 fallback `sonnet`을 사용합니다.
|
|
243
|
+
|
|
244
|
+
### `--lead-model`
|
|
245
|
+
|
|
246
|
+
`Claude lead`에 사용할 모델을 지정합니다.
|
|
247
|
+
지정하지 않으면 중앙 기본값 `OKSTRA_DEFAULT_LEAD_MODEL` 또는 fallback `opus`를 사용합니다.
|
|
248
|
+
|
|
249
|
+
### `--codex-model`
|
|
250
|
+
|
|
251
|
+
`Codex worker`에 사용할 모델을 지정합니다.
|
|
252
|
+
지정하지 않으면 중앙 기본값 `OKSTRA_DEFAULT_CODEX_MODEL` 또는 fallback `gpt-5.5`를 사용합니다.
|
|
253
|
+
|
|
254
|
+
### `--gemini-model`
|
|
255
|
+
|
|
256
|
+
`Gemini worker`에 사용할 모델을 지정합니다.
|
|
257
|
+
지정하지 않으면 중앙 기본값 `OKSTRA_DEFAULT_GEMINI_MODEL` 또는 fallback `auto`를 사용합니다.
|
|
258
|
+
|
|
259
|
+
### `--report-writer-model`
|
|
260
|
+
|
|
261
|
+
`Report writer worker`에 사용할 모델을 지정합니다.
|
|
262
|
+
지정하지 않으면 중앙 기본값 `OKSTRA_DEFAULT_REPORT_WRITER_MODEL` 또는 lead 기본값을 사용합니다.
|
|
263
|
+
|
|
264
|
+
중앙 기본값 환경 변수는 아래와 같습니다.
|
|
265
|
+
|
|
266
|
+
- `OKSTRA_DEFAULT_LEAD_MODEL`
|
|
267
|
+
- `OKSTRA_DEFAULT_CLAUDE_MODEL`
|
|
268
|
+
- `OKSTRA_DEFAULT_CODEX_MODEL`
|
|
269
|
+
- `OKSTRA_DEFAULT_GEMINI_MODEL`
|
|
270
|
+
- `OKSTRA_DEFAULT_REPORT_WRITER_MODEL`
|
|
271
|
+
|
|
272
|
+
fallback 기본값은 아래와 같습니다.
|
|
273
|
+
|
|
274
|
+
- `Claude lead`: `opus`
|
|
275
|
+
- `Report writer worker`: `opus`
|
|
276
|
+
- `Claude worker`: `sonnet`
|
|
277
|
+
- `Codex worker`: `gpt-5.5`
|
|
278
|
+
- `Gemini worker`: `auto`
|
|
279
|
+
|
|
280
|
+
### `--related-tasks`
|
|
281
|
+
|
|
282
|
+
간단한 연관 task 식별자 목록을 쉼표로 전달합니다.
|
|
283
|
+
|
|
284
|
+
예:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
scripts/okstra.sh --task-type error-analysis --related-tasks scanner-regression,reply-ui --project-id jobs --task-group tasks --task-id 8852 --task-brief .project-docs/tasks/8852/BUG_REPORT.md
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
연관 task는 참고용 메타데이터이며 현재 task key를 대체하지 않습니다.
|
|
291
|
+
|
|
292
|
+
### `--render-only`
|
|
293
|
+
|
|
294
|
+
실제 Claude 실행 없이 프롬프트와 task bundle만 생성합니다.
|
|
295
|
+
|
|
296
|
+
이 모드에서는 아래를 수행하지 않습니다.
|
|
297
|
+
|
|
298
|
+
- Claude 실행
|
|
299
|
+
- `final-report-<task-type>-<seq>.md` 생성
|
|
300
|
+
- `final-<task-type>-<seq>.status` 생성
|
|
301
|
+
|
|
302
|
+
하지만 아래는 수행합니다.
|
|
303
|
+
|
|
304
|
+
- stable task root 생성 또는 갱신
|
|
305
|
+
- `task-manifest.json` 생성 또는 갱신
|
|
306
|
+
- `task-index.md` 생성 또는 갱신
|
|
307
|
+
- `instruction-set/` 생성 또는 갱신
|
|
308
|
+
- `instruction-set/reference-expectations.md` 생성 또는 갱신
|
|
309
|
+
- `instruction-set/final-report-template.md` 생성 또는 갱신
|
|
310
|
+
- current `manifests/run-manifest-<task-type>-<seq>.json` 기록
|
|
311
|
+
- `history/timeline.json` 갱신
|
|
312
|
+
- project-level discovery pointer 생성 또는 갱신
|
|
313
|
+
|
|
314
|
+
### `--refresh-assets`
|
|
315
|
+
|
|
316
|
+
project-local `.claude/skills/`와 `.claude/agents/` 아래의 okstra mapped asset을 workspace source 기준으로 다시 생성합니다.
|
|
317
|
+
기본 rerun에서는 기존 project-local asset을 유지합니다.
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
## Interactive input flow
|
|
321
|
+
|
|
322
|
+
interactive terminal에서 필수 인자 일부를 생략하면 `okstra`가 아래 항목을 순서대로 물을 수 있습니다.
|
|
323
|
+
|
|
324
|
+
- `Project ID`
|
|
325
|
+
- `Task Group`
|
|
326
|
+
- `Task ID`
|
|
327
|
+
- `Task Type`
|
|
328
|
+
- `Task Brief Path`
|
|
329
|
+
|
|
330
|
+
예를 들어 아래처럼 실행할 수 있습니다.
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
scripts/okstra.sh --render-only --task-type error-analysis
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
그러면 누락된 필수값을 stdin으로 입력받은 뒤, 최종 요약과 confirmation을 거쳐 진행합니다.
|
|
337
|
+
|
|
338
|
+
## Confirmation flow
|
|
339
|
+
|
|
340
|
+
interactive 실행에서는 실제 파일 생성 전에 아래 성격의 요약을 보여줍니다.
|
|
341
|
+
|
|
342
|
+
- render-only 여부
|
|
343
|
+
- task type
|
|
344
|
+
- project id
|
|
345
|
+
- task group
|
|
346
|
+
- task id
|
|
347
|
+
- task brief path
|
|
348
|
+
- analysis target
|
|
349
|
+
- related tasks
|
|
350
|
+
- selected workers
|
|
351
|
+
- lead model
|
|
352
|
+
- configured worker models
|
|
353
|
+
- task key
|
|
354
|
+
- task root
|
|
355
|
+
- current run dir
|
|
356
|
+
|
|
357
|
+
이후 `Continue? [y/yes]:` 프롬프트가 표시되며, `y` 또는 `yes`가 아니면 실행하지 않고 종료합니다.
|
|
358
|
+
|
|
359
|
+
`--yes`를 사용하면 이 confirmation flow 자체를 건너뜁니다.
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## okstra Control Center — 설치 / 자주 쓰는 명령
|
|
365
|
+
|
|
366
|
+
## okstra Control Center
|
|
367
|
+
|
|
368
|
+
`okstra-ctl` 은 사용자 홈의 `~/.okstra/` 인덱스를 사용해 모든 타깃 프로젝트의 okstra run 을 가로질러 조회·모니터링·재실행할 수 있는 CLI 다.
|
|
369
|
+
|
|
370
|
+
### 설치 (전역 wrapper)
|
|
371
|
+
|
|
372
|
+
`okstra` 와 동일하게 `~/.local/bin/` 아래에 wrapper 를 두면 어디서든 호출 가능하다.
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
cat > ~/.local/bin/okstra-ctl <<'WRAPPER'
|
|
376
|
+
#!/usr/bin/env bash
|
|
377
|
+
exec /Volumes/Workspaces/workspace/projects/Okstra/scripts/okstra-ctl.sh "$@"
|
|
378
|
+
WRAPPER
|
|
379
|
+
chmod +x ~/.local/bin/okstra-ctl
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
(`~/.local/bin` 이 `PATH` 에 포함되어 있어야 한다.)
|
|
383
|
+
|
|
384
|
+
### 자주 쓰는 명령
|
|
385
|
+
|
|
386
|
+
| 목적 | 명령 |
|
|
387
|
+
|---|---|
|
|
388
|
+
| 작업한 프로젝트 목록 | `okstra-ctl projects` |
|
|
389
|
+
| 최근 run 검색 | `okstra-ctl list --since 7d` |
|
|
390
|
+
| 특정 프로젝트만 | `okstra-ctl list --project fontradar` |
|
|
391
|
+
| 진행 중 run 보기 | `okstra-ctl tail active` |
|
|
392
|
+
| 단일 run 결과 메타 | `okstra-ctl show <runId-or-prefix>` |
|
|
393
|
+
| 결과 보고서 경로 | `okstra-ctl open <runId-or-prefix>` |
|
|
394
|
+
| 단일 재실행 | `okstra-ctl rerun <runId-or-prefix> --yes` |
|
|
395
|
+
| 다중 재실행 | `okstra-ctl rerun --filter --project X --status failed --yes` |
|
|
396
|
+
| 가장 최근 재실행 | `okstra-ctl rerun last --project X --task-group Y --yes` |
|
|
397
|
+
| 백필/재스캔 | `okstra-ctl reindex` |
|
|
398
|
+
| 활성 run 재조정 | `okstra-ctl reconcile [--project <id|all>]` |
|
|
399
|
+
| 배치 진행 | `okstra-ctl batch status <batch-id>` |
|
|
400
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "okstra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Multi-agent cross-verification orchestrator runtime + Claude Code skills.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "devonshin",
|
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
"bin/",
|
|
17
17
|
"src/",
|
|
18
18
|
"runtime/",
|
|
19
|
-
"
|
|
19
|
+
"docs/",
|
|
20
|
+
"README.md",
|
|
21
|
+
"README.kr.md"
|
|
20
22
|
],
|
|
21
23
|
"engines": {
|
|
22
24
|
"node": ">=18"
|
package/runtime/BUILD.json
CHANGED
|
@@ -11,6 +11,25 @@ description: Use when the user asks to list past okstra runs, check execution hi
|
|
|
11
11
|
- When re-running or resuming a previous execution
|
|
12
12
|
- When checking the execution status of each task
|
|
13
13
|
|
|
14
|
+
## Step 0: Verify okstra runtime + project setup
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx -y okstra@latest ensure-installed >/dev/null 2>&1 || {
|
|
18
|
+
echo "FAIL: okstra not installed; tell the user to run: npx okstra@latest install" >&2
|
|
19
|
+
exit 1
|
|
20
|
+
}
|
|
21
|
+
eval "$(npx -y okstra@latest paths --shell)"
|
|
22
|
+
export PYTHONPATH="$OKSTRA_PYTHONPATH"
|
|
23
|
+
OKSTRA_PROJECT_INFO="$(npx -y okstra@latest check-project --json)" || {
|
|
24
|
+
echo "FAIL: this project has no okstra setup. Tell the user to run /okstra-setup first." >&2
|
|
25
|
+
echo "$OKSTRA_PROJECT_INFO" >&2
|
|
26
|
+
exit 1
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`$OKSTRA_PROJECT_INFO` is JSON `{ok, projectRoot, projectJsonPath, projectId}` —
|
|
31
|
+
use `projectRoot` to locate `.project-docs/okstra/discovery/task-catalog.json`.
|
|
32
|
+
|
|
14
33
|
## Step 1: Read the Task Catalog
|
|
15
34
|
|
|
16
35
|
1. Read `.project-docs/okstra/discovery/task-catalog.json`.
|
|
@@ -11,6 +11,25 @@ description: Use when the user provides a task key and needs to find the final r
|
|
|
11
11
|
- 이전 okstra 보고서를 읽고 후속 작업을 진행할 때
|
|
12
12
|
- 보고서 내용을 기반으로 구현, 수정, 추가 검증을 시작할 때
|
|
13
13
|
|
|
14
|
+
## Step 0: Verify okstra runtime + project setup
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx -y okstra@latest ensure-installed >/dev/null 2>&1 || {
|
|
18
|
+
echo "FAIL: okstra not installed; tell the user to run: npx okstra@latest install" >&2
|
|
19
|
+
exit 1
|
|
20
|
+
}
|
|
21
|
+
eval "$(npx -y okstra@latest paths --shell)"
|
|
22
|
+
export PYTHONPATH="$OKSTRA_PYTHONPATH"
|
|
23
|
+
OKSTRA_PROJECT_INFO="$(npx -y okstra@latest check-project --json)" || {
|
|
24
|
+
echo "FAIL: this project has no okstra setup. Tell the user to run /okstra-setup first." >&2
|
|
25
|
+
echo "$OKSTRA_PROJECT_INFO" >&2
|
|
26
|
+
exit 1
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`$OKSTRA_PROJECT_INFO` (JSON `{ok, projectRoot, projectJsonPath, projectId}`) —
|
|
31
|
+
`projectRoot` 로 catalog/manifest 위치를 잡는다.
|
|
32
|
+
|
|
14
33
|
## Step 1: Task Key로 Report 경로 찾기
|
|
15
34
|
|
|
16
35
|
task-key 형식: `<project-id>:<task-group>:<task-id>`
|
|
@@ -30,21 +30,28 @@ Every step reads disk afresh. The `OKSTRA_*` env vars below identify the
|
|
|
30
30
|
- `<PROJECT_ROOT>/.project-docs/okstra/discovery/{task-catalog,latest-task}.json`
|
|
31
31
|
- `<task-root>/task-manifest.json`
|
|
32
32
|
|
|
33
|
-
## Step 0:
|
|
33
|
+
## Step 0: Verify okstra runtime + project setup
|
|
34
34
|
|
|
35
35
|
Do NOT hard-code or guess any okstra path. Every run loads them fresh from
|
|
36
36
|
the single authority — `okstra`:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
# 1) Ensure
|
|
39
|
+
# 1) Ensure runtime is fresh (idempotent, cached when up-to-date)
|
|
40
40
|
npx -y okstra@latest ensure-installed >/dev/null 2>&1 || {
|
|
41
|
-
echo "FAIL: okstra not installed; run: npx okstra@latest install" >&2
|
|
41
|
+
echo "FAIL: okstra not installed; tell the user to run: npx okstra@latest install" >&2
|
|
42
42
|
exit 1
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
# 2) Load all runtime paths into the shell as OKSTRA_* exports
|
|
46
46
|
eval "$(npx -y okstra@latest paths --shell)"
|
|
47
47
|
export PYTHONPATH="$OKSTRA_PYTHONPATH"
|
|
48
|
+
|
|
49
|
+
# 3) Verify the current project has okstra metadata (project.json + projectId)
|
|
50
|
+
OKSTRA_PROJECT_INFO="$(npx -y okstra@latest check-project --json)" || {
|
|
51
|
+
echo "FAIL: this project has no okstra setup. Tell the user to run /okstra-setup first." >&2
|
|
52
|
+
echo "$OKSTRA_PROJECT_INFO" >&2
|
|
53
|
+
exit 1
|
|
54
|
+
}
|
|
48
55
|
```
|
|
49
56
|
|
|
50
57
|
After Step 0 the following are guaranteed:
|
|
@@ -56,6 +63,7 @@ After Step 0 the following are guaranteed:
|
|
|
56
63
|
| `$OKSTRA_PYTHONPATH` | already exported as `PYTHONPATH` |
|
|
57
64
|
| `$OKSTRA_BIN` | bash entrypoints (`okstra.sh`, codex/gemini exec wrappers) |
|
|
58
65
|
| `$OKSTRA_HOME` | `~/.okstra` (recent.jsonl, locks, projects/, archive/) |
|
|
66
|
+
| `$OKSTRA_PROJECT_INFO` | JSON: `{ok, projectRoot, projectJsonPath, projectId}` — parse and reuse instead of re-resolving in Step 1 |
|
|
59
67
|
|
|
60
68
|
## Step 1: Resolve PROJECT_ROOT and projectId
|
|
61
69
|
|
|
@@ -35,6 +35,28 @@ The default mode is lightweight (single Claude lead synthesis). The `--cross-ver
|
|
|
35
35
|
|
|
36
36
|
If `--title` is omitted, derive a default title from `task-group` (e.g. `uploadFont` → `uploadFont — Work Schedule`).
|
|
37
37
|
|
|
38
|
+
## Step 0: Verify okstra runtime + project setup
|
|
39
|
+
|
|
40
|
+
Run before anything else in this skill:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npx -y okstra@latest ensure-installed >/dev/null 2>&1 || {
|
|
44
|
+
echo "FAIL: okstra not installed; tell the user to run: npx okstra@latest install" >&2
|
|
45
|
+
exit 1
|
|
46
|
+
}
|
|
47
|
+
eval "$(npx -y okstra@latest paths --shell)"
|
|
48
|
+
export PYTHONPATH="$OKSTRA_PYTHONPATH"
|
|
49
|
+
OKSTRA_PROJECT_INFO="$(npx -y okstra@latest check-project --json)" || {
|
|
50
|
+
echo "FAIL: this project has no okstra setup. Tell the user to run /okstra-setup first." >&2
|
|
51
|
+
echo "$OKSTRA_PROJECT_INFO" >&2
|
|
52
|
+
exit 1
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`$OKSTRA_PROJECT_INFO` is JSON `{ok, projectRoot, projectJsonPath, projectId}` —
|
|
57
|
+
use `projectRoot` to locate `.project-docs/okstra/discovery/task-catalog.json`
|
|
58
|
+
and the task-group directory.
|
|
59
|
+
|
|
38
60
|
## Process Procedure
|
|
39
61
|
|
|
40
62
|
### Step 0: Verify model (HARD GATE)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: setup
|
|
3
|
-
description: One-time bootstrap for okstra in a new project or on a new machine — installs the okstra runtime via npx and creates the project's .project-docs/okstra/project.json. Trigger words include "setup okstra", "initialize okstra", "okstra init", "first time okstra setup", "configure okstra here".
|
|
2
|
+
name: okstra-setup
|
|
3
|
+
description: One-time bootstrap for okstra in a new project or on a new machine — installs the okstra runtime via npx and creates the project's .project-docs/okstra/project.json. Trigger words include "okstra setup", "setup okstra", "initialize okstra", "okstra init", "first time okstra setup", "configure okstra here".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# setup
|
|
6
|
+
# okstra-setup
|
|
7
7
|
|
|
8
8
|
One-time bootstrap. Run when okstra is being used for the first time on this
|
|
9
9
|
machine, or when adopting okstra in a new project.
|
|
@@ -11,6 +11,28 @@ description: Use when the user asks for overall okstra task status, current life
|
|
|
11
11
|
- When user want to check the current phase, next phase, blockers, and resume points for a specific `task-key`
|
|
12
12
|
- When user want to check which tasks are pending approval or which tasks can be resumed
|
|
13
13
|
|
|
14
|
+
## Step 0: Verify okstra runtime + project setup
|
|
15
|
+
|
|
16
|
+
Before any other step, ensure both the okstra runtime and the current
|
|
17
|
+
project's okstra metadata are in place:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx -y okstra@latest ensure-installed >/dev/null 2>&1 || {
|
|
21
|
+
echo "FAIL: okstra not installed; tell the user to run: npx okstra@latest install" >&2
|
|
22
|
+
exit 1
|
|
23
|
+
}
|
|
24
|
+
eval "$(npx -y okstra@latest paths --shell)"
|
|
25
|
+
export PYTHONPATH="$OKSTRA_PYTHONPATH"
|
|
26
|
+
OKSTRA_PROJECT_INFO="$(npx -y okstra@latest check-project --json)" || {
|
|
27
|
+
echo "FAIL: this project has no okstra setup. Tell the user to run /okstra-setup first." >&2
|
|
28
|
+
echo "$OKSTRA_PROJECT_INFO" >&2
|
|
29
|
+
exit 1
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`$OKSTRA_PROJECT_INFO` is JSON `{ok, projectRoot, projectJsonPath, projectId}` —
|
|
34
|
+
parse and reuse it instead of re-resolving in the steps below.
|
|
35
|
+
|
|
14
36
|
## Step 1: Overall Project Status
|
|
15
37
|
|
|
16
38
|
To view the overall project status, first read `.project-docs/okstra/discovery/task-catalog.json`.
|
|
@@ -26,6 +26,25 @@ Two sources, both already collected by `okstra`:
|
|
|
26
26
|
|
|
27
27
|
If a run never reached Phase 7, its `team-state` will not have `durationMs` filled in. Mark such runs as `unavailable` rather than guessing.
|
|
28
28
|
|
|
29
|
+
## Step 0: Verify okstra runtime + project setup
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx -y okstra@latest ensure-installed >/dev/null 2>&1 || {
|
|
33
|
+
echo "FAIL: okstra not installed; tell the user to run: npx okstra@latest install" >&2
|
|
34
|
+
exit 1
|
|
35
|
+
}
|
|
36
|
+
eval "$(npx -y okstra@latest paths --shell)"
|
|
37
|
+
export PYTHONPATH="$OKSTRA_PYTHONPATH"
|
|
38
|
+
OKSTRA_PROJECT_INFO="$(npx -y okstra@latest check-project --json)" || {
|
|
39
|
+
echo "FAIL: this project has no okstra setup. Tell the user to run /okstra-setup first." >&2
|
|
40
|
+
echo "$OKSTRA_PROJECT_INFO" >&2
|
|
41
|
+
exit 1
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`$OKSTRA_PROJECT_INFO` (JSON `{ok, projectRoot, projectJsonPath, projectId}`)
|
|
46
|
+
gives `projectRoot` for locating `.project-docs/okstra/discovery/task-catalog.json`.
|
|
47
|
+
|
|
29
48
|
## Step 1: Resolve task-id → timeline path
|
|
30
49
|
|
|
31
50
|
1. If the user gave a full `task-key` (`<project-id>:<task-group>:<task-id>`), use it directly.
|