smlflg commited on
Commit
aa03bae
·
verified ·
1 Parent(s): 755dee8

Initial public upload from Projekte/Sidecar-Workspace (part 7)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +3 -0
  2. Sidecar-Courser/.venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/AUTHORS +292 -0
  3. Sidecar-Courser/.venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/LICENSE +25 -0
  4. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/INSTALLER +1 -0
  5. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/METADATA +212 -0
  6. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/RECORD +159 -0
  7. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/WHEEL +5 -0
  8. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/entry_points.txt +3 -0
  9. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/licenses/LICENSE +21 -0
  10. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest-9.0.3.dist-info/top_level.txt +3 -0
  11. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/__init__.py +186 -0
  12. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/__main__.py +9 -0
  13. Sidecar-Courser/.venv/lib/python3.12/site-packages/pytest/py.typed +0 -0
  14. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/INSTALLER +1 -0
  15. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/METADATA +91 -0
  16. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/RECORD +13 -0
  17. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/REQUESTED +0 -0
  18. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/WHEEL +5 -0
  19. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/direct_url.json +1 -0
  20. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/entry_points.txt +4 -0
  21. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/licenses/LICENSE +21 -0
  22. Sidecar-Courser/.venv/lib/python3.12/site-packages/sidecar_courser-1.0.0.dist-info/top_level.txt +1 -0
  23. Sidecar-Courser/.venv/pyvenv.cfg +5 -0
  24. Sidecar-Courser/LICENSE +21 -0
  25. Sidecar-Courser/README.md +89 -0
  26. Sidecar-Courser/adapters/codex/README.md +26 -0
  27. Sidecar-Courser/config/config.toml.example +51 -0
  28. Sidecar-Courser/data/skill_index.json +1 -0
  29. Sidecar-Courser/docs/ARCHITECTURE.md +95 -0
  30. Sidecar-Courser/docs/EVAL_KPI.md +40 -0
  31. Sidecar-Courser/docs/PLUGIN_INSTALL.md +32 -0
  32. Sidecar-Courser/docs/TWO_PATH.md +22 -0
  33. Sidecar-Courser/eval/latest_report.json +205 -0
  34. Sidecar-Courser/eval/prompts_goldset.json +122 -0
  35. Sidecar-Courser/packs/default/knowledge/PROJECT.md +7 -0
  36. Sidecar-Courser/packs/default/knowledge/Skilluebersicht.md +55 -0
  37. Sidecar-Courser/packs/default/knowledge/WelcheFehlerVermeiden.md +95 -0
  38. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/HEAD +1 -0
  39. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/config +5 -0
  40. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/description +1 -0
  41. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/applypatch-msg.sample +15 -0
  42. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/commit-msg.sample +24 -0
  43. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/fsmonitor-watchman.sample +174 -0
  44. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/post-update.sample +8 -0
  45. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-applypatch.sample +14 -0
  46. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-commit.sample +49 -0
  47. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-merge-commit.sample +13 -0
  48. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-push.sample +53 -0
  49. Sidecar-Courser/packs/default/knowledge/commands/.git-backup/hooks/pre-rebase.sample +169 -0
  50. 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