Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
}
]
}
4 changes: 2 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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"
},
Expand Down
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* text=auto eol=lf
*.png binary
*.zip binary
31 changes: 31 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -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.
12 changes: 12 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -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
24 changes: 21 additions & 3 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Recipe checks
name: BugKit checks
on:
push:
branches: [main]
Expand All @@ -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
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,10 @@ node_modules/
.env.local
.bugreports.jsonl
.playwright-mcp/

dist/
artifacts/
playwright-report/
test-results/
__pycache__/
AGENTS.md
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
9 changes: 8 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
56 changes: 56 additions & 0 deletions HARDENING.md
Original file line number Diff line number Diff line change
@@ -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.
Loading
Loading