From 580c585e38d39611f3fa656ed1bfc4dffaca5972 Mon Sep 17 00:00:00 2001 From: Szowesgad Date: Sun, 28 Jun 2026 21:14:16 -0700 Subject: [PATCH 001/119] [claude/terminal] docs(skills): codify Visible Dispatch (vc-frame) across operator/dispatch/ownership/partner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fleet dispatch must be VISIBLE when an operator session is live. The postures already carried this only as a buried anti-pattern ("Running headless or unwatchable dispatches" / "Do not run unwatchable dispatch") with no positive law and no mechanism — so a dispatcher using the MCP launcher (which defaults runtime=headless and ignores VC_FRAME_SESSION_NAME) silently strands workers as invisible orphans even with a live vc-frame session, forcing hand-relayed status. Make it a first-class law and name the trap, verified against vibecrafted-core source (SUPPORTED_RUNTIMES = headless|terminal|visible; terminal opens a vc-frame tab when VC_FRAME_SESSION_NAME is set; degrade-not-die to headless when absent; CLI auto-selects terminal on a live session, MCP does not): - vc-operator/SKILL.md: Dispatch Law gains a "Visible Dispatch" subsection (CLI auto-selects, MCP needs explicit runtime="visible", headless = unattended only). - vc-operator/RUNTIME.md: "Visible runtime (vc-frame) is the attended default" section under Runtime Lanes — the full selector mechanism. - vc-dispatch/SKILL.md: the Dispatch loop step now mandates visible launch + names the MCP default trap. - vc-ownership/SKILL.md: Agent Policy gains a visible-dispatch rule. - vc-partner/SKILL.md: Execution Shape note — shared steering means the operator sees the work happen. Triggered live: a headless MCP dispatch on loctree-suite blinded the operator and turned the conductor into a status relay. Visible-by-default dissolves that. Follow-up: mirror into the pl/ translated skill variants. Authored-By: claude session_id: 43bc805c-1b8d-46f8-9d33-fd178be5cf5f date: 2026-06-28T20:55:00 PDT runtime: terminal time: 2026-06-28T21:14:29-07:00 --- .../skills/vc-dispatch/SKILL.md | 11 +++++++-- .../skills/vc-operator/RUNTIME.md | 23 +++++++++++++++++++ .../skills/vc-operator/SKILL.md | 23 +++++++++++++++++++ .../skills/vc-ownership/SKILL.md | 7 ++++++ .../skills/vc-partner/SKILL.md | 7 ++++++ 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/vibecrafted-core/vibecrafted_core/skills/vc-dispatch/SKILL.md b/vibecrafted-core/vibecrafted_core/skills/vc-dispatch/SKILL.md index 9496cae8..18d77930 100644 --- a/vibecrafted-core/vibecrafted_core/skills/vc-dispatch/SKILL.md +++ b/vibecrafted-core/vibecrafted_core/skills/vc-dispatch/SKILL.md @@ -88,8 +88,15 @@ pre-flight → DISPATCH → SPANKO → SPRAWDZENIE → FLIP → BATON → next c 2. **Dispatch**: one prompt file (never argv — `ps`-public, ARG_MAX, broken newlines), four layers per the checklist. Launch: `bash -c 'ulimit -f unlimited; vibecrafted --file '` - (shells may carry soft `ulimit -f` → SIGXFSZ/exit 153). Record the receipt - (run_id, report, transcript, meta) in the tracker. + (shells may carry soft `ulimit -f` → SIGXFSZ/exit 153). **Visible by default:** + when a vc-frame session is live (`VC_FRAME_SESSION_NAME` set) the CLI launcher + auto-selects the `terminal` runtime and the worker opens as a vc-frame tab the + operator watches. Do NOT dispatch headless into a live session — that strands + an invisible orphan and forces hand-relayed status. The MCP launchers + (`vc_run_launch` / `vc_launch`) default `runtime="headless"` and do NOT detect + the session, so when dispatching through MCP pass `runtime="visible"` + explicitly, or use the CLI. Headless is the unattended/cron lane only. Record + the receipt (run_id, report, transcript, meta) in the tracker. 3. **Spanko**: await through artifacts, never by staring at a pane. Use the dedicated command as the standard dispatcher loop: `vibecrafted loop spanko --run-id --agent --verify '' --tracker --cut-id --then ''` diff --git a/vibecrafted-core/vibecrafted_core/skills/vc-operator/RUNTIME.md b/vibecrafted-core/vibecrafted_core/skills/vc-operator/RUNTIME.md index 3cae6774..a89267b1 100644 --- a/vibecrafted-core/vibecrafted_core/skills/vc-operator/RUNTIME.md +++ b/vibecrafted-core/vibecrafted_core/skills/vc-operator/RUNTIME.md @@ -57,6 +57,29 @@ proof that a public `vibecrafted operator` command exists. | Deterministic supervisor | `vibecrafted dispatch ` | | Outward ship | `vibecrafted release ` | +## Visible runtime (vc-frame) is the attended default + +Runtime mode is `headless | terminal | visible` (`SUPPORTED_RUNTIMES`). The +selector resolves like this: + +- When a vc-frame operator session is live — `VC_FRAME_SESSION_NAME` is set — + `terminal`/`visible` opens the worker in a **new vc-frame tab** the operator + watches in real time. +- With no session, `terminal` **degrades to headless** rather than stranding a + worker in a tab that cannot exist (degrade-not-die). +- `headless` runs the dispatcher directly with no tab — correct for cron and + no-session hosts, wrong for attended work. + +The CLI (`vibecrafted --file `) auto-selects `terminal` +when the session exists, so attended dispatch is visible by default. The MCP +launch tools (`vc_run_launch` / `vc_launch`) do NOT: they default +`runtime="headless"` and ignore `VC_FRAME_SESSION_NAME`. When you dispatch +through MCP while a session is live, pass `runtime="visible"` explicitly — or use +the CLI. A headless dispatch into a live operator session is an invisible orphan, +not a quiet success: the operator cannot see it, and the conductor is reduced to +relaying status by hand. Visible-by-default is what keeps the operator in the +loop instead of asking "is it running?". + ## Terminal States ```yaml diff --git a/vibecrafted-core/vibecrafted_core/skills/vc-operator/SKILL.md b/vibecrafted-core/vibecrafted_core/skills/vc-operator/SKILL.md index eff718f0..76ae94f8 100644 --- a/vibecrafted-core/vibecrafted_core/skills/vc-operator/SKILL.md +++ b/vibecrafted-core/vibecrafted_core/skills/vc-operator/SKILL.md @@ -194,6 +194,29 @@ allowed for parallel recon or small bounded research inside the operator session, but dispatched worker slices need telemetry, launch cards, reports, transcripts, meta, and awaitable state. +### Visible Dispatch (vc-frame default — non-negotiable when a session is live) + +When a vc-frame operator session is live (`VC_FRAME_SESSION_NAME` is set), every +attended fleet dispatch MUST launch in the **visible** runtime so each worker +opens as a vc-frame tab the operator watches directly. A headless, unwatchable +dispatch is the failure mode, not the safe default — it blinds the operator, +forces them to ask "is it running?", and pushes the conductor into relaying +status in a panic instead of both simply watching the pane. + +- **CLI auto-selects visible.** `vibecrafted --file ` + picks the `terminal` runtime automatically when an operator session exists, + and degrades to headless ONLY when no session is present (degrade-not-die). + Prefer the CLI for attended dispatch — it does the right thing by default. +- **MCP launcher does NOT auto-select.** `vc_run_launch` / `vc_launch` default to + `runtime="headless"` and do not detect `VC_FRAME_SESSION_NAME`. Dispatching + through MCP with a live session therefore REQUIRES an explicit + `runtime="visible"` (or `"terminal"`). Passing — or defaulting to — `headless` + while a session is live is a dispatch error: it strands the worker as an + invisible orphan the operator never sees. +- **Headless is for the unattended lane only:** cron heartbeats, no-session + CI/headless hosts, and runs the operator explicitly chose to background. Never + for work the operator is sitting and watching. + ## Plan Mutation Allowance The operator may skip, add, reorder, or regroup prompts, and may cherry-pick diff --git a/vibecrafted-core/vibecrafted_core/skills/vc-ownership/SKILL.md b/vibecrafted-core/vibecrafted_core/skills/vc-ownership/SKILL.md index a9b2fc7e..a30d822c 100644 --- a/vibecrafted-core/vibecrafted_core/skills/vc-ownership/SKILL.md +++ b/vibecrafted-core/vibecrafted_core/skills/vc-ownership/SKILL.md @@ -362,6 +362,13 @@ Keep these rules: - reports beat vibes - one resumed agent may spawn one bounded helper if the controlling skill allows it - synthesis stays in the main thread +- **dispatch visibly when a session is live.** When `VC_FRAME_SESSION_NAME` is + set, fleet workers launch in the `terminal`/`visible` runtime as vc-frame tabs + the operator watches — never headless. The CLI `vibecrafted +--file` auto-selects visible; the MCP `vc_run_launch`/`vc_launch` default to + `headless` and need an explicit `runtime="visible"`. A black-box dispatch the + operator can't see is the failure, not the safe default. Headless is the + unattended/cron lane only. ## Output Style diff --git a/vibecrafted-core/vibecrafted_core/skills/vc-partner/SKILL.md b/vibecrafted-core/vibecrafted_core/skills/vc-partner/SKILL.md index e5375210..47282045 100644 --- a/vibecrafted-core/vibecrafted_core/skills/vc-partner/SKILL.md +++ b/vibecrafted-core/vibecrafted_core/skills/vc-partner/SKILL.md @@ -149,6 +149,13 @@ contract: Do not delegate before the problem and success contract are explicit. +When you do dispatch a lane while sitting with the operator, dispatch it +**visibly**: with a live vc-frame session (`VC_FRAME_SESSION_NAME` set) the CLI +`vibecrafted --file` opens the worker as a vc-frame tab you both +watch. Never go headless into a live session — the MCP `vc_run_launch`/`vc_launch` +default to `headless` and need an explicit `runtime="visible"`. Shared steering +means the operator sees the work happen, not a status relay after the fact. + ## Partner Journal For work that may span compaction, delegation, review, or multiple turns, keep From 6cd54e77a183100773c2ac4634cd18f2d3047548 Mon Sep 17 00:00:00 2001 From: Szowesgad Date: Mon, 29 Jun 2026 14:43:42 -0700 Subject: [PATCH 002/119] [codex/terminal] test(runtime): RED state-parity test reproducing control-plane drift Adds a deterministic RED parity test for async dispatcher versus legacy shell state projection drift, plus assertions for the observed terminal projection regressions. Authored-By: codex session_id: 019f154a-2e3f-7f51-95e0-7adaf4a0c315 time: 2026-06-29T14:42:59-07:00 runtime: terminal --- .../tests/test_run_state_parity.py | 325 ++++++++++++++++++ 1 file changed, 325 insertions(+) create mode 100644 vibecrafted-core/tests/test_run_state_parity.py diff --git a/vibecrafted-core/tests/test_run_state_parity.py b/vibecrafted-core/tests/test_run_state_parity.py new file mode 100644 index 00000000..d265ce38 --- /dev/null +++ b/vibecrafted-core/tests/test_run_state_parity.py @@ -0,0 +1,325 @@ +from __future__ import annotations + +import json +import os +import shlex +import subprocess +import sys +import time +from pathlib import Path +from typing import Any + +from vibecrafted_core import control_plane + + +REPO_ROOT = Path(__file__).resolve().parents[2] +CORE_ROOT = REPO_ROOT / "vibecrafted-core" +SCRIPT_DIR = CORE_ROOT / "vibecrafted_core" / "runtime" / "scripts" +SESSION_PLACEHOLDERS = {"", "pending", "none", "null", "unknown"} + + +def _child_env(home: Path) -> dict[str, str]: + env = os.environ.copy() + env["VIBECRAFTED_HOME"] = str(home) + env["VIBECRAFTED_ROOT"] = str(REPO_ROOT) + env["VIBECRAFTED_CORE_PYTHONPATH"] = str(CORE_ROOT) + env["PYTHONPATH"] = ( + str(CORE_ROOT) + if not env.get("PYTHONPATH") + else str(CORE_ROOT) + os.pathsep + env["PYTHONPATH"] + ) + return env + + +def _snapshot_path(home: Path, run_id: str) -> Path: + return home / "control_plane" / "runs" / f"{run_id}.json" + + +def _read_projection(home: Path, run_id: str) -> dict[str, Any] | None: + control_plane.sync_state() + path = _snapshot_path(home, run_id) + if not path.exists(): + return None + return json.loads(path.read_text(encoding="utf-8")) + + +def _wait_for_active_projection( + home: Path, + run_id: str, + label: str, + *, + timeout: float = 1.5, +) -> dict[str, Any]: + deadline = time.monotonic() + timeout + last: dict[str, Any] | None = None + while time.monotonic() < deadline: + last = _read_projection(home, run_id) + if last: + state = str(last.get("state", "")) + session_id = str(last.get("session_id", "")) + if state == "active" and session_id.lower() not in SESSION_PLACEHOLDERS: + return last + time.sleep(0.05) + + if last is None: + raise AssertionError( + f"{label} state drift: expected runs/{run_id}.json to reach " + "state=active with non-empty session_id; no projection was written" + ) + + raise AssertionError( + f"{label} state drift: expected runs/{run_id}.json to reach " + "state=active with non-empty session_id; " + f"last projection state={last.get('state')!r}, " + f"liveness={last.get('liveness')!r}, " + f"session_id={last.get('session_id')!r}, " + f"operator_state={last.get('operator_state')!r}, " + f"path={_snapshot_path(home, run_id)}" + ) + + +def _wait_process(proc: subprocess.Popen[str], *, timeout: float = 5.0) -> None: + try: + proc.wait(timeout=timeout) + except subprocess.TimeoutExpired: + proc.terminate() + try: + proc.wait(timeout=1.0) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait(timeout=1.0) + + +def _write_async_worker(tmp_path: Path, *, sleep_seconds: float = 2.0) -> Path: + worker = tmp_path / "worker.py" + worker.write_text( + "\n".join( + [ + "import time", + "print('dispatcher-active', flush=True)", + f"time.sleep({sleep_seconds!r})", + ] + ) + + "\n", + encoding="utf-8", + ) + return worker + + +def _append_lifecycle_event(home: Path, payload: dict[str, Any]) -> None: + events = home / "control_plane" / "events.jsonl" + events.parent.mkdir(parents=True, exist_ok=True) + event = { + "ts": "2026-06-29T00:00:00+00:00", + "run_id": payload["run_id"], + "kind": f"lifecycle:{payload['state']}", + "message": f"test {payload['state']}", + "payload": payload, + } + with events.open("a", encoding="utf-8") as fh: + fh.write(json.dumps(event, sort_keys=True) + "\n") + + +def test_python_dispatcher_projection_reaches_active_with_session_id( + tmp_path: Path, + monkeypatch, +) -> None: + """Async dispatcher is the control case: live events advance the projection.""" + + home = tmp_path / "home" + monkeypatch.setenv("VIBECRAFTED_HOME", str(home)) + run_id = "parity-async" + worker = _write_async_worker(tmp_path) + transcript = tmp_path / "dispatcher.transcript.log" + + proc = subprocess.Popen( + [ + sys.executable, + "-m", + "vibecrafted_core.dispatcher", + "run", + "--run-id", + run_id, + "--root", + str(tmp_path), + "--transcript", + str(transcript), + "--no-require-report", + "--require-transcript-output", + "--quiet", + "--", + sys.executable, + str(worker), + ], + cwd=tmp_path, + env=_child_env(home), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + try: + projection = _wait_for_active_projection(home, run_id, "python-dispatcher path") + finally: + _wait_process(proc) + + stdout, stderr = proc.communicate() + assert proc.returncode == 0, ( + "dispatcher control path should finish cleanly; " + f"stdout={stdout!r}, stderr={stderr!r}" + ) + assert projection["state"] == "active" + assert projection["session_id"].lower() not in SESSION_PLACEHOLDERS + + +def test_shell_meta_projection_reaches_active_with_session_id( + tmp_path: Path, + monkeypatch, +) -> None: + """Legacy shell path must match async liveness. + + This drives the shell-owned `spawn_write_meta` writer directly instead of + launching a terminal or LLM. The RED bug is that the worker can be alive + while `control_plane/runs/.json` remains launching/pid_pending with no + session identity because the shell path emits no live lifecycle events. + """ + + home = tmp_path / "home" + monkeypatch.setenv("VIBECRAFTED_HOME", str(home)) + run_id = "parity-shell" + prompt = tmp_path / "prompt.md" + prompt.write_text("test prompt\n", encoding="utf-8") + report = tmp_path / "reports" / f"{run_id}.md" + transcript = tmp_path / "shell.transcript.log" + transcript.parent.mkdir(parents=True, exist_ok=True) + meta = ( + home + / "artifacts" + / "VetCoders" + / "vibecrafted" + / "2026_0629" + / "reports" + / f"{run_id}.meta.json" + ) + + with transcript.open("w", encoding="utf-8") as transcript_fh: + worker = subprocess.Popen( + [ + sys.executable, + "-c", + "import time; print('shell worker active', flush=True); time.sleep(2.0)", + ], + stdout=transcript_fh, + stderr=subprocess.STDOUT, + text=True, + ) + shell = "\n".join( + [ + f"source {shlex.quote(str(SCRIPT_DIR / 'common.sh'))}", + f"export SPAWN_RUN_ID={shlex.quote(run_id)}", + "export SPAWN_PROMPT_ID=prompt-red", + "export SPAWN_LOOP_NR=0", + "export SPAWN_SKILL_CODE=impl", + "spawn_write_meta " + f"{shlex.quote(str(meta))} " + "launching codex implement " + f"{shlex.quote(str(tmp_path))} " + f"{shlex.quote(str(prompt))} " + f"{shlex.quote(str(report))} " + f"{shlex.quote(str(transcript))} " + f"{shlex.quote(str(tmp_path / 'legacy-launcher.sh'))} " + "codex-cli-default", + ] + ) + try: + subprocess.run( + ["bash", "-lc", shell], + cwd=REPO_ROOT, + env=_child_env(home), + check=True, + capture_output=True, + text=True, + ) + _wait_for_active_projection(home, run_id, "shell/legacy path") + finally: + _wait_process(worker) + + +def test_active_projection_without_report_is_not_blocked_mid_delivery( + tmp_path: Path, + monkeypatch, +) -> None: + run_id = "active-report-pending" + home = tmp_path / "home" + monkeypatch.setenv("VIBECRAFTED_HOME", str(home)) + transcript = tmp_path / "active.log" + transcript.write_text("still working\n", encoding="utf-8") + report = tmp_path / "active-report.md" + + _append_lifecycle_event( + home, + { + "run_id": run_id, + "state": "active", + "agent": "codex", + "skill": "implement", + "mode": "terminal", + "root": str(tmp_path), + "report": str(report), + "transcript": str(transcript), + "session_id": "session-live", + "identity_required": True, + "liveness": "pid_alive", + }, + ) + + projection = _read_projection(home, run_id) + assert projection is not None + assert projection["state"] == "active" + assert projection["operator_state"] == "running", ( + "active run drift: a healthy ACTIVE projection must not be blocked " + "or report_missing before the run has reached a terminal state" + ) + assert projection["artifact_gate"] == "pending" + assert "report_missing" not in projection["artifact_errors"] + + +def test_report_validated_projection_clears_recovery_required( + tmp_path: Path, + monkeypatch, +) -> None: + run_id = "validated-clears-recovery" + home = tmp_path / "home" + monkeypatch.setenv("VIBECRAFTED_HOME", str(home)) + report = tmp_path / "validated.md" + report.write_text("# Report\n\nok\n", encoding="utf-8") + + _append_lifecycle_event( + home, + { + "run_id": run_id, + "state": "report_validated", + "agent": "codex", + "skill": "implement", + "mode": "terminal", + "root": str(tmp_path), + "report": str(report), + "session_id": "session-done", + "identity_required": True, + "liveness": "terminal", + "recovery_required": True, + }, + ) + + projection = _read_projection(home, run_id) + assert projection is not None + assert projection["state"] == "report_validated" + assert projection["operator_state"] == "completed" + assert projection["exit_code"] == 0, ( + "report_validated drift: validated terminal reports should project a " + "successful exit_code instead of leaving exit_code=null" + ) + assert projection.get("recovery_required") is not True + assert projection["lifecycle"]["recovery_required"] is False, ( + "report_validated drift: validated terminal reports must clear stale " + "recovery_required instead of projecting a recovery lane" + ) From 910525615d911618fe5bed2f09bbc6120ab73512 Mon Sep 17 00:00:00 2001 From: Szowesgad Date: Mon, 29 Jun 2026 17:08:01 -0700 Subject: [PATCH 003/119] [junie/runtime] fix(runtime): single control-plane state writer across both launch paths - emit live lifecycle input from legacy shell metadata writes without adding a second runs snapshot writer - defer missing-report blocking for active runs with live session identity while preserving stale dead-launcher failures - normalize validated terminal projections with exit_code/completed_at and repair footer token extraction gate Authored-By: junie session_id: 019f1134-8399-74d0-b38e-3176ab7d9d1b time: 2026-06-29T17:07:28-07:00 runtime: terminal --- .../vibecrafted_core/control_plane.py | 14 +++++- vibecrafted-core/vibecrafted_core/spawn.py | 50 +++++++++++++------ 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/vibecrafted-core/vibecrafted_core/control_plane.py b/vibecrafted-core/vibecrafted_core/control_plane.py index e68fc226..6608d308 100644 --- a/vibecrafted-core/vibecrafted_core/control_plane.py +++ b/vibecrafted-core/vibecrafted_core/control_plane.py @@ -315,8 +315,11 @@ def _artifact_projection( result = dict(run) errors = [str(item) for item in (run.get("artifact_errors") or []) if str(item)] artifact_ok = run.get("artifact_ok") + terminal_state = state in {"report_validated", "completed", "closed"} + has_live_identity = bool(str(run.get("session_id") or "").strip()) + defer_report_gate = state in ACTIVE_STATES and has_live_identity - if report: + if report and not defer_report_gate: report_path = Path(report) try: if not report_path.exists(): @@ -327,7 +330,7 @@ def _artifact_projection( except OSError: if "report_invalid" not in errors: errors.append("report_invalid") - elif state in {"report_validated", "completed", "closed"}: + elif terminal_state: if "report_missing" not in errors: errors.append("report_missing") @@ -365,6 +368,13 @@ def _artifact_projection( result["transcript_bytes"] = transcript_bytes result["transcript_growth"] = transcript_growth result["heartbeat_at"] = str(run.get("heartbeat_at") or run.get("updated_at") or "") + if terminal_state and artifact_ok and not errors: + if _coerce_int(result.get("exit_code")) is None: + result["exit_code"] = 0 + if not str(result.get("completed_at") or ""): + result["completed_at"] = str(result.get("updated_at") or _now().isoformat()) + result["liveness"] = "terminal" + result.pop("recovery_required", None) result["operator_state"] = _operator_state(result) return result diff --git a/vibecrafted-core/vibecrafted_core/spawn.py b/vibecrafted-core/vibecrafted_core/spawn.py index 06d94319..bc6f29f5 100644 --- a/vibecrafted-core/vibecrafted_core/spawn.py +++ b/vibecrafted-core/vibecrafted_core/spawn.py @@ -38,17 +38,12 @@ # per-event `tokens: N in / N out` lines, which only some provider # formatters render and which would otherwise sum partial streaming usage. FOOTER_TOKEN_PATTERNS = { - # Anchor on the INDENTED run-closure footer (` tokens_input: N`, written - # under `run_closure:`), not a column-0 line. The launcher frontmatter seed - # writes an unindented `tokens_input: 0`; matching it short-circuited token - # extraction to always-zero. Requiring leading whitespace targets the real - # footer and lets the inline `tokens:` parse run when no footer is present. - "input": re.compile(r"^\s+tokens_input:\s*([0-9]+)", re.IGNORECASE | re.MULTILINE), + "input": re.compile(r"^\s*tokens_input:\s*([0-9]+)", re.IGNORECASE | re.MULTILINE), "cached_input": re.compile( - r"^\s+tokens_cached_input:\s*([0-9]+)", re.IGNORECASE | re.MULTILINE + r"^\s*tokens_cached_input:\s*([0-9]+)", re.IGNORECASE | re.MULTILINE ), "output": re.compile( - r"^\s+tokens_output:\s*([0-9]+)", re.IGNORECASE | re.MULTILINE + r"^\s*tokens_output:\s*([0-9]+)", re.IGNORECASE | re.MULTILINE ), } COST_PATTERNS = ( @@ -272,6 +267,7 @@ def _extract_session(text: str) -> str: def _extract_tokens(text: str) -> dict[str, int]: clean = _clean_text(text) + found = TOKEN_PATTERN.findall(clean) # Prefer the authoritative run-closure footer totals when present: they are # written for every agent and carry the final per-run usage, so they work # uniformly across providers and never sum partial streaming deltas. @@ -282,13 +278,14 @@ def _extract_tokens(text: str) -> dict[str, int]: input_tokens = int(footer_in[-1]) if footer_in else 0 cached_tokens = int(footer_cached[-1]) if footer_cached else 0 output_tokens = int(footer_out[-1]) if footer_out else 0 - return { - "input": input_tokens, - "cached_input": cached_tokens, - "output": output_tokens, - "total": input_tokens + output_tokens, - } - found = TOKEN_PATTERN.findall(clean) + total_tokens = input_tokens + output_tokens + if total_tokens or not found: + return { + "input": input_tokens, + "cached_input": cached_tokens, + "output": output_tokens, + "total": total_tokens, + } if not found: return {"input": 0, "cached_input": 0, "output": 0, "total": 0} input_tokens = cached_tokens = output_tokens = 0 @@ -441,6 +438,29 @@ def write_meta( } _write_meta(meta, payload) + if run_id: + append_event( + "lifecycle:active", + run_id, + "legacy shell launcher metadata is live", + { + "state": "active", + "agent": agent, + "skill": skill_code, + "mode": mode, + "root": normalize_run_root(str(root), Path.cwd()), + "report": report, + "transcript": transcript, + "launcher": launcher, + "model": model, + "prompt_id": prompt_id, + "started_at": now_iso, + "liveness": "active", + "identity_required": True, + "meta": str(meta), + "runtime": "shell", + }, + ) return meta From dcaf7ced27042cd502bebd2acce139ce302fbb82 Mon Sep 17 00:00:00 2001 From: m-szymanska Date: Tue, 30 Jun 2026 07:51:59 -0700 Subject: [PATCH 004/119] [claude/interactive] chore(deprivatize): neutralize home-path usernames Replace real and non-neutral placeholder home-path usernames (maciejgad, polyversai, silver, op, YOUR_USER) with the neutral `you` across docs, tests, plans, and sample configs. Test fixtures (schema_fidelity.rs, test_capabilities.py) updated on both the input and assertion sides so behavior is unchanged. Authored-By: claude session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:51:59-07:00 runtime: interactive --- docker/runtime/tailscale.env.example | 2 +- tests/hammerspoon_smoke.sh | 4 ++-- .../mux-agent/docs/dev/guidelines.md | 2 +- vibecrafted-core/tests/test_capabilities.py | 12 +++++------ .../control-core/tests/schema_fidelity.rs | 20 +++++++++---------- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docker/runtime/tailscale.env.example b/docker/runtime/tailscale.env.example index a26d28fd..b6300688 100644 --- a/docker/runtime/tailscale.env.example +++ b/docker/runtime/tailscale.env.example @@ -28,7 +28,7 @@ TS_EXTRA_ARGS=--ssh # OPTIONAL — host workspace bind-mount path (made available at /workspace/host # inside the container). Useful when the runtime should see live host files. -# VIBECRAFTED_HOST_WORKSPACE=/Users/maciejgad/vc-workspace +# VIBECRAFTED_HOST_WORKSPACE=/Users/you/vc-workspace # OPTIONAL — override the in-container sshd port. Default 22 is fine on the # tailnet because the sidecar isolates the port from the host network. diff --git a/tests/hammerspoon_smoke.sh b/tests/hammerspoon_smoke.sh index bd565fb1..5d87030d 100755 --- a/tests/hammerspoon_smoke.sh +++ b/tests/hammerspoon_smoke.sh @@ -241,7 +241,7 @@ end -- Test harness local cases_positive = { {label = "vc-ping msg=hello", params = {msg = "hello"}, allowed = {"msg", "hello"}}, - {label = "vc-open-file abs path", params = {path = "/Users/op/repo/file.md"}, allowed = {"path"}}, + {label = "vc-open-file abs path", params = {path = "/Users/you/repo/file.md"}, allowed = {"path"}}, {label = "vc-loct cmd=health", params = {cmd = "health", repo = "/abs/p"}, allowed = {"cmd", "repo"}}, {label = "vc-aicx query=text", params = {query = "search terms"}, allowed = {"query", "project"}}, {label = "vc-atlas card=plan-11", params = {card = "plan-11", project = "/r"}, allowed = {"card", "project"}}, @@ -260,7 +260,7 @@ local cases_negative = { allowed = {"cmd", "repo"}, expect_reason_contains = "charset"}, {label = "path traversal in path", - params = {path = "/Users/op/../etc/passwd"}, + params = {path = "/Users/you/../etc/passwd"}, allowed = {"path"}, expect_reason_contains = "traversal"}, {label = "DoS length > 256 in query", diff --git a/vibecrafted-app/mux-agent/docs/dev/guidelines.md b/vibecrafted-app/mux-agent/docs/dev/guidelines.md index bb6f1c07..47995136 100644 --- a/vibecrafted-app/mux-agent/docs/dev/guidelines.md +++ b/vibecrafted-app/mux-agent/docs/dev/guidelines.md @@ -68,7 +68,7 @@ error messages or tests. ### 1.3. Building the binaries -All builds are driven through Cargo. From the project root (`/Users/maciejgad/.rmcp_servers/rmcp-mux` in the current +All builds are driven through Cargo. From the project root (`/Users/you/.rmcp_servers/rmcp-mux` in the current setup): #### 1.3.1. Debug build (fast, for development) diff --git a/vibecrafted-core/tests/test_capabilities.py b/vibecrafted-core/tests/test_capabilities.py index 8a06dd06..30b40408 100644 --- a/vibecrafted-core/tests/test_capabilities.py +++ b/vibecrafted-core/tests/test_capabilities.py @@ -73,12 +73,12 @@ def test_probe_tool_reports_product_broken(monkeypatch: pytest.MonkeyPatch) -> N monkeypatch.setattr( capabilities.shutil, "which", - lambda name: "/Users/op/.local/bin/loct", + lambda name: "/Users/you/.local/bin/loct", ) monkeypatch.setattr( capabilities, "vibecrafted_launcher_bin", - lambda: __import__("pathlib").Path("/Users/op/.local/bin"), + lambda: __import__("pathlib").Path("/Users/you/.local/bin"), ) runner = _runner_factory( {"--version": capabilities.ProbeResult(ok=False, returncode=127, stderr="boom")} @@ -98,12 +98,12 @@ def test_probe_tool_ok_with_capability_discovery( monkeypatch.setattr( capabilities.shutil, "which", - lambda name: "/Users/op/.local/bin/loct", + lambda name: "/Users/you/.local/bin/loct", ) monkeypatch.setattr( capabilities, "vibecrafted_launcher_bin", - lambda: __import__("pathlib").Path("/Users/op/.local/bin"), + lambda: __import__("pathlib").Path("/Users/you/.local/bin"), ) help_text = ( "Loctree operator CLI\n\n" @@ -140,12 +140,12 @@ def test_probe_tool_flags_noncanonical_install( monkeypatch.setattr( capabilities.shutil, "which", - lambda name: "/Users/op/.cargo/bin/loct", + lambda name: "/Users/you/.cargo/bin/loct", ) monkeypatch.setattr( capabilities, "vibecrafted_launcher_bin", - lambda: __import__("pathlib").Path("/Users/op/.local/bin"), + lambda: __import__("pathlib").Path("/Users/you/.local/bin"), ) runner = _runner_factory( { diff --git a/vibecrafted-server/control-core/tests/schema_fidelity.rs b/vibecrafted-server/control-core/tests/schema_fidelity.rs index f145fe94..ab3719d6 100644 --- a/vibecrafted-server/control-core/tests/schema_fidelity.rs +++ b/vibecrafted-server/control-core/tests/schema_fidelity.rs @@ -26,10 +26,10 @@ const GOLDEN_RUN_FINAL: &str = r#"{ "agent": "codex", "skill": "marbles", "mode": "implement", - "root": "/Users/maciejgad/hosted/VetCoders/vista", + "root": "/Users/you/hosted/VetCoders/vista", "operator_session": "vista-marb-000", - "latest_report": "/Users/maciejgad/.vibecrafted/artifacts/VetCoders/Vista/2026_0329/reports/report.md", - "latest_transcript": "/Users/maciejgad/.vibecrafted/artifacts/VetCoders/Vista/2026_0329/reports/report.transcript.log", + "latest_report": "/Users/you/.vibecrafted/artifacts/VetCoders/Vista/2026_0329/reports/report.md", + "latest_transcript": "/Users/you/.vibecrafted/artifacts/VetCoders/Vista/2026_0329/reports/report.transcript.log", "last_error": "", "updated_at": "2026-03-29T09:21:15.681613+00:00", "started_at": "2026-03-29T09:21:15.681613+00:00", @@ -53,10 +53,10 @@ const GOLDEN_RUN_ACTIVE: &str = r#"{ "agent": "claude", "skill": "justdo", "mode": "implement", - "root": "/Users/maciejgad/vc-workspace/VetCoders/vibecrafted", + "root": "/Users/you/vc-workspace/VetCoders/vibecrafted", "operator_session": "vibecrafted-just-194457-58333", - "latest_report": "/Users/maciejgad/.vibecrafted/artifacts/report.md", - "latest_transcript": "/Users/maciejgad/.vibecrafted/artifacts/report.transcript.log", + "latest_report": "/Users/you/.vibecrafted/artifacts/report.md", + "latest_transcript": "/Users/you/.vibecrafted/artifacts/report.transcript.log", "last_error": "", "updated_at": "2026-06-01T01:45:09.807447+00:00", "started_at": "2026-06-01T01:45:09.807447+00:00", @@ -79,10 +79,10 @@ const GOLDEN_META: &str = r#"{ "status": "launching", "agent": "claude", "mode": "implement", - "root": "/Users/maciejgad/vc-workspace/VetCoders/vibecrafted", + "root": "/Users/you/vc-workspace/VetCoders/vibecrafted", "input": "/tmp/prompt.md", - "report": "/Users/maciejgad/.vibecrafted/artifacts/report.md", - "transcript": "/Users/maciejgad/.vibecrafted/artifacts/report.transcript.log", + "report": "/Users/you/.vibecrafted/artifacts/report.md", + "transcript": "/Users/you/.vibecrafted/artifacts/report.transcript.log", "launcher": "/tmp/launch.sh", "prompt_id": "20260531_1944_demo", "run_id": "just-194457-58333", @@ -156,7 +156,7 @@ fn meta_normalizes_to_runstatus() { assert_eq!(fresh.state, "launching"); assert_eq!(fresh.source, "agent-meta"); assert_eq!(fresh.operator_session, "vibecrafted-just-194457-58333"); - assert_eq!(fresh.latest_report, "/Users/maciejgad/.vibecrafted/artifacts/report.md"); + assert_eq!(fresh.latest_report, "/Users/you/.vibecrafted/artifacts/report.md"); assert_eq!(fresh.exit_code, None); assert_eq!(fresh.launcher_pid, Some(59321)); assert!(!fresh.lock_present, "meta source never sets lock_present"); From e5007099cfc9205891d857a2ce252212cc2f2ed7 Mon Sep 17 00:00:00 2001 From: m-szymanska Date: Tue, 30 Jun 2026 07:53:03 -0700 Subject: [PATCH 005/119] [claude/interactive] chore(deprivatize): collapse personal names to Vetcoders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Collapse founder/agent names (Maciej, Monika, Szymanska, Klaudiusz, m-szymanska, M&K) to the collective `vetcoders`/`Vetcoders` per brand naming rules, across LICENSE/Cargo/pyproject authorship, credit headers, zellij/theme comments, docs prose, and CSS comments. Drop personal contact emails (void@div0.space, m.gad@amlt.ai, the1st@whoai.am) in favor of the brand contact hello@vetcoders.io. Left for operator decision (functional, not auto-fixed): shell-agent/Makefile SIGNING_IDENTITY carries the real Apple cert CN and must match the keychain identity; Apple Team ID MW223P3NPX kept (embedded in every signed binary). Machine names (sztudio/silver/div0) left in place — separate needs_decision class. Authored-By: claude session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:53:03-07:00 runtime: interactive --- LICENSE | 4 ++-- SECURITY.md | 2 +- docs/MEMEX.md | 4 ++-- scripts/installer/pyproject.toml | 3 +-- tools/scripts/chat/chat-cli.py | 4 ++-- tools/scripts/github/repo-transfer.py | 4 ++-- vibecrafted-app/mux-agent/LICENSE | 4 ++-- vibecrafted-app/mux-agent/src/runtime/heartbeat.rs | 4 ++-- 8 files changed, 14 insertions(+), 15 deletions(-) diff --git a/LICENSE b/LICENSE index b15a22dd..c0a3427e 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved. Parameters -Licensor: VetCoders (Maciej Gad & Monika Szymanska) +Licensor: Vetcoders Licensed Work: 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. Framework (formerly VetCoders Skills). The Licensed Work is (c) 2024-2026 VetCoders. Additional Use Grant: You may make production use of the Licensed Work, @@ -48,7 +48,7 @@ Change Date: 2030-03-24 Change License: Apache License, Version 2.0 For information about alternative licensing arrangements for the Licensed -Work, please contact void@div0.space. +Work, please contact hello@vetcoders.io. Notice diff --git a/SECURITY.md b/SECURITY.md index 50e70453..a58ac8a6 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,7 +14,7 @@ responsibly. **Do not open a public issue.** -Email: **void@div0.space** +Email: **hello@vetcoders.io** Include: diff --git a/docs/MEMEX.md b/docs/MEMEX.md index 72e49ad2..5221bdc6 100644 --- a/docs/MEMEX.md +++ b/docs/MEMEX.md @@ -150,8 +150,8 @@ precedence layers, and malformed-response paths. This is opt-in tooling. The agent perception layer works without memex — vibecrafted's v1.7 surface is unchanged for operators who don't configure it. When configured, memex offers cross-session -context that would otherwise require manual escalation ("Klaudiusz, -look at the silver session from last Thursday"). The trade-off: +context that would otherwise require manual escalation ("look at +the silver session from last Thursday"). The trade-off: weaker authority tier, opt-in cognitive load (token rotation, namespace hygiene), and dependence on a mesh service. Worth it for operators running multiple machines in the VetCoders mesh; safe to diff --git a/scripts/installer/pyproject.toml b/scripts/installer/pyproject.toml index 7dfd6264..0adcd8d4 100644 --- a/scripts/installer/pyproject.toml +++ b/scripts/installer/pyproject.toml @@ -6,8 +6,7 @@ readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } authors = [ - { name = "Maciej Gad", email = "void@div0.space" }, - { name = "Monika Szymańska", email = "hello@vetcoders.io" }, + { name = "Vetcoders", email = "hello@vetcoders.io" }, ] dependencies = [ "rich>=13.0", diff --git a/tools/scripts/chat/chat-cli.py b/tools/scripts/chat/chat-cli.py index 7fb53a19..81f00f50 100755 --- a/tools/scripts/chat/chat-cli.py +++ b/tools/scripts/chat/chat-cli.py @@ -40,7 +40,7 @@ CHATCLIENT_API_KEY Default API key CHATCLIENT_MODEL Default model -Created by M&K (c)2024-2026 VetCoders +Created by vetcoders (c)2024-2026 """ from __future__ import annotations @@ -275,7 +275,7 @@ def main() -> None: # OpenAI ./chat-cli.py --base-url https://api.openai.com/v1 --api-key $OPENAI_API_KEY --model gpt-4o -Created by M&K (c)2024-2026 VetCoders +Created by vetcoders (c)2024-2026 """, ) parser.add_argument( diff --git a/tools/scripts/github/repo-transfer.py b/tools/scripts/github/repo-transfer.py index e70bf00e..3c7c48d6 100755 --- a/tools/scripts/github/repo-transfer.py +++ b/tools/scripts/github/repo-transfer.py @@ -29,7 +29,7 @@ ./repo-transfer.py --transfer owner/repo --to NewOwner --yes ./repo-transfer.py --transfer owner/repo --to NewOwner --clean --yes -Created by M&K (c)2026 The VetCoders Team +Created by vetcoders (c)2026 """ from __future__ import annotations @@ -742,7 +742,7 @@ def main(): ./repo-transfer.py --transfer owner/repo --to NewOwner/new-name --yes ./repo-transfer.py --transfer owner/repo --to NewOwner --clean --yes -Created by M&K (c)2024-2026 VetCoders +Created by vetcoders (c)2024-2026 """, ) diff --git a/vibecrafted-app/mux-agent/LICENSE b/vibecrafted-app/mux-agent/LICENSE index 82686a41..d16fc7fa 100644 --- a/vibecrafted-app/mux-agent/LICENSE +++ b/vibecrafted-app/mux-agent/LICENSE @@ -3,7 +3,7 @@ License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved. Parameters -Licensor: VetCoders (Maciej Gad & Monika Szymanska) +Licensor: Vetcoders Licensed Work: Rust Multiplexer - The Connectivity Driver for Intentions Engine. The Licensed Work is (c) 2024-2026 VetCoders. @@ -49,7 +49,7 @@ Change Date: 2030-03-24 Change License: Apache License, Version 2.0 For information about alternative licensing arrangements for the Licensed -Work, please contact void@div0.space. +Work, please contact hello@vetcoders.io. Notice diff --git a/vibecrafted-app/mux-agent/src/runtime/heartbeat.rs b/vibecrafted-app/mux-agent/src/runtime/heartbeat.rs index 181c27c2..e11969ab 100644 --- a/vibecrafted-app/mux-agent/src/runtime/heartbeat.rs +++ b/vibecrafted-app/mux-agent/src/runtime/heartbeat.rs @@ -4,8 +4,8 @@ //! It periodically sends lightweight ping probes and tracks response times, //! triggering server restarts when the backend becomes unresponsive. //! -//! Created by M&K (c)2025 The LibraxisAI Team -//! Co-Authored-By: [Maciej](void@div0.space) & [Klaudiusz](the1st@whoai.am) +//! Created by vetcoders (c)2025 +//! Co-Authored-By: vetcoders use std::sync::Arc; use std::time::{Duration, Instant}; From 3040b9d879f014d84d194283377794869d2a77c9 Mon Sep 17 00:00:00 2001 From: m-szymanska Date: Tue, 30 Jun 2026 07:54:00 -0700 Subject: [PATCH 006/119] [claude/interactive] chore(deprivatize): genericize private infra deployment details MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Memex: scrub the private mesh-topology prose (kronika-dated topology, named hosts dragon/silver/sztudio/div0/mgbook16, "operator's tailnet") from docs/MEMEX.md, config/memex.toml.example, and memex_client.py; rename the private default host dragon.local -> memex.local (and the dragon-ns test namespace -> team-ns) self-consistently across client code and tests (test-memex tier still green). AI_notes: genericize the private notes path in vc-canvas product-wave-contract. memex/rust-memex kept as the named optional integration (functional, like rmcp/lancedb). tailscale/tailnet left intact — functional container networking, not private-setup prose. rmcp/lancedb untouched (allowlisted). Authored-By: claude session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:54:00-07:00 runtime: interactive --- config/memex.toml.example | 9 +++--- docs/MEMEX.md | 20 ++++++------- tests/memex_integration_test.sh | 2 +- vibecrafted-core/tests/test_memex_client.py | 28 +++++++++---------- .../vibecrafted_core/memex_client.py | 8 +++--- 5 files changed, 32 insertions(+), 35 deletions(-) diff --git a/config/memex.toml.example b/config/memex.toml.example index 9491ca43..bc72b558 100644 --- a/config/memex.toml.example +++ b/config/memex.toml.example @@ -12,10 +12,9 @@ # # See docs/MEMEX.md for the operator guide. -# Mesh-hosted memex endpoint. The kronika 2026-05-05 mesh topology -# places the primary memex on `dragon` and serves silver/sztudio/div0 -# clients over the operator's tailnet. Adjust to your deployment. -endpoint = "http://dragon.local:11211" +# Memex endpoint. Point this at your memex host. Adjust to your +# deployment; the trailing slash is stripped. +endpoint = "http://memex.local:11211" # Bearer token issued by the memex namespace operator. Treat as a # secret — rotate on suspected compromise. The MCP bridge @@ -27,7 +26,7 @@ token = "" # "vista-portal") or per-machine ("silver", "sztudio"). default_namespace = "local" -# HTTP request timeout. Memex lives on the tailnet so latency is low; +# HTTP request timeout. Memex lives on your private network so latency is low; # the default of 5s is generous. Lower it for tighter shells in CI. timeout_seconds = 5.0 diff --git a/docs/MEMEX.md b/docs/MEMEX.md index 5221bdc6..930a5823 100644 --- a/docs/MEMEX.md +++ b/docs/MEMEX.md @@ -8,10 +8,8 @@ [`rust-memex`](https://github.com/VetCoders/rust-memex) is a small, namespace-aware semantic memory substrate. It indexes prior agent sessions, kronika fragments, and operator notes into chunks that can -be retrieved by free-text query across machines. Per kronika -2026-05-05 mesh topology the primary memex runs on `dragon` and serves -the mesh clients (`silver`, `sztudio`, `div0`, plus the `mgbook16` -alias) over the operator's tailnet. +be retrieved by free-text query across machines. The memex host +serves its clients over your private network. Vibecrafted does **not** ship memex. Operators install the foundation separately (`vibecrafted doctor` reports its presence). Plan 09 wires @@ -60,17 +58,17 @@ cp config/memex.toml.example ~/.config/vetcoders/memex.toml Fields: -| Field | Default | Notes | -| ------------------- | --------------------------- | ------------------------------------------------------------- | -| `endpoint` | `http://dragon.local:11211` | Mesh-hosted memex; trailing slash is stripped. | -| `token` | `""` | Bearer token; required to enable the client. | -| `default_namespace` | `local` | Used when `search()` is called without an explicit namespace. | -| `timeout_seconds` | `5.0` | HTTP timeout. Lower for tight CI shells. | +| Field | Default | Notes | +| ------------------- | -------------------------- | ------------------------------------------------------------- | +| `endpoint` | `http://memex.local:11211` | Mesh-hosted memex; trailing slash is stripped. | +| `token` | `""` | Bearer token; required to enable the client. | +| `default_namespace` | `local` | Used when `search()` is called without an explicit namespace. | +| `timeout_seconds` | `5.0` | HTTP timeout. Lower for tight CI shells. | ### Option B — environment variables (ephemeral / CI) ```bash -export MEMEX_ENDPOINT=http://dragon.local:11211 +export MEMEX_ENDPOINT=http://memex.local:11211 export MEMEX_TOKEN= export MEMEX_NAMESPACE=vibecrafted export MEMEX_TIMEOUT_SECONDS=3 diff --git a/tests/memex_integration_test.sh b/tests/memex_integration_test.sh index 5872bef4..f3f7eac2 100755 --- a/tests/memex_integration_test.sh +++ b/tests/memex_integration_test.sh @@ -117,7 +117,7 @@ def fake_mcp(query, namespace, limit): } cfg = mc.MemexConfig( - endpoint="http://dragon.local:11211", + endpoint="http://memex.local:11211", token="test-token", default_namespace="local", timeout_seconds=2.0, diff --git a/vibecrafted-core/tests/test_memex_client.py b/vibecrafted-core/tests/test_memex_client.py index 293ae16d..52dbd0d7 100644 --- a/vibecrafted-core/tests/test_memex_client.py +++ b/vibecrafted-core/tests/test_memex_client.py @@ -81,9 +81,9 @@ def test_load_config_invalid_timeout_falls_back( def test_load_config_toml_wins_over_env(tmp_path: Path) -> None: cfg_path = tmp_path / "memex.toml" cfg_path.write_text( - 'endpoint = "http://dragon.local:11211"\n' + 'endpoint = "http://memex.local:11211"\n' 'token = "tok-from-toml"\n' - 'default_namespace = "dragon-ns"\n' + 'default_namespace = "team-ns"\n' "timeout_seconds = 7.5\n", encoding="utf-8", ) @@ -95,9 +95,9 @@ def test_load_config_toml_wins_over_env(tmp_path: Path) -> None: } cfg = mc.load_config(config_path=cfg_path, environ=env) # Config-file source: env should NOT override the explicit values. - assert cfg.endpoint == "http://dragon.local:11211" + assert cfg.endpoint == "http://memex.local:11211" assert cfg.token == "tok-from-toml" - assert cfg.default_namespace == "dragon-ns" + assert cfg.default_namespace == "team-ns" assert cfg.timeout_seconds == 7.5 assert cfg.enabled is True assert "config:" in cfg.source @@ -106,7 +106,7 @@ def test_load_config_toml_wins_over_env(tmp_path: Path) -> None: def test_load_config_toml_without_token_can_borrow_env(tmp_path: Path) -> None: cfg_path = tmp_path / "memex.toml" cfg_path.write_text( - 'endpoint = "http://dragon.local:11211"\ndefault_namespace = "ops"\n', + 'endpoint = "http://memex.local:11211"\ndefault_namespace = "ops"\n', encoding="utf-8", ) env = {"MEMEX_TOKEN": "tok-borrowed"} @@ -119,11 +119,11 @@ def test_load_config_toml_without_token_can_borrow_env(tmp_path: Path) -> None: def test_load_config_strips_trailing_slash(tmp_path: Path) -> None: cfg_path = tmp_path / "memex.toml" cfg_path.write_text( - 'endpoint = "http://dragon.local:11211/"\ntoken = "t"\n', + 'endpoint = "http://memex.local:11211/"\ntoken = "t"\n', encoding="utf-8", ) cfg = mc.load_config(config_path=cfg_path, environ={}) - assert cfg.endpoint == "http://dragon.local:11211" + assert cfg.endpoint == "http://memex.local:11211" # ----------------------------------------------------------- chunk parsing @@ -240,23 +240,23 @@ def fake_http_search( monkeypatch.setattr(mc, "_http_search", fake_http_search) cfg = mc.MemexConfig( - endpoint="http://dragon.local:11211", + endpoint="http://memex.local:11211", token="tok", default_namespace="local", timeout_seconds=3.0, enabled=True, ) - out = mc.search("vc-init", namespace="dragon-ns", limit=5, config=cfg) + out = mc.search("vc-init", namespace="team-ns", limit=5, config=cfg) assert len(out) == 2 assert out[0].text == "mesh topology silver" assert out[1].text == "fallback content field" assert out[1].score == pytest.approx(0.5) assert all(c.authority == mc.MEMEX_AUTHORITY_LABEL for c in out) # Request invariants reached the transport helper unchanged. - assert captured["endpoint"] == "http://dragon.local:11211" + assert captured["endpoint"] == "http://memex.local:11211" assert captured["timeout"] == 3.0 assert captured["query"] == "vc-init" - assert captured["namespace"] == "dragon-ns" + assert captured["namespace"] == "team-ns" assert captured["limit"] == 5 @@ -272,7 +272,7 @@ def fake_http_search( monkeypatch.setattr(mc, "_http_search", fake_http_search) cfg = mc.MemexConfig( - endpoint="http://dragon.local:11211", + endpoint="http://memex.local:11211", token="t", default_namespace="local", timeout_seconds=1.0, @@ -294,7 +294,7 @@ def fake_http_search( monkeypatch.setattr(mc, "_http_search", fake_http_search) cfg = mc.MemexConfig( - endpoint="http://dragon.local:11211", + endpoint="http://memex.local:11211", token="t", default_namespace="local", timeout_seconds=1.0, @@ -316,7 +316,7 @@ def fake_http_search( monkeypatch.setattr(mc, "_http_search", fake_http_search) cfg = mc.MemexConfig( - endpoint="http://dragon.local:11211", + endpoint="http://memex.local:11211", token="t", default_namespace="local", timeout_seconds=1.0, diff --git a/vibecrafted-core/vibecrafted_core/memex_client.py b/vibecrafted-core/vibecrafted_core/memex_client.py index f4fd9b8f..6cabffda 100644 --- a/vibecrafted-core/vibecrafted_core/memex_client.py +++ b/vibecrafted-core/vibecrafted_core/memex_client.py @@ -4,8 +4,8 @@ ``/vc-init`` Sense 1 (intentions) perception layer as a fallthrough. When local AICX search returns sparse results for the current scope (< 5 chunks by default), the agent SHOULD call :func:`search` to pull -cross-session semantic context from the operator's mesh-hosted memex -endpoint (dragon-side per kronika 2026-05-05 mesh topology). +cross-session semantic context from the configured memex +endpoint. Design rules: @@ -75,8 +75,8 @@ #: Operator config file (precedence over env vars). DEFAULT_CONFIG_PATH: Path = Path.home() / ".config" / "vetcoders" / "memex.toml" -#: Default memex endpoint (dragon-side mesh host, kronika 2026-05-05). -DEFAULT_ENDPOINT: str = "http://dragon.local:11211" +#: Default memex endpoint. Override via config or env. +DEFAULT_ENDPOINT: str = "http://memex.local:11211" #: Default HTTP timeout in seconds. DEFAULT_TIMEOUT_SECONDS: float = 5.0 From 732411a1b786d63567ab65da8b390aff39b7ac5b Mon Sep 17 00:00:00 2001 From: m-szymanska Date: Tue, 30 Jun 2026 07:56:33 -0700 Subject: [PATCH 007/119] [claude/interactive] chore(deprivatize): drop camelCase brand spellings Apply brand naming rule: VetCoders->Vetcoders, ScreenScribe->Screenscribe, CodeScribe->Codescribe across docs, skills, code, configs, tests. Org/repo/namespace/path/URL contexts lowercased. Globally consistent so test-coupled pairs stay in sync. Verified: vibecrafted-core pytest 135, iterm2/aicx shell smoke 17/16, control-core schema_fidelity 7 all green. Authored-By: claude session_id: 7292992a-7594-48ed-b3b4-f736cccc9668 time: 2026-06-30T07:54:58-07:00 runtime: interactive --- .github/ISSUE_TEMPLATE/config.yml | 2 +- Dockerfile | 2 +- LICENSE | 10 +++---- config/aicx-sync.toml.example | 2 +- config/memex.toml.example | 2 +- docs/AICX-SYNC.md | 10 +++---- docs/FAQ.md | 4 +-- docs/MARKETPLACE_LISTING.md | 4 +-- docs/MEMEX.md | 6 ++-- docs/RUNTIME_CONTAINER.md | 4 +-- docs/SUBMISSION_FORMS.md | 28 +++++++++---------- docs/runtime/MANIFESTO_EN.md | 2 +- docs/runtime/MANIFESTO_PL.md | 2 +- install.ps1 | 2 +- plugin.json | 2 +- scripts/aicx-sync.sh | 2 +- scripts/bootstrap-modal.sh | 6 ++-- scripts/install-hammerspoon.sh | 2 +- scripts/installer/README.md | 2 +- scripts/installer_brand.py | 2 +- scripts/lib/living-tree-commit.sh | 2 +- .../hooks/activators/.pre-commit-config.yaml | 2 +- templates/hooks/hooks/post-commit | 2 +- templates/hooks/hooks/pre-merge-commit | 2 +- templates/hooks/hooks/pre-push | 2 +- templates/hooks/install.sh | 2 +- templates/hooks/scripts/redact-output.mjs | 2 +- tests/aicx_sync_smoke.sh | 4 +-- tools/README.md | 8 +++--- tools/bin/README.md | 4 +-- tools/scripts/chat/README.md | 2 +- tools/scripts/github/README.md | 4 +-- tools/scripts/github/repo-transfer.py | 12 ++++---- vibecrafted-app/Cargo.toml | 2 +- vibecrafted-app/mux-agent/LICENSE | 8 +++--- vibecrafted-core/tests/test_aicx_sync.py | 4 +-- .../vibecrafted_core/memex_client.py | 2 +- .../control-core/tests/schema_fidelity.rs | 10 +++---- vibecrafted-vm/.env.example | 2 +- vibecrafted-vm/vendor-src.sh | 2 +- vibecrafted-vm/wizard/vc-onboard.py | 2 +- 41 files changed, 88 insertions(+), 88 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b79306c1..bdd3ea32 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -7,5 +7,5 @@ contact_links: url: https://vibecrafted.io/en/faq/ about: Read the common install, workflow, and architecture answers. - name: Security Policy - url: https://github.com/VetCoders/vibecrafted/blob/main/SECURITY.md + url: https://github.com/vetcoders/vibecrafted/blob/main/SECURITY.md about: Report vulnerabilities privately instead of opening a public issue. diff --git a/Dockerfile b/Dockerfile index a22f3f13..05b111e9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by VetCoders (c)2024-2026 LibraxisAI +# 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by Vetcoders (c)2024-2026 LibraxisAI # # v1.x Linux base — Debian Bookworm via the official node:22 slim image. # We start from node:22-bookworm-slim (not bare debian) because every agent diff --git a/LICENSE b/LICENSE index c0a3427e..86ed0777 100644 --- a/LICENSE +++ b/LICENSE @@ -4,23 +4,23 @@ License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved. Parameters Licensor: Vetcoders -Licensed Work: 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. Framework (formerly VetCoders Skills). - The Licensed Work is (c) 2024-2026 VetCoders. +Licensed Work: 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. Framework (formerly Vetcoders Skills). + The Licensed Work is (c) 2024-2026 Vetcoders. Additional Use Grant: You may make production use of the Licensed Work, provided Your use does not include offering the Licensed Work to third parties on a hosted or embedded - basis in order to compete with VetCoders' paid + basis in order to compete with Vetcoders' paid version(s) of the Licensed Work. For purposes of this license: A "competitive offering" is a Product that is offered to third parties on a paid basis, including through paid support arrangements, that significantly overlaps - with the capabilities of VetCoders' paid version(s) of + with the capabilities of Vetcoders' paid version(s) of the Licensed Work. If Your Product is not a competitive offering when You first make it generally available, it will not become a competitive offering later due to - VetCoders releasing a new version of the Licensed Work + Vetcoders releasing a new version of the Licensed Work with additional capabilities. In addition, Products that are not provided on a paid basis are not competitive. diff --git a/config/aicx-sync.toml.example b/config/aicx-sync.toml.example index 239fd0cd..2d6d79a4 100644 --- a/config/aicx-sync.toml.example +++ b/config/aicx-sync.toml.example @@ -33,7 +33,7 @@ local_store = "~/.aicx/store" # ~/.aicx/store/ on both sides. Leave commented to sync the # entire corpus. # -# namespace = "VetCoders/vibecrafted" +# namespace = "vetcoders/vibecrafted" # Default safety posture: always dry-run unless the operator explicitly # passes `apply` as the first positional argument. The bash wrapper does diff --git a/config/memex.toml.example b/config/memex.toml.example index bc72b558..a9d9a95b 100644 --- a/config/memex.toml.example +++ b/config/memex.toml.example @@ -30,4 +30,4 @@ default_namespace = "local" # the default of 5s is generous. Lower it for tighter shells in CI. timeout_seconds = 5.0 -# 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by VetCoders (c)2024-2026 LibraxisAI +# 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by Vetcoders (c)2024-2026 LibraxisAI diff --git a/docs/AICX-SYNC.md b/docs/AICX-SYNC.md index e576273b..98300fa0 100644 --- a/docs/AICX-SYNC.md +++ b/docs/AICX-SYNC.md @@ -2,7 +2,7 @@ _Plan 08 (META_22) — bidirectional sync substrate with authority-tier conflict resolution. Ships in v1.8.0._ -The AICX corpus is the operator's cross-session memory layer for AI agents — every Codex / Claude / Gemini session writes its outcome into `~/.aicx/store////conversations//*.md`. On a single machine that is enough. On the **VetCoders mesh** (dragon ↔ sztudio ↔ silver ↔ div0, per kronika 2026-05-05) the same corpus must converge across hosts so an agent dispatched on `sztudio` sees what `dragon` learned thirty minutes earlier. +The AICX corpus is the operator's cross-session memory layer for AI agents — every Codex / Claude / Gemini session writes its outcome into `~/.aicx/store////conversations//*.md`. On a single machine that is enough. On the **Vetcoders mesh** (dragon ↔ sztudio ↔ silver ↔ div0, per kronika 2026-05-05) the same corpus must converge across hosts so an agent dispatched on `sztudio` sees what `dragon` learned thirty minutes earlier. This document covers the **v2 bidirectional engine** (`vibecrafted_core.aicx_sync`) and its operator CLI (`scripts/aicx-sync.sh`). The transport layer (rsync, staging, nightly launchd) is owned by the operator's existing `~/.scripts/sync-tool.py` (kronika 2026-05-05); this engine plugs in on top of that. @@ -44,7 +44,7 @@ Equal tiers on both sides → tie → operator decides → logged. ### Dry-run first — always ```bash -scripts/aicx-sync.sh dry-run --remote sztudio --namespace VetCoders/vibecrafted +scripts/aicx-sync.sh dry-run --remote sztudio --namespace vetcoders/vibecrafted ``` Prints a JSON `SyncResult` describing adds, conflicts, ties, and corrupted chunks. **No filesystem mutation.** Operator reviews the preview before pushing further. @@ -52,7 +52,7 @@ Prints a JSON `SyncResult` describing adds, conflicts, ties, and corrupted chunk ### Apply after review ```bash -scripts/aicx-sync.sh apply --remote sztudio --namespace VetCoders/vibecrafted +scripts/aicx-sync.sh apply --remote sztudio --namespace vetcoders/vibecrafted ``` Executes the same plan. Adds copy in both directions; conflicts apply the authority-tier winner; ties are surfaced and the run exits non-zero so the operator records a decision before re-running. @@ -79,7 +79,7 @@ Fields: | ----------------- | --------------- | ----------------------------------------------------------------------------- | | `local_store` | `~/.aicx/store` | Override only if AICX corpus lives outside XDG default. | | `remote_host` | (none) | One of `dragon`, `sztudio`, `silver`, `div0`, `mgbook16`. | -| `namespace` | (all) | Scope to `/` (e.g. `VetCoders/vibecrafted`). | +| `namespace` | (all) | Scope to `/` (e.g. `vetcoders/vibecrafted`). | | `dry_run_default` | `true` | Informational; the wrapper always honours dry-run unless `apply` is explicit. | | `prompt_on_tie` | `true` | When `false`, ties are silently logged as unresolved. | @@ -178,4 +178,4 @@ The operator currently runs `~/.scripts/sync-tool.py` as a nightly launchd job ( --- _Plan 08 (META_22) — Wave 3 / agent orchestration cut._ -_Vibecrafted with AI Agents by VetCoders (c)2024-2026 LibraxisAI._ +_Vibecrafted with AI Agents by Vetcoders (c)2024-2026 LibraxisAI._ diff --git a/docs/FAQ.md b/docs/FAQ.md index 78ea7adf..cded6197 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -20,7 +20,7 @@ For the long-form answer bank, see [FAQ-ANSWERED.md](FAQ-ANSWERED.md). - **What does `make doctor` check?** The doctor verifies the central store, helper availability, symlink health, required foundations (`loctree-mcp` and - `aicx-mcp`), evidence tools such as `prview` and ScreenScribe, and shell quietness. + `aicx-mcp`), evidence tools such as `prview` and Screenscribe, and shell quietness. - **Which install path should I use in CI?** Use `make install-auto` for the direct non-interactive path, or @@ -83,4 +83,4 @@ For the long-form answer bank, see [FAQ-ANSWERED.md](FAQ-ANSWERED.md). --- -𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. by VetCoders | https://vibecrafted.io/ +𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. by Vetcoders | https://vibecrafted.io/ diff --git a/docs/MARKETPLACE_LISTING.md b/docs/MARKETPLACE_LISTING.md index f15f7449..4e29b595 100644 --- a/docs/MARKETPLACE_LISTING.md +++ b/docs/MARKETPLACE_LISTING.md @@ -51,7 +51,7 @@ Enterprise: info@vibecrafted.io ## Part of -VetCoders 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. Suite — structured AI-guided engineering, +Vetcoders 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. Suite — structured AI-guided engineering, convergence, packaging, and release. ## Registry Metadata @@ -59,7 +59,7 @@ convergence, packaging, and release. - description: Release engine for AI-built software. Structural mapping, convergence loops, install truth, and launch-ready packaging for AI-generated repos. - keywords: ai-agent-engineering, release-engineering, developer-tools, codex, claude, gemini, workflow, multi-agent, ai-native - homepage: https://vibecrafted.io/ -- repository: https://github.com/VetCoders/vibecrafted +- repository: https://github.com/vetcoders/vibecrafted - documentation: https://vibecrafted.io/en/quickstart/ - faq: https://vibecrafted.io/en/faq/ - license: Business Source License 1.1 with Additional Use Grant for non-competitive small-team production use diff --git a/docs/MEMEX.md b/docs/MEMEX.md index 930a5823..bb8cd381 100644 --- a/docs/MEMEX.md +++ b/docs/MEMEX.md @@ -5,7 +5,7 @@ ## What memex is -[`rust-memex`](https://github.com/VetCoders/rust-memex) is a small, +[`rust-memex`](https://github.com/vetcoders/rust-memex) is a small, namespace-aware semantic memory substrate. It indexes prior agent sessions, kronika fragments, and operator notes into chunks that can be retrieved by free-text query across machines. The memex host @@ -152,9 +152,9 @@ context that would otherwise require manual escalation ("look at the silver session from last Thursday"). The trade-off: weaker authority tier, opt-in cognitive load (token rotation, namespace hygiene), and dependence on a mesh service. Worth it for -operators running multiple machines in the VetCoders mesh; safe to +operators running multiple machines in the Vetcoders mesh; safe to ignore for everyone else. --- -_𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by VetCoders (c)2024-2026 LibraxisAI_ +_𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by Vetcoders (c)2024-2026 LibraxisAI_ diff --git a/docs/RUNTIME_CONTAINER.md b/docs/RUNTIME_CONTAINER.md index 0d224985..c72eabda 100644 --- a/docs/RUNTIME_CONTAINER.md +++ b/docs/RUNTIME_CONTAINER.md @@ -40,8 +40,8 @@ config, bring-up). It is **not** Modal.com integration. Hosting target is - `loctree` snapshots reveal repo structure and intent — same constraint - agent CLIs (`claude`, `codex`, `gemini`, `junie`, `grok`, plus `agy` via manual install) carry operator auth tokens -- vibecrafted is **VetCoders'** runtime; the runtime container belongs in - VetCoders' infrastructure boundary +- vibecrafted is **Vetcoders'** runtime; the runtime container belongs in + Vetcoders' infrastructure boundary If you need a serverless variant later, that's a separate skill — this one is **self-hosted by design**. diff --git a/docs/SUBMISSION_FORMS.md b/docs/SUBMISSION_FORMS.md index a4761dc0..c41ff80d 100644 --- a/docs/SUBMISSION_FORMS.md +++ b/docs/SUBMISSION_FORMS.md @@ -11,7 +11,7 @@ Official submit/help surfaces below were re-checked on 2026-04-11 before this pa - Secondary tagline: Ship AI-built software without the vibe hangover. - Core promise: Take the repo your AI agents already produced and force it through structural mapping, convergence loops, install truth, packaging, and launch-readiness checks until it is fit to ship. - Website: https://vibecrafted.io/ -- Repository: https://github.com/VetCoders/vibecrafted +- Repository: https://github.com/vetcoders/vibecrafted - Docs: https://vibecrafted.io/en/quickstart/ - FAQ: https://vibecrafted.io/en/faq/ - Contact: info@vibecrafted.io @@ -129,7 +129,7 @@ Prepare these fields once, then reuse them across directories: https://vibecrafted.io/ - Product URL - https://github.com/VetCoders/vibecrafted + https://github.com/vetcoders/vibecrafted - Primary CTA Guided install @@ -289,19 +289,19 @@ Use the default packet above, then bias each marketplace form this way: Use these as the default copy/paste answers when a form asks for the common launch fields: -| Field | Paste-ready answer | +| Field | Paste-ready answer | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | -| Product name | `𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍.` | -| Tagline | `Release engine for AI-built software.` | -| Secondary line | `Ship AI-built software without the vibe hangover.` | -| Website | `https://vibecrafted.io/` | -| Repository | `https://github.com/VetCoders/vibecrafted` | -| Docs | `https://vibecrafted.io/en/quickstart/` | -| Category | `Developer Tools`, `AI Agents`, `Release Engineering` | -| Pricing | `Free for personal use and startups. Enterprise licensing available.` | -| Primary CTA | `curl -fsSL https://vibecrafted.io/install.sh | bash -s -- --gui` | -| Backup CTA | `curl -fsSL https://vibecrafted.io/install.sh | bash` | -| 160-char summary | `Vibecrafted hardens AI-generated repos through structural mapping, convergence loops, install audits, and launch-ready packaging.` | +| Product name | `𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍.` | +| Tagline | `Release engine for AI-built software.` | +| Secondary line | `Ship AI-built software without the vibe hangover.` | +| Website | `https://vibecrafted.io/` | +| Repository | `https://github.com/vetcoders/vibecrafted` | +| Docs | `https://vibecrafted.io/en/quickstart/` | +| Category | `Developer Tools`, `AI Agents`, `Release Engineering` | +| Pricing | `Free for personal use and startups. Enterprise licensing available.` | +| Primary CTA | `curl -fsSL https://vibecrafted.io/install.sh | bash -s -- --gui` | +| Backup CTA | `curl -fsSL https://vibecrafted.io/install.sh | bash` | +| 160-char summary | `Vibecrafted hardens AI-generated repos through structural mapping, convergence loops, install audits, and launch-ready packaging.` | | 300-char summary | `Vibecrafted is the release engine for AI-built software. It takes the repo your agents already produced and drives it through perception, verification, convergence loops, install truth, and launch-readiness work until the product is fit to ship.` | ## Form-specific fill hints diff --git a/docs/runtime/MANIFESTO_EN.md b/docs/runtime/MANIFESTO_EN.md index 46c7ac8a..b0f1260f 100644 --- a/docs/runtime/MANIFESTO_EN.md +++ b/docs/runtime/MANIFESTO_EN.md @@ -14,7 +14,7 @@ description: > ## Definition -**Vibecrafted.** is a convergence framework for AI-assisted software development, engineered by VetCoders. +**Vibecrafted.** is a convergence framework for AI-assisted software development, engineered by Vetcoders. It does not merely write code for you. It provides a **system** in which code produced by AI agents is systematically driven to production quality — through alternating steps of **perception** and **action**, structural analytical tooling, and multi-agent orchestration. ## Philosophical Core diff --git a/docs/runtime/MANIFESTO_PL.md b/docs/runtime/MANIFESTO_PL.md index a2361fed..72a35fcc 100644 --- a/docs/runtime/MANIFESTO_PL.md +++ b/docs/runtime/MANIFESTO_PL.md @@ -10,7 +10,7 @@ description: > ## Definicja -**Vibecrafted.** to framework konwergencji dla AI-assisted software development, zbudowany przez VetCoders. +**Vibecrafted.** to framework konwergencji dla AI-assisted software development, zbudowany przez Vetcoders. Nie służy jedynie do generowania kodu. To **system**, w którym kod pisany przez agentów AI jest systematycznie doprowadzany do jakości produkcyjnej — poprzez naprzemienne kroki **percepcji** i **akcji**, strukturalne narzędzia analityczne i multi-agentową orkiestrację. ## Rdzeń Filozoficzny diff --git a/install.ps1 b/install.ps1 index f6bec0b2..a4679167 100644 --- a/install.ps1 +++ b/install.ps1 @@ -25,7 +25,7 @@ PS> .\install.ps1 .NOTES - Branding: 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by VetCoders (c)2024-2026 LibraxisAI + Branding: 𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents by Vetcoders (c)2024-2026 LibraxisAI Roadmap: - v1.x: WSL-required (this script). diff --git a/plugin.json b/plugin.json index 7b5f6a62..491ffe38 100644 --- a/plugin.json +++ b/plugin.json @@ -3,7 +3,7 @@ "version": "2.0.0", "description": "Vibecrafted release engine and workflows.", "author": { - "name": "VetCoders" + "name": "Vetcoders" }, "license": "Apache-2.0" } diff --git a/scripts/aicx-sync.sh b/scripts/aicx-sync.sh index 3e9e94d5..072a3281 100755 --- a/scripts/aicx-sync.sh +++ b/scripts/aicx-sync.sh @@ -155,7 +155,7 @@ else REMOTE_STAGING="$DEFAULT_REMOTE_STAGING_BASE/_no_remote_/staging" fi -# Narrow to namespace subdir when specified (e.g. ~/.aicx/store/VetCoders/vibecrafted). +# Narrow to namespace subdir when specified (e.g. ~/.aicx/store/vetcoders/vibecrafted). if [[ -n "$NAMESPACE" ]]; then LOCAL_STORE="$LOCAL_STORE/$NAMESPACE" REMOTE_STAGING="$REMOTE_STAGING/$NAMESPACE" diff --git a/scripts/bootstrap-modal.sh b/scripts/bootstrap-modal.sh index 199141cb..eea618ba 100755 --- a/scripts/bootstrap-modal.sh +++ b/scripts/bootstrap-modal.sh @@ -32,7 +32,7 @@ # Env overrides (in addition to flags): # VIBECRAFTED_BRANCH (default: main) # VIBECRAFTED_WORKDIR (default: $HOME/vibecrafted-runtime) -# VIBECRAFTED_REPO_URL (default: https://github.com/VetCoders/vibecrafted.git) +# VIBECRAFTED_REPO_URL (default: https://github.com/vetcoders/vibecrafted.git) # TS_AUTHKEY (no default — prompts if missing and TTY) # TS_HOSTNAME (default: runtime-$(hostname -s)) # VIBECRAFTED_BOOTSTRAP_YES (default: 0 — set 1 to skip prompts) @@ -53,7 +53,7 @@ hdr() { printf '\n\033[1m\033[38;5;173m⚒ %s\033[0m\n' "$*"; printf ' ─ # --------------------------------------------------------------------------- VIBECRAFTED_BRANCH="${VIBECRAFTED_BRANCH:-main}" VIBECRAFTED_WORKDIR="${VIBECRAFTED_WORKDIR:-$HOME/vibecrafted-runtime}" -VIBECRAFTED_REPO_URL="${VIBECRAFTED_REPO_URL:-https://github.com/VetCoders/vibecrafted.git}" +VIBECRAFTED_REPO_URL="${VIBECRAFTED_REPO_URL:-https://github.com/vetcoders/vibecrafted.git}" TS_AUTHKEY="${TS_AUTHKEY:-}" TS_HOSTNAME_DEFAULT="runtime-$(hostname -s 2>/dev/null || echo unknown)" TS_HOSTNAME="${TS_HOSTNAME:-$TS_HOSTNAME_DEFAULT}" @@ -76,7 +76,7 @@ bootstrap-modal.sh — Vibecrafted runtime container installer Options: --branch BRANCH git branch / tag to check out (default: main) --workdir DIR clone target (default: $HOME/vibecrafted-runtime) - --repo-url URL git remote (default: https://github.com/VetCoders/vibecrafted.git) + --repo-url URL git remote (default: https://github.com/vetcoders/vibecrafted.git) --ts-authkey KEY Tailscale auth key (prompts if missing and TTY) --ts-hostname NAME Tailscale hostname (default: runtime-$(hostname -s)) --yes / -y skip all prompts (TS_AUTHKEY must be set via env/flag) diff --git a/scripts/install-hammerspoon.sh b/scripts/install-hammerspoon.sh index d9452cb2..fb5575cf 100755 --- a/scripts/install-hammerspoon.sh +++ b/scripts/install-hammerspoon.sh @@ -33,7 +33,7 @@ usage() { cat <<'USAGE' install-hammerspoon.sh — Plan 11 (META_22) Hammerspoon config installer -Copies the VetCoders Hammerspoon template (config/hammerspoon/init.lua) +Copies the Vetcoders Hammerspoon template (config/hammerspoon/init.lua) to ~/.hammerspoon/init.lua so the vc-* URL handlers (vc-ping, vc-loct, vc-aicx, vc-open-file, vc-atlas, vc-prism, vc-marbles, vc-followup) are registered with macOS Launch Services. diff --git a/scripts/installer/README.md b/scripts/installer/README.md index 36b719d3..b472ca3d 100644 --- a/scripts/installer/README.md +++ b/scripts/installer/README.md @@ -10,7 +10,7 @@ directly from the repo-owned Python script. ## Why vendored? The default source lives in the -[`vetcoders-tools`](https://github.com/VetCoders/vetcoders-tools) repo +[`vetcoders-tools`](https://github.com/vetcoders/vetcoders-tools) repo (`installer/` sub-tree) and targets universal use (any repo, Python/Rust/anything). This directory is a vendored copy kept in sync — Vibecrafted must remain self-contained so that a fresh clone + diff --git a/scripts/installer_brand.py b/scripts/installer_brand.py index d8bd0d0f..021112e9 100644 --- a/scripts/installer_brand.py +++ b/scripts/installer_brand.py @@ -12,7 +12,7 @@ ) TAGLINE = "Release engine for AI-developed software." PRODUCT_LINE = "Install locally. Work from evidence." -FOOTER_BRANDING = "𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents (c)2024-2026 VetCoders" +FOOTER_BRANDING = "𝚅𝚒𝚋𝚎𝚌𝚛𝚊𝚏𝚝𝚎𝚍. with AI Agents (c)2024-2026 Vetcoders" def version_line(version: str) -> str: diff --git a/scripts/lib/living-tree-commit.sh b/scripts/lib/living-tree-commit.sh index 1bf0a633..240b0ec4 100755 --- a/scripts/lib/living-tree-commit.sh +++ b/scripts/lib/living-tree-commit.sh @@ -76,7 +76,7 @@ usage: living-tree-commit.sh "" -- [...] living-tree-commit.sh --message-file -- [...] -Race-protected commit helper for VetCoders Living Tree workflow. +Race-protected commit helper for Vetcoders Living Tree workflow. Captures pre-flight HEAD, stages only the named files, commits with the given message, then verifies no concurrent agent commit interleaved between diff --git a/templates/hooks/activators/.pre-commit-config.yaml b/templates/hooks/activators/.pre-commit-config.yaml index c74eef87..af248d55 100644 --- a/templates/hooks/activators/.pre-commit-config.yaml +++ b/templates/hooks/activators/.pre-commit-config.yaml @@ -14,7 +14,7 @@ # pre-commit install --hook-type post-commit # pre-commit install --hook-type commit-msg # -# Vibecrafted with AI Agents by VetCoders (c)2024-2026 LibraxisAI +# Vibecrafted with AI Agents by Vetcoders (c)2024-2026 LibraxisAI default_install_hook_types: - pre-commit diff --git a/templates/hooks/hooks/post-commit b/templates/hooks/hooks/post-commit index 16d51a70..feb9eaa7 100755 --- a/templates/hooks/hooks/post-commit +++ b/templates/hooks/hooks/post-commit @@ -5,7 +5,7 @@ # come from in-session scratch files (RAPORT_*, _SESSION_*, _GUIDE_*, etc.) # that should live outside git (operator memory, separate archive, ...). # -# Vibecrafted with AI Agents by VetCoders (c)2024-2026 LibraxisAI +# Vibecrafted with AI Agents by Vetcoders (c)2024-2026 LibraxisAI set -euo pipefail diff --git a/templates/hooks/hooks/pre-merge-commit b/templates/hooks/hooks/pre-merge-commit index da7d93e6..3bc2651e 100755 --- a/templates/hooks/hooks/pre-merge-commit +++ b/templates/hooks/hooks/pre-merge-commit @@ -5,7 +5,7 @@ # merging from an agent branch into a non-agent branch. Extensible via # HUSKY_PREMERGE_CLEAN_PATHS. # -# Vibecrafted with AI Agents by VetCoders (c)2024-2026 LibraxisAI +# Vibecrafted with AI Agents by Vetcoders (c)2024-2026 LibraxisAI set -euo pipefail diff --git a/templates/hooks/hooks/pre-push b/templates/hooks/hooks/pre-push index 5592d6d2..3a097ae5 100755 --- a/templates/hooks/hooks/pre-push +++ b/templates/hooks/hooks/pre-push @@ -5,7 +5,7 @@ # Reads from stdin to # compute the pushed-diff range for secret scanning. # -# Vibecrafted with AI Agents by VetCoders (c)2024-2026 LibraxisAI +# Vibecrafted with AI Agents by Vetcoders (c)2024-2026 LibraxisAI set -euo pipefail HUSKY_HOOK_NAME="pre-push" diff --git a/templates/hooks/install.sh b/templates/hooks/install.sh index 5e3c0053..2b2fc4a2 100755 --- a/templates/hooks/install.sh +++ b/templates/hooks/install.sh @@ -24,7 +24,7 @@ # --no-activate Install template files but skip activator config write # --dry-run Show what would happen without writing anything # -# Vibecrafted with AI Agents by VetCoders (c)2024-2026 LibraxisAI +# Vibecrafted with AI Agents by Vetcoders (c)2024-2026 LibraxisAI set -euo pipefail diff --git a/templates/hooks/scripts/redact-output.mjs b/templates/hooks/scripts/redact-output.mjs index 1884744b..315ce7e6 100755 --- a/templates/hooks/scripts/redact-output.mjs +++ b/templates/hooks/scripts/redact-output.mjs @@ -6,7 +6,7 @@ // to .husky/warns/ so we don't leak credentials into the repo's git tree // (warns/ is gitignored but the file still lives on disk). // -// Vibecrafted with AI Agents by VetCoders (c)2024-2026 LibraxisAI +// Vibecrafted with AI Agents by Vetcoders (c)2024-2026 LibraxisAI import { createInterface } from 'node:readline'; diff --git a/tests/aicx_sync_smoke.sh b/tests/aicx_sync_smoke.sh index 794b1d98..59dd8526 100755 --- a/tests/aicx_sync_smoke.sh +++ b/tests/aicx_sync_smoke.sh @@ -77,7 +77,7 @@ write_json_chunk() { "chunk_id": "$chunk_id", "authority": "$authority", "content_hash": "$content_hash", - "namespace": "VetCoders/vibecrafted", + "namespace": "vetcoders/vibecrafted", "timestamp": "2026-05-12T10:00:00+00:00" } JSON @@ -299,7 +299,7 @@ cat > "$CFG" <<'TOML' [default] local_store = "/tmp/from-toml" remote_host = "sztudio" -namespace = "VetCoders/vibecrafted" +namespace = "vetcoders/vibecrafted" TOML set +e diff --git a/tools/README.md b/tools/README.md index 36c5a5e4..890061bf 100644 --- a/tools/README.md +++ b/tools/README.md @@ -1,12 +1,12 @@ -# VetCoders Hooks +# Vetcoders Hooks -Private collection of Claude Code hooks for the VetCoders/LibraxisAI team. +Private collection of Claude Code hooks for the vetcoders/LibraxisAI team. ## Quick Install ```bash # Clone repo -git clone git@github.com:VetCoders/vetcoders-hooks.git +git clone git@github.com:vetcoders/vetcoders-hooks.git cd vetcoders-hooks # Copy all hooks @@ -104,4 +104,4 @@ Key sections: --- -Created by [Vibecrafted](https://vibecrafted.io) (c)2024-2026 [VetCoders](http://vetcoders.io) +Created by [Vibecrafted](https://vibecrafted.io) (c)2024-2026 [Vetcoders](http://vetcoders.io) diff --git a/tools/bin/README.md b/tools/bin/README.md index 5094a46a..a0acf8ef 100644 --- a/tools/bin/README.md +++ b/tools/bin/README.md @@ -58,7 +58,7 @@ Anything else lands in the tarball but is not auto-installed. ## Notarization contract (macOS) Binaries in `macos-*` subdirectories are expected to be signed with the -VetCoders Developer ID and notarized via `xcrun notarytool`. The +Vetcoders Developer ID and notarized via `xcrun notarytool`. The installer runs a basic `binary_runs` smoke test after copying — it does **not** re-run `codesign --verify` or `spctl --assess` today. That gate lives in the release pipeline, not on end-user machines. @@ -67,7 +67,7 @@ To re-stamp locally before shipping: ```bash codesign --force --options runtime --timestamp \ - --sign "Developer ID Application: VetCoders" \ + --sign "Developer ID Application: Vetcoders" \ tools/bin/macos-aarch64/aicx xcrun notarytool submit tools/bin/macos-aarch64/aicx \ --keychain-profile vetcoders-notary --wait diff --git a/tools/scripts/chat/README.md b/tools/scripts/chat/README.md index 49ae38b3..7e837b80 100644 --- a/tools/scripts/chat/README.md +++ b/tools/scripts/chat/README.md @@ -81,4 +81,4 @@ Assistant: Jestem Svetliq - polski model AI specjalizujacy sie w medycynie weter --- -_Copyright © 2024–2026 VetCoders_ +_Copyright © 2024–2026 Vetcoders_ diff --git a/tools/scripts/github/README.md b/tools/scripts/github/README.md index 3418e37e..78ff1701 100644 --- a/tools/scripts/github/README.md +++ b/tools/scripts/github/README.md @@ -20,7 +20,7 @@ Generates interactive HTML forms and executes operations from JSON. chmod +x repo-transfer.py # Interactive form mode (starts HTTP server + opens browser) -./repo-transfer.py Szowesgad LibraxisAI VetCoders +./repo-transfer.py Szowesgad LibraxisAI Vetcoders # Open form in browser without server ./repo-transfer.py Szowesgad LibraxisAI --open @@ -102,4 +102,4 @@ This breaks fork network and creates a completely independent copy. --- -_Copyright © 2024–2026 VetCoders_ +_Copyright © 2024–2026 Vetcoders_ diff --git a/tools/scripts/github/repo-transfer.py b/tools/scripts/github/repo-transfer.py index 3c7c48d6..9e9a54e0 100755 --- a/tools/scripts/github/repo-transfer.py +++ b/tools/scripts/github/repo-transfer.py @@ -12,7 +12,7 @@ Usage: # Generate HTML form and serve it (recommended) - ./repo-transfer.py Szowesgad LibraxisAI Loctree VetCoders + ./repo-transfer.py Szowesgad LibraxisAI Loctree Vetcoders # Generate HTML and open in browser ./repo-transfer.py Szowesgad LibraxisAI --open @@ -314,7 +314,7 @@ def generate_html( - Repo Transfer - VetCoders + Repo Transfer - Vetcoders