sparkecoder 0.1.69 → 0.1.70
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.
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +11 -4
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +75 -62
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/{index-DqaHLgSC.d.ts → index-Dm6wGcYv.d.ts} +19 -19
- package/dist/index.d.ts +5 -5
- package/dist/index.js +75 -62
- package/dist/index.js.map +1 -1
- package/dist/{schema-Bq4tID-f.d.ts → schema-XcP0dedO.d.ts} +3 -3
- package/dist/{search-BRnGaIl-.d.ts → search-CCffrVJE.d.ts} +7 -7
- package/dist/server/index.js +75 -62
- package/dist/server/index.js.map +1 -1
- package/dist/skills/default/qa.md +376 -106
- package/dist/tools/index.d.ts +2 -2
- package/package.json +1 -1
- package/src/skills/default/qa.md +376 -106
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/embed/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/web/.next/server/app/embed/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__c71f29f9._.js → [root-of-the-server]__a1877334._.js} +4 -4
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/web/.next/static/chunks/41a5c049931b2c77.css +1 -0
- package/web/.next/standalone/web/.next/static/chunks/{b6ec74cad9ffd3ee.js → f95d41079838994a.js} +3 -3
- package/web/.next/standalone/web/.next/static/static/chunks/41a5c049931b2c77.css +1 -0
- package/web/.next/standalone/web/.next/static/static/chunks/{b6ec74cad9ffd3ee.js → f95d41079838994a.js} +3 -3
- package/web/.next/standalone/web/src/components/ai-elements/read-file-tool.tsx +19 -2
- package/web/.next/standalone/web/src/components/chat-interface.tsx +49 -4
- package/web/.next/static/chunks/41a5c049931b2c77.css +1 -0
- package/web/.next/static/chunks/{b6ec74cad9ffd3ee.js → f95d41079838994a.js} +3 -3
- package/web/.next/standalone/web/.next/static/chunks/fd39dd62879495e1.css +0 -1
- package/web/.next/standalone/web/.next/static/static/chunks/fd39dd62879495e1.css +0 -1
- package/web/.next/static/chunks/fd39dd62879495e1.css +0 -1
- /package/web/.next/standalone/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_ssgManifest.js +0 -0
- /package/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_buildManifest.js +0 -0
- /package/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_ssgManifest.js +0 -0
|
@@ -195,111 +195,381 @@ Also take a screenshot any time you find an issue -- visual evidence makes the r
|
|
|
195
195
|
|
|
196
196
|
## QA Report Template
|
|
197
197
|
|
|
198
|
-
After testing, produce the report
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
**
|
|
205
|
-
**
|
|
206
|
-
**
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
-
|
|
232
|
-
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
-
|
|
271
|
-
-
|
|
272
|
-
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
198
|
+
After testing, produce the report as a **single-page HTML file**. Replace every `<!-- PLACEHOLDER -->` with real data. Write the file to `qa-report-<date>.html`, then upload it with `upload_file` so the user gets a clickable link to view in a browser.
|
|
199
|
+
|
|
200
|
+
The HTML file is fully self-contained -- all styles are inlined so it looks great with no external dependencies.
|
|
201
|
+
|
|
202
|
+
### Style Guide for the Report
|
|
203
|
+
|
|
204
|
+
- **Overall verdict** uses a large colored banner: green (#16a34a) = Pass, amber (#d97706) = Warnings, red (#dc2626) = Fail
|
|
205
|
+
- **Category cards** show status with a colored dot and issue count
|
|
206
|
+
- **Severity badges** are pill-shaped: High = red, Medium = amber, Low = green
|
|
207
|
+
- **Screenshots** are thumbnail cards that open full-size in a lightbox overlay when clicked
|
|
208
|
+
- **Navigation** is a sticky top bar so readers can jump between sections
|
|
209
|
+
- The page uses the system font stack for fast rendering and a clean, native feel
|
|
210
|
+
- Keep generous whitespace -- `max-width: 960px` centered content
|
|
211
|
+
- Tables use alternating row shading for readability
|
|
212
|
+
|
|
213
|
+
```html
|
|
214
|
+
<!DOCTYPE html>
|
|
215
|
+
<html lang="en">
|
|
216
|
+
<head>
|
|
217
|
+
<meta charset="UTF-8">
|
|
218
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
219
|
+
<title>QA Report — <!-- URL --></title>
|
|
220
|
+
<style>
|
|
221
|
+
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
|
222
|
+
html{scroll-behavior:smooth}
|
|
223
|
+
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;color:#1e293b;background:#f8fafc;line-height:1.6;-webkit-font-smoothing:antialiased}
|
|
224
|
+
|
|
225
|
+
/* NAV */
|
|
226
|
+
.topnav{position:sticky;top:0;z-index:100;background:#fff;border-bottom:1px solid #e2e8f0;padding:0 1.5rem;display:flex;align-items:center;gap:1rem;overflow-x:auto;white-space:nowrap;height:48px;box-shadow:0 1px 3px rgba(0,0,0,.04)}
|
|
227
|
+
.topnav a{font-size:.8rem;font-weight:500;color:#64748b;text-decoration:none;padding:.25rem .5rem;border-radius:6px;transition:background .15s,color .15s}
|
|
228
|
+
.topnav a:hover{background:#f1f5f9;color:#0f172a}
|
|
229
|
+
|
|
230
|
+
/* HERO */
|
|
231
|
+
.hero{text-align:center;padding:3rem 1.5rem 2rem}
|
|
232
|
+
.hero h1{font-size:1.75rem;font-weight:700;margin-bottom:.25rem}
|
|
233
|
+
.hero .meta{font-size:.85rem;color:#64748b;display:flex;flex-wrap:wrap;justify-content:center;gap:.75rem;margin-top:.5rem}
|
|
234
|
+
.hero .meta span{display:inline-flex;align-items:center;gap:.25rem}
|
|
235
|
+
|
|
236
|
+
/* VERDICT BANNER */
|
|
237
|
+
.verdict{margin:0 auto 2rem;max-width:960px;padding:1.25rem 1.5rem;border-radius:12px;text-align:center;font-weight:600;font-size:1.1rem;color:#fff}
|
|
238
|
+
.verdict.pass{background:#16a34a}
|
|
239
|
+
.verdict.warn{background:#d97706}
|
|
240
|
+
.verdict.fail{background:#dc2626}
|
|
241
|
+
|
|
242
|
+
/* CONTAINER */
|
|
243
|
+
.container{max-width:960px;margin:0 auto;padding:0 1.5rem 3rem}
|
|
244
|
+
|
|
245
|
+
/* SUMMARY GRID */
|
|
246
|
+
.summary-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem;margin-bottom:2.5rem}
|
|
247
|
+
.summary-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:1rem 1.25rem;display:flex;align-items:center;gap:.75rem;transition:box-shadow .15s}
|
|
248
|
+
.summary-card:hover{box-shadow:0 2px 8px rgba(0,0,0,.06)}
|
|
249
|
+
.dot{width:12px;height:12px;border-radius:50%;flex-shrink:0}
|
|
250
|
+
.dot.pass{background:#16a34a}.dot.warn{background:#d97706}.dot.fail{background:#dc2626}
|
|
251
|
+
.summary-card .label{font-size:.85rem;font-weight:500;flex:1}
|
|
252
|
+
.summary-card .count{font-size:.8rem;color:#94a3b8;font-weight:500}
|
|
253
|
+
|
|
254
|
+
/* SECTIONS */
|
|
255
|
+
section{margin-bottom:2rem}
|
|
256
|
+
section h2{font-size:1.2rem;font-weight:700;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:2px solid #e2e8f0}
|
|
257
|
+
.detail-block{background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:1.25rem 1.5rem;margin-bottom:1rem}
|
|
258
|
+
.detail-block h3{font-size:1rem;font-weight:600;margin-bottom:.75rem;display:flex;align-items:center;gap:.5rem}
|
|
259
|
+
.detail-block dl{display:grid;grid-template-columns:160px 1fr;gap:.35rem .75rem}
|
|
260
|
+
.detail-block dt{font-size:.825rem;color:#64748b;font-weight:500}
|
|
261
|
+
.detail-block dd{font-size:.875rem}
|
|
262
|
+
.detail-block ul{padding-left:1.25rem;font-size:.875rem}
|
|
263
|
+
.detail-block ul li{margin-bottom:.25rem}
|
|
264
|
+
|
|
265
|
+
/* BADGES */
|
|
266
|
+
.badge{display:inline-block;padding:.15rem .6rem;border-radius:999px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em}
|
|
267
|
+
.badge.high{background:#fef2f2;color:#dc2626;border:1px solid #fecaca}
|
|
268
|
+
.badge.medium{background:#fffbeb;color:#d97706;border:1px solid #fde68a}
|
|
269
|
+
.badge.low{background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0}
|
|
270
|
+
.badge.status-pass{background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0}
|
|
271
|
+
.badge.status-warn{background:#fffbeb;color:#d97706;border:1px solid #fde68a}
|
|
272
|
+
.badge.status-fail{background:#fef2f2;color:#dc2626;border:1px solid #fecaca}
|
|
273
|
+
|
|
274
|
+
/* TABLES */
|
|
275
|
+
table{width:100%;border-collapse:collapse;font-size:.85rem;margin-top:.5rem}
|
|
276
|
+
th{text-align:left;font-weight:600;padding:.6rem .75rem;background:#f8fafc;border-bottom:2px solid #e2e8f0;color:#475569;font-size:.8rem;text-transform:uppercase;letter-spacing:.04em}
|
|
277
|
+
td{padding:.6rem .75rem;border-bottom:1px solid #f1f5f9}
|
|
278
|
+
tr:nth-child(even) td{background:#fafbfc}
|
|
279
|
+
|
|
280
|
+
/* SCREENSHOT GALLERY */
|
|
281
|
+
.gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:.75rem;margin-top:.75rem}
|
|
282
|
+
.gallery-item{cursor:pointer;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;background:#fff;transition:box-shadow .15s,transform .15s}
|
|
283
|
+
.gallery-item:hover{box-shadow:0 4px 12px rgba(0,0,0,.08);transform:translateY(-2px)}
|
|
284
|
+
.gallery-item img{width:100%;height:160px;object-fit:cover;display:block}
|
|
285
|
+
.gallery-item .caption{padding:.6rem .75rem;font-size:.8rem;font-weight:500;color:#334155}
|
|
286
|
+
|
|
287
|
+
/* LIGHTBOX */
|
|
288
|
+
.lightbox{display:none;position:fixed;inset:0;z-index:200;background:rgba(0,0,0,.8);align-items:center;justify-content:center;padding:2rem;cursor:zoom-out}
|
|
289
|
+
.lightbox.active{display:flex}
|
|
290
|
+
.lightbox img{max-width:100%;max-height:90vh;border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.3)}
|
|
291
|
+
|
|
292
|
+
/* RECOMMENDATIONS */
|
|
293
|
+
.rec-list{counter-reset:rec;list-style:none;padding:0}
|
|
294
|
+
.rec-list li{counter-increment:rec;padding:.75rem 1rem .75rem 3rem;position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:.5rem;font-size:.875rem}
|
|
295
|
+
.rec-list li::before{content:counter(rec);position:absolute;left:1rem;top:.75rem;width:1.5rem;height:1.5rem;background:#3b82f6;color:#fff;border-radius:50%;font-size:.75rem;font-weight:700;display:flex;align-items:center;justify-content:center}
|
|
296
|
+
|
|
297
|
+
/* FOOTER */
|
|
298
|
+
footer{text-align:center;padding:2rem 1rem;font-size:.75rem;color:#94a3b8;border-top:1px solid #e2e8f0;margin-top:2rem}
|
|
299
|
+
</style>
|
|
300
|
+
</head>
|
|
301
|
+
<body>
|
|
302
|
+
|
|
303
|
+
<!-- NAVIGATION -->
|
|
304
|
+
<nav class="topnav">
|
|
305
|
+
<a href="#summary">Summary</a>
|
|
306
|
+
<a href="#page-load">Page Load</a>
|
|
307
|
+
<a href="#navigation">Navigation</a>
|
|
308
|
+
<a href="#forms">Forms</a>
|
|
309
|
+
<a href="#visual">Visual & UI</a>
|
|
310
|
+
<a href="#responsive">Responsive</a>
|
|
311
|
+
<a href="#accessibility">Accessibility</a>
|
|
312
|
+
<a href="#errors">Error Handling</a>
|
|
313
|
+
<a href="#issues">Issues</a>
|
|
314
|
+
<a href="#screenshots">Screenshots</a>
|
|
315
|
+
<a href="#recommendations">Recommendations</a>
|
|
316
|
+
</nav>
|
|
317
|
+
|
|
318
|
+
<!-- HERO -->
|
|
319
|
+
<header class="hero">
|
|
320
|
+
<h1>QA Report</h1>
|
|
321
|
+
<div class="meta">
|
|
322
|
+
<span>🔗 <!-- URL tested --></span>
|
|
323
|
+
<span>📅 <!-- date --></span>
|
|
324
|
+
<span>🤖 SparkECoder Agent</span>
|
|
325
|
+
<span>🌐 Chromium (headless)</span>
|
|
326
|
+
</div>
|
|
327
|
+
</header>
|
|
328
|
+
|
|
329
|
+
<!-- OVERALL VERDICT: use class "pass", "warn", or "fail" -->
|
|
330
|
+
<div class="verdict pass">
|
|
331
|
+
<!-- e.g. ✅ PASS — 0 critical issues found -->
|
|
332
|
+
</div>
|
|
333
|
+
|
|
334
|
+
<!-- ====== SUMMARY ====== -->
|
|
335
|
+
<div class="container">
|
|
336
|
+
<section id="summary">
|
|
337
|
+
<h2>Summary</h2>
|
|
338
|
+
<div class="summary-grid">
|
|
339
|
+
<!-- Repeat one card per category. Use dot class: pass / warn / fail -->
|
|
340
|
+
<div class="summary-card">
|
|
341
|
+
<span class="dot pass"></span>
|
|
342
|
+
<span class="label">Page Load</span>
|
|
343
|
+
<span class="count">0 issues</span>
|
|
344
|
+
</div>
|
|
345
|
+
<div class="summary-card">
|
|
346
|
+
<span class="dot pass"></span>
|
|
347
|
+
<span class="label">Navigation</span>
|
|
348
|
+
<span class="count">0 issues</span>
|
|
349
|
+
</div>
|
|
350
|
+
<div class="summary-card">
|
|
351
|
+
<span class="dot pass"></span>
|
|
352
|
+
<span class="label">Forms & Inputs</span>
|
|
353
|
+
<span class="count">0 issues</span>
|
|
354
|
+
</div>
|
|
355
|
+
<div class="summary-card">
|
|
356
|
+
<span class="dot pass"></span>
|
|
357
|
+
<span class="label">Visual & UI</span>
|
|
358
|
+
<span class="count">0 issues</span>
|
|
359
|
+
</div>
|
|
360
|
+
<div class="summary-card">
|
|
361
|
+
<span class="dot pass"></span>
|
|
362
|
+
<span class="label">Responsive</span>
|
|
363
|
+
<span class="count">0 issues</span>
|
|
364
|
+
</div>
|
|
365
|
+
<div class="summary-card">
|
|
366
|
+
<span class="dot pass"></span>
|
|
367
|
+
<span class="label">Accessibility</span>
|
|
368
|
+
<span class="count">0 issues</span>
|
|
369
|
+
</div>
|
|
370
|
+
<div class="summary-card">
|
|
371
|
+
<span class="dot pass"></span>
|
|
372
|
+
<span class="label">Error Handling</span>
|
|
373
|
+
<span class="count">0 issues</span>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
</section>
|
|
377
|
+
|
|
378
|
+
<!-- ====== DETAILED FINDINGS ====== -->
|
|
379
|
+
|
|
380
|
+
<!-- PAGE LOAD -->
|
|
381
|
+
<section id="page-load">
|
|
382
|
+
<h2>Page Load & Performance</h2>
|
|
383
|
+
<div class="detail-block">
|
|
384
|
+
<h3><span class="badge status-pass">Pass</span> Page Load</h3>
|
|
385
|
+
<dl>
|
|
386
|
+
<dt>Load Time</dt> <dd><!-- fast / moderate / slow --></dd>
|
|
387
|
+
<dt>Console Errors</dt> <dd><!-- none / list --></dd>
|
|
388
|
+
<dt>Missing Assets</dt> <dd><!-- none / list --></dd>
|
|
389
|
+
</dl>
|
|
390
|
+
<!-- Baseline screenshot (optional) -->
|
|
391
|
+
</div>
|
|
392
|
+
</section>
|
|
393
|
+
|
|
394
|
+
<!-- NAVIGATION -->
|
|
395
|
+
<section id="navigation">
|
|
396
|
+
<h2>Navigation & Links</h2>
|
|
397
|
+
<div class="detail-block">
|
|
398
|
+
<h3><span class="badge status-pass">Pass</span> Navigation</h3>
|
|
399
|
+
<dl>
|
|
400
|
+
<dt>Links Tested</dt> <dd><!-- count --></dd>
|
|
401
|
+
<dt>Broken Links</dt> <dd><!-- none / list --></dd>
|
|
402
|
+
</dl>
|
|
403
|
+
</div>
|
|
404
|
+
</section>
|
|
405
|
+
|
|
406
|
+
<!-- FORMS -->
|
|
407
|
+
<section id="forms">
|
|
408
|
+
<h2>Forms & Inputs</h2>
|
|
409
|
+
<div class="detail-block">
|
|
410
|
+
<h3><span class="badge status-pass">Pass</span> Forms</h3>
|
|
411
|
+
<dl>
|
|
412
|
+
<dt>Forms Tested</dt> <dd><!-- count --></dd>
|
|
413
|
+
<dt>Validation Issues</dt> <dd><!-- none / list --></dd>
|
|
414
|
+
<dt>Submission Issues</dt> <dd><!-- none / list --></dd>
|
|
415
|
+
</dl>
|
|
416
|
+
</div>
|
|
417
|
+
</section>
|
|
418
|
+
|
|
419
|
+
<!-- VISUAL & UI -->
|
|
420
|
+
<section id="visual">
|
|
421
|
+
<h2>Visual & UI</h2>
|
|
422
|
+
<div class="detail-block">
|
|
423
|
+
<h3><span class="badge status-pass">Pass</span> Visual</h3>
|
|
424
|
+
<ul>
|
|
425
|
+
<!-- <li>Description of issue + link to screenshot</li> -->
|
|
426
|
+
<li>No visual issues found.</li>
|
|
427
|
+
</ul>
|
|
428
|
+
</div>
|
|
429
|
+
</section>
|
|
430
|
+
|
|
431
|
+
<!-- RESPONSIVE -->
|
|
432
|
+
<section id="responsive">
|
|
433
|
+
<h2>Responsive Design</h2>
|
|
434
|
+
<div class="detail-block">
|
|
435
|
+
<h3><span class="badge status-pass">Pass</span> Responsive</h3>
|
|
436
|
+
<table>
|
|
437
|
+
<thead><tr><th>Viewport</th><th>Size</th><th>Screenshot</th><th>Issues</th></tr></thead>
|
|
438
|
+
<tbody>
|
|
439
|
+
<tr>
|
|
440
|
+
<td>Mobile</td><td>375 × 812</td>
|
|
441
|
+
<td><a href="<!-- download_url -->" target="_blank">View</a></td>
|
|
442
|
+
<td><!-- none / description --></td>
|
|
443
|
+
</tr>
|
|
444
|
+
<tr>
|
|
445
|
+
<td>Tablet</td><td>768 × 1024</td>
|
|
446
|
+
<td><a href="<!-- download_url -->" target="_blank">View</a></td>
|
|
447
|
+
<td><!-- none / description --></td>
|
|
448
|
+
</tr>
|
|
449
|
+
<tr>
|
|
450
|
+
<td>Desktop</td><td>1440 × 900</td>
|
|
451
|
+
<td><a href="<!-- download_url -->" target="_blank">View</a></td>
|
|
452
|
+
<td><!-- none / description --></td>
|
|
453
|
+
</tr>
|
|
454
|
+
</tbody>
|
|
455
|
+
</table>
|
|
456
|
+
</div>
|
|
457
|
+
</section>
|
|
458
|
+
|
|
459
|
+
<!-- ACCESSIBILITY -->
|
|
460
|
+
<section id="accessibility">
|
|
461
|
+
<h2>Accessibility</h2>
|
|
462
|
+
<div class="detail-block">
|
|
463
|
+
<h3><span class="badge status-pass">Pass</span> Accessibility</h3>
|
|
464
|
+
<dl>
|
|
465
|
+
<dt>Images Missing Alt</dt> <dd><!-- count --></dd>
|
|
466
|
+
<dt>Buttons Missing ARIA</dt> <dd><!-- count --></dd>
|
|
467
|
+
<dt>Other Issues</dt> <dd><!-- list --></dd>
|
|
468
|
+
</dl>
|
|
469
|
+
</div>
|
|
470
|
+
</section>
|
|
471
|
+
|
|
472
|
+
<!-- ERROR HANDLING -->
|
|
473
|
+
<section id="errors">
|
|
474
|
+
<h2>Error Handling</h2>
|
|
475
|
+
<div class="detail-block">
|
|
476
|
+
<h3><span class="badge status-pass">Pass</span> Error Handling</h3>
|
|
477
|
+
<dl>
|
|
478
|
+
<dt>404 Page</dt> <dd><!-- present and styled / missing / broken --></dd>
|
|
479
|
+
<dt>Other Errors</dt> <dd><!-- notes --></dd>
|
|
480
|
+
</dl>
|
|
481
|
+
</div>
|
|
482
|
+
</section>
|
|
483
|
+
|
|
484
|
+
<!-- ====== ISSUES TABLE ====== -->
|
|
485
|
+
<section id="issues">
|
|
486
|
+
<h2>Issues</h2>
|
|
487
|
+
<table>
|
|
488
|
+
<thead><tr><th>#</th><th>Severity</th><th>Category</th><th>Description</th><th>Evidence</th></tr></thead>
|
|
489
|
+
<tbody>
|
|
490
|
+
<!-- Repeat rows. Use badge classes: high / medium / low -->
|
|
491
|
+
<tr>
|
|
492
|
+
<td>1</td>
|
|
493
|
+
<td><span class="badge high">High</span></td>
|
|
494
|
+
<td><!-- category --></td>
|
|
495
|
+
<td><!-- description --></td>
|
|
496
|
+
<td><a href="<!-- download_url -->" target="_blank">Screenshot</a></td>
|
|
497
|
+
</tr>
|
|
498
|
+
<!-- If no issues, show a single row: -->
|
|
499
|
+
<!--
|
|
500
|
+
<tr><td colspan="5" style="text-align:center;color:#64748b;padding:1.5rem">No issues found 🎉</td></tr>
|
|
501
|
+
-->
|
|
502
|
+
</tbody>
|
|
503
|
+
</table>
|
|
504
|
+
</section>
|
|
505
|
+
|
|
506
|
+
<!-- ====== SCREENSHOT GALLERY ====== -->
|
|
507
|
+
<section id="screenshots">
|
|
508
|
+
<h2>Screenshots</h2>
|
|
509
|
+
<div class="gallery">
|
|
510
|
+
<!-- Repeat one gallery-item per screenshot. onclick opens lightbox. -->
|
|
511
|
+
<div class="gallery-item" onclick="openLightbox('<!-- download_url -->')">
|
|
512
|
+
<img src="<!-- download_url -->" alt="Homepage baseline" loading="lazy">
|
|
513
|
+
<div class="caption">qa-home.png — Homepage baseline</div>
|
|
514
|
+
</div>
|
|
515
|
+
<div class="gallery-item" onclick="openLightbox('<!-- download_url -->')">
|
|
516
|
+
<img src="<!-- download_url -->" alt="Mobile viewport" loading="lazy">
|
|
517
|
+
<div class="caption">qa-mobile.png — Mobile (375px)</div>
|
|
518
|
+
</div>
|
|
519
|
+
<div class="gallery-item" onclick="openLightbox('<!-- download_url -->')">
|
|
520
|
+
<img src="<!-- download_url -->" alt="Tablet viewport" loading="lazy">
|
|
521
|
+
<div class="caption">qa-tablet.png — Tablet (768px)</div>
|
|
522
|
+
</div>
|
|
523
|
+
<div class="gallery-item" onclick="openLightbox('<!-- download_url -->')">
|
|
524
|
+
<img src="<!-- download_url -->" alt="Desktop viewport" loading="lazy">
|
|
525
|
+
<div class="caption">qa-desktop.png — Desktop (1440px)</div>
|
|
526
|
+
</div>
|
|
527
|
+
<div class="gallery-item" onclick="openLightbox('<!-- download_url -->')">
|
|
528
|
+
<img src="<!-- download_url -->" alt="404 page" loading="lazy">
|
|
529
|
+
<div class="caption">qa-404.png — Error page</div>
|
|
530
|
+
</div>
|
|
531
|
+
<!-- Add more gallery items for issue screenshots -->
|
|
532
|
+
</div>
|
|
533
|
+
</section>
|
|
534
|
+
|
|
535
|
+
<!-- ====== RECOMMENDATIONS ====== -->
|
|
536
|
+
<section id="recommendations">
|
|
537
|
+
<h2>Recommendations</h2>
|
|
538
|
+
<ol class="rec-list">
|
|
539
|
+
<li><!-- Highest priority fix --></li>
|
|
540
|
+
<li><!-- Next priority --></li>
|
|
541
|
+
<!-- Add more as needed -->
|
|
542
|
+
</ol>
|
|
543
|
+
</section>
|
|
544
|
+
|
|
545
|
+
</div><!-- /container -->
|
|
546
|
+
|
|
547
|
+
<!-- LIGHTBOX OVERLAY -->
|
|
548
|
+
<div class="lightbox" id="lightbox" onclick="closeLightbox()">
|
|
549
|
+
<img id="lightbox-img" src="" alt="Full-size screenshot">
|
|
550
|
+
</div>
|
|
551
|
+
|
|
552
|
+
<footer>Generated by SparkECoder Agent · <!-- date --></footer>
|
|
553
|
+
|
|
554
|
+
<script>
|
|
555
|
+
function openLightbox(src){var lb=document.getElementById('lightbox');document.getElementById('lightbox-img').src=src;lb.classList.add('active');}
|
|
556
|
+
function closeLightbox(){document.getElementById('lightbox').classList.remove('active');}
|
|
557
|
+
document.addEventListener('keydown',function(e){if(e.key==='Escape')closeLightbox();});
|
|
558
|
+
</script>
|
|
559
|
+
</body>
|
|
560
|
+
</html>
|
|
561
|
+
```
|
|
296
562
|
|
|
297
|
-
|
|
563
|
+
### How to Fill the Template
|
|
298
564
|
|
|
299
|
-
1.
|
|
300
|
-
2.
|
|
301
|
-
3.
|
|
302
|
-
|
|
565
|
+
1. Replace every `<!-- PLACEHOLDER -->` comment with real values from your testing
|
|
566
|
+
2. For each category's status badge, use the correct class: `status-pass`, `status-warn`, or `status-fail`
|
|
567
|
+
3. For each summary card dot, use the correct class: `pass`, `warn`, or `fail`
|
|
568
|
+
4. For the verdict banner, set the class to `pass`, `warn`, or `fail` and write a one-liner summary
|
|
569
|
+
5. In the Issues table, use severity badge classes: `high`, `medium`, or `low`
|
|
570
|
+
6. In the Screenshot gallery, set the `src`, `alt`, and `onclick` URL to each screenshot's `download_url`
|
|
571
|
+
7. Add or remove gallery items and issue rows to match what you actually found
|
|
572
|
+
8. If a section is not applicable (e.g. no forms on the page), you may remove that section entirely or note "N/A"
|
|
303
573
|
|
|
304
574
|
---
|
|
305
575
|
|
|
@@ -312,6 +582,6 @@ After testing, produce the report in this format. Replace `<download_url>` place
|
|
|
312
582
|
5. **Be specific** -- "Submit button overlaps footer at 375px" is better than "layout issue on mobile"
|
|
313
583
|
6. **Use descriptive screenshot names** -- `qa-issue-nav-overlap.png` not `screenshot3.png`
|
|
314
584
|
7. **Close the browser when done** -- always run `agent-browser close` at the end
|
|
315
|
-
8. **Save the report** -- write the final report to `qa-report-<date>.
|
|
316
|
-
9. **Upload the report
|
|
317
|
-
|
|
585
|
+
8. **Save the report as HTML** -- write the final report to `qa-report-<date>.html` (not markdown)
|
|
586
|
+
9. **Upload the report** -- after writing the HTML file, `upload_file` it so the user gets a clickable link that opens as a styled webpage
|
|
587
|
+
10. **Return the URL** -- give the user the uploaded report URL so they can share it
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as ai from 'ai';
|
|
2
2
|
import { ToolSet } from 'ai';
|
|
3
|
-
import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from '../search-
|
|
4
|
-
export { b as BashToolOptions, d as SearchToolOptions, e as WriteFileToolOptions, c as createBashTool, f as createSearchTool, a as createWriteFileTool } from '../search-
|
|
3
|
+
import { B as BashToolProgress, W as WriteFileProgress, S as SearchToolProgress } from '../search-CCffrVJE.js';
|
|
4
|
+
export { b as BashToolOptions, d as SearchToolOptions, e as WriteFileToolOptions, c as createBashTool, f as createSearchTool, a as createWriteFileTool } from '../search-CCffrVJE.js';
|
|
5
5
|
|
|
6
6
|
interface TaskCompletionSignal {
|
|
7
7
|
status: 'completed' | 'failed';
|