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": "htmlify",
"owner": {
"name": "Zak El Fassi",
"url": "https://github.com/zakelfassi"
},
"metadata": {
"description": "Self-contained HTML artifacts and presentation decks from agent context",
"version": "1.0.0"
},
"plugins": [
{
"name": "htmlify",
"source": "./",
"description": "htmlify + deckify skills: agent answers become self-contained HTML documents and decks, validated by a bundled CLI. Optional Stop hook archives long answers automatically.",
"category": "productivity",
"keywords": ["html", "artifacts", "decks", "reports", "presentations"]
}
]
}
13 changes: 13 additions & 0 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "htmlify",
"version": "0.3.1",
"description": "Turn agent answers into self-contained HTML artifacts and presentation decks (htmlify + deckify skills, plus an optional long-answer Stop hook).",
"author": {
"name": "Zak El Fassi",
"url": "https://github.com/zakelfassi"
},
"homepage": "https://zakelfassi.github.io/htmlify/",
"repository": "https://github.com/zakelfassi/htmlify",
"license": "Apache-2.0",
"keywords": ["html", "artifacts", "decks", "reports", "skills"]
}
53 changes: 53 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Bug report
description: Something broke — a bad export, a validator miss, a crashed command
labels: [bug]
body:
- type: dropdown
id: surface
attributes:
label: Surface
description: Where did the problem show up?
options:
- htmlify skill (SKILL.md flow)
- deckify skill (SKILL.md flow)
- htmlify-answer CLI
- --validate CLI
- Pi / Oh-My-Pi extension
- Claude Code hook / plugin
- Generated artifact (HTML output)
- Other
validations:
required: true
- type: textarea
id: what-happened
attributes:
label: What happened?
description: What did you do, what did you expect, what happened instead?
placeholder: Ran `htmlify-answer --validate deck.html --profile deck` and ...
validations:
required: true
- type: textarea
id: repro
attributes:
label: Reproduction
description: Smallest input that reproduces it (command, snippet, or a minimal HTML file).
render: shell
- type: input
id: version
attributes:
label: Version
placeholder: e.g. @zakelfassi/htmlify 1.0.0, or a commit SHA
validations:
required: true
- type: input
id: environment
attributes:
label: Environment
placeholder: e.g. Node 22.4 / macOS 15 / Claude Code 2.x
- type: checkboxes
id: security
attributes:
label: Security check
options:
- label: This is not a security vulnerability (those go to SECURITY.md, not public issues)
required: true
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: Security vulnerability
url: https://github.com/zakelfassi/htmlify/security/advisories/new
about: Report security issues privately — never in a public issue.
- name: Live gallery
url: https://zakelfassi.github.io/htmlify/
about: See what the skills produce before filing.
34 changes: 34 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Feature request
description: A new artifact mode, validator check, integration, or improvement
labels: [enhancement]
body:
- type: textarea
id: problem
attributes:
label: Problem
description: What are you trying to do that htmlify/deckify doesn't handle well today?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed solution
description: What would you like to happen? Sketch the SKILL.md rule, CLI flag, or artifact behavior.
validations:
required: true
- type: dropdown
id: area
attributes:
label: Area
options:
- htmlify skill / artifact modes
- deckify skill / deck modes
- Validator / CLI
- Agent integrations (hooks, plugin)
- Visual identity / theme
- Docs / gallery
- Other
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
16 changes: 16 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## What

<!-- One paragraph: what changes and why. Link the issue if there is one. -->

## Type

<!-- feat / fix / refactor / docs / ci / chore — matches your conventional commit -->

## Checklist

- [ ] `pnpm lint && pnpm typecheck && pnpm test` is green locally
- [ ] Conventional commit message(s), one logical change per commit
- [ ] No breaking change to the compatibility contracts (`_internals`, CLI flags/exit codes, hook path, `pi`/`omp` entry points, `skills/` paths) — or it's marked `feat!:` with a `BREAKING CHANGE:` footer and a migration note
- [ ] Validator changes come with pass **and** fail fixtures under `test/fixtures/`
- [ ] Theme or example changes were eyeballed in light mode, dark mode, and print preview
- [ ] Committed examples still pass `node bin/htmlify-answer.js --validate`
75 changes: 59 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,28 +1,71 @@
name: CI

on:
pull_request:
push:
branches:
- main
branches: [main]
pull_request:

jobs:
test:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: '20.x'
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm lint

- name: Enable Corepack
run: corepack enable
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm typecheck

- name: Install dependencies
run: pnpm install --frozen-lockfile
test:
strategy:
matrix:
node: [20, 22, 24]
os: [ubuntu-latest]
include:
- node: 22
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm test

- name: Run tests
run: pnpm test
validate-examples:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- name: Validate committed gallery artifacts
run: |
set -euo pipefail
shopt -s nullglob
files=(examples/htmlify/*.html examples/deckify/*.html)
if [ ${#files[@]} -eq 0 ]; then
echo "No example artifacts found" >&2
exit 1
fi
node bin/htmlify-answer.js --validate "${files[@]}" --profile auto
35 changes: 35 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Pages

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: true

jobs:
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Assemble site (copy, not build)
run: |
mkdir -p _site
cp index.html _site/
cp -R examples _site/examples
cp -R assets _site/assets
- uses: actions/upload-pages-artifact@v3
with:
path: _site
- id: deployment
uses: actions/deploy-pages@v4
43 changes: 43 additions & 0 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Release

on:
push:
branches: [main]

permissions:
contents: write
pull-requests: write
id-token: write

jobs:
release-please:
runs-on: ubuntu-latest
outputs:
release_created: ${{ steps.release.outputs.release_created }}
steps:
- id: release
uses: googleapis/release-please-action@v4
with:
config-file: release-please-config.json
manifest-file: .release-please-manifest.json

publish:
needs: release-please
if: needs.release-please.outputs.release_created == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
registry-url: https://registry.npmjs.org
- run: pnpm install --frozen-lockfile
- run: pnpm test
- run: pnpm publish --access public --no-git-checks --provenance
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
3 changes: 3 additions & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
".": "0.3.1"
}
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Changelog

Managed by release-please from this release onward. For history before 1.0.0, see the git log.
Loading
Loading