okstra 0.95.0 → 0.96.1

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.
@@ -50,7 +50,7 @@ The wizard tells you *which UI to use* via `kind` (and the optional `multi` flag
50
50
  - `kind: "done"` → input collection finished; move to Step 5.
51
51
  - `kind: "aborted"` → the user picked 중단; the wizard is terminally cancelled. Tell the user on one short line that the run setup was aborted, delete the state file (`rm` with the literal path), and stop this skill — do NOT call `render-args` or `render-bundle` (the wizard rejects `render-args` on an aborted state).
52
52
 
53
- The `branch_confirm` step (shown just before `confirm`) is a normal `pick` step and is rendered the same way no special handling needed. Its options always include `중단` (abort); `base-ref 다시 고르기` (edit) appears only when a new branch would be created from the user-chosen base-ref. For `implementation` runs the wizard previews the **stage worktree** this run will actually use (not the task-key directory); render its label verbatim.
53
+ The final `confirm` step is a normal `pick` step with three options — `Proceed` / `Edit` / `중단`(abort) — and is rendered the same way (no special handling). `Edit` rewinds to any earlier step (including `base-ref`); `중단` terminally cancels the wizard. The branch/worktree decision the run will actually use (for `implementation`, the **stage worktree** not the task-key directory) is folded into the Step 4 confirmation summary block as a `worktree` line, so there is no separate branch-confirm prompt.
54
54
 
55
55
  Never invent additional questions. Never reorder. **Never drop, hide, or merge a `pick` / `pick_group` option** — render every `options[]` entry as its own selectable `AskUserQuestion` choice, including entries that carry a `(default)` / `(recommended)` suffix. Do NOT collapse a multi-option pick into a "recommended + 직접 입력 / Other" shortlist: the wizard's `options[]` array IS the complete, authoritative choice set. Example: the `executor` step always emits `claude` / `codex` / `antigravity` — show all three, never just `claude`. The run-prompt recommendation rule (1–2 추천 + 직접 입력) applies ONLY to prompts this skill authors itself (e.g. the conformance-waiver picker), never to wizard-provided `options[]`. Never use `AskUserQuestion` for `text` prompts — the wizard explicitly chose `text` to avoid the picker-Other re-render lag.
56
56
 
@@ -110,6 +110,13 @@ export const COMMAND_REGISTRY = [
110
110
  category: "introspection",
111
111
  summary: ["Aggregate okstra-run error logs into a task-level report"],
112
112
  },
113
+ {
114
+ name: "recap",
115
+ module: "./recap.mjs",
116
+ export: "run",
117
+ category: "introspection",
118
+ summary: ["Assemble a task's run-to-run phase recap or append a recap log entry"],
119
+ },
113
120
  {
114
121
  name: "worktree-lookup",
115
122
  module: "./worktree-lookup.mjs",
package/src/recap.mjs ADDED
@@ -0,0 +1,27 @@
1
+ import { runPythonModule } from "./_python-helper.mjs";
2
+
3
+ const USAGE = `okstra recap — assemble a task's run-to-run phase recap, or append a recap log entry
4
+
5
+ Usage:
6
+ okstra recap assemble <task-root|task-key> [--project-root <dir>] [--cwd <dir>]
7
+ okstra recap record <task-root|task-key> --kind <summary|qa> --mode <artifact|code> \\
8
+ [--question <text>] --answer <text> [--citation <path:line> ...]
9
+
10
+ \`assemble\` is read-only and prints a JSON summary of phase transitions across runs.
11
+ \`record\` appends one line to <task-root>/recap/recap-log.jsonl; it never mutates
12
+ other task artifacts.
13
+ `;
14
+
15
+ export async function run(args) {
16
+ if (args.includes("--help") || args.includes("-h")) {
17
+ process.stdout.write(USAGE);
18
+ return 0;
19
+ }
20
+
21
+ const result = await runPythonModule({
22
+ module: "okstra_ctl.recap",
23
+ args,
24
+ stdio: "inherit-stdout",
25
+ });
26
+ return result.code ?? 0;
27
+ }