From 1c63b088fd2218fd42f468d05a11a270fbc70571 Mon Sep 17 00:00:00 2001
From: bglglzd <248948303+bglglzd@users.noreply.github.com>
Date: Fri, 13 Nov 2026 04:03:23 +0300
Subject: [PATCH 1/4] feat: add local Chrome extension and verified
installation paths
---
.claude-plugin/marketplace.json | 4 +-
.claude-plugin/plugin.json | 4 +-
.gitattributes | 3 +
.github/ISSUE_TEMPLATE/bug_report.yml | 31 ++
.github/PULL_REQUEST_TEMPLATE.md | 3 +
.github/dependabot.yml | 12 +
.github/workflows/checks.yml | 24 +-
.gitignore | 7 +
CHANGELOG.md | 9 +
CONTRIBUTING.md | 9 +-
HARDENING.md | 56 +++
INSTALL.md | 120 ++-----
README.md | 123 +++----
SECURITY.md | 5 +
SPEC.md | 18 +-
VALIDATION.md | 48 +--
assets/GENERATION.md | 9 +
assets/bugkit-logo.png | Bin 0 -> 544680 bytes
assets/extension-preview.png | Bin 0 -> 78164 bytes
assets/social-preview.html | 1 +
assets/social-preview.png | Bin 0 -> 45514 bytes
commands/install.md | 10 +-
demo/demo.js | 14 +
demo/index.html | 30 ++
demo/style.css | 39 +++
docs/EXTENSION.md | 34 ++
docs/INSTALL.ru.md | 49 +++
docs/assets/bugkit-logo.png | Bin 0 -> 31470 bytes
docs/assets/extension-preview.png | Bin 0 -> 78164 bytes
docs/assets/social-preview.png | Bin 0 -> 45514 bytes
docs/demo/demo.js | 14 +
docs/demo/index.html | 30 ++
docs/demo/style.css | 39 +++
docs/extension-package.txt | 28 ++
docs/index.html | 261 +++-----------
docs/page.js | 12 +
docs/style.css | 346 +-----------------
extension/background.js | 181 ++++++++++
extension/content.js | 487 ++++++++++++++++++++++++++
extension/core.js | 235 +++++++++++++
extension/help.css | 21 ++
extension/help.html | 32 ++
extension/help.js | 14 +
extension/icons/mark-128.png | Bin 0 -> 11433 bytes
extension/icons/mark-16.png | Bin 0 -> 828 bytes
extension/icons/mark-32.png | Bin 0 -> 1956 bytes
extension/icons/mark-48.png | Bin 0 -> 3244 bytes
extension/icons/mark.png | Bin 0 -> 11433 bytes
extension/manifest.json | 53 +++
package-lock.json | 48 +++
package.json | 16 +
recipes/web-app-full.md | 136 ++++---
scripts/browser-test.mjs | 167 +++++++++
scripts/check.mjs | 24 ++
scripts/docs-check.mjs | 62 ++++
scripts/package.py | 56 +++
scripts/serve-demo.mjs | 33 ++
scripts/test.mjs | 11 +
skills/installing-bugkit/SKILL.md | 111 +-----
tests/context-safety.test.mjs | 38 ++
tests/extension-background.test.mjs | 247 +++++++++++++
tests/extension-core.test.mjs | 113 ++++++
tests/provider-contracts.test.mjs | 9 +-
tests/recipe-contracts.test.mjs | 6 +-
64 files changed, 2560 insertions(+), 932 deletions(-)
create mode 100644 .gitattributes
create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml
create mode 100644 .github/PULL_REQUEST_TEMPLATE.md
create mode 100644 .github/dependabot.yml
create mode 100644 HARDENING.md
create mode 100644 SECURITY.md
create mode 100644 assets/GENERATION.md
create mode 100644 assets/bugkit-logo.png
create mode 100644 assets/extension-preview.png
create mode 100644 assets/social-preview.html
create mode 100644 assets/social-preview.png
create mode 100644 demo/demo.js
create mode 100644 demo/index.html
create mode 100644 demo/style.css
create mode 100644 docs/EXTENSION.md
create mode 100644 docs/INSTALL.ru.md
create mode 100644 docs/assets/bugkit-logo.png
create mode 100644 docs/assets/extension-preview.png
create mode 100644 docs/assets/social-preview.png
create mode 100644 docs/demo/demo.js
create mode 100644 docs/demo/index.html
create mode 100644 docs/demo/style.css
create mode 100644 docs/extension-package.txt
create mode 100644 docs/page.js
create mode 100644 extension/background.js
create mode 100644 extension/content.js
create mode 100644 extension/core.js
create mode 100644 extension/help.css
create mode 100644 extension/help.html
create mode 100644 extension/help.js
create mode 100644 extension/icons/mark-128.png
create mode 100644 extension/icons/mark-16.png
create mode 100644 extension/icons/mark-32.png
create mode 100644 extension/icons/mark-48.png
create mode 100644 extension/icons/mark.png
create mode 100644 extension/manifest.json
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 scripts/browser-test.mjs
create mode 100644 scripts/check.mjs
create mode 100644 scripts/docs-check.mjs
create mode 100644 scripts/package.py
create mode 100644 scripts/serve-demo.mjs
create mode 100644 scripts/test.mjs
create mode 100644 tests/context-safety.test.mjs
create mode 100644 tests/extension-background.test.mjs
create mode 100644 tests/extension-core.test.mjs
diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json
index 0cfe183..a06cbd5 100644
--- a/.claude-plugin/marketplace.json
+++ b/.claude-plugin/marketplace.json
@@ -7,8 +7,8 @@
{
"name": "bugkit",
"source": "./",
- "version": "1.0.0",
- "description": "AI-friendly bug reports for any project."
+ "version": "1.1.0",
+ "description": "Bug report forms and tested integration recipes."
}
]
}
diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json
index 816db9e..0e822be 100644
--- a/.claude-plugin/plugin.json
+++ b/.claude-plugin/plugin.json
@@ -1,7 +1,7 @@
{
"name": "bugkit",
- "description": "AI-friendly bug reports for any project. Users click, AI fixes, done.",
- "version": "1.0.0",
+ "description": "Bug report forms, context export and integration acceptance checks.",
+ "version": "1.1.0",
"author": {
"name": "bugkit"
},
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..a0354c4
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+* text=auto eol=lf
+*.png binary
+*.zip binary
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..d54990d
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,31 @@
+name: Bug report
+description: Report a reproducible extension or integration-example defect.
+body:
+ - type: markdown
+ attributes:
+ value: Remove private text, URLs, credentials and screenshot data before posting. Use SECURITY.md for vulnerabilities.
+ - type: dropdown
+ id: area
+ attributes:
+ label: Area
+ options: [Chrome extension, Application installer, Recipe or specification, Documentation]
+ validations:
+ required: true
+ - type: input
+ id: version
+ attributes:
+ label: BugKit version and browser/runtime
+ placeholder: "1.1.0; Chrome version; Windows/macOS/Linux"
+ validations:
+ required: true
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: Steps, expected result and actual result
+ description: Include a small synthetic example when possible.
+ validations:
+ required: true
+ - type: textarea
+ id: context
+ attributes:
+ label: Sanitized context or error
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..872ca12
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,3 @@
+Describe the concrete problem and resulting behavior.
+
+Validation: list relevant executed checks and any untested platform/provider path. Use synthetic data and retain BugKit v1 compatibility, licenses and attribution.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..b712cdb
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+version: 2
+updates:
+ - package-ecosystem: npm
+ directory: /
+ schedule:
+ interval: monthly
+ open-pull-requests-limit: 3
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: monthly
+ open-pull-requests-limit: 3
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index 44a90ab..8612a93 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -1,4 +1,4 @@
-name: Recipe checks
+name: BugKit checks
on:
push:
branches: [main]
@@ -19,7 +19,25 @@ jobs:
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 24
- - name: Execute recipe contracts without external delivery
- run: node --test tests/*.test.mjs
+ - name: Check source and manifest
+ run: npm run check
+ - name: Execute extension and recipe contracts without external delivery
+ run: npm test
- name: Verify patch whitespace
run: git diff --check
+ browser:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
+ with:
+ node-version: 24
+ cache: npm
+ - run: npm ci
+ - run: npx playwright install --with-deps chromium
+ - name: Exercise the real extension
+ run: npm run test:browser
+ - name: Verify documentation and page controls
+ run: npm run test:docs
+ - name: Build source-bound Chrome ZIP
+ run: python scripts/package.py
diff --git a/.gitignore b/.gitignore
index 2aff0ac..53c1450 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,10 @@ node_modules/
.env.local
.bugreports.jsonl
.playwright-mcp/
+
+dist/
+artifacts/
+playwright-report/
+test-results/
+__pycache__/
+AGENTS.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 278f40d..d74d54d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
# Changelog
+## 1.1.0 — 2026-11-13
+
+- Added the standalone BugKit MARK Chrome extension, local demo, session drafts and Markdown/JSON/PNG export.
+- Added a ready-to-load ZIP, source-bound build manifest and automated real-Chromium acceptance checks.
+- Replaced the project logo with an ImageGen asset and updated README, Pages, English/Russian setup and troubleshooting.
+- Unified plugin and universal installer requirements: upgrades preserve reports and verify recovery, authorization and closure.
+- Framed the shared recipe context as untrusted data, added baseline/application masking and text-only export, and tolerated malformed optional blocks.
+- Retained the existing MIT license, recipe adapters and BugKit v1 field/status compatibility.
+
## Unreleased
- Match install commands to the registered marketplace and provide the advertised
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ed1546c..1efd990 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -7,7 +7,8 @@ an example expects and which environment values stay on its server.
For a behavioral recipe change, reproduce the problem and run:
```bash
-node --test tests/*.test.mjs
+npm run check
+npm test
```
Use synthetic reports, temporary files and loopback services. Never run a test
@@ -18,3 +19,9 @@ may use a browser-provider service, while local Whisper is a separate setup.
Keep PRs focused, retain licenses/attribution, and list the relevant checks and
limits. Do not commit local agent instructions, private reports or credentials.
+
+For extension behavior, also run `npm ci`, `npx playwright install chromium`
+and `npm run test:browser`. The browser harness uses only an isolated profile
+and synthetic loopback data. Change both package/manifest versions together.
+Build release ZIPs from a clean commit with `python scripts/package.py`, then
+exercise the extracted package and verify its digest before publishing.
diff --git a/HARDENING.md b/HARDENING.md
new file mode 100644
index 0000000..d2aed3f
--- /dev/null
+++ b/HARDENING.md
@@ -0,0 +1,56 @@
+# Application integration acceptance
+
+These requirements apply when adapting BugKit to an application. Recipe snippets do not implement a host's authorization, transactions or notification system. Implement and verify applicable requirements before calling an integration complete. The Chrome extension has its own [scope](docs/EXTENSION.md).
+
+## Data and authorization
+
+- Derive author, roles, tenant and release from authenticated server state, never submitted fields. Verify every referenced entity against the actor's scope.
+- Reuse a scoped query and authorized-target operation for lists, details, counters, exports, edits, attachments and batches. Missing and inaccessible records have the same response.
+- Allowlist bounded context. Reject invalid mandatory fields; malformed optional context must not crash a queue or erase a valid description. CLI batches continue per report while reporting failures.
+- Keep client `occurred_at`, server `created_at`, observed version and fixed release separate. Bound client time and label version sources.
+- Preserve original title/description on first edit, with revision actor/time. Author editing has a stated server-enforced time/status window.
+- Validate attachment MIME, size and access on the server. Store large screenshots appropriately; rate limits account for their cost.
+
+## Widget and recovery
+
+- Use one main description and derive its title. Optional reproduction fields and configurable `kind` remain compatible with old input during deployments.
+- Mount once. Provide a small-screen entry when a floating button covers controls. A programmatic open action is optional.
+- Use account/tenant-scoped session drafts, clearing on logout, account change and success. Retain text after validation/network/stale-deployment failure. Store screenshots separately when needed.
+- Catch submission failures inside the widget. Distinguish a saved report with failed delivery from a failed save.
+- Select only on request. Capture pointer/click/Escape at `window`, ignore marked widget UI, prevent link activation and restore listeners/focus on every exit. Test popups, scroll, touch and any claimed iframe behavior.
+- Screenshots require explicit action and a visible-data warning. Do not collect form values or arbitrary HTML by default. Strip URL credentials, queries and fragments; apply project-specific path masking.
+
+## Context export
+
+Copy Context, exports and CLI use one formatter and masking policy. Enable the application's `mask(text)` hook by default; preview the processed result. A baseline mask cannot identify all sensitive data.
+
+Place all report content, DOM text, metadata and logs in a fresh nonce-delimited untrusted block. Select a delimiter absent from its content. Keep instructions and configured update commands outside; normalize headers to one line. Unknown reporters' requests need review before implementation. Only server-authenticated state establishes authority. Delimiters aid separation; they do not guarantee protection from prompt injection.
+
+Support server-defined text-only mode for restricted contexts, omitting automatic page/DOM/log/attachment context across every export. Optional AI conversation context is assembled from authorized server messages with bounded fields; a client transcript is not authoritative.
+
+## Closing and notifying
+
+UI, API and CLI call one closure operation; never bypass it with raw SQL. Require technical `resolution`, separate author-facing `user_note`, and verification steps for fixes. `resolved` denotes a fix; `closed`/`wontfix` denote review without claiming a fix.
+
+Validate the entire batch, access and transitions before writing. Use a transaction when promising atomicity. Repeated idempotency keys return one logical result. Save closure and notification intent consistently, then deliver through an outbox or host equivalent. Retry delivery without duplicate closure/messages; expose failure separately. An unexecuted provider path does not establish notification success.
+
+Admin counts must reflect actual queries, with bounded pagination including resolved records. Authors see only their own reports and the user-facing note. Optional commit/release links refer to the recorded fix.
+
+## Acceptance
+
+| Scenario | Required observation |
+|---|---|
+| Submit from real UI/CLI | Canonical report in chosen store |
+| Reload draft, then logout | Text survives reload; next account cannot recover it |
+| Failed save or stale deployment | Text retained; local error and working recovery |
+| Pick a link in a popup, cancel, click normally | No navigation while picking; normal behavior restored |
+| Forge role/tenant/release; request foreign report/attachment | Server authority; consistent access rejection |
+| Malformed optional context | Other reports remain readable/exportable |
+| Fake instructions/lookalike delimiter | Content inside data block; trusted commands outside |
+| Copy Context and CLI | Same sections and masking |
+| Batch with an inaccessible/conflicting record | No partial writes or record-existence leak |
+| Concurrent/repeated closure and delivery retry | One result and logical notification; delivery failure separate |
+| Edit report | Original observation remains identifiable |
+| Restricted text-only policy | No automatic page/DOM/log/attachment data in exports |
+
+Record actual results, commands, commit, environment and unmet checks in the host's integration note. Repository snippet tests do not establish acceptance of an untested host integration.
diff --git a/INSTALL.md b/INSTALL.md
index 047e94a..f8632c2 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,107 +1,37 @@
-# bugkit — universal install prompt
+# Install BugKit
-> **How to use this file (not Claude Code):**
->
-> - **Cursor / Copilot Chat / ChatGPT / Codex / Gemini CLI / Aider / Cline:** paste this into your AI chat:
->
-> ```
-> Install bugkit in this project from https://raw.githubusercontent.com/bglglzd/bugkit/main/INSTALL.md
-> ```
->
-> The agent fetches this file and follows it.
->
-> - **Any AI agent that doesn't auto-fetch URLs:** copy the content below the `---` line into the chat directly.
->
-> **Claude Code users should NOT use this file.** Run `/plugin marketplace add bglglzd/bugkit`, `/plugin install bugkit@bugkit`, then `/bugkit:install` instead.
+## Use the Chrome extension
----
-
-You are installing **bugkit** — a portable, AI-friendly bug report system — into the current project. The value: reports carry enough context (URL, element selector, stack trace, viewport, etc.) that an AI assistant can fix the bug from one paste. The data contract is standardized in **bugkit Spec v1** so the "Copy Context → Paste → Fix → Close" ritual is identical across any project that installs it.
-
-## Step 1 — Understand the project
-
-1. **Stack** — read `package.json` / `go.mod` / `Cargo.toml` / `pyproject.toml` / `requirements.txt` / `composer.json` / `Gemfile` / etc.
-2. **Shape** — full-stack web app, API-only backend, CLI tool, static site, mobile app, bot, other.
-3. **Existing infra** — database, auth, notifications layer, CI/CD. Reuse what exists.
-4. **Conventions** — skim `CLAUDE.md`, `AGENTS.md`, a source file or two. Match the project's style.
-
-Report back three bullets on what you found, then continue.
-
-## Step 2 — Ask ONE question
-
-Ask the user:
-
-> **Where should bug reports be stored or delivered?** Pick one:
-> 1. **Local DB** (recommended if the project has one) — full admin UI with status tracking
-> 2. **GitHub Issues** — no DB needed; bugs open as issues with a `bugkit` label
-> 3. **Telegram** — bugs get DM'd to a chat via bot token
-> 4. **JSONL file** — simplest; append to `./.bugreports.jsonl`. Local-only.
-> 5. **Email** — send via SMTP / SendGrid / Resend
-> 6. **Slack** / **Discord** — webhook to a channel
-> 7. **Multiple** — e.g. "DB + mirror to Telegram for notifications"
-
-Recommend based on stack if unsure:
-- Full-stack web app with a DB → option 1
-- Open-source CLI / static site → option 2
-- Personal / MVP → option 4, upgrade later
-- Solo dev in Telegram → option 3
+Download **BugKit-MARK-1.1.0.zip** from [GitHub Releases](https://github.com/bglglzd/bugkit/releases/latest), extract it, then load its **extension** folder at `chrome://extensions` with Developer mode enabled. Click the toolbar icon or press Ctrl+Shift+Y (⌘+Shift+Y on macOS). No development tools or application changes are required.
-## Step 3 — Fetch the matching recipe and implement
+See the [Russian walkthrough](docs/INSTALL.ru.md) and [extension reference](docs/EXTENSION.md) for updates, permissions and recovery.
-| Sink | Recipe URL |
-|---|---|
-| Local DB | `https://raw.githubusercontent.com/bglglzd/bugkit/main/recipes/web-app-full.md` |
-| GitHub Issues | `https://raw.githubusercontent.com/bglglzd/bugkit/main/recipes/github-issues.md` |
-| Telegram | `https://raw.githubusercontent.com/bglglzd/bugkit/main/recipes/telegram-bot.md` |
-| JSONL | `https://raw.githubusercontent.com/bglglzd/bugkit/main/recipes/jsonl-file.md` |
-| Email | `https://raw.githubusercontent.com/bglglzd/bugkit/main/recipes/email.md` |
-| Slack / Discord | `https://raw.githubusercontent.com/bglglzd/bugkit/main/recipes/slack-discord.md` |
-| CLI | `https://raw.githubusercontent.com/bglglzd/bugkit/main/recipes/cli-tool.md` |
+## Integrate reporting into a project
-Fetch the chosen recipe and follow it. Non-negotiables from the spec (`https://raw.githubusercontent.com/bglglzd/bugkit/main/SPEC.md`):
+Claude Code:
-1. **Field names** — use exactly: `id, type, title, description, status, created_at, reporter, environment, page, client, element, error, logs, attachments, resolution, resolved_at, resolved_by, commit_sha, how_to_verify`. Do not rename.
-2. **Status lifecycle** — `open → in_progress → resolved → closed`, plus terminal `wontfix`. Resolution required when moving to a terminal state.
-3. **AI context format** — admins MUST be able to produce the exact text block from SPEC.md §3. Do not reorder sections, do not invent new labels.
-4. **`bugkit_spec: "1"`** — include in stored reports.
+```text
+/plugin marketplace add bglglzd/bugkit
+/plugin install bugkit@bugkit
+/bugkit:install
+```
-## Step 4 — Offer voice transcription (web recipes only)
+Other coding agents can read the task below. These are installer instructions for a project that has explicitly requested BugKit integration.
-If the chosen recipe produces a browser-facing form (Local DB, GitHub Issues, or similar), after the main install succeeds, ask:
-
-> **Voice transcription lets reporters speak their bug description instead of typing. Uses the browser's Web Speech API by default — free, no keys, works in Chrome/Edge/Safari. Want to enable it? (Y/n)**
-
-If yes, add a 🎤 mic button next to the description textarea. Wire up the Web Speech API per `recipes/web-app-full.md §Voice (optional)`. Optional upgrade: local Whisper (whisper.cpp) via a thin `/api/bugkit/transcribe` proxy. Never suggest a paid API unless the user explicitly asks.
-
-## Step 5 — Verify
-
-Before declaring done:
-
-1. Submit a test report using the actual UI / CLI / bot command (not curl — the real flow).
-2. Confirm the report appears in the chosen sink.
-3. Generate the Copy-Context output and verify it matches SPEC.md §3 — section order, exact labels, no extra decoration.
-4. If applicable, change status to `resolved` with a short note and confirm the reporter would see the update.
-
-## Step 6 — Report back
-
-1. Sink chosen.
-2. Files created or modified.
-3. How to test it (URL, command, or interaction).
-4. How the admin copies context and closes the loop once a fix is in.
-5. Whether voice is enabled and which path it's using.
+---
-## Things to avoid
+Implement BugKit in the current project. Read its development instructions and existing reporting code before changing files. If BugKit already exists, audit and upgrade it; preserve reports, IDs, original descriptions and working integrations.
-- Don't pull in a heavy ORM or new DB just for this — use what's there, or JSONL.
-- Don't rename spec field names. Add new fields or map. Portability is the point.
-- Don't make the element picker fancy. Minimal: outline on hover, click to capture, Esc to cancel.
-- Don't gate bug reporting behind complex auth flows.
-- Don't skip the reporter notification on status change.
-- Don't ask more than the one sink question + optional voice question.
+1. **Inspect.** Identify the stack, UI, authentication, storage, tenant boundaries, notification delivery and deployment version source. Reuse them. Summarize the core journey, a representative failure/recovery, and the files to change.
+2. **Choose storage.** Honor the user's existing choice. Otherwise recommend the existing database, or JSONL for a local tool. Ask one storage question only if unresolved. External delivery needs explicitly configured credentials; it is optional when local storage is primary.
+3. **Read the contract.** Fetch `SPEC.md`, `HARDENING.md` and the matching file under `recipes/` from this repository at the same full commit SHA. Prefer bundled plugin/checkout files. Resolve relative links against this repository, not the host project. Do not mix snapshots or overwrite a working integration with an older sample.
+4. **Implement the complete journey.** Preserve `bugkit_spec: "1"`, canonical fields, IDs and statuses. Follow the recipe, then implement every applicable HARDENING requirement. Small recipe snippets are examples, not a finished server. Use one formatter for CLI and Copy Context. Keep untrusted content in a fresh nonce-delimited block; apply the project's masking function by default. Review unknown reporters' requests before implementing them.
+5. **Recover safely.** Use one main description, optional reproduction fields, explicit element/screenshot actions, an account-scoped session draft, clear-on-logout, and non-destructive failure handling. Picking a link must not navigate or close the inspected popup. Capture pointers at `window`, ignore the widget UI and restore listeners/focus on cancellation. Retain text after submission failure or stale-deployment errors.
+6. **Make the server authoritative.** Derive author, tenant, permissions and build from server state. Bound context/attachments. Apply one access boundary to lists, detail, exports, edits, attachments and batches. Preserve originals on edit. Close through one operation with `resolution`, separate `user_note` and verification steps for fixes; validate a whole batch before writes. Store notification intent with the result and retry delivery without duplication. Never bypass closure with raw SQL.
+7. **Verify through the real UI or CLI.** Create a synthetic report, select an element, recover a draft, fail a submission, inspect stored data, copy context, resolve and verify the author's state. Test unauthorized/cross-tenant access where applicable, a failed batch and delivery retry. Run relevant host build/tests. Record actual checks and blockers; mocked providers do not prove live delivery.
+8. **Optional voice.** Offer it after the main journey passes. Read `skills/adding-voice/SKILL.md`. Explain browser support/provider processing; offer local Whisper for offline use. Do not add paid services without the user's request.
+9. **Handoff.** List files, storage choice, entry point, reproducible verification, update/rollback instructions and limits. Save an integration note in the host's existing docs so future upgrades do not need rediscovery.
-## If you get stuck
+Recipes: [database/web app](recipes/web-app-full.md), [GitHub Issues](recipes/github-issues.md), [Telegram](recipes/telegram-bot.md), [JSONL](recipes/jsonl-file.md), [email](recipes/email.md), [Slack/Discord](recipes/slack-discord.md), [CLI](recipes/cli-tool.md).
-- Read SPEC.md in full.
-- Read the chosen recipe in full.
-- Compose from multiple recipes if needed — but keep the Copy-Context format unchanged.
-- Ask the user for one missing piece at a time.
+Source: [bglglzd/bugkit](https://github.com/bglglzd/bugkit). These instructions do not authorize contacting users, publishing code or modifying production data.
diff --git a/README.md b/README.md
index 7d54746..5e25557 100644
--- a/README.md
+++ b/README.md
@@ -1,112 +1,75 @@
-
+

-

+# BugKit
-# bugkit
+Capture bug reports in Chrome, or add reporting to your application. Reports include a description, page context and selected elements, with Markdown for a developer or coding agent.
-**Bug reports with context your coding agent can use.**
+[Download Chrome extension](https://github.com/bglglzd/bugkit/releases/latest) · [Installation](INSTALL.md) · [Русская инструкция](docs/INSTALL.ru.md) · [Demo and documentation](https://bglglzd.github.io/bugkit/)
-*Capture the page, selected element and errors with a report. Give the structured context to your coding agent, verify its patch, and record the resolution.*
+
-

+## Chrome extension: BugKit MARK
-*Workflow illustration; integration and validation happen in your project.*
+1. Download **BugKit-MARK-1.1.0.zip** from [Releases](https://github.com/bglglzd/bugkit/releases/latest) and extract it to a permanent folder.
+2. Open `chrome://extensions`, enable **Developer mode**, choose **Load unpacked** and select the extracted **extension** folder containing `manifest.json`.
+3. Open a website. Click the BugKit MARK toolbar icon, or press **Ctrl+Shift+Y** (**⌘+Shift+Y** on macOS).
+4. Select an element, describe the problem and review the report. Copy Markdown or save `.md`, `.json` and an optional screenshot.
-
+No Git, Node.js, account, API key or build is needed. The interface is currently in Russian. Change the shortcut at `chrome://extensions/shortcuts`. Keep the extracted folder: Chrome loads the extension from there. To update, replace its contents, click **Reload** on the extension card and reload the website tab. GitHub ZIP installations do not update automatically. There is no Chrome Web Store listing.
-[](https://github.com/bglglzd/bugkit)
-[](./SPEC.md)
-[](./LICENSE)
+The panel is injected only when invoked. Reports stay local until copied or exported. Session drafts retain text and selected elements across page reloads; screenshots must be added again after a reload. Drafts disappear when the tab or browser session closes. The extension cannot detect logout on arbitrary websites: clear its draft before sharing a browser session or changing accounts.
-
+URL credentials, query parameters and fragments are removed from report context. Form values, full HTML, console history and network traffic are not collected. Selected visible text, URL paths and screenshots can still contain private information; review them before sharing. Screenshots require a separate action, cover the visible viewport and exclude the MARK panel.
----
+Chrome blocks injection on internal pages, its extension store and some viewers. Closed Shadow DOM and iframe contents are not inspected. File URLs require **Allow access to file URLs**. MARK does not send issues to a server or change their status. See [permissions and limitations](docs/EXTENSION.md).
-## Who this is for
+## Add BugKit to an application
-**🛠 Building for a client, boss, or team lead**
-Send them the staging link. They select the affected element and type or speak a description. Copy the structured report to your agent, then verify and record the fix.
+This path adds a form, storage, status management and notifications to an existing project. It uses a specification and agent instructions; it is not a prebuilt backend. [INSTALL.md](INSTALL.md) covers both paths.
-**🚀 Running a product with real users**
-Reports can include the URL, selector, stack trace and voice transcript. Choose a recipe for storage/delivery and connect its status and notification flow to your application.
+For Claude Code, run each command separately:
----
-
-## Install
-
-### Claude Code
-
-Three commands. Paste each one separately and wait for it to finish before the next.
-
-**1.** Add the bugkit marketplace:
-
-```
+```text
/plugin marketplace add bglglzd/bugkit
-```
-
-**2.** Install the plugin:
-
-```
/plugin install bugkit@bugkit
-```
-
-**3.** Start the installer in your project:
-
-```
/bugkit:install
```
-### Any other AI agent
-
-Cursor, GitHub Copilot, ChatGPT, Gemini, Aider, Cline — paste this one line into the chat:
+For other agents, pass this instruction:
+```text
+Install BugKit in this project using https://raw.githubusercontent.com/bglglzd/bugkit/main/INSTALL.md
```
-Install bugkit in this project from https://raw.githubusercontent.com/bglglzd/bugkit/main/INSTALL.md
-```
-
----
-
-Either path detects your stack, asks **one** question (where should bug reports go — DB, GitHub Issues, Telegram, JSONL, email, Slack, Discord), and implements the matching [recipe](./recipes/). Voice transcription is offered too — 🎤 mic button next to the description field, Web Speech API by default, local Whisper as an offline upgrade, never paid APIs.
-This repository ships a specification, plugin prompts and integration recipes.
-The installer adapts them to your project; it is not a hosted reporting service.
-Verify the generated integration using that project's actual UI or CLI.
+The installer reuses existing UI, authentication and storage, then implements the selected [recipe](recipes/). Both installer paths require [integration acceptance checks](HARDENING.md), including draft recovery, access checks, safe context export and separate technical/user resolution notes. Optional voice input belongs to application integrations; MARK has no microphone feature. Browser speech recognition may use the browser provider's service.
----
+## Develop and verify
-## Why this beats a feedback form
+Node.js **24 LTS or newer** is needed for development. The regular checks have no dependencies:
-| Traditional feedback form | bugkit |
-|---|---|
-| "Something is broken" | Selector, XPath, HTML, viewport, stack trace, voice transcript |
-| Rebuild context in every conversation | Copy one predictable context block |
-| Format differs per project | Standardized spec — same ritual across every project |
-| No defined status flow | Status lifecycle and notification recipes |
-| Typing long descriptions is a chore | 🎤 press-to-speak, auto-transcribed |
-
----
-
-## Docs
+```sh
+npm run check
+npm test
+npm run demo
+```
-- **[SPEC.md](./SPEC.md)** — the portable data contract
-- **[recipes/](./recipes/)** — 7 sink adapters (DB, GitHub Issues, Telegram, JSONL, email, Slack, Discord, CLI)
-- **[INSTALL.md](./INSTALL.md)** — the universal paste-in prompt for non-Claude-Code agents
-- **[Landing page](https://bglglzd.github.io/bugkit)** — one-page tour with copy-ready install commands
+The synthetic demo listens on `http://127.0.0.1:4173`. Stop it with Ctrl+C. Browser acceptance uses a pinned development dependency and Chromium:
-## Verify the recipes
+```sh
+npm ci
+npx playwright install chromium
+npm run test:browser
+```
-With Node.js 24 LTS, no package installation is required:
+Browser checks use a disposable profile and real extension APIs. They do not operate an existing browser. [Validation boundaries](VALIDATION.md) distinguish automated checks from manual Windows/macOS verification and provider fixtures.
-```bash
-node --test tests/*.test.mjs
-```
+To build the release ZIP, install Python **3.11+** and run `python scripts/package.py` from a clean committed checkout. Its manifest binds the source commit and SHA256 of packaged files; local data, dependencies and private evidence are excluded.
-The checks execute documented snippets with real temporary JSONL files and
-loopback HTTP services. Browser speech, provider SDKs and report stores used by
-adapter tests are explicit synthetic fixtures. Tests do not contact Telegram,
-Slack, Discord, email, GitHub Issues or a paid AI service. See
-[validation boundaries](./VALIDATION.md) and [contributing](./CONTRIBUTING.md).
+## Reference
----
+- [SPEC.md](SPEC.md): portable v1 report fields and context format, with additive reliability fields.
+- [HARDENING.md](HARDENING.md): required behavior for application integrations.
+- [recipes/](recipes/): database, GitHub Issues, Telegram, JSONL, email, Slack/Discord and CLI examples.
+- [Contributing](CONTRIBUTING.md), [changelog](CHANGELOG.md), [security](SECURITY.md) and [MIT license](LICENSE).
-MIT — use it anywhere. ⭐ Star or watch this repo for new releases.
+BugKit MARK was contributed as a standalone local extension and integrated here with its name retained. Application-specific code and internal deployment instructions are not part of this repository.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..8b7437c
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,5 @@
+# Security reports
+
+Do not post credentials, private reports or screenshots containing personal data in public issues. Use GitHub's **Report a vulnerability** option when available. If unavailable, ask for a private reporting route without disclosing the vulnerability or affected data.
+
+The extension is local and requires deliberate export. Application recipes must follow the host's privacy and access rules; see [HARDENING.md](HARDENING.md). Fixes target the latest release.
diff --git a/SPEC.md b/SPEC.md
index 6a8f360..814b0c7 100644
--- a/SPEC.md
+++ b/SPEC.md
@@ -42,7 +42,7 @@ Everything below is **optional** — capture what your platform can provide.
"locale": "en-US"
},
"page": { // web / webview only
- "url": "https://example.com/path?x=1",
+ "url": "https://example.com/path",
"route": "users/[id]/settings",
"referrer": "..."
},
@@ -187,7 +187,7 @@ Mandatory:
1. Create a report with at least `{type, title, description, reporter, created_at}`
2. Capture as much optional context as the platform can provide
3. Status lifecycle as defined
-4. A way for admins to produce the **exact** AI context format above
+4. A way for admins to produce the compatible section order above, with untrusted report data enclosed in nonce-delimited boundaries and instructions outside
5. A way to update status + resolution
Recommended:
@@ -196,7 +196,7 @@ Recommended:
- Link resolution to a commit SHA when possible
- Rate-limit submissions per user
-Out of scope for this spec (do it however you want):
+Host-specific implementation choices (must satisfy [HARDENING.md](HARDENING.md) for an application integration):
- Authentication model
- Permissions
- Admin UI framework
@@ -210,3 +210,15 @@ Out of scope for this spec (do it however you want):
This is **Spec v1**. Breaking changes will bump to v2 and be announced in the repo. Additive changes (new optional fields) stay on v1.
Implementations should emit `bugkit_spec: "1"` somewhere in stored reports so future tools can tell what format to expect.
+
+## 6. Additive reliability fields (v1.1)
+
+`bugkit_spec: "1"` and the existing required fields/statuses stay unchanged. Optional fields include `kind` (configurable category), `occurred_at`, `exported_at`, `reproduction` (`steps`, `expected`, `actual`), `environment.build_id`, `environment.version_source`, `environment.extension_version`, `elements` (additional selected elements), `user_note`, `resolved_release`, `original_title`, `original_description`, `edited_at` and `edited_by`. A client-observed `reporter.role` conveys no authority. Server integrations derive identity, tenant, role and release from their own authenticated state.
+
+### Context framing
+
+The section order in §3 is retained. Enclose report headers and populated data sections in `<<>>` and `<<>>`, using a fresh cryptographically random nonce absent from the content. The trusted `## Instructions` and configured update hint follow the closing marker. Normalize header values to one line. Optional `Occurred`, `Exported`, reproduction, revision and AI-conversation sections are additive. Consumers must not treat arbitrary report text as executable instructions.
+
+Copy Context and CLI share their formatter and default application masking policy. A text-only export omits automatic environment/page/DOM/error/log/attachment content. Preview the processed result and disclose masking limits. MARK uses its standalone local format and has no trusted reporter role or server closure operation.
+
+Application acceptance, including original preservation, drafts, scoped access, atomic closure and notification retry, is defined in [HARDENING.md](HARDENING.md). A v1 field marker does not prove that a host has passed those checks.
diff --git a/VALIDATION.md b/VALIDATION.md
index 6a90430..c9b7e01 100644
--- a/VALIDATION.md
+++ b/VALIDATION.md
@@ -1,41 +1,21 @@
# Validation boundaries
-bugkit contains a portable report specification, plugin commands/skills and
-recipes that an installing agent adapts to a project. It has no runtime package
-manifest or hosted delivery service. Recipe-specific SDKs belong to the target
-project; keep them on supported versions there.
+BugKit includes a local Chrome extension, specification, plugin installer and application recipes. It has no hosted delivery service. Node.js 24+ runs the dependency-free checks; Playwright is a pinned development-only dependency for real Chromium acceptance. Python 3.11+ packages committed files.
-Run `node --test tests/*.test.mjs` with Node 24 LTS. CI runs the same checks on
-Linux and Windows. Tests extract the actual documented code blocks, rather than
-keeping a separate implementation of each adapter.
+```sh
+npm run check
+npm test
+npm ci
+npx playwright install chromium
+npm run test:browser
+```
-The suite exercises:
+CI runs syntax and contract checks on Linux and Windows, plus real extension acceptance in Chromium. Browser tests use a disposable profile, loopback synthetic demo and DevTools' extension action. They exercise actual injection, element selection, clipboard, downloads, captureVisibleTab, draft reload, SPA route isolation, narrow layout and restricted-page help. Pixel comparison checks that the capture excludes the panel. The clipboard-read permission granted by the harness is for checking exported text; MARK itself requests only clipboardWrite.
-- Registered marketplace/install-command consistency and the advertised voice
- command asset.
-- Canonical SPEC context fields, section order and storage-specific close hints.
-- Actual temporary JSONL create/list/show/copy/close, full UUID/numeric selection,
- failure visibility and terminal resolution validation.
-- Telegram complete IDs, webhook secret and chat/user authorization, reason
- replies, large context files and delivery failures using loopback HTTP.
-- Slack chunk reconstruction and Discord file delivery with long Unicode text,
- controlled mentions, acknowledgement requests and rejected deliveries.
-- Resend's resolved-promise error contract and GitHub issue-body reconstruction
- with explicit fake SDKs. No actual email or issue is created.
-- Literal CLI argv/stdin, synthetic speech-result sequences/restarts, and picker
- coordinates with synthetic scrolled HTML/SVG browser objects.
-- Both Whisper proxy snippets' input validation, multipart byte forwarding and
- upstream HTTP rejection using a synthetic loopback endpoint. Setup commands
- are checked against the linked upstream source; no actual Whisper server or
- model is executed by this suite.
+Results and screenshots are written to ignored `artifacts/browser/`. There is no connection to an existing browser or personal profile. The DevTools action verifies the toolbar action path, not physical shortcut key dispatch. Native Chrome installation and macOS keyboard/system behavior remain manual checks.
-These checks establish the supplied examples' contracts. They do not establish
-live provider credentials, a generated project's framework integration, real
-microphone recognition, email deliverability, rate-limit behavior or AI fix
-quality. Plugin validation/clean local installation can be performed without an
-inference request using an isolated Claude Code configuration directory.
+Contract tests execute documented recipe snippets with real temporary JSONL files and loopback HTTP. Provider SDKs, browser speech objects and some picker objects are explicitly synthetic. No real Telegram/Slack/Discord/email message or GitHub issue is created. Tests cover delivery rejection, complete IDs, safe argv, large Unicode payloads, required close hints, context masking/framing, malformed optional blocks and text-only export. Whisper proxy tests use a synthetic upstream; no model/server is run.
-Store a report before mirroring it. Delivery errors must remain distinguishable
-from a saved report; retrying a partially accepted multi-message operation may
-duplicate a notification. Telegram pending-reason storage in the example is for
-a single process; use durable storage for multiple workers/serverless handlers.
+These tests establish supplied code/example behavior. They do not establish a generated application's framework integration, authorization, database transaction behavior, live provider credentials, microphone recognition, email deliverability or AI fix quality. The installer must perform the host-specific [acceptance checklist](HARDENING.md).
+
+To verify an artifact, build with `python scripts/package.py` from a clean committed checkout, extract its ZIP, and rerun browser acceptance with `BUGKIT_EXTENSION_DIR` pointing to the extracted `extension/`. Compare the release download's digest against `SHA256SUMS.txt` and the source-bound `build-manifest.json`. A rebuilt ZIP is a new artifact until its bytes and relevant checks are verified.
diff --git a/assets/GENERATION.md b/assets/GENERATION.md
new file mode 100644
index 0000000..98d4d5b
--- /dev/null
+++ b/assets/GENERATION.md
@@ -0,0 +1,9 @@
+# BugKit logo
+
+Generated with the built-in ImageGen tool on 2026-11-13. `bugkit-logo.png` is the original transparent raster output. Extension toolbar sizes and the Pages favicon are Lanczos-resized PNG derivatives; the mark was not redrawn. The original MIT project license is retained.
+
+Prompt:
+
+> Use case: logo-brand. Create ONE final professional logo symbol for BugKit, a developer tool for capturing precise bug reports and selected UI elements. Output a square transparent PNG with a single centered logo, generous transparent margin, no text, no wordmark, no mockup, no extra variants. Brand continuity: the existing BugKit identity uses coral (#ff4a6e) and warm orange (#ff7b3a); use these restrained accents with a strong dark ink silhouette that remains legible on both light and dark interfaces. Design a distinctive compact geometric beetle integrated with four focus/selection corner brackets: calm symmetry, clear negative space, bold simple shapes, immediately recognizable at 32px. Precise flat vector-like execution, careful optical balance, no thin lines, no tiny details, no eyes or cute mascot expression, no gradients, no shadows, no texture, no 3D, no glow. The icon should feel like a useful developer utility rather than promotional artwork. Transparent background is mandatory.
+
+`extension-preview.png` is an actual Chromium screenshot of the extension on the bundled synthetic demo, produced by `scripts/browser-test.mjs`. The social preview combines the generated logo with factual product labels; its layout source is `social-preview.html`.
diff --git a/assets/bugkit-logo.png b/assets/bugkit-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..28700793bc1005f346dc7c08ec18dc2894d9f193
GIT binary patch
literal 544680
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