okstra 0.110.0 → 0.111.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 (31) hide show
  1. package/README.kr.md +1 -0
  2. package/README.md +1 -0
  3. package/docs/for-ai/skills/okstra-run.md +7 -5
  4. package/docs/kr/architecture.md +9 -10
  5. package/docs/kr/cli.md +2 -2
  6. package/docs/project-structure-overview.md +9 -9
  7. package/docs/task-process/README.md +4 -4
  8. package/docs/task-process/common-flow.md +8 -5
  9. package/docs/task-process/implementation.md +4 -5
  10. package/docs/task-process/release-handoff.md +3 -3
  11. package/package.json +1 -1
  12. package/runtime/BUILD.json +2 -2
  13. package/runtime/agents/workers/antigravity-worker.md +1 -0
  14. package/runtime/agents/workers/codex-worker.md +1 -0
  15. package/runtime/prompts/lead/convergence.md +7 -7
  16. package/runtime/prompts/profiles/_common-contract.md +1 -1
  17. package/runtime/prompts/profiles/_implementation-diff-review.md +43 -0
  18. package/runtime/prompts/profiles/_implementation-executor.md +7 -9
  19. package/runtime/prompts/profiles/_implementation-self-check.md +11 -5
  20. package/runtime/python/okstra_ctl/codex_dispatch.py +3 -0
  21. package/runtime/python/okstra_ctl/consumers.py +4 -0
  22. package/runtime/python/okstra_ctl/handoff.py +5 -23
  23. package/runtime/python/okstra_ctl/implementation_stage.py +11 -11
  24. package/runtime/python/okstra_ctl/report_views.py +76 -26
  25. package/runtime/python/okstra_ctl/stage_targets.py +152 -0
  26. package/runtime/python/okstra_ctl/wizard.py +47 -0
  27. package/runtime/python/okstra_project/__init__.py +2 -0
  28. package/runtime/python/okstra_project/state.py +44 -2
  29. package/runtime/skills/okstra-run/SKILL.md +21 -17
  30. package/src/commands/execute/wizard.mjs +3 -1
  31. package/src/commands/inspect/task-show.mjs +11 -31
@@ -16,6 +16,7 @@ Subcommands:
16
16
  step submit an answer (or fetch the current prompt) and emit next
17
17
  render-args emit the final --flag/value map for 'okstra render-bundle'
18
18
  confirmation emit the multi-line confirmation echo block
19
+ outcome emit render args, persistence actions, and confirmation text
19
20
 
20
21
  Usage:
21
22
  okstra wizard new-state-file
@@ -23,6 +24,7 @@ Usage:
23
24
  okstra wizard step --state-file <path> [--answer <value>]
24
25
  okstra wizard render-args --state-file <path>
25
26
  okstra wizard confirmation --state-file <path>
27
+ okstra wizard outcome --state-file <path>
26
28
 
27
29
  'init' auto-fills --workspace-root from 'okstra paths --field workspace',
28
30
  so callers do not pass it.
@@ -65,7 +67,7 @@ export async function run(args) {
65
67
  }
66
68
 
67
69
  const [sub, ...rest] = args;
68
- if (!["new-state-file", "init", "step", "render-args", "confirmation"].includes(sub)) {
70
+ if (!["new-state-file", "init", "step", "render-args", "confirmation", "outcome"].includes(sub)) {
69
71
  process.stderr.write(`error: unknown wizard subcommand '${sub}'\n\n${USAGE}`);
70
72
  return 2;
71
73
  }
@@ -40,8 +40,8 @@ const SCRIPT = `
40
40
  import json, sys
41
41
  from pathlib import Path
42
42
  from okstra_project import (
43
- resolve_project_root, find_task_root, read_task_manifest,
44
- ResolverError,
43
+ resolve_project_root, task_read_side_snapshot,
44
+ ResolverError, StateError,
45
45
  )
46
46
 
47
47
  explicit = sys.argv[1]
@@ -55,37 +55,17 @@ except ResolverError as e:
55
55
  sys.exit(2)
56
56
 
57
57
  pr_path = Path(pr)
58
- task_root = find_task_root(pr_path, task_key)
59
- if task_root is None:
60
- print(json.dumps({"ok": False, "stage": "task_root_missing", "reason": f"no task root for {task_key}"}))
61
- sys.exit(1)
62
-
63
- manifest = read_task_manifest(task_root)
64
- if manifest is None:
65
- print(json.dumps({"ok": False, "stage": "manifest_missing", "reason": f"task-manifest.json missing in {task_root}"}))
58
+ try:
59
+ snapshot = task_read_side_snapshot(pr_path, task_key)
60
+ except StateError as e:
61
+ print(json.dumps({
62
+ "ok": False,
63
+ "stage": getattr(e, "stage", None) or "task_snapshot",
64
+ "reason": str(e),
65
+ }))
66
66
  sys.exit(1)
67
67
 
68
- wf = manifest.get("workflow", {}) or {}
69
- out = {
70
- "ok": True,
71
- "projectRoot": str(pr_path),
72
- "taskKey": manifest.get("taskKey"),
73
- "taskType": manifest.get("taskType"),
74
- "taskRoot": str(task_root),
75
- "taskBriefPath": manifest.get("taskBriefPath"),
76
- "workflow": {
77
- "currentPhase": wf.get("currentPhase"),
78
- "currentPhaseState": wf.get("currentPhaseState"),
79
- "lastCompletedPhase": wf.get("lastCompletedPhase"),
80
- "nextRecommendedPhase": wf.get("nextRecommendedPhase"),
81
- "routingStatus": wf.get("routingStatus"),
82
- "phaseStates": wf.get("phaseStates"),
83
- },
84
- "resultContract": manifest.get("resultContract"),
85
- "artifacts": manifest.get("artifacts"),
86
- "modelAssignments": manifest.get("modelAssignments"),
87
- "latestRunPath": manifest.get("latestRunPath"),
88
- }
68
+ out = {"ok": True, **snapshot}
89
69
  print(json.dumps(out, ensure_ascii=False, default=str, indent=2))
90
70
  `;
91
71