okstra 0.1.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.
Files changed (106) hide show
  1. package/README.md +36 -0
  2. package/bin/okstra +62 -0
  3. package/package.json +30 -0
  4. package/runtime/.gitkeep +0 -0
  5. package/runtime/BUILD.json +5 -0
  6. package/runtime/agents/SKILL.md +243 -0
  7. package/runtime/agents/TODO.md +168 -0
  8. package/runtime/agents/workers/claude-worker.md +106 -0
  9. package/runtime/agents/workers/codex-worker.md +179 -0
  10. package/runtime/agents/workers/gemini-worker.md +179 -0
  11. package/runtime/agents/workers/report-writer-worker.md +116 -0
  12. package/runtime/bin/okstra-central.sh +152 -0
  13. package/runtime/bin/okstra-codex-exec.sh +53 -0
  14. package/runtime/bin/okstra-error-log.py +295 -0
  15. package/runtime/bin/okstra-gemini-exec.sh +55 -0
  16. package/runtime/bin/okstra-token-usage.py +46 -0
  17. package/runtime/bin/okstra.sh +162 -0
  18. package/runtime/prompts/launch.template.md +52 -0
  19. package/runtime/prompts/profiles/error-analysis.md +43 -0
  20. package/runtime/prompts/profiles/final-verification.md +37 -0
  21. package/runtime/prompts/profiles/implementation-planning.md +85 -0
  22. package/runtime/prompts/profiles/implementation.md +71 -0
  23. package/runtime/prompts/profiles/requirements-discovery.md +43 -0
  24. package/runtime/python/lib/okstra/cli.sh +227 -0
  25. package/runtime/python/lib/okstra/globals.sh +157 -0
  26. package/runtime/python/lib/okstra/interactive.sh +411 -0
  27. package/runtime/python/lib/okstra/project-resolver.sh +57 -0
  28. package/runtime/python/lib/okstra/usage.sh +98 -0
  29. package/runtime/python/lib/okstra-ctl/cmd-batch.sh +59 -0
  30. package/runtime/python/lib/okstra-ctl/cmd-list.sh +35 -0
  31. package/runtime/python/lib/okstra-ctl/cmd-open.sh +36 -0
  32. package/runtime/python/lib/okstra-ctl/cmd-projects.sh +26 -0
  33. package/runtime/python/lib/okstra-ctl/cmd-reconcile.sh +27 -0
  34. package/runtime/python/lib/okstra-ctl/cmd-reindex.sh +38 -0
  35. package/runtime/python/lib/okstra-ctl/cmd-rerun.sh +326 -0
  36. package/runtime/python/lib/okstra-ctl/cmd-show.sh +27 -0
  37. package/runtime/python/lib/okstra-ctl/cmd-tail.sh +76 -0
  38. package/runtime/python/lib/okstra-ctl/main.sh +41 -0
  39. package/runtime/python/lib/okstra-ctl/prepare.sh +29 -0
  40. package/runtime/python/lib/okstra-ctl/usage.sh +23 -0
  41. package/runtime/python/okstra_ctl/__init__.py +125 -0
  42. package/runtime/python/okstra_ctl/backfill.py +253 -0
  43. package/runtime/python/okstra_ctl/batch.py +62 -0
  44. package/runtime/python/okstra_ctl/ids.py +84 -0
  45. package/runtime/python/okstra_ctl/index.py +216 -0
  46. package/runtime/python/okstra_ctl/invocation.py +49 -0
  47. package/runtime/python/okstra_ctl/jsonl.py +84 -0
  48. package/runtime/python/okstra_ctl/listing.py +156 -0
  49. package/runtime/python/okstra_ctl/locks.py +42 -0
  50. package/runtime/python/okstra_ctl/material.py +62 -0
  51. package/runtime/python/okstra_ctl/models.py +63 -0
  52. package/runtime/python/okstra_ctl/path_resolve.py +40 -0
  53. package/runtime/python/okstra_ctl/paths.py +251 -0
  54. package/runtime/python/okstra_ctl/project_meta.py +51 -0
  55. package/runtime/python/okstra_ctl/reconcile.py +166 -0
  56. package/runtime/python/okstra_ctl/render.py +1065 -0
  57. package/runtime/python/okstra_ctl/resolver.py +54 -0
  58. package/runtime/python/okstra_ctl/run.py +674 -0
  59. package/runtime/python/okstra_ctl/run_context.py +166 -0
  60. package/runtime/python/okstra_ctl/seeding.py +97 -0
  61. package/runtime/python/okstra_ctl/sequence.py +53 -0
  62. package/runtime/python/okstra_ctl/session.py +33 -0
  63. package/runtime/python/okstra_ctl/tmux.py +27 -0
  64. package/runtime/python/okstra_ctl/workers.py +64 -0
  65. package/runtime/python/okstra_ctl/workflow.py +182 -0
  66. package/runtime/python/okstra_project/__init__.py +41 -0
  67. package/runtime/python/okstra_project/resolver.py +126 -0
  68. package/runtime/python/okstra_project/state.py +170 -0
  69. package/runtime/python/okstra_token_usage/__init__.py +26 -0
  70. package/runtime/python/okstra_token_usage/blocks.py +62 -0
  71. package/runtime/python/okstra_token_usage/claude.py +97 -0
  72. package/runtime/python/okstra_token_usage/cli.py +84 -0
  73. package/runtime/python/okstra_token_usage/codex.py +80 -0
  74. package/runtime/python/okstra_token_usage/collect.py +161 -0
  75. package/runtime/python/okstra_token_usage/gemini.py +77 -0
  76. package/runtime/python/okstra_token_usage/jsonl_io.py +18 -0
  77. package/runtime/python/okstra_token_usage/paths.py +22 -0
  78. package/runtime/python/okstra_token_usage/pricing.py +71 -0
  79. package/runtime/python/okstra_token_usage/report.py +64 -0
  80. package/runtime/templates/prd/brief.template.md +273 -0
  81. package/runtime/templates/project-docs/task-index.template.md +65 -0
  82. package/runtime/templates/reports/error-analysis-input.template.md +80 -0
  83. package/runtime/templates/reports/final-report.template.md +167 -0
  84. package/runtime/templates/reports/final-verification-input.template.md +67 -0
  85. package/runtime/templates/reports/implementation-input.template.md +81 -0
  86. package/runtime/templates/reports/implementation-planning-input.template.md +93 -0
  87. package/runtime/templates/reports/quick-input.template.md +64 -0
  88. package/runtime/templates/reports/schedule.template.md +168 -0
  89. package/runtime/templates/reports/settings.template.json +101 -0
  90. package/runtime/templates/reports/task-brief.template.md +165 -0
  91. package/runtime/validators/lib/common.sh +44 -0
  92. package/runtime/validators/lib/fixtures.sh +322 -0
  93. package/runtime/validators/lib/paths.sh +44 -0
  94. package/runtime/validators/lib/runners.sh +140 -0
  95. package/runtime/validators/lib/summary.sh +15 -0
  96. package/runtime/validators/lib/validate-assets.sh +44 -0
  97. package/runtime/validators/lib/validate-prompt-metadata.sh +267 -0
  98. package/runtime/validators/lib/validate-tasks.sh +335 -0
  99. package/runtime/validators/validate-run.py +568 -0
  100. package/runtime/validators/validate-schedule.py +665 -0
  101. package/runtime/validators/validate-workflow.sh +190 -0
  102. package/src/doctor.mjs +127 -0
  103. package/src/install.mjs +355 -0
  104. package/src/paths.mjs +132 -0
  105. package/src/uninstall.mjs +122 -0
  106. package/src/version.mjs +20 -0
@@ -0,0 +1,227 @@
1
+ # shellcheck shell=bash
2
+
3
+ collect_required_arguments() {
4
+ local missing_required=""
5
+
6
+ missing_required="$(missing_required_arguments_summary)"
7
+ if [[ -z "$missing_required" ]]; then
8
+ return 0
9
+ fi
10
+ if [[ "$ASSUME_YES" == "true" ]]; then
11
+ printf '%s\n' "--yes requires all required arguments. Missing: $missing_required" >&2
12
+ usage
13
+ exit 1
14
+ fi
15
+
16
+ if ! is_interactive_session; then
17
+ printf 'missing required arguments: %s\n' "$missing_required" >&2
18
+ usage
19
+ exit 1
20
+ fi
21
+
22
+ printf 'okstra is missing required arguments. Please provide the following values.\n' >&2
23
+ prompt_for_required_argument PROJECT_ID "Project ID"
24
+ prompt_for_required_argument TASK_GROUP "Task Group"
25
+ prompt_for_required_argument TASK_ID "Task ID"
26
+ prompt_for_required_argument ANALYSIS_TYPE "Task Type"
27
+ prompt_for_required_argument BRIEF_PATH "Task Brief Path"
28
+ }
29
+
30
+ confirm_execution_plan() {
31
+ local confirmation=""
32
+ local normalized_confirmation=""
33
+ if [[ "$ASSUME_YES" == "true" ]]; then
34
+ return 0
35
+ fi
36
+
37
+ if ! is_interactive_session; then
38
+ return 0
39
+ fi
40
+
41
+ cat >&2 <<CONFIRM_EOF
42
+ okstra execution summary:
43
+ render only: ${RENDER_ONLY}
44
+ task type: ${ANALYSIS_TYPE}
45
+ project id: ${PROJECT_ID}
46
+ task group: ${TASK_GROUP}
47
+ task id: ${TASK_ID}
48
+ task brief path: ${BRIEF_FILE_PATH}
49
+ clarification response: ${CLARIFICATION_RESPONSE_FILE:-None}
50
+ related tasks: ${RELATED_TASKS_INLINE}
51
+ recommended workers: ${SELECTED_REVIEWERS}
52
+ lead model: ${LEAD_MODEL_DISPLAY}
53
+ worker models: claude=${CLAUDE_WORKER_MODEL_DISPLAY}, codex=${CODEX_WORKER_MODEL_DISPLAY}, gemini=${GEMINI_WORKER_MODEL_DISPLAY}, report-writer=${REPORT_WRITER_MODEL_DISPLAY}
54
+ task key input: ${TASK_KEY_INPUT:-None}
55
+ task key: ${TASK_KEY}
56
+ task root: ${TASK_ROOT}
57
+ run dir: ${RUN_DIR}
58
+ final report path: ${FINAL_REPORT_FILE}
59
+ final report template: ${FINAL_REPORT_TEMPLATE_FILE}
60
+ CONFIRM_EOF
61
+
62
+ printf 'Continue? [y/yes]: ' >&2
63
+ if ! IFS= read -r confirmation; then
64
+ printf 'confirmation cancelled\n' >&2
65
+ exit 1
66
+ fi
67
+
68
+ normalized_confirmation="$(trim_whitespace "$confirmation")"
69
+ normalized_confirmation="$(printf '%s' "$normalized_confirmation" | tr '[:upper:]' '[:lower:]')"
70
+
71
+ if [[ "$normalized_confirmation" != "y" && "$normalized_confirmation" != "yes" ]]; then
72
+ printf 'okstra cancelled before execution\n' >&2
73
+ exit 1
74
+ fi
75
+ }
76
+ require_option_value() {
77
+ local option_name="$1"
78
+ local option_value="${2-}"
79
+
80
+ if [[ -z "$option_value" ]]; then
81
+ printf 'missing value for %s\n' "$option_name" >&2
82
+ usage
83
+ exit 1
84
+ fi
85
+
86
+ printf '%s' "$option_value"
87
+ }
88
+
89
+ parse_cli_arguments() {
90
+ while [[ $# -gt 0 ]]; do
91
+ case "$1" in
92
+ --render-only)
93
+ RENDER_ONLY="true"
94
+ shift
95
+ ;;
96
+ --resume-clarification)
97
+ RESUME_CLARIFICATION_MODE="true"
98
+ shift
99
+ ;;
100
+ --yes)
101
+ ASSUME_YES="true"
102
+ shift
103
+ ;;
104
+ --refresh-assets)
105
+ printf 'warning: --refresh-assets is deprecated. okstra now installs into ~/.claude and ~/.okstra via okstra-install.sh.\n' >&2
106
+ printf ' re-run "%s/scripts/okstra-install.sh --refresh" to refresh installed assets.\n' "$WORKSPACE_ROOT" >&2
107
+ REFRESH_OKSTRA_ASSETS="true"
108
+ shift
109
+ ;;
110
+ --workers)
111
+ WORKERS_OVERRIDE="$(require_option_value --workers "${2-}")"
112
+ shift 2
113
+ ;;
114
+ --lead-model)
115
+ LEAD_MODEL_OVERRIDE="$(require_option_value --lead-model "${2-}")"
116
+ shift 2
117
+ ;;
118
+ --claude-model)
119
+ CLAUDE_MODEL_OVERRIDE="$(require_option_value --claude-model "${2-}")"
120
+ shift 2
121
+ ;;
122
+ --codex-model)
123
+ CODEX_MODEL_OVERRIDE="$(require_option_value --codex-model "${2-}")"
124
+ shift 2
125
+ ;;
126
+ --gemini-model)
127
+ GEMINI_MODEL_OVERRIDE="$(require_option_value --gemini-model "${2-}")"
128
+ shift 2
129
+ ;;
130
+ --report-writer-model)
131
+ REPORT_WRITER_MODEL_OVERRIDE="$(require_option_value --report-writer-model "${2-}")"
132
+ shift 2
133
+ ;;
134
+ --related-tasks)
135
+ RELATED_TASKS_RAW="$(require_option_value --related-tasks "${2-}")"
136
+ shift 2
137
+ ;;
138
+ --task-type)
139
+ ANALYSIS_TYPE="$(require_option_value --task-type "${2-}")"
140
+ shift 2
141
+ ;;
142
+ --project-id)
143
+ PROJECT_ID="$(require_option_value --project-id "${2-}")"
144
+ shift 2
145
+ ;;
146
+ --project-root)
147
+ PROJECT_ROOT_OVERRIDE="$(require_option_value --project-root "${2-}")"
148
+ shift 2
149
+ ;;
150
+ --task-group)
151
+ TASK_GROUP="$(require_option_value --task-group "${2-}")"
152
+ shift 2
153
+ ;;
154
+ --task-id)
155
+ TASK_ID="$(require_option_value --task-id "${2-}")"
156
+ shift 2
157
+ ;;
158
+ --task-brief)
159
+ BRIEF_PATH="$(require_option_value --task-brief "${2-}")"
160
+ shift 2
161
+ ;;
162
+ --directive)
163
+ DIRECTIVE="$(require_option_value --directive "${2-}")"
164
+ shift 2
165
+ ;;
166
+ --clarification-response)
167
+ CLARIFICATION_RESPONSE_PATH="$(require_option_value --clarification-response "${2-}")"
168
+ shift 2
169
+ ;;
170
+ --task-key)
171
+ TASK_KEY_INPUT="$(require_option_value --task-key "${2-}")"
172
+ shift 2
173
+ ;;
174
+ --approved-plan)
175
+ APPROVED_PLAN_PATH="$(require_option_value --approved-plan "${2-}")"
176
+ shift 2
177
+ ;;
178
+ -h|--help)
179
+ usage
180
+ exit 0
181
+ ;;
182
+ -*)
183
+ __unknown_opt="$1"
184
+ __opt_name="${__unknown_opt%%=*}"
185
+ printf 'unknown option: %s\n' "$__unknown_opt" >&2
186
+ case "$__opt_name" in
187
+ --phase|--phases|--lifecycle-phase)
188
+ printf ' hint: --phase is not a valid flag. Use --task-type <requirements-discovery|error-analysis|implementation-planning|implementation|final-verification>.\n' >&2
189
+ printf ' "phase" is a manifest lifecycle field name, not a CLI option.\n' >&2
190
+ ;;
191
+ --brief|--task-brief)
192
+ printf ' hint: did you mean --task-brief?\n' >&2
193
+ ;;
194
+ --analysis-target|--target|--review-target)
195
+ printf ' hint: --analysis-target was removed. Put supplementary materials inside the task brief itself.\n' >&2
196
+ ;;
197
+ --project|--proj)
198
+ printf ' hint: did you mean --project-id?\n' >&2
199
+ ;;
200
+ --group)
201
+ printf ' hint: did you mean --task-group?\n' >&2
202
+ ;;
203
+ --id)
204
+ printf ' hint: did you mean --task-id?\n' >&2
205
+ ;;
206
+ esac
207
+ printf ' valid options: --render-only --resume-clarification --yes --refresh-assets --workers --lead-model --claude-model --codex-model --gemini-model --report-writer-model --related-tasks --task-type --project-id --project-root --task-group --task-id --task-brief --directive --clarification-response --approved-plan -h|--help\n' >&2
208
+ usage
209
+ exit 1
210
+ ;;
211
+ *)
212
+ printf 'unexpected positional argument: %s\n' "$1" >&2
213
+ if [[ "$1" == *:*:* ]]; then
214
+ __key_proj="${1%%:*}"
215
+ __key_rest="${1#*:}"
216
+ __key_group="${__key_rest%%:*}"
217
+ __key_id="${__key_rest#*:}"
218
+ printf ' hint: looks like a manifest taskKey (project:group:id). Pass it via --task-key, e.g. --task-key %s:%s:%s\n' "$__key_proj" "$__key_group" "$__key_id" >&2
219
+ else
220
+ printf ' hint: all inputs must be passed as named flags. See usage below.\n' >&2
221
+ fi
222
+ usage
223
+ exit 1
224
+ ;;
225
+ esac
226
+ done
227
+ }
@@ -0,0 +1,157 @@
1
+ # shellcheck shell=bash
2
+
3
+ PROFILE_DIR="$WORKSPACE_ROOT/prompts/profiles"
4
+ PROMPT_TEMPLATE="$WORKSPACE_ROOT/prompts/launch.template.md"
5
+ TASK_INDEX_TEMPLATE="$WORKSPACE_ROOT/templates/project-docs/task-index.template.md"
6
+ FINAL_REPORT_TEMPLATE_SOURCE="$WORKSPACE_ROOT/templates/reports/final-report.template.md"
7
+ RUN_VALIDATOR_SCRIPT="$WORKSPACE_ROOT/validators/validate-run.py"
8
+ SOURCE_CLAUDE_OKSTRA_SKILL="$WORKSPACE_ROOT/agents/SKILL.md"
9
+ OKSTRA_ROOT=""
10
+ OKSTRA_TASKS_ROOT=""
11
+ OKSTRA_DISCOVERY_DIR=""
12
+ OKSTRA_DISCOVERY_RELATIVE_PATH=""
13
+ OKSTRA_LATEST_TASK_FILE=""
14
+ OKSTRA_LATEST_TASK_RELATIVE_PATH=""
15
+ OKSTRA_TASK_CATALOG_FILE=""
16
+ OKSTRA_TASK_CATALOG_RELATIVE_PATH=""
17
+ RENDER_ONLY="false"
18
+ ASSUME_YES="false"
19
+ RESUME_CLARIFICATION_MODE="false"
20
+ REFRESH_OKSTRA_ASSETS="false"
21
+ WORKERS_OVERRIDE=""
22
+ LEAD_MODEL_OVERRIDE=""
23
+ CLAUDE_MODEL_OVERRIDE=""
24
+ CODEX_MODEL_OVERRIDE=""
25
+ GEMINI_MODEL_OVERRIDE=""
26
+ REPORT_WRITER_MODEL_OVERRIDE=""
27
+ RELATED_TASKS_RAW=""
28
+ ANALYSIS_TYPE=""
29
+ BRIEF_PATH=""
30
+ PROJECT_ID=""
31
+ TASK_GROUP=""
32
+ TASK_ID=""
33
+ TASK_KEY_INPUT=""
34
+ TASK_KEY=""
35
+ REVIEW_PROFILE=""
36
+ DIRECTIVE=""
37
+ CLARIFICATION_RESPONSE_PATH=""
38
+ APPROVED_PLAN_PATH=""
39
+ CLARIFICATION_RESPONSE_FILE=""
40
+ CLARIFICATION_RESPONSE_RELATIVE_PATH=""
41
+ PROJECT_ROOT=""
42
+ PROJECT_ROOT_OVERRIDE=""
43
+ PROFILE_FILE=""
44
+ BRIEF_FILE_PATH=""
45
+ REVIEW_MATERIAL=""
46
+ PROFILE_CONTENT=""
47
+ SELECTED_REVIEWERS=""
48
+ BRIEF_RELATIVE_PATH=""
49
+ TASK_GROUP_SEGMENT=""
50
+ TASK_ID_SEGMENT=""
51
+ TASK_ROOT=""
52
+ TASK_MANIFEST_FILE=""
53
+ TASK_INDEX_FILE=""
54
+ INSTRUCTION_SET_DIR=""
55
+ RUNS_DIR=""
56
+ HISTORY_DIR=""
57
+ TIMELINE_FILE=""
58
+ RUN_DIR=""
59
+ RUN_MANIFESTS_DIR=""
60
+ RUN_STATE_DIR=""
61
+ RUN_PROMPTS_DIR=""
62
+ RUN_REPORTS_DIR=""
63
+ RUN_STATUS_DIR=""
64
+ RUN_SESSIONS_DIR=""
65
+ RUN_LOGS_DIR=""
66
+ RUN_MANIFEST_FILE=""
67
+ RUN_MANIFEST_RELATIVE_PATH=""
68
+ RUN_PROMPT_SNAPSHOT_FILE=""
69
+ RUN_PROMPT_SNAPSHOT_RELATIVE_PATH=""
70
+ CLAUDE_WORKER_PROMPT_FILE=""
71
+ CLAUDE_WORKER_PROMPT_RELATIVE_PATH=""
72
+ CODEX_WORKER_PROMPT_FILE=""
73
+ CODEX_WORKER_PROMPT_RELATIVE_PATH=""
74
+ GEMINI_WORKER_PROMPT_FILE=""
75
+ GEMINI_WORKER_PROMPT_RELATIVE_PATH=""
76
+ REPORT_WRITER_WORKER_PROMPT_FILE=""
77
+ REPORT_WRITER_WORKER_PROMPT_RELATIVE_PATH=""
78
+ FINAL_REPORT_FILE=""
79
+ FINAL_STATUS_FILE=""
80
+ FINAL_REPORT_RELATIVE_PATH=""
81
+ FINAL_STATUS_RELATIVE_PATH=""
82
+ FINAL_REPORT_TEMPLATE_FILE=""
83
+ FINAL_REPORT_TEMPLATE_RELATIVE_PATH=""
84
+ REFERENCE_EXPECTATIONS_FILE=""
85
+ REFERENCE_EXPECTATIONS_RELATIVE_PATH=""
86
+ TEAM_STATE_FILE=""
87
+ TEAM_STATE_RELATIVE_PATH=""
88
+ WORKER_RESULTS_DIR=""
89
+ WORKER_RESULTS_RELATIVE_PATH=""
90
+ RUN_VALIDATOR_RELATIVE_PATH=""
91
+ CLAUDE_WORKER_RESULT_FILE=""
92
+ CLAUDE_WORKER_RESULT_RELATIVE_PATH=""
93
+ CODEX_WORKER_RESULT_FILE=""
94
+ CODEX_WORKER_RESULT_RELATIVE_PATH=""
95
+ GEMINI_WORKER_RESULT_FILE=""
96
+ GEMINI_WORKER_RESULT_RELATIVE_PATH=""
97
+ REPORT_WRITER_WORKER_RESULT_FILE=""
98
+ REPORT_WRITER_WORKER_RESULT_RELATIVE_PATH=""
99
+ CLAUDE_SESSION_ID=""
100
+ CLAUDE_RESUME_COMMAND_FILE=""
101
+ CLAUDE_RESUME_COMMAND_RELATIVE_PATH=""
102
+ RUN_TIMESTAMP_ISO=""
103
+ RUN_DATETIME_SEGMENT=""
104
+ RUN_TIME_SEGMENT=""
105
+ RUN_FILE_SUFFIX=""
106
+ RUN_MANIFESTS_SEQ=""
107
+ RUN_PROMPTS_SEQ=""
108
+ RUN_REPORTS_SEQ=""
109
+ RUN_STATUS_SEQ=""
110
+ RUN_STATE_SEQ=""
111
+ RUN_SESSIONS_SEQ=""
112
+ WORKER_RESULTS_SEQ=""
113
+ TASK_ROOT_RELATIVE_PATH=""
114
+ TASK_MANIFEST_RELATIVE_PATH=""
115
+ TASK_INDEX_RELATIVE_PATH=""
116
+ INSTRUCTION_SET_RELATIVE_PATH=""
117
+ RUNS_RELATIVE_PATH=""
118
+ HISTORY_RELATIVE_PATH=""
119
+ TIMELINE_RELATIVE_PATH=""
120
+ RUN_DIR_RELATIVE_PATH=""
121
+ RUN_MANIFESTS_RELATIVE_PATH=""
122
+ RUN_STATE_RELATIVE_PATH=""
123
+ RUN_PROMPTS_RELATIVE_PATH=""
124
+ RUN_REPORTS_RELATIVE_PATH=""
125
+ RUN_STATUS_RELATIVE_PATH=""
126
+ RUN_SESSIONS_RELATIVE_PATH=""
127
+ LATEST_RUN_PATH=""
128
+ LATEST_RUN_RELATIVE_PATH=""
129
+ LATEST_REPORT_PATH=""
130
+ LATEST_REPORT_RELATIVE_PATH=""
131
+ CURRENT_TASK_STATUS=""
132
+ CURRENT_RUN_STATUS=""
133
+ VALIDATION_STATUS="not-run"
134
+ VALIDATION_UPDATED_AT=""
135
+ VALIDATION_FAILURES_JSON="[]"
136
+ RELATED_TASKS_JSON="[]"
137
+ RELATED_TASKS_BULLETS="- None recorded"
138
+ RELATED_TASKS_INLINE="None"
139
+ PROMPT=""
140
+ LEAD_MODEL_DISPLAY=""
141
+ LEAD_MODEL_EXECUTION_VALUE=""
142
+ CLAUDE_WORKER_MODEL_DISPLAY=""
143
+ CLAUDE_WORKER_MODEL_EXECUTION_VALUE=""
144
+ CODEX_WORKER_MODEL_DISPLAY=""
145
+ CODEX_WORKER_MODEL_EXECUTION_VALUE=""
146
+ GEMINI_WORKER_MODEL_DISPLAY=""
147
+ GEMINI_WORKER_MODEL_EXECUTION_VALUE=""
148
+ REPORT_WRITER_MODEL_DISPLAY=""
149
+ REPORT_WRITER_MODEL_EXECUTION_VALUE=""
150
+ DEFAULT_WORKERS="claude,codex,gemini,report-writer"
151
+ DEFAULT_LEAD_MODEL_NAME="${OKSTRA_DEFAULT_LEAD_MODEL:-opus}"
152
+ DEFAULT_CLAUDE_WORKER_MODEL_NAME="${OKSTRA_DEFAULT_CLAUDE_MODEL:-sonnet}"
153
+ DEFAULT_CODEX_WORKER_MODEL_NAME="${OKSTRA_DEFAULT_CODEX_MODEL:-gpt-5.5}"
154
+ DEFAULT_GEMINI_WORKER_MODEL_NAME="${OKSTRA_DEFAULT_GEMINI_MODEL:-auto}"
155
+ DEFAULT_REPORT_WRITER_MODEL_NAME="${OKSTRA_DEFAULT_REPORT_WRITER_MODEL:-$DEFAULT_LEAD_MODEL_NAME}"
156
+ DISPLAY_COMMAND_NAME="${OKSTRA_COMMAND_NAME:-$(basename "$0")}"
157
+ DISPLAY_TOOL_NAME="${OKSTRA_TOOL_NAME:-okstra}"