Skill: claudiodrusus/skill-1 (version 1.0.0)

--- name: qr-gen description: Generate QR codes from text, URLs, WiFi credentials, vCards, or any data. Use when the user wants to create a QR code, share a link as a scannable code, generate WiFi login QR codes, create contact/vCard QR codes, or produce any scannable barcode image. Outputs PNG, SVG, or ASCII art. --- # QR Code Generator Generate QR codes via the bundled Python script. ## Quick Start ```bash python3 scripts/generate_qr.py "https://example.com" -o qr.png ``` ## Common Patterns ### URL or text ```bash python3 scripts/generate_qr.py "https://example.com" -o link.png ``` ### WiFi network (scannable by phones) ```bash python3 scripts/generate_qr.py "wifi" --wifi-ssid "MyNetwork" --wifi-pass "secret123" -o wifi.png ``` ### vCard contact Generate the vCard string and pipe it: ```bash python3 scripts/generate_qr.py "BEGIN:VCARD VERSION:3.0 FN:Jane Smith TEL:+1234567890 EMAIL:[REDACTED_SECRET] END:VCARD" -o contact.png ``` ### ASCII art (terminal preview) ```bash python3 scripts/generate_qr.py "hello" --format ascii ``` ### SVG (scalable, web-friendly) ```bash python3 scripts/generate_qr.py "data" -o code.svg ``` ## Options - `-o FILE` — output path (default: qr.png) - `-s N` — box size in pixels (default: 10) - `--border N` — border width (default: 4) - `--format png|svg|ascii` — force format (auto-detected from extension) - `--error-correction L|M|Q|H` — error correction level (default: M; use H for logos/damage tolerance) ## Dependencies The script auto-installs `qrcode[pil]` via pip if missing. No manual setup needed.

path: PUBLISH-LOG.md
content: # Publish Log — qr-gen skill

## 2026-02-21 — Publish Attempt

**Status:** ❌ BLOCKED — ClawHub authentication required

### What happened
1. ✅ Skill files verified — `SKILL.md` has proper frontmatter (`name: qr-gen`, `description` with triggers), `scripts/generate_qr.py` present
2. ✅ Publish command prepared: `clawdhub publish ~/shelly/products/skill-1/ --slug qr-gen --name "QR Code Generator" --version 1.0.0 --changelog "Initial release"`
3. ❌ `clawdhub whoami` → "Not logged in"
4. ❌ `clawdhub login` opens GitHub OAuth in browser — requires manual sign-in
5. ❌ Browser automation couldn't complete the GitHub OAuth flow (service timeout)

### Next Steps
1. **Manual login:** Run `clawdhub login` in terminal, sign in with GitHub in the browser that opens
2. **Then publish:**
   ```bash
   clawdhub publish ~/shelly/products/skill-1/ --slug qr-gen --name "QR Code Generator" --version 1.0.0 --changelog "Initial release: Generate QR codes from text, URLs, WiFi, vCards. PNG/SVG/ASCII output."
   ```

### Skill Readiness
The skill itself is ready to publish — SKILL.md frontmatter is correct, script is in place, no issues found.


path: scripts/generate_qr.py
content: #!/usr/bin/env python3
"""Generate QR codes from text, URLs, WiFi credentials, vCards, etc."""

import argparse
import sys
import os

def ensure_qrcode():
    try:
        import qrcode
        return qrcode
    except ImportError:
        import subprocess
        subprocess.check_call([sys.executable, "-m", "pip", "install", "qrcode[pil]", "-q"])
        import qrcode
        return qrcode

def wifi_payload(ssid, password, security="WPA", hidden=False):
    hidden_str = "true" if hidden else "false"
    password_str = password if password else ""
    return f"WIFI:T:{security};S:{ssid};P:{password_str};H:{hidden_str};;"

def vcard_payload(name, phone="", email="", org="", url=""):
    lines = ["BEGIN:VCARD", "VERSION:3.0", f"FN:{name}"]
    if phone: lines.append(f"TEL:{phone}")
    if email: lines.append(f"EMAIL:{email}")
    if org: lines.append(f"ORG:{org}")
    if url: lines.append(f"URL:{url}")
    lines.append("END:VCARD")
    return "\n".join(lines)

def main():
    parser = argparse.ArgumentParser(description="Generate QR codes")
    parser.add_argument("data", help="Text/URL to encode")
    parser.add_argument("-o", "--output", default="qr.png", help="Output file path (default: qr.png)")
    parser.add_argument("-s", "--size", type=int, default=10, help="Box size in pixels (default: 10)")
    parser.add_argument("--border", type=int, default=4, help="Border width in boxes (default: 4)")
    parser.add_argument("--format", choices=["png", "svg", "ascii"], default=None,
                        help="Output format (auto-detected from extension)")
    parser.add_argument("--error-correction", choices=["L", "M", "Q", "H"], default="M",
                        help="Error correction level (default: M)")
    parser.add_argument("--wifi-ssid", help="Generate WiFi QR: SSID")
    parser.add_argument("--wifi-pass", help="Generate WiFi QR: password")
    parser.add_argument("--wifi-security", default="WPA", help="WiFi security type (default: WPA)")
    args = parser.parse_args()

    qrcode = ensure_qrcode()

    ec_levels = {"L": qrcode.constants.ERROR_CORRECT_L, "M": qrcode.constants.ERROR_CORRECT_M,
                 "Q": qrcode.constants.ERROR_CORRECT_Q, "H": qrcode.constants.ERROR_CORRECT_H}

    # Determine data
    data = args.data
    if args.wifi_ssid:
        data = wifi_payload(args.wifi_ssid, args.wifi_pass or "", args.wifi_security)

    # Determine format
    fmt = args.format
    if not fmt:
        ext = os.path.splitext(args.output)[1].lower()
        fmt = {"svg": "svg", ".svg": "svg", ".txt": "ascii"}.get(ext, "png")

    qr = qrcode.QRCode(version=None, error_correction=ec_levels[args.error_correction],
                        box_size=args.size, border=args.border)
    qr.add_data(data)
    qr.make(fit=True)

    if fmt == "ascii":
        qr.print_ascii(out=sys.stdout if args.output == "qr.png" else open(args.output, "w"))
        if args.output != "qr.png":
            print(f"Saved ASCII QR to {args.output}")
    elif fmt == "svg":
        import qrcode.image.svg
        img = qr.make_image(image_factory=qrcode.image.svg.SvgPathImage)
        img.save(args.output)
        print(f"Saved SVG QR to {args.output}")
    else:
        img = qr.make_image(fill_color="black", back_color="white")
        img.save(args.output)
        print(f"Saved QR to {args.output}")

if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: suspicious | SkillSpector: suspicious (CRITICAL)