Initial public upload from Projekte/Sidecar-Workspace (part 7)
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +3 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/AUTHORS +292 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/LICENSE +25 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/INSTALLER +1 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/METADATA +212 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/RECORD +159 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/WHEEL +5 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/entry_points.txt +3 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/licenses/LICENSE +21 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/top_level.txt +3 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/__init__.py +186 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/__main__.py +9 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/py.typed +0 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/INSTALLER +1 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/METADATA +91 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/RECORD +13 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/REQUESTED +0 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/WHEEL +5 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/direct_url.json +1 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/entry_points.txt +4 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/licenses/LICENSE +21 -0
- Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/top_level.txt +1 -0
- Sidecar-Courser/.venv/pyvenv.cfg +5 -0
- Sidecar-Courser/LICENSE +21 -0
- Sidecar-Courser/README.md +89 -0
- Sidecar-Courser/adapters/codex/README.md +26 -0
- Sidecar-Courser/config/config.toml.example +51 -0
- Sidecar-Courser/data/skill_index.json +1 -0
- Sidecar-Courser/docs/ARCHITECTURE.md +95 -0
- Sidecar-Courser/docs/EVAL_KPI.md +40 -0
- Sidecar-Courser/docs/PLUGIN_INSTALL.md +32 -0
- Sidecar-Courser/docs/TWO_PATH.md +22 -0
- Sidecar-Courser/eval/latest_report.json +205 -0
- Sidecar-Courser/eval/prompts_goldset.json +122 -0
- Sidecar-Courser/packs/default/knowledge/PROJECT.md +7 -0
- Sidecar-Courser/packs/default/knowledge/Skilluebersicht.md +55 -0
- Sidecar-Courser/packs/default/knowledge/WelcheFehlerVermeiden.md +95 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/HEAD +1 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/config +5 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/description +1 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/applypatch-msg.sample +15 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/commit-msg.sample +24 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/fsmonitor-watchman.sample +174 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/post-update.sample +8 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-applypatch.sample +14 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-commit.sample +49 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-merge-commit.sample +13 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-push.sample +53 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-rebase.sample +169 -0
- Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-receive.sample +24 -0
.gitattributes
CHANGED
|
@@ -39,3 +39,6 @@ HAI-Sidecar/.venv/bin/python3.12 filter=lfs diff=lfs merge=lfs -text
|
|
| 39 |
Sidecar-Courser/.venv/bin/python filter=lfs diff=lfs merge=lfs -text
|
| 40 |
Sidecar-Courser/.venv/bin/python3 filter=lfs diff=lfs merge=lfs -text
|
| 41 |
Sidecar-Courser/.venv/bin/python3.12 filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
Sidecar-Courser/.venv/bin/python filter=lfs diff=lfs merge=lfs -text
|
| 40 |
Sidecar-Courser/.venv/bin/python3 filter=lfs diff=lfs merge=lfs -text
|
| 41 |
Sidecar-Courser/.venv/bin/python3.12 filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
Sidecar-V6/.venv/bin/python filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
Sidecar-V6/.venv/bin/python3 filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
Sidecar-V6/.venv/bin/python3.12 filter=lfs diff=lfs merge=lfs -text
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/AUTHORS
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Pygments is written and maintained by Georg Brandl <georg@python.org>.
|
| 2 |
+
|
| 3 |
+
Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher
|
| 4 |
+
<armin.ronacher@active-4.com>.
|
| 5 |
+
|
| 6 |
+
Other contributors, listed alphabetically, are:
|
| 7 |
+
|
| 8 |
+
* Sam Aaron -- Ioke lexer
|
| 9 |
+
* Jean Abou Samra -- LilyPond lexer
|
| 10 |
+
* João Abecasis -- JSLT lexer
|
| 11 |
+
* Ali Afshar -- image formatter
|
| 12 |
+
* Thomas Aglassinger -- Easytrieve, JCL, Rexx, Transact-SQL and VBScript
|
| 13 |
+
lexers
|
| 14 |
+
* Maxence Ahlouche -- PostgreSQL Explain lexer
|
| 15 |
+
* Muthiah Annamalai -- Ezhil lexer
|
| 16 |
+
* Nikolay Antipov -- OpenSCAD lexer
|
| 17 |
+
* Kumar Appaiah -- Debian control lexer
|
| 18 |
+
* Andreas Amann -- AppleScript lexer
|
| 19 |
+
* Timothy Armstrong -- Dart lexer fixes
|
| 20 |
+
* Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers
|
| 21 |
+
* Eiríkr Åsheim -- Uxntal lexer
|
| 22 |
+
* Jeremy Ashkenas -- CoffeeScript lexer
|
| 23 |
+
* José Joaquín Atria -- Praat lexer
|
| 24 |
+
* Stefan Matthias Aust -- Smalltalk lexer
|
| 25 |
+
* Lucas Bajolet -- Nit lexer
|
| 26 |
+
* Ben Bangert -- Mako lexers
|
| 27 |
+
* Max Battcher -- Darcs patch lexer
|
| 28 |
+
* Thomas Baruchel -- APL lexer
|
| 29 |
+
* Tim Baumann -- (Literate) Agda lexer
|
| 30 |
+
* Paul Baumgart, 280 North, Inc. -- Objective-J lexer
|
| 31 |
+
* Michael Bayer -- Myghty lexers
|
| 32 |
+
* Thomas Beale -- Archetype lexers
|
| 33 |
+
* John Benediktsson -- Factor lexer
|
| 34 |
+
* David Benjamin, Google LLC -- TLS lexer
|
| 35 |
+
* Trevor Bergeron -- mIRC formatter
|
| 36 |
+
* Vincent Bernat -- LessCSS lexer
|
| 37 |
+
* Christopher Bertels -- Fancy lexer
|
| 38 |
+
* Sébastien Bigaret -- QVT Operational lexer
|
| 39 |
+
* Jarrett Billingsley -- MiniD lexer
|
| 40 |
+
* Adam Blinkinsop -- Haskell, Redcode lexers
|
| 41 |
+
* Stéphane Blondon -- Procfile, SGF and Sieve lexers
|
| 42 |
+
* Frits van Bommel -- assembler lexers
|
| 43 |
+
* Pierre Bourdon -- bugfixes
|
| 44 |
+
* Martijn Braam -- Kernel log lexer, BARE lexer
|
| 45 |
+
* JD Browne, Google LLC -- GoogleSQL lexer
|
| 46 |
+
* Matthias Bussonnier -- ANSI style handling for terminal-256 formatter
|
| 47 |
+
* chebee7i -- Python traceback lexer improvements
|
| 48 |
+
* Hiram Chirino -- Scaml and Jade lexers
|
| 49 |
+
* Mauricio Caceres -- SAS and Stata lexers.
|
| 50 |
+
* Michael Camilleri, John Gabriele, sogaiu -- Janet lexer
|
| 51 |
+
* Daren Chandisingh -- Gleam lexer
|
| 52 |
+
* Ian Cooper -- VGL lexer
|
| 53 |
+
* David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers
|
| 54 |
+
* Leaf Corcoran -- MoonScript lexer
|
| 55 |
+
* Fraser Cormack -- TableGen lexer
|
| 56 |
+
* Gabriel Corona -- ASN.1 lexer
|
| 57 |
+
* Christopher Creutzig -- MuPAD lexer
|
| 58 |
+
* Daniël W. Crompton -- Pike lexer
|
| 59 |
+
* Pete Curry -- bugfixes
|
| 60 |
+
* Bryan Davis -- EBNF lexer
|
| 61 |
+
* Bruno Deferrari -- Shen lexer
|
| 62 |
+
* Walter Dörwald -- UL4 lexer
|
| 63 |
+
* Luke Drummond -- Meson lexer
|
| 64 |
+
* Giedrius Dubinskas -- HTML formatter improvements
|
| 65 |
+
* Owen Durni -- Haxe lexer
|
| 66 |
+
* Alexander Dutton, Oxford University Computing Services -- SPARQL lexer
|
| 67 |
+
* James Edwards -- Terraform lexer
|
| 68 |
+
* Nick Efford -- Python 3 lexer
|
| 69 |
+
* Sven Efftinge -- Xtend lexer
|
| 70 |
+
* Artem Egorkine -- terminal256 formatter
|
| 71 |
+
* Matthew Fernandez -- CAmkES lexer
|
| 72 |
+
* Paweł Fertyk -- GDScript lexer, HTML formatter improvements
|
| 73 |
+
* Michael Ficarra -- CPSA lexer
|
| 74 |
+
* James H. Fisher -- PostScript lexer
|
| 75 |
+
* Amanda Fitch, Google LLC -- GoogleSQL lexer
|
| 76 |
+
* William S. Fulton -- SWIG lexer
|
| 77 |
+
* Carlos Galdino -- Elixir and Elixir Console lexers
|
| 78 |
+
* Michael Galloy -- IDL lexer
|
| 79 |
+
* Naveen Garg -- Autohotkey lexer
|
| 80 |
+
* Simon Garnotel -- FreeFem++ lexer
|
| 81 |
+
* Laurent Gautier -- R/S lexer
|
| 82 |
+
* Alex Gaynor -- PyPy log lexer
|
| 83 |
+
* Richard Gerkin -- Igor Pro lexer
|
| 84 |
+
* Alain Gilbert -- TypeScript lexer
|
| 85 |
+
* Alex Gilding -- BlitzBasic lexer
|
| 86 |
+
* GitHub, Inc -- DASM16, Augeas, TOML, and Slash lexers
|
| 87 |
+
* Bertrand Goetzmann -- Groovy lexer
|
| 88 |
+
* Krzysiek Goj -- Scala lexer
|
| 89 |
+
* Rostyslav Golda -- FloScript lexer
|
| 90 |
+
* Andrey Golovizin -- BibTeX lexers
|
| 91 |
+
* Matt Good -- Genshi, Cheetah lexers
|
| 92 |
+
* Michał Górny -- vim modeline support
|
| 93 |
+
* Alex Gosse -- TrafficScript lexer
|
| 94 |
+
* Patrick Gotthardt -- PHP namespaces support
|
| 95 |
+
* Hubert Gruniaux -- C and C++ lexer improvements
|
| 96 |
+
* Olivier Guibe -- Asymptote lexer
|
| 97 |
+
* Phil Hagelberg -- Fennel lexer
|
| 98 |
+
* Florian Hahn -- Boogie lexer
|
| 99 |
+
* Martin Harriman -- SNOBOL lexer
|
| 100 |
+
* Matthew Harrison -- SVG formatter
|
| 101 |
+
* Steven Hazel -- Tcl lexer
|
| 102 |
+
* Dan Michael Heggø -- Turtle lexer
|
| 103 |
+
* Aslak Hellesøy -- Gherkin lexer
|
| 104 |
+
* Greg Hendershott -- Racket lexer
|
| 105 |
+
* Justin Hendrick -- ParaSail lexer
|
| 106 |
+
* Jordi Gutiérrez Hermoso -- Octave lexer
|
| 107 |
+
* David Hess, Fish Software, Inc. -- Objective-J lexer
|
| 108 |
+
* Ken Hilton -- Typographic Number Theory and Arrow lexers
|
| 109 |
+
* Varun Hiremath -- Debian control lexer
|
| 110 |
+
* Rob Hoelz -- Perl 6 lexer
|
| 111 |
+
* Doug Hogan -- Mscgen lexer
|
| 112 |
+
* Ben Hollis -- Mason lexer
|
| 113 |
+
* Max Horn -- GAP lexer
|
| 114 |
+
* Fred Hornsey -- OMG IDL Lexer
|
| 115 |
+
* Alastair Houghton -- Lexer inheritance facility
|
| 116 |
+
* Tim Howard -- BlitzMax lexer
|
| 117 |
+
* Dustin Howett -- Logos lexer
|
| 118 |
+
* Ivan Inozemtsev -- Fantom lexer
|
| 119 |
+
* Hiroaki Itoh -- Shell console rewrite, Lexers for PowerShell session,
|
| 120 |
+
MSDOS session, BC, WDiff
|
| 121 |
+
* Brian R. Jackson -- Tea lexer
|
| 122 |
+
* Alex Jeffery, ChromaWay AB -- Rell lexer
|
| 123 |
+
* Christian Jann -- ShellSession lexer
|
| 124 |
+
* Jonas Camillus Jeppesen -- Line numbers and line highlighting for
|
| 125 |
+
RTF-formatter
|
| 126 |
+
* Dennis Kaarsemaker -- sources.list lexer
|
| 127 |
+
* Dmitri Kabak -- Inferno Limbo lexer
|
| 128 |
+
* Igor Kalnitsky -- vhdl lexer
|
| 129 |
+
* Colin Kennedy - USD lexer
|
| 130 |
+
* Alexander Kit -- MaskJS lexer
|
| 131 |
+
* Pekka Klärck -- Robot Framework lexer
|
| 132 |
+
* Gerwin Klein -- Isabelle lexer
|
| 133 |
+
* Eric Knibbe -- Lasso lexer
|
| 134 |
+
* Stepan Koltsov -- Clay lexer
|
| 135 |
+
* Oliver Kopp - Friendly grayscale style
|
| 136 |
+
* Adam Koprowski -- Opa lexer
|
| 137 |
+
* Benjamin Kowarsch -- Modula-2 lexer
|
| 138 |
+
* Domen Kožar -- Nix lexer
|
| 139 |
+
* Oleh Krekel -- Emacs Lisp lexer
|
| 140 |
+
* Alexander Kriegisch -- Kconfig and AspectJ lexers
|
| 141 |
+
* Marek Kubica -- Scheme lexer
|
| 142 |
+
* Jochen Kupperschmidt -- Markdown processor
|
| 143 |
+
* Gerd Kurzbach -- Modelica lexer
|
| 144 |
+
* Jon Larimer, Google Inc. -- Smali lexer
|
| 145 |
+
* Olov Lassus -- Dart lexer
|
| 146 |
+
* Matt Layman -- TAP lexer
|
| 147 |
+
* Dan Lazin, Google LLC -- GoogleSQL lexer
|
| 148 |
+
* Kristian Lyngstøl -- Varnish lexers
|
| 149 |
+
* Sylvestre Ledru -- Scilab lexer
|
| 150 |
+
* Chee Sing Lee -- Flatline lexer
|
| 151 |
+
* Mark Lee -- Vala lexer
|
| 152 |
+
* Thomas Linder Puls -- Visual Prolog lexer
|
| 153 |
+
* Pete Lomax -- Phix lexer
|
| 154 |
+
* Valentin Lorentz -- C++ lexer improvements
|
| 155 |
+
* Ben Mabey -- Gherkin lexer
|
| 156 |
+
* Angus MacArthur -- QML lexer
|
| 157 |
+
* Louis Mandel -- X10 lexer
|
| 158 |
+
* Louis Marchand -- Eiffel lexer
|
| 159 |
+
* Simone Margaritelli -- Hybris lexer
|
| 160 |
+
* Tim Martin - World of Warcraft TOC lexer
|
| 161 |
+
* Kirk McDonald -- D lexer
|
| 162 |
+
* Gordon McGregor -- SystemVerilog lexer
|
| 163 |
+
* Stephen McKamey -- Duel/JBST lexer
|
| 164 |
+
* Brian McKenna -- F# lexer
|
| 165 |
+
* Charles McLaughlin -- Puppet lexer
|
| 166 |
+
* Kurt McKee -- Tera Term macro lexer, PostgreSQL updates, MySQL overhaul, JSON lexer
|
| 167 |
+
* Joe Eli McIlvain -- Savi lexer
|
| 168 |
+
* Lukas Meuser -- BBCode formatter, Lua lexer
|
| 169 |
+
* Cat Miller -- Pig lexer
|
| 170 |
+
* Paul Miller -- LiveScript lexer
|
| 171 |
+
* Hong Minhee -- HTTP lexer
|
| 172 |
+
* Michael Mior -- Awk lexer
|
| 173 |
+
* Bruce Mitchener -- Dylan lexer rewrite
|
| 174 |
+
* Reuben Morais -- SourcePawn lexer
|
| 175 |
+
* Jon Morton -- Rust lexer
|
| 176 |
+
* Paulo Moura -- Logtalk lexer
|
| 177 |
+
* Mher Movsisyan -- DTD lexer
|
| 178 |
+
* Dejan Muhamedagic -- Crmsh lexer
|
| 179 |
+
* Adrien Nayrat -- PostgreSQL Explain lexer
|
| 180 |
+
* Ana Nelson -- Ragel, ANTLR, R console lexers
|
| 181 |
+
* David Neto, Google LLC -- WebGPU Shading Language lexer
|
| 182 |
+
* Kurt Neufeld -- Markdown lexer
|
| 183 |
+
* Nam T. Nguyen -- Monokai style
|
| 184 |
+
* Jesper Noehr -- HTML formatter "anchorlinenos"
|
| 185 |
+
* Mike Nolta -- Julia lexer
|
| 186 |
+
* Avery Nortonsmith -- Pointless lexer
|
| 187 |
+
* Jonas Obrist -- BBCode lexer
|
| 188 |
+
* Edward O'Callaghan -- Cryptol lexer
|
| 189 |
+
* David Oliva -- Rebol lexer
|
| 190 |
+
* Pat Pannuto -- nesC lexer
|
| 191 |
+
* Jon Parise -- Protocol buffers and Thrift lexers
|
| 192 |
+
* Benjamin Peterson -- Test suite refactoring
|
| 193 |
+
* Ronny Pfannschmidt -- BBCode lexer
|
| 194 |
+
* Dominik Picheta -- Nimrod lexer
|
| 195 |
+
* Andrew Pinkham -- RTF Formatter Refactoring
|
| 196 |
+
* Clément Prévost -- UrbiScript lexer
|
| 197 |
+
* Tanner Prynn -- cmdline -x option and loading lexers from files
|
| 198 |
+
* Oleh Prypin -- Crystal lexer (based on Ruby lexer)
|
| 199 |
+
* Nick Psaris -- K and Q lexers
|
| 200 |
+
* Xidorn Quan -- Web IDL lexer
|
| 201 |
+
* Elias Rabel -- Fortran fixed form lexer
|
| 202 |
+
* raichoo -- Idris lexer
|
| 203 |
+
* Daniel Ramirez -- GDScript lexer
|
| 204 |
+
* Kashif Rasul -- CUDA lexer
|
| 205 |
+
* Nathan Reed -- HLSL lexer
|
| 206 |
+
* Justin Reidy -- MXML lexer
|
| 207 |
+
* Jonathon Reinhart, Google LLC -- Soong lexer
|
| 208 |
+
* Norman Richards -- JSON lexer
|
| 209 |
+
* Corey Richardson -- Rust lexer updates
|
| 210 |
+
* Fabrizio Riguzzi -- cplint leder
|
| 211 |
+
* Lubomir Rintel -- GoodData MAQL and CL lexers
|
| 212 |
+
* Andre Roberge -- Tango style
|
| 213 |
+
* Georg Rollinger -- HSAIL lexer
|
| 214 |
+
* Michiel Roos -- TypoScript lexer
|
| 215 |
+
* Konrad Rudolph -- LaTeX formatter enhancements
|
| 216 |
+
* Mario Ruggier -- Evoque lexers
|
| 217 |
+
* Miikka Salminen -- Lovelace style, Hexdump lexer, lexer enhancements
|
| 218 |
+
* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers
|
| 219 |
+
* Matteo Sasso -- Common Lisp lexer
|
| 220 |
+
* Joe Schafer -- Ada lexer
|
| 221 |
+
* Max Schillinger -- TiddlyWiki5 lexer
|
| 222 |
+
* Andrew Schmidt -- X++ lexer
|
| 223 |
+
* Ken Schutte -- Matlab lexers
|
| 224 |
+
* René Schwaiger -- Rainbow Dash style
|
| 225 |
+
* Sebastian Schweizer -- Whiley lexer
|
| 226 |
+
* Tassilo Schweyer -- Io, MOOCode lexers
|
| 227 |
+
* Pablo Seminario -- PromQL lexer
|
| 228 |
+
* Ted Shaw -- AutoIt lexer
|
| 229 |
+
* Joerg Sieker -- ABAP lexer
|
| 230 |
+
* Robert Simmons -- Standard ML lexer
|
| 231 |
+
* Kirill Simonov -- YAML lexer
|
| 232 |
+
* Corbin Simpson -- Monte lexer
|
| 233 |
+
* Ville Skyttä -- ASCII armored lexer
|
| 234 |
+
* Alexander Smishlajev -- Visual FoxPro lexer
|
| 235 |
+
* Steve Spigarelli -- XQuery lexer
|
| 236 |
+
* Jerome St-Louis -- eC lexer
|
| 237 |
+
* Camil Staps -- Clean and NuSMV lexers; Solarized style
|
| 238 |
+
* James Strachan -- Kotlin lexer
|
| 239 |
+
* Tom Stuart -- Treetop lexer
|
| 240 |
+
* Colin Sullivan -- SuperCollider lexer
|
| 241 |
+
* Ben Swift -- Extempore lexer
|
| 242 |
+
* tatt61880 -- Kuin lexer
|
| 243 |
+
* Edoardo Tenani -- Arduino lexer
|
| 244 |
+
* Tiberius Teng -- default style overhaul
|
| 245 |
+
* Jeremy Thurgood -- Erlang, Squid config lexers
|
| 246 |
+
* Brian Tiffin -- OpenCOBOL lexer
|
| 247 |
+
* Bob Tolbert -- Hy lexer
|
| 248 |
+
* Doug Torrance -- Macaulay2 lexer
|
| 249 |
+
* Matthias Trute -- Forth lexer
|
| 250 |
+
* Tuoa Spi T4 -- Bdd lexer
|
| 251 |
+
* Erick Tryzelaar -- Felix lexer
|
| 252 |
+
* Alexander Udalov -- Kotlin lexer improvements
|
| 253 |
+
* Thomas Van Doren -- Chapel lexer
|
| 254 |
+
* Dave Van Ee -- Uxntal lexer updates
|
| 255 |
+
* Daniele Varrazzo -- PostgreSQL lexers
|
| 256 |
+
* Abe Voelker -- OpenEdge ABL lexer
|
| 257 |
+
* Pepijn de Vos -- HTML formatter CTags support
|
| 258 |
+
* Matthias Vallentin -- Bro lexer
|
| 259 |
+
* Benoît Vinot -- AMPL lexer
|
| 260 |
+
* Linh Vu Hong -- RSL lexer
|
| 261 |
+
* Taavi Väänänen -- Debian control, PHP lexers
|
| 262 |
+
* Immanuel Washington -- Smithy lexer
|
| 263 |
+
* Nathan Weizenbaum -- Haml and Sass lexers
|
| 264 |
+
* Nathan Whetsell -- Csound lexers
|
| 265 |
+
* Dietmar Winkler -- Modelica lexer
|
| 266 |
+
* Nils Winter -- Smalltalk lexer
|
| 267 |
+
* Davy Wybiral -- Clojure lexer
|
| 268 |
+
* Whitney Young -- ObjectiveC lexer
|
| 269 |
+
* Diego Zamboni -- CFengine3 lexer
|
| 270 |
+
* Enrique Zamudio -- Ceylon lexer
|
| 271 |
+
* Alex Zimin -- Nemerle lexer
|
| 272 |
+
* Rob Zimmerman -- Kal lexer
|
| 273 |
+
* Evgenii Zheltonozhskii -- Maple lexer
|
| 274 |
+
* Vincent Zurczak -- Roboconf lexer
|
| 275 |
+
* Hubert Gruniaux -- C and C++ lexer improvements
|
| 276 |
+
* Thomas Symalla -- AMDGPU Lexer
|
| 277 |
+
* 15b3 -- Image Formatter improvements
|
| 278 |
+
* Fabian Neumann -- CDDL lexer
|
| 279 |
+
* Thomas Duboucher -- CDDL lexer
|
| 280 |
+
* Philipp Imhof -- Pango Markup formatter
|
| 281 |
+
* Thomas Voss -- Sed lexer
|
| 282 |
+
* Martin Fischer -- WCAG contrast testing
|
| 283 |
+
* Marc Auberer -- Spice lexer
|
| 284 |
+
* Amr Hesham -- Carbon lexer
|
| 285 |
+
* diskdance -- Wikitext lexer
|
| 286 |
+
* vanillajonathan -- PRQL lexer
|
| 287 |
+
* Nikolay Antipov -- OpenSCAD lexer
|
| 288 |
+
* Markus Meyer, Nextron Systems -- YARA lexer
|
| 289 |
+
* Hannes Römer -- Mojo lexer
|
| 290 |
+
* Jan Frederik Schaefer -- PDDL lexer
|
| 291 |
+
|
| 292 |
+
Many thanks for all contributions!
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/LICENSE
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright (c) 2006-2022 by the respective authors (see AUTHORS file).
|
| 2 |
+
All rights reserved.
|
| 3 |
+
|
| 4 |
+
Redistribution and use in source and binary forms, with or without
|
| 5 |
+
modification, are permitted provided that the following conditions are
|
| 6 |
+
met:
|
| 7 |
+
|
| 8 |
+
* Redistributions of source code must retain the above copyright
|
| 9 |
+
notice, this list of conditions and the following disclaimer.
|
| 10 |
+
|
| 11 |
+
* Redistributions in binary form must reproduce the above copyright
|
| 12 |
+
notice, this list of conditions and the following disclaimer in the
|
| 13 |
+
documentation and/or other materials provided with the distribution.
|
| 14 |
+
|
| 15 |
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| 16 |
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| 17 |
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| 18 |
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| 19 |
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| 20 |
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| 21 |
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| 22 |
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| 23 |
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| 24 |
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| 25 |
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/INSTALLER
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
pip
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/METADATA
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: pytest
|
| 3 |
+
Version: 9.0.3
|
| 4 |
+
Summary: pytest: simple powerful testing with Python
|
| 5 |
+
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Freya Bruhin, Others (See AUTHORS)
|
| 6 |
+
License-Expression: MIT
|
| 7 |
+
Project-URL: Changelog, https://docs.pytest.org/en/stable/changelog.html
|
| 8 |
+
Project-URL: Contact, https://docs.pytest.org/en/stable/contact.html
|
| 9 |
+
Project-URL: Funding, https://docs.pytest.org/en/stable/sponsor.html
|
| 10 |
+
Project-URL: Homepage, https://docs.pytest.org/en/latest/
|
| 11 |
+
Project-URL: Source, https://github.com/pytest-dev/pytest
|
| 12 |
+
Project-URL: Tracker, https://github.com/pytest-dev/pytest/issues
|
| 13 |
+
Keywords: test,unittest
|
| 14 |
+
Classifier: Development Status :: 6 - Mature
|
| 15 |
+
Classifier: Intended Audience :: Developers
|
| 16 |
+
Classifier: Operating System :: MacOS
|
| 17 |
+
Classifier: Operating System :: Microsoft :: Windows
|
| 18 |
+
Classifier: Operating System :: POSIX
|
| 19 |
+
Classifier: Operating System :: Unix
|
| 20 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
| 21 |
+
Classifier: Programming Language :: Python :: 3.10
|
| 22 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 23 |
+
Classifier: Programming Language :: Python :: 3.12
|
| 24 |
+
Classifier: Programming Language :: Python :: 3.13
|
| 25 |
+
Classifier: Programming Language :: Python :: 3.14
|
| 26 |
+
Classifier: Topic :: Software Development :: Libraries
|
| 27 |
+
Classifier: Topic :: Software Development :: Testing
|
| 28 |
+
Classifier: Topic :: Utilities
|
| 29 |
+
Requires-Python: >=3.10
|
| 30 |
+
Description-Content-Type: text/x-rst
|
| 31 |
+
License-File: LICENSE
|
| 32 |
+
Requires-Dist: colorama>=0.4; sys_platform == "win32"
|
| 33 |
+
Requires-Dist: exceptiongroup>=1; python_version < "3.11"
|
| 34 |
+
Requires-Dist: iniconfig>=1.0.1
|
| 35 |
+
Requires-Dist: packaging>=22
|
| 36 |
+
Requires-Dist: pluggy<2,>=1.5
|
| 37 |
+
Requires-Dist: pygments>=2.7.2
|
| 38 |
+
Requires-Dist: tomli>=1; python_version < "3.11"
|
| 39 |
+
Provides-Extra: dev
|
| 40 |
+
Requires-Dist: argcomplete; extra == "dev"
|
| 41 |
+
Requires-Dist: attrs>=19.2; extra == "dev"
|
| 42 |
+
Requires-Dist: hypothesis>=3.56; extra == "dev"
|
| 43 |
+
Requires-Dist: mock; extra == "dev"
|
| 44 |
+
Requires-Dist: requests; extra == "dev"
|
| 45 |
+
Requires-Dist: setuptools; extra == "dev"
|
| 46 |
+
Requires-Dist: xmlschema; extra == "dev"
|
| 47 |
+
Dynamic: license-file
|
| 48 |
+
|
| 49 |
+
.. image:: https://github.com/pytest-dev/pytest/raw/main/doc/en/img/pytest_logo_curves.svg
|
| 50 |
+
:target: https://docs.pytest.org/en/stable/
|
| 51 |
+
:align: center
|
| 52 |
+
:height: 200
|
| 53 |
+
:alt: pytest
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
------
|
| 57 |
+
|
| 58 |
+
.. image:: https://img.shields.io/pypi/v/pytest.svg
|
| 59 |
+
:target: https://pypi.org/project/pytest/
|
| 60 |
+
|
| 61 |
+
.. image:: https://img.shields.io/conda/vn/conda-forge/pytest.svg
|
| 62 |
+
:target: https://anaconda.org/conda-forge/pytest
|
| 63 |
+
|
| 64 |
+
.. image:: https://img.shields.io/pypi/pyversions/pytest.svg
|
| 65 |
+
:target: https://pypi.org/project/pytest/
|
| 66 |
+
|
| 67 |
+
.. image:: https://codecov.io/gh/pytest-dev/pytest/branch/main/graph/badge.svg
|
| 68 |
+
:target: https://codecov.io/gh/pytest-dev/pytest
|
| 69 |
+
:alt: Code coverage Status
|
| 70 |
+
|
| 71 |
+
.. image:: https://github.com/pytest-dev/pytest/actions/workflows/test.yml/badge.svg
|
| 72 |
+
:target: https://github.com/pytest-dev/pytest/actions?query=workflow%3Atest
|
| 73 |
+
|
| 74 |
+
.. image:: https://results.pre-commit.ci/badge/github/pytest-dev/pytest/main.svg
|
| 75 |
+
:target: https://results.pre-commit.ci/latest/github/pytest-dev/pytest/main
|
| 76 |
+
:alt: pre-commit.ci status
|
| 77 |
+
|
| 78 |
+
.. image:: https://www.codetriage.com/pytest-dev/pytest/badges/users.svg
|
| 79 |
+
:target: https://www.codetriage.com/pytest-dev/pytest
|
| 80 |
+
|
| 81 |
+
.. image:: https://readthedocs.org/projects/pytest/badge/?version=latest
|
| 82 |
+
:target: https://pytest.readthedocs.io/en/latest/?badge=latest
|
| 83 |
+
:alt: Documentation Status
|
| 84 |
+
|
| 85 |
+
.. image:: https://img.shields.io/badge/Discord-pytest--dev-blue
|
| 86 |
+
:target: https://discord.com/invite/pytest-dev
|
| 87 |
+
:alt: Discord
|
| 88 |
+
|
| 89 |
+
.. image:: https://img.shields.io/badge/Libera%20chat-%23pytest-orange
|
| 90 |
+
:target: https://web.libera.chat/#pytest
|
| 91 |
+
:alt: Libera chat
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
The ``pytest`` framework makes it easy to write small tests, yet
|
| 95 |
+
scales to support complex functional testing for applications and libraries.
|
| 96 |
+
|
| 97 |
+
An example of a simple test:
|
| 98 |
+
|
| 99 |
+
.. code-block:: python
|
| 100 |
+
|
| 101 |
+
# content of test_sample.py
|
| 102 |
+
def inc(x):
|
| 103 |
+
return x + 1
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
def test_answer():
|
| 107 |
+
assert inc(3) == 5
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
To execute it::
|
| 111 |
+
|
| 112 |
+
$ pytest
|
| 113 |
+
============================= test session starts =============================
|
| 114 |
+
collected 1 items
|
| 115 |
+
|
| 116 |
+
test_sample.py F
|
| 117 |
+
|
| 118 |
+
================================== FAILURES ===================================
|
| 119 |
+
_________________________________ test_answer _________________________________
|
| 120 |
+
|
| 121 |
+
def test_answer():
|
| 122 |
+
> assert inc(3) == 5
|
| 123 |
+
E assert 4 == 5
|
| 124 |
+
E + where 4 = inc(3)
|
| 125 |
+
|
| 126 |
+
test_sample.py:5: AssertionError
|
| 127 |
+
========================== 1 failed in 0.04 seconds ===========================
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
Thanks to ``pytest``'s detailed assertion introspection, you can simply use plain ``assert`` statements. See `getting-started <https://docs.pytest.org/en/stable/getting-started.html#our-first-test-run>`_ for more examples.
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
Features
|
| 134 |
+
--------
|
| 135 |
+
|
| 136 |
+
- Detailed info on failing `assert statements <https://docs.pytest.org/en/stable/how-to/assert.html>`_ (no need to remember ``self.assert*`` names)
|
| 137 |
+
|
| 138 |
+
- `Auto-discovery
|
| 139 |
+
<https://docs.pytest.org/en/stable/explanation/goodpractices.html#python-test-discovery>`_
|
| 140 |
+
of test modules and functions
|
| 141 |
+
|
| 142 |
+
- `Modular fixtures <https://docs.pytest.org/en/stable/explanation/fixtures.html>`_ for
|
| 143 |
+
managing small or parametrized long-lived test resources
|
| 144 |
+
|
| 145 |
+
- Can run `unittest <https://docs.pytest.org/en/stable/how-to/unittest.html>`_ (or trial)
|
| 146 |
+
test suites out of the box
|
| 147 |
+
|
| 148 |
+
- Python 3.10+ or PyPy3
|
| 149 |
+
|
| 150 |
+
- Rich plugin architecture, with over 1300+ `external plugins <https://docs.pytest.org/en/latest/reference/plugin_list.html>`_ and thriving community
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
Documentation
|
| 154 |
+
-------------
|
| 155 |
+
|
| 156 |
+
For full documentation, including installation, tutorials and PDF documents, please see https://docs.pytest.org/en/stable/.
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
Bugs/Requests
|
| 160 |
+
-------------
|
| 161 |
+
|
| 162 |
+
Please use the `GitHub issue tracker <https://github.com/pytest-dev/pytest/issues>`_ to submit bugs or request features.
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
Changelog
|
| 166 |
+
---------
|
| 167 |
+
|
| 168 |
+
Consult the `Changelog <https://docs.pytest.org/en/stable/changelog.html>`__ page for fixes and enhancements of each version.
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
Support pytest
|
| 172 |
+
--------------
|
| 173 |
+
|
| 174 |
+
`Open Collective`_ is an online funding platform for open and transparent communities.
|
| 175 |
+
It provides tools to raise money and share your finances in full transparency.
|
| 176 |
+
|
| 177 |
+
It is the platform of choice for individuals and companies that want to make one-time or
|
| 178 |
+
monthly donations directly to the project.
|
| 179 |
+
|
| 180 |
+
See more details in the `pytest collective`_.
|
| 181 |
+
|
| 182 |
+
.. _Open Collective: https://opencollective.com
|
| 183 |
+
.. _pytest collective: https://opencollective.com/pytest
|
| 184 |
+
|
| 185 |
+
|
| 186 |
+
pytest for enterprise
|
| 187 |
+
---------------------
|
| 188 |
+
|
| 189 |
+
Available as part of the Tidelift Subscription.
|
| 190 |
+
|
| 191 |
+
The maintainers of pytest and thousands of other packages are working with Tidelift to deliver commercial support and
|
| 192 |
+
maintenance for the open source dependencies you use to build your applications.
|
| 193 |
+
Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.
|
| 194 |
+
|
| 195 |
+
`Learn more. <https://tidelift.com/subscription/pkg/pypi-pytest?utm_source=pypi-pytest&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>`_
|
| 196 |
+
|
| 197 |
+
Security
|
| 198 |
+
^^^^^^^^
|
| 199 |
+
|
| 200 |
+
pytest has never been associated with a security vulnerability, but in any case, to report a
|
| 201 |
+
security vulnerability please use the `Tidelift security contact <https://tidelift.com/security>`_.
|
| 202 |
+
Tidelift will coordinate the fix and disclosure.
|
| 203 |
+
|
| 204 |
+
|
| 205 |
+
License
|
| 206 |
+
-------
|
| 207 |
+
|
| 208 |
+
Copyright Holger Krekel and others, 2004.
|
| 209 |
+
|
| 210 |
+
Distributed under the terms of the `MIT`_ license, pytest is free and open source software.
|
| 211 |
+
|
| 212 |
+
.. _`MIT`: https://github.com/pytest-dev/pytest/blob/main/LICENSE
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/RECORD
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
../../../bin/py.test,sha256=ZSsSWSPbm8S3_KRCKSpAiDdZiAXCdtVUs8x_R9hqSKQ,281
|
| 2 |
+
../../../bin/pytest,sha256=ZSsSWSPbm8S3_KRCKSpAiDdZiAXCdtVUs8x_R9hqSKQ,281
|
| 3 |
+
__pycache__/py.cpython-312.pyc,,
|
| 4 |
+
_pytest/__init__.py,sha256=4IdRJhnW5XG2KlaJkOxn5_TC9WeQ5tXDSF7tbb4vEso,391
|
| 5 |
+
_pytest/__pycache__/__init__.cpython-312.pyc,,
|
| 6 |
+
_pytest/__pycache__/_argcomplete.cpython-312.pyc,,
|
| 7 |
+
_pytest/__pycache__/_version.cpython-312.pyc,,
|
| 8 |
+
_pytest/__pycache__/cacheprovider.cpython-312.pyc,,
|
| 9 |
+
_pytest/__pycache__/capture.cpython-312.pyc,,
|
| 10 |
+
_pytest/__pycache__/compat.cpython-312.pyc,,
|
| 11 |
+
_pytest/__pycache__/debugging.cpython-312.pyc,,
|
| 12 |
+
_pytest/__pycache__/deprecated.cpython-312.pyc,,
|
| 13 |
+
_pytest/__pycache__/doctest.cpython-312.pyc,,
|
| 14 |
+
_pytest/__pycache__/faulthandler.cpython-312.pyc,,
|
| 15 |
+
_pytest/__pycache__/fixtures.cpython-312.pyc,,
|
| 16 |
+
_pytest/__pycache__/freeze_support.cpython-312.pyc,,
|
| 17 |
+
_pytest/__pycache__/helpconfig.cpython-312.pyc,,
|
| 18 |
+
_pytest/__pycache__/hookspec.cpython-312.pyc,,
|
| 19 |
+
_pytest/__pycache__/junitxml.cpython-312.pyc,,
|
| 20 |
+
_pytest/__pycache__/legacypath.cpython-312.pyc,,
|
| 21 |
+
_pytest/__pycache__/logging.cpython-312.pyc,,
|
| 22 |
+
_pytest/__pycache__/main.cpython-312.pyc,,
|
| 23 |
+
_pytest/__pycache__/monkeypatch.cpython-312.pyc,,
|
| 24 |
+
_pytest/__pycache__/nodes.cpython-312.pyc,,
|
| 25 |
+
_pytest/__pycache__/outcomes.cpython-312.pyc,,
|
| 26 |
+
_pytest/__pycache__/pastebin.cpython-312.pyc,,
|
| 27 |
+
_pytest/__pycache__/pathlib.cpython-312.pyc,,
|
| 28 |
+
_pytest/__pycache__/pytester.cpython-312.pyc,,
|
| 29 |
+
_pytest/__pycache__/pytester_assertions.cpython-312.pyc,,
|
| 30 |
+
_pytest/__pycache__/python.cpython-312.pyc,,
|
| 31 |
+
_pytest/__pycache__/python_api.cpython-312.pyc,,
|
| 32 |
+
_pytest/__pycache__/raises.cpython-312.pyc,,
|
| 33 |
+
_pytest/__pycache__/recwarn.cpython-312.pyc,,
|
| 34 |
+
_pytest/__pycache__/reports.cpython-312.pyc,,
|
| 35 |
+
_pytest/__pycache__/runner.cpython-312.pyc,,
|
| 36 |
+
_pytest/__pycache__/scope.cpython-312.pyc,,
|
| 37 |
+
_pytest/__pycache__/setuponly.cpython-312.pyc,,
|
| 38 |
+
_pytest/__pycache__/setupplan.cpython-312.pyc,,
|
| 39 |
+
_pytest/__pycache__/skipping.cpython-312.pyc,,
|
| 40 |
+
_pytest/__pycache__/stash.cpython-312.pyc,,
|
| 41 |
+
_pytest/__pycache__/stepwise.cpython-312.pyc,,
|
| 42 |
+
_pytest/__pycache__/subtests.cpython-312.pyc,,
|
| 43 |
+
_pytest/__pycache__/terminal.cpython-312.pyc,,
|
| 44 |
+
_pytest/__pycache__/terminalprogress.cpython-312.pyc,,
|
| 45 |
+
_pytest/__pycache__/threadexception.cpython-312.pyc,,
|
| 46 |
+
_pytest/__pycache__/timing.cpython-312.pyc,,
|
| 47 |
+
_pytest/__pycache__/tmpdir.cpython-312.pyc,,
|
| 48 |
+
_pytest/__pycache__/tracemalloc.cpython-312.pyc,,
|
| 49 |
+
_pytest/__pycache__/unittest.cpython-312.pyc,,
|
| 50 |
+
_pytest/__pycache__/unraisableexception.cpython-312.pyc,,
|
| 51 |
+
_pytest/__pycache__/warning_types.cpython-312.pyc,,
|
| 52 |
+
_pytest/__pycache__/warnings.cpython-312.pyc,,
|
| 53 |
+
_pytest/_argcomplete.py,sha256=gh0pna66p4LVb2D8ST4568WGxvdInGT43m6slYhqNqU,3776
|
| 54 |
+
_pytest/_code/__init__.py,sha256=BKbowoYQADKjAJmTWdQ8SSQLbBBsh0-dZj3TGjtn6yM,521
|
| 55 |
+
_pytest/_code/__pycache__/__init__.cpython-312.pyc,,
|
| 56 |
+
_pytest/_code/__pycache__/code.cpython-312.pyc,,
|
| 57 |
+
_pytest/_code/__pycache__/source.cpython-312.pyc,,
|
| 58 |
+
_pytest/_code/code.py,sha256=KWjr6ZcF8iBryOHA1dyRgyBrfDSpTLxxOvjN1H3Enx4,56126
|
| 59 |
+
_pytest/_code/source.py,sha256=VvNzWHYfT96SO128m7tfIdagZ35yug46bWfgXH_5Vp8,7772
|
| 60 |
+
_pytest/_io/__init__.py,sha256=pkLF29VEFr6Dlr3eOtJL8sf47RLFt1Jf4X1DZBPlYmc,190
|
| 61 |
+
_pytest/_io/__pycache__/__init__.cpython-312.pyc,,
|
| 62 |
+
_pytest/_io/__pycache__/pprint.cpython-312.pyc,,
|
| 63 |
+
_pytest/_io/__pycache__/saferepr.cpython-312.pyc,,
|
| 64 |
+
_pytest/_io/__pycache__/terminalwriter.cpython-312.pyc,,
|
| 65 |
+
_pytest/_io/__pycache__/wcwidth.cpython-312.pyc,,
|
| 66 |
+
_pytest/_io/pprint.py,sha256=GLBKL6dmnRr92GnVMkNzMkKqx08Op7tdJSeh3AewonY,19622
|
| 67 |
+
_pytest/_io/saferepr.py,sha256=Hhx5F-75iz03hdk-WO86Bmy9RBuRHsuJj-YUzozfrgo,4082
|
| 68 |
+
_pytest/_io/terminalwriter.py,sha256=K0pB1pfAvrKBWFARKSobQ4wWi0pdmiBaGb3a_v_AAjQ,8994
|
| 69 |
+
_pytest/_io/wcwidth.py,sha256=cUEJ74UhweICwbKvU2q6noZcNgD0QlBEB9CfakGYaqA,1289
|
| 70 |
+
_pytest/_py/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 71 |
+
_pytest/_py/__pycache__/__init__.cpython-312.pyc,,
|
| 72 |
+
_pytest/_py/__pycache__/error.cpython-312.pyc,,
|
| 73 |
+
_pytest/_py/__pycache__/path.cpython-312.pyc,,
|
| 74 |
+
_pytest/_py/error.py,sha256=kGQ7F8_fZ6YVBhAx-u9mkTQBTx0qIxxnVMC0CgiOd70,3475
|
| 75 |
+
_pytest/_py/path.py,sha256=cqCn0amzKhqSqiW1Wzt4KqvFI2ncKBzGnwERUsWpC_0,49229
|
| 76 |
+
_pytest/_version.py,sha256=-KYWOkBAfqLVAg_OBZNNZ77SAe44nZD4K5wkg8OST6Q,520
|
| 77 |
+
_pytest/assertion/__init__.py,sha256=OjnJm4j6VHgwYjKvW8d-KFefjEdOSONFF4z10o9r7eg,7120
|
| 78 |
+
_pytest/assertion/__pycache__/__init__.cpython-312.pyc,,
|
| 79 |
+
_pytest/assertion/__pycache__/rewrite.cpython-312.pyc,,
|
| 80 |
+
_pytest/assertion/__pycache__/truncate.cpython-312.pyc,,
|
| 81 |
+
_pytest/assertion/__pycache__/util.cpython-312.pyc,,
|
| 82 |
+
_pytest/assertion/rewrite.py,sha256=N2rauTZyAmVShY_6ygCcvvVT8ILy5N7oes5155ZtSxA,48206
|
| 83 |
+
_pytest/assertion/truncate.py,sha256=2vOU3kS4hUZhDDL0Xaz1pM7oW_10wMc0J3b_lEbSzQI,5438
|
| 84 |
+
_pytest/assertion/util.py,sha256=YQLyQ7nYHQu0ui5SeB62KB0KjuueFyHwghGT_p1dfmM,20561
|
| 85 |
+
_pytest/cacheprovider.py,sha256=QCKdiepUSkuPNEx5DlhIQHbA413MwNUld4LIpV16FW8,23149
|
| 86 |
+
_pytest/capture.py,sha256=kulumJdRdHu7zoosOr4lfHR0ce6LsOthau9Byrw8xV4,36829
|
| 87 |
+
_pytest/compat.py,sha256=qcHcZHQyEA6TO3C0qGEgO0b_YxNu23ok0mTZ0sah6kk,10254
|
| 88 |
+
_pytest/config/__init__.py,sha256=LqRPFTnta3LrYUAtRjO5Lp_vmYlcQaxjR4YGkFFuRs8,79300
|
| 89 |
+
_pytest/config/__pycache__/__init__.cpython-312.pyc,,
|
| 90 |
+
_pytest/config/__pycache__/argparsing.cpython-312.pyc,,
|
| 91 |
+
_pytest/config/__pycache__/compat.cpython-312.pyc,,
|
| 92 |
+
_pytest/config/__pycache__/exceptions.cpython-312.pyc,,
|
| 93 |
+
_pytest/config/__pycache__/findpaths.cpython-312.pyc,,
|
| 94 |
+
_pytest/config/argparsing.py,sha256=dDjwtY9nhTQ9Q14ZbdU-EGwoQKZFuVZB1Ps0wclg5_o,20439
|
| 95 |
+
_pytest/config/compat.py,sha256=djDt_XTPwXDIgnnopti2ZVrqtwzO5hFWiMhgU5dgIM4,2947
|
| 96 |
+
_pytest/config/exceptions.py,sha256=6Vm9yzwUOxJGm17ZMGbw69v_i07mT1KmBwENM2scKhk,315
|
| 97 |
+
_pytest/config/findpaths.py,sha256=0iq92sR6c6gVBFacwMNW-gFFzlfvWNO46dX9x39gnIg,12878
|
| 98 |
+
_pytest/debugging.py,sha256=JkV7Ob7wQ53TFGkQ0Ta96jAMYGubgdXiEs39T7FPzHQ,13947
|
| 99 |
+
_pytest/deprecated.py,sha256=EikoYjqdlLTZgbBNTmFdPqiP5DdZpzAyKwRbO2hA0VE,3611
|
| 100 |
+
_pytest/doctest.py,sha256=GgjdWOxH-fV9eQoWQ7puKejcFdA1HPtG-Y7qbp-5L8c,25478
|
| 101 |
+
_pytest/faulthandler.py,sha256=1c7DpRtP0_C3zpFUSw1BORpAG8GsiDtJ9zCuWdEiLc0,4250
|
| 102 |
+
_pytest/fixtures.py,sha256=7_gKoVUCpfo4sCLy3T07p2Dv_xa5x2HnKDKZu884DeY,78681
|
| 103 |
+
_pytest/freeze_support.py,sha256=X94IxipqebeA_HgzJh8dbjqGnrtEQFuMIC5hK7SGWXw,1300
|
| 104 |
+
_pytest/helpconfig.py,sha256=6iy21oUDURGedZpB3emSzaFCxeNT_ERSkSIZLIxMJvU,10019
|
| 105 |
+
_pytest/hookspec.py,sha256=EEkjhv3tWsIXzPS-LyvXsFx5mar3AMm4POBCePIHCMQ,43019
|
| 106 |
+
_pytest/junitxml.py,sha256=1xGYlQzzO9HH3HghZ5hu4TBCf8V-IhBG5kVdx6W2PVo,25522
|
| 107 |
+
_pytest/legacypath.py,sha256=_l6v8akNMfTc5TAjvbc6M-_t157p9QE6-118WM0DRt8,16588
|
| 108 |
+
_pytest/logging.py,sha256=TZ67JQP_3Ylt0p11D2J68L_os9glsuggMvec0Hljtb8,35234
|
| 109 |
+
_pytest/main.py,sha256=fKKyDMQfv8J2G8sjHuyyaWfVU2UQNcQAAPRNcOF0tpM,42435
|
| 110 |
+
_pytest/mark/__init__.py,sha256=38H7wh2k3SZMZNZwAhPbHBxpPxYbn-wzmVtGUYigvzc,9870
|
| 111 |
+
_pytest/mark/__pycache__/__init__.cpython-312.pyc,,
|
| 112 |
+
_pytest/mark/__pycache__/expression.cpython-312.pyc,,
|
| 113 |
+
_pytest/mark/__pycache__/structures.cpython-312.pyc,,
|
| 114 |
+
_pytest/mark/expression.py,sha256=30rS65yMCdfn1UWiCP_4imfzSeWEtP_qz4_2JV3Y1-U,11244
|
| 115 |
+
_pytest/mark/structures.py,sha256=krlQ7sEUUUmFjy3yjoXA0BciTgUpklMtLqTlKOsEwac,23073
|
| 116 |
+
_pytest/monkeypatch.py,sha256=WX3_6czULhvc3wSF-0N8Vesbv9wGN3dwliYcDvT8Efs,15500
|
| 117 |
+
_pytest/nodes.py,sha256=aTsDhbLEVkZ2cgC8UXQW53bBDD5Y7l7ZNwB0kb5Nho4,26540
|
| 118 |
+
_pytest/outcomes.py,sha256=qbgHRCERDRK8W8ZAfanQf4Dp4_W7vNoc2vv3pm3HtKo,10108
|
| 119 |
+
_pytest/pastebin.py,sha256=p92zJtSNz9-xDEFzqQ3zemYggXRaDnxD6X4IyitevbA,4155
|
| 120 |
+
_pytest/pathlib.py,sha256=xIOYa8ElyypD2BTuS2_8bh6OyD4DjPfBOulkFxQ5b1Q,37879
|
| 121 |
+
_pytest/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 122 |
+
_pytest/pytester.py,sha256=x0am9bXHz3QPBTPXPylcYmfP8sGhVi5RC_KPj6g3Hn4,62389
|
| 123 |
+
_pytest/pytester_assertions.py,sha256=xX_HbFPB-Rz_NNDttTY39ft7_wZLvPgQQBVevSCeVmA,2253
|
| 124 |
+
_pytest/python.py,sha256=_SgxiiPnr7jPgXlKs8sCjdsBSN-AoUZmzIvJMgMkVh4,68754
|
| 125 |
+
_pytest/python_api.py,sha256=LzTjh4Pz25Z7wIVFDdxTQ6umqYSC5B_8GtKxu4Cvkaw,31707
|
| 126 |
+
_pytest/raises.py,sha256=86V-hoY5hYba69npyrH7r4kQNb8QjouYb8SydGLmjVc,60082
|
| 127 |
+
_pytest/recwarn.py,sha256=4a6s8WWqn-yCCHyqgnB_ffc_zkwXBGPCuvC-03L65c4,13386
|
| 128 |
+
_pytest/reports.py,sha256=LpJypnzeOLkl66JKKIsu9390HA2qItpvvOU-5uWPpB0,23230
|
| 129 |
+
_pytest/runner.py,sha256=jXhLKz4jsF9MTt0_UmPrEZZOhrbhbSyBTF_LISXcTqQ,19785
|
| 130 |
+
_pytest/scope.py,sha256=pB7jsiisth16PBFacV1Yxd3Pj3YAx2dmlSmGbG4mw6A,2738
|
| 131 |
+
_pytest/setuponly.py,sha256=BsRrC4ERDVr42-2G_L0AxhNU4XVwbMsy5S0lOvKr8wA,3167
|
| 132 |
+
_pytest/setupplan.py,sha256=l-ycFNxDZPyY52wh4f7yaqhzZ7SW1ijSKnQLmqzDZWA,1184
|
| 133 |
+
_pytest/skipping.py,sha256=WCRzHVoxF4D0GOrJoJTnzx_WOoLTsM1enlSYzG7NEnw,10810
|
| 134 |
+
_pytest/stash.py,sha256=5pE3kDx4q855TW9aVvYTdrkkKlMDU6-xiX4luKpJEgI,3090
|
| 135 |
+
_pytest/stepwise.py,sha256=kD81DrnhnclKBmMfauwQmbeMbYUvuw07w5WnNkmIdEQ,7689
|
| 136 |
+
_pytest/subtests.py,sha256=-OzOpE0j98vDWMAsI-xMJ0FcYb6inLq6YPH_0tEyU44,13241
|
| 137 |
+
_pytest/terminal.py,sha256=4v5Ab5MOeV0JAmdG6CCamnFCrHBPwKAgCvnk900hBNA,64444
|
| 138 |
+
_pytest/terminalprogress.py,sha256=_IO3vRGVATz3RkkacqIAaCUC4-Rq2pTEANUAY66dEwQ,1153
|
| 139 |
+
_pytest/threadexception.py,sha256=hTccpzZUrrQkDROVFAqHgXwAU481ca4Mq4CA4YB7my4,4953
|
| 140 |
+
_pytest/timing.py,sha256=lPcKHaM1eKHv1_2ZgUaPK9h3FhtqGvZAYucx_LSdZw0,3108
|
| 141 |
+
_pytest/tmpdir.py,sha256=slqA2yVHbP2dWOfIDolirJ45ymKDaaHbeJqcgaImHdk,12526
|
| 142 |
+
_pytest/tracemalloc.py,sha256=lCUB_YUAb6R1vqq_b-LSYSXy-Tidbn2m7tfzmWAUrjk,778
|
| 143 |
+
_pytest/unittest.py,sha256=lF52zcPqb931FoWCWC7Yi78kAWABDRkqb60VZpI1Hl4,24485
|
| 144 |
+
_pytest/unraisableexception.py,sha256=dNaBpBHkOB4pOISoaMdau2ojrGoc_i4ux76DVXLLT-w,5179
|
| 145 |
+
_pytest/warning_types.py,sha256=Vm6nG0sPUCyC3MBqHHroZXDlkU-Vvi0QTJQaaMryGJA,4398
|
| 146 |
+
_pytest/warnings.py,sha256=yJMDr7vSeij-nyTuldE7wL25ZL_LumQGY6PJZpXiQ-I,5194
|
| 147 |
+
py.py,sha256=txZ1tdmEW6CBTp6Idn-I2sOzzA0xKNoCi9Re27Uj6HE,329
|
| 148 |
+
pytest-9.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 149 |
+
pytest-9.0.3.dist-info/METADATA,sha256=w5ZvKHkWhkd7rjXlGHNtTL6ltibTp5ARIVhU4rxnAgc,7556
|
| 150 |
+
pytest-9.0.3.dist-info/RECORD,,
|
| 151 |
+
pytest-9.0.3.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
| 152 |
+
pytest-9.0.3.dist-info/entry_points.txt,sha256=8IPrHPH3LNZQ7v5tNEOcNTZYk_SheNg64jsTM9erqL4,77
|
| 153 |
+
pytest-9.0.3.dist-info/licenses/LICENSE,sha256=yoNqX57Mo7LzUCMPqiCkj7ixRWU7VWjXhIYt-GRwa5s,1091
|
| 154 |
+
pytest-9.0.3.dist-info/top_level.txt,sha256=yyhjvmXH7-JOaoQIdmNQHPuoBCxOyXS3jIths_6C8A4,18
|
| 155 |
+
pytest/__init__.py,sha256=e-eh4iGNxZoZ0a0THkq-IRcqKVCH78comJOCSHguh2Y,5582
|
| 156 |
+
pytest/__main__.py,sha256=oVDrGGo7N0TNyzXntUblcgTKbhHGWtivcX5TC7tEcKo,154
|
| 157 |
+
pytest/__pycache__/__init__.cpython-312.pyc,,
|
| 158 |
+
pytest/__pycache__/__main__.cpython-312.pyc,,
|
| 159 |
+
pytest/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: setuptools (82.0.1)
|
| 3 |
+
Root-Is-Purelib: true
|
| 4 |
+
Tag: py3-none-any
|
| 5 |
+
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/entry_points.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[console_scripts]
|
| 2 |
+
py.test = pytest:console_main
|
| 3 |
+
pytest = pytest:console_main
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/licenses/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
The MIT License (MIT)
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2004 Holger Krekel and others
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
| 6 |
+
this software and associated documentation files (the "Software"), to deal in
|
| 7 |
+
the Software without restriction, including without limitation the rights to
|
| 8 |
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
| 9 |
+
of the Software, and to permit persons to whom the Software is furnished to do
|
| 10 |
+
so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/top_level.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
_pytest
|
| 2 |
+
py
|
| 3 |
+
pytest
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/__init__.py
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# PYTHON_ARGCOMPLETE_OK
|
| 2 |
+
"""pytest: unit and functional testing with Python."""
|
| 3 |
+
|
| 4 |
+
from __future__ import annotations
|
| 5 |
+
|
| 6 |
+
from _pytest import __version__
|
| 7 |
+
from _pytest import version_tuple
|
| 8 |
+
from _pytest._code import ExceptionInfo
|
| 9 |
+
from _pytest.assertion import register_assert_rewrite
|
| 10 |
+
from _pytest.cacheprovider import Cache
|
| 11 |
+
from _pytest.capture import CaptureFixture
|
| 12 |
+
from _pytest.config import cmdline
|
| 13 |
+
from _pytest.config import Config
|
| 14 |
+
from _pytest.config import console_main
|
| 15 |
+
from _pytest.config import ExitCode
|
| 16 |
+
from _pytest.config import hookimpl
|
| 17 |
+
from _pytest.config import hookspec
|
| 18 |
+
from _pytest.config import main
|
| 19 |
+
from _pytest.config import PytestPluginManager
|
| 20 |
+
from _pytest.config import UsageError
|
| 21 |
+
from _pytest.config.argparsing import OptionGroup
|
| 22 |
+
from _pytest.config.argparsing import Parser
|
| 23 |
+
from _pytest.debugging import pytestPDB as __pytestPDB
|
| 24 |
+
from _pytest.doctest import DoctestItem
|
| 25 |
+
from _pytest.fixtures import fixture
|
| 26 |
+
from _pytest.fixtures import FixtureDef
|
| 27 |
+
from _pytest.fixtures import FixtureLookupError
|
| 28 |
+
from _pytest.fixtures import FixtureRequest
|
| 29 |
+
from _pytest.fixtures import yield_fixture
|
| 30 |
+
from _pytest.freeze_support import freeze_includes
|
| 31 |
+
from _pytest.legacypath import TempdirFactory
|
| 32 |
+
from _pytest.legacypath import Testdir
|
| 33 |
+
from _pytest.logging import LogCaptureFixture
|
| 34 |
+
from _pytest.main import Dir
|
| 35 |
+
from _pytest.main import Session
|
| 36 |
+
from _pytest.mark import HIDDEN_PARAM
|
| 37 |
+
from _pytest.mark import Mark
|
| 38 |
+
from _pytest.mark import MARK_GEN as mark
|
| 39 |
+
from _pytest.mark import MarkDecorator
|
| 40 |
+
from _pytest.mark import MarkGenerator
|
| 41 |
+
from _pytest.mark import param
|
| 42 |
+
from _pytest.monkeypatch import MonkeyPatch
|
| 43 |
+
from _pytest.nodes import Collector
|
| 44 |
+
from _pytest.nodes import Directory
|
| 45 |
+
from _pytest.nodes import File
|
| 46 |
+
from _pytest.nodes import Item
|
| 47 |
+
from _pytest.outcomes import exit
|
| 48 |
+
from _pytest.outcomes import fail
|
| 49 |
+
from _pytest.outcomes import importorskip
|
| 50 |
+
from _pytest.outcomes import skip
|
| 51 |
+
from _pytest.outcomes import xfail
|
| 52 |
+
from _pytest.pytester import HookRecorder
|
| 53 |
+
from _pytest.pytester import LineMatcher
|
| 54 |
+
from _pytest.pytester import Pytester
|
| 55 |
+
from _pytest.pytester import RecordedHookCall
|
| 56 |
+
from _pytest.pytester import RunResult
|
| 57 |
+
from _pytest.python import Class
|
| 58 |
+
from _pytest.python import Function
|
| 59 |
+
from _pytest.python import Metafunc
|
| 60 |
+
from _pytest.python import Module
|
| 61 |
+
from _pytest.python import Package
|
| 62 |
+
from _pytest.python_api import approx
|
| 63 |
+
from _pytest.raises import raises
|
| 64 |
+
from _pytest.raises import RaisesExc
|
| 65 |
+
from _pytest.raises import RaisesGroup
|
| 66 |
+
from _pytest.recwarn import deprecated_call
|
| 67 |
+
from _pytest.recwarn import WarningsRecorder
|
| 68 |
+
from _pytest.recwarn import warns
|
| 69 |
+
from _pytest.reports import CollectReport
|
| 70 |
+
from _pytest.reports import TestReport
|
| 71 |
+
from _pytest.runner import CallInfo
|
| 72 |
+
from _pytest.stash import Stash
|
| 73 |
+
from _pytest.stash import StashKey
|
| 74 |
+
from _pytest.subtests import SubtestReport
|
| 75 |
+
from _pytest.subtests import Subtests
|
| 76 |
+
from _pytest.terminal import TerminalReporter
|
| 77 |
+
from _pytest.terminal import TestShortLogReport
|
| 78 |
+
from _pytest.tmpdir import TempPathFactory
|
| 79 |
+
from _pytest.warning_types import PytestAssertRewriteWarning
|
| 80 |
+
from _pytest.warning_types import PytestCacheWarning
|
| 81 |
+
from _pytest.warning_types import PytestCollectionWarning
|
| 82 |
+
from _pytest.warning_types import PytestConfigWarning
|
| 83 |
+
from _pytest.warning_types import PytestDeprecationWarning
|
| 84 |
+
from _pytest.warning_types import PytestExperimentalApiWarning
|
| 85 |
+
from _pytest.warning_types import PytestFDWarning
|
| 86 |
+
from _pytest.warning_types import PytestRemovedIn9Warning
|
| 87 |
+
from _pytest.warning_types import PytestRemovedIn10Warning
|
| 88 |
+
from _pytest.warning_types import PytestReturnNotNoneWarning
|
| 89 |
+
from _pytest.warning_types import PytestUnhandledThreadExceptionWarning
|
| 90 |
+
from _pytest.warning_types import PytestUnknownMarkWarning
|
| 91 |
+
from _pytest.warning_types import PytestUnraisableExceptionWarning
|
| 92 |
+
from _pytest.warning_types import PytestWarning
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
set_trace = __pytestPDB.set_trace
|
| 96 |
+
|
| 97 |
+
|
| 98 |
+
__all__ = [
|
| 99 |
+
"HIDDEN_PARAM",
|
| 100 |
+
"Cache",
|
| 101 |
+
"CallInfo",
|
| 102 |
+
"CaptureFixture",
|
| 103 |
+
"Class",
|
| 104 |
+
"CollectReport",
|
| 105 |
+
"Collector",
|
| 106 |
+
"Config",
|
| 107 |
+
"Dir",
|
| 108 |
+
"Directory",
|
| 109 |
+
"DoctestItem",
|
| 110 |
+
"ExceptionInfo",
|
| 111 |
+
"ExitCode",
|
| 112 |
+
"File",
|
| 113 |
+
"FixtureDef",
|
| 114 |
+
"FixtureLookupError",
|
| 115 |
+
"FixtureRequest",
|
| 116 |
+
"Function",
|
| 117 |
+
"HookRecorder",
|
| 118 |
+
"Item",
|
| 119 |
+
"LineMatcher",
|
| 120 |
+
"LogCaptureFixture",
|
| 121 |
+
"Mark",
|
| 122 |
+
"MarkDecorator",
|
| 123 |
+
"MarkGenerator",
|
| 124 |
+
"Metafunc",
|
| 125 |
+
"Module",
|
| 126 |
+
"MonkeyPatch",
|
| 127 |
+
"OptionGroup",
|
| 128 |
+
"Package",
|
| 129 |
+
"Parser",
|
| 130 |
+
"PytestAssertRewriteWarning",
|
| 131 |
+
"PytestCacheWarning",
|
| 132 |
+
"PytestCollectionWarning",
|
| 133 |
+
"PytestConfigWarning",
|
| 134 |
+
"PytestDeprecationWarning",
|
| 135 |
+
"PytestExperimentalApiWarning",
|
| 136 |
+
"PytestFDWarning",
|
| 137 |
+
"PytestPluginManager",
|
| 138 |
+
"PytestRemovedIn9Warning",
|
| 139 |
+
"PytestRemovedIn10Warning",
|
| 140 |
+
"PytestReturnNotNoneWarning",
|
| 141 |
+
"PytestUnhandledThreadExceptionWarning",
|
| 142 |
+
"PytestUnknownMarkWarning",
|
| 143 |
+
"PytestUnraisableExceptionWarning",
|
| 144 |
+
"PytestWarning",
|
| 145 |
+
"Pytester",
|
| 146 |
+
"RaisesExc",
|
| 147 |
+
"RaisesGroup",
|
| 148 |
+
"RecordedHookCall",
|
| 149 |
+
"RunResult",
|
| 150 |
+
"Session",
|
| 151 |
+
"Stash",
|
| 152 |
+
"StashKey",
|
| 153 |
+
"SubtestReport",
|
| 154 |
+
"Subtests",
|
| 155 |
+
"TempPathFactory",
|
| 156 |
+
"TempdirFactory",
|
| 157 |
+
"TerminalReporter",
|
| 158 |
+
"TestReport",
|
| 159 |
+
"TestShortLogReport",
|
| 160 |
+
"Testdir",
|
| 161 |
+
"UsageError",
|
| 162 |
+
"WarningsRecorder",
|
| 163 |
+
"__version__",
|
| 164 |
+
"approx",
|
| 165 |
+
"cmdline",
|
| 166 |
+
"console_main",
|
| 167 |
+
"deprecated_call",
|
| 168 |
+
"exit",
|
| 169 |
+
"fail",
|
| 170 |
+
"fixture",
|
| 171 |
+
"freeze_includes",
|
| 172 |
+
"hookimpl",
|
| 173 |
+
"hookspec",
|
| 174 |
+
"importorskip",
|
| 175 |
+
"main",
|
| 176 |
+
"mark",
|
| 177 |
+
"param",
|
| 178 |
+
"raises",
|
| 179 |
+
"register_assert_rewrite",
|
| 180 |
+
"set_trace",
|
| 181 |
+
"skip",
|
| 182 |
+
"version_tuple",
|
| 183 |
+
"warns",
|
| 184 |
+
"xfail",
|
| 185 |
+
"yield_fixture",
|
| 186 |
+
]
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/__main__.py
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""The pytest entry point."""
|
| 2 |
+
|
| 3 |
+
from __future__ import annotations
|
| 4 |
+
|
| 5 |
+
import pytest
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
if __name__ == "__main__":
|
| 9 |
+
raise SystemExit(pytest.console_main())
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/py.typed
ADDED
|
File without changes
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/INSTALLER
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
pip
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/METADATA
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: sidecar-courser
|
| 3 |
+
Version: 1.0.0
|
| 4 |
+
Summary: Stateless governance hooks for AI coding agents (context injection, modes, safety gates)
|
| 5 |
+
License: MIT
|
| 6 |
+
Requires-Python: >=3.11
|
| 7 |
+
Description-Content-Type: text/markdown
|
| 8 |
+
License-File: LICENSE
|
| 9 |
+
Provides-Extra: dev
|
| 10 |
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
| 11 |
+
Dynamic: license-file
|
| 12 |
+
|
| 13 |
+
# Sidecar-Courser
|
| 14 |
+
|
| 15 |
+
**Canonical shipping repo** for the Sidecar workspace — governance hooks for AI coding agents.
|
| 16 |
+
|
| 17 |
+
## What it does
|
| 18 |
+
|
| 19 |
+
- **UserPromptSubmit** (`sidecar_courser.inject`) — keyword prefilter + optional LLM fallback → one short `additionalContext` line
|
| 20 |
+
- **PreToolUse** (`sidecar_courser.gates`) — deterministic safety gates (fail-open)
|
| 21 |
+
- **V2 two-path routing** — skill path (high precision + intent) vs alignment/guardrails (broader, deduped)
|
| 22 |
+
- **Modes** — build, plan, review, debug, learn, meta, eval, research, parallel, personal, verify
|
| 23 |
+
- **Knowledge packs** — `default` (neutral) | `personal` (opt-in)
|
| 24 |
+
|
| 25 |
+
Runtime: `/tmp/sidecar-courser/`
|
| 26 |
+
|
| 27 |
+
## Quick start
|
| 28 |
+
|
| 29 |
+
```bash
|
| 30 |
+
./scripts/install.sh
|
| 31 |
+
sidecar-courser doctor
|
| 32 |
+
sidecar-courser smoke
|
| 33 |
+
```
|
| 34 |
+
|
| 35 |
+
Claude Code: merge `/tmp/sidecar-courser-settings.json` into `~/.claude/settings.json`, or install the plugin:
|
| 36 |
+
|
| 37 |
+
```text
|
| 38 |
+
/plugin install sidecar-courser@sidecar-courser
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
(from repo root with `.claude-plugin/marketplace.json`)
|
| 42 |
+
|
| 43 |
+
## Evaluation KPIs
|
| 44 |
+
|
| 45 |
+
Targets and commands: [docs/EVAL_KPI.md](docs/EVAL_KPI.md)
|
| 46 |
+
|
| 47 |
+
```bash
|
| 48 |
+
sidecar-courser eval prompts # 20-prompt goldset, keyword-only
|
| 49 |
+
sidecar-courser eval gates
|
| 50 |
+
sidecar-courser eval all
|
| 51 |
+
```
|
| 52 |
+
|
| 53 |
+
Report: `eval/latest_report.json`
|
| 54 |
+
|
| 55 |
+
## Codex lane (no hooks)
|
| 56 |
+
|
| 57 |
+
```bash
|
| 58 |
+
sidecar-courser codex status
|
| 59 |
+
sidecar-courser codex contract "review the current diff"
|
| 60 |
+
```
|
| 61 |
+
|
| 62 |
+
See [adapters/codex/README.md](adapters/codex/README.md).
|
| 63 |
+
|
| 64 |
+
## Marketplace index (V2)
|
| 65 |
+
|
| 66 |
+
```bash
|
| 67 |
+
sidecar-courser index # downloads registry → data/skill_index.json
|
| 68 |
+
```
|
| 69 |
+
|
| 70 |
+
Requires network. Empty stub ships in `data/` until built.
|
| 71 |
+
|
| 72 |
+
## Layout
|
| 73 |
+
|
| 74 |
+
```text
|
| 75 |
+
src/sidecar_courser/ inject, gates, modes, config, cli, eval, adapters
|
| 76 |
+
packs/default/ neutral knowledge + commands
|
| 77 |
+
packs/personal/ owner-specific (SIDECAR_PACK=personal)
|
| 78 |
+
plugins/sidecar-courser/ Claude plugin bundle
|
| 79 |
+
.claude-plugin/ marketplace.json
|
| 80 |
+
eval/prompts_goldset.json
|
| 81 |
+
scripts/install.sh, build_index.py
|
| 82 |
+
```
|
| 83 |
+
|
| 84 |
+
## Workspace context
|
| 85 |
+
|
| 86 |
+
Lineage and archives: [../SOUL.md](../SOUL.md), [../README.md](../README.md).
|
| 87 |
+
Platform v2: [Sidecar-V8](../Sidecar-V8/docs/FOUNDATION.md).
|
| 88 |
+
|
| 89 |
+
## License
|
| 90 |
+
|
| 91 |
+
MIT
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/RECORD
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
../../../bin/sidecar-courser,sha256=XkQXKDQ2bDMgRzwlTdpDQ7t1a1nAgOecjkOWQlJJ8bI,278
|
| 2 |
+
../../../bin/sidecar-courser-gates,sha256=asx54Swvp8LhI-Gg7NWMlGtbJfFe8_kJgvUHCzTRzWc,280
|
| 3 |
+
../../../bin/sidecar-courser-inject,sha256=C_S-GAzimqy_YB5vPRtoP6ICMVAs6GQhNmlwNu5ICjY,281
|
| 4 |
+
__editable__.sidecar_courser-1.0.0.pth,sha256=n8kACs_c-xfA_cowdOAyXdWjTeJJoUgYEEA-mPDUxTs,60
|
| 5 |
+
sidecar_courser-1.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 6 |
+
sidecar_courser-1.0.0.dist-info/METADATA,sha256=_T96FXPCRJdXQy6K49po_uvaQsRMncr5N5mfRj_-VB0,2481
|
| 7 |
+
sidecar_courser-1.0.0.dist-info/RECORD,,
|
| 8 |
+
sidecar_courser-1.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 9 |
+
sidecar_courser-1.0.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
| 10 |
+
sidecar_courser-1.0.0.dist-info/direct_url.json,sha256=eh02Cmnm-XLho6pL5rP1Fl6dWWbT7vutD7Uj3bmwiRg,105
|
| 11 |
+
sidecar_courser-1.0.0.dist-info/entry_points.txt,sha256=g5uBxFDSODr9L1F6ZxntJKjbUuXXUrFyFUmuBaeHT2E,165
|
| 12 |
+
sidecar_courser-1.0.0.dist-info/licenses/LICENSE,sha256=W946fvWQDyZnk9NMxMPnBZ6b2K31Cb0zIuRUBUAwvrs,1086
|
| 13 |
+
sidecar_courser-1.0.0.dist-info/top_level.txt,sha256=xrmRqPhk50IikC5THFpYuT_cIBm5fRC9pXQMs5esjZQ,16
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/REQUESTED
ADDED
|
File without changes
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: setuptools (82.0.1)
|
| 3 |
+
Root-Is-Purelib: true
|
| 4 |
+
Tag: py3-none-any
|
| 5 |
+
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/direct_url.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"dir_info": {"editable": true}, "url": "file:///home/smlflg/Projekte/Sidecar-Workspace/Sidecar-Courser"}
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/entry_points.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[console_scripts]
|
| 2 |
+
sidecar-courser = sidecar_courser.cli:main
|
| 3 |
+
sidecar-courser-gates = sidecar_courser.gates:main
|
| 4 |
+
sidecar-courser-inject = sidecar_courser.inject:main
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/licenses/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2026 Samuel / Sidecar contributors
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/top_level.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
sidecar_courser
|
Sidecar-Courser/.venv/pyvenv.cfg
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
home = /usr/bin
|
| 2 |
+
include-system-site-packages = false
|
| 3 |
+
version = 3.12.3
|
| 4 |
+
executable = /usr/bin/python3.12
|
| 5 |
+
command = /home/smlflg/.openharness-venv/bin/python3 -m venv /home/smlflg/Projekte/Sidecar-Workspace/Sidecar-Courser/.venv
|
Sidecar-Courser/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2026 Samuel / Sidecar contributors
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
Sidecar-Courser/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Sidecar-Courser
|
| 2 |
+
|
| 3 |
+
**Canonical shipping repo** for the Sidecar workspace — governance hooks for AI coding agents.
|
| 4 |
+
|
| 5 |
+
## What it does
|
| 6 |
+
|
| 7 |
+
- **UserPromptSubmit** (`sidecar_courser.inject`) — keyword prefilter + optional LLM fallback → one short `additionalContext` line
|
| 8 |
+
- **PreToolUse** (`sidecar_courser.gates`) — deterministic safety gates (fail-open)
|
| 9 |
+
- **V2 two-path routing** — skill path (high precision + intent) vs alignment/guardrails (broader, deduped)
|
| 10 |
+
- **Modes** — build, plan, review, debug, learn, meta, eval, research, parallel, personal, verify
|
| 11 |
+
- **Knowledge packs** — `default` (neutral) | `personal` (opt-in)
|
| 12 |
+
|
| 13 |
+
Runtime: `/tmp/sidecar-courser/`
|
| 14 |
+
|
| 15 |
+
**Modular product:** user config at `~/.config/sidecar-courser/config.toml` (or `sidecar.toml` in project root). Toggle injection paths, safety gate subset, modes, marketplace, and terminal skills. Control plane: `sidecar-courser ui` on port **5120**.
|
| 16 |
+
|
| 17 |
+
Architecture: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
|
| 18 |
+
|
| 19 |
+
## Quick start
|
| 20 |
+
|
| 21 |
+
```bash
|
| 22 |
+
./scripts/install.sh
|
| 23 |
+
sidecar-courser doctor
|
| 24 |
+
sidecar-courser smoke
|
| 25 |
+
sidecar-courser config validate
|
| 26 |
+
sidecar-courser ui # pip install -e '.[ui]' first
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
Profiles: `sidecar-courser config profile minimal|default|personal`
|
| 30 |
+
|
| 31 |
+
Claude Code: merge `/tmp/sidecar-courser-settings.json` into `~/.claude/settings.json`, or install the plugin:
|
| 32 |
+
|
| 33 |
+
```text
|
| 34 |
+
/plugin install sidecar-courser@sidecar-courser
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
(from repo root with `.claude-plugin/marketplace.json`)
|
| 38 |
+
|
| 39 |
+
## Evaluation KPIs
|
| 40 |
+
|
| 41 |
+
Targets and commands: [docs/EVAL_KPI.md](docs/EVAL_KPI.md)
|
| 42 |
+
|
| 43 |
+
```bash
|
| 44 |
+
sidecar-courser eval prompts # 20-prompt goldset, keyword-only
|
| 45 |
+
sidecar-courser eval gates
|
| 46 |
+
sidecar-courser eval all
|
| 47 |
+
```
|
| 48 |
+
|
| 49 |
+
Report: `eval/latest_report.json`
|
| 50 |
+
|
| 51 |
+
## Codex lane (no hooks)
|
| 52 |
+
|
| 53 |
+
```bash
|
| 54 |
+
sidecar-courser codex status
|
| 55 |
+
sidecar-courser codex contract "review the current diff"
|
| 56 |
+
```
|
| 57 |
+
|
| 58 |
+
See [adapters/codex/README.md](adapters/codex/README.md).
|
| 59 |
+
|
| 60 |
+
## Marketplace index (V2)
|
| 61 |
+
|
| 62 |
+
```bash
|
| 63 |
+
sidecar-courser index # downloads registry → data/skill_index.json
|
| 64 |
+
```
|
| 65 |
+
|
| 66 |
+
Requires network. Empty stub ships in `data/` until built.
|
| 67 |
+
|
| 68 |
+
## Layout
|
| 69 |
+
|
| 70 |
+
```text
|
| 71 |
+
src/sidecar_courser/ inject (thin), inject_main, registry, routing_*, gates, modes
|
| 72 |
+
ui/ FastAPI control plane (:5120)
|
| 73 |
+
config/config.toml.example
|
| 74 |
+
packs/default/ neutral knowledge + commands
|
| 75 |
+
packs/personal/ owner-specific (SIDECAR_PACK=personal)
|
| 76 |
+
plugins/sidecar-courser/ Claude plugin bundle
|
| 77 |
+
.claude-plugin/ marketplace.json
|
| 78 |
+
eval/prompts_goldset.json
|
| 79 |
+
scripts/install.sh, build_index.py
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
## Workspace context
|
| 83 |
+
|
| 84 |
+
Lineage and archives: [../SOUL.md](../SOUL.md), [../README.md](../README.md).
|
| 85 |
+
Platform v2: [Sidecar-V8](../Sidecar-V8/docs/FOUNDATION.md).
|
| 86 |
+
|
| 87 |
+
## License
|
| 88 |
+
|
| 89 |
+
MIT
|
Sidecar-Courser/adapters/codex/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Codex integration lane
|
| 2 |
+
|
| 3 |
+
Codex has **no** Claude-style `UserPromptSubmit` hooks. Sidecar-Courser ships a separate lane:
|
| 4 |
+
|
| 5 |
+
| Component | Workspace repo | Capability |
|
| 6 |
+
|-----------|----------------|------------|
|
| 7 |
+
| Mode contracts | `CodexModeGovernorSidecar-ng-Prinzip` | One compact contract per prompt (`plan`, `build`, `review`, …) |
|
| 8 |
+
| Session replay | `codex-sidecarV1` | JSONL replay, advisory findings, optional `codex-sidecar exec` wrapper |
|
| 9 |
+
|
| 10 |
+
## CLI (from Sidecar-Courser)
|
| 11 |
+
|
| 12 |
+
```bash
|
| 13 |
+
sidecar-courser codex status
|
| 14 |
+
sidecar-courser codex contract "debug failing pytest"
|
| 15 |
+
sidecar-courser codex paths
|
| 16 |
+
```
|
| 17 |
+
|
| 18 |
+
## Install governor in a Codex project
|
| 19 |
+
|
| 20 |
+
Copy or symlink from `CodexModeGovernorSidecar-ng-Prinzip/codex-team/` into your project `.codex/` per that repo's `AGENTS.md`.
|
| 21 |
+
|
| 22 |
+
## Contract
|
| 23 |
+
|
| 24 |
+
- `supports_context_injection = false`
|
| 25 |
+
- `supports_tool_blocking = false`
|
| 26 |
+
- Advisory outputs only unless using the codex-sidecarV1 wrapper boundary
|
Sidecar-Courser/config/config.toml.example
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Copy to ~/.config/sidecar-courser/config.toml or project sidecar.toml
|
| 2 |
+
|
| 3 |
+
[core]
|
| 4 |
+
enabled = true
|
| 5 |
+
pack = "default"
|
| 6 |
+
|
| 7 |
+
[addons.injection]
|
| 8 |
+
enabled = true
|
| 9 |
+
skill_path = true
|
| 10 |
+
guardrail_path = true
|
| 11 |
+
llm_fallback = true
|
| 12 |
+
|
| 13 |
+
[addons.safety]
|
| 14 |
+
enabled = true
|
| 15 |
+
gates = [
|
| 16 |
+
"rm_rf",
|
| 17 |
+
"force_push",
|
| 18 |
+
"secret_exposure",
|
| 19 |
+
"no_apt",
|
| 20 |
+
"no_stderr_suppress",
|
| 21 |
+
"no_cd_git",
|
| 22 |
+
"no_chained_commands",
|
| 23 |
+
"read_before_edit",
|
| 24 |
+
"commit_without_tests",
|
| 25 |
+
"autonomous_git",
|
| 26 |
+
"opencode_vague",
|
| 27 |
+
"wrong_provider",
|
| 28 |
+
]
|
| 29 |
+
|
| 30 |
+
[addons.modes]
|
| 31 |
+
enabled = true
|
| 32 |
+
allowed = [
|
| 33 |
+
"build",
|
| 34 |
+
"plan",
|
| 35 |
+
"review",
|
| 36 |
+
"debug",
|
| 37 |
+
"learn",
|
| 38 |
+
"meta",
|
| 39 |
+
"eval",
|
| 40 |
+
"research",
|
| 41 |
+
"parallel",
|
| 42 |
+
"pipeline",
|
| 43 |
+
"personal",
|
| 44 |
+
"verify",
|
| 45 |
+
]
|
| 46 |
+
|
| 47 |
+
[addons.marketplace]
|
| 48 |
+
enabled = false
|
| 49 |
+
|
| 50 |
+
[addons.terminal_skills]
|
| 51 |
+
enabled = false
|
Sidecar-Courser/data/skill_index.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"skills":{},"inverted":{},"meta":{"built":null,"count":0,"note":"Run scripts/build_index.py to populate"}}
|
Sidecar-Courser/docs/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Sidecar-Courser Architecture
|
| 2 |
+
|
| 3 |
+
## Overview
|
| 4 |
+
|
| 5 |
+
Sidecar-Courser is a **stateless hook product** for Claude Code (v1): one process per hook invocation, JSON on stdin, optional JSON on stdout, session state under `/tmp/sidecar-courser/`.
|
| 6 |
+
|
| 7 |
+
```mermaid
|
| 8 |
+
flowchart LR
|
| 9 |
+
subgraph hooks [Claude Code Hooks]
|
| 10 |
+
Inject[UserPromptSubmit]
|
| 11 |
+
Gates[PreToolUse]
|
| 12 |
+
end
|
| 13 |
+
subgraph core [Courser Core]
|
| 14 |
+
Reg[registry.py config.toml]
|
| 15 |
+
Main[inject_main.py]
|
| 16 |
+
G[gates.py]
|
| 17 |
+
end
|
| 18 |
+
subgraph addons [User-toggled Add-ons]
|
| 19 |
+
Skill[skill path]
|
| 20 |
+
Guard[guardrail path]
|
| 21 |
+
LLM[LLM fallback BYOK]
|
| 22 |
+
Modes[workflow modes]
|
| 23 |
+
Mkt[marketplace index]
|
| 24 |
+
Term[terminal skills]
|
| 25 |
+
end
|
| 26 |
+
Inject --> Reg
|
| 27 |
+
Reg --> Main
|
| 28 |
+
Main --> Skill
|
| 29 |
+
Main --> Guard
|
| 30 |
+
Main --> LLM
|
| 31 |
+
Main --> Modes
|
| 32 |
+
Gates --> Reg
|
| 33 |
+
Reg --> G
|
| 34 |
+
```
|
| 35 |
+
|
| 36 |
+
## Hook I/O
|
| 37 |
+
|
| 38 |
+
| Hook | Module | stdin | stdout on match |
|
| 39 |
+
|------|--------|-------|-----------------|
|
| 40 |
+
| UserPromptSubmit | `sidecar_courser.inject` | `{prompt, session_id}` | `additionalContext` |
|
| 41 |
+
| PreToolUse | `sidecar_courser.gates` | `{tool_name, tool_input, session_id}` | `permissionDecision: deny` |
|
| 42 |
+
|
| 43 |
+
Both hooks **fail-open**: errors produce no stdout and exit 0.
|
| 44 |
+
|
| 45 |
+
## Module layout
|
| 46 |
+
|
| 47 |
+
| Module | Role |
|
| 48 |
+
|--------|------|
|
| 49 |
+
| `inject.py` | Entrypoint + test re-exports |
|
| 50 |
+
| `inject_main.py` | Orchestration (~400 LOC) |
|
| 51 |
+
| `inject_constants.py` | Paths, REGEL_MAP, provider endpoints |
|
| 52 |
+
| `routing_keywords.py` | `KEYWORD_RULES` |
|
| 53 |
+
| `routing_match.py` | Intent, skill/guardrail match, emit |
|
| 54 |
+
| `routing_marketplace.py` | `skill_index.json` scoring |
|
| 55 |
+
| `modes_dispatch.py` | Mode commands + terminal skill spawn |
|
| 56 |
+
| `llm_providers.py` | Knowledge load, provider chain, JSONL log |
|
| 57 |
+
| `registry.py` | `config.toml`, profiles, addon gates |
|
| 58 |
+
| `gates.py` | 12 safety gates (subset from config) |
|
| 59 |
+
| `config.py` | Product paths, packs |
|
| 60 |
+
| `eval/runner.py` | Frozen goldset KPIs |
|
| 61 |
+
|
| 62 |
+
## User config
|
| 63 |
+
|
| 64 |
+
Canonical path: `~/.config/sidecar-courser/config.toml`
|
| 65 |
+
Project override: `./sidecar.toml` or `./.sidecar.toml`
|
| 66 |
+
Env overrides: `SIDECAR_PACK`, `SIDECAR_GATES=0`, `SIDECAR_DISABLED=1`, `SIDECAR_EVAL_KEYWORD_ONLY=1`
|
| 67 |
+
|
| 68 |
+
Profiles (CLI): `minimal`, `default`, `personal`
|
| 69 |
+
|
| 70 |
+
Default profile preserves prior NG behavior (all gates, skill + guardrail on, marketplace off).
|
| 71 |
+
|
| 72 |
+
## Control UI
|
| 73 |
+
|
| 74 |
+
`sidecar-courser ui` serves FastAPI on **:5120** (`ui/app.py`). It only reads JSONL/runtime files and writes `config.toml` — never calls LLMs.
|
| 75 |
+
|
| 76 |
+
## Telemetry
|
| 77 |
+
|
| 78 |
+
| File | Content |
|
| 79 |
+
|------|---------|
|
| 80 |
+
| `/tmp/sidecar-courser/inject_log.jsonl` | Injections, provider, latency |
|
| 81 |
+
| `/tmp/sidecar-courser/safety_gates_log.jsonl` | Gate allow/deny |
|
| 82 |
+
| `/tmp/sidecar-courser/sidecar-courser-{session}-activemode.json` | Active mode |
|
| 83 |
+
|
| 84 |
+
## Workspace roles
|
| 85 |
+
|
| 86 |
+
| Repo | Role |
|
| 87 |
+
|------|------|
|
| 88 |
+
| **Sidecar-Courser** | Ship hooks + control plane |
|
| 89 |
+
| Sidecar-ng | Compare / bisect |
|
| 90 |
+
| Sidecar-V8-Plan | Multi-agent platform design |
|
| 91 |
+
| Sidecar-V8 | Gated v2 core (not Courser v1) |
|
| 92 |
+
|
| 93 |
+
## Explicitly not v1
|
| 94 |
+
|
| 95 |
+
Daemon, SQLite ctl, TTS/STT, GTK, 53 mechanisms, Cursor/Codex hooks in-process — optional or V8 backlog.
|
Sidecar-Courser/docs/EVAL_KPI.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Evaluation KPIs (frozen targets)
|
| 2 |
+
|
| 3 |
+
Targets for **Sidecar-Courser** v1.0. Run with:
|
| 4 |
+
|
| 5 |
+
```bash
|
| 6 |
+
sidecar-courser eval prompts # 20-prompt goldset (keyword path, no API)
|
| 7 |
+
sidecar-courser eval gates # safety gate matrix
|
| 8 |
+
```
|
| 9 |
+
|
| 10 |
+
## Prompt injection goldset (`eval/prompts_goldset.json`)
|
| 11 |
+
|
| 12 |
+
| Metric | Target | Notes |
|
| 13 |
+
|--------|--------|-------|
|
| 14 |
+
| Keyword-path accuracy | ≥ 85% | On 20 core prompts without LLM fallback |
|
| 15 |
+
| Skill-route precision | ≥ 90% | Prompts 21–28; no skill without execution intent |
|
| 16 |
+
| False injection rate | ≤ 10% | Prompts expected `KEINE` must emit nothing |
|
| 17 |
+
| p95 hook latency (keyword only) | ≤ 120 ms | Subprocess hook cold start on goldset run |
|
| 18 |
+
|
| 19 |
+
Baseline reference (Sidecar-ng live audit): ~33% precision when skills and guardrails shared one pipeline. V2 two-path routing in Courser separates skill (path A) and alignment (path B).
|
| 20 |
+
|
| 21 |
+
## Safety gates (`eval/gates_expectations.json`)
|
| 22 |
+
|
| 23 |
+
| Metric | Target |
|
| 24 |
+
|--------|--------|
|
| 25 |
+
| Block accuracy (positive cases) | 100% |
|
| 26 |
+
| Allow accuracy (negative cases) | 100% |
|
| 27 |
+
| Fail-open on malformed stdin | 100% exit 0 |
|
| 28 |
+
|
| 29 |
+
## LLM fallback (optional / BYOK)
|
| 30 |
+
|
| 31 |
+
Not part of CI gate. When API keys present:
|
| 32 |
+
|
| 33 |
+
| Metric | Soft target |
|
| 34 |
+
|--------|-------------|
|
| 35 |
+
| Provider success within chain | ≥ 95% |
|
| 36 |
+
| Injected rule length | ≤ 200 chars (configurable `SIDECAR_MAX_RULE_LEN`) |
|
| 37 |
+
|
| 38 |
+
## Reporting
|
| 39 |
+
|
| 40 |
+
`sidecar-courser eval report` writes `eval/latest_report.json` with pass/fail per case.
|
Sidecar-Courser/docs/PLUGIN_INSTALL.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Claude Code plugin install
|
| 2 |
+
|
| 3 |
+
## From this repo
|
| 4 |
+
|
| 5 |
+
1. Clone or open `Sidecar-Courser` at repo root (must contain `.claude-plugin/marketplace.json`).
|
| 6 |
+
2. In Claude Code: `/plugin marketplace add <path-to-Sidecar-Courser>`
|
| 7 |
+
3. `/plugin install sidecar-courser@sidecar-courser`
|
| 8 |
+
|
| 9 |
+
## Hooks (manual)
|
| 10 |
+
|
| 11 |
+
Merge generated settings from `./scripts/install.sh` or use:
|
| 12 |
+
|
| 13 |
+
```json
|
| 14 |
+
{
|
| 15 |
+
"hooks": {
|
| 16 |
+
"UserPromptSubmit": [{ "command": "python3 -m sidecar_courser.inject" }],
|
| 17 |
+
"PreToolUse": [{ "command": "python3 -m sidecar_courser.gates" }]
|
| 18 |
+
}
|
| 19 |
+
}
|
| 20 |
+
```
|
| 21 |
+
|
| 22 |
+
Ensure `PYTHONPATH` includes `Sidecar-Courser/src` or install the package: `pip install -e .`
|
| 23 |
+
|
| 24 |
+
## After install
|
| 25 |
+
|
| 26 |
+
```bash
|
| 27 |
+
sidecar-courser doctor
|
| 28 |
+
sidecar-courser config profile default
|
| 29 |
+
sidecar-courser ui
|
| 30 |
+
```
|
| 31 |
+
|
| 32 |
+
Optional: copy `config/config.toml.example` to `~/.config/sidecar-courser/config.toml` and tune add-ons.
|
Sidecar-Courser/docs/TWO_PATH.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Two-path routing (V2)
|
| 2 |
+
|
| 3 |
+
Implemented in `inject.py` `main()`:
|
| 4 |
+
|
| 5 |
+
1. **Critical guardrails** — git safety before skills
|
| 6 |
+
2. **Path A — Skill routing** (`_skill_route`) — strong keywords always; weak keywords require execution intent (`_has_execution_intent`); marketplace index when `data/skill_index.json` exists
|
| 7 |
+
3. **Path B — Alignment** (`_guardrail_match`) — broader keyword guardrails with session dedup (`nudges.json`)
|
| 8 |
+
4. **LLM fallback** — guardrail classification only (skipped when `SIDECAR_EVAL_KEYWORD_ONLY=1`)
|
| 9 |
+
|
| 10 |
+
## Intent detection
|
| 11 |
+
|
| 12 |
+
Bilingual verb patterns: `mach`, `starte`, `run`, `start`, `do`, `execute`, …
|
| 13 |
+
|
| 14 |
+
## Strong vs weak keywords
|
| 15 |
+
|
| 16 |
+
Configured per rule in `KEYWORD_RULES` (`"strong": true|false`).
|
| 17 |
+
|
| 18 |
+
## Marketplace
|
| 19 |
+
|
| 20 |
+
Build index: `sidecar-courser index` or `python3 scripts/build_index.py`.
|
| 21 |
+
|
| 22 |
+
Local skills in `packs/*/knowledge/commands/` always win over marketplace candidates.
|
Sidecar-Courser/eval/latest_report.json
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"prompts": {
|
| 3 |
+
"suite": "prompts_goldset",
|
| 4 |
+
"passed": 20,
|
| 5 |
+
"total": 20,
|
| 6 |
+
"accuracy": 1.0,
|
| 7 |
+
"target_accuracy": 0.85,
|
| 8 |
+
"accuracy_ok": true,
|
| 9 |
+
"p95_latency_ms": 139.5,
|
| 10 |
+
"p95_target_ms": 120,
|
| 11 |
+
"p95_ok": false,
|
| 12 |
+
"cases": [
|
| 13 |
+
{
|
| 14 |
+
"id": 1,
|
| 15 |
+
"category": "Scope Creep / Multitasking",
|
| 16 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 17 |
+
"prompt": "ja mach das gerne alles parallel, in subagents und speichere alles was sie finden ab in einen Ordner in dem Projekt, in der Haupt session stellst du mir noch weiter offene fragen, vielleicht finden die subagents noch weitere themen",
|
| 18 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] Scope-Explosion erkannt. Zerlege in Einzelaufgaben, dann eins nach dem anderen.\"}}",
|
| 19 |
+
"passed": true,
|
| 20 |
+
"latency_ms": 132.2
|
| 21 |
+
},
|
| 22 |
+
{
|
| 23 |
+
"id": 2,
|
| 24 |
+
"category": "Scope Creep / ADHS",
|
| 25 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 26 |
+
"prompt": "Da muss noch rein dass ich ADHS habe und deshalb brutal Multi Taske, da brauche ich mehr struktur oder manchmal eine Bremse",
|
| 27 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] EIN Ziel pro Session. Scope zuerst definieren, dann erst Code.\"}}",
|
| 28 |
+
"passed": true,
|
| 29 |
+
"latency_ms": 136.4
|
| 30 |
+
},
|
| 31 |
+
{
|
| 32 |
+
"id": 3,
|
| 33 |
+
"category": "Scope Creep / Multitasking",
|
| 34 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 35 |
+
"prompt": "Context und Samuel profil, muss stimmen. Subagent, Context von V4 und V5 analysieren, und subagent / research und subagent / Samuel Profil, richtig machen. Phase 4 kann noch nicht starten.",
|
| 36 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] EIN Ziel pro Session. Scope zuerst definieren, dann erst Code.\"}}",
|
| 37 |
+
"passed": true,
|
| 38 |
+
"latency_ms": 133.4
|
| 39 |
+
},
|
| 40 |
+
{
|
| 41 |
+
"id": 4,
|
| 42 |
+
"category": "Autopilot / Verstehen",
|
| 43 |
+
"expected": "Samuel-muss-verstehen-Regel",
|
| 44 |
+
"prompt": "ja, schonmal vorweg, ClaudeCode darf nicht weitermachen ohne dass ich verstehe, es soll Verständnis-Fragen stellen, Erklärungen bieten, gerade beim Submitten etc, ich kann git nicht, weil claude immer alles für mich macht",
|
| 45 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] STOPP \\u2014 Samuel muss verstehen was passiert. Erst erklaeren, dann ausfuehren.\"}}",
|
| 46 |
+
"passed": true,
|
| 47 |
+
"latency_ms": 139.5
|
| 48 |
+
},
|
| 49 |
+
{
|
| 50 |
+
"id": 5,
|
| 51 |
+
"category": "Autopilot / Delegation",
|
| 52 |
+
"expected": "Samuel-muss-verstehen-Regel",
|
| 53 |
+
"prompt": "PC neugestartet jetzt wieder schnell, schau das alles über die nacht läuft und sie die tuere Keepa API bezahlt macht, nutze MCP für Fixes wenn opencode über mcp nicht zurreichend ist config auf minimax 2.5",
|
| 54 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] STOPP \\u2014 Samuel muss verstehen was passiert. Erst erklaeren, dann ausfuehren.\"}}",
|
| 55 |
+
"passed": true,
|
| 56 |
+
"latency_ms": 120.6
|
| 57 |
+
},
|
| 58 |
+
{
|
| 59 |
+
"id": 6,
|
| 60 |
+
"category": "Autopilot / Delegation",
|
| 61 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 62 |
+
"prompt": "speichere die Pläne ab. dann kann ich das nächste mal weiter machen. Agent Team setup",
|
| 63 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] Scope-Explosion erkannt. Zerlege in Einzelaufgaben, dann eins nach dem anderen.\"}}",
|
| 64 |
+
"passed": true,
|
| 65 |
+
"latency_ms": 105.7
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
"id": 7,
|
| 69 |
+
"category": "Git / Deploy / Push",
|
| 70 |
+
"expected": "Git-Push-Warnung",
|
| 71 |
+
"prompt": "SIDECAR hat sich stark entwickelt wir bauen gerade die V3, ich will das V1 und V2 sauber auf meinem Github in eigenen Repos pushed werden, mit Readme etc, setze einen Agent Team auf",
|
| 72 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] Push-Warnung: Erst diff reviewen, Commit-Message erklaeren, dann bestaetigen.\"}}",
|
| 73 |
+
"passed": true,
|
| 74 |
+
"latency_ms": 120.2
|
| 75 |
+
},
|
| 76 |
+
{
|
| 77 |
+
"id": 8,
|
| 78 |
+
"category": "Git / Push",
|
| 79 |
+
"expected": "Git-Push-Warnung",
|
| 80 |
+
"prompt": "ist das auch so in dem Kibaba push den ich gerade gemacht habe?",
|
| 81 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] STOPP \\u2014 git status zeigen, Aenderungen erklaeren, dann erst push.\"}}",
|
| 82 |
+
"passed": true,
|
| 83 |
+
"latency_ms": 107.1
|
| 84 |
+
},
|
| 85 |
+
{
|
| 86 |
+
"id": 9,
|
| 87 |
+
"category": "Schnell/Impulsiv",
|
| 88 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 89 |
+
"prompt": "ja fix das mit Agent Teams einfach nochmal über alle schauen",
|
| 90 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] EIN Ziel pro Session. Scope zuerst definieren, dann erst Code.\"}}",
|
| 91 |
+
"passed": true,
|
| 92 |
+
"latency_ms": 124.4
|
| 93 |
+
},
|
| 94 |
+
{
|
| 95 |
+
"id": 10,
|
| 96 |
+
"category": "Schnell/Impulsiv",
|
| 97 |
+
"expected": "KEINE",
|
| 98 |
+
"prompt": "wtf, warum denn schon wieder so knapp bemessen, mach hohe limits am anfang, und dann bei bedarf nach unten justieren, works>perfection",
|
| 99 |
+
"output": "KEINE (no output)",
|
| 100 |
+
"passed": true,
|
| 101 |
+
"latency_ms": 120.1
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"id": 11,
|
| 105 |
+
"category": "Schnell/Impulsiv",
|
| 106 |
+
"expected": "Verify/Baseline-Regel",
|
| 107 |
+
"prompt": "du hast TTS Florian kaputt gemacht, ich höre ihn nicht mehr",
|
| 108 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] Baseline/Regression? Erst git log + diff pruefen, dann fixen.\"}}",
|
| 109 |
+
"passed": true,
|
| 110 |
+
"latency_ms": 112.9
|
| 111 |
+
},
|
| 112 |
+
{
|
| 113 |
+
"id": 12,
|
| 114 |
+
"category": "Schnell/Impulsiv",
|
| 115 |
+
"expected": "Verify/Baseline-Regel",
|
| 116 |
+
"prompt": "okay stoppe die Keepa sachen, checkst du das Keepa projekt ganz anders jetzt ist, ich habe es komplett neu gebaut",
|
| 117 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] Baseline/Regression? Erst git log + diff pruefen, dann fixen.\"}}",
|
| 118 |
+
"passed": true,
|
| 119 |
+
"latency_ms": 107.0
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
"id": 13,
|
| 123 |
+
"category": "Große Features",
|
| 124 |
+
"expected": "KEINE",
|
| 125 |
+
"prompt": "Tiefe Analyse wie muss SideCar aufgebaut sein, um mich beim erfolgreich sein zu unterstützen. Oder ist sidecar nur Symptombekämpfung, was würde mir wirklich helfen ein erfolgreicher Mensch zu werden, ich habe Pläne und Ziele aber auch ADHS.",
|
| 126 |
+
"output": "KEINE (no output)",
|
| 127 |
+
"passed": true,
|
| 128 |
+
"latency_ms": 123.9
|
| 129 |
+
},
|
| 130 |
+
{
|
| 131 |
+
"id": 14,
|
| 132 |
+
"category": "Große Features",
|
| 133 |
+
"expected": "KEINE",
|
| 134 |
+
"prompt": "wie schwer/einfach wäre es weitere Agents/AgentHarnesse zu integrieren, liegt der Fokus auf dem LLM im Agent oder auf dem LLM wie es das Harness verwendet? Man kann ja verschiedene LLMs in verschiedene Harnesses packen.",
|
| 135 |
+
"output": "KEINE (no output)",
|
| 136 |
+
"passed": true,
|
| 137 |
+
"latency_ms": 119.0
|
| 138 |
+
},
|
| 139 |
+
{
|
| 140 |
+
"id": 15,
|
| 141 |
+
"category": "Große Features",
|
| 142 |
+
"expected": "KEINE",
|
| 143 |
+
"prompt": "wir können alle keyboard sammeln, weil man online Arbitrage Handel auch von anderen Ländern in andere Länder machen kann, wir haben jetzt nur mal testweise mit qwertz -> deutschland angefangen aber unsere Daten Struktur könnte alle Länder und Layouts b",
|
| 144 |
+
"output": "KEINE (no output)",
|
| 145 |
+
"passed": true,
|
| 146 |
+
"latency_ms": 111.1
|
| 147 |
+
},
|
| 148 |
+
{
|
| 149 |
+
"id": 16,
|
| 150 |
+
"category": "Recherche",
|
| 151 |
+
"expected": "Gemini-zuerst / Verify",
|
| 152 |
+
"prompt": "Bauplan V6 (V6 ist gebaut) checken / kontrollieren / beobachten / ob alles so wie geplant durch meine Anforderungen umgesetzt wurde",
|
| 153 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] Baseline/Regression? Erst git log + diff pruefen, dann fixen.\"}}",
|
| 154 |
+
"passed": true,
|
| 155 |
+
"latency_ms": 93.1
|
| 156 |
+
},
|
| 157 |
+
{
|
| 158 |
+
"id": 17,
|
| 159 |
+
"category": "Müde / Session-Ende",
|
| 160 |
+
"expected": "SKILL: recap",
|
| 161 |
+
"prompt": "ich bin so müde, was war nochmal der stand von allem, ich bin kurz vorm finalen commit",
|
| 162 |
+
"output": "{\"hookSpecificOutput\": {\"hookEventName\": \"UserPromptSubmit\", \"additionalContext\": \"[SIDECAR-COURSER] Skill 'recap' wird im Hintergrund von einem Haiku-Prozess ausgefuehrt (Recap). Du musst nichts tun.\"}}",
|
| 163 |
+
"passed": true,
|
| 164 |
+
"latency_ms": 81.0
|
| 165 |
+
},
|
| 166 |
+
{
|
| 167 |
+
"id": 18,
|
| 168 |
+
"category": "Müde / Session-Ende",
|
| 169 |
+
"expected": "KEINE",
|
| 170 |
+
"prompt": "okay kann ich schon schlafen gehen?",
|
| 171 |
+
"output": "KEINE (no output)",
|
| 172 |
+
"passed": true,
|
| 173 |
+
"latency_ms": 98.9
|
| 174 |
+
},
|
| 175 |
+
{
|
| 176 |
+
"id": 19,
|
| 177 |
+
"category": "Off-Topic",
|
| 178 |
+
"expected": "KEINE",
|
| 179 |
+
"prompt": "Ach, ich mache immer dumme Fehler beim Programmieren. Ich habe jetzt beim Umrechnen der Formeln ein Komma verwendet statt einen Punkt",
|
| 180 |
+
"output": "KEINE (no output)",
|
| 181 |
+
"passed": true,
|
| 182 |
+
"latency_ms": 90.9
|
| 183 |
+
},
|
| 184 |
+
{
|
| 185 |
+
"id": 20,
|
| 186 |
+
"category": "Off-Topic",
|
| 187 |
+
"expected": "KEINE",
|
| 188 |
+
"prompt": "Welche börsen notierten Unternehmen profitieren langfristig besonders von der Deutschen Bahn/SBB/SNCF",
|
| 189 |
+
"output": "KEINE (no output)",
|
| 190 |
+
"passed": true,
|
| 191 |
+
"latency_ms": 95.3
|
| 192 |
+
}
|
| 193 |
+
]
|
| 194 |
+
},
|
| 195 |
+
"gates": {
|
| 196 |
+
"suite": "safety_gates",
|
| 197 |
+
"passed": true,
|
| 198 |
+
"accuracy": 1.0,
|
| 199 |
+
"target_accuracy": 1.0,
|
| 200 |
+
"accuracy_ok": true,
|
| 201 |
+
"returncode": 0,
|
| 202 |
+
"stdout_tail": "w allow\n 32 [PASS] heredoc with operators allow allow\n 33 [PASS] subshell with semicolon allow allow\n 34 [PASS] git commit AFTER git status but no tests (should block) gate_commit_without_tests gate_commit_without_tests\n 35 [PASS] normal git push (after status, should allow) allow allow\n 36 [PASS] git push origin main (after diff, should allow) allow allow\n 37 [PASS] Edit without prior Read (should block) gate_read_before_edit gate_read_before_edit\n 38 [PASS] Edit AFTER Read same file (should allow) allow allow\n 39 [PASS] git commit without prior test run (should block) gate_commit_without_tests gate_commit_without_tests\n 40 [PASS] git commit AFTER pytest + git status (should allow) allow allow\n 41 [PASS] [GATES=0] rm -rf without CONFIRMED allow allow\n 42 [PASS] [GATES=0] rm -r src directory allow allow\n 43 [PASS] [GATES=0] git push --force allow allow\n 44 [PASS] malformed JSON input (should fail-open) allow allow\n\n============================================================\nTOTAL: 44\nCORRECT: 44\nACCURACY: 100.0%\nFALSE POSITIVES: 0 (0.0%)\nFALSE NEGATIVES: 0 (0.0%)\n\nPer-Gate:\n gate_commit_without_tests 3/3 correct\n gate_force_push 2/2 correct\n gate_no_apt 2/2 correct\n gate_no_cd_git 2/2 correct\n gate_no_chained_commands 2/2 correct\n gate_no_stderr_suppress 2/2 correct\n gate_opencode_vague 2/2 correct\n gate_read_before_edit 1/1 correct\n gate_rm_rf 2/2 correct\n gate_secret_exposure 2/2 correct\n gate_wrong_provider 1/1 correct\n============================================================\n\nResult saved to: /home/smlflg/Projekte/Sidecar-Workspace/Sidecar-Courser/safety_gates_eval_result.json\n",
|
| 203 |
+
"stderr_tail": ""
|
| 204 |
+
}
|
| 205 |
+
}
|
Sidecar-Courser/eval/prompts_goldset.json
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"id": 1,
|
| 4 |
+
"category": "Scope Creep / Multitasking",
|
| 5 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 6 |
+
"prompt": "ja mach das gerne alles parallel, in subagents und speichere alles was sie finden ab in einen Ordner in dem Projekt, in der Haupt session stellst du mir noch weiter offene fragen, vielleicht finden die subagents noch weitere themen"
|
| 7 |
+
},
|
| 8 |
+
{
|
| 9 |
+
"id": 2,
|
| 10 |
+
"category": "Scope Creep / ADHS",
|
| 11 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 12 |
+
"prompt": "Da muss noch rein dass ich ADHS habe und deshalb brutal Multi Taske, da brauche ich mehr struktur oder manchmal eine Bremse"
|
| 13 |
+
},
|
| 14 |
+
{
|
| 15 |
+
"id": 3,
|
| 16 |
+
"category": "Scope Creep / Multitasking",
|
| 17 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 18 |
+
"prompt": "Context und Samuel profil, muss stimmen. Subagent, Context von V4 und V5 analysieren, und subagent / research und subagent / Samuel Profil, richtig machen. Phase 4 kann noch nicht starten."
|
| 19 |
+
},
|
| 20 |
+
{
|
| 21 |
+
"id": 4,
|
| 22 |
+
"category": "Autopilot / Verstehen",
|
| 23 |
+
"expected": "Samuel-muss-verstehen-Regel",
|
| 24 |
+
"prompt": "ja, schonmal vorweg, ClaudeCode darf nicht weitermachen ohne dass ich verstehe, es soll Verständnis-Fragen stellen, Erklärungen bieten, gerade beim Submitten etc, ich kann git nicht, weil claude immer alles für mich macht"
|
| 25 |
+
},
|
| 26 |
+
{
|
| 27 |
+
"id": 5,
|
| 28 |
+
"category": "Autopilot / Delegation",
|
| 29 |
+
"expected": "Samuel-muss-verstehen-Regel",
|
| 30 |
+
"prompt": "PC neugestartet jetzt wieder schnell, schau das alles über die nacht läuft und sie die tuere Keepa API bezahlt macht, nutze MCP für Fixes wenn opencode über mcp nicht zurreichend ist config auf minimax 2.5"
|
| 31 |
+
},
|
| 32 |
+
{
|
| 33 |
+
"id": 6,
|
| 34 |
+
"category": "Autopilot / Delegation",
|
| 35 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 36 |
+
"prompt": "speichere die Pläne ab. dann kann ich das nächste mal weiter machen. Agent Team setup"
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"id": 7,
|
| 40 |
+
"category": "Git / Deploy / Push",
|
| 41 |
+
"expected": "Git-Push-Warnung",
|
| 42 |
+
"prompt": "SIDECAR hat sich stark entwickelt wir bauen gerade die V3, ich will das V1 und V2 sauber auf meinem Github in eigenen Repos pushed werden, mit Readme etc, setze einen Agent Team auf"
|
| 43 |
+
},
|
| 44 |
+
{
|
| 45 |
+
"id": 8,
|
| 46 |
+
"category": "Git / Push",
|
| 47 |
+
"expected": "Git-Push-Warnung",
|
| 48 |
+
"prompt": "ist das auch so in dem Kibaba push den ich gerade gemacht habe?"
|
| 49 |
+
},
|
| 50 |
+
{
|
| 51 |
+
"id": 9,
|
| 52 |
+
"category": "Schnell/Impulsiv",
|
| 53 |
+
"expected": "Focus/EIN-Ziel-Regel",
|
| 54 |
+
"prompt": "ja fix das mit Agent Teams einfach nochmal über alle schauen"
|
| 55 |
+
},
|
| 56 |
+
{
|
| 57 |
+
"id": 10,
|
| 58 |
+
"category": "Schnell/Impulsiv",
|
| 59 |
+
"expected": "KEINE",
|
| 60 |
+
"prompt": "wtf, warum denn schon wieder so knapp bemessen, mach hohe limits am anfang, und dann bei bedarf nach unten justieren, works>perfection"
|
| 61 |
+
},
|
| 62 |
+
{
|
| 63 |
+
"id": 11,
|
| 64 |
+
"category": "Schnell/Impulsiv",
|
| 65 |
+
"expected": "Verify/Baseline-Regel",
|
| 66 |
+
"prompt": "du hast TTS Florian kaputt gemacht, ich höre ihn nicht mehr"
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"id": 12,
|
| 70 |
+
"category": "Schnell/Impulsiv",
|
| 71 |
+
"expected": "Verify/Baseline-Regel",
|
| 72 |
+
"prompt": "okay stoppe die Keepa sachen, checkst du das Keepa projekt ganz anders jetzt ist, ich habe es komplett neu gebaut"
|
| 73 |
+
},
|
| 74 |
+
{
|
| 75 |
+
"id": 13,
|
| 76 |
+
"category": "Große Features",
|
| 77 |
+
"expected": "KEINE",
|
| 78 |
+
"prompt": "Tiefe Analyse wie muss SideCar aufgebaut sein, um mich beim erfolgreich sein zu unterstützen. Oder ist sidecar nur Symptombekämpfung, was würde mir wirklich helfen ein erfolgreicher Mensch zu werden, ich habe Pläne und Ziele aber auch ADHS."
|
| 79 |
+
},
|
| 80 |
+
{
|
| 81 |
+
"id": 14,
|
| 82 |
+
"category": "Große Features",
|
| 83 |
+
"expected": "KEINE",
|
| 84 |
+
"prompt": "wie schwer/einfach wäre es weitere Agents/AgentHarnesse zu integrieren, liegt der Fokus auf dem LLM im Agent oder auf dem LLM wie es das Harness verwendet? Man kann ja verschiedene LLMs in verschiedene Harnesses packen."
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
"id": 15,
|
| 88 |
+
"category": "Große Features",
|
| 89 |
+
"expected": "KEINE",
|
| 90 |
+
"prompt": "wir können alle keyboard sammeln, weil man online Arbitrage Handel auch von anderen Ländern in andere Länder machen kann, wir haben jetzt nur mal testweise mit qwertz -> deutschland angefangen aber unsere Daten Struktur könnte alle Länder und Layouts b"
|
| 91 |
+
},
|
| 92 |
+
{
|
| 93 |
+
"id": 16,
|
| 94 |
+
"category": "Recherche",
|
| 95 |
+
"expected": "Gemini-zuerst / Verify",
|
| 96 |
+
"prompt": "Bauplan V6 (V6 ist gebaut) checken / kontrollieren / beobachten / ob alles so wie geplant durch meine Anforderungen umgesetzt wurde"
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
"id": 17,
|
| 100 |
+
"category": "Müde / Session-Ende",
|
| 101 |
+
"expected": "SKILL: recap",
|
| 102 |
+
"prompt": "ich bin so müde, was war nochmal der stand von allem, ich bin kurz vorm finalen commit"
|
| 103 |
+
},
|
| 104 |
+
{
|
| 105 |
+
"id": 18,
|
| 106 |
+
"category": "Müde / Session-Ende",
|
| 107 |
+
"expected": "KEINE",
|
| 108 |
+
"prompt": "okay kann ich schon schlafen gehen?"
|
| 109 |
+
},
|
| 110 |
+
{
|
| 111 |
+
"id": 19,
|
| 112 |
+
"category": "Off-Topic",
|
| 113 |
+
"expected": "KEINE",
|
| 114 |
+
"prompt": "Ach, ich mache immer dumme Fehler beim Programmieren. Ich habe jetzt beim Umrechnen der Formeln ein Komma verwendet statt einen Punkt"
|
| 115 |
+
},
|
| 116 |
+
{
|
| 117 |
+
"id": 20,
|
| 118 |
+
"category": "Off-Topic",
|
| 119 |
+
"expected": "KEINE",
|
| 120 |
+
"prompt": "Welche börsen notierten Unternehmen profitieren langfristig besonders von der Deutschen Bahn/SBB/SNCF"
|
| 121 |
+
}
|
| 122 |
+
]
|
Sidecar-Courser/packs/default/knowledge/PROJECT.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Project rules (default pack)
|
| 2 |
+
|
| 3 |
+
- One primary goal per session; define scope before large edits.
|
| 4 |
+
- Prefer small diffs and existing conventions over new abstractions.
|
| 5 |
+
- Run relevant tests after behavior changes.
|
| 6 |
+
- Explain destructive or wide-reaching commands before executing them.
|
| 7 |
+
- Do not commit secrets, credentials, or `.env` files.
|
Sidecar-Courser/packs/default/knowledge/Skilluebersicht.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Skilluebersicht
|
| 2 |
+
|
| 3 |
+
## Coding & Delegation
|
| 4 |
+
|
| 5 |
+
| Skill | Was es tut | Kosten |
|
| 6 |
+
|-------|-----------|--------|
|
| 7 |
+
| `/chef` | Delegation an OpenCode MCP mit Context-Gathering | ~$3 (Sonnet) |
|
| 8 |
+
| `/chef-lite` | Direkter OpenCode-Call ohne Context-Gathering | ~$3 (Sonnet) |
|
| 9 |
+
| `/chef-async` | Wie /chef aber non-blocking | ~$3 (Sonnet) |
|
| 10 |
+
| `/chef-subagent` | Haiku-SubAgent der OpenCode steuert | ~$0.25 + $3 |
|
| 11 |
+
| `/batch` | Mehrere Tasks in EINEN opencode_run Call | ~$3 (Sonnet) |
|
| 12 |
+
| `/auto` | Smart auto-delegation | variabel |
|
| 13 |
+
|
| 14 |
+
## Research & Analyse
|
| 15 |
+
|
| 16 |
+
| Skill | Was es tut | Kosten |
|
| 17 |
+
|-------|-----------|--------|
|
| 18 |
+
| `/research` | Gemini MCP Deep Web Research | ~$0.10 (Flash) |
|
| 19 |
+
| `/research-subagent` | Gemini-Research als Haiku-SubAgent | ~$0.25 (Haiku) |
|
| 20 |
+
| `/research-swarm` | 3 parallele Gemini-Agents | ~$0.30 (3x Flash) |
|
| 21 |
+
| `/swarm` | 3 parallele Haiku-Analyzer fuer Dokumentanalyse | ~$0.75 (3x Haiku) |
|
| 22 |
+
|
| 23 |
+
## Testing
|
| 24 |
+
|
| 25 |
+
| Skill | Was es tut | Kosten |
|
| 26 |
+
|-------|-----------|--------|
|
| 27 |
+
| `/test` | Cascading Test Pipeline mit Auto-Fix-Loop | ~$3 (Sonnet) |
|
| 28 |
+
| `/test-crew` | Multi-Agent: Gemini plant, OpenCode fuehrt aus | ~$0.27 |
|
| 29 |
+
|
| 30 |
+
## Utilities
|
| 31 |
+
|
| 32 |
+
| Skill | Was es tut | Kosten |
|
| 33 |
+
|-------|-----------|--------|
|
| 34 |
+
| `/check-state` | pwd, ls, git status | $0 |
|
| 35 |
+
| `/validate-config` | Config pruefen + Backup | $0 |
|
| 36 |
+
| `/snapshot` | Projekt-Uebersicht | $0 |
|
| 37 |
+
| `/review` | Code Review der Aenderungen | ~$3 |
|
| 38 |
+
| `/debug-loop` | Max 5 Iterationen: Diagnose → Fix → Test | ~$3 |
|
| 39 |
+
| `/recap` | Session zusammenfassen | $0 |
|
| 40 |
+
| `/quickwin` | 3 kleine sofort-Tasks | $0 |
|
| 41 |
+
| `/checkpoint` | Git-Snapshot + Summary | $0 |
|
| 42 |
+
| `/learn` | Nach Vibe-Coding: Kernfunktionen erklaeren | $0 |
|
| 43 |
+
| `/focus` | Session-Discipline: EIN Ziel | $0 |
|
| 44 |
+
|
| 45 |
+
## Kosten-Ranking
|
| 46 |
+
|
| 47 |
+
```
|
| 48 |
+
$0.00 /check-state, /validate-config, /snapshot, /recap, /quickwin, /checkpoint, /learn, /focus
|
| 49 |
+
$0.10 /research (Gemini Flash)
|
| 50 |
+
$0.30 /research-swarm (3x Flash)
|
| 51 |
+
$0.75 /swarm (3x Haiku)
|
| 52 |
+
$3.00 /chef, /chef-lite, /test, /review, /debug-loop
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
**Faustregel:** Recherche mit Gemini (~$0.10), Code mit OpenCode (~$3), Strategie mit Claude (~$15).
|
Sidecar-Courser/packs/default/knowledge/WelcheFehlerVermeiden.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Welche Fehler vermeiden?
|
| 2 |
+
|
| 3 |
+
## REGEL NULL: STOPP wenn Samuel auf Autopilot schaltet
|
| 4 |
+
Trigger: Samuel sagt "mach einfach", "ist mir egal", "ich schau spaeter",
|
| 5 |
+
"kuemmere dich drum", "mach du mal" ODER Claude will komplexe Git-Ops
|
| 6 |
+
(rebase, merge, force-push) ohne Erklaerung starten.
|
| 7 |
+
→ STOPP und erklaeren bevor ausgefuehrt wird.
|
| 8 |
+
|
| 9 |
+
Claude darf NICHT einfach weitermachen ohne dass Samuel versteht was passiert.
|
| 10 |
+
|
| 11 |
+
### Was Claude tun MUSS:
|
| 12 |
+
|
| 13 |
+
**Bei jedem nicht-trivialen Schritt:**
|
| 14 |
+
1. **Erklaeren BEVOR ausfuehren** — "Ich wuerde jetzt X machen, weil Y."
|
| 15 |
+
2. **Verstaendnis-Fragen stellen** — "Weisst du was ein rebase ist?"
|
| 16 |
+
3. **Nicht einfach durchrattern** — Lieber eine Frage zu viel
|
| 17 |
+
|
| 18 |
+
**Besonders bei Git:**
|
| 19 |
+
- Vor jedem `git commit`: Aenderungen + Message erklaeren
|
| 20 |
+
- Vor jedem `git push`: "Das schickt Code ins Internet. Sicher?"
|
| 21 |
+
- Bei Merge/Rebase: IMMER erst erklaeren, Analogie nutzen
|
| 22 |
+
|
| 23 |
+
**Lern-Momente aktiv schaffen:**
|
| 24 |
+
- "Das war ein typischer [Konzept]-Fall. Merke dir: ..."
|
| 25 |
+
- "Tipp: Das kannst du auch ohne mich mit: `git status`"
|
| 26 |
+
|
| 27 |
+
## Top 10 Fehler
|
| 28 |
+
|
| 29 |
+
### KRITISCH
|
| 30 |
+
|
| 31 |
+
#### #1: Task Incompletion Loop
|
| 32 |
+
- 74 Sessions angefangen, <20 fertig (<30% Completion Rate)
|
| 33 |
+
- Pro Session: EIN Ziel, klar definiert. Max 2-3 parallele Sessions.
|
| 34 |
+
- TRIGGER-WOERTER: "alles parallel", "gleichzeitig", "nebenbei", "und ausserdem",
|
| 35 |
+
"schnell noch", "mach das gerne alles", >3 verschiedene Auftraege in einem Prompt
|
| 36 |
+
|
| 37 |
+
#### #2: Zombie-Prozesse
|
| 38 |
+
- Background-Tasks gestartet, nie bereinigt
|
| 39 |
+
- Nach jedem fire: Timer setzen, check nach 5min
|
| 40 |
+
|
| 41 |
+
#### #3: BUILD_SPECS ohne Execution
|
| 42 |
+
- 5 Specs geschrieben, 0 implementiert
|
| 43 |
+
- Regel: Code First, Docs Second
|
| 44 |
+
|
| 45 |
+
#### #3b: Scope vor Code
|
| 46 |
+
- Bei grossen Features: Scope definieren und in Teilaufgaben zerlegen BEVOR Code geschrieben wird
|
| 47 |
+
- Nicht "schreib mir ein komplettes auth system" sondern: Was genau? Login? OAuth? Session-Management?
|
| 48 |
+
|
| 49 |
+
#### #4: API Keys, Tokens und Secrets NIEMALS in Config-Dateien
|
| 50 |
+
- NICHT in settings.json, .env, config.yaml, config.json oder andere Config-Dateien
|
| 51 |
+
- Stattdessen: ~/.env.local oder Umgebungsvariablen
|
| 52 |
+
|
| 53 |
+
### HOCH
|
| 54 |
+
|
| 55 |
+
#### #5: Delegation ohne Context = Garbage-In
|
| 56 |
+
- Vor JEDEM /chef: gather-context.sh ausfuehren
|
| 57 |
+
|
| 58 |
+
#### #6: CLAUDE.md Bloat
|
| 59 |
+
- Max ~86 Zeilen, Rest auslagern
|
| 60 |
+
|
| 61 |
+
#### #7: Kosten-Wissen ohne Kosten-Disziplin
|
| 62 |
+
- /research (Gemini) IMMER zuerst
|
| 63 |
+
|
| 64 |
+
#### #8: 30 TODO-Dateien ohne Review
|
| 65 |
+
- EINE TODO_CURRENT.md statt 30 UUID-Dateien
|
| 66 |
+
|
| 67 |
+
#### #9: Dokumentation statt Execution
|
| 68 |
+
- 80% Coding, 20% Dokumentation
|
| 69 |
+
|
| 70 |
+
#### #10: Keine Baseline vor Aenderungen
|
| 71 |
+
- Vor JEDER Aenderung an Config/Settings: Datei zuerst lesen und pruefen ob Keys/Werte existieren
|
| 72 |
+
- Session-Start: /check-state. Session-Ende: git diff gegen Start.
|
| 73 |
+
|
| 74 |
+
## External API & Bug Fix Chain
|
| 75 |
+
|
| 76 |
+
1. Fehlermeldung lesen — was sagt sie GENAU?
|
| 77 |
+
2. Gemini fragen: korrekter Endpoint
|
| 78 |
+
3. Dann erst OpenCode mit Fakten delegieren
|
| 79 |
+
|
| 80 |
+
**Verbotene Woerter in Delegation-Prompts:** "try", "maybe", "might", "possibly", "I think", "should be", "probably"
|
| 81 |
+
|
| 82 |
+
## Anti-Pattern Checkliste
|
| 83 |
+
|
| 84 |
+
| Pattern | Fix |
|
| 85 |
+
|---------|-----|
|
| 86 |
+
| Tool-Schreib-Spirale | Bestehende Skills erst nutzen |
|
| 87 |
+
| Planning Paralysis | Code First, Docs Second |
|
| 88 |
+
| Delegate Without Verify | Ergebnis immer pruefen |
|
| 89 |
+
| Commit-Vorschlag ohne Verifikation | ERST alle Tests gruen, DANN Commit vorschlagen. Agent-Output vertrauen reicht nicht — eigene Verifikation laufen lassen BEVOR Samuel gefragt wird. |
|
| 90 |
+
| Agent fuer Git-Ops delegieren | Git-Commits, Rebase, History-Splits NIEMALS an Agents delegieren. Agents gehen off-script, committen unrelated Files, brechen atomare Commits. Git-Ops IMMER in der Hauptsession ausfuehren. |
|
| 91 |
+
| Agent-Scope-Explosion | Agents loesen oft MEHR als beauftragt — sie committen untracked Files, aendern Wording, fuegen Features hinzu. Klare Scope-Grenzen setzen UND Ergebnis pruefen. |
|
| 92 |
+
| Session Hoarder | Max 2-3 parallel, Freitags aufraeumen |
|
| 93 |
+
| Cost-Awareness ohne Discipline | /research Default |
|
| 94 |
+
| Plattform-Annahmen | Vor Shell-Commands pruefen welches OS/Shell vorliegt. Keine Annahmen ueber `sh`, Package-Manager, Netzwerk-Topologie. |
|
| 95 |
+
| Implizites Vorwissen | Bei Multi-System-Setups (SSH, VMs, Netzwerk) ALLE Voraussetzungen explizit benennen, nicht nur den naechsten Schritt. Samuel muss das Gesamtbild sehen. |
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/HEAD
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
ref: refs/heads/master
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/config
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[core]
|
| 2 |
+
repositoryformatversion = 0
|
| 3 |
+
filemode = true
|
| 4 |
+
bare = false
|
| 5 |
+
logallrefupdates = true
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/description
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Unnamed repository; edit this file 'description' to name the repository.
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/applypatch-msg.sample
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# An example hook script to check the commit log message taken by
|
| 4 |
+
# applypatch from an e-mail message.
|
| 5 |
+
#
|
| 6 |
+
# The hook should exit with non-zero status after issuing an
|
| 7 |
+
# appropriate message if it wants to stop the commit. The hook is
|
| 8 |
+
# allowed to edit the commit message file.
|
| 9 |
+
#
|
| 10 |
+
# To enable this hook, rename this file to "applypatch-msg".
|
| 11 |
+
|
| 12 |
+
. git-sh-setup
|
| 13 |
+
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
|
| 14 |
+
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
|
| 15 |
+
:
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/commit-msg.sample
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# An example hook script to check the commit log message.
|
| 4 |
+
# Called by "git commit" with one argument, the name of the file
|
| 5 |
+
# that has the commit message. The hook should exit with non-zero
|
| 6 |
+
# status after issuing an appropriate message if it wants to stop the
|
| 7 |
+
# commit. The hook is allowed to edit the commit message file.
|
| 8 |
+
#
|
| 9 |
+
# To enable this hook, rename this file to "commit-msg".
|
| 10 |
+
|
| 11 |
+
# Uncomment the below to add a Signed-off-by line to the message.
|
| 12 |
+
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
|
| 13 |
+
# hook is more suited to it.
|
| 14 |
+
#
|
| 15 |
+
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
| 16 |
+
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
| 17 |
+
|
| 18 |
+
# This example catches duplicate Signed-off-by lines.
|
| 19 |
+
|
| 20 |
+
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
| 21 |
+
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
| 22 |
+
echo >&2 Duplicate Signed-off-by lines.
|
| 23 |
+
exit 1
|
| 24 |
+
}
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/fsmonitor-watchman.sample
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/perl
|
| 2 |
+
|
| 3 |
+
use strict;
|
| 4 |
+
use warnings;
|
| 5 |
+
use IPC::Open2;
|
| 6 |
+
|
| 7 |
+
# An example hook script to integrate Watchman
|
| 8 |
+
# (https://facebook.github.io/watchman/) with git to speed up detecting
|
| 9 |
+
# new and modified files.
|
| 10 |
+
#
|
| 11 |
+
# The hook is passed a version (currently 2) and last update token
|
| 12 |
+
# formatted as a string and outputs to stdout a new update token and
|
| 13 |
+
# all files that have been modified since the update token. Paths must
|
| 14 |
+
# be relative to the root of the working tree and separated by a single NUL.
|
| 15 |
+
#
|
| 16 |
+
# To enable this hook, rename this file to "query-watchman" and set
|
| 17 |
+
# 'git config core.fsmonitor .git/hooks/query-watchman'
|
| 18 |
+
#
|
| 19 |
+
my ($version, $last_update_token) = @ARGV;
|
| 20 |
+
|
| 21 |
+
# Uncomment for debugging
|
| 22 |
+
# print STDERR "$0 $version $last_update_token\n";
|
| 23 |
+
|
| 24 |
+
# Check the hook interface version
|
| 25 |
+
if ($version ne 2) {
|
| 26 |
+
die "Unsupported query-fsmonitor hook version '$version'.\n" .
|
| 27 |
+
"Falling back to scanning...\n";
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
my $git_work_tree = get_working_dir();
|
| 31 |
+
|
| 32 |
+
my $retry = 1;
|
| 33 |
+
|
| 34 |
+
my $json_pkg;
|
| 35 |
+
eval {
|
| 36 |
+
require JSON::XS;
|
| 37 |
+
$json_pkg = "JSON::XS";
|
| 38 |
+
1;
|
| 39 |
+
} or do {
|
| 40 |
+
require JSON::PP;
|
| 41 |
+
$json_pkg = "JSON::PP";
|
| 42 |
+
};
|
| 43 |
+
|
| 44 |
+
launch_watchman();
|
| 45 |
+
|
| 46 |
+
sub launch_watchman {
|
| 47 |
+
my $o = watchman_query();
|
| 48 |
+
if (is_work_tree_watched($o)) {
|
| 49 |
+
output_result($o->{clock}, @{$o->{files}});
|
| 50 |
+
}
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
sub output_result {
|
| 54 |
+
my ($clockid, @files) = @_;
|
| 55 |
+
|
| 56 |
+
# Uncomment for debugging watchman output
|
| 57 |
+
# open (my $fh, ">", ".git/watchman-output.out");
|
| 58 |
+
# binmode $fh, ":utf8";
|
| 59 |
+
# print $fh "$clockid\n@files\n";
|
| 60 |
+
# close $fh;
|
| 61 |
+
|
| 62 |
+
binmode STDOUT, ":utf8";
|
| 63 |
+
print $clockid;
|
| 64 |
+
print "\0";
|
| 65 |
+
local $, = "\0";
|
| 66 |
+
print @files;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
sub watchman_clock {
|
| 70 |
+
my $response = qx/watchman clock "$git_work_tree"/;
|
| 71 |
+
die "Failed to get clock id on '$git_work_tree'.\n" .
|
| 72 |
+
"Falling back to scanning...\n" if $? != 0;
|
| 73 |
+
|
| 74 |
+
return $json_pkg->new->utf8->decode($response);
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
sub watchman_query {
|
| 78 |
+
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
|
| 79 |
+
or die "open2() failed: $!\n" .
|
| 80 |
+
"Falling back to scanning...\n";
|
| 81 |
+
|
| 82 |
+
# In the query expression below we're asking for names of files that
|
| 83 |
+
# changed since $last_update_token but not from the .git folder.
|
| 84 |
+
#
|
| 85 |
+
# To accomplish this, we're using the "since" generator to use the
|
| 86 |
+
# recency index to select candidate nodes and "fields" to limit the
|
| 87 |
+
# output to file names only. Then we're using the "expression" term to
|
| 88 |
+
# further constrain the results.
|
| 89 |
+
my $last_update_line = "";
|
| 90 |
+
if (substr($last_update_token, 0, 1) eq "c") {
|
| 91 |
+
$last_update_token = "\"$last_update_token\"";
|
| 92 |
+
$last_update_line = qq[\n"since": $last_update_token,];
|
| 93 |
+
}
|
| 94 |
+
my $query = <<" END";
|
| 95 |
+
["query", "$git_work_tree", {$last_update_line
|
| 96 |
+
"fields": ["name"],
|
| 97 |
+
"expression": ["not", ["dirname", ".git"]]
|
| 98 |
+
}]
|
| 99 |
+
END
|
| 100 |
+
|
| 101 |
+
# Uncomment for debugging the watchman query
|
| 102 |
+
# open (my $fh, ">", ".git/watchman-query.json");
|
| 103 |
+
# print $fh $query;
|
| 104 |
+
# close $fh;
|
| 105 |
+
|
| 106 |
+
print CHLD_IN $query;
|
| 107 |
+
close CHLD_IN;
|
| 108 |
+
my $response = do {local $/; <CHLD_OUT>};
|
| 109 |
+
|
| 110 |
+
# Uncomment for debugging the watch response
|
| 111 |
+
# open ($fh, ">", ".git/watchman-response.json");
|
| 112 |
+
# print $fh $response;
|
| 113 |
+
# close $fh;
|
| 114 |
+
|
| 115 |
+
die "Watchman: command returned no output.\n" .
|
| 116 |
+
"Falling back to scanning...\n" if $response eq "";
|
| 117 |
+
die "Watchman: command returned invalid output: $response\n" .
|
| 118 |
+
"Falling back to scanning...\n" unless $response =~ /^\{/;
|
| 119 |
+
|
| 120 |
+
return $json_pkg->new->utf8->decode($response);
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
sub is_work_tree_watched {
|
| 124 |
+
my ($output) = @_;
|
| 125 |
+
my $error = $output->{error};
|
| 126 |
+
if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
|
| 127 |
+
$retry--;
|
| 128 |
+
my $response = qx/watchman watch "$git_work_tree"/;
|
| 129 |
+
die "Failed to make watchman watch '$git_work_tree'.\n" .
|
| 130 |
+
"Falling back to scanning...\n" if $? != 0;
|
| 131 |
+
$output = $json_pkg->new->utf8->decode($response);
|
| 132 |
+
$error = $output->{error};
|
| 133 |
+
die "Watchman: $error.\n" .
|
| 134 |
+
"Falling back to scanning...\n" if $error;
|
| 135 |
+
|
| 136 |
+
# Uncomment for debugging watchman output
|
| 137 |
+
# open (my $fh, ">", ".git/watchman-output.out");
|
| 138 |
+
# close $fh;
|
| 139 |
+
|
| 140 |
+
# Watchman will always return all files on the first query so
|
| 141 |
+
# return the fast "everything is dirty" flag to git and do the
|
| 142 |
+
# Watchman query just to get it over with now so we won't pay
|
| 143 |
+
# the cost in git to look up each individual file.
|
| 144 |
+
my $o = watchman_clock();
|
| 145 |
+
$error = $output->{error};
|
| 146 |
+
|
| 147 |
+
die "Watchman: $error.\n" .
|
| 148 |
+
"Falling back to scanning...\n" if $error;
|
| 149 |
+
|
| 150 |
+
output_result($o->{clock}, ("/"));
|
| 151 |
+
$last_update_token = $o->{clock};
|
| 152 |
+
|
| 153 |
+
eval { launch_watchman() };
|
| 154 |
+
return 0;
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
die "Watchman: $error.\n" .
|
| 158 |
+
"Falling back to scanning...\n" if $error;
|
| 159 |
+
|
| 160 |
+
return 1;
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
sub get_working_dir {
|
| 164 |
+
my $working_dir;
|
| 165 |
+
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
|
| 166 |
+
$working_dir = Win32::GetCwd();
|
| 167 |
+
$working_dir =~ tr/\\/\//;
|
| 168 |
+
} else {
|
| 169 |
+
require Cwd;
|
| 170 |
+
$working_dir = Cwd::cwd();
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
return $working_dir;
|
| 174 |
+
}
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/post-update.sample
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# An example hook script to prepare a packed repository for use over
|
| 4 |
+
# dumb transports.
|
| 5 |
+
#
|
| 6 |
+
# To enable this hook, rename this file to "post-update".
|
| 7 |
+
|
| 8 |
+
exec git update-server-info
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-applypatch.sample
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# An example hook script to verify what is about to be committed
|
| 4 |
+
# by applypatch from an e-mail message.
|
| 5 |
+
#
|
| 6 |
+
# The hook should exit with non-zero status after issuing an
|
| 7 |
+
# appropriate message if it wants to stop the commit.
|
| 8 |
+
#
|
| 9 |
+
# To enable this hook, rename this file to "pre-applypatch".
|
| 10 |
+
|
| 11 |
+
. git-sh-setup
|
| 12 |
+
precommit="$(git rev-parse --git-path hooks/pre-commit)"
|
| 13 |
+
test -x "$precommit" && exec "$precommit" ${1+"$@"}
|
| 14 |
+
:
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-commit.sample
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# An example hook script to verify what is about to be committed.
|
| 4 |
+
# Called by "git commit" with no arguments. The hook should
|
| 5 |
+
# exit with non-zero status after issuing an appropriate message if
|
| 6 |
+
# it wants to stop the commit.
|
| 7 |
+
#
|
| 8 |
+
# To enable this hook, rename this file to "pre-commit".
|
| 9 |
+
|
| 10 |
+
if git rev-parse --verify HEAD >/dev/null 2>&1
|
| 11 |
+
then
|
| 12 |
+
against=HEAD
|
| 13 |
+
else
|
| 14 |
+
# Initial commit: diff against an empty tree object
|
| 15 |
+
against=$(git hash-object -t tree /dev/null)
|
| 16 |
+
fi
|
| 17 |
+
|
| 18 |
+
# If you want to allow non-ASCII filenames set this variable to true.
|
| 19 |
+
allownonascii=$(git config --type=bool hooks.allownonascii)
|
| 20 |
+
|
| 21 |
+
# Redirect output to stderr.
|
| 22 |
+
exec 1>&2
|
| 23 |
+
|
| 24 |
+
# Cross platform projects tend to avoid non-ASCII filenames; prevent
|
| 25 |
+
# them from being added to the repository. We exploit the fact that the
|
| 26 |
+
# printable range starts at the space character and ends with tilde.
|
| 27 |
+
if [ "$allownonascii" != "true" ] &&
|
| 28 |
+
# Note that the use of brackets around a tr range is ok here, (it's
|
| 29 |
+
# even required, for portability to Solaris 10's /usr/bin/tr), since
|
| 30 |
+
# the square bracket bytes happen to fall in the designated range.
|
| 31 |
+
test $(git diff --cached --name-only --diff-filter=A -z $against |
|
| 32 |
+
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
|
| 33 |
+
then
|
| 34 |
+
cat <<\EOF
|
| 35 |
+
Error: Attempt to add a non-ASCII file name.
|
| 36 |
+
|
| 37 |
+
This can cause problems if you want to work with people on other platforms.
|
| 38 |
+
|
| 39 |
+
To be portable it is advisable to rename the file.
|
| 40 |
+
|
| 41 |
+
If you know what you are doing you can disable this check using:
|
| 42 |
+
|
| 43 |
+
git config hooks.allownonascii true
|
| 44 |
+
EOF
|
| 45 |
+
exit 1
|
| 46 |
+
fi
|
| 47 |
+
|
| 48 |
+
# If there are whitespace errors, print the offending file names and fail.
|
| 49 |
+
exec git diff-index --check --cached $against --
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-merge-commit.sample
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# An example hook script to verify what is about to be committed.
|
| 4 |
+
# Called by "git merge" with no arguments. The hook should
|
| 5 |
+
# exit with non-zero status after issuing an appropriate message to
|
| 6 |
+
# stderr if it wants to stop the merge commit.
|
| 7 |
+
#
|
| 8 |
+
# To enable this hook, rename this file to "pre-merge-commit".
|
| 9 |
+
|
| 10 |
+
. git-sh-setup
|
| 11 |
+
test -x "$GIT_DIR/hooks/pre-commit" &&
|
| 12 |
+
exec "$GIT_DIR/hooks/pre-commit"
|
| 13 |
+
:
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-push.sample
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
|
| 3 |
+
# An example hook script to verify what is about to be pushed. Called by "git
|
| 4 |
+
# push" after it has checked the remote status, but before anything has been
|
| 5 |
+
# pushed. If this script exits with a non-zero status nothing will be pushed.
|
| 6 |
+
#
|
| 7 |
+
# This hook is called with the following parameters:
|
| 8 |
+
#
|
| 9 |
+
# $1 -- Name of the remote to which the push is being done
|
| 10 |
+
# $2 -- URL to which the push is being done
|
| 11 |
+
#
|
| 12 |
+
# If pushing without using a named remote those arguments will be equal.
|
| 13 |
+
#
|
| 14 |
+
# Information about the commits which are being pushed is supplied as lines to
|
| 15 |
+
# the standard input in the form:
|
| 16 |
+
#
|
| 17 |
+
# <local ref> <local oid> <remote ref> <remote oid>
|
| 18 |
+
#
|
| 19 |
+
# This sample shows how to prevent push of commits where the log message starts
|
| 20 |
+
# with "WIP" (work in progress).
|
| 21 |
+
|
| 22 |
+
remote="$1"
|
| 23 |
+
url="$2"
|
| 24 |
+
|
| 25 |
+
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
|
| 26 |
+
|
| 27 |
+
while read local_ref local_oid remote_ref remote_oid
|
| 28 |
+
do
|
| 29 |
+
if test "$local_oid" = "$zero"
|
| 30 |
+
then
|
| 31 |
+
# Handle delete
|
| 32 |
+
:
|
| 33 |
+
else
|
| 34 |
+
if test "$remote_oid" = "$zero"
|
| 35 |
+
then
|
| 36 |
+
# New branch, examine all commits
|
| 37 |
+
range="$local_oid"
|
| 38 |
+
else
|
| 39 |
+
# Update to existing branch, examine new commits
|
| 40 |
+
range="$remote_oid..$local_oid"
|
| 41 |
+
fi
|
| 42 |
+
|
| 43 |
+
# Check for WIP commit
|
| 44 |
+
commit=$(git rev-list -n 1 --grep '^WIP' "$range")
|
| 45 |
+
if test -n "$commit"
|
| 46 |
+
then
|
| 47 |
+
echo >&2 "Found WIP commit in $local_ref, not pushing"
|
| 48 |
+
exit 1
|
| 49 |
+
fi
|
| 50 |
+
fi
|
| 51 |
+
done
|
| 52 |
+
|
| 53 |
+
exit 0
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-rebase.sample
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# Copyright (c) 2006, 2008 Junio C Hamano
|
| 4 |
+
#
|
| 5 |
+
# The "pre-rebase" hook is run just before "git rebase" starts doing
|
| 6 |
+
# its job, and can prevent the command from running by exiting with
|
| 7 |
+
# non-zero status.
|
| 8 |
+
#
|
| 9 |
+
# The hook is called with the following parameters:
|
| 10 |
+
#
|
| 11 |
+
# $1 -- the upstream the series was forked from.
|
| 12 |
+
# $2 -- the branch being rebased (or empty when rebasing the current branch).
|
| 13 |
+
#
|
| 14 |
+
# This sample shows how to prevent topic branches that are already
|
| 15 |
+
# merged to 'next' branch from getting rebased, because allowing it
|
| 16 |
+
# would result in rebasing already published history.
|
| 17 |
+
|
| 18 |
+
publish=next
|
| 19 |
+
basebranch="$1"
|
| 20 |
+
if test "$#" = 2
|
| 21 |
+
then
|
| 22 |
+
topic="refs/heads/$2"
|
| 23 |
+
else
|
| 24 |
+
topic=`git symbolic-ref HEAD` ||
|
| 25 |
+
exit 0 ;# we do not interrupt rebasing detached HEAD
|
| 26 |
+
fi
|
| 27 |
+
|
| 28 |
+
case "$topic" in
|
| 29 |
+
refs/heads/??/*)
|
| 30 |
+
;;
|
| 31 |
+
*)
|
| 32 |
+
exit 0 ;# we do not interrupt others.
|
| 33 |
+
;;
|
| 34 |
+
esac
|
| 35 |
+
|
| 36 |
+
# Now we are dealing with a topic branch being rebased
|
| 37 |
+
# on top of master. Is it OK to rebase it?
|
| 38 |
+
|
| 39 |
+
# Does the topic really exist?
|
| 40 |
+
git show-ref -q "$topic" || {
|
| 41 |
+
echo >&2 "No such branch $topic"
|
| 42 |
+
exit 1
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
# Is topic fully merged to master?
|
| 46 |
+
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
|
| 47 |
+
if test -z "$not_in_master"
|
| 48 |
+
then
|
| 49 |
+
echo >&2 "$topic is fully merged to master; better remove it."
|
| 50 |
+
exit 1 ;# we could allow it, but there is no point.
|
| 51 |
+
fi
|
| 52 |
+
|
| 53 |
+
# Is topic ever merged to next? If so you should not be rebasing it.
|
| 54 |
+
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
|
| 55 |
+
only_next_2=`git rev-list ^master ${publish} | sort`
|
| 56 |
+
if test "$only_next_1" = "$only_next_2"
|
| 57 |
+
then
|
| 58 |
+
not_in_topic=`git rev-list "^$topic" master`
|
| 59 |
+
if test -z "$not_in_topic"
|
| 60 |
+
then
|
| 61 |
+
echo >&2 "$topic is already up to date with master"
|
| 62 |
+
exit 1 ;# we could allow it, but there is no point.
|
| 63 |
+
else
|
| 64 |
+
exit 0
|
| 65 |
+
fi
|
| 66 |
+
else
|
| 67 |
+
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
|
| 68 |
+
/usr/bin/perl -e '
|
| 69 |
+
my $topic = $ARGV[0];
|
| 70 |
+
my $msg = "* $topic has commits already merged to public branch:\n";
|
| 71 |
+
my (%not_in_next) = map {
|
| 72 |
+
/^([0-9a-f]+) /;
|
| 73 |
+
($1 => 1);
|
| 74 |
+
} split(/\n/, $ARGV[1]);
|
| 75 |
+
for my $elem (map {
|
| 76 |
+
/^([0-9a-f]+) (.*)$/;
|
| 77 |
+
[$1 => $2];
|
| 78 |
+
} split(/\n/, $ARGV[2])) {
|
| 79 |
+
if (!exists $not_in_next{$elem->[0]}) {
|
| 80 |
+
if ($msg) {
|
| 81 |
+
print STDERR $msg;
|
| 82 |
+
undef $msg;
|
| 83 |
+
}
|
| 84 |
+
print STDERR " $elem->[1]\n";
|
| 85 |
+
}
|
| 86 |
+
}
|
| 87 |
+
' "$topic" "$not_in_next" "$not_in_master"
|
| 88 |
+
exit 1
|
| 89 |
+
fi
|
| 90 |
+
|
| 91 |
+
<<\DOC_END
|
| 92 |
+
|
| 93 |
+
This sample hook safeguards topic branches that have been
|
| 94 |
+
published from being rewound.
|
| 95 |
+
|
| 96 |
+
The workflow assumed here is:
|
| 97 |
+
|
| 98 |
+
* Once a topic branch forks from "master", "master" is never
|
| 99 |
+
merged into it again (either directly or indirectly).
|
| 100 |
+
|
| 101 |
+
* Once a topic branch is fully cooked and merged into "master",
|
| 102 |
+
it is deleted. If you need to build on top of it to correct
|
| 103 |
+
earlier mistakes, a new topic branch is created by forking at
|
| 104 |
+
the tip of the "master". This is not strictly necessary, but
|
| 105 |
+
it makes it easier to keep your history simple.
|
| 106 |
+
|
| 107 |
+
* Whenever you need to test or publish your changes to topic
|
| 108 |
+
branches, merge them into "next" branch.
|
| 109 |
+
|
| 110 |
+
The script, being an example, hardcodes the publish branch name
|
| 111 |
+
to be "next", but it is trivial to make it configurable via
|
| 112 |
+
$GIT_DIR/config mechanism.
|
| 113 |
+
|
| 114 |
+
With this workflow, you would want to know:
|
| 115 |
+
|
| 116 |
+
(1) ... if a topic branch has ever been merged to "next". Young
|
| 117 |
+
topic branches can have stupid mistakes you would rather
|
| 118 |
+
clean up before publishing, and things that have not been
|
| 119 |
+
merged into other branches can be easily rebased without
|
| 120 |
+
affecting other people. But once it is published, you would
|
| 121 |
+
not want to rewind it.
|
| 122 |
+
|
| 123 |
+
(2) ... if a topic branch has been fully merged to "master".
|
| 124 |
+
Then you can delete it. More importantly, you should not
|
| 125 |
+
build on top of it -- other people may already want to
|
| 126 |
+
change things related to the topic as patches against your
|
| 127 |
+
"master", so if you need further changes, it is better to
|
| 128 |
+
fork the topic (perhaps with the same name) afresh from the
|
| 129 |
+
tip of "master".
|
| 130 |
+
|
| 131 |
+
Let's look at this example:
|
| 132 |
+
|
| 133 |
+
o---o---o---o---o---o---o---o---o---o "next"
|
| 134 |
+
/ / / /
|
| 135 |
+
/ a---a---b A / /
|
| 136 |
+
/ / / /
|
| 137 |
+
/ / c---c---c---c B /
|
| 138 |
+
/ / / \ /
|
| 139 |
+
/ / / b---b C \ /
|
| 140 |
+
/ / / / \ /
|
| 141 |
+
---o---o---o---o---o---o---o---o---o---o---o "master"
|
| 142 |
+
|
| 143 |
+
|
| 144 |
+
A, B and C are topic branches.
|
| 145 |
+
|
| 146 |
+
* A has one fix since it was merged up to "next".
|
| 147 |
+
|
| 148 |
+
* B has finished. It has been fully merged up to "master" and "next",
|
| 149 |
+
and is ready to be deleted.
|
| 150 |
+
|
| 151 |
+
* C has not merged to "next" at all.
|
| 152 |
+
|
| 153 |
+
We would want to allow C to be rebased, refuse A, and encourage
|
| 154 |
+
B to be deleted.
|
| 155 |
+
|
| 156 |
+
To compute (1):
|
| 157 |
+
|
| 158 |
+
git rev-list ^master ^topic next
|
| 159 |
+
git rev-list ^master next
|
| 160 |
+
|
| 161 |
+
if these match, topic has not merged in next at all.
|
| 162 |
+
|
| 163 |
+
To compute (2):
|
| 164 |
+
|
| 165 |
+
git rev-list master..topic
|
| 166 |
+
|
| 167 |
+
if this is empty, it is fully merged to "master".
|
| 168 |
+
|
| 169 |
+
DOC_END
|
Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-receive.sample
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
#
|
| 3 |
+
# An example hook script to make use of push options.
|
| 4 |
+
# The example simply echoes all push options that start with 'echoback='
|
| 5 |
+
# and rejects all pushes when the "reject" push option is used.
|
| 6 |
+
#
|
| 7 |
+
# To enable this hook, rename this file to "pre-receive".
|
| 8 |
+
|
| 9 |
+
if test -n "$GIT_PUSH_OPTION_COUNT"
|
| 10 |
+
then
|
| 11 |
+
i=0
|
| 12 |
+
while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
|
| 13 |
+
do
|
| 14 |
+
eval "value=\$GIT_PUSH_OPTION_$i"
|
| 15 |
+
case "$value" in
|
| 16 |
+
echoback=*)
|
| 17 |
+
echo "echo from the pre-receive-hook: ${value#*=}" >&2
|
| 18 |
+
;;
|
| 19 |
+
reject)
|
| 20 |
+
exit 1
|
| 21 |
+
esac
|
| 22 |
+
i=$((i + 1))
|
| 23 |
+
done
|
| 24 |
+
fi
|