okstra 0.30.0 → 0.30.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.
package/package.json
CHANGED
package/runtime/BUILD.json
CHANGED
|
@@ -77,3 +77,12 @@ profile document.
|
|
|
77
77
|
- Audit sidecar (shared — applies to every analysis-worker output and every final-report):
|
|
78
78
|
- Reading Confirmation lines (one short line per input file confirming end-to-end reading) live in the **worker audit sidecar** at `runs/<task-type>/worker-results/<worker>-audit-<task-type>-<seq>.md`, NOT in the worker's main worker-results file. The worker-results body starts at section 1 (Findings). The validator fails worker-results files that contain a `## 0. Reading Confirmation` heading.
|
|
79
79
|
- The audit sidecar carries any other meta the worker wants to log (tool-call counts, MCP query summaries, timing notes). The lead's final-report does NOT duplicate this content — it is consumed by the validator and by post-run audit tooling, not by end-user readers.
|
|
80
|
+
|
|
81
|
+
- Markdown authoring (shared — applies to every markdown document produced by the lead or any worker, including final-reports, worker-results, briefs, and ad-hoc notes):
|
|
82
|
+
- every document must begin with an `Index` section.
|
|
83
|
+
- include only information necessary to fulfill the user's stated purpose and directly related requirements.
|
|
84
|
+
- follow only the sections, format, tone, and scope specified by the user, plus the required `Index` section.
|
|
85
|
+
- when writing task instructions or work orders, define the scope of work clearly and specifically, including deliverables, acceptance criteria, and verification steps when relevant.
|
|
86
|
+
- define scope positively by stating what work is included. Work outside the defined scope must not be performed.
|
|
87
|
+
- before adding any structure or content not explicitly specified, ask the user for confirmation, except for the required `Index` section.
|
|
88
|
+
- before completion, verify that the document exactly matches the requested scope and contains no unrelated material.
|
|
@@ -43,6 +43,7 @@ from typing import Optional
|
|
|
43
43
|
|
|
44
44
|
from .ids import _safe_fs_segment
|
|
45
45
|
from . import worktree_registry
|
|
46
|
+
from .seeding import SettingsLinkError, ensure_project_settings_symlink
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
# Project-root directories that hold okstra task state, ignored by git, or
|
|
@@ -361,6 +362,34 @@ def _link_sync_files(source_root: Path, worktree_path: Path) -> list[str]:
|
|
|
361
362
|
return notes
|
|
362
363
|
|
|
363
364
|
|
|
365
|
+
def _seed_worktree_settings_symlink(worktree_path: Path) -> None:
|
|
366
|
+
"""Seed `.claude/settings.local.json` in the worker worktree so dispatched
|
|
367
|
+
Claude / codex / gemini sessions inherit the okstra read-only / write
|
|
368
|
+
allowlist. Mirrors the main-project seeding done in `run.py` — needed
|
|
369
|
+
because `_link_sync_dirs` skips `.claude/` whenever `git worktree add`
|
|
370
|
+
already materialised the directory (e.g. tracked `.claude/handoff-*.md`).
|
|
371
|
+
Failures degrade to stderr warning so worktree provisioning still
|
|
372
|
+
succeeds.
|
|
373
|
+
"""
|
|
374
|
+
try:
|
|
375
|
+
link = ensure_project_settings_symlink(project_root=worktree_path)
|
|
376
|
+
except SettingsLinkError as exc:
|
|
377
|
+
print(
|
|
378
|
+
f"okstra-settings: failed to seed worker worktree symlink at "
|
|
379
|
+
f"{worktree_path / '.claude/settings.local.json'} — worker dispatch "
|
|
380
|
+
f"may be blocked by Claude Code permissions. ({exc})",
|
|
381
|
+
file=__import__("sys").stderr,
|
|
382
|
+
)
|
|
383
|
+
return
|
|
384
|
+
if link is None:
|
|
385
|
+
print(
|
|
386
|
+
"okstra-settings: ~/.okstra/templates/settings.local.json missing — "
|
|
387
|
+
"re-run 'npx okstra@latest install' (0.14.0+) to provision the "
|
|
388
|
+
"symlink target.",
|
|
389
|
+
file=__import__("sys").stderr,
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
|
|
364
393
|
def _copy_snapshot_files(source_root: Path, worktree_path: Path) -> list[str]:
|
|
365
394
|
"""Copy fixture files from MAIN → task worktree as read-only snapshots
|
|
366
395
|
(FU-V3).
|
|
@@ -485,6 +514,7 @@ def provision_task_worktree(
|
|
|
485
514
|
existing = worktree_registry.lookup(safe_project, safe_group, safe_task)
|
|
486
515
|
if existing is not None and existing.status == "active":
|
|
487
516
|
worktree_registry.touch_phase(safe_project, safe_group, safe_task, task_type)
|
|
517
|
+
_seed_worktree_settings_symlink(Path(existing.worktree_path))
|
|
488
518
|
return WorktreeProvision(
|
|
489
519
|
status="reused",
|
|
490
520
|
path=existing.worktree_path,
|
|
@@ -586,6 +616,8 @@ def provision_task_worktree(
|
|
|
586
616
|
_git(main_root, "branch", "-D", branch)
|
|
587
617
|
raise
|
|
588
618
|
|
|
619
|
+
_seed_worktree_settings_symlink(worktree_path)
|
|
620
|
+
|
|
589
621
|
base_label = (
|
|
590
622
|
f"{base_origin} @ {resolved_base_ref[:12]}"
|
|
591
623
|
if base_origin != "HEAD"
|