okstra 0.165.2 → 0.165.4

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 (34) hide show
  1. package/package.json +1 -1
  2. package/runtime/BUILD.json +2 -2
  3. package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
  4. package/runtime/prompts/profiles/_implementation-deliverable.md +3 -2
  5. package/runtime/prompts/profiles/_implementation-diff-review.md +2 -2
  6. package/runtime/prompts/profiles/_implementation-executor.md +22 -15
  7. package/runtime/prompts/profiles/_implementation-verifier.md +4 -4
  8. package/runtime/prompts/profiles/_stage-discipline.md +4 -3
  9. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/relay.md +1 -1
  10. package/runtime/python/okstra_ctl/cmux.py +9 -7
  11. package/runtime/python/okstra_ctl/consumers.py +73 -24
  12. package/runtime/python/okstra_ctl/dispatch_core.py +3 -3
  13. package/runtime/python/okstra_ctl/dispatch_state.py +21 -1
  14. package/runtime/python/okstra_ctl/domain/wizard/interaction.py +17 -5
  15. package/runtime/python/okstra_ctl/implementation_stage.py +2 -1
  16. package/runtime/python/okstra_ctl/initial_prompt_materialization.py +104 -12
  17. package/runtime/python/okstra_ctl/path_hints.py +10 -2
  18. package/runtime/python/okstra_ctl/render.py +5 -0
  19. package/runtime/python/okstra_ctl/stage_map.py +10 -4
  20. package/runtime/python/okstra_ctl/team.py +30 -6
  21. package/runtime/python/okstra_ctl/wizard.py +19 -2
  22. package/runtime/python/okstra_ctl/worker_prompt_body.py +24 -4
  23. package/runtime/python/okstra_ctl/worker_prompt_contract.py +3 -1
  24. package/runtime/python/okstra_ctl/worker_prompt_headers.py +18 -1
  25. package/runtime/python/okstra_ctl/worker_prompt_policy.py +13 -2
  26. package/runtime/python/okstra_ctl/worktree.py +17 -1
  27. package/runtime/schemas/final-report-v1.0.schema.json +4 -0
  28. package/runtime/schemas/final-report-v2.0.schema.json +4 -0
  29. package/runtime/templates/implementation-worker-preamble.md +10 -3
  30. package/runtime/templates/reports/final-report.template.md +3 -0
  31. package/runtime/templates/worker-prompt-preamble.md +4 -3
  32. package/runtime/validators/validate-implementation-plan-stages.py +19 -2
  33. package/runtime/validators/validate-run.py +7 -0
  34. package/src/commands/execute/wizard.mjs +20 -8
@@ -22,7 +22,7 @@ Usage:
22
22
  okstra wizard new-state-file
23
23
  okstra wizard init --state-file <path> --project-root <p> --project-id <id> --host-runtime <runtime> \\
24
24
  --entry-mode current-session --available-function <semantic-name>
25
- okstra wizard step --state-file <path> [--answer <value>]
25
+ okstra wizard step --state-file <path> (--answer <value> | --no-submit)
26
26
  okstra wizard render-args --state-file <path>
27
27
  okstra wizard confirmation --state-file <path>
28
28
  okstra wizard outcome --state-file <path>
@@ -34,11 +34,14 @@ All subcommands emit a single JSON object on stdout. On validation failure
34
34
  'step' returns {ok:false, error, current} so the skill can re-prompt.
35
35
  `;
36
36
 
37
- // Every wizard flag takes a value (there are no boolean flags), so the token
38
- // after a flag is always its value — even free-text answers that begin with
39
- // "--". A heuristic that rejects "--"-prefixed values would make legitimate
40
- // directive/base-ref answers unsubmittable. The inline "--key=value" form lets
41
- // callers pass any value (including empty) unambiguously.
37
+ // Only the flags listed here are boolean; every other wizard flag takes a
38
+ // value, so the token after it is always its value — even free-text answers
39
+ // that begin with "--". A heuristic that rejects "--"-prefixed values would
40
+ // make legitimate directive/base-ref answers unsubmittable. The inline
41
+ // "--key=value" form lets callers pass any value (including empty)
42
+ // unambiguously.
43
+ const BOOLEAN_FLAGS = new Set(["no-submit"]);
44
+
42
45
  export function parseFlags(args) {
43
46
  const out = {};
44
47
  const setFlag = (key, value) => {
@@ -59,6 +62,10 @@ export function parseFlags(args) {
59
62
  continue;
60
63
  }
61
64
  const key = a.slice(2);
65
+ if (BOOLEAN_FLAGS.has(key)) {
66
+ out[key] = true;
67
+ continue;
68
+ }
62
69
  if (i + 1 >= args.length) {
63
70
  throw new Error(`flag --${key} requires a value`);
64
71
  }
@@ -81,8 +88,13 @@ export function buildPythonArgs(sub, flags, workspaceRoot = "") {
81
88
  pyArgs.push("--available-function", value);
82
89
  }
83
90
  pyArgs.push("--entry-mode", flags["entry-mode"] ?? "current-session");
84
- } else if (sub === "step" && flags.answer !== undefined) {
85
- pyArgs.push("--answer", flags.answer);
91
+ } else if (sub === "step") {
92
+ if (flags["no-submit"]) {
93
+ pyArgs.push("--no-submit");
94
+ }
95
+ if (flags.answer !== undefined) {
96
+ pyArgs.push("--answer", flags.answer);
97
+ }
86
98
  }
87
99
  return pyArgs;
88
100
  }