saga-cli 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- saga/__init__.py +0 -0
- saga/__main__.py +4 -0
- saga/assets/base.css +41 -0
- saga/assets/saga.css +224 -0
- saga/assets/saga.js +459 -0
- saga/assets/tokens.css +141 -0
- saga/cli.py +100 -0
- saga/comments.py +258 -0
- saga/diff.py +79 -0
- saga/generate.py +182 -0
- saga/model.py +253 -0
- saga/prompts/saga.md +50 -0
- saga/render.py +144 -0
- saga_cli-0.1.0.dist-info/METADATA +158 -0
- saga_cli-0.1.0.dist-info/RECORD +18 -0
- saga_cli-0.1.0.dist-info/WHEEL +4 -0
- saga_cli-0.1.0.dist-info/entry_points.txt +2 -0
- saga_cli-0.1.0.dist-info/licenses/LICENSE +21 -0
saga/__init__.py
ADDED
|
File without changes
|
saga/__main__.py
ADDED
saga/assets/base.css
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/* Base page + diff2html dark overrides for the standalone saga.
|
|
2
|
+
The subset of diff.css the saga view needs; recolors diff2html's output
|
|
3
|
+
to the instrument-ink tokens. */
|
|
4
|
+
|
|
5
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
6
|
+
body { font-family: var(--font-sans); background: var(--bg); color: var(--text); }
|
|
7
|
+
|
|
8
|
+
.header { position: relative; background: var(--surface); border-bottom: 1px solid var(--line); padding: 16px 32px; }
|
|
9
|
+
.header h1 { font-size: var(--fs-xl); font-weight: 600; }
|
|
10
|
+
|
|
11
|
+
/* --- diff2html recolour --- */
|
|
12
|
+
.d2h-wrapper { background: var(--bg); }
|
|
13
|
+
.d2h-file-header { background: var(--surface) !important; border-color: var(--line) !important; color: var(--text) !important; }
|
|
14
|
+
.d2h-file-name-wrapper { color: var(--text) !important; }
|
|
15
|
+
.d2h-file-name { color: var(--accent) !important; font-family: var(--font-mono) !important; }
|
|
16
|
+
.d2h-file-stats { color: var(--text) !important; }
|
|
17
|
+
.d2h-file-diff { background: var(--bg); }
|
|
18
|
+
.d2h-code-line-ctn, .d2h-code-line { background: var(--bg) !important; color: var(--text) !important; }
|
|
19
|
+
.d2h-code-linenumber { background: var(--surface) !important; color: var(--text-faint) !important; border-color: var(--line) !important; }
|
|
20
|
+
.d2h-del { background: var(--diff-del-bg) !important; }
|
|
21
|
+
.d2h-ins { background: var(--diff-add-bg) !important; }
|
|
22
|
+
.d2h-del .d2h-code-line-ctn { background: var(--diff-del-bg) !important; }
|
|
23
|
+
.d2h-ins .d2h-code-line-ctn { background: var(--diff-add-bg) !important; }
|
|
24
|
+
.d2h-del .d2h-code-linenumber { background: var(--diff-del-gutter) !important; }
|
|
25
|
+
.d2h-ins .d2h-code-linenumber { background: var(--diff-add-gutter) !important; }
|
|
26
|
+
.d2h-info { background: var(--diff-info-bg) !important; color: var(--text-dim) !important; }
|
|
27
|
+
.d2h-info .d2h-code-line-ctn { background: var(--diff-info-bg) !important; color: var(--text-dim) !important; }
|
|
28
|
+
.d2h-diff-table { border-color: var(--line) !important; }
|
|
29
|
+
.d2h-file-wrapper { border: 1px solid var(--line) !important; border-radius: var(--radius); margin-bottom: 16px; overflow: hidden; }
|
|
30
|
+
.d2h-tag { display: none !important; }
|
|
31
|
+
.d2h-file-collapse { color: var(--text-dim) !important; }
|
|
32
|
+
.d2h-file-collapse:hover { color: var(--text) !important; }
|
|
33
|
+
del, ins { text-decoration: none; }
|
|
34
|
+
del { background: var(--diff-del-strong) !important; }
|
|
35
|
+
ins { background: var(--diff-add-strong) !important; }
|
|
36
|
+
|
|
37
|
+
@media (max-width: 640px) {
|
|
38
|
+
.header { padding: 14px 16px; }
|
|
39
|
+
.header h1 { font-size: var(--fs-lg); }
|
|
40
|
+
.d2h-file-wrapper { overflow-x: auto; }
|
|
41
|
+
}
|
saga/assets/saga.css
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/* PR saga view — chapter-based review. Consumes the shared design
|
|
2
|
+
tokens (tokens.css); status colours come from the instrument-ink lights. */
|
|
3
|
+
|
|
4
|
+
/* light/dark toggle, pinned to the top-right of the header */
|
|
5
|
+
.saga-theme-toggle {
|
|
6
|
+
position: absolute; top: 16px; right: 32px;
|
|
7
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
8
|
+
width: 32px; height: 32px; padding: 0;
|
|
9
|
+
font-size: 15px; line-height: 1; cursor: pointer;
|
|
10
|
+
color: var(--text-dim); background: var(--surface-2);
|
|
11
|
+
border: 1px solid var(--line); border-radius: var(--radius);
|
|
12
|
+
transition: border-color var(--transition), color var(--transition);
|
|
13
|
+
}
|
|
14
|
+
.saga-theme-toggle:hover { border-color: var(--accent); color: var(--text); }
|
|
15
|
+
|
|
16
|
+
.saga-crumbs { font-size: var(--fs-sm); color: var(--text-dim); margin-bottom: 10px; }
|
|
17
|
+
.saga-crumbs a { color: var(--accent); text-decoration: none; }
|
|
18
|
+
.saga-crumbs a:hover { color: var(--accent-bright); text-decoration: underline; }
|
|
19
|
+
.saga-crumb-sep { margin: 0 8px; color: var(--text-faint); }
|
|
20
|
+
.saga-crumb-current { color: var(--text); }
|
|
21
|
+
|
|
22
|
+
.saga-verdict {
|
|
23
|
+
color: var(--text-dim);
|
|
24
|
+
font-size: var(--fs-sm);
|
|
25
|
+
margin-top: 6px;
|
|
26
|
+
font-family: var(--font-mono);
|
|
27
|
+
letter-spacing: var(--tracking-mono);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#saga-notice { max-width: 1000px; margin: 0 auto; padding: 0 24px; }
|
|
31
|
+
|
|
32
|
+
.saga-error {
|
|
33
|
+
background: var(--danger-loud-bg);
|
|
34
|
+
border: 1px solid var(--danger);
|
|
35
|
+
color: var(--danger-ink);
|
|
36
|
+
border-radius: var(--radius);
|
|
37
|
+
padding: 12px 16px;
|
|
38
|
+
margin: 16px 0;
|
|
39
|
+
font-size: var(--fs-base);
|
|
40
|
+
}
|
|
41
|
+
.saga-error a { color: var(--accent); }
|
|
42
|
+
|
|
43
|
+
.saga-loading {
|
|
44
|
+
color: var(--text-dim);
|
|
45
|
+
font-size: var(--fs-base);
|
|
46
|
+
padding: 24px 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* --- table of contents --- */
|
|
50
|
+
|
|
51
|
+
.saga-toc { max-width: 1000px; margin: 0 auto; padding: 8px 24px 40px; }
|
|
52
|
+
.saga-toc-title, .saga-chapter-title { color: var(--text); }
|
|
53
|
+
.saga-toc-title { font-size: var(--fs-lg); font-weight: 600; margin: 16px 0 12px; }
|
|
54
|
+
|
|
55
|
+
.saga-toc-item {
|
|
56
|
+
display: block;
|
|
57
|
+
width: 100%;
|
|
58
|
+
text-align: left;
|
|
59
|
+
font: inherit;
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
background: var(--surface);
|
|
62
|
+
border: 1px solid var(--line);
|
|
63
|
+
border-radius: var(--radius-lg);
|
|
64
|
+
padding: 14px 16px;
|
|
65
|
+
margin-bottom: 10px;
|
|
66
|
+
transition: border-color var(--transition), background var(--transition);
|
|
67
|
+
}
|
|
68
|
+
.saga-toc-item:hover { border-color: var(--accent); background: var(--hover); }
|
|
69
|
+
|
|
70
|
+
.saga-toc-head { display: flex; align-items: center; gap: 10px; }
|
|
71
|
+
.saga-num {
|
|
72
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
73
|
+
min-width: 24px; height: 24px; padding: 0 6px;
|
|
74
|
+
background: var(--surface-2); color: var(--text-dim); border-radius: var(--radius-pill);
|
|
75
|
+
font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 600;
|
|
76
|
+
}
|
|
77
|
+
.saga-toc-titletext { color: var(--text); font-size: var(--fs-md); font-weight: 600; }
|
|
78
|
+
.saga-toc-summary { color: var(--text-dim); font-size: var(--fs-sm); margin: 6px 0 8px 34px; }
|
|
79
|
+
|
|
80
|
+
/* --- badges --- */
|
|
81
|
+
|
|
82
|
+
.saga-badges { display: flex; flex-wrap: wrap; gap: 6px; margin-left: 34px; }
|
|
83
|
+
.saga-reader .saga-badges { margin-left: 0; }
|
|
84
|
+
.saga-badge {
|
|
85
|
+
font-size: var(--fs-eyebrow); padding: 2px 8px; border-radius: var(--radius-pill);
|
|
86
|
+
border: 1px solid var(--line); color: var(--text-dim); background: var(--surface-2);
|
|
87
|
+
}
|
|
88
|
+
.saga-plan { color: var(--text-dim); }
|
|
89
|
+
.saga-qa { color: var(--ok); border-color: var(--ok-solid); background: var(--ok-tint); }
|
|
90
|
+
.saga-read { color: var(--accent); border-color: var(--accent-solid); background: var(--accent-tint); }
|
|
91
|
+
/* Deviations must be loud. */
|
|
92
|
+
.saga-dev {
|
|
93
|
+
color: var(--danger-ink); background: var(--danger-loud); border-color: var(--danger); font-weight: 600;
|
|
94
|
+
}
|
|
95
|
+
/* Low confidence flagged for close review (amber). */
|
|
96
|
+
.saga-low {
|
|
97
|
+
color: var(--warn-ink); background: var(--warn); border-color: var(--warn-solid); font-weight: 600;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* --- chapter reader --- */
|
|
101
|
+
|
|
102
|
+
.saga-reader { max-width: 1000px; margin: 0 auto; padding: 8px 24px 60px; }
|
|
103
|
+
|
|
104
|
+
.saga-reader-nav {
|
|
105
|
+
display: flex; align-items: center; gap: 8px; padding: 10px 0;
|
|
106
|
+
}
|
|
107
|
+
.saga-nav-top { border-bottom: 1px solid var(--line); margin-bottom: 16px; }
|
|
108
|
+
.saga-nav-bottom { border-top: 1px solid var(--line); margin-top: 16px; }
|
|
109
|
+
.saga-nav-spacer { flex: 1; }
|
|
110
|
+
.saga-progress { color: var(--text-dim); font-size: var(--fs-sm); font-family: var(--font-mono); letter-spacing: var(--tracking-mono); }
|
|
111
|
+
.saga-btn {
|
|
112
|
+
font: inherit; font-size: var(--fs-sm); cursor: pointer; padding: 5px 12px;
|
|
113
|
+
border-radius: var(--radius); border: 1px solid var(--line);
|
|
114
|
+
background: var(--surface-2); color: var(--text);
|
|
115
|
+
transition: border-color var(--transition);
|
|
116
|
+
}
|
|
117
|
+
.saga-btn:hover:not(:disabled) { border-color: var(--accent); }
|
|
118
|
+
.saga-btn:disabled { opacity: 0.4; cursor: default; }
|
|
119
|
+
|
|
120
|
+
.saga-chapter-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
|
|
121
|
+
.saga-chapter-title { font-size: var(--fs-xl); font-weight: 600; margin: 0; }
|
|
122
|
+
|
|
123
|
+
/* Loud deviation banner. */
|
|
124
|
+
.saga-deviation {
|
|
125
|
+
background: var(--danger-loud-bg); border: 1px solid var(--danger); border-left: 4px solid var(--danger);
|
|
126
|
+
color: var(--danger-ink); border-radius: var(--radius); padding: 12px 16px; margin: 14px 0; font-size: var(--fs-base);
|
|
127
|
+
}
|
|
128
|
+
.saga-lowconf {
|
|
129
|
+
background: var(--warn-tint); border: 1px solid var(--warn-solid); border-left: 4px solid var(--warn);
|
|
130
|
+
color: var(--warn); border-radius: var(--radius); padding: 10px 16px; margin: 14px 0; font-size: var(--fs-base);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.saga-narration {
|
|
134
|
+
color: var(--text); font-size: var(--fs-md); line-height: 1.6; margin: 14px 0;
|
|
135
|
+
}
|
|
136
|
+
.saga-narration p { margin: 0 0 10px; }
|
|
137
|
+
.saga-narration code {
|
|
138
|
+
background: var(--surface-2); padding: 1px 5px; border-radius: var(--radius-sm);
|
|
139
|
+
font-family: var(--font-mono); font-size: var(--fs-sm);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.saga-qanote { color: var(--ok); font-size: var(--fs-sm); margin: 8px 0; }
|
|
143
|
+
|
|
144
|
+
.saga-readmark {
|
|
145
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
146
|
+
color: var(--text-dim); font-size: var(--fs-sm); margin: 8px 0 16px; cursor: pointer;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.saga-chapter-diff { margin-top: 8px; }
|
|
150
|
+
.saga-empty { color: var(--text-dim); font-size: var(--fs-base); padding: 16px 0; }
|
|
151
|
+
|
|
152
|
+
/* --- comments: overall review, inline threads, per-file notes --- */
|
|
153
|
+
|
|
154
|
+
.saga-review {
|
|
155
|
+
background: var(--surface); border: 1px solid var(--line);
|
|
156
|
+
border-radius: var(--radius-lg); padding: 14px 16px; margin-bottom: 20px;
|
|
157
|
+
}
|
|
158
|
+
.saga-review .saga-toc-title { margin-top: 0; }
|
|
159
|
+
.saga-review-actions { display: flex; align-items: center; gap: 12px; margin-top: 10px; }
|
|
160
|
+
.saga-cmt-count { color: var(--text-dim); font-size: var(--fs-sm); font-family: var(--font-mono); letter-spacing: var(--tracking-mono); }
|
|
161
|
+
.saga-review-actions .saga-btn { margin-left: auto; }
|
|
162
|
+
|
|
163
|
+
.saga-cmt-input {
|
|
164
|
+
display: block; width: 100%; box-sizing: border-box; resize: vertical;
|
|
165
|
+
font: inherit; font-size: var(--fs-sm); line-height: 1.5;
|
|
166
|
+
color: var(--text); background: var(--surface-2);
|
|
167
|
+
border: 1px solid var(--line); border-radius: var(--radius); padding: 8px 10px;
|
|
168
|
+
}
|
|
169
|
+
.saga-cmt-input:focus { outline: none; border-color: var(--accent); }
|
|
170
|
+
.saga-overall { min-height: 72px; }
|
|
171
|
+
|
|
172
|
+
/* Line-number gutter becomes a comment target. */
|
|
173
|
+
.saga-linenum { cursor: pointer; }
|
|
174
|
+
.saga-linenum:hover { background: var(--accent-tint) !important; }
|
|
175
|
+
|
|
176
|
+
/* Injected comment row spanning the diff table's columns. */
|
|
177
|
+
.saga-cmt-row > .saga-cmt-cell {
|
|
178
|
+
background: var(--surface); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
|
|
179
|
+
padding: 10px 14px; font-family: var(--font-sans); white-space: normal;
|
|
180
|
+
}
|
|
181
|
+
.saga-cmt {
|
|
182
|
+
display: flex; align-items: flex-start; gap: 8px;
|
|
183
|
+
background: var(--surface-2); border: 1px solid var(--line);
|
|
184
|
+
border-radius: var(--radius); padding: 8px 10px; margin-bottom: 8px;
|
|
185
|
+
}
|
|
186
|
+
.saga-cmt-body { flex: 1; color: var(--text); font-size: var(--fs-sm); line-height: 1.5; }
|
|
187
|
+
.saga-cmt-body p { margin: 0 0 6px; }
|
|
188
|
+
.saga-cmt-body p:last-child { margin-bottom: 0; }
|
|
189
|
+
.saga-cmt-body code {
|
|
190
|
+
background: var(--surface); padding: 1px 5px; border-radius: var(--radius-sm);
|
|
191
|
+
font-family: var(--font-mono); font-size: var(--fs-xs);
|
|
192
|
+
}
|
|
193
|
+
.saga-cmt-del {
|
|
194
|
+
font: inherit; font-size: var(--fs-xs); cursor: pointer; line-height: 1;
|
|
195
|
+
color: var(--text-faint); background: none; border: none; padding: 2px 4px;
|
|
196
|
+
}
|
|
197
|
+
.saga-cmt-del:hover { color: var(--danger); }
|
|
198
|
+
|
|
199
|
+
.saga-cmt-composer { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px; }
|
|
200
|
+
.saga-cmt-composer .saga-cmt-input { flex: 1 1 240px; min-height: 44px; }
|
|
201
|
+
.saga-cmt-composer .saga-btn { flex: 0 0 auto; }
|
|
202
|
+
|
|
203
|
+
/* Per-file comment control in the diff2html file header. */
|
|
204
|
+
.saga-file-cmt-btn {
|
|
205
|
+
float: right; white-space: nowrap; font: inherit; font-size: var(--fs-xs); cursor: pointer;
|
|
206
|
+
color: var(--text-dim); background: var(--surface-2);
|
|
207
|
+
border: 1px solid var(--line); border-radius: var(--radius); padding: 2px 8px;
|
|
208
|
+
}
|
|
209
|
+
.saga-file-cmt-btn:hover { border-color: var(--accent); color: var(--text); }
|
|
210
|
+
.saga-file-cmt-panel {
|
|
211
|
+
display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px;
|
|
212
|
+
background: var(--surface); border-bottom: 1px solid var(--line); padding: 10px 14px;
|
|
213
|
+
}
|
|
214
|
+
/* An explicit display defeats the `hidden` attribute's UA display:none — restore it. */
|
|
215
|
+
.saga-file-cmt-panel[hidden] { display: none; }
|
|
216
|
+
.saga-file-cmt-panel .saga-cmt-input { flex: 1 1 240px; min-height: 44px; }
|
|
217
|
+
|
|
218
|
+
/* --- narrow screens: tighten the reader gutter (the 1000px max-width already
|
|
219
|
+
goes fluid below that width) and shrink the chapter title. --- */
|
|
220
|
+
@media (max-width: 640px) {
|
|
221
|
+
#saga-notice, .saga-toc, .saga-reader { padding-left: 16px; padding-right: 16px; }
|
|
222
|
+
.saga-chapter-title { font-size: var(--fs-lg); }
|
|
223
|
+
.saga-theme-toggle { top: 14px; right: 16px; }
|
|
224
|
+
}
|