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.
Files changed (115) hide show
  1. package/dist/agent/index.d.ts +3 -3
  2. package/dist/agent/index.js +11 -4
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/cli.js +75 -62
  5. package/dist/cli.js.map +1 -1
  6. package/dist/db/index.d.ts +2 -2
  7. package/dist/{index-DqaHLgSC.d.ts → index-Dm6wGcYv.d.ts} +19 -19
  8. package/dist/index.d.ts +5 -5
  9. package/dist/index.js +75 -62
  10. package/dist/index.js.map +1 -1
  11. package/dist/{schema-Bq4tID-f.d.ts → schema-XcP0dedO.d.ts} +3 -3
  12. package/dist/{search-BRnGaIl-.d.ts → search-CCffrVJE.d.ts} +7 -7
  13. package/dist/server/index.js +75 -62
  14. package/dist/server/index.js.map +1 -1
  15. package/dist/skills/default/qa.md +376 -106
  16. package/dist/tools/index.d.ts +2 -2
  17. package/package.json +1 -1
  18. package/src/skills/default/qa.md +376 -106
  19. package/web/.next/BUILD_ID +1 -1
  20. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  21. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  22. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  23. package/web/.next/standalone/web/.next/server/app/(main)/page_client-reference-manifest.js +1 -1
  24. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page.js.nft.json +1 -1
  25. package/web/.next/standalone/web/.next/server/app/(main)/session/[id]/page_client-reference-manifest.js +1 -1
  26. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  27. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  29. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  35. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +2 -2
  36. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  37. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  38. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  39. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  41. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  42. package/web/.next/standalone/web/.next/server/app/docs/installation/page_client-reference-manifest.js +1 -1
  43. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  44. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +2 -2
  45. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +2 -2
  46. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +2 -2
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +2 -2
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
  52. package/web/.next/standalone/web/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/skills/page_client-reference-manifest.js +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  55. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +2 -2
  56. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +2 -2
  57. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +2 -2
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +2 -2
  60. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  61. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs/tools/page_client-reference-manifest.js +1 -1
  64. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  65. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +2 -2
  66. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +2 -2
  67. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +2 -2
  69. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +2 -2
  70. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
  71. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  72. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
  73. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  74. package/web/.next/standalone/web/.next/server/app/docs.rsc +2 -2
  75. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +2 -2
  76. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  77. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +2 -2
  78. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
  79. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  80. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  81. package/web/.next/standalone/web/.next/server/app/embed/[id]/page.js.nft.json +1 -1
  82. package/web/.next/standalone/web/.next/server/app/embed/[id]/page_client-reference-manifest.js +1 -1
  83. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  84. package/web/.next/standalone/web/.next/server/app/index.rsc +2 -2
  85. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
  86. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
  87. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +2 -2
  88. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  89. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
  90. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  91. package/web/.next/standalone/web/.next/server/chunks/ssr/{[root-of-the-server]__c71f29f9._.js → [root-of-the-server]__a1877334._.js} +4 -4
  92. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  93. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  94. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  95. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  96. package/web/.next/standalone/web/.next/static/chunks/41a5c049931b2c77.css +1 -0
  97. package/web/.next/standalone/web/.next/static/chunks/{b6ec74cad9ffd3ee.js → f95d41079838994a.js} +3 -3
  98. package/web/.next/standalone/web/.next/static/static/chunks/41a5c049931b2c77.css +1 -0
  99. package/web/.next/standalone/web/.next/static/static/chunks/{b6ec74cad9ffd3ee.js → f95d41079838994a.js} +3 -3
  100. package/web/.next/standalone/web/src/components/ai-elements/read-file-tool.tsx +19 -2
  101. package/web/.next/standalone/web/src/components/chat-interface.tsx +49 -4
  102. package/web/.next/static/chunks/41a5c049931b2c77.css +1 -0
  103. package/web/.next/static/chunks/{b6ec74cad9ffd3ee.js → f95d41079838994a.js} +3 -3
  104. package/web/.next/standalone/web/.next/static/chunks/fd39dd62879495e1.css +0 -1
  105. package/web/.next/standalone/web/.next/static/static/chunks/fd39dd62879495e1.css +0 -1
  106. package/web/.next/static/chunks/fd39dd62879495e1.css +0 -1
  107. /package/web/.next/standalone/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_buildManifest.js +0 -0
  108. /package/web/.next/standalone/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_clientMiddlewareManifest.json +0 -0
  109. /package/web/.next/standalone/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_ssgManifest.js +0 -0
  110. /package/web/.next/standalone/web/.next/static/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_buildManifest.js +0 -0
  111. /package/web/.next/standalone/web/.next/static/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_clientMiddlewareManifest.json +0 -0
  112. /package/web/.next/standalone/web/.next/static/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_ssgManifest.js +0 -0
  113. /package/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_buildManifest.js +0 -0
  114. /package/web/.next/static/{XB638PEDChQhwk6wSMrSh → PpaOWDfndYJrA-tJYr7gU}/_clientMiddlewareManifest.json +0 -0
  115. /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 in this format. Replace `<download_url>` placeholders with the actual URLs returned by `upload_file`. Write the final report to `qa-report-<date>.md`.
199
-
200
- ```markdown
201
- # QA Report
202
-
203
- **URL:** <tested url>
204
- **Date:** <date>
205
- **Tester:** SparkECoder Agent
206
- **Environment:** Chromium (headless) / <OS>
207
-
208
- ---
209
-
210
- ## Summary
211
-
212
- | Category | Status | Issues |
213
- |---------------------|--------|--------|
214
- | Page Load | ✅ / ⚠️ / ❌ | <count> |
215
- | Navigation & Links | ✅ / ⚠️ / ❌ | <count> |
216
- | Forms & Inputs | ✅ / ⚠️ / ❌ | <count> |
217
- | Visual & UI | ✅ / ⚠️ / ❌ | <count> |
218
- | Responsive Design | ✅ / ⚠️ / ❌ | <count> |
219
- | Accessibility | / ⚠️ / ❌ | <count> |
220
- | Error Handling | ✅ / ⚠️ / ❌ | <count> |
221
-
222
- **Overall:** ✅ Pass / ⚠️ Pass with warnings / ❌ Fail
223
-
224
- ---
225
-
226
- ## Detailed Findings
227
-
228
- ### Page Load & Performance
229
- - **Status:** ✅ / ⚠️ / ❌
230
- - **Load time:** <fast / moderate / slow>
231
- - **Console errors:** <none / list>
232
- - **Missing assets:** <none / list>
233
- - **Baseline:** ![Homepage](<download_url for qa-home.png>)
234
-
235
- ### Navigation & Links
236
- - **Status:** / ⚠️ / ❌
237
- - **Links tested:** <count>
238
- - **Broken links:** <none / list with URLs>
239
-
240
- ### Forms & Inputs
241
- - **Status:** ✅ / ⚠️ / ❌
242
- - **Forms tested:** <count>
243
- - **Validation issues:** <none / list>
244
- - **Submission issues:** <none / list>
245
-
246
- ### Visual & UI
247
- - **Status:** / ⚠️ / ❌
248
- - **Issues:**
249
- - <description of any visual issues found>
250
- - ![Issue screenshot](<download_url>)
251
-
252
- ### Responsive Design
253
- - **Status:** ✅ / ⚠️ / ❌
254
- - **Viewports tested:**
255
-
256
- | Viewport | Size | Screenshot | Issues |
257
- |----------|------|------------|--------|
258
- | Mobile | 375 x 812 | ![Mobile](<download_url for qa-mobile.png>) | <none / description> |
259
- | Tablet | 768 x 1024 | ![Tablet](<download_url for qa-tablet.png>) | <none / description> |
260
- | Desktop | 1440 x 900 | ![Desktop](<download_url for qa-desktop.png>) | <none / description> |
261
-
262
- ### Accessibility
263
- - **Status:** ✅ / ⚠️ / ❌
264
- - **Images missing alt text:** <count>
265
- - **Buttons missing ARIA labels:** <count>
266
- - **Other issues:** <list>
267
-
268
- ### Error Handling
269
- - **Status:** ✅ / ⚠️ / ❌
270
- - **404 page:** <present and styled / missing / broken>
271
- - **Screenshot:** ![404 page](<download_url for qa-404.png>)
272
- - **Other error handling:** <notes>
273
-
274
- ---
275
-
276
- ## Issues List
277
-
278
- | # | Severity | Category | Description | Evidence |
279
- |---|----------|----------|-------------|----------|
280
- | 1 | 🔴 High / 🟡 Medium / 🟢 Low | <category> | <description> | ![Issue](<download_url>) |
281
-
282
- ---
283
-
284
- ## All Screenshots
285
-
286
- | Name | Description | Link |
287
- |------|-------------|------|
288
- | qa-home.png | Homepage baseline | [View](<download_url>) |
289
- | qa-mobile.png | Mobile viewport (375px) | [View](<download_url>) |
290
- | qa-tablet.png | Tablet viewport (768px) | [View](<download_url>) |
291
- | qa-desktop.png | Desktop viewport (1440px) | [View](<download_url>) |
292
- | qa-404.png | 404 error page | [View](<download_url>) |
293
- | <additional screenshots for specific issues> |||
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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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
- ## Recommendations
563
+ ### How to Fill the Template
298
564
 
299
- 1. <Highest priority fix>
300
- 2. <Next priority>
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>.md`
316
- 9. **Upload the report too** -- after writing the report file, `upload_file` it so the user gets a shareable link
317
- 8. **Upload the report** using the upload file tool and return that url to the user
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
@@ -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-BRnGaIl-.js';
4
- export { b as BashToolOptions, d as SearchToolOptions, e as WriteFileToolOptions, c as createBashTool, f as createSearchTool, a as createWriteFileTool } from '../search-BRnGaIl-.js';
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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sparkecoder",
3
- "version": "0.1.69",
3
+ "version": "0.1.70",
4
4
  "description": "A powerful coding agent CLI with HTTP API for development environments",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",