Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
541f96cbbf | ||
|
|
3af9cdfc0c | ||
|
|
b974bc7c0b | ||
|
|
91233dfe57 | ||
|
|
2a2749f852 | ||
|
|
56230aa329 | ||
|
|
b93bb5830b | ||
|
|
6d1a376515 | ||
|
|
62fe5954b0 | ||
|
|
41dd6de0e1 | ||
|
|
2c04427f67 | ||
|
|
64569284e9 | ||
|
|
1ab9c35f15 | ||
|
|
292c2ecbb9 | ||
|
|
cf70a8f961 | ||
|
|
410d2e04f7 | ||
|
|
4965ff6f1f | ||
|
|
11315a83c2 | ||
|
|
0f0e955479 | ||
|
|
0103c00a72 | ||
|
|
de907c9dbe | ||
|
|
5d96853cff | ||
|
|
ceeb1162ca | ||
|
|
5e86028356 | ||
|
|
4867d3389d | ||
|
|
5108072523 | ||
|
|
b61c0c240e | ||
|
|
ff6f2f6b36 | ||
|
|
c25bd0808d | ||
|
|
0460d03780 | ||
|
|
3ddbac35f3 | ||
|
|
6b4e0f6c0f | ||
|
|
e2e3e792b5 | ||
|
|
f671b886ce | ||
|
|
690413fb60 | ||
|
|
c9869901d0 | ||
|
|
827205a21e | ||
|
|
51fe501601 | ||
|
|
54d7fc0f2b | ||
|
|
21941b5a08 | ||
|
|
e3de833359 | ||
|
|
7829eb13de | ||
|
|
c6cfc4feb5 | ||
|
|
3a175f4d33 | ||
|
|
a0133cd6c9 | ||
|
|
fb60071c13 | ||
|
|
57ef9ace63 | ||
|
|
b42573cd3e | ||
|
|
809119c99a | ||
|
|
b85ba642a5 | ||
|
|
a4f8e30b7d | ||
|
|
2e558271a2 | ||
|
|
4baf9d2554 | ||
|
|
8bbecd15f8 | ||
|
|
e6cb9467c6 | ||
|
|
cebf50a842 | ||
|
|
0c7caf01bf | ||
|
|
b3b558d700 | ||
|
|
78bbed1d78 | ||
|
|
e7ad1f2e94 | ||
|
|
ed8cc656ab | ||
|
|
794ee23c03 | ||
|
|
d227986dde | ||
|
|
1f47d000f8 | ||
|
|
0cd1a73870 | ||
|
|
5c28a2a252 | ||
|
|
586a08ed4d | ||
|
|
2b78e7fe7c | ||
|
|
2be43c04aa | ||
|
|
fe759a574e | ||
|
|
c2a1ce7e8b | ||
|
|
0b8c0676d6 | ||
|
|
c190aec76f | ||
|
|
c745f45e45 | ||
|
|
1cd4a02af6 | ||
|
|
8728b6759b | ||
|
|
c891fc984b | ||
|
|
6169c87cdc | ||
|
|
1020c5ae3a | ||
|
|
0c2da9fdd2 | ||
|
|
ab1cb6b48f | ||
|
|
6c4d62777e | ||
|
|
d104bed8fb | ||
|
|
7dcd243275 | ||
|
|
f4036351a8 | ||
|
|
5babca05f0 | ||
|
|
660e59742b | ||
|
|
a89a46a1cc | ||
|
|
e1022fdef3 | ||
|
|
e95ccacfa0 | ||
|
|
1b5a5a8d35 | ||
|
|
caa94f0ba6 | ||
|
|
e638154f64 | ||
|
|
1151e92a47 | ||
|
|
303fce970e | ||
|
|
aaab5d53bc | ||
|
|
84cae81864 | ||
|
|
90d6b50662 | ||
|
|
320f431f2d | ||
|
|
da636b20d1 | ||
|
|
4abb5181bb | ||
|
|
63d94a06a7 | ||
|
|
2eeeb9a433 | ||
|
|
10634d1789 | ||
|
|
30640a10c8 | ||
|
|
05a2604cb6 | ||
|
|
b78ed1e242 | ||
|
|
c5a40d6d09 | ||
|
|
746905d7b9 | ||
|
|
0533b780be | ||
|
|
8df19780ea | ||
|
|
fa4859bc88 |
@@ -0,0 +1,16 @@
|
||||
# Frontend
|
||||
VITE_CONVEX_URL=
|
||||
VITE_CONVEX_SITE_URL=
|
||||
SITE_URL=http://localhost:3000
|
||||
CONVEX_SITE_URL=
|
||||
|
||||
# Convex Auth (GitHub OAuth App)
|
||||
AUTH_GITHUB_ID=
|
||||
AUTH_GITHUB_SECRET=
|
||||
|
||||
# Convex Auth JWT keys (generated via @convex-dev/auth CLI)
|
||||
JWT_PRIVATE_KEY=
|
||||
JWKS=
|
||||
|
||||
# Embeddings
|
||||
OPENAI_API_KEY=
|
||||
@@ -0,0 +1,39 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: 1.3.5
|
||||
|
||||
- name: Install
|
||||
run: bun install --frozen-lockfile
|
||||
|
||||
- name: Lint
|
||||
run: bun run lint
|
||||
|
||||
- name: Test
|
||||
run: bun run test
|
||||
|
||||
- name: Coverage
|
||||
run: bun run coverage
|
||||
|
||||
- name: Typecheck packages
|
||||
run: |
|
||||
bunx tsc -p packages/schema/tsconfig.json --noEmit
|
||||
bunx tsc -p packages/clawdhub/tsconfig.json --noEmit
|
||||
|
||||
- name: Build
|
||||
run: bun run build
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
!packages/schema/dist
|
||||
!packages/schema/dist/**
|
||||
*.local
|
||||
.vercel
|
||||
count.txt
|
||||
.env
|
||||
.nitro
|
||||
.tanstack
|
||||
.wrangler
|
||||
.output
|
||||
.vinxi
|
||||
todos.json
|
||||
.cta.json
|
||||
.vscode
|
||||
.env*.local
|
||||
coverage
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"ignorePatterns": ["node_modules", "dist", "coverage", "convex/_generated", ".tanstack", "public"]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Repository Guidelines
|
||||
|
||||
## Project Structure & Module Organization
|
||||
- `src/` — TanStack Start app code (routes, components, styles).
|
||||
- `convex/` — Convex backend (schema, queries/mutations/actions, HTTP routes).
|
||||
- `convex/_generated/` — generated Convex API/types; committed for builds.
|
||||
- `docs/` — product/spec docs (see `docs/spec.md`).
|
||||
- `public/` — static assets.
|
||||
|
||||
## Build, Test, and Development Commands
|
||||
- `bun run dev` — local app server at `http://localhost:3000`.
|
||||
- `bun run build` — production build (Vite + Nitro).
|
||||
- `bun run preview` — preview built app.
|
||||
- `bunx convex dev` — Convex dev deployment + function watcher.
|
||||
- `bunx convex codegen` — regenerate `convex/_generated`.
|
||||
- `bun run lint` — Biome + oxlint (type-aware).
|
||||
- `bun run test` — Vitest (unit tests).
|
||||
- `bun run coverage` — coverage run; keep global >= 80%.
|
||||
|
||||
## Coding Style & Naming Conventions
|
||||
- TypeScript strict; ESM.
|
||||
- Indentation: 2 spaces, single quotes (Biome).
|
||||
- Lint/format: Biome + oxlint (type-aware).
|
||||
- Convex function names: verb-first (`getBySlug`, `publishVersion`).
|
||||
|
||||
## Testing Guidelines
|
||||
- Framework: Vitest 4 + jsdom.
|
||||
- Tests live in `src/**` and `convex/lib/**`.
|
||||
- Coverage threshold: 80% global (lines/functions/branches/statements).
|
||||
- Example: `convex/lib/skills.test.ts`.
|
||||
|
||||
## Commit & Pull Request Guidelines
|
||||
- Commit messages: Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`…).
|
||||
- Keep changes scoped; avoid repo-wide search/replace.
|
||||
- PRs: include summary + test commands run. Add screenshots for UI changes.
|
||||
|
||||
## Configuration & Security
|
||||
- Local env: `.env.local` (never commit secrets).
|
||||
- Convex env holds JWT keys; Vercel only needs `VITE_CONVEX_URL` + `VITE_CONVEX_SITE_URL`.
|
||||
- OAuth: GitHub OAuth App credentials required for login.
|
||||
@@ -0,0 +1,27 @@
|
||||
# Changelog
|
||||
|
||||
## 0.0.2 - 2026-01-04
|
||||
|
||||
### Added
|
||||
- CLI: delete/undelete commands for soft-deleted skills (owner/admin).
|
||||
|
||||
### Fixed
|
||||
- CLI sync: dedupe duplicate slugs across scan roots; skip duplicates to avoid double-publish errors.
|
||||
- CLI sync: show parsing progress while hashing local skills.
|
||||
- CLI sync: prompt only actionable skills; preselect all by default; list synced separately; condensed synced summary when nothing to sync.
|
||||
- CLI sync: cap long status lists to avoid massive terminal boxes.
|
||||
- CLI publish/sync: allow empty changelog on updates; registry accepts empty changelog for updates.
|
||||
- CLI: use `--cli-version` to avoid conflict with skill `--version` flags.
|
||||
- Registry: hide soft-deleted skills from search/skill/download unless restored.
|
||||
- Tests: add delete/undelete coverage (unit + e2e).
|
||||
|
||||
## 0.0.1 - 2026-01-04
|
||||
|
||||
### Features
|
||||
- CLI auth: login/logout/whoami; browser loopback auth; token storage; site/registry discovery; config overrides.
|
||||
- CLI workflow: search, install, update (single/all), list, publish, sync (scan workdir + legacy roots), dry-run, version bumping, tags.
|
||||
- Registry/API: skills + versions with semver; tags (latest + custom); changelog per version; SKILL.md frontmatter parsing; text-only validation; zip download; hash resolve; stats (downloads/stars/versions/comments).
|
||||
- Web app: home (highlighted + latest), search, skill detail (README, versions, tags, stats, files), upload UI, user profiles, stars, settings (profile + API tokens + delete account).
|
||||
- Social: stars + comments with moderation hooks; admin console for roles + highlighted curation.
|
||||
- Search: semantic/vector search over skill content with limit/approved filters.
|
||||
- Security: GitHub OAuth; role-based access (admin/moderator/user); audit logging for admin actions.
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 Peter Steinberger
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,45 @@
|
||||
# ClawdHub
|
||||
|
||||
Minimal skill registry powered by TanStack Start + Convex.
|
||||
|
||||
## Quick start
|
||||
|
||||
```bash
|
||||
bun install
|
||||
cp .env.local.example .env.local
|
||||
bun --bun run dev
|
||||
```
|
||||
|
||||
In another terminal:
|
||||
|
||||
```bash
|
||||
bunx convex dev
|
||||
```
|
||||
|
||||
## Convex Auth setup
|
||||
|
||||
```bash
|
||||
bunx auth --deployment-name <deployment> --web-server-url http://localhost:3000
|
||||
```
|
||||
|
||||
This writes `JWT_PRIVATE_KEY` + `JWKS` to the deployment and prints the values for local `.env.local`.
|
||||
|
||||
## Environment
|
||||
|
||||
- `VITE_CONVEX_URL`: Convex deployment URL (`https://<deployment>.convex.cloud`).
|
||||
- `VITE_CONVEX_SITE_URL`: Convex site URL (`https://<deployment>.convex.site`).
|
||||
- `CONVEX_SITE_URL`: same as `VITE_CONVEX_SITE_URL` (auth + cookies).
|
||||
- `SITE_URL`: App URL (local: `http://localhost:3000`).
|
||||
- `AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`: GitHub OAuth App.
|
||||
- `JWT_PRIVATE_KEY` / `JWKS`: Convex Auth keys.
|
||||
- `OPENAI_API_KEY`: embeddings.
|
||||
|
||||
## Scripts
|
||||
|
||||
```bash
|
||||
bun run dev
|
||||
bun run build
|
||||
bun run test
|
||||
bun run coverage
|
||||
bun run lint
|
||||
```
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/2.3.11/schema.json",
|
||||
"files": {
|
||||
"includes": [
|
||||
"**",
|
||||
"!**/.cta.json",
|
||||
"!**/.vscode",
|
||||
"!**/node_modules",
|
||||
"!**/dist",
|
||||
"!**/.output",
|
||||
"!**/coverage",
|
||||
"!**/convex/_generated",
|
||||
"!**/src/routeTree.gen.ts",
|
||||
"!**/.tanstack",
|
||||
"!**/public"
|
||||
]
|
||||
},
|
||||
"assist": { "actions": { "source": { "organizeImports": "on" } } },
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"indentStyle": "space",
|
||||
"indentWidth": 2,
|
||||
"lineWidth": 100
|
||||
},
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": true
|
||||
}
|
||||
},
|
||||
"javascript": {
|
||||
"formatter": {
|
||||
"quoteStyle": "single",
|
||||
"semicolons": "asNeeded",
|
||||
"trailingCommas": "all"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bun
|
||||
import { existsSync } from 'node:fs'
|
||||
import { stat } from 'node:fs/promises'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const distCliUrl = new URL('./packages/clawdhub/dist/cli.js', import.meta.url)
|
||||
const distCliPath = fileURLToPath(distCliUrl)
|
||||
const srcRootPath = fileURLToPath(new URL('./packages/clawdhub/src/', import.meta.url))
|
||||
|
||||
const shouldBuild = await (async () => {
|
||||
if (!existsSync(distCliPath)) return true
|
||||
try {
|
||||
const dist = await stat(distCliPath)
|
||||
const latestSrcMtime = await getLatestMtime(srcRootPath)
|
||||
return latestSrcMtime > dist.mtimeMs
|
||||
} catch {
|
||||
return true
|
||||
}
|
||||
})()
|
||||
|
||||
if (shouldBuild) {
|
||||
const proc = Bun.spawn(['bunx', 'tsc', '-p', 'packages/clawdhub/tsconfig.json'], {
|
||||
stdin: 'inherit',
|
||||
stdout: 'inherit',
|
||||
stderr: 'inherit',
|
||||
})
|
||||
const code = await proc.exited
|
||||
if (code !== 0) process.exit(code)
|
||||
}
|
||||
|
||||
await import(distCliUrl.href)
|
||||
|
||||
async function getLatestMtime(root: string) {
|
||||
let latest = 0
|
||||
const glob = new Bun.Glob('**/*.ts')
|
||||
for await (const rel of glob.scan({ cwd: root, onlyFiles: true })) {
|
||||
const path = `${root}${root.endsWith('/') ? '' : '/'}${rel}`
|
||||
try {
|
||||
const entry = await stat(path)
|
||||
latest = Math.max(latest, entry.mtimeMs)
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
return latest
|
||||
}
|
||||
|
Before Width: | Height: | Size: 832 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 214 KiB |
|
Before Width: | Height: | Size: 835 KiB |
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 210 KiB |
@@ -1,23 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
Status: pass
|
||||
Scenario: `/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/proof-scenarios/sample-text-before-after.pw.ts`
|
||||
Baseline: `origin/main`
|
||||
Candidate: `worktree`
|
||||
Provider: `hetzner`
|
||||
## Artifacts
|
||||
### baseline
|
||||
|
||||
- Output: `/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/clawhub-ui-proof/2026-05-13T00-12-37-146Z/baseline`
|
||||
- pass: baseline /skills - `baseline/screenshots/baseline-skills.png`
|
||||
- pass: baseline /plugins - `baseline/screenshots/baseline-plugins.png`
|
||||
- pass: baseline /souls - `baseline/screenshots/baseline-souls.png`
|
||||
- Video: `baseline/full-run.mp4`
|
||||
|
||||
### candidate
|
||||
|
||||
- Output: `/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/clawhub-ui-proof/2026-05-13T00-12-37-146Z/candidate`
|
||||
- pass: candidate /skills - `candidate/screenshots/candidate-skills.png`
|
||||
- pass: candidate /plugins - `candidate/screenshots/candidate-plugins.png`
|
||||
- pass: candidate /souls - `candidate/screenshots/candidate-souls.png`
|
||||
- Video: `candidate/full-run.mp4`
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
{
|
||||
"baseline": "origin/main",
|
||||
"candidate": "worktree",
|
||||
"generatedAt": "2026-05-13T00:12:37.148Z",
|
||||
"lanes": [
|
||||
{
|
||||
"localOutputDir": "/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/clawhub-ui-proof/2026-05-13T00-12-37-146Z/baseline",
|
||||
"name": "baseline",
|
||||
"ref": "origin/main",
|
||||
"remoteOutputDir": "/work/crabbox/cbx_2ac97d8c7cd2/clawhub/.artifacts/clawhub-ui-proof/remote-2026-05-13T00-12-37-146Z/baseline",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"lane": "baseline",
|
||||
"name": "baseline /skills",
|
||||
"screenshot": "screenshots/baseline-skills.png",
|
||||
"slug": "baseline-skills",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"lane": "baseline",
|
||||
"name": "baseline /plugins",
|
||||
"screenshot": "screenshots/baseline-plugins.png",
|
||||
"slug": "baseline-plugins",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"lane": "baseline",
|
||||
"name": "baseline /souls",
|
||||
"screenshot": "screenshots/baseline-souls.png",
|
||||
"slug": "baseline-souls",
|
||||
"status": "pass"
|
||||
}
|
||||
],
|
||||
"videoPath": "/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/clawhub-ui-proof/2026-05-13T00-12-37-146Z/baseline/full-run.mp4"
|
||||
},
|
||||
{
|
||||
"localOutputDir": "/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/clawhub-ui-proof/2026-05-13T00-12-37-146Z/candidate",
|
||||
"name": "candidate",
|
||||
"ref": "worktree",
|
||||
"remoteOutputDir": "/work/crabbox/cbx_2ac97d8c7cd2/clawhub/.artifacts/clawhub-ui-proof/remote-2026-05-13T00-12-37-146Z/candidate",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "candidate /skills",
|
||||
"screenshot": "screenshots/candidate-skills.png",
|
||||
"slug": "candidate-skills",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "candidate /plugins",
|
||||
"screenshot": "screenshots/candidate-plugins.png",
|
||||
"slug": "candidate-plugins",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "candidate /souls",
|
||||
"screenshot": "screenshots/candidate-souls.png",
|
||||
"slug": "candidate-souls",
|
||||
"status": "pass"
|
||||
}
|
||||
],
|
||||
"videoPath": "/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/clawhub-ui-proof/2026-05-13T00-12-37-146Z/candidate/full-run.mp4"
|
||||
}
|
||||
],
|
||||
"outputDir": "/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/clawhub-ui-proof/2026-05-13T00-12-37-146Z",
|
||||
"provider": "hetzner",
|
||||
"scenario": "/Users/patrickerichsen/.codex/worktrees/68a3/clawhub/.artifacts/proof-scenarios/sample-text-before-after.pw.ts",
|
||||
"status": "pass",
|
||||
"crabbox": {
|
||||
"createdLease": true,
|
||||
"leaseId": "cbx_2ac97d8c7cd2"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 29 KiB |
@@ -1,11 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
Status: pass
|
||||
Mode: `feature`
|
||||
Scenario: `e2e/local-auth/security-scan-management-proof.pw.test.ts`
|
||||
Provider: `local-auth`
|
||||
|
||||
## Artifacts
|
||||
|
||||
- pass: Desktop management security scans - `candidate/screenshots/desktop-security-scans.png`
|
||||
- pass: Mobile management security scans - `candidate/screenshots/mobile-security-scans.png`
|
||||
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"baseline": "not run",
|
||||
"candidate": "pe/security-scan-admin-tooling",
|
||||
"generatedAt": "2026-05-18T21:32:12.809Z",
|
||||
"lanes": [
|
||||
{
|
||||
"localOutputDir": "/Users/patrickerichsen/Git/openclaw/clawhub/.artifacts/clawhub-ui-proof/2026-05-18T21-29-29Z-security-scans/candidate",
|
||||
"name": "candidate",
|
||||
"ref": "pe/security-scan-admin-tooling",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Desktop management security scans",
|
||||
"screenshot": "screenshots/desktop-security-scans.png",
|
||||
"slug": "desktop-security-scans",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Mobile management security scans",
|
||||
"screenshot": "screenshots/mobile-security-scans.png",
|
||||
"slug": "mobile-security-scans",
|
||||
"status": "pass"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"mode": "feature",
|
||||
"outputDir": "/Users/patrickerichsen/Git/openclaw/clawhub/.artifacts/clawhub-ui-proof/2026-05-18T21-29-29Z-security-scans",
|
||||
"provider": "local-auth",
|
||||
"scenario": "e2e/local-auth/security-scan-management-proof.pw.test.ts",
|
||||
"status": "pass"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 100 KiB |
@@ -1,5 +0,0 @@
|
||||
# Owner-Scoped Skill Slugs UI Proof
|
||||
|
||||
- Scenario: owner-scoped skill slug UI surfaces.
|
||||
- Skill detail page proof: owner-qualified route and install command render as `@local/padel`.
|
||||
- Install command proof: copyable command uses `openclaw skills install @local/padel`.
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "owner-scoped skill slug UI surfaces",
|
||||
"provider": "Codex local browser proof",
|
||||
"candidate": "pe/owner-scoped-skill-slugs",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "owner-scoped-skill-slugs",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Skill detail page shows owner-qualified route and install ref",
|
||||
"slug": "skill-page-owner-ref",
|
||||
"status": "passed",
|
||||
"screenshot": "skill-page-owner-ref.png"
|
||||
},
|
||||
{
|
||||
"name": "Install command uses @owner/slug",
|
||||
"slug": "install-command-owner-ref",
|
||||
"status": "passed",
|
||||
"screenshot": "install-command-owner-ref.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 593 KiB |
|
Before Width: | Height: | Size: 611 KiB |
|
Before Width: | Height: | Size: 512 KiB |
@@ -1,7 +0,0 @@
|
||||
# Management Security Scan Overview
|
||||
|
||||
Feature proof for PR #2403.
|
||||
|
||||
- Desktop overview shows ClawScan-first current verdict totals, pipeline status, recent scan window, category rollups, and failed scan samples.
|
||||
- Desktop drilldown shows a selected artifact with ClawScan verdict/category/summary first, followed by pipeline status and supporting scanner evidence.
|
||||
- Mobile view keeps the management security overview usable at narrow width without overlapping controls.
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "management-security-scan-overview",
|
||||
"provider": "local-playwright",
|
||||
"candidate": "pe/clawscan-visibility",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Management security overview",
|
||||
"slug": "management-security-overview-desktop",
|
||||
"status": "passed",
|
||||
"screenshot": "management-security-overview-desktop.png"
|
||||
},
|
||||
{
|
||||
"name": "Artifact drilldown",
|
||||
"slug": "management-security-drilldown-desktop",
|
||||
"status": "passed",
|
||||
"screenshot": "management-security-drilldown-desktop.png"
|
||||
},
|
||||
{
|
||||
"name": "Mobile management security overview",
|
||||
"slug": "management-security-mobile",
|
||||
"status": "passed",
|
||||
"screenshot": "management-security-mobile.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 161 KiB |
|
Before Width: | Height: | Size: 61 KiB |
@@ -1,12 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
Status: pass
|
||||
Scenario: Skill grid card metadata layout with nearby skills
|
||||
|
||||
Screenshots:
|
||||
- baseline desktop: baseline/screenshots/desktop-grid-context.png
|
||||
- candidate desktop: candidate/screenshots/desktop-grid-context.png
|
||||
- baseline mobile: baseline/screenshots/mobile-grid-context.png
|
||||
- candidate mobile: candidate/screenshots/mobile-grid-context.png
|
||||
|
||||
Observed target card: Self-Improving + Proactive Agent.
|
||||
@@ -1,156 +0,0 @@
|
||||
{
|
||||
"baseline": "origin/main",
|
||||
"candidate": "jesse/fix-skill-card-date-overlap",
|
||||
"generatedAt": "2026-06-01T16:29:49.092Z",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "baseline",
|
||||
"lane": "baseline",
|
||||
"ref": "origin/main",
|
||||
"baseURL": "http://127.0.0.1:3038",
|
||||
"localOutputDir": "/Users/jmerhi/repos/claw-working-space/clawhub-fix-skill-card-date-overlap/.artifacts/clawhub-ui-proof/skill-card-grid-context-1780331337362/baseline",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Desktop skills grid context",
|
||||
"slug": "desktop-grid-context",
|
||||
"screenshot": "screenshots/desktop-grid-context.png",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"name": "Mobile skills grid context",
|
||||
"slug": "mobile-grid-context",
|
||||
"screenshot": "screenshots/mobile-grid-context.png",
|
||||
"status": "pass"
|
||||
}
|
||||
],
|
||||
"metrics": [
|
||||
{
|
||||
"step": "desktop grid context",
|
||||
"viewport": "desktop",
|
||||
"children": [
|
||||
{
|
||||
"className": "skill-card-tags",
|
||||
"text": "LinuxmacOSWindows"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-header",
|
||||
"text": "Self-Improving + Proactive Agent"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-summary",
|
||||
"text": "Self-reflection + Self-criticism + Self-learning + Self-organizing memory. Agent evaluates its own work, catches mistakes, and improves permanently. Use when..."
|
||||
},
|
||||
{
|
||||
"className": "skill-card-footer",
|
||||
"text": "by@ivangdavilaUpdated 3w ago1.2k·195k"
|
||||
}
|
||||
],
|
||||
"tagsBelowSummary": false,
|
||||
"authorToUpdatedGap": 14
|
||||
},
|
||||
{
|
||||
"step": "mobile grid context",
|
||||
"viewport": "mobile",
|
||||
"children": [
|
||||
{
|
||||
"className": "skill-card-tags",
|
||||
"text": "LinuxmacOSWindows"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-header",
|
||||
"text": "Self-Improving + Proactive Agent"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-summary",
|
||||
"text": "Self-reflection + Self-criticism + Self-learning + Self-organizing memory. Agent evaluates its own work, catches mistakes, and improves permanently. Use when..."
|
||||
},
|
||||
{
|
||||
"className": "skill-card-footer",
|
||||
"text": "by@ivangdavilaUpdated 3w ago1.2k·195k"
|
||||
}
|
||||
],
|
||||
"tagsBelowSummary": false,
|
||||
"authorToUpdatedGap": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "candidate",
|
||||
"lane": "candidate",
|
||||
"ref": "jesse/fix-skill-card-date-overlap",
|
||||
"baseURL": "http://127.0.0.1:3037",
|
||||
"localOutputDir": "/Users/jmerhi/repos/claw-working-space/clawhub-fix-skill-card-date-overlap/.artifacts/clawhub-ui-proof/skill-card-grid-context-1780331337362/candidate",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Desktop skills grid context",
|
||||
"slug": "desktop-grid-context",
|
||||
"screenshot": "screenshots/desktop-grid-context.png",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"name": "Mobile skills grid context",
|
||||
"slug": "mobile-grid-context",
|
||||
"screenshot": "screenshots/mobile-grid-context.png",
|
||||
"status": "pass"
|
||||
}
|
||||
],
|
||||
"metrics": [
|
||||
{
|
||||
"step": "desktop grid context",
|
||||
"viewport": "desktop",
|
||||
"children": [
|
||||
{
|
||||
"className": "skill-card-header",
|
||||
"text": "Self-Improving + Proactive Agent"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-summary",
|
||||
"text": "Self-reflection + Self-criticism + Self-learning + Self-organizing memory. Agent evaluates its own work, catches mistakes, and improves permanently. Use when..."
|
||||
},
|
||||
{
|
||||
"className": "skill-card-tags",
|
||||
"text": "LinuxmacOSWindows"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-footer",
|
||||
"text": "by@ivangdavilaUpdated 3w ago1.2k·195k"
|
||||
}
|
||||
],
|
||||
"tagsBelowSummary": true,
|
||||
"authorToUpdatedGap": 8
|
||||
},
|
||||
{
|
||||
"step": "mobile grid context",
|
||||
"viewport": "mobile",
|
||||
"children": [
|
||||
{
|
||||
"className": "skill-card-header",
|
||||
"text": "Self-Improving + Proactive Agent"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-summary",
|
||||
"text": "Self-reflection + Self-criticism + Self-learning + Self-organizing memory. Agent evaluates its own work, catches mistakes, and improves permanently. Use when..."
|
||||
},
|
||||
{
|
||||
"className": "skill-card-tags",
|
||||
"text": "LinuxmacOSWindows"
|
||||
},
|
||||
{
|
||||
"className": "skill-card-footer",
|
||||
"text": "by@ivangdavilaUpdated 3w ago1.2k·195k"
|
||||
}
|
||||
],
|
||||
"tagsBelowSummary": true,
|
||||
"authorToUpdatedGap": 8
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"mode": "before-after",
|
||||
"outputDir": "/Users/jmerhi/repos/claw-working-space/clawhub-fix-skill-card-date-overlap/.artifacts/clawhub-ui-proof/skill-card-grid-context-1780331337362",
|
||||
"provider": "local",
|
||||
"scenario": "Skill grid card metadata layout with nearby skills",
|
||||
"status": "pass"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 19 KiB |
@@ -1,6 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
Status: pass
|
||||
Mode: before-after
|
||||
Scenario: Skill grid card metadata layout
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"baseline": "origin/main",
|
||||
"candidate": "jesse/fix-skill-card-date-overlap",
|
||||
"lanes": [
|
||||
{
|
||||
"baseURL": "http://127.0.0.1:3038",
|
||||
"lane": "baseline",
|
||||
"name": "baseline",
|
||||
"localOutputDir": "/Users/jmerhi/repos/claw-working-space/clawhub-fix-skill-card-date-overlap/.artifacts/clawhub-ui-proof/skill-card-metadata-1780328491887/baseline",
|
||||
"ref": "origin/main",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Desktop skill card",
|
||||
"slug": "desktop-skill-card",
|
||||
"screenshot": "screenshots/desktop-skill-card.png",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"name": "Mobile skill card",
|
||||
"slug": "mobile-skill-card",
|
||||
"screenshot": "screenshots/mobile-skill-card.png",
|
||||
"status": "pass"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"baseURL": "http://127.0.0.1:3037",
|
||||
"lane": "candidate",
|
||||
"name": "candidate",
|
||||
"localOutputDir": "/Users/jmerhi/repos/claw-working-space/clawhub-fix-skill-card-date-overlap/.artifacts/clawhub-ui-proof/skill-card-metadata-1780328491887/candidate",
|
||||
"ref": "jesse/fix-skill-card-date-overlap",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Desktop skill card",
|
||||
"slug": "desktop-skill-card",
|
||||
"screenshot": "screenshots/desktop-skill-card.png",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"name": "Mobile skill card",
|
||||
"slug": "mobile-skill-card",
|
||||
"screenshot": "screenshots/mobile-skill-card.png",
|
||||
"status": "pass"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"mode": "before-after",
|
||||
"outputDir": "/Users/jmerhi/repos/claw-working-space/clawhub-fix-skill-card-date-overlap/.artifacts/clawhub-ui-proof/skill-card-metadata-1780328491887",
|
||||
"provider": "local",
|
||||
"scenario": "Skill grid card metadata layout",
|
||||
"status": "pass"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 74 KiB |
@@ -1,14 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
Status: `passed`
|
||||
|
||||
Mode: `feature`
|
||||
|
||||
Scenario: `manual-plugin-download-counts`
|
||||
|
||||
Provider: `local-playwright`
|
||||
|
||||
## Candidate
|
||||
|
||||
- `http://127.0.0.1:3001/plugins/clawbits-openclaw-plugin`
|
||||
- Confirms plugin detail pages render `Downloads` as the first sidebar stat, above repository and owner metadata.
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "manual-plugin-download-counts",
|
||||
"provider": "local-playwright",
|
||||
"baseline": "not-run",
|
||||
"candidate": "pe/plugin-download-counts",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Plugin detail downloads top stat",
|
||||
"slug": "plugin-downloads-top",
|
||||
"status": "passed",
|
||||
"screenshot": "plugin-downloads-top.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 52 KiB |
@@ -1,6 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
- Status: passed
|
||||
- Mode: feature
|
||||
- Scenario: plugin-list-downloads-sort
|
||||
- Proof: plugin list shows the Most downloaded sort option selected and download counts in list rows.
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "plugin-list-downloads-sort",
|
||||
"provider": "codex-in-app-browser",
|
||||
"candidate": "pe/plugin-download-counts",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Plugin list downloads and sort",
|
||||
"slug": "plugin-list-downloads-sort",
|
||||
"status": "passed",
|
||||
"screenshot": "plugin-list-downloads-sort.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,6 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
- Status: passed
|
||||
- Mode: feature
|
||||
- Scenario: plugin-list-no-family-badges
|
||||
- Proof: plugin list still shows download counts while Code Plugin and Bundle Plugin family badges are absent.
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "plugin-list-no-family-badges",
|
||||
"provider": "codex-in-app-browser",
|
||||
"candidate": "pe/plugin-download-counts",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Plugin list without family badges",
|
||||
"slug": "plugin-list-no-family-badges",
|
||||
"status": "passed",
|
||||
"screenshot": "plugin-list-no-family-badges.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 124 KiB |
@@ -1,6 +0,0 @@
|
||||
# PR #2520 proof
|
||||
|
||||
Status: pass
|
||||
|
||||
- Rendered the account-ban and artifact-level scanner rejection emails from the real email builders; the account-ban email no longer includes scan-results appeal guidance, while the artifact-level email still includes local scan guidance.
|
||||
- Captured the dedicated banned-account appeal page from a running local ClawHub preview after `/dashboard?error_description=Account%20banned` redirected to `/account-banned`.
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"generatedAt": "2026-06-05T23:54:26.000Z",
|
||||
"mode": "feature",
|
||||
"status": "pass",
|
||||
"provider": "rendered email builder plus live in-app browser preview",
|
||||
"scenario": "account-ban email without scan-results block plus dedicated banned-account route",
|
||||
"candidate": "worktree 3b4cc2d9",
|
||||
"outputDir": ".artifacts/pr-2520-proof",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"ref": "worktree 3b4cc2d9",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Rendered moderation emails",
|
||||
"slug": "rendered-emails",
|
||||
"status": "pass",
|
||||
"screenshot": "screenshots/rendered-emails.png"
|
||||
},
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Dedicated banned-account appeal page",
|
||||
"slug": "banned-sign-in",
|
||||
"status": "pass",
|
||||
"screenshot": "screenshots/banned-sign-in.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 119 KiB |
@@ -1,6 +0,0 @@
|
||||
# PR #2520 proof
|
||||
|
||||
Status: pass
|
||||
|
||||
- Rendered the account-ban and artifact-level scanner rejection emails from the real email builders.
|
||||
- Captured the banned-account sign-in copy from a full-stack local ClawHub preview with local Convex on `/dashboard?error_description=Account%20banned`.
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"generatedAt": "2026-06-05T23:09:45.000Z",
|
||||
"mode": "feature",
|
||||
"status": "pass",
|
||||
"provider": "rendered email builder plus full-stack local-auth Playwright",
|
||||
"scenario": "email builder rendering plus live ClawHub dashboard auth-error route",
|
||||
"candidate": "worktree 03bc802e",
|
||||
"outputDir": ".artifacts/pr-2520-proof",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"ref": "worktree 03bc802e",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Rendered moderation emails",
|
||||
"slug": "rendered-emails",
|
||||
"status": "pass",
|
||||
"screenshot": "screenshots/rendered-emails.png"
|
||||
},
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Live banned-account dashboard sign-in copy",
|
||||
"slug": "banned-sign-in",
|
||||
"status": "pass",
|
||||
"screenshot": "screenshots/banned-sign-in.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 119 KiB |
@@ -1,6 +0,0 @@
|
||||
# PR #2520 proof
|
||||
|
||||
Status: pass
|
||||
|
||||
- Rendered the account-ban and artifact-level scanner rejection emails from the real email builders.
|
||||
- Captured the banned-account sign-in copy from a full-stack local ClawHub preview with local Convex on `/dashboard?error_description=Account%20banned`.
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"generatedAt": "2026-06-05T23:09:45.000Z",
|
||||
"mode": "feature",
|
||||
"status": "pass",
|
||||
"provider": "rendered email builder plus full-stack local-auth Playwright",
|
||||
"scenario": "email builder rendering plus live ClawHub dashboard auth-error route",
|
||||
"candidate": "worktree 03bc802e",
|
||||
"outputDir": ".artifacts/pr-2520-proof",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"ref": "worktree 03bc802e",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Rendered moderation emails",
|
||||
"slug": "rendered-emails",
|
||||
"status": "pass",
|
||||
"screenshot": "screenshots/rendered-emails.png"
|
||||
},
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Live banned-account dashboard sign-in copy",
|
||||
"slug": "banned-sign-in",
|
||||
"status": "pass",
|
||||
"screenshot": "screenshots/banned-sign-in.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 350 KiB |
|
Before Width: | Height: | Size: 332 KiB |
@@ -1,13 +0,0 @@
|
||||
# PR 2520 live local proof
|
||||
|
||||
Status: pass
|
||||
|
||||
Captured from a live local ClawHub dev server started with `bun run dev` at `http://localhost:3000`.
|
||||
|
||||
Screenshots cover:
|
||||
|
||||
- dedicated account-banned page at desktop and mobile widths
|
||||
- moderation email output generated from `convex/lib/emails.ts` and served through the same local ClawHub dev server
|
||||
- account-ban email appeal-only copy
|
||||
- skill rejection email with `clawhub scan download demo-skill --version 1.2.3`
|
||||
- plugin rejection email with `clawhub scan download @scope/demo --version 2.0.0 --kind plugin`
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"status": "pass",
|
||||
"mode": "feature",
|
||||
"provider": "local ClawHub dev server",
|
||||
"localServer": "bun run dev -> http://localhost:3000",
|
||||
"commit": "03bcca63",
|
||||
"generatedAt": "2026-06-06T00:39:17.133Z",
|
||||
"screenshots": [
|
||||
{
|
||||
"slug": "account-banned-desktop",
|
||||
"url": "http://localhost:3000/account-banned",
|
||||
"viewport": {
|
||||
"width": 1440,
|
||||
"height": 980
|
||||
},
|
||||
"screenshot": "candidate/screenshots/account-banned-desktop.png"
|
||||
},
|
||||
{
|
||||
"slug": "account-banned-mobile",
|
||||
"url": "http://localhost:3000/account-banned",
|
||||
"viewport": {
|
||||
"width": 390,
|
||||
"height": 844
|
||||
},
|
||||
"screenshot": "candidate/screenshots/account-banned-mobile.png"
|
||||
},
|
||||
{
|
||||
"slug": "moderation-emails-desktop",
|
||||
"url": "http://localhost:3000/__pr-2520-email-proof.html",
|
||||
"viewport": {
|
||||
"width": 1440,
|
||||
"height": 1200
|
||||
},
|
||||
"screenshot": "candidate/screenshots/moderation-emails-desktop.png"
|
||||
},
|
||||
{
|
||||
"slug": "moderation-emails-mobile",
|
||||
"url": "http://localhost:3000/__pr-2520-email-proof.html",
|
||||
"viewport": {
|
||||
"width": 390,
|
||||
"height": 1200
|
||||
},
|
||||
"screenshot": "candidate/screenshots/moderation-emails-mobile.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,6 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
- Status: passed
|
||||
- Mode: feature
|
||||
- Scenario: plugin-list-no-family-badges
|
||||
- Proof: plugin list still shows download counts while Code Plugin and Bundle Plugin family badges are absent.
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "plugin-list-no-family-badges",
|
||||
"provider": "codex-in-app-browser",
|
||||
"candidate": "pe/plugin-download-counts",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Plugin list without family badges",
|
||||
"slug": "plugin-list-no-family-badges",
|
||||
"status": "passed",
|
||||
"screenshot": "plugin-list-no-family-badges.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 44 KiB |
@@ -1,6 +0,0 @@
|
||||
# ClawHub UI Proof
|
||||
|
||||
Status: pass
|
||||
|
||||
- Account deletion confirmation renders one row per affected skill/plugin, with icon, name, publisher handle, and type badge.
|
||||
- Post-cleanup navigation to the deleted plugin shows `Plugin not found`, confirming the resource was removed by the account deletion flow.
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"status": "pass",
|
||||
"mode": "feature",
|
||||
"scenario": "e2e/local-auth/delete-account-resources.pw.test.ts",
|
||||
"provider": "local-auth Playwright",
|
||||
"baseline": null,
|
||||
"candidate": "pe/account-deletion-hard-delete",
|
||||
"generatedAt": "2026-06-06T00:37:39.268Z",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"ref": "pe/account-deletion-hard-delete",
|
||||
"status": "pass",
|
||||
"steps": [
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Account deletion confirmation lists each resource row",
|
||||
"screenshot": "screenshots/account-deletion-confirmation.png",
|
||||
"slug": "account-deletion-confirmation",
|
||||
"status": "pass"
|
||||
},
|
||||
{
|
||||
"lane": "candidate",
|
||||
"name": "Deleted plugin route shows resource removed",
|
||||
"screenshot": "screenshots/account-deletion-post-cleanup.png",
|
||||
"slug": "account-deletion-post-cleanup",
|
||||
"status": "pass"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 156 KiB |
@@ -1,10 +0,0 @@
|
||||
# Skill Settings Delete Action
|
||||
|
||||
Real-browser feature proof for the skill settings delete action.
|
||||
|
||||
- Route: local-auth seeded skill settings page
|
||||
- Browser: Playwright chromium
|
||||
- Candidate: pe/skill-settings-delete-action
|
||||
- Screenshots:
|
||||
- `local/delete-action.png`
|
||||
- `local/delete-dialog.png`
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "skill-settings-delete-action",
|
||||
"provider": "local-auth Playwright chromium",
|
||||
"candidate": "pe/skill-settings-delete-action",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "local",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Skill settings delete action",
|
||||
"slug": "delete-action",
|
||||
"status": "passed",
|
||||
"screenshot": "delete-action.png"
|
||||
},
|
||||
{
|
||||
"name": "Skill settings delete confirmation dialog",
|
||||
"slug": "delete-dialog",
|
||||
"status": "passed",
|
||||
"screenshot": "delete-dialog.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 505 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 439 KiB |
@@ -1,11 +0,0 @@
|
||||
# PR 2581 prod-backed UI proof
|
||||
|
||||
Status: passed
|
||||
Mode: feature
|
||||
Backend: production Convex read data (`wry-manatee-359`).
|
||||
Pages captured:
|
||||
- `/skills?sort=installs&dir=desc` showing prod skill rows and install sort.
|
||||
- `/search?q=swarm` showing prod search results.
|
||||
- `/chair4ce/swarm` showing a prod-backed skill detail page.
|
||||
|
||||
Note: default `/plugins` was not used because this PR head can request `sort=recommended`, which requires matching backend code that is not deployed to prod yet.
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "manual prod-backed PR proof: skills browse, search, and detail",
|
||||
"provider": "local Playwright against http://127.0.0.1:3007 with prod Convex",
|
||||
"candidate": "PR #2581 rebased head f43b8ed3",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Skills browse sorted by installs",
|
||||
"slug": "skills-installs",
|
||||
"status": "passed",
|
||||
"screenshot": "skills-installs.png"
|
||||
},
|
||||
{
|
||||
"name": "Search results for swarm",
|
||||
"slug": "search-swarm",
|
||||
"status": "passed",
|
||||
"screenshot": "search-swarm.png"
|
||||
},
|
||||
{
|
||||
"name": "Skill detail for chair4ce/swarm",
|
||||
"slug": "skill-detail-swarm",
|
||||
"status": "passed",
|
||||
"screenshot": "skill-detail-swarm.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 691 KiB |
|
Before Width: | Height: | Size: 62 KiB |
@@ -1,5 +0,0 @@
|
||||
# CLAW-283 Email Template Proof
|
||||
|
||||
- Rendered updated ClawHub transactional email templates with realistic sample data.
|
||||
- Rendered generic admin one-off email with sample title/body/action content.
|
||||
- Confirmed Plugin Inspector findings email renders without the removed ClawHub CTA button.
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"mode": "feature",
|
||||
"scenario": "CLAW-283 email template render proof",
|
||||
"provider": "local ClawHub email preview render",
|
||||
"candidate": "pe/claw-283-email-templates",
|
||||
"lanes": [
|
||||
{
|
||||
"name": "candidate",
|
||||
"steps": [
|
||||
{
|
||||
"name": "Rendered email template proof",
|
||||
"slug": "email-template-render-proof",
|
||||
"status": "passed",
|
||||
"screenshot": "email-template-render-proof.png"
|
||||
},
|
||||
{
|
||||
"name": "Generic one-off email proof",
|
||||
"slug": "admin-one-off-email",
|
||||
"status": "passed",
|
||||
"screenshot": "admin-one-off-email.png"
|
||||
},
|
||||
{
|
||||
"name": "Plugin Inspector findings proof",
|
||||
"slug": "plugin-inspector-findings",
|
||||
"status": "passed",
|
||||
"screenshot": "plugin-inspector-findings.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 98 KiB |