Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
212be68
updating make and run to use uv instead of pip for python version con…
propp-orkes Jul 15, 2026
81ee972
installing uv for ci
propp-orkes Jul 15, 2026
92b835d
disabling uv cache
propp-orkes Jul 15, 2026
c2c524f
Correcting search on docs page
propp-orkes Jul 16, 2026
f7845c1
approved design docs (docs/design)
propp-orkes Jul 16, 2026
d261f40
code_subtask run-checks-taskdef
propp-orkes Jul 16, 2026
a0aacf5
code_subtask register-checks-module
propp-orkes Jul 16, 2026
3a1c630
code_subtask wire-code-parallel
propp-orkes Jul 16, 2026
941391e
code_subtask wire-code-subtask
propp-orkes Jul 16, 2026
d414380
code_subtask workflow-invariant-tests
propp-orkes Jul 16, 2026
768fefd
code_subtask run-checks-worker
propp-orkes Jul 16, 2026
0331842
Merge branch 'cc-group-run-checks-taskdef' into code-parallel
propp-orkes Jul 16, 2026
d12fb82
Merge branch 'cc-group-wire-code-subtask' into code-parallel
propp-orkes Jul 16, 2026
0b746f4
Merge branch 'cc-group-wire-code-parallel' into code-parallel
propp-orkes Jul 16, 2026
98a6a08
Merge branch 'cc-group-register-checks-module' into code-parallel
propp-orkes Jul 16, 2026
c4107aa
Merge branch 'cc-group-workflow-invariant-tests' into code-parallel
propp-orkes Jul 16, 2026
0f42897
adding architecture to subfolder
propp-orkes Jul 16, 2026
db0bc1d
code_subtask cost-pricing-config
propp-orkes Jul 16, 2026
0863ee6
code_subtask checks-output-cap-env
propp-orkes Jul 16, 2026
d91b082
code_subtask coding-agent-task-defaults-env
propp-orkes Jul 16, 2026
31398ef
code_subtask gitops-identity-retry-env
propp-orkes Jul 16, 2026
9d1498e
code_subtask github-diffcap-nullsafety
propp-orkes Jul 16, 2026
dab344c
code_subtask coding-agent-tree-caps-env
propp-orkes Jul 16, 2026
28b3f5b
Merge branch 'cc-group-coding-agent-tree-caps-env' into code-parallel
propp-orkes Jul 16, 2026
a44d1a1
Merge branch 'cc-group-coding-agent-task-defaults-env' into code-para…
propp-orkes Jul 16, 2026
67205eb
Merge branch 'cc-group-gitops-identity-retry-env' into code-parallel
propp-orkes Jul 16, 2026
567bca9
Merge branch 'cc-group-github-diffcap-nullsafety' into code-parallel
propp-orkes Jul 16, 2026
8020ef0
Merge branch 'cc-group-cost-pricing-config' into code-parallel
propp-orkes Jul 16, 2026
99cba62
approved design docs (docs/design)
propp-orkes Jul 16, 2026
d945a80
code_subtask gitops-submit-review-passthrough
propp-orkes Jul 16, 2026
6388e87
code_subtask pr-review-workflow-wiring
propp-orkes Jul 16, 2026
fbaf34d
code_subtask github-selfreview-core
propp-orkes Jul 16, 2026
9ccfb63
Merge branch 'cc-group-gitops-submit-review-passthrough' into code-pa…
propp-orkes Jul 16, 2026
df302dc
Merge branch 'cc-group-pr-review-workflow-wiring' into code-parallel
propp-orkes Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ jobs:
with:
python-version: ${{ matrix.python }}

# Installed for every harness so a harness can adopt uv without a CI change.
# Cache disabled: harnesses that don't invoke uv yet leave no cache dir to save,
# which fails the post-job cache-save step.
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
python-version: ${{ matrix.python }}
enable-cache: false

# Fail fast on malformed DAG / profile / benchmark JSON (the edits most likely to break a run).
- name: Validate workflow & config JSON
if: matrix.harness == 'security-harness'
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,7 @@
/security-harness/manifests
/site
/security-harness/blog

# Harness runtime state (git worktrees + session/output dirs)
.cc-worktrees/
.conductor-code/
Empty file added Task_Ticket.md
Empty file.
1 change: 1 addition & 0 deletions coding-harness/.python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.13
130 changes: 118 additions & 12 deletions coding-harness/Makefile
Original file line number Diff line number Diff line change
@@ -1,30 +1,136 @@
SHELL := /bin/bash
PYTHON ?= python3
VENV := .venv-ci
PY := $(VENV)/bin/python
# conductor coding-harness — operator shortcuts.
# Run `make` (or `make help`) to list targets.

SHELL := /bin/bash
ROOT := $(shell pwd)

# uv manages the Python toolchain: it provisions PY_VERSION (per .python-version /
# pyproject requires-python), downloading it if the host lacks it, so venvs never
# fall back to the system python3 (which has no claude-agent-sdk wheels).
UV := uv
PY_VERSION := 3.13

# run.sh owns the worker/tui virtualenvs (workers/.venv, tui/.venv), .env
# loading, and server autostart; delegate to it so this Makefile never drifts.
RUN := $(ROOT)/run.sh
WORKER_PY := $(ROOT)/workers/.venv/bin/python

# CI virtualenv: tui + worker deps + pytest, kept separate from the operator
# venvs so `make ci` is reproducible and never touches a running worker env.
VENV := $(ROOT)/.venv-ci
PY := $(VENV)/bin/python
DEPS := $(VENV)/.deps-installed

export CONDUCTOR_SERVER_URL ?= http://localhost:8080/api

.DEFAULT_GOAL := help

help: ## List available targets
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | sort | \
awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-12s\033[0m %s\n", $$1, $$2}'
awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-14s\033[0m %s\n", $$1, $$2}'

# ── Conductor server ────────────────────────────────────────────────────────

server: ## Start the local Conductor server (OSS; Java 21+)
@conductor server start

server-stop: ## Stop the local Conductor server
@conductor server stop

server-logs: ## Tail the Conductor server log
@conductor server logs

# ── Setup ───────────────────────────────────────────────────────────────────

venv: ## Create the worker virtualenv and install deps (workers/.venv)
@$(RUN) setup

tui-venv: ## Create the TUI virtualenv and install deps (tui/.venv)
@test -x $(ROOT)/tui/.venv/bin/python || $(UV) venv --python $(PY_VERSION) $(ROOT)/tui/.venv
@$(UV) pip install -q --prerelease=explicit --python $(ROOT)/tui/.venv/bin/python -r $(ROOT)/tui/requirements.txt
@echo "tui venv ready: $(ROOT)/tui/.venv"

# ── Definitions & workers ─────────────────────────────────────────────────────

register: ## Register/update task defs + workflows (starts a local server if needed)
@$(RUN) register

WORKER_MODULES ?= coding_agent,gitops
workers: venv ## Run workers (supervised, foreground; WORKER_MODULES=coding_agent|gitops to split)
@WORKER_MODULES=$(WORKER_MODULES) $(ROOT)/workers/run_workers.sh

run: ## Full bootstrap: setup + register + run workers (the one-command start)
@$(RUN)

tui: ## Launch the terminal UI (chat; ANTHROPIC_API_KEY needed for chat)
@$(RUN) tui

# ── Manual test: start a workflow run ─────────────────────────────────────────
# Each target builds its --input JSON with jq (safe quoting) and hands off to
# `conductor workflow start`. Pass extra conductor flags via ARGS='...'.

code: ## Code a change in a local repo: make code REPO=/abs/path INSTRUCTION="…" [DESIGN=true]
@test -n "$(REPO)" && test -n "$(INSTRUCTION)" || { \
echo "usage: make code REPO=/abs/path/to/repo INSTRUCTION=\"do X\" [DESIGN=true]"; exit 1; }
@input=$$(jq -cn --arg r "$(REPO)" --arg i "$(INSTRUCTION)" --argjson d $(if $(DESIGN),$(DESIGN),false) \
'{repoPath:$$r, instruction:$$i, design:$$d}'); \
conductor workflow start --workflow code_parallel --input "$$input" $(ARGS)

issue-to-pr: ## GitHub issue → PR: make issue-to-pr REPO=owner/name ISSUE=7
@test -n "$(REPO)" && test -n "$(ISSUE)" || { \
echo "usage: make issue-to-pr REPO=owner/name ISSUE=<n>"; exit 1; }
@input=$$(jq -cn --arg r "$(REPO)" --argjson n $(ISSUE) '{repo:$$r, issueNumber:$$n}'); \
conductor workflow start --workflow issue_to_pr --input "$$input" $(ARGS)

pr-review: ## Review a PR (posts a formal review): make pr-review REPO=owner/name PR=7
@test -n "$(REPO)" && test -n "$(PR)" || { \
echo "usage: make pr-review REPO=owner/name PR=<n>"; exit 1; }
@input=$$(jq -cn --arg r "$(REPO)" --argjson n $(PR) '{repo:$$r, prNumber:$$n}'); \
conductor workflow start --workflow pr_review --input "$$input" $(ARGS)

address-pr: ## Apply a PR's review feedback: make address-pr REPO=owner/name PR=7
@test -n "$(REPO)" && test -n "$(PR)" || { \
echo "usage: make address-pr REPO=owner/name PR=<n>"; exit 1; }
@input=$$(jq -cn --arg r "$(REPO)" --argjson n $(PR) '{repo:$$r, prNumber:$$n}'); \
conductor workflow start --workflow address_pr --input "$$input" $(ARGS)

github-demo: ## Clone → change → PR smoke test: make github-demo REPO_URL=… INSTRUCTION="…"
@test -n "$(REPO_URL)" && test -n "$(INSTRUCTION)" || { \
echo "usage: make github-demo REPO_URL=<git-url> INSTRUCTION=\"do X\""; exit 1; }
@input=$$(jq -cn --arg u "$(REPO_URL)" --arg i "$(INSTRUCTION)" '{repoUrl:$$u, instruction:$$i}'); \
conductor workflow start --workflow github_demo --input "$$input" $(ARGS)

watch: ## Follow a running execution: make watch ID=<workflowId>
@test -n "$(ID)" || { echo "usage: make watch ID=<workflowId>"; exit 1; }
@conductor workflow get-execution "$(ID)" -c

# ── Quality bar ───────────────────────────────────────────────────────────────

$(DEPS):
@test -x $(PY) || $(PYTHON) -m venv $(VENV)
@$(VENV)/bin/pip install -q -r tui/requirements.txt -r workers/requirements.txt pytest pytest-asyncio
@test -x $(PY) || $(UV) venv --python $(PY_VERSION) $(VENV)
@$(UV) pip install -q --prerelease=explicit --python $(PY) -r tui/requirements.txt -r workers/requirements.txt pytest pytest-asyncio
@touch $(DEPS)

validate: ## Validate workflow and task-definition JSON
@jq empty workers/workflows/*.json workers/workflows/taskdefs/*.json

lint: ## Compile Python and check shell syntax
@$(PYTHON) -m compileall -q tui workers
lint: $(DEPS) ## Compile Python and check shell syntax
@$(PY) -m compileall -q tui workers
@bash -n run.sh workers/register.sh workers/run_workers.sh

test-ci: $(DEPS) ## Run unit tests
test: $(DEPS) ## Run unit tests (tui + workers)
@$(PY) -m pytest tui/tests workers/tests -q

ci: validate lint test-ci ## Run the coding-harness CI quality bar
test-ci: test ## Alias for `test` (CI unit tests)

ci: validate lint test ## Run the coding-harness CI quality bar

# ── Cleanup ────────────────────────────────────────────────────────────────────

clean: ## Remove virtualenvs and harness runtime state (worktrees, sessions)
@rm -rf $(VENV) workers/.venv tui/.venv \
$(ROOT)/.cc-worktrees $(ROOT)/.conductor-code && echo "cleaned"

.PHONY: help validate lint test-ci ci
.PHONY: help server server-stop server-logs venv tui-venv register workers run tui \
code issue-to-pr pr-review address-pr github-demo watch \
validate lint test test-ci ci clean
Loading
Loading