fix: curl | bash one-liner install, auto-detects all runtimes #10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: dogfood | ||
| on: | ||
| push: | ||
| branches: [main] | ||
| pull_request: | ||
| workflow_dispatch: | ||
| jobs: | ||
| audit-self: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.12" | ||
| - name: Install requirements | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install -r scripts/requirements.txt | ||
| - name: Build known-good fixture | ||
| run: python3 .github/workflows/build_fixture.py /tmp/fixture | ||
| - name: Gate 1 - constitution audit must pass | ||
| run: python3 scripts/audit_constitution.py --project-dir /tmp/fixture | ||
| - name: Gate 2 - SoW audit must pass | ||
| run: python3 scripts/audit_sow.py --project-dir /tmp/fixture | ||
| - name: Orchestrator init subcommand works | ||
| run: python3 scripts/orchestrator.py --project-dir /tmp/fixture2 init "test product idea" | ||
| - name: Orchestrator audit gate 1+2 must pass (full audit may have later-gate findings) | ||
| run: | | ||
| python3 scripts/orchestrator.py --project-dir /tmp/fixture gate 1 --json | ||
| python3 scripts/orchestrator.py --project-dir /tmp/fixture gate 2 --json | ||
| - name: Orchestrator audit produces valid JSON | ||
| run: | | ||
| python3 scripts/orchestrator.py --project-dir /tmp/fixture audit --json | python3 -c " | ||
| import sys, json | ||
| d = json.load(sys.stdin) | ||
| assert 'findings' in d, 'missing findings key' | ||
| print(f'OK: audit produced {len(d[\"findings\"])} findings') | ||
| " | ||
| - name: Orchestrator path resolution uses env var override | ||
| run: PRODUCT_INIT_SKILL_DIR=/tmp/fixture python3 scripts/orchestrator.py --project-dir /tmp/fixture gate 1 --json | ||
| - name: Runtime adapters exist and have valid frontmatter | ||
| run: | | ||
| python3 - <<'EOF' | ||
| import sys | ||
| from pathlib import Path | ||
| expected = ["claude-code.md", "codex.md", "openclaw.md"] | ||
| runtime_dir = Path("runtime") | ||
| missing = [f for f in expected if not (runtime_dir / f).exists()] | ||
| if missing: | ||
| print(f"FAIL: missing runtime adapters: {missing}") | ||
| sys.exit(1) | ||
| for f in expected: | ||
| text = (runtime_dir / f).read_text() | ||
| if not (text.startswith("---") and "runtime:" in text and "skill: product-init" in text): | ||
| print(f"FAIL: {f} invalid frontmatter") | ||
| sys.exit(1) | ||
| print(f"OK: all {len(expected)} runtime adapters valid") | ||
| EOF | ||
| - name: install.sh is executable | ||
| run: test -x install.sh || (echo "FAIL: install.sh not executable" && exit 1) | ||
| - name: Python syntax check on every audit script | ||
| run: | | ||
| set -euo pipefail | ||
| fail=0 | ||
| while IFS= read -r p; do | ||
| python3 -c "import ast,sys; ast.parse(open(sys.argv[1]).read())" "$p" || fail=1 | ||
| done < <(find scripts -type f -name '*.py') | ||
| if [ "$fail" -ne 0 ]; then | ||
| echo "syntax errors detected" | ||
| exit 1 | ||
| fi | ||