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.
Files changed (177) hide show
  1. syncade/__init__.py +3 -0
  2. syncade/__main__.py +6 -0
  3. syncade/adapters/__init__.py +0 -0
  4. syncade/adapters/anthropic.py +457 -0
  5. syncade/adapters/base.py +221 -0
  6. syncade/adapters/fake.py +73 -0
  7. syncade/adapters/fake_common.py +29 -0
  8. syncade/adapters/fake_producer_audit_draft.py +460 -0
  9. syncade/adapters/fake_reviewer_synth.py +310 -0
  10. syncade/adapters/openai.py +484 -0
  11. syncade/adapters/openai_parsing.py +119 -0
  12. syncade/adapters/producer.py +221 -0
  13. syncade/adapters/producer_anthropic.py +300 -0
  14. syncade/adapters/producer_openai.py +226 -0
  15. syncade/adapters/registry.py +81 -0
  16. syncade/auth_check.py +554 -0
  17. syncade/auth_preflight.py +342 -0
  18. syncade/base_resolution.py +214 -0
  19. syncade/billing.py +141 -0
  20. syncade/checks_config.py +113 -0
  21. syncade/cli/__init__.py +546 -0
  22. syncade/cli/auth_gate.py +59 -0
  23. syncade/cli/config_keys.py +135 -0
  24. syncade/cli/config_list.py +82 -0
  25. syncade/cli/config_menu_rows.py +166 -0
  26. syncade/cli/config_mode.py +609 -0
  27. syncade/cli/config_overrides.py +122 -0
  28. syncade/cli/config_tui.py +476 -0
  29. syncade/cli/doctor_mode.py +72 -0
  30. syncade/cli/gc_mode.py +109 -0
  31. syncade/cli/install_skill.py +514 -0
  32. syncade/cli/metrics_mode.py +363 -0
  33. syncade/cli/modes.py +573 -0
  34. syncade/cli/parser.py +450 -0
  35. syncade/cli/parser_types.py +137 -0
  36. syncade/cli/paths.py +38 -0
  37. syncade/cli/preflight_paths.py +90 -0
  38. syncade/cli/resolve.py +116 -0
  39. syncade/cli/resume_mode.py +324 -0
  40. syncade/cli/toml_writer.py +410 -0
  41. syncade/cli/validate.py +421 -0
  42. syncade/config.py +478 -0
  43. syncade/config_auth.py +310 -0
  44. syncade/config_cold.py +209 -0
  45. syncade/config_gc.py +55 -0
  46. syncade/config_loader.py +182 -0
  47. syncade/config_loop.py +282 -0
  48. syncade/config_producer.py +222 -0
  49. syncade/config_retry.py +49 -0
  50. syncade/config_types.py +59 -0
  51. syncade/diff_filter.py +437 -0
  52. syncade/dispatcher.py +571 -0
  53. syncade/doctor.py +425 -0
  54. syncade/doctor_env.py +218 -0
  55. syncade/doctor_preview.py +524 -0
  56. syncade/doctor_types.py +28 -0
  57. syncade/exit_codes.py +82 -0
  58. syncade/findings.py +242 -0
  59. syncade/findings_json.py +456 -0
  60. syncade/gc.py +211 -0
  61. syncade/gc_execute.py +372 -0
  62. syncade/gc_protection.py +129 -0
  63. syncade/gc_types.py +50 -0
  64. syncade/gc_worktrees.py +200 -0
  65. syncade/git_object_id.py +12 -0
  66. syncade/git_preconditions.py +389 -0
  67. syncade/logging.py +289 -0
  68. syncade/metrics/__init__.py +32 -0
  69. syncade/metrics/aggregate.py +550 -0
  70. syncade/metrics/schema.py +221 -0
  71. syncade/orchestrator/__init__.py +61 -0
  72. syncade/orchestrator/_runs_dir.py +24 -0
  73. syncade/orchestrator/branch_advance.py +165 -0
  74. syncade/orchestrator/branch_guard.py +98 -0
  75. syncade/orchestrator/budget.py +107 -0
  76. syncade/orchestrator/escalation_coverage.py +81 -0
  77. syncade/orchestrator/loop.py +611 -0
  78. syncade/orchestrator/loop_dispatch_check.py +112 -0
  79. syncade/orchestrator/loop_finalize.py +404 -0
  80. syncade/orchestrator/loop_preflight.py +131 -0
  81. syncade/orchestrator/loop_resume.py +91 -0
  82. syncade/orchestrator/loop_rmtree.py +70 -0
  83. syncade/orchestrator/loop_round_step.py +599 -0
  84. syncade/orchestrator/prior_round.py +336 -0
  85. syncade/orchestrator/producer_phase.py +169 -0
  86. syncade/orchestrator/results.py +306 -0
  87. syncade/orchestrator/resume.py +96 -0
  88. syncade/orchestrator/resume_load.py +483 -0
  89. syncade/orchestrator/resume_plan.py +554 -0
  90. syncade/orchestrator/resume_target.py +215 -0
  91. syncade/orchestrator/resume_types.py +182 -0
  92. syncade/orchestrator/reviewer_template_failure.py +99 -0
  93. syncade/orchestrator/round.py +573 -0
  94. syncade/orchestrator/round_checks.py +91 -0
  95. syncade/orchestrator/round_no_changes.py +369 -0
  96. syncade/orchestrator/round_predispatch.py +212 -0
  97. syncade/orchestrator/verdict.py +279 -0
  98. syncade/persistence/__init__.py +189 -0
  99. syncade/persistence/_atomic.py +33 -0
  100. syncade/persistence/_clusters.py +70 -0
  101. syncade/persistence/_findings_verdict.py +201 -0
  102. syncade/persistence/_markdown.py +286 -0
  103. syncade/persistence/_validation.py +37 -0
  104. syncade/persistence/checks.py +249 -0
  105. syncade/persistence/decision_needed.py +289 -0
  106. syncade/persistence/findings_md.py +389 -0
  107. syncade/persistence/handoff.py +389 -0
  108. syncade/persistence/handoff_classify.py +196 -0
  109. syncade/persistence/last_reviewed.py +67 -0
  110. syncade/persistence/loop_manifest.py +165 -0
  111. syncade/persistence/loop_summary.py +352 -0
  112. syncade/persistence/loop_summary_text.py +428 -0
  113. syncade/persistence/producer.py +250 -0
  114. syncade/persistence/reviewer.py +198 -0
  115. syncade/persistence/round_manifest.py +238 -0
  116. syncade/persistence/run_init.py +153 -0
  117. syncade/persistence/run_summary.py +585 -0
  118. syncade/persistence/run_summary_next_steps.py +443 -0
  119. syncade/persistence/synth.py +242 -0
  120. syncade/persistence/test_run.py +152 -0
  121. syncade/presets.py +36 -0
  122. syncade/pricing_config.py +72 -0
  123. syncade/process.py +600 -0
  124. syncade/producer.py +189 -0
  125. syncade/producer_attempt.py +463 -0
  126. syncade/producer_escalation.py +146 -0
  127. syncade/producer_git.py +199 -0
  128. syncade/producer_result.py +205 -0
  129. syncade/prompts.py +448 -0
  130. syncade/prompts_loader.py +238 -0
  131. syncade/retry.py +159 -0
  132. syncade/run_inputs.py +40 -0
  133. syncade/run_status.py +198 -0
  134. syncade/selfcheck.py +471 -0
  135. syncade/skills/claude/README.md +221 -0
  136. syncade/skills/claude/SKILL.md +625 -0
  137. syncade/skills/codex/README.md +116 -0
  138. syncade/skills/codex/SKILL.md +574 -0
  139. syncade/snapshot.py +598 -0
  140. syncade/spec_audit.py +437 -0
  141. syncade/spec_audit_schema.py +190 -0
  142. syncade/spec_draft.py +423 -0
  143. syncade/spec_source.py +135 -0
  144. syncade/synthesis.py +428 -0
  145. syncade/synthesis_clusters.py +203 -0
  146. syncade/synthesis_repair.py +230 -0
  147. syncade/synthesis_schema.py +65 -0
  148. syncade/synthesizer/__init__.py +38 -0
  149. syncade/synthesizer/constants.py +33 -0
  150. syncade/synthesizer/driver.py +531 -0
  151. syncade/synthesizer/rendering.py +63 -0
  152. syncade/synthesizer/result.py +73 -0
  153. syncade/synthesizer/validation.py +421 -0
  154. syncade/synthesizer/workspace.py +208 -0
  155. syncade/templates/presets/balanced.toml +13 -0
  156. syncade/templates/presets/cheap.toml +12 -0
  157. syncade/templates/presets/thorough.toml +9 -0
  158. syncade/templates/producer.md +231 -0
  159. syncade/templates/reviewer.md +279 -0
  160. syncade/templates/reviewer_adversarial.md +164 -0
  161. syncade/templates/reviewer_codex.md +165 -0
  162. syncade/templates/spec_audit.md +168 -0
  163. syncade/templates/spec_draft.md +62 -0
  164. syncade/templates/synthesizer.md +204 -0
  165. syncade/test_runner.py +476 -0
  166. syncade/test_runner_classify.py +98 -0
  167. syncade/transcript.py +150 -0
  168. syncade/usage.py +407 -0
  169. syncade/worktree.py +497 -0
  170. syncade/worktree_env.py +133 -0
  171. syncade/worktree_paths.py +139 -0
  172. syncade-0.6.2.dist-info/METADATA +314 -0
  173. syncade-0.6.2.dist-info/RECORD +177 -0
  174. syncade-0.6.2.dist-info/WHEEL +5 -0
  175. syncade-0.6.2.dist-info/entry_points.txt +2 -0
  176. syncade-0.6.2.dist-info/licenses/LICENSE +202 -0
  177. 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.