okstra 0.209.3 → 0.209.5
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/package.json
CHANGED
package/runtime/BUILD.json
CHANGED
|
@@ -11,7 +11,7 @@ summary:
|
|
|
11
11
|
|
|
12
12
|
Skills, worker agents, and the codex wrapper are installed once per user under
|
|
13
13
|
~/.claude and ~/.okstra by scripts/okstra-install.sh. The user's settings.json
|
|
14
|
-
is never modified;
|
|
14
|
+
is never modified; \`okstra setup\` and the prepare path provision the project's
|
|
15
15
|
.claude/settings.local.json as a symlink to ~/.okstra/templates/settings.local.json,
|
|
16
16
|
which Claude Code auto-loads.
|
|
17
17
|
|
|
@@ -313,6 +313,23 @@ def _complete_request(
|
|
|
313
313
|
return "\n".join(lines) + "\n"
|
|
314
314
|
|
|
315
315
|
|
|
316
|
+
def canonical_request_path(planning_seq: str, item_id: str) -> str:
|
|
317
|
+
return f"design-prep-requests/design-prep-request-{planning_seq}-{item_id}.md"
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def canonicalize_request_paths(data: Mapping[str, Any], data_path: Path) -> None:
|
|
321
|
+
"""Name each open item's request by this report's planning seq.
|
|
322
|
+
|
|
323
|
+
The detector snapshot cannot know the report seq and names requests by stage
|
|
324
|
+
number, so a second planning run of the same task pointed its request at the
|
|
325
|
+
first run's file and materialization refused to overwrite it.
|
|
326
|
+
"""
|
|
327
|
+
planning_seq = _planning_seq(Path(data_path))
|
|
328
|
+
for item in _design_preparation_items(data):
|
|
329
|
+
if isinstance(item, dict) and "requestPath" in item and isinstance(item.get("id"), str):
|
|
330
|
+
item["requestPath"] = canonical_request_path(planning_seq, item["id"])
|
|
331
|
+
|
|
332
|
+
|
|
316
333
|
def _request_target(
|
|
317
334
|
*,
|
|
318
335
|
data_path: Path,
|
|
@@ -322,10 +339,7 @@ def _request_target(
|
|
|
322
339
|
item_id = item.get("id")
|
|
323
340
|
if not isinstance(item_id, str) or not item_id:
|
|
324
341
|
raise DesignPrepError("design preparation item id must be a non-empty string")
|
|
325
|
-
expected_relative = (
|
|
326
|
-
"design-prep-requests/"
|
|
327
|
-
f"design-prep-request-{planning_seq}-{item_id}.md"
|
|
328
|
-
)
|
|
342
|
+
expected_relative = canonical_request_path(planning_seq, item_id)
|
|
329
343
|
request_dir = data_path.parent.parent / "design-prep-requests"
|
|
330
344
|
recorded = item.get("requestPath")
|
|
331
345
|
if recorded == expected_relative:
|
|
@@ -257,7 +257,8 @@ def _launch_plan_payload(
|
|
|
257
257
|
args, adapter.descriptor.id
|
|
258
258
|
)
|
|
259
259
|
request = LeadStartRequest(project_root, "", request_argv)
|
|
260
|
-
|
|
260
|
+
with _probe_paths(str(project_root), str(Path.home())):
|
|
261
|
+
plan = start_run(request, context, adapter)
|
|
261
262
|
if dispatch_authority is not None:
|
|
262
263
|
run_manifest_path, metadata_path, _assignment = dispatch_authority
|
|
263
264
|
record_verified_agent_dispatch(
|
|
@@ -292,7 +293,8 @@ def _resume_plan_payload(
|
|
|
292
293
|
args.session_id,
|
|
293
294
|
tuple(args.request_arg),
|
|
294
295
|
)
|
|
295
|
-
|
|
296
|
+
with _probe_paths(str(project_root), str(Path.home())):
|
|
297
|
+
plan = resume_run(request, context, adapter)
|
|
296
298
|
return {"ok": True, "_project_root": str(project_root), **asdict(plan)}
|
|
297
299
|
|
|
298
300
|
|
|
@@ -26,7 +26,11 @@ from .report_synthesis_packet import (
|
|
|
26
26
|
)
|
|
27
27
|
from .conformance import strip_stage_declaration_label
|
|
28
28
|
from .coverage_census import census_warning_rows, read_census_state
|
|
29
|
-
from .design_prep import
|
|
29
|
+
from .design_prep import (
|
|
30
|
+
DesignPrepError,
|
|
31
|
+
canonicalize_request_paths,
|
|
32
|
+
materialize_design_prep_requests,
|
|
33
|
+
)
|
|
30
34
|
from .phases.implementation_option_selection.validation import validate_blocked_answer_channel
|
|
31
35
|
from .phases.technical_verification.validation import validate_technical_verification_report
|
|
32
36
|
from .report_routing import technical_verification_routing_errors
|
|
@@ -830,6 +834,16 @@ def assemble_report(
|
|
|
830
834
|
if input_issues:
|
|
831
835
|
raise ReportAssemblyError(tuple(input_issues))
|
|
832
836
|
data = _compose(project_root, manifest_path, manifest, inputs, schema)
|
|
837
|
+
value = manifest.get("expectedReportRecordPath")
|
|
838
|
+
if not isinstance(value, str) or not value:
|
|
839
|
+
_fail("orchestrator", manifest_path, "expectedReportRecordPath", "required")
|
|
840
|
+
target = Path(value)
|
|
841
|
+
target = target if target.is_absolute() else project_root / target
|
|
842
|
+
if manifest.get("taskType") == "implementation-planning":
|
|
843
|
+
try:
|
|
844
|
+
canonicalize_request_paths(data, target)
|
|
845
|
+
except DesignPrepError as exc:
|
|
846
|
+
_fail("orchestrator", target, "designPreparation", str(exc))
|
|
833
847
|
errors = validate(data, schema)
|
|
834
848
|
path_errors = planned_path_declaration_errors(data)
|
|
835
849
|
if path_errors:
|
|
@@ -840,11 +854,6 @@ def assemble_report(
|
|
|
840
854
|
direction_errors = selected_direction_plan_errors(
|
|
841
855
|
data, project_root, manifest
|
|
842
856
|
)
|
|
843
|
-
value = manifest.get("expectedReportRecordPath")
|
|
844
|
-
if not isinstance(value, str) or not value:
|
|
845
|
-
_fail("orchestrator", manifest_path, "expectedReportRecordPath", "required")
|
|
846
|
-
target = Path(value)
|
|
847
|
-
target = target if target.is_absolute() else project_root / target
|
|
848
857
|
verification_errors = validate_technical_verification_report(data, target, project_root)
|
|
849
858
|
verification_errors.extend(technical_verification_routing_errors(data))
|
|
850
859
|
if verification_errors:
|