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
20 changes: 20 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "quizbun",
"description": "Quizbun plugins for creating explanation-first Quizzes.",
"owner": {
"name": "Quizbun",
"url": "https://quizbun.fyi/"
},
"plugins": [
{
"name": "quizbun",
"source": {
"source": "github",
"repo": "a-dev/quizbun",
"ref": "plugin-dist"
},
"description": "Create explanation-first Quizzes and import them into your local Quizbun Library using available browser tools.",
"category": "education"
}
]
}
38 changes: 38 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,14 @@ jobs:
- name: Check quizbun skill drift
run: bun run skill:quizbun:check

# Assembles plugins/quizbun/ from the standalone skills (git-ignored
# copies) and writes public/plugins/chatgpt-plugin.zip, which the site
# build below publishes. Then checks drift and both manifests.
- name: Assemble and check plugin
run: |
bun run plugin:package
bun run plugin:check

- name: Build static site
run: bun run build

Expand Down Expand Up @@ -135,6 +143,36 @@ jobs:
path: playwright-report/
retention-days: 7

publish-plugin:
name: Publish plugin branch
needs: checks
# The Claude marketplace installs from plugin-dist, because the assembled
# resources are git-ignored on main. Publish only what main has checked.
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: write
concurrency:
group: plugin-dist
cancel-in-progress: false
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: .bun-version

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Assemble plugin
run: bun run plugin:package

- name: Push to plugin-dist
run: bash scripts/publish-plugin-branch.sh plugin-dist

deploy:
name: Deploy to GitHub Pages
needs: checks
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ node_modules/
/plugins/quizbun/skills/create-quiz/package.json
/plugins/quizbun/LICENSE
/plugins/quizbun/assets/icon.png
/public/plugins/chatgpt-plugin.zip

# logs
npm-debug.log*
Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ Add the `quizbun` skill to open a finished quiz in Quizbun. It writes a launcher
npx skills add a-dev/quizbun --skill create-quiz --skill quizbun
```

Quizbun imports quizzes of at most 200 questions and 1 MB of JSON. See [the quizbun skill](docs/quizbun-skill.md).
Quizbun imports quizzes of at most 200 questions and 1 MB of JSON. See [import limits](docs/import-limits.md).

For ChatGPT, a separate prototype plugin bundles quiz generation and a
browser-assisted import workflow. Build it with `bun run plugin:chatgpt:package`;
see [installation and testing](docs/chatgpt-plugin.md). The standalone skills
remain available independently.
browser-assisted import workflow. Build it with `bun run plugin:package`;
see [installation and testing](docs/plugins/chatgpt-plugin.md). The same package also
installs in Claude Code; see [the Claude Code plugin](docs/plugins/claude-plugin.md). The
standalone skills remain available independently.

## Check explanations against marked answers

Expand Down
5 changes: 3 additions & 2 deletions SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,10 @@ Shuffling, option labels, pagination, page size, keyboard controls, and layout n
- Two Agent Skills ship from `skills/`. `create-quiz` writes and validates a quiz in the standard and stays renderer-neutral. Its generated files are `scripts/validate-quiz.mjs` and `references/quiz.v1.schema.json`. `quizbun` opens a quiz in Quizbun and requires `create-quiz`. Its generated file is `scripts/open-quiz.mjs`. `bun run skill:create-quiz:check` and `bun run skill:quizbun:check` reject drift in CI.
- The `create-quiz` skill owns the [AI generation prompt](skills/create-quiz/references/quiz-generation-prompt.md). The site renders that source with a short introduction.
- A separate ChatGPT plugin prototype lives in `plugins/quizbun/` and exposes two skills: `setup` and `create-quiz`. `setup` selects the destination. `create-quiz` combines authoring, validation, and the existing import UI with local browser tools. It supplies files when those tools are unavailable.
- `bun run plugin:chatgpt:package` copies the standalone authoring resources, validator, and launcher into the combined skill. It writes a ZIP under `tmp/chatgpt-plugin/`. The standalone skills remain unchanged.
- `bun run plugin:package` copies the standalone authoring resources, validator, and launcher into the combined skill. It writes the ChatGPT ZIP to `public/plugins/chatgpt-plugin.zip` (git-ignored), so the site serves it at `/plugins/chatgpt-plugin.zip`. The standalone skills remain unchanged.
- The plugin adds no MCP server or WebMCP tool.
- `bun run plugin:chatgpt:check` checks assembled resource drift and the two-skill inventory. Actual ChatGPT activation and browser behavior require host acceptance testing. See [docs/chatgpt-plugin.md](docs/chatgpt-plugin.md).
- `bun run plugin:check` checks assembled resource drift, the two-skill inventory, and both manifests. Actual ChatGPT activation and browser behavior require host acceptance testing. See [docs/plugins/chatgpt-plugin.md](docs/plugins/chatgpt-plugin.md).
- The same folder is also a Claude Code plugin. `plugins/quizbun/.claude-plugin/plugin.json` is its manifest, and `.claude-plugin/marketplace.json` lists it. `bun run plugin:check` also makes sure that the name, version, description, and license match `plugin.json`. On pushes to `main`, CI publishes the assembled folder to the `plugin-dist` branch (`scripts/publish-plugin-branch.sh`), and the root marketplace installs from that branch. `plugins/.claude-plugin/marketplace.json` installs the local build. See [docs/plugins/claude-plugin.md](docs/plugins/claude-plugin.md).
- CI validates every file in [docs/examples](docs/examples) with the Zod schema.
- The public catalog profile adds repository-only rules. It requires `description`, `language`, at least one tag, repository-wide quiz id uniqueness, and a filename that matches the quiz id. Every catalog image also requires generated `width` and `height` that match the vendored file.
- The public catalog profile also enforces the import limits: at most 200 questions and 1 MB of JSON.
Expand Down
136 changes: 0 additions & 136 deletions docs/chatgpt-plugin.md

This file was deleted.

10 changes: 10 additions & 0 deletions docs/claude-plugin-install.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
## Install the Claude plugin

In Claude Code or the Code tab of the Claude desktop app:

```sh
claude plugin marketplace add a-dev/quizbun
claude plugin install quizbun@quizbun
```

Run `/quizbun:create-quiz` and describe your topic. With browser access, Claude saves the quiz to your Library. Otherwise, it gives you a file that opens the quiz in Quizbun.
2 changes: 1 addition & 1 deletion docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ The catalog adds these CI-enforced publishing requirements to the standard:
- Add at least one kebab-case `tags` entry for the catalog filter. Reuse broad subjects such as `javascript`, `system-design`, or `science`. Avoid tags specific to one quiz. Add a new tag only for a new subject area.
- Name the file after the quiz id. A quiz with `"id": "git-basics"` belongs in `content/quizzes/git-basics.json`.
- The quiz `id` must be unique across the repository.
- The quiz has at most 200 questions and 1 MB of JSON, the same [import limits](./quizbun-skill.md#import-limits) the import page applies.
- The quiz has at most 200 questions and 1 MB of JSON, the same [import limits](./import-limits.md) the import page applies.

### If your quiz uses images

Expand Down
2 changes: 1 addition & 1 deletion docs/copy-prompt.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
## 📋 Copy the prompt

Use the copy button below. Paste the prompt into your AI chat and add your request. For example: _"Create a quiz about the solar system. Suggest a question count and include images when they would help."_
Paste the prompt into your AI chat and add your request, for example: _"Create a quiz about the solar system."_
20 changes: 2 additions & 18 deletions docs/create-quiz-skill.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,9 @@
## Install the create-quiz skill

The skill includes the authoring rules, JSON Schema, canonical example, and a dependency-free Node.js validator. The validator checks cross-field rules that JSON Schema cannot express. It runs without Quizbun or Bun.

Install it directly from the Quizbun repository:
The skill bundles the authoring rules, JSON Schema, and a Node.js validator.

```sh
npx skills add a-dev/quizbun --skill create-quiz
```

Invoke `create-quiz` in your agent. Describe what you want to learn. Include your level, question count, and media preference if you know them. Each agent has its own invocation syntax.

The AI asks only for missing details. It can suggest a narrower topic, recommend question counts with coverage examples, and choose suitable question types. It asks about images or videos when they would help. The AI generates the quiz immediately if your request contains all necessary details.

Both the skill and copied prompt include an editing pass for clear questions and natural explanations. You do not need a separate writing skill. If you edit the quiz with another tool, ask it to preserve facts, accepted answers, and option correctness. Examples include [unslop](https://www.skills.sh/?q=unslop) and [humanizer](https://www.skills.sh/?q=humanizer). Validate the edited quiz again.

The AI delivers `<quiz-id>.json` when it can create files. Save the file. Choose the file on Quizbun's import page, or drag it onto that page. If the AI cannot create files, it provides a JSON code block with a filename and save instructions. You can also paste that JSON into the import page.

To open the quiz in Quizbun without saving the file first, also install the [quizbun](./quizbun-skill.md) skill. Install both with one command:

```sh
npx skills add a-dev/quizbun --skill create-quiz --skill quizbun
```

If your version of the CLI accepts only one skill per command, run the command once for each skill.
Invoke `create-quiz` and describe what you want to learn. The AI asks only for missing details, then delivers `<quiz-id>.json`. Import that file on Quizbun's import page.
3 changes: 3 additions & 0 deletions docs/import-limits.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## Import limits

Quizbun imports quizzes with at most 200 questions and 1 MB of JSON. These limits belong to Quizbun, not to the Quiz Object Standard. Split a larger topic into several quizzes.
Loading
Loading