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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okstra",
3
- "version": "0.30.0",
3
+ "version": "0.30.1",
4
4
  "description": "Multi-agent cross-verification orchestrator runtime + Claude Code skills.",
5
5
  "license": "MIT",
6
6
  "author": "devonshin",
@@ -1,5 +1,5 @@
1
1
  {
2
- "package": "0.30.0",
3
- "builtAt": "2026-05-17T08:21:41.472Z",
2
+ "package": "0.30.1",
3
+ "builtAt": "2026-05-17T11:12:55.482Z",
4
4
  "repoRoot": "/home/runner/work/okstra/okstra"
5
5
  }
@@ -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"