okstra 0.210.0 → 0.212.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/dist/cli-registry.mjs +6 -0
- package/dist/cli-registry.mjs.map +1 -1
- package/docs/cli.md +3 -2
- package/docs/project-structure-overview.md +2 -0
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/prompts/wizard/prompts.ko.json +3 -3
- package/runtime/python/okstra_ctl/locks.py +39 -0
- package/runtime/python/okstra_ctl/manager_launch.py +2 -1
- package/runtime/python/okstra_ctl/manager_paths.py +4 -0
- package/runtime/python/okstra_ctl/phases/implementation/instructions/_implementation-deliverable.md +5 -4
- package/runtime/python/okstra_ctl/phases/implementation/instructions/_implementation-verifier.md +9 -1
- package/runtime/python/okstra_ctl/phases/implementation/report.py +66 -19
- package/runtime/python/okstra_ctl/phases/implementation/report_assets/implementation.template.html +8 -7
- package/runtime/python/okstra_ctl/phases/implementation_planning/authoring.py +6 -2
- package/runtime/python/okstra_ctl/report_html/run_usage.py +9 -0
- package/runtime/python/okstra_ctl/report_html/visualizations.py +0 -8
- package/runtime/python/okstra_ctl/report_projections.py +18 -2
- package/runtime/python/okstra_ctl/report_synthesis_packet.py +19 -0
- package/runtime/python/okstra_ctl/report_translation.py +27 -6
- package/runtime/python/okstra_ctl/wizard/state.py +30 -1
- package/runtime/python/okstra_ctl/wizard/steps_options.py +19 -0
- package/runtime/python/okstra_ctl/wizard/steps_roles.py +7 -1
- package/runtime/python/okstra_ctl/worktree_lock_cli.py +87 -0
- package/runtime/schemas/final-report-v3.0.schema.json +11 -0
- package/runtime/templates/reports/html/assets/base.css +4 -2
- package/runtime/templates/reports/html/base.template.html +14 -9
- package/runtime/templates/reports/html/i18n/en.json +91 -2
- package/runtime/templates/reports/html/i18n/ko.json +91 -2
- package/runtime/templates/reports/html/macros/forms.html +8 -7
|
@@ -147,6 +147,74 @@
|
|
|
147
147
|
"deferred": "보류",
|
|
148
148
|
"not-applicable": "해당 없음",
|
|
149
149
|
"blocked": "차단"
|
|
150
|
+
},
|
|
151
|
+
"clarificationKind": {
|
|
152
|
+
"material": "빠진 정보",
|
|
153
|
+
"decision": "결정 필요",
|
|
154
|
+
"data-point": "확인할 사실"
|
|
155
|
+
},
|
|
156
|
+
"clarificationStatus": {
|
|
157
|
+
"open": "답변 대기",
|
|
158
|
+
"answered": "답변함",
|
|
159
|
+
"resolved": "해결됨",
|
|
160
|
+
"obsolete": "더 이상 해당 없음"
|
|
161
|
+
},
|
|
162
|
+
"approvalDisposition": {
|
|
163
|
+
"select": "이 선택지 채택",
|
|
164
|
+
"accept-risk": "위험 감수",
|
|
165
|
+
"request-revision": "수정 요청",
|
|
166
|
+
"reject": "반려"
|
|
167
|
+
},
|
|
168
|
+
"approvalClassification": {
|
|
169
|
+
"user-decision": "사용자 결정 필요",
|
|
170
|
+
"noncritical-dissent": "치명적이지 않은 이견",
|
|
171
|
+
"correctness-critical": "정확성에 영향"
|
|
172
|
+
},
|
|
173
|
+
"clarificationScope": {
|
|
174
|
+
"in-repo": "이 저장소 안",
|
|
175
|
+
"cross-repo": "다른 저장소까지",
|
|
176
|
+
"new-schema": "새 스키마",
|
|
177
|
+
"deferrable": "미룰 수 있음"
|
|
178
|
+
},
|
|
179
|
+
"executionRole": {
|
|
180
|
+
"leader": "리드",
|
|
181
|
+
"analyser": "분석",
|
|
182
|
+
"critic": "비평",
|
|
183
|
+
"designer": "설계",
|
|
184
|
+
"implementer": "구현",
|
|
185
|
+
"planner": "계획",
|
|
186
|
+
"report-writer": "리포트 작성",
|
|
187
|
+
"translator": "번역",
|
|
188
|
+
"verifier": "검증"
|
|
189
|
+
},
|
|
190
|
+
"requirementStatus": {
|
|
191
|
+
"covered": "충족",
|
|
192
|
+
"gap": "미충족",
|
|
193
|
+
"documented-deviation": "승인된 이탈",
|
|
194
|
+
"blocked": "차단"
|
|
195
|
+
},
|
|
196
|
+
"rollbackCategory": {
|
|
197
|
+
"Pure code": "코드만",
|
|
198
|
+
"Feature-flag-gated": "기능 플래그로 제어",
|
|
199
|
+
"Schema/config/stateful": "스키마·설정·저장 상태"
|
|
200
|
+
},
|
|
201
|
+
"rollbackResult": {
|
|
202
|
+
"ok": "통과",
|
|
203
|
+
"not-applicable": "해당 없음",
|
|
204
|
+
"advisory — human-run": "권고: 사람이 직접 실행"
|
|
205
|
+
},
|
|
206
|
+
"businessFlowMode": {
|
|
207
|
+
"pre": "변경 전",
|
|
208
|
+
"contribute": "이번 단계 기여",
|
|
209
|
+
"post": "변경 후",
|
|
210
|
+
"unknown": "알 수 없는 단계"
|
|
211
|
+
},
|
|
212
|
+
"businessFlowStatus": {
|
|
213
|
+
"prepared": "준비됨",
|
|
214
|
+
"running": "실행 중",
|
|
215
|
+
"failed": "실패",
|
|
216
|
+
"partial": "일부 설명",
|
|
217
|
+
"complete": "설명 완료"
|
|
150
218
|
}
|
|
151
219
|
},
|
|
152
220
|
"enumHint": {
|
|
@@ -194,7 +262,12 @@
|
|
|
194
262
|
"agent-activity": "에이전트 활동",
|
|
195
263
|
"agent-activity-intro": "이번 run 에서 각 에이전트가 맡은 일과 그 결과입니다. 결정 카드와 본문이 이 행을 아이디로 인용합니다.",
|
|
196
264
|
"agent": "에이전트",
|
|
197
|
-
"activity": "활동"
|
|
265
|
+
"activity": "활동",
|
|
266
|
+
"business-flow": "업무 흐름 설명",
|
|
267
|
+
"business-flow-failed-count": "업무 흐름 설명 생성 실패 {count}건",
|
|
268
|
+
"business-flow-failure-details": "실패 내역과 재실행 명령",
|
|
269
|
+
"business-flow-error": "오류:",
|
|
270
|
+
"business-flow-rerun": "재실행:"
|
|
198
271
|
},
|
|
199
272
|
"runUsage": {
|
|
200
273
|
"heading": "이번 실행에 든 비용",
|
|
@@ -214,7 +287,8 @@
|
|
|
214
287
|
"row-total": "합계",
|
|
215
288
|
"row-cli": "CLI 호출 (별도 청구)",
|
|
216
289
|
"cache-read-tokens": "캐시 재읽기",
|
|
217
|
-
"row-task-cumulative": "이 태스크 누적 (run {runs}회)"
|
|
290
|
+
"row-task-cumulative": "이 태스크 누적 (run {runs}회)",
|
|
291
|
+
"row-total-with-cli": "CLI 호출 포함 합계"
|
|
218
292
|
},
|
|
219
293
|
"macros": {
|
|
220
294
|
"forms": {
|
|
@@ -585,6 +659,21 @@
|
|
|
585
659
|
"result": "결과",
|
|
586
660
|
"no-rollback-check-was-recorded": "롤백 확인 기록이 없습니다.",
|
|
587
661
|
"stage-carry-over": "stage 인계",
|
|
662
|
+
"carry-sidecar": "인계 파일",
|
|
663
|
+
"carry-commit-range": "commit 범위",
|
|
664
|
+
"carry-steps": "단계",
|
|
665
|
+
"carry-files-changed": "바뀐 파일 수",
|
|
666
|
+
"carry-raw": "인계 JSON 원문",
|
|
667
|
+
"file": "파일",
|
|
668
|
+
"change": "변경",
|
|
669
|
+
"lines": "줄 수",
|
|
670
|
+
"plan-step": "계획 단계",
|
|
671
|
+
"action-created": "추가",
|
|
672
|
+
"action-modified": "수정",
|
|
673
|
+
"action-deleted": "삭제",
|
|
674
|
+
"what-it-does": "하는 일",
|
|
675
|
+
"advisory": "권고",
|
|
676
|
+
"entry-count": "{count}개 항목",
|
|
588
677
|
"manual-user-test": "수동 사용자 테스트",
|
|
589
678
|
"environment": "환경:",
|
|
590
679
|
"expected": "기대 결과:",
|
|
@@ -57,18 +57,18 @@
|
|
|
57
57
|
{%- endmacro %}
|
|
58
58
|
|
|
59
59
|
{% macro clarification_article(row, compact=false) -%}
|
|
60
|
-
{% set is_closed = row.status in ['resolved', 'obsolete'] %}
|
|
60
|
+
{% set is_closed = compact or row.status in ['resolved', 'obsolete'] %}
|
|
61
61
|
{% set approval_context = row.approvalContext | default(None) %}
|
|
62
62
|
{% set resolution = row.resolution | default(None) %}
|
|
63
63
|
{% set options = row.options | default([]) %}
|
|
64
64
|
<article class="clarification-item{% if compact %} is-closed{% endif %}" id="id-{{ row.id }}" data-response-id="{{ row.id }}" data-kind="{{ row.kind }}" data-status="{{ row.status }}">
|
|
65
|
-
{% if compact %}<details><summary>{{ row.id | inline_code }} · {{ row.status }}</summary>{% endif %}
|
|
66
|
-
<p class="eyebrow">{{ row.id | inline_code }} · {{ row.kind }}</p>
|
|
65
|
+
{% if compact %}<details><summary>{{ row.id | inline_code }} · {{ row.status | enum_label('clarificationStatus') }}</summary>{% endif %}
|
|
66
|
+
<p class="eyebrow">{{ row.id | inline_code }} · {{ row.kind | enum_label('clarificationKind') }}</p>
|
|
67
67
|
{{ row.statement | paragraphs }}
|
|
68
68
|
<dl class="clarification-expected"><dt>{{ t('macros.forms.answer-as') }}</dt><dd>{{ row.expectedForm | inline_code }}</dd></dl>
|
|
69
69
|
{% if approval_context %}
|
|
70
70
|
<div class="approval-context" data-approval-classification="{{ approval_context.classification }}">
|
|
71
|
-
<p class="eyebrow">{{ approval_context.classification }}</p>
|
|
71
|
+
<p class="eyebrow">{{ approval_context.classification | enum_label('approvalClassification') }}</p>
|
|
72
72
|
<p><strong>{{ t('tasks.implementation-planning.unblock-condition') }}</strong> {{ approval_context.unblockCondition | inline_code }}</p>
|
|
73
73
|
{% set check_refs = resolution.checkRefs if resolution else approval_context.activityIds | default([]) %}
|
|
74
74
|
{% if check_refs %}<p><strong>{{ t('tasks.implementation-planning.agent-evidence') }}</strong>
|
|
@@ -81,10 +81,10 @@
|
|
|
81
81
|
{% for option in options %}
|
|
82
82
|
<li class="clarification-option{% if option.role == 'recommended' %} is-recommended{% endif %}" data-option-value="{{ option.answer }}">
|
|
83
83
|
<p class="clarification-option-answer">{{ option.answer | inline_code }}{% if option.role == 'recommended' %} <span class="badge">{{ t('macros.forms.recommended') }}</span>{% endif %}</p>
|
|
84
|
-
{% if option.disposition | default(None) %}<p class="clarification-option-disposition"
|
|
84
|
+
{% if option.disposition | default(None) %}<p class="clarification-option-disposition">{{ option.disposition | enum_label('approvalDisposition') }}</p>{% endif %}
|
|
85
85
|
<p class="clarification-option-rationale">{{ option.rationale | inline_code }}</p>
|
|
86
86
|
<dl class="clarification-option-impact">
|
|
87
|
-
<dt>{{ t('macros.forms.scope-impact') }}</dt><dd>{% if option.reach | default(None) %}{{ option.reach }}{% if option.scopeEffects | default([]) %}, {{ option.scopeEffects | join(', ') }}{% endif %}{% else %}{{ option.scopeImpact | join(', ') }}{% endif %}</dd>
|
|
87
|
+
<dt>{{ t('macros.forms.scope-impact') }}</dt><dd>{% if option.reach | default(None) %}{{ option.reach | enum_label('clarificationScope') }}{% if option.scopeEffects | default([]) %}, {{ option.scopeEffects | map('enum_label', 'clarificationScope') | join(', ') }}{% endif %}{% else %}{{ option.scopeImpact | map('enum_label', 'clarificationScope') | join(', ') }}{% endif %}</dd>
|
|
88
88
|
<dt>{{ t('macros.forms.added-work') }}</dt><dd>{{ option.addedWork | inline_code }}</dd>
|
|
89
89
|
<dt>{{ t('macros.forms.direction-change') }}</dt><dd>{{ option.directionChange | inline_code }}</dd>
|
|
90
90
|
</dl>
|
|
@@ -114,7 +114,8 @@
|
|
|
114
114
|
{% if items %}
|
|
115
115
|
{% set ns = namespace(open=[], closed=[]) %}
|
|
116
116
|
{% for row in items %}
|
|
117
|
-
{
|
|
117
|
+
{# 답이 실린 answered 행은 기다리는 질문이 아니다 — 닫힌 목록으로 간다. #}
|
|
118
|
+
{% if row.status == 'open' or (row.status == 'answered' and not row.userInput | default('')) %}
|
|
118
119
|
{% set ns.open = ns.open + [row] %}
|
|
119
120
|
{% else %}
|
|
120
121
|
{% set ns.closed = ns.closed + [row] %}
|