syncade 0.6.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- syncade/__init__.py +3 -0
- syncade/__main__.py +6 -0
- syncade/adapters/__init__.py +0 -0
- syncade/adapters/anthropic.py +457 -0
- syncade/adapters/base.py +221 -0
- syncade/adapters/fake.py +73 -0
- syncade/adapters/fake_common.py +29 -0
- syncade/adapters/fake_producer_audit_draft.py +460 -0
- syncade/adapters/fake_reviewer_synth.py +310 -0
- syncade/adapters/openai.py +484 -0
- syncade/adapters/openai_parsing.py +119 -0
- syncade/adapters/producer.py +221 -0
- syncade/adapters/producer_anthropic.py +300 -0
- syncade/adapters/producer_openai.py +226 -0
- syncade/adapters/registry.py +81 -0
- syncade/auth_check.py +554 -0
- syncade/auth_preflight.py +342 -0
- syncade/base_resolution.py +214 -0
- syncade/billing.py +141 -0
- syncade/checks_config.py +113 -0
- syncade/cli/__init__.py +546 -0
- syncade/cli/auth_gate.py +59 -0
- syncade/cli/config_keys.py +135 -0
- syncade/cli/config_list.py +82 -0
- syncade/cli/config_menu_rows.py +166 -0
- syncade/cli/config_mode.py +609 -0
- syncade/cli/config_overrides.py +122 -0
- syncade/cli/config_tui.py +476 -0
- syncade/cli/doctor_mode.py +72 -0
- syncade/cli/gc_mode.py +109 -0
- syncade/cli/install_skill.py +514 -0
- syncade/cli/metrics_mode.py +363 -0
- syncade/cli/modes.py +573 -0
- syncade/cli/parser.py +450 -0
- syncade/cli/parser_types.py +137 -0
- syncade/cli/paths.py +38 -0
- syncade/cli/preflight_paths.py +90 -0
- syncade/cli/resolve.py +116 -0
- syncade/cli/resume_mode.py +324 -0
- syncade/cli/toml_writer.py +410 -0
- syncade/cli/validate.py +421 -0
- syncade/config.py +478 -0
- syncade/config_auth.py +310 -0
- syncade/config_cold.py +209 -0
- syncade/config_gc.py +55 -0
- syncade/config_loader.py +182 -0
- syncade/config_loop.py +282 -0
- syncade/config_producer.py +222 -0
- syncade/config_retry.py +49 -0
- syncade/config_types.py +59 -0
- syncade/diff_filter.py +437 -0
- syncade/dispatcher.py +571 -0
- syncade/doctor.py +425 -0
- syncade/doctor_env.py +218 -0
- syncade/doctor_preview.py +524 -0
- syncade/doctor_types.py +28 -0
- syncade/exit_codes.py +82 -0
- syncade/findings.py +242 -0
- syncade/findings_json.py +456 -0
- syncade/gc.py +211 -0
- syncade/gc_execute.py +372 -0
- syncade/gc_protection.py +129 -0
- syncade/gc_types.py +50 -0
- syncade/gc_worktrees.py +200 -0
- syncade/git_object_id.py +12 -0
- syncade/git_preconditions.py +389 -0
- syncade/logging.py +289 -0
- syncade/metrics/__init__.py +32 -0
- syncade/metrics/aggregate.py +550 -0
- syncade/metrics/schema.py +221 -0
- syncade/orchestrator/__init__.py +61 -0
- syncade/orchestrator/_runs_dir.py +24 -0
- syncade/orchestrator/branch_advance.py +165 -0
- syncade/orchestrator/branch_guard.py +98 -0
- syncade/orchestrator/budget.py +107 -0
- syncade/orchestrator/escalation_coverage.py +81 -0
- syncade/orchestrator/loop.py +611 -0
- syncade/orchestrator/loop_dispatch_check.py +112 -0
- syncade/orchestrator/loop_finalize.py +404 -0
- syncade/orchestrator/loop_preflight.py +131 -0
- syncade/orchestrator/loop_resume.py +91 -0
- syncade/orchestrator/loop_rmtree.py +70 -0
- syncade/orchestrator/loop_round_step.py +599 -0
- syncade/orchestrator/prior_round.py +336 -0
- syncade/orchestrator/producer_phase.py +169 -0
- syncade/orchestrator/results.py +306 -0
- syncade/orchestrator/resume.py +96 -0
- syncade/orchestrator/resume_load.py +483 -0
- syncade/orchestrator/resume_plan.py +554 -0
- syncade/orchestrator/resume_target.py +215 -0
- syncade/orchestrator/resume_types.py +182 -0
- syncade/orchestrator/reviewer_template_failure.py +99 -0
- syncade/orchestrator/round.py +573 -0
- syncade/orchestrator/round_checks.py +91 -0
- syncade/orchestrator/round_no_changes.py +369 -0
- syncade/orchestrator/round_predispatch.py +212 -0
- syncade/orchestrator/verdict.py +279 -0
- syncade/persistence/__init__.py +189 -0
- syncade/persistence/_atomic.py +33 -0
- syncade/persistence/_clusters.py +70 -0
- syncade/persistence/_findings_verdict.py +201 -0
- syncade/persistence/_markdown.py +286 -0
- syncade/persistence/_validation.py +37 -0
- syncade/persistence/checks.py +249 -0
- syncade/persistence/decision_needed.py +289 -0
- syncade/persistence/findings_md.py +389 -0
- syncade/persistence/handoff.py +389 -0
- syncade/persistence/handoff_classify.py +196 -0
- syncade/persistence/last_reviewed.py +67 -0
- syncade/persistence/loop_manifest.py +165 -0
- syncade/persistence/loop_summary.py +352 -0
- syncade/persistence/loop_summary_text.py +428 -0
- syncade/persistence/producer.py +250 -0
- syncade/persistence/reviewer.py +198 -0
- syncade/persistence/round_manifest.py +238 -0
- syncade/persistence/run_init.py +153 -0
- syncade/persistence/run_summary.py +585 -0
- syncade/persistence/run_summary_next_steps.py +443 -0
- syncade/persistence/synth.py +242 -0
- syncade/persistence/test_run.py +152 -0
- syncade/presets.py +36 -0
- syncade/pricing_config.py +72 -0
- syncade/process.py +600 -0
- syncade/producer.py +189 -0
- syncade/producer_attempt.py +463 -0
- syncade/producer_escalation.py +146 -0
- syncade/producer_git.py +199 -0
- syncade/producer_result.py +205 -0
- syncade/prompts.py +448 -0
- syncade/prompts_loader.py +238 -0
- syncade/retry.py +159 -0
- syncade/run_inputs.py +40 -0
- syncade/run_status.py +198 -0
- syncade/selfcheck.py +471 -0
- syncade/skills/claude/README.md +221 -0
- syncade/skills/claude/SKILL.md +625 -0
- syncade/skills/codex/README.md +116 -0
- syncade/skills/codex/SKILL.md +574 -0
- syncade/snapshot.py +598 -0
- syncade/spec_audit.py +437 -0
- syncade/spec_audit_schema.py +190 -0
- syncade/spec_draft.py +423 -0
- syncade/spec_source.py +135 -0
- syncade/synthesis.py +428 -0
- syncade/synthesis_clusters.py +203 -0
- syncade/synthesis_repair.py +230 -0
- syncade/synthesis_schema.py +65 -0
- syncade/synthesizer/__init__.py +38 -0
- syncade/synthesizer/constants.py +33 -0
- syncade/synthesizer/driver.py +531 -0
- syncade/synthesizer/rendering.py +63 -0
- syncade/synthesizer/result.py +73 -0
- syncade/synthesizer/validation.py +421 -0
- syncade/synthesizer/workspace.py +208 -0
- syncade/templates/presets/balanced.toml +13 -0
- syncade/templates/presets/cheap.toml +12 -0
- syncade/templates/presets/thorough.toml +9 -0
- syncade/templates/producer.md +231 -0
- syncade/templates/reviewer.md +279 -0
- syncade/templates/reviewer_adversarial.md +164 -0
- syncade/templates/reviewer_codex.md +165 -0
- syncade/templates/spec_audit.md +168 -0
- syncade/templates/spec_draft.md +62 -0
- syncade/templates/synthesizer.md +204 -0
- syncade/test_runner.py +476 -0
- syncade/test_runner_classify.py +98 -0
- syncade/transcript.py +150 -0
- syncade/usage.py +407 -0
- syncade/worktree.py +497 -0
- syncade/worktree_env.py +133 -0
- syncade/worktree_paths.py +139 -0
- syncade-0.6.2.dist-info/METADATA +314 -0
- syncade-0.6.2.dist-info/RECORD +177 -0
- syncade-0.6.2.dist-info/WHEEL +5 -0
- syncade-0.6.2.dist-info/entry_points.txt +2 -0
- syncade-0.6.2.dist-info/licenses/LICENSE +202 -0
- syncade-0.6.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# syncade Codex skill
|
|
2
|
+
|
|
3
|
+
Bridge between Codex and the syncade external review orchestrator. Describe what
|
|
4
|
+
you want in natural language from inside Codex; this skill runs a safety check
|
|
5
|
+
+ confirmation gate + the review loop, then summarizes the verdict inline.
|
|
6
|
+
|
|
7
|
+
It is the Codex counterpart of the Claude Code skill at
|
|
8
|
+
`.claude/skills/syncade/`. Both are the **same** skill: their load-bearing
|
|
9
|
+
Step 2 → Invariants workflow span is single-source and kept byte-identical by
|
|
10
|
+
`tests/skills/test_skill_drift.py`. They differ only in the harness-specific
|
|
11
|
+
head (invocation phrasing, spec-tier handling, `CLAUDE.md` vs `AGENTS.md`).
|
|
12
|
+
|
|
13
|
+
## Quick start
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
run syncade on path/to/pr.md
|
|
17
|
+
review path/to/pr.md for 2 rounds against main
|
|
18
|
+
dogfood a PR single pass
|
|
19
|
+
review the openspec change add-auth
|
|
20
|
+
review path/to/pr.md since last review
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The skill also handles **configuration** without running a review — "/syncade config",
|
|
24
|
+
"change my producer to gpt-5", "set rounds to 2", "show my config" — rendering a config
|
|
25
|
+
**menu** (`syncade --config list --all`) you browse and edit via
|
|
26
|
+
`syncade --config set <key> <value>` (writes the global `~/.syncade/config.toml`, or the
|
|
27
|
+
repo's with `--repo`). See "Configuring syncade" in the SKILL.
|
|
28
|
+
|
|
29
|
+
Both a bare path and clear natural language work — the skill maps your request
|
|
30
|
+
onto the CLI shape `syncade [--openspec [ID] | PR_DOC] [--base REF | --scope
|
|
31
|
+
SCOPE] [--max-rounds N]` at the markdown layer only (no Python of its own). The
|
|
32
|
+
interactive Codex agent then: resolves intent → validates the doc → runs
|
|
33
|
+
`syncade --auth-check` + `--selfcheck` → shows the exact command and waits for
|
|
34
|
+
`go`/`cancel` → streams the loop → reads `loop-summary.md` and prints the verdict
|
|
35
|
+
→ surfaces any producer commits with a rollback pointer.
|
|
36
|
+
|
|
37
|
+
### Natural-language phrasings the skill understands
|
|
38
|
+
|
|
39
|
+
- **Round count:** `for 1 round`, `for 2 rounds`, `max rounds 3`, `single pass`
|
|
40
|
+
(= 1 round). Valid: 1–10. Omit it and your config's `max_rounds` stays authoritative.
|
|
41
|
+
- **Base ref:** `against main`, `from origin/main`, `base HEAD~3` (validated with
|
|
42
|
+
`git rev-parse` before running). Omit it and current CLI behavior stays authoritative.
|
|
43
|
+
- **Scope:** `everything` (branch point off the default branch), `what I just did`
|
|
44
|
+
/ `my recent changes` (`--scope local`), `since last review` / `what's new`
|
|
45
|
+
(`--scope since-last-review`). Mutually exclusive with an explicit base; an
|
|
46
|
+
explicit ref wins.
|
|
47
|
+
- **OpenSpec:** `review the openspec change <id>` → `--openspec <id>` (or bare
|
|
48
|
+
`--openspec` to auto-resolve a single active change). syncade assembles
|
|
49
|
+
`openspec/changes/<id>/` into the spec directly — no `openspec` binary needed.
|
|
50
|
+
- **No brief at all?** The skill **degrades gracefully** — it asks for a brief or
|
|
51
|
+
`--openspec` (and `--scope` only narrows the base, so it can't stand in for a
|
|
52
|
+
spec), and never invents a spec. Drafting a spec from the Codex session
|
|
53
|
+
transcript is a planned follow-up.
|
|
54
|
+
|
|
55
|
+
## Prerequisites
|
|
56
|
+
|
|
57
|
+
- `codex` CLI (this harness) installed and authenticated (`codex login status`
|
|
58
|
+
reports logged in) — the default reviewers, judge, and producer all resolve to
|
|
59
|
+
OpenAI in a Codex / plain-terminal environment with no extra config.
|
|
60
|
+
- `syncade` on `PATH` (`syncade --version` works from any directory — see the
|
|
61
|
+
repo README's "Global install").
|
|
62
|
+
- macOS or Linux (the skill assumes `bash`/`zsh`).
|
|
63
|
+
|
|
64
|
+
## When to use vs. terminal
|
|
65
|
+
|
|
66
|
+
The skill is opt-in — it adds the pre-flight diagnostics + confirmation gate over
|
|
67
|
+
the plain CLI. Running `syncade <pr-doc>` from a terminal still gets the same
|
|
68
|
+
loop; it just skips the gate. Use the terminal directly for `syncade --auth-check`
|
|
69
|
+
(~5s), `syncade --selfcheck` (~30s), `syncade --spec-audit <pr-doc>`, or
|
|
70
|
+
`syncade --resume <run-id>` — those are standalone diagnostics the skill does not
|
|
71
|
+
wrap.
|
|
72
|
+
|
|
73
|
+
## Producer commits land on your branch
|
|
74
|
+
|
|
75
|
+
When `max_rounds > 1` (the default), the producer commits fixes directly to the
|
|
76
|
+
current branch between rounds (fast-forward only). The skill lists each commit
|
|
77
|
+
with its SHA + subject and prints the rollback pointer
|
|
78
|
+
(`git reset --hard <round-0-starting-sha>`, from
|
|
79
|
+
`<run-dir>/loop-manifest.json` `rounds[0].snapshot.commit_sha`). Nothing is
|
|
80
|
+
auto-reverted; you decide what to keep. See `AGENTS.md` for the full blast-radius
|
|
81
|
+
contract.
|
|
82
|
+
|
|
83
|
+
## Failure modes
|
|
84
|
+
|
|
85
|
+
- **Auth-check / selfcheck fails:** the skill stops and surfaces the syncade
|
|
86
|
+
output verbatim (it names the failing provider and the fix). Common selfcheck
|
|
87
|
+
cause: `[producer] permissions` must be `"yolo"` for a headless commit.
|
|
88
|
+
- **You cancel at the gate:** the skill prints `cancelled at operator
|
|
89
|
+
confirmation` and exits; nothing is modified.
|
|
90
|
+
- **`syncade <pr-doc>` exits non-zero:** the skill still reads `loop-summary.md`
|
|
91
|
+
if present, else points at the highest-numbered round dir. Exit-code table is in
|
|
92
|
+
`AGENTS.md` and the exit-code table.
|
|
93
|
+
|
|
94
|
+
## What the skill does not do
|
|
95
|
+
|
|
96
|
+
- Doesn't reimplement syncade — it's a Bash wrapper over the CLI; everything it
|
|
97
|
+
does is doable from a terminal.
|
|
98
|
+
- Doesn't review code itself. The interactive Codex agent reading this skill is
|
|
99
|
+
the operator's UI, not a syncade reviewer. The reviewer subprocesses (`claude
|
|
100
|
+
-p`, `codex exec`) run with no shared context with this session.
|
|
101
|
+
|
|
102
|
+
## Where this skill lives
|
|
103
|
+
|
|
104
|
+
Install it at the user level with one command:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
syncade --install-skill codex # copies it to $CODEX_HOME/skills/syncade/
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
This works from any installed copy of syncade (the skill ships inside the
|
|
111
|
+
package) — `pip install .` from a checkout, or `pip install git+<repo-url>`.
|
|
112
|
+
syncade is not published on PyPI. Restart Codex to pick up new skills. The `syncade` CLI it shells out to
|
|
113
|
+
must be on your `PATH`. `~/.codex/skills` (i.e. `$CODEX_HOME/skills`) is the
|
|
114
|
+
verified-discovered location; format details in the CLI-format notes.
|
|
115
|
+
Developers who want the installed skill to track a checkout can
|
|
116
|
+
`ln -sfn "$PWD/.codex/skills/syncade" ~/.codex/skills/syncade` instead.
|