- coord/prdy subcommands now accept --claude/--codex runtime flags - New `mosaic coord run` generates continuation context and launches selected runtime, replacing manual copy/paste workflow - Next-task capsule (.mosaic/orchestrator/next-task.json) provides machine-readable execution context for deterministic session launches - Codex strict orchestrator profile added to runtime/codex/RUNTIME.md - Orchestrator protocol updated with between-session run flow - New smoke-test.sh for orchestration behavior verification Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
79 lines
3.2 KiB
Bash
Executable File
79 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
#
|
|
# smoke-test.sh — Behavior smoke checks for coord continue/run workflows.
|
|
#
|
|
# Usage:
|
|
# smoke-test.sh
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/_lib.sh"
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
pass_case() {
|
|
echo "PASS: $1"
|
|
PASS=$((PASS + 1))
|
|
}
|
|
|
|
fail_case() {
|
|
echo "FAIL: $1" >&2
|
|
FAIL=$((FAIL + 1))
|
|
}
|
|
|
|
tmp_project="$(mktemp -d)"
|
|
trap 'rm -rf "$tmp_project"' EXIT
|
|
|
|
mkdir -p "$tmp_project/.mosaic/orchestrator" "$tmp_project/docs/scratchpads"
|
|
|
|
cat > "$tmp_project/.mosaic/orchestrator/mission.json" <<'JSON'
|
|
{
|
|
"mission_id": "smoke-mission-20260223",
|
|
"name": "Smoke Mission",
|
|
"status": "active",
|
|
"project_path": "SMOKE_PROJECT",
|
|
"quality_gates": "pnpm lint && pnpm test",
|
|
"milestones": [
|
|
{ "id": "M1", "name": "Milestone One", "status": "pending" }
|
|
],
|
|
"sessions": []
|
|
}
|
|
JSON
|
|
|
|
cat > "$tmp_project/docs/MISSION-MANIFEST.md" <<'MD'
|
|
# Mission Manifest
|
|
MD
|
|
|
|
cat > "$tmp_project/docs/scratchpads/smoke-mission-20260223.md" <<'MD'
|
|
# Scratchpad
|
|
MD
|
|
|
|
cat > "$tmp_project/docs/TASKS.md" <<'MD'
|
|
| id | status | milestone | description | pr | notes |
|
|
|----|--------|-----------|-------------|----|-------|
|
|
| T-001 | pending | M1 | Smoke task | | |
|
|
MD
|
|
|
|
codex_continue_output="$(MOSAIC_COORD_RUNTIME=codex bash "$SCRIPT_DIR/continue-prompt.sh" --project "$tmp_project")"
|
|
capsule_file="$tmp_project/.mosaic/orchestrator/next-task.json"
|
|
|
|
if [[ -f "$capsule_file" ]]; then pass_case "continue writes next-task capsule"; else fail_case "continue writes next-task capsule"; fi
|
|
if jq -e '.runtime == "codex"' "$capsule_file" >/dev/null 2>&1; then pass_case "capsule runtime is codex"; else fail_case "capsule runtime is codex"; fi
|
|
if jq -e '.next_task == "T-001"' "$capsule_file" >/dev/null 2>&1; then pass_case "capsule next_task is T-001"; else fail_case "capsule next_task is T-001"; fi
|
|
if grep -Fq 'Target runtime:** codex' <<< "$codex_continue_output"; then pass_case "continue prompt contains target runtime codex"; else fail_case "continue prompt contains target runtime codex"; fi
|
|
|
|
codex_run_prompt="$(MOSAIC_COORD_RUNTIME=codex bash "$SCRIPT_DIR/session-run.sh" --project "$tmp_project" --print)"
|
|
if [[ "$(printf '%s\n' "$codex_run_prompt" | head -n1)" == "Now initiating Orchestrator mode..." ]]; then pass_case "codex run prompt first line is mode declaration"; else fail_case "codex run prompt first line is mode declaration"; fi
|
|
if grep -Fq 'Do NOT ask clarifying questions before your first tool actions' <<< "$codex_run_prompt"; then pass_case "codex run prompt includes no-questions hard gate"; else fail_case "codex run prompt includes no-questions hard gate"; fi
|
|
if grep -Fq '"next_task": "T-001"' <<< "$codex_run_prompt"; then pass_case "codex run prompt embeds capsule json"; else fail_case "codex run prompt embeds capsule json"; fi
|
|
|
|
claude_run_prompt="$(MOSAIC_COORD_RUNTIME=claude bash "$SCRIPT_DIR/session-run.sh" --project "$tmp_project" --print)"
|
|
if [[ "$(printf '%s\n' "$claude_run_prompt" | head -n1)" == "## Continuation Mission" ]]; then pass_case "claude run prompt remains continuation prompt format"; else fail_case "claude run prompt remains continuation prompt format"; fi
|
|
|
|
echo ""
|
|
echo "Smoke test summary: pass=$PASS fail=$FAIL"
|
|
if (( FAIL > 0 )); then
|
|
exit 1
|
|
fi
|