Files
gh-commit/__pycache__/smartcommit.cpython-314.pyc
T

295 lines
54 KiB
Plaintext
Raw Normal View History

+
…£„jŠãóÎRt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RIH t H
t
^RI H t ^RI H
t
^RIHt^RIt^RIt^RIHt^RIHt^RIHt]!4t]
!]P2P5R ]
P6!4R
, 44R , t]R , t]P2P5R
R4P=4t]P2P5RR4t ]!!]P2P5RR44t"]P2P5RR4R8Hs#]P2P5RR4R8Hs$]P2P5RR4R8Ht%]P2P5RR4R8Ht&Rt'] !RR44t(R{RRllt)RRlt*R R!lt+R"R#lt,R$R%lt-R&R'lt.!R(R)]/4t0R*R+lt1R,R-lt2R.t3R/R0lt4R1R2lt5R3R4lt6R5R6lt7R7R8lt8R9R:lt9R;R<lt:R=R>lt;R?R@lt<RARBlt=RCRDlt>RERFlt?]P€!RG4tA^ÈtB^2tCRHRIltDRJtERKtF]FRL,tG]FRM,tHRNROltIRPRQltJR|RRRSlltKR|RTRUlltLRVRWltMRXRYltNRZR[ltOR\R]ltPR^tQR_R`ltRRaRbltSRctTR|RdRelltURfRgltVRhtWRitXRjtYRktZRlt[Rmt\Rnt]Rot^Rpt_Rq]\Rr]]Rs]^Rt]ZRu][Rv]YRw]WRx]X/t`Ryta]bRz8Xd
]a!4R#R#)}axgh-commit - AI-powered scoped git commits.
Both AI steps run through `crush run`: scope generation sends the repository's
file tree with embedded scope-identification instructions, and commit-message
writing sends the staged diff with embedded Conventional Commits instructions.
Scopes live in a local DuckDB and auto-regenerate
whenever the repository's .gitignore changes.
N)Ú dataclassÚfield)Údatetime©ÚPath)ÚOptional)ÚConsole)ÚPanel)ÚTableÚ
XDG_DATA_HOMEz .local/sharez gh-commitz gh-commit.dbÚGH_COMMIT_CRUSH_CMDÚcrushÚGH_COMMIT_CRUSH_MODELzopenrouter/qwen/qwen3.6-27bÚGH_COMMIT_CRUSH_TIMEOUTÚ120ÚGH_COMMIT_AUTOÚGH_COMMIT_PUSHÚGH_COMMIT_NO_AUTO_REFRESHÚGH_COMMIT_DEBUGz5.0.0có,a]tRt^<toV3RltRtVtR#)ÚRepocó><V^8„dQh/S[;R&S[;R&S[;R&#)éÚidÚpathÚname)ÚintÚstr)ÚformatÚ
__classdict__s"€Úsmartcommit.pyÚ __annotate__ÚRepo.__annotate__<s'ø‡á ñ ñ ó©N)Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__)r!s@r"rr<sø‡r%rcórV^8„dQhR\\,R\R\R\P/#)rÚcmdÚcaptureÚcheckÚreturn)ÚlistrÚboolÚ
subprocessÚCompletedProcess)r s"r"r#r#Cs8÷OñOŒT”#O¤ðO´OÄZ×E`ÑE`ñOr%có4\P!WRVR7#)T)Úcapture_outputÚtextr1©r5Úrun)r/r0r1s&&&r"r;r;CsÜ >Š>˜#¸Ô Nr%có0V^8„dQhR\R\/#)rÚargsr2©r)r s"r"r#r#Gs÷CñCŒsðC”sñCr%có|\R.VORR7pVP^8XdVPP4#R#)ÚgitF©r1Ú)r;Ú
returncodeÚstdoutÚstrip)r=Úresults* r"r@r@Gs9Ü
%˜$ 
-€FØ$*×$5Ñ$5¸Ô$:ˆ6=‰=× Ñ Ó ÐÐBr%có$V^8„dQhR\/#©rr2)r4)r s"r"r#r#Ls÷[ñ[”Tñ[r%có:\.RORR7P^8H#)r@FrA)r@ú rev-parsez--is-inside-work-tree)r;rCr&r%r"Ú is_git_reporKLsÜ Ò<ÀEÔ J× UÐYZÑ Zr%có:V^8„dQhR\\,/#rH)rr)r s"r"r#r#Ps÷(”x¤•~ñ(r%cóD\RR4pV'd \V4#R#)rJz--show-toplevelN)r@r)Úroots r"Ú
get_repo_rootrOPs Ü ˆ .€Dߌ4' 'r%có0V^8„dQhR\R\/#)rÚmsgr2©rr4)r s"r"r#r#Us÷AñAðAœñAr%có~\'dR#\P!VRR7P4;'gR#)T)ÚdefaultF)Ú AUTO_CONFIRMÚ questionaryÚconfirmÚask)rQs&r"rWrWUs.߃|ÙÜ × Ò ˜s¨DÔ 7× @¸@r%có$V^8„dQhR\/#rHr)r s"r"r#r#[s÷ñ”Tñr%cóŒ\4'g,\PR4\P!^4\ 4#)z4Assert we're in a git repo and return the root path.z[red]Not in a git repository[/])rKÚconsoleÚprintÚsysÚexitrOr&r%r"Ú require_gitr_[s)ä =Š=Ü
Ð ŠŒ Ü ‹?Ðr%có]tRt^etRtRtR#)Ú
CrushErrorz0Raised when `crush run` fails to produce output.r&N)r'r(r)r*Ú__doc__r,r&r%r"raraesÝ:r%racó0V^8„dQhR\R\/#©rÚ repo_pathr2©rr)r s"r"r#r#is÷ñœdð¤sñr%cóà\R4p\RRR4p\VR,V,PR4Uu0uFq3'gK VkK up4pRPV4#uupi)zIRepo-relative file listing respecting .gitignore (tracked + non-ignored).úls-filesú--othersú--exclude-standardÚ
)r@ÚsortedÚsplitÚjoin)reÚtrackedÚ untrackedÚfiless& r"Úbuild_filetreersisbä*o€GÜJ 
Ð,@ÓA€IÜ  ¨$¥°Õ :×AÀ$ÔG˜!Ë1—A N€EØ 9‰9 ÐùòNs ¿ A+Á
A+có<V^8„dQhR\R\R\/#)rr9Úcwdr2)rr)r s"r"r#r#qs!÷!”sðð!¬#ñ!r%c ó".\ORNRNp\'dVR\.,
p\P!W RR\ V4\
R7pTP^8wd;\TPP4;'gR TP 24hTPP4# \ d"p\R\^,: R24ThRp?i\Pdp\R \
R
24ThRp?ii;i) z0Send `text` to `crush run` and return its reply.r;z--quietz--modelT)Úinputr8r9ruÚtimeoutzCould not run the Crush CLI (zL not found). Install Crush, or set GH_COMMIT_CRUSH_CMD to a working command.Nzcrush run timed out after Úszcrush run exited with )
Ú CRUSH_CMDÚ CRUSH_MODELr5r;rÚ
CRUSH_TIMEOUTÚFileNotFoundErrorraÚTimeoutExpiredrCÚstderrrErD)r9rur/rFÚes&& r"Ú crush_promptrqsà
(ŒIÐ
(
(˜
(€C߃{Ø œ;Ð'ˆð OÜØ ¨D°tÜC“¤-ô
ˆð×јAÔܘŸ×^Ð4JÈ6×K\ÑK\ÐJ]Ð2^Ó =‰=× Ñ Ó Ð øô ôÜØ+¬I°a­LÑ+;ð<Nð
Nó
ðð ûô × OÜÐ5´m°_ÀAÐGÈQÐNûðOús)©(B6Â6 DÃCÃDÃ4DÃ5D Ä DcóN\PRRR7\P!\ \
44pVP
R4VP
R4VP
R4VP
R4VP
R4VP
R4VP
R4VP
R 4VP
R
4P4Uu0uF pV^,kK ppR V9dVP
R 4VP4R
#uupi)T)ÚparentsÚexist_okz6CREATE SEQUENCE IF NOT EXISTS seq_repositories START 1z0CREATE SEQUENCE IF NOT EXISTS seq_scopes START 1z5CREATE SEQUENCE IF NOT EXISTS seq_scope_paths START 1z7CREATE SEQUENCE IF NOT EXISTS seq_github_labels START 1ah
CREATE TABLE IF NOT EXISTS repositories (
id INTEGER DEFAULT nextval('seq_repositories') PRIMARY KEY,
path TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
gitignore_hash TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
a!
CREATE TABLE IF NOT EXISTS scopes (
id INTEGER DEFAULT nextval('seq_scopes') PRIMARY KEY,
repo_id INTEGER NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(repo_id, name)
)
CREATE TABLE IF NOT EXISTS scope_paths (
id INTEGER DEFAULT nextval('seq_scope_paths') PRIMARY KEY,
scope_id INTEGER NOT NULL,
path TEXT NOT NULL,
UNIQUE(scope_id, path)
)
a.
CREATE TABLE IF NOT EXISTS github_labels (
id INTEGER DEFAULT nextval('seq_github_labels') PRIMARY KEY,
scope_id INTEGER NOT NULL,
label_name TEXT NOT NULL,
color TEXT,
synced_at TIMESTAMP,
UNIQUE(scope_id)
)
zTSELECT column_name FROM information_schema.columns WHERE table_name = 'repositories'Úgitignore_hashz7ALTER TABLE repositories ADD COLUMN gitignore_hash TEXTN) ÚDB_DIRÚmkdirÚduckdbÚconnectrÚDB_PATHÚexecuteÚfetchallÚclose)ÚconnÚrowÚcolss r"Úinit_dbrs Ü
‡LL˜¨€LÔ >Š>œ#œg '€D؇L‡L‡L‡L‡L ô  ð ‡Lô ð ‡Lô ð ‡L ô  ð—< 
ç
‰(‹*ðó ñˆCð ˆAˆñð ð ð ˜tÔ Ð‡JJ†Lùò sÃ$D"có8V^8„dQhR\P/#rH)rˆÚDuckDBPyConnection)r s"r"r#r#Ás÷(”×(r%cóH\P!\\44#©N)rˆr‰rr&r%r"Úget_dbrÁsÜ >Š>œ#œg 'r%có0V^8„dQhR\R\/#rdrR)r s"r"r#r#Ås÷.œsð.¤tñ.r%có¤\4pVPRV.4P4pVP4V'd
V^,^8„#R#)zt
SELECT COUNT(*) FROM scopes s
JOIN repositories r ON s.repo_id = r.id
WHERE r.path = ?
rrÚfetchoner)rerFs& r"Úrepo_has_scopesrÅsOÜ ‹8€DØ
\‰\ðð ˆó ÷‘h“jð  ð
 ‡JJ„Lß"ˆ6!9q‰=ÐÐ-r%cóhV^8„dQhR\R\\\\,3,/#rd©rÚdictr3)r s"r"r#r#Ðs'÷ñœsð¤t¬C´´¨NÕ';ñr%cóØ\4pVPRV.4P4pVP4/pVF&wrEVP V.4P V4K( V#)
SELECT s.name, sp.path
FROM scopes s
JOIN repositories r ON s.repo_id = r.id
JOIN scope_paths sp ON sp.scope_id = s.id
WHERE r.path = ?
ORDER BY s.name, sp.path
)rrrÚ
setdefaultÚappend)rerFÚscopesÚ
scope_namers& r"Úget_repo_scopesr¤ÐslÜ ‹8€DØ
\‰\ðð ˆó÷‘h“jð ð ‡JJ„LØ#%€FÛˆ
Ø×ј* bÓÖ €Mr%có$V^8„dQhR\/#)rÚrepo_id)r)r s"r"r#r#ás÷DñD¬ñDr%cóÐVPRV.4P4pVF+wpVPRV.4VPRV.4K- VPRV.4R#)z*Delete all child records for a repository.z'SELECT id FROM scopes WHERE repo_id = ?z*DELETE FROM scope_paths WHERE scope_id = ?z,DELETE FROM github_labels WHERE scope_id = ?z$DELETE FROM scopes WHERE repo_id = ?N)r)Ú scope_idsÚscope_ids&& r"Ú_cascade_delete_reporªás_à ÐÈ Ó]€IÛ ˆØ ÐAÀHÀ:Ô ÐCÀhÀZÖ ‡L7¸'¸ÖCr%c ótV^8„dQhR\R\R\\\\,3,/#)rreÚ repo_namer¢r)r s"r"r#r#ês.÷ñœ3ð¬3ð¼¼SÄ$ÄsÅ)¸^Õ8Lñr%cóŠ\4pVPRV.4P4pV'dV^,p\W54M;VPRW.4VPRV.4P4^,pVP 4FuwrgVPRWV.4VPRWV.4P4^,p\ V\ 4'dTMV.Fp VPRW‰.4K Kw VPR\\V44V.4VP4R#)zCPersist scopes for a repo and snapshot the current .gitignore hash.ú*SELECT id FROM repositories WHERE path = ?z3INSERT INTO repositories (path, name) VALUES (?, ?)z0INSERT INTO scopes (repo_id, name) VALUES (?, ?)z4SELECT id FROM scopes WHERE repo_id = ? AND name = ?z6INSERT INTO scope_paths (scope_id, path) VALUES (?, ?)zWUPDATE repositories SET updated_at = CURRENT_TIMESTAMP, gitignore_hash = ? WHERE id = ?N)
r–rÚitemsÚ
isinstancer3Úcurrent_gitignore_hashrr)
rerFÚpathsr©rs
&&& r"Ú save_scopesr³êsä ‹8€DØ
\‰\ÐÈ Ó
T×
_€Fß
ؘ•)ˆÜ˜TÕ ÐJÈYÐLbÔ—,‘,ÐKÈiÈ[ÓdÐefÕà#Ÿ\™\ž^ш
Ø ÐGÈ'ÐI^Ô—<
Ð 
÷ ‰(‹*ˆô´×5‘U¸E¸7ÒBˆDØ L‰LÐQÐT\ÐScÖ Cñ
 ‡L¤ Ó 0°'Ðð ‡JJ†Lr%cóFV^8„dQhR\R\\,/#rd©rr)r s"r"r#r#s÷ð¼#µñ#r%cóž\4pVPRV.4P4pVP4V'd
V^,#R#)z6SELECT gitignore_hash FROM repositories WHERE path = ?Nr™)rers& r"Úget_stored_gitignore_hashr·sAÜ 8€DØ
,‰,ÐOÐR[ÐQ\Ó
]×
h€C؇JJ„L߈3ˆq"˜"r%có:V^8„dQhR\\,/#rH)r3Útuple)r s"r"r#r# s÷
ñ
”Dœ•Kñ
r%cóx\4pVPR4P4pVP4V#)
SELECT r.name, r.path, COUNT(DISTINCT s.id) as scope_count, r.updated_at
FROM repositories r
LEFT JOIN scopes s ON s.repo_id = r.id
GROUP BY r.id, r.name, r.path, r.updated_at
ORDER BY r.updated_at DESC
)rrr)rFs r"Ú
list_reposr» s8Ü 8€DØ
\‰\ðó ÷
ð
 ð ‡JJ„LØ €Mr%có$V^8„dQhR\/#)rrer>)r s"r"r#r#s÷ñœ3ñr%cóÚ\4pVPRV.4P4pV'd(V^,p\W4VPRV.4VP 4R#)z%DELETE FROM repositories WHERE id = ?N)rrr)rerFs& r"Ú delete_repor¾sSÜ 8€DØ
\‰\ÐÈ Ó
T×
_€Fß
ؘ•)ˆÜ˜TÔ Ð<¸w¸‡JJ†Lr%có0V^8„dQhR\R\/#)rÚ repo_rootr2rf)r s"r"r#r#%s÷>¤dð>¬sñ>r%có¨VR, pVP4'gR#\P!VP44P 4#)z;SHA-256 of the repo's .gitignore, or "" when there is none.z
.gitignorerB)ÚexistsÚhashlibÚsha256Ú
read_bytesÚ hexdigest)Ú gitignores& r"%s?à˜LÕ(€IØ × Ñ × Ò ÙÜ >Š>˜)× 1× =r%cóHV^8„dQhR\R\R\R\/#)rreÚ toml_pathr2©rrr4)r s"r"r#r#/s(÷ ñ œDð ¬Sð ¼Tð Ädñ r%cóÌ\PR4\P!VP 44p\ \
V4WPR/44VPR\P!4R
24pVPV4\PRV R24R# \d%p\PRT R24Rp?R #Rp?ii;i)
u5[yellow]↻ Migrating .github/Repo.toml → DuckDB[/]r¢z.toml.migrated.ú
%Y%m%d_%H%M%Sú[dim] Archived: ú[/]Tú[red]Migration failed: NF)
r[r\ÚtomllibÚloadsÚ read_textr³rÚgetÚ with_suffixrÚnowÚrenameÚ Exception)reÚdataÚbackupr€s&&& r"Ú migrate_tomlrÚ/s´Ü ‡M Ü}Š}˜Y×Ü”C˜ “N I¯x©x¸À"Ó/EÔ×¼¿º»È
Ð8VÐ'WÓØ×Ñ˜Ô Ü
Ð)¨&¨°ÐøÜ ôÜ
Шs°#Ðûðús—BB4Â4 C#Â?CÃC#cóHV^8„dQhR\R\R\R\/#)rreÚ json_pathr2)r s"r"r#r#=s(÷ñœDð¬Sð¼TðÄdñr%có \PR4\P!VP 44p/pVF2pVP VR,.4P
VR,4K4 \\V4W4VPR\P!4R
24pVPV4\PRV R24R# \d%p\PRT R24R p?R
#R p?ii;i) u7[yellow]↻ Migrating .github/scopes.json → DuckDB[/]Úscoperz.json.migrated.rÌTrÏNF)r[r\ÚjsonrÑr rrr×)reÚitemrÙr€s&&& r"Ú migrate_jsonrá=Ü ‡M ÜzŠz˜)×0ˆØ')ˆÛˆDØ × Ñ ˜d 7m¨RÓ ¸V½ Ö ä”C˜ “N ×¼¿º»È
Ð8VÐ'WÓØ×Ñ˜Ô Ü
Ð)¨&¨°ÐøÜ ôÜ
Шs°#Ðûðús—CCà D
Ã)DÄD
có0V^8„dQhR\R\/#rd)rr4)r s"r"r#r#Ns÷ñœDð¤Tñr%cóæVPpVR, R, pVP4'd
\WV4#VR, R, pVP4'd
\WV4#R#)ú.githubú Repo.tomlú scopes.jsonF)r)res& r"Ú auto_migraterçNsdØ€IؘIÕ Õ3€IØ×Ñ×ÒܘI°)Ó˜
Õ5€IØ×Ñ×ÒܘI°)Ó r%zþ(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb|go\.sum|go\.mod|Cargo\.lock|poetry\.lock|composer\.lock|Gemfile\.lock|.*\.min\.(js|css)|.*\.bundle\.js|.*\.map|dist/.*|build/.*|\.next/.*|node_modules/.*|vendor/.*|__pycache__/.*|\.pyc$|target/.*)có0V^8„dQhR\R\/#)rÚdiffr2r>)r s"r"r#r#fs÷6ñ6”cð6œcñ6r%cóª.pRpRp^p^pVPR4EF#pVPR4'd˜^p^p\P!RV4pV'dVP ^4MRp\
PV4'dRRr2VP
V4KVPR4'dRRr2VP
V4RRr2V'd\\P!RV4'd<VP
V4VPR4'dVP
R 4RpEKV'\P!RV4'dVP
V4EKNVPR
4'dSV^,
pV\8:dVP
V4M=V\^,8XdVP
R
\ R 24MVP
V4EV\8dVP
V4V^,
pEV\8XgEKVP
R \ R 24V^,
pEK& RPV4#)Frkz
diff --gitz b/([^ ]+)rBTz.jsonz^(index|---|\+\+\+|@@)z@@z([Generated/lock file - content filtered]z[... JSON truncated after z lines ...]z[... truncated after )Ú-) rmÚ
startswithÚreÚsearchÚgroupÚ LOCK_PATTERNr¡ÚendswithÚmatchÚMAX_JSON_LINESÚMAX_DIFF_LINESrn) réÚlinesÚ in_filteredÚin_jsonÚ
line_countÚ
json_countÚlineróÚfilenames & r"Ú filter_diffrýfØ €EØ€KØ€GØ€JØ€Jà
˜4× ˆØ ?‰?˜<× ˆJ؈—I’I˜l¨DÓ1ˆEß).u—{{ 1”~°Bˆ×" 8×,Ø'+¨U˜ ˜Ø×" 7×+Ø',¨d˜ ˜à',¨e˜ ÜxŠxÐ1°4× ˜TÔ—?? 4×—LLÐ!KÔLØ"' ç ÜxŠxÐ1°4× ˜TÔØ˜zטa•
ؤԗLL Õ¤>°AÕ#5Ô—LLÐ#=¼nÐ=MÈ[Ð!YÔZøà ˜TÔ à œÔ L‰L˜Ô Ø ˜!O‹JØ
œ>×
L‰LÐÐ0@À Ð ˜!OJñ[!ð^ 9‰9 Ðr%aLYou are an expert conventional commit message writer.
Use one of these commit types: feat, fix, docs, style, refactor, breaking, test, perf, build, ci, chore, init.
Determine a precise commit message from the provided diff and scope.
The commit message must follow this format: <type>(<scope>): <description>
Examples:
- fix(core): resolve consensus timeout during high load
- feat(did): add WebAuthn biometric authentication support
- refactor(hway): extract Redis connection pooling to shared utility
- init(browser): setup client package for web API-specific logic
- perf(vault): optimize IPFS chunk size for large file uploads
- ci(actions): update GitHub Actions pipeline for parallel module testing
- docs(dwn): clarify data retention policies in API reference
- test(svc): add integration tests for domain verification flow
- breaking(ui): rename Button prop 'type' to 'variant'
- refactor(sdk): migrate off wallet implementation in favor of @sonr.io/enclave
- feat(react): create Enclave stateful hooks
Never explain anything. Return only the commit message.
{scope_hint}### Git Diff
{diff}
aKYou are a repository scope identifier for Conventional Commits.
You receive a repository file tree, one repo-relative path per line.
Map logical project areas to the repo-relative path prefixes (directories or files) they cover.
Scope names must read well in Conventional Commits, e.g. core, api, ui, cli, docs, tests, ci, config, scripts, deps.
Each scope maps to a JSON array of repo-relative path prefixes.
Group related paths together and cover the meaningful source areas.
Never create scopes for generated, vendored, or build-output paths.
If existing scopes are provided, keep the ones that still apply, drop scopes whose paths no longer exist, and add scopes for new areas.
Never explain anything or print your thoughts. Never include Markdown code blocks.
Only return a single JSON object of the form {{"scope": ["path", ...], ...}}.
zF
Repository file tree (one repo-relative path per line):
{filetree}
Existing scopes (JSON):
{existing}
The repository structure may have changed (e.g. its .gitignore was edited).
Updated repository file tree (one repo-relative path per line):
{filetree}
cóFV^8„dQhR\R\\,/#©rr9r2)r s"r"r#r#Øs÷
ñ
œsð
¤x´¥}ñ
r%có¾^pRp\V4FIwr4VR8XdVfTpV^,
pKVR8XgK&VfK,V^,pV^8XgK>WV^,u# R#)z?Return the first balanced top-level {...} object found in text.NÚ})Ú enumerate)r9ÚdepthÚstartÚchs& r"Ú_extract_json_objectrØsfà
€EØ €Eܘ4–ˆØ
Œ9ØŠ}ØØ QJŠEØ
3ŽY˜5Ô QJˆEؘŽzØ ! a¥%Ð r%có~V^8„dQhR\R\\\\\,3,,/#rÿ)rrr3)r s"r"r#r#ès,÷ñ¤ð¬´´c¼4Ľ9°nÕ1EÕ(Fñr%có(\V4pV'gR#\P!V4p\ T\
4'gR#/pTP
4wrE\ T\4'dT.T\T4&K,\ T\4'gKDTUu.uF/p\T4P4'gK$\T4NK1 upT\T4& T;'gR# \PdR#i;iuupir•)
rÚJSONDecodeErrorr°rr3rE)r9ÚblobrØrÚps& r"Úparse_scopes_responserèÜ  Ó %€Dß ÙðÜzŠz˜$Óˆô dœD× Ø#%€FØ—z‘z–|‰ ˆÜ eœS× !Ø!& ˆF”3t“9Ó Ü
˜œt×
$Ù16Ó I±¨A¼#¸a»&¿,¹,¿.¤¤ ±Ñ IˆF”3t“9Ó ñ 
>ˆ>øô × Ñ ôÚðüò!JsC3Â!DÃDÃ3D Ä D c ótV^8„dQhR\R\R\\,R\\,/#)rrer2)rrr)r s"r"r#r#ûs3÷
ñ
¤#ð
´
¼x̽}ð
ÔX`ÔadÕXeñ
r%có^V'dRV R2MRp\PV\V4R7p\WA4p\P!RRTP44P4pT;'gR# \d%p\
P
RT R24Rp?R#Rp?ii;i)zUse this scope: rkrB)Ú
scope_hintréz0[red]Crush failed to generate a commit message: rÎNz^```[a-zA-Z]*\n|\n```$)
Ú
COMMIT_PROMPTr rrar[r\ÚsubrE)rerÚpromptÚmessager€s&&& r"Úgenerate_commit_messagerûs™ß16Ð# E 7¨"Ñ-¸B€JÜ
×
!¨Z¼kÈ$Ó>OÐ
P€FðܘvÓô
fŠfаG·M±M³OÓD×L€GØ ?ˆ?øô ôÜ
ÐÈÈ3Ðûðús² A=Á= B,ÂB'Â'B,c
óØV^8„dQhR\R\\\\\,3,,R\\\\\,3,,/#)rreÚexistingr2)rrrr3)r s"r"r#r#sL÷ñœtð¬x¼¼SÄ$ÄsÅ)¸^Õ8LÕ/MðÔYaÔbfÔgjÔlpÔqtÕluÐguÕbvÕYwñr%cóz\V4pV'g\PR4R#V'd/\P \
P !V^R7VR7pM\P VR7p\PR4;_uu_4\W04pRRR4\X4pT'g;\PR4\'d\PR T R24T# +'giL_;i \d%p\PRT R24Rp?R#Rp?ii;i)
z0[red]No tracked or untracked files to analyze[/]N)Úindent)rÚfiletree)rz.[magenta]Analyzing repository with Crush...[/]z[red]Crush failed: rÎz4[red]Could not parse scopes from Crush's response[/]z[dim])
rsr[r\ÚSCOPE_PROMPT_UPDATEr ÚdumpsÚSCOPE_PROMPT_NEWÚstatusrrarÚDEBUG)rerrrÚoutputr€s&& r"Úgenerate_scopesr"ܘiÓ(€Hß Ü
ÐßÜ+´T·Z²ZÀÐQRÔ5SÐ^fÐg‰ä(°(ÐðÜ
^‰^ÐL×
! 4ˆNô
# 
*€Fß Ü
Ð  M‰M˜E & ¨Ð €M÷N×
Mûä ôÜ
Ð+¨A¨3¨cÐûðús6Á8D  C8Â!D Ã8 D ÄD ÄD Ä D:ÄD5Ä5D:có\V^8„dQhR\\\\,3,/#)r)rr3)r s"r"r#r#s#÷MñMœ4¤¤T¬#¥Y ÕMr%c óž\VP44F/wr\PRV RRP V4 24K1 R#)u [cyan]•[/] [bold]z[/]: ú, N)rlr[r\rn)rs& r"Údisplay_scopesr&s=ܘfŸl™l›nÖ-‰ ˆÜ