From 02a64d9d007ca4502acc25724620f18450375d56 Mon Sep 17 00:00:00 2001 From: Rasul Kireev Date: Tue, 16 Jun 2026 13:07:43 +0000 Subject: [PATCH] docs: add LVTD Skills plugin submission --- .agents/plugins/marketplace.json | 35 +- README.md | 3 +- plugins.json | 30 +- .../LVTD-LLC/skills/.codex-plugin/plugin.json | 42 ++ plugins/LVTD-LLC/skills/.codexignore | 7 + plugins/LVTD-LLC/skills/LICENSE | 21 + plugins/LVTD-LLC/skills/README.md | 180 +++++++ plugins/LVTD-LLC/skills/SECURITY.md | 17 + plugins/LVTD-LLC/skills/assets/app-icon.png | Bin 0 -> 44008 bytes .../assets/plugin-icons/cookiecutter.svg | 1 + .../skills/assets/plugin-icons/django.svg | 2 + .../plugin-icons/nonfiction-book-writing.svg | 1 + .../skills/assets/plugin-icons/rust.svg | 1 + .../skills/assets/plugin-icons/seo.svg | 1 + .../skills/assets/plugin-icons/traction.svg | 1 + plugins/LVTD-LLC/skills/docs/adding-skills.md | 112 +++++ plugins/LVTD-LLC/skills/docs/installation.md | 171 +++++++ .../skills/docs/marketplace-strategy.md | 385 +++++++++++++++ plugins/LVTD-LLC/skills/package-lock.json | 15 + plugins/LVTD-LLC/skills/package.json | 19 + .../skills/skills/alpinejs-django/SKILL.md | 202 ++++++++ .../alpinejs-django/assets/app-icon.png | Bin 0 -> 38047 bytes .../skills/beta-reader-feedback/SKILL.md | 99 ++++ .../references/core/checklist.md | 52 +++ .../references/core/examples.md | 99 ++++ .../references/core/knowledge.md | 85 ++++ .../references/core/rules.md | 89 ++++ .../workflows/run-beta-iteration.md | 82 ++++ .../workflows/synthesize-feedback.md | 86 ++++ .../skills/book-sales-optimization/SKILL.md | 98 ++++ .../references/core/checklist.md | 55 +++ .../references/core/examples.md | 97 ++++ .../references/core/knowledge.md | 92 ++++ .../references/core/rules.md | 99 ++++ .../workflows/audit-retailer-funnel.md | 82 ++++ .../skills/book-seed-marketing/SKILL.md | 88 ++++ .../references/core/checklist.md | 53 +++ .../references/core/examples.md | 95 ++++ .../references/core/knowledge.md | 92 ++++ .../references/core/rules.md | 90 ++++ .../workflows/choose-seed-channel.md | 91 ++++ .../workflows/plan-writing-in-public.md | 82 ++++ .../skills/skills/book-toc-lab/SKILL.md | 145 ++++++ .../skills/book-toc-lab/assets/app-icon.png | Bin 0 -> 46125 bytes .../book-toc-lab/references/core/checklist.md | 55 +++ .../book-toc-lab/references/core/examples.md | 85 ++++ .../book-toc-lab/references/core/knowledge.md | 82 ++++ .../book-toc-lab/references/core/rules.md | 83 ++++ .../book-toc-lab/workflows/validate-toc.md | 93 ++++ .../LVTD-LLC/skills/skills/calibredb/SKILL.md | 128 +++++ .../skills/calibredb/assets/app-icon.png | Bin 0 -> 6131 bytes .../calibredb/references/command-matrix.md | 63 +++ .../calibredb/references/safe-workflows.md | 50 ++ .../calibredb/scripts/list_books_json.py | 87 ++++ .../skills/skills/cookiecutter/SKILL.md | 119 +++++ .../skills/cookiecutter/assets/app-icon.png | Bin 0 -> 69657 bytes .../django-ci-test-optimization/SKILL.md | 67 +++ .../references/ci-patterns.md | 71 +++ .../skills/skills/django-htmx/SKILL.md | 233 +++++++++ .../skills/django-htmx/assets/app-icon.png | Bin 0 -> 52042 bytes .../LVTD-LLC/skills/skills/django-q2/SKILL.md | 192 ++++++++ .../skills/django-q2/assets/app-icon.png | Bin 0 -> 53182 bytes .../skills/django-targeted-mocking/SKILL.md | 68 +++ .../references/mocking-patterns.md | 94 ++++ .../skills/skills/django-test-data/SKILL.md | 73 +++ .../django-test-data/references/patterns.md | 75 +++ .../django-test-parallelization/SKILL.md | 85 ++++ .../references/shared-resources.md | 60 +++ .../skills/django-test-performance/SKILL.md | 94 ++++ .../references/speed-wins.md | 58 +++ .../skills/django-test-profiling/SKILL.md | 74 +++ .../references/profiler-commands.md | 56 +++ .../skills/skills/fastmcp-django/SKILL.md | 441 ++++++++++++++++++ .../skills/fastmcp-django/agents/openai.yaml | 4 + .../skills/fastmcp-django/assets/app-icon.png | Bin 0 -> 63590 bytes .../skills/skills/make-product-viral/SKILL.md | 222 +++++++++ .../make-product-viral/assets/app-icon.png | Bin 0 -> 325758 bytes .../skills/product-led-seo-strategy/SKILL.md | 56 +++ .../agents/openai.yaml | 4 + .../assets/app-icon.png | Bin 0 -> 81092 bytes .../product-led-seo-strategy/guidelines.md | 45 ++ .../references/core/examples.md | 46 ++ .../references/core/knowledge.md | 71 +++ .../references/core/rules.md | 61 +++ .../workflows/create-seo-strategy.md | 84 ++++ .../skills/reader-experience-edit/SKILL.md | 96 ++++ .../references/core/checklist.md | 58 +++ .../references/core/examples.md | 93 ++++ .../references/core/knowledge.md | 87 ++++ .../references/core/rules.md | 78 ++++ .../workflows/audit-manuscript.md | 84 ++++ .../skills/rust-api-test-harness/SKILL.md | 183 ++++++++ .../rust-api-test-harness/agents/openai.yaml | 4 + .../rust-api-test-harness/assets/app-icon.png | Bin 0 -> 327133 bytes .../references/database-test-isolation.md | 72 +++ .../references/external-http-mocks.md | 63 +++ .../scripts/check-rust-service.sh | 20 + .../skills/rust-deployable-service/SKILL.md | 75 +++ .../agents/openai.yaml | 4 + .../references/configuration.md | 45 ++ .../references/docker-rust.md | 54 +++ .../scripts/docker-preflight.sh | 26 ++ .../skills/rust-domain-boundaries/SKILL.md | 101 ++++ .../rust-domain-boundaries/agents/openai.yaml | 4 + .../references/newtype-patterns.md | 109 +++++ .../references/property-testing.md | 66 +++ .../skills/rust-error-observability/SKILL.md | 95 ++++ .../agents/openai.yaml | 4 + .../references/error-boundaries.md | 81 ++++ .../references/secrets-and-pii.md | 46 ++ .../references/tracing.md | 72 +++ .../skills/rust-idempotent-workflows/SKILL.md | 74 +++ .../agents/openai.yaml | 4 + .../references/background-workers.md | 46 ++ .../references/concurrency.md | 35 ++ .../references/idempotency.md | 48 ++ .../skills/rust-service-security/SKILL.md | 87 ++++ .../rust-service-security/agents/openai.yaml | 4 + .../references/auth-middleware.md | 32 ++ .../references/cookies-sessions.md | 39 ++ .../references/password-auth.md | 47 ++ .../rust-sqlx-postgres-service/SKILL.md | 87 ++++ .../agents/openai.yaml | 4 + .../references/migration-safety.md | 32 ++ .../references/sqlx-patterns.md | 102 ++++ .../scripts/sqlx-preflight.sh | 43 ++ .../self-publishing-production/SKILL.md | 79 ++++ .../references/core/checklist.md | 63 +++ .../references/core/examples.md | 88 ++++ .../references/core/knowledge.md | 92 ++++ .../references/core/rules.md | 82 ++++ .../workflows/prepare-production.md | 82 ++++ .../skills/seo-opportunity-research/SKILL.md | 46 ++ .../agents/openai.yaml | 4 + .../seo-opportunity-research/guidelines.md | 44 ++ .../references/core/examples.md | 45 ++ .../references/core/knowledge.md | 67 +++ .../references/core/rules.md | 66 +++ .../workflows/find-seo-opportunities.md | 80 ++++ .../seo-persona-intent-mapping/SKILL.md | 47 ++ .../agents/openai.yaml | 4 + .../seo-persona-intent-mapping/guidelines.md | 44 ++ .../references/core/examples.md | 42 ++ .../references/core/knowledge.md | 69 +++ .../references/core/rules.md | 61 +++ .../workflows/map-persona-intent.md | 77 +++ .../seo-roadmap-prioritization/SKILL.md | 46 ++ .../agents/openai.yaml | 4 + .../seo-roadmap-prioritization/guidelines.md | 44 ++ .../references/core/examples.md | 43 ++ .../references/core/knowledge.md | 59 +++ .../references/core/rules.md | 62 +++ .../workflows/prioritize-seo-roadmap.md | 92 ++++ .../skills/technical-seo-triage/SKILL.md | 46 ++ .../technical-seo-triage/agents/openai.yaml | 4 + .../skills/technical-seo-triage/guidelines.md | 45 ++ .../references/core/examples.md | 44 ++ .../references/core/knowledge.md | 63 +++ .../references/core/rules.md | 74 +++ .../workflows/triage-seo-issue.md | 86 ++++ .../skills/skills/traction-bullseye/SKILL.md | 159 +++++++ .../references/source-map.md | 43 ++ .../skills/traction-channel-research/SKILL.md | 89 ++++ .../skills/traction-critical-path/SKILL.md | 129 +++++ .../skills/traction-email-marketing/SKILL.md | 73 +++ .../skills/traction-events-community/SKILL.md | 80 ++++ .../skills/traction-paid-acquisition/SKILL.md | 85 ++++ .../traction-partnership-sales/SKILL.md | 77 +++ .../skills/traction-pr-playbook/SKILL.md | 83 ++++ .../skills/skills/traction-review/SKILL.md | 72 +++ .../skills/traction-seo-content/SKILL.md | 76 +++ .../skills/traction-test-planner/SKILL.md | 152 ++++++ .../references/middle-ring-test-prompts.md | 40 ++ .../traction-viral-engineering/SKILL.md | 80 ++++ 174 files changed, 11691 insertions(+), 21 deletions(-) create mode 100644 plugins/LVTD-LLC/skills/.codex-plugin/plugin.json create mode 100644 plugins/LVTD-LLC/skills/.codexignore create mode 100644 plugins/LVTD-LLC/skills/LICENSE create mode 100644 plugins/LVTD-LLC/skills/README.md create mode 100644 plugins/LVTD-LLC/skills/SECURITY.md create mode 100644 plugins/LVTD-LLC/skills/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/assets/plugin-icons/cookiecutter.svg create mode 100644 plugins/LVTD-LLC/skills/assets/plugin-icons/django.svg create mode 100644 plugins/LVTD-LLC/skills/assets/plugin-icons/nonfiction-book-writing.svg create mode 100644 plugins/LVTD-LLC/skills/assets/plugin-icons/rust.svg create mode 100644 plugins/LVTD-LLC/skills/assets/plugin-icons/seo.svg create mode 100644 plugins/LVTD-LLC/skills/assets/plugin-icons/traction.svg create mode 100644 plugins/LVTD-LLC/skills/docs/adding-skills.md create mode 100644 plugins/LVTD-LLC/skills/docs/installation.md create mode 100644 plugins/LVTD-LLC/skills/docs/marketplace-strategy.md create mode 100644 plugins/LVTD-LLC/skills/package-lock.json create mode 100644 plugins/LVTD-LLC/skills/package.json create mode 100644 plugins/LVTD-LLC/skills/skills/alpinejs-django/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/alpinejs-django/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/beta-reader-feedback/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/beta-reader-feedback/references/core/checklist.md create mode 100644 plugins/LVTD-LLC/skills/skills/beta-reader-feedback/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/beta-reader-feedback/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/beta-reader-feedback/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/beta-reader-feedback/workflows/run-beta-iteration.md create mode 100644 plugins/LVTD-LLC/skills/skills/beta-reader-feedback/workflows/synthesize-feedback.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-sales-optimization/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-sales-optimization/references/core/checklist.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-sales-optimization/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-sales-optimization/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-sales-optimization/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-sales-optimization/workflows/audit-retailer-funnel.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-seed-marketing/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-seed-marketing/references/core/checklist.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-seed-marketing/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-seed-marketing/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-seed-marketing/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-seed-marketing/workflows/choose-seed-channel.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-seed-marketing/workflows/plan-writing-in-public.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-toc-lab/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-toc-lab/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/book-toc-lab/references/core/checklist.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-toc-lab/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-toc-lab/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-toc-lab/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/book-toc-lab/workflows/validate-toc.md create mode 100644 plugins/LVTD-LLC/skills/skills/calibredb/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/calibredb/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/calibredb/references/command-matrix.md create mode 100644 plugins/LVTD-LLC/skills/skills/calibredb/references/safe-workflows.md create mode 100755 plugins/LVTD-LLC/skills/skills/calibredb/scripts/list_books_json.py create mode 100644 plugins/LVTD-LLC/skills/skills/cookiecutter/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/cookiecutter/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/django-ci-test-optimization/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-ci-test-optimization/references/ci-patterns.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-htmx/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-htmx/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/django-q2/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-q2/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/django-targeted-mocking/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-targeted-mocking/references/mocking-patterns.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-data/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-data/references/patterns.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-parallelization/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-parallelization/references/shared-resources.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-performance/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-performance/references/speed-wins.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-profiling/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/django-test-profiling/references/profiler-commands.md create mode 100644 plugins/LVTD-LLC/skills/skills/fastmcp-django/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/fastmcp-django/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/fastmcp-django/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/make-product-viral/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/make-product-viral/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/guidelines.md create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/product-led-seo-strategy/workflows/create-seo-strategy.md create mode 100644 plugins/LVTD-LLC/skills/skills/reader-experience-edit/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/reader-experience-edit/references/core/checklist.md create mode 100644 plugins/LVTD-LLC/skills/skills/reader-experience-edit/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/reader-experience-edit/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/reader-experience-edit/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/reader-experience-edit/workflows/audit-manuscript.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-api-test-harness/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-api-test-harness/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/rust-api-test-harness/assets/app-icon.png create mode 100644 plugins/LVTD-LLC/skills/skills/rust-api-test-harness/references/database-test-isolation.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-api-test-harness/references/external-http-mocks.md create mode 100755 plugins/LVTD-LLC/skills/skills/rust-api-test-harness/scripts/check-rust-service.sh create mode 100644 plugins/LVTD-LLC/skills/skills/rust-deployable-service/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-deployable-service/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/rust-deployable-service/references/configuration.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-deployable-service/references/docker-rust.md create mode 100755 plugins/LVTD-LLC/skills/skills/rust-deployable-service/scripts/docker-preflight.sh create mode 100644 plugins/LVTD-LLC/skills/skills/rust-domain-boundaries/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-domain-boundaries/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/rust-domain-boundaries/references/newtype-patterns.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-domain-boundaries/references/property-testing.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-error-observability/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-error-observability/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/rust-error-observability/references/error-boundaries.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-error-observability/references/secrets-and-pii.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-error-observability/references/tracing.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-idempotent-workflows/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-idempotent-workflows/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/rust-idempotent-workflows/references/background-workers.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-idempotent-workflows/references/concurrency.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-idempotent-workflows/references/idempotency.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-service-security/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-service-security/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/rust-service-security/references/auth-middleware.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-service-security/references/cookies-sessions.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-service-security/references/password-auth.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-sqlx-postgres-service/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-sqlx-postgres-service/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/rust-sqlx-postgres-service/references/migration-safety.md create mode 100644 plugins/LVTD-LLC/skills/skills/rust-sqlx-postgres-service/references/sqlx-patterns.md create mode 100755 plugins/LVTD-LLC/skills/skills/rust-sqlx-postgres-service/scripts/sqlx-preflight.sh create mode 100644 plugins/LVTD-LLC/skills/skills/self-publishing-production/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/self-publishing-production/references/core/checklist.md create mode 100644 plugins/LVTD-LLC/skills/skills/self-publishing-production/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/self-publishing-production/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/self-publishing-production/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/self-publishing-production/workflows/prepare-production.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-opportunity-research/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-opportunity-research/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/seo-opportunity-research/guidelines.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-opportunity-research/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-opportunity-research/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-opportunity-research/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-opportunity-research/workflows/find-seo-opportunities.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-persona-intent-mapping/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-persona-intent-mapping/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/seo-persona-intent-mapping/guidelines.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-persona-intent-mapping/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-persona-intent-mapping/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-persona-intent-mapping/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-persona-intent-mapping/workflows/map-persona-intent.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-roadmap-prioritization/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-roadmap-prioritization/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/seo-roadmap-prioritization/guidelines.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-roadmap-prioritization/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-roadmap-prioritization/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-roadmap-prioritization/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/seo-roadmap-prioritization/workflows/prioritize-seo-roadmap.md create mode 100644 plugins/LVTD-LLC/skills/skills/technical-seo-triage/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/technical-seo-triage/agents/openai.yaml create mode 100644 plugins/LVTD-LLC/skills/skills/technical-seo-triage/guidelines.md create mode 100644 plugins/LVTD-LLC/skills/skills/technical-seo-triage/references/core/examples.md create mode 100644 plugins/LVTD-LLC/skills/skills/technical-seo-triage/references/core/knowledge.md create mode 100644 plugins/LVTD-LLC/skills/skills/technical-seo-triage/references/core/rules.md create mode 100644 plugins/LVTD-LLC/skills/skills/technical-seo-triage/workflows/triage-seo-issue.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-bullseye/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-bullseye/references/source-map.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-channel-research/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-critical-path/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-email-marketing/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-events-community/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-paid-acquisition/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-partnership-sales/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-pr-playbook/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-review/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-seo-content/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-test-planner/SKILL.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-test-planner/references/middle-ring-test-prompts.md create mode 100644 plugins/LVTD-LLC/skills/skills/traction-viral-engineering/SKILL.md diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index ccfe10bf..90413ea3 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -49,34 +49,34 @@ "icon": "./plugins/yfge/agent-harness-skills/assets/icon.svg" }, { - "name": "codiris-agentizer", - "displayName": "Agentizer", + "name": "agent-workflow-system", + "displayName": "Agent Workflow System", "source": { "source": "local", - "path": "./plugins/Humiris/wwa-transform" + "path": "./plugins/1139030773-cmd/agent-workflow-system" }, "policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, "category": "Development & Workflow", - "description": "Turn any website into an AI-powered agentfront with split-pane", - "icon": "./plugins/Humiris/wwa-transform/assets/logo-256.png" + "description": "一套中文AI工作流系统:7个协作技能 + 行为规范宪法 + 会话恢复机制,模糊目标→可执行任务,全生命周期引导。Codex & Claude Code 双平台,新手友好。", + "icon": "./plugins/1139030773-cmd/agent-workflow-system/assets/composer-icon.svg" }, { - "name": "agent-workflow-system", - "displayName": "Agent Workflow System", + "name": "codiris-agentizer", + "displayName": "Agentizer", "source": { "source": "local", - "path": "./plugins/1139030773-cmd/agent-workflow-system" + "path": "./plugins/Humiris/wwa-transform" }, "policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, "category": "Development & Workflow", - "description": "一套中文AI工作流系统:7个协作技能 + 行为规范宪法 + 会话恢复机制,模糊目标→可执行任务,全生命周期引导。Codex & Claude Code 双平台,新手友好。", - "icon": "./plugins/1139030773-cmd/agent-workflow-system/assets/composer-icon.svg" + "description": "Turn any website into an AI-powered agentfront with split-pane", + "icon": "./plugins/Humiris/wwa-transform/assets/logo-256.png" }, { "name": "agentops", @@ -490,6 +490,21 @@ "description": "Auto-compress .md, .html, and .txt files via PostToolUse hook, cutting context usage by up to 40% with zero workflow change.", "icon": "./plugins/epicsagas/llm-transpile/assets/icon.png" }, + { + "name": "lvtd-skills", + "displayName": "LVTD Skills", + "source": { + "source": "local", + "path": "./plugins/LVTD-LLC/skills" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Development & Workflow", + "description": "Reusable Agent Skills for Codex, Claude Code, and compatible clients, covering Django, Rust, Cookiecutter, SEO, traction, product marketing, and nonfiction publishing workflows.", + "icon": "./plugins/LVTD-LLC/skills/assets/app-icon.png" + }, { "name": "personal-data-protection", "displayName": "Personal Data Protection", diff --git a/README.md b/README.md index 3de99aa2..03a9f7bd 100644 --- a/README.md +++ b/README.md @@ -139,8 +139,8 @@ Third-party plugins built by the community. [PRs welcome](#contributing)! - [A Team](https://github.com/RBraga01/a-team) - Universal multi-agent infrastructure with 25 specialist agents, 16 enforced workflow skills, and a lead orchestrator for Claude Code, Codex CLI, Cursor, and OpenCode. - [Aegis](https://github.com/GanyuanRan/Aegis) - An agentic skills framework & software development methodology that works: planning, TDD, debugging, and collaboration workflows. - [Agent Harness Skills](https://github.com/yfge/agent-harness-skills) - Designs agent-ready repository harnesses with entrypoints, validation surfaces, runtime evidence, delivery records, and atomic commit guidance. -- [Agentizer](https://github.com/Humiris/wwa-transform) - Turn any website into an AI-powered agentfront with split-pane - [Agent Workflow System](https://github.com/1139030773-cmd/agent-workflow-system) - 一套中文AI工作流系统:7个协作技能 + 行为规范宪法 + 会话恢复机制,模糊目标→可执行任务,全生命周期引导。Codex & Claude Code 双平台,新手友好。 +- [Agentizer](https://github.com/Humiris/wwa-transform) - Turn any website into an AI-powered agentfront with split-pane - [AgentOps](https://github.com/boshu2/agentops) - DevOps layer for coding agents with flow, feedback, and memory that compounds between sessions. - [AgiFlow](https://github.com/AgiFlow/ai-plugin) - Project management workflows for AI coding agents with planning, grooming, task execution, review, and AgiFlow MCP integration. - [Alcove](https://github.com/epicsagas/alcove) - Local-first MCP server for private project docs with hybrid BM25+vector search, tree-sitter code indexing, and automated linting for team-wide documentation standards. @@ -175,6 +175,7 @@ Third-party plugins built by the community. [PRs welcome](#contributing)! - [HOL Guard Plugin](https://github.com/hashgraph-online/hol-guard-plugin) - AI antivirus workflow for Codex, Claude Code, Cursor, Gemini, OpenCode, MCP servers, skills, and plugin release checks with local approvals and receipts. - [HOTL Plugin](https://github.com/yimwoo/hotl-plugin) - Human-on-the-Loop AI coding workflow plugin for Codex, Claude Code, and Cline with structured planning, review, and verification guardrails. - [LLM Transpile](https://github.com/epicsagas/llm-transpile) - Auto-compress .md, .html, and .txt files via PostToolUse hook, cutting context usage by up to 40% with zero workflow change. +- [LVTD Skills](https://github.com/LVTD-LLC/skills) - Reusable Agent Skills for Codex, Claude Code, and compatible clients, covering Django, Rust, Cookiecutter, SEO, traction, product marketing, and nonfiction publishing workflows. - [Personal Data Protection](https://github.com/AltByteSG/personal-data-protection-skill) - Engineer-facing personal-data-protection compliance reference — Singapore PDPA, Thailand PDPA, Indonesia UU PDP, Malaysia PDPA (Act 709 + 2024 Amendments), Philippines DPA — organised by where in the stack each obligation lands, with checklists, breach-response runbook, and a developer-view divergence table across all five. - [PR Storyteller](./plugins/mturac/pr-storyteller) - PR title + body + test plan from commits and diff vs base branch. - [Praxis](https://github.com/ouonet/praxis) - Intent-driven workflow skills for coding agents: describe what done looks like, not the steps. Triage-first design keeps token costs low across design, TDD, debug, review, and release. diff --git a/plugins.json b/plugins.json index c454b481..f939888b 100644 --- a/plugins.json +++ b/plugins.json @@ -39,16 +39,6 @@ "source": "awesome-codex-plugins", "install_url": "https://raw.githubusercontent.com/yfge/agent-harness-skills/HEAD/.codex-plugin/plugin.json" }, - { - "name": "Agentizer", - "url": "https://github.com/Humiris/wwa-transform", - "owner": "Humiris", - "repo": "wwa-transform", - "description": "Turn any website into an AI-powered agentfront with split-pane", - "category": "Development & Workflow", - "source": "awesome-codex-plugins", - "install_url": "https://raw.githubusercontent.com/Humiris/wwa-transform/HEAD/.codex-plugin/plugin.json" - }, { "name": "Agent Workflow System", "url": "https://github.com/1139030773-cmd/agent-workflow-system", @@ -59,6 +49,16 @@ "source": "awesome-codex-plugins", "install_url": "https://raw.githubusercontent.com/1139030773-cmd/agent-workflow-system/HEAD/plugins/agent-workflow-system/.codex-plugin/plugin.json" }, + { + "name": "Agentizer", + "url": "https://github.com/Humiris/wwa-transform", + "owner": "Humiris", + "repo": "wwa-transform", + "description": "Turn any website into an AI-powered agentfront with split-pane", + "category": "Development & Workflow", + "source": "awesome-codex-plugins", + "install_url": "https://raw.githubusercontent.com/Humiris/wwa-transform/HEAD/.codex-plugin/plugin.json" + }, { "name": "AgentOps", "url": "https://github.com/boshu2/agentops", @@ -339,6 +339,16 @@ "source": "awesome-codex-plugins", "install_url": "https://raw.githubusercontent.com/epicsagas/llm-transpile/HEAD/.codex-plugin/plugin.json" }, + { + "name": "LVTD Skills", + "url": "https://github.com/LVTD-LLC/skills", + "owner": "LVTD-LLC", + "repo": "skills", + "description": "Reusable Agent Skills for Codex, Claude Code, and compatible clients, covering Django, Rust, Cookiecutter, SEO, traction, product marketing, and nonfiction publishing workflows.", + "category": "Development & Workflow", + "source": "awesome-codex-plugins", + "install_url": "https://raw.githubusercontent.com/LVTD-LLC/skills/HEAD/.codex-plugin/plugin.json" + }, { "name": "Personal Data Protection", "url": "https://github.com/AltByteSG/personal-data-protection-skill", diff --git a/plugins/LVTD-LLC/skills/.codex-plugin/plugin.json b/plugins/LVTD-LLC/skills/.codex-plugin/plugin.json new file mode 100644 index 00000000..fc4bfb35 --- /dev/null +++ b/plugins/LVTD-LLC/skills/.codex-plugin/plugin.json @@ -0,0 +1,42 @@ +{ + "name": "lvtd-skills", + "version": "0.1.2", + "description": "Cross-host Agent Skills catalog for coding, marketing, traction, SEO, and publishing workflows.", + "author": { + "name": "LVTD", + "url": "https://github.com/LVTD-LLC" + }, + "homepage": "https://github.com/LVTD-LLC/skills", + "repository": "https://github.com/LVTD-LLC/skills", + "license": "MIT", + "keywords": [ + "agent-skills", + "codex", + "claude-code", + "skills", + "django", + "rust", + "cookiecutter", + "seo", + "traction", + "publishing" + ], + "skills": "./skills/", + "interface": { + "displayName": "LVTD Skills", + "shortDescription": "Reusable Agent Skills for Codex, Claude Code, and compatible clients.", + "longDescription": "LVTD Skills is a cross-host Agent Skills catalog with reusable SKILL.md directories plus generated Codex and Claude Code marketplace adapters. It includes guidance for Django, Rust backend services, Cookiecutter templates, SEO, traction, product marketing, and nonfiction publishing workflows.", + "developerName": "LVTD", + "category": "Development & Workflow", + "capabilities": [ + "Interactive", + "Read" + ], + "websiteURL": "https://github.com/LVTD-LLC/skills", + "defaultPrompt": "Use LVTD Skills when you need reusable Agent Skills for Django, Rust, Cookiecutter, SEO, traction, product marketing, or nonfiction publishing workflows.", + "brandColor": "#FF4057", + "composerIcon": "./assets/app-icon.png", + "logo": "./assets/app-icon.png", + "screenshots": [] + } +} diff --git a/plugins/LVTD-LLC/skills/.codexignore b/plugins/LVTD-LLC/skills/.codexignore new file mode 100644 index 00000000..c70162e3 --- /dev/null +++ b/plugins/LVTD-LLC/skills/.codexignore @@ -0,0 +1,7 @@ +.git/ +node_modules/ +dist/ +.claude-plugin/ +.agents/ +plugins/ +skills/**/progress.md diff --git a/plugins/LVTD-LLC/skills/LICENSE b/plugins/LVTD-LLC/skills/LICENSE new file mode 100644 index 00000000..876812b0 --- /dev/null +++ b/plugins/LVTD-LLC/skills/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 LVTD LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/LVTD-LLC/skills/README.md b/plugins/LVTD-LLC/skills/README.md new file mode 100644 index 00000000..c9fbd107 --- /dev/null +++ b/plugins/LVTD-LLC/skills/README.md @@ -0,0 +1,180 @@ +LVTD fire heart logo + +# LVTD Skills + +Reusable agent skills for LVTD projects, Django SaaS workflows, and agent-first software development. + +This repository is intentionally simple: every skill lives in `skills//SKILL.md`, with small validation and publishing scripts around that catalog. That shape works well for agents that read skill folders directly, and it is easy for external indexes like skills.sh to consume. + +## Skills + +| Skill | Use when | +| --- | --- | +| [`alpinejs-django`](skills/alpinejs-django/SKILL.md) | Adding, changing, or debugging Alpine.js behavior in Django templates, especially when HTMX partial swaps are also present. | +| [`calibredb`](skills/calibredb/SKILL.md) | Managing and querying Calibre libraries with the calibredb CLI, including metadata, formats, exports, checks, and full-text search. | +| [`cookiecutter`](skills/cookiecutter/SKILL.md) | Adding, changing, testing, or debugging Cookiecutter templates, including Jinja rendering, hooks, option cleanup, and generated-project validation. | +| [`django-htmx`](skills/django-htmx/SKILL.md) | Building and reviewing HTMX interactions in Django server-rendered apps, including partial responses, headers, swaps, triggers, forms, and tests. | +| [`django-q2`](skills/django-q2/SKILL.md) | Adding, changing, testing, or debugging Django Q2 background jobs, schedules, workers, and broker configuration. | +| [`fastmcp-django`](skills/fastmcp-django/SKILL.md) | Adding, changing, deploying, testing, or debugging FastMCP MCP servers in existing Django apps, including ASGI mounting, ORM access, auth, and Streamable HTTP deployment. | +| [`make-product-viral`](skills/make-product-viral/SKILL.md) | Making a product, landing page, pricing page, launch page, free tool, or social preview easier to understand, buy, remember, and share. | +| [`rust-api-test-harness`](skills/rust-api-test-harness/SKILL.md) | Adding, changing, testing, or debugging Rust HTTP APIs with black-box integration tests, random-port app startup, state isolation, mocks, and CI-ready cargo checks. | +| [`rust-deployable-service`](skills/rust-deployable-service/SKILL.md) | Preparing, containerizing, configuring, testing, or reviewing Rust services for deployment, including Docker, runtime config, secrets, health checks, SQLx offline builds, and startup validation. | +| [`rust-domain-boundaries`](skills/rust-domain-boundaries/SKILL.md) | Modeling, validating, refactoring, or reviewing Rust service domain boundaries with newtypes, parse-don't-validate constructors, request DTO boundaries, and property tests. | +| [`rust-error-observability`](skills/rust-error-observability/SKILL.md) | Adding, changing, debugging, or reviewing Rust service error handling and observability, including typed errors, HTTP response adapters, tracing spans, and redaction. | +| [`rust-idempotent-workflows`](skills/rust-idempotent-workflows/SKILL.md) | Designing, implementing, testing, or debugging Rust service workflows that must survive retries, duplicate requests, crashes, concurrency, queues, and side effects. | +| [`rust-service-security`](skills/rust-service-security/SKILL.md) | Adding, changing, testing, or reviewing security-sensitive Rust web service behavior, including login, password hashing, session cookies, route protection, and auth middleware. | +| [`rust-sqlx-postgres-service`](skills/rust-sqlx-postgres-service/SKILL.md) | Adding, changing, testing, or reviewing Postgres persistence in Rust services using SQLx migrations, compile-time checked queries, pools, transactions, and integration tests. | + +## Repository Layout + +```text +skills/ + / + SKILL.md +docs/ + installation.md +scripts/ + build-marketplaces.mjs + build-registry.mjs + skill-utils.mjs + validate-marketplaces.mjs + validate-skills.mjs +``` + +## Install A Skill Directly + +Use the `skills` CLI to install from this repository: + +```bash +npx skills add LVTD-LLC/skills --skill django-htmx +``` + +Common targets: + +```bash +# Codex global skills +npx skills add LVTD-LLC/skills --skill django-htmx -g -a codex + +# Claude Code global skills +npx skills add LVTD-LLC/skills --skill django-htmx -g -a claude-code + +# OpenClaw global skills +npx skills add LVTD-LLC/skills --skill django-htmx -g -a openclaw + +# Install from a local checkout +npx skills add . --skill django-htmx +``` + +More details are in [`docs/installation.md`](docs/installation.md). + +## Marketplace Install + +Add the marketplace in Claude Code: + +```text +/plugin marketplace add LVTD-LLC/skills +/plugin install django@lvtd-skills +/reload-plugins +``` + +Claude Code exposes the bundled skills as `/django:django-htmx`, +`/django:django-q2`, and the other skills in that plugin. + +Add the marketplace in Codex: + +```bash +codex plugin marketplace add LVTD-LLC/skills +codex plugin add django@lvtd-skills +``` + +Codex exposes the bundled skills as `$django:django-htmx`, +`$django:django-q2`, and the other skills in that plugin. + +To pick up a marketplace update for an already-installed Codex plugin, refresh +the marketplace snapshot and reinstall the plugin: + +```bash +codex plugin marketplace upgrade lvtd-skills +codex plugin remove django@lvtd-skills +codex plugin add django@lvtd-skills +``` + +This repository ships the marketplace files directly: + +```text +.claude-plugin/marketplace.json +.agents/plugins/marketplace.json +plugins// +``` + +The plugin skill folders are generated copies of `skills//`, so +Git-backed marketplace installs have real `SKILL.md` files while the canonical +source remains under `skills/`. Do not edit generated plugin copies directly. + +Refresh generated marketplace artifacts during development: + +```bash +npm run build +``` + +Generated marketplace plugin IDs: + +- `cookiecutter` +- `django` +- `nonfiction-book-writing` +- `rust` +- `seo` +- `traction` + +Marketplace plugins group related skills. Direct installs through the `skills` +CLI still use the canonical skill directory names. + +## Marketplace Strategy + +See [`docs/marketplace-strategy.md`](docs/marketplace-strategy.md) for the +research-backed plan to publish this catalog across Codex, Claude Code, +OpenClaw, and other Agent Skills-compatible clients. + +## Development + +New skills should follow [`docs/adding-skills.md`](docs/adding-skills.md). + +Validate source skills only: + +```bash +npm run validate +``` + +Build the machine-readable registry and refresh committed marketplace artifacts: + +```bash +npm run build +``` + +The registry is written to `dist/registry.json`. Marketplace artifacts are +written to `.claude-plugin/`, `.agents/plugins/`, and `plugins/`. + +Validate generated marketplace artifacts: + +```bash +npm run validate:marketplaces +``` + +Run the full local/CI check before opening a PR: + +```bash +npm run check +``` + +## Publishing + +CI validates every push and pull request. Publishing is tag-driven: + +1. Update the catalog version in `package.json`. +2. Run `npm run check` and commit the generated marketplace artifacts. +3. Create and push a matching `v*` tag, for example `v0.1.3`. + +The catalog version in `package.json` is also the generated marketplace plugin +version, so Codex installs use a new plugin cache path when the version changes. +The `Publish` workflow packages the registry and marketplace tarballs, then +publishes them on the GitHub release for pushed `v*` tags. diff --git a/plugins/LVTD-LLC/skills/SECURITY.md b/plugins/LVTD-LLC/skills/SECURITY.md new file mode 100644 index 00000000..ed07ce1c --- /dev/null +++ b/plugins/LVTD-LLC/skills/SECURITY.md @@ -0,0 +1,17 @@ +# Security Policy + +## Reporting a Vulnerability + +Please report security issues privately by opening a GitHub security advisory on +this repository or by contacting the maintainers through the LVTD GitHub +organization. + +Do not open public issues for suspected vulnerabilities. Include the affected +skill or plugin, reproduction steps, impact, and any relevant logs with secrets +redacted. + +## Scope + +This policy covers the canonical Agent Skills under `skills/`, generated Codex +and Claude Code marketplace adapters, and repository automation used to package +or validate the catalog. diff --git a/plugins/LVTD-LLC/skills/assets/app-icon.png b/plugins/LVTD-LLC/skills/assets/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..09e0d8a8b0cdd03f795cb2789be45b8dd743bafb GIT binary patch literal 44008 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 z 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 literal 0 HcmV?d00001 diff --git a/plugins/LVTD-LLC/skills/assets/plugin-icons/cookiecutter.svg b/plugins/LVTD-LLC/skills/assets/plugin-icons/cookiecutter.svg new file mode 100644 index 00000000..596191b0 --- /dev/null +++ b/plugins/LVTD-LLC/skills/assets/plugin-icons/cookiecutter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/LVTD-LLC/skills/assets/plugin-icons/django.svg b/plugins/LVTD-LLC/skills/assets/plugin-icons/django.svg new file mode 100644 index 00000000..2919ca78 --- /dev/null +++ b/plugins/LVTD-LLC/skills/assets/plugin-icons/django.svg @@ -0,0 +1,2 @@ + + diff --git a/plugins/LVTD-LLC/skills/assets/plugin-icons/nonfiction-book-writing.svg b/plugins/LVTD-LLC/skills/assets/plugin-icons/nonfiction-book-writing.svg new file mode 100644 index 00000000..be012b16 --- /dev/null +++ b/plugins/LVTD-LLC/skills/assets/plugin-icons/nonfiction-book-writing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/LVTD-LLC/skills/assets/plugin-icons/rust.svg b/plugins/LVTD-LLC/skills/assets/plugin-icons/rust.svg new file mode 100644 index 00000000..d020d817 --- /dev/null +++ b/plugins/LVTD-LLC/skills/assets/plugin-icons/rust.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/LVTD-LLC/skills/assets/plugin-icons/seo.svg b/plugins/LVTD-LLC/skills/assets/plugin-icons/seo.svg new file mode 100644 index 00000000..29422aa6 --- /dev/null +++ b/plugins/LVTD-LLC/skills/assets/plugin-icons/seo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/LVTD-LLC/skills/assets/plugin-icons/traction.svg b/plugins/LVTD-LLC/skills/assets/plugin-icons/traction.svg new file mode 100644 index 00000000..3fe03640 --- /dev/null +++ b/plugins/LVTD-LLC/skills/assets/plugin-icons/traction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/LVTD-LLC/skills/docs/adding-skills.md b/plugins/LVTD-LLC/skills/docs/adding-skills.md new file mode 100644 index 00000000..df20c2d7 --- /dev/null +++ b/plugins/LVTD-LLC/skills/docs/adding-skills.md @@ -0,0 +1,112 @@ +# Adding Skills + +This repo is built so agents can add skills without hand-wiring every adapter. +The only canonical source for a skill is `skills//`. + +## Skill Directory + +Create one directory per skill: + +```text +skills/ + / + SKILL.md + references/ + scripts/ + assets/ +``` + +Only `SKILL.md` is required. Add `references/`, `scripts/`, or `assets/` when +they make the skill easier to use or keep the main instructions concise. + +## Frontmatter Contract + +Use lowercase hyphen-case for `name`, and make it match the directory name. +Marketplace plugin IDs are generated from the grouping rules in +`scripts/marketplace-utils.mjs`. + +```yaml +--- +name: example-skill +description: Use when doing a specific workflow that benefits from repeatable agent guidance. +license: MIT +compatibility: Codex, Claude Code, and other Agent Skills-compatible clients. +metadata: + version: "0.1.0" + displayName: Example Skill + category: Developer Tooling + tags: example,workflow,agents +--- +``` + +Rules enforced by validation: + +- `name` must match the folder name. +- `description` must be useful and at least 40 characters. +- `metadata.version` must be `MAJOR.MINOR.PATCH` semver. +- `metadata.displayName`, `metadata.category`, and `metadata.tags` are required. +- Tags must be lowercase hyphen-case and cannot be duplicated. +- `metadata.tags` can be a comma-separated string or a YAML list. +- Display names should omit the `LVTD` prefix. +- `SKILL.md` must include a top-level Markdown heading. +- `SKILL.md` must use LF line endings. +- Executable files in `scripts/` must have an executable bit. + +## Writing The Skill + +Keep the first screen focused on when to use the skill and the workflow the +agent should follow. Move long examples, checklists, reference tables, and +provider-specific details to `references/` when they would bury the core +instructions. + +Prefer deterministic scripts over prose for repeated mechanical checks. Keep +scripts local to the skill directory and document when the agent should run +them. + +## Generated Artifacts + +Do not edit these paths by hand: + +```text +.claude-plugin/ +.agents/ +plugins/ +dist/ +``` + +Run this after changing any skill: + +```bash +npm run build +``` + +The build regenerates: + +- `dist/registry.json` +- `.claude-plugin/marketplace.json` +- `.agents/plugins/marketplace.json` +- `plugins//` + +`dist/` is ignored. Marketplace artifacts under `.claude-plugin/`, `.agents/`, +and `plugins/` are committed so marketplace installs work directly from GitHub. + +## Final Check + +Run the full check before opening a PR: + +```bash +npm run check +``` + +This command validates source skills, rebuilds generated files, validates +marketplace artifacts against the canonical `skills/` folders, and fails if +committed generated marketplace artifacts are stale. + +## PR Checklist + +- Source skill is added or updated under `skills//`. +- Marketplace grouping rules are updated when the skill should ship in a + generated plugin. +- Generated marketplace artifacts are regenerated with `npm run build`. +- `npm run check` passes. +- Any workflow changes are reflected in this guide and `AGENTS.md`. diff --git a/plugins/LVTD-LLC/skills/docs/installation.md b/plugins/LVTD-LLC/skills/docs/installation.md new file mode 100644 index 00000000..36cb2187 --- /dev/null +++ b/plugins/LVTD-LLC/skills/docs/installation.md @@ -0,0 +1,171 @@ +# Installation + +LVTD skills are plain folders that contain a `SKILL.md` file. Use the `skills` CLI to install them from GitHub, a direct skill URL, any git URL, or a local checkout. + +For Claude Code and Codex, this repo also ships native marketplace artifacts at +the repository root. + +## Claude Code Marketplace + +```text +/plugin marketplace add LVTD-LLC/skills +/plugin install django@lvtd-skills +/reload-plugins +``` + +Claude Code exposes the installed skills under the plugin namespace, for +example `/django:django-htmx`. + +## Codex Marketplace + +```bash +codex plugin marketplace add LVTD-LLC/skills +codex plugin add django@lvtd-skills +``` + +Codex exposes the installed skills under the plugin namespace, for example +`$django:django-htmx`. + +`codex plugin marketplace upgrade` refreshes the marketplace snapshot. To +replace the installed plugin cache, remove and add the plugin again: + +```bash +codex plugin marketplace upgrade lvtd-skills +codex plugin remove django@lvtd-skills +codex plugin add django@lvtd-skills +``` + +Start a new Codex thread after installing or updating plugins so the newly +installed skills are available in context. + +## Marketplace Contents + +This repository ships: + +```text +.claude-plugin/marketplace.json +.agents/plugins/marketplace.json +plugins// +``` + +Plugin IDs: + +- `cookiecutter` +- `django` +- `nonfiction-book-writing` +- `rust` +- `seo` +- `traction` + +Plugin IDs group related source skills. Direct installs through the `skills` CLI +still use canonical skill directory names such as `django-htmx`. + +If you installed an older per-skill marketplace plugin, uninstall that plugin ID +and install the matching grouped plugin. For example, replace +`django-htmx@lvtd-skills` with `django@lvtd-skills`. + +The previous `calibredb@lvtd-skills` and `make-product-viral@lvtd-skills` +marketplace plugins are no longer generated. Uninstall those marketplace plugin +IDs and install the skills directly with the `skills` CLI instead: + +```bash +npx skills add LVTD-LLC/skills --skill calibredb +npx skills add LVTD-LLC/skills --skill make-product-viral +``` + +## Install With The Skills CLI + +```bash +npx skills add LVTD-LLC/skills --skill +``` + +Example: + +```bash +npx skills add LVTD-LLC/skills --skill django-htmx +``` + +The command installs `django-htmx` from the `LVTD-LLC/skills` repository. The CLI will prompt for the target agent and scope if they are not provided. + +## Source Formats + +```bash +# GitHub shorthand +npx skills add LVTD-LLC/skills --skill django-htmx + +# Full GitHub URL +npx skills add https://github.com/LVTD-LLC/skills --skill django-htmx + +# Direct path to a skill in the repository +npx skills add https://github.com/LVTD-LLC/skills/tree/main/skills/django-htmx + +# Any git URL +npx skills add git@github.com:LVTD-LLC/skills.git --skill django-htmx + +# Local checkout +npx skills add . --skill django-htmx +``` + +## Codex + +Direct skill install: + +```bash +npx skills add LVTD-LLC/skills --skill django-htmx -g -a codex +``` + +Restart Codex or start a new session if your runtime only discovers skills at launch. + +## Claude Code + +Direct skill install: + +```bash +npx skills add LVTD-LLC/skills --skill django-htmx -g -a claude-code +``` + +If your Claude Code setup uses project-local skills, install into that project's skill directory instead. + +## OpenClaw + +```bash +npx skills add LVTD-LLC/skills --skill django-htmx -g -a openclaw +``` + +Use project scope instead of `-g` when you want the skill committed with a project. + +## Hermes And Other Agents + +For Hermes or another agent runtime, let the CLI prompt for the agent target or pass the relevant `--agent` value: + +```bash +# Let the CLI prompt for the target agent +npx skills add LVTD-LLC/skills --skill django-htmx + +# Hermes Agent +npx skills add LVTD-LLC/skills --skill django-htmx -g --agent hermes-agent + +# Another supported agent identifier +npx skills add LVTD-LLC/skills --skill django-htmx --agent +``` + +The required contract is intentionally small: + +- The target directory must contain one folder per skill. +- Each skill folder must contain a `SKILL.md`. +- The `SKILL.md` frontmatter should include `name` and `description`. + +## Local Development + +```bash +# Install one skill from the current checkout +npx skills add . --skill django-htmx +``` + +## Bulk Install + +Use `--all` to install every skill to every selected agent without shell-specific wildcard quoting. + +```bash +npx skills add LVTD-LLC/skills --all +``` diff --git a/plugins/LVTD-LLC/skills/docs/marketplace-strategy.md b/plugins/LVTD-LLC/skills/docs/marketplace-strategy.md new file mode 100644 index 00000000..dbfc1cf9 --- /dev/null +++ b/plugins/LVTD-LLC/skills/docs/marketplace-strategy.md @@ -0,0 +1,385 @@ +# Marketplace Strategy + +Research date: 2026-06-08 + +## Executive Recommendation + +Keep `skills//SKILL.md` as the canonical source format and generate +host-specific marketplace artifacts from it. + +The shared skill format is the most portable layer across Codex, Claude Code, +OpenClaw, and other agent clients. Marketplace and plugin formats should be +treated as adapters: + +- Agent Skills catalog: first-class canonical source and public registry. +- Claude Code: generated `.claude-plugin/marketplace.json` plus plugin folders. +- Codex: generated `.agents/plugins/marketplace.json` plus Codex plugin folders. +- OpenClaw: publish individual skills to ClawHub, and add native OpenClaw + plugins only when a skill needs runtime tools. + +This lets skill authors write once, while users install through the native UI or +CLI of their preferred tool. + +## Current Repo Assessment + +The repo now has the right base shape for a generated marketplace: + +- Each skill is a folder under `skills/` with a `SKILL.md`. +- `scripts/validate-skills.mjs` checks names, descriptions, frontmatter, + metadata, headings, line endings, and executable script files. +- `scripts/build-registry.mjs` emits `dist/registry.json`. +- `scripts/build-marketplaces.mjs` emits Claude Code and Codex marketplace + adapters from shared marketplace helper functions. +- `scripts/validate-marketplaces.mjs` verifies generated manifests, marketplace + entries, plugin directories, and copied skill folders against the canonical + `skills/` source. +- `npm run check` rebuilds and validates the catalog, then fails if committed + marketplace artifacts are stale. +- The `skills` CLI can install individual skills from GitHub, a direct skill + URL, any git URL, or a local checkout. +- CI runs the same `npm run check` command used locally. + +Remaining gaps before this becomes a mature marketplace: + +- The registry does not include source commit metadata yet. +- Frontmatter parsing is intentionally strict custom parsing instead of a full + YAML parser. +- CI does not yet run native host validators such as Claude, Codex, or OpenClaw + plugin validation CLIs. +- There are no prompt fixtures or behavioral smoke tests per skill yet. +- There is no supply-chain signing or provenance process for release artifacts. + +## Best Practices + +### 1. Preserve a Host-Neutral Skill Core + +Use the Agent Skills shape as the canonical contract: + +```text +skills/ + / + SKILL.md + scripts/ + references/ + assets/ +``` + +Every skill should have: + +- `name`: matches folder name, lowercase hyphen-case, max 64 chars. +- `description`: says what the skill does and when to use it. +- Optional `license`, `compatibility`, and `metadata`. +- Main instructions kept concise, with large material moved to `references/`. +- Scripts only when deterministic execution is better than prose. + +This aligns with the Agent Skills specification and with Claude Code and +OpenClaw skill discovery. Codex also uses the same basic `SKILL.md` style for +skills inside plugins. + +### 2. Separate Canonical Metadata From Host Adapter Metadata + +Keep the canonical metadata minimal and portable in `SKILL.md`: + +```yaml +--- +name: django-htmx +description: Build and review HTMX interactions in Django server-rendered projects. +license: MIT +compatibility: Designed for Codex, Claude Code, OpenClaw, and Agent Skills compatible clients. +metadata: + category: Web Development + tags: django,htmx,server-rendered-ui + version: "0.1.0" +--- +``` + +Then generate host-specific metadata: + +- Codex UI metadata: `agents/openai.yaml` inside skill folders when needed. +- Claude Code marketplace metadata: plugin `plugin.json` and marketplace entry. +- OpenClaw metadata: ClawHub publish metadata and any `metadata.openclaw.*` + fields only when an OpenClaw-specific behavior is needed. + +Avoid hardcoding Claude-only or Codex-only fields in every skill unless the +field is harmless for other clients. + +### 3. Offer Individual Skills and Grouped Marketplace Plugins + +The source catalog remains one directory per skill, so direct installs can stay +granular. Marketplace installs should use grouped plugins when related skills +are normally useful together. + +Recommended distribution model: + +- Direct skills CLI installs use canonical skill names such as `django-htmx`. +- Generated marketplace plugins group related skills, such as `django`, `rust`, + `nonfiction-book-writing`, `cookiecutter`, `seo`, and `traction`. +- Keep grouped plugins generated from the same skill source, not hand-maintained + copies. + +Tradeoff: + +- Direct installs maximize user choice and clearer updates. +- Grouped marketplace plugins reduce install friction for teams that want a + complete baseline. +- Plugin IDs no longer need to match canonical skill names; skill namespaces + make the bundled skill explicit after install. + +### 4. Version Skills Independently + +Root repo versioning is not enough once skills become marketplace entries. + +Add per-skill versioning: + +- Each skill has a semver in metadata. +- Generated marketplace entries expose that version. +- Registry records the source commit and content hash for each skill. +- Release notes can include both repo-level and skill-level changes. +- Generated marketplace plugin versions should follow the root catalog version + in `package.json` so packaging-only fixes invalidate host plugin caches. + +For Git-backed marketplaces, pin generated entries to release tags or commit +SHAs where the host supports it. Claude Code supports pinning plugin sources by +ref and SHA in marketplace entries. This repo publishes GitHub releases from +pushed `v*` tags. + +### 5. Generate Artifacts, Do Not Hand-Edit Marketplaces + +Add a build step that emits host-specific marketplace artifacts at the repository +root so Git-backed installs work directly: + +```text +.claude-plugin/marketplace.json +.agents/plugins/marketplace.json +plugins// + .claude-plugin/plugin.json + .codex-plugin/plugin.json + skills// +dist/ + registry.json +``` + +The source of truth remains `skills/`. Generated plugin folders should be +disposable and regenerated by script; humans should not edit generated +marketplace manifests directly. + +### 6. Validate at Three Levels + +Validation should happen before publishing: + +- Skill validation: + - Agent Skills naming and frontmatter rules. + - Required top-level heading. + - Description length and trigger quality. + - No CRLF line endings. + - Optional `scripts/` have executable bit and local usage docs. +- Marketplace validation: + - Claude Code: `claude plugin validate` against generated plugin folders. + - Codex: Codex plugin validator against generated `.codex-plugin/plugin.json`. + - OpenClaw: local validation plus `clawhub` publish dry-run if available. +- Behavioral validation: + - Small prompt fixtures per skill. + - Expected trigger and non-trigger examples. + - Smoke tests for bundled scripts. + +### 7. Treat Skills as Supply-Chain Artifacts + +Third-party skills and plugins can run commands, call tools, load references, +and interact with secrets through the host agent. A marketplace needs a +security posture from day one. + +Minimum controls: + +- Require review for any skill that adds `scripts/`, hooks, MCP config, apps, + or external network assumptions. +- Prefer read-only behavior by default. +- Declare required tools and credentials explicitly. +- Keep secrets out of skill text, prompts, logs, and test fixtures. +- Add content hashes to the registry. +- Publish signed GitHub releases or provenance attestations when practical. +- Add CODEOWNERS for skill domains. +- Run dependency and secret scans in CI. +- Keep marketplace entries pinned to release tags for stable channels. + +### 8. Use Native Host Semantics + +#### Claude Code + +Claude Code supports both standalone skills and plugins. Plugins are better for +sharing, versioning, and marketplace distribution. Plugin skills are namespaced +as `/plugin-name:skill-name`, which avoids conflicts. + +Recommended Claude output: + +```text +.claude-plugin/marketplace.json +plugins/django/ + .claude-plugin/plugin.json + skills/django-htmx/SKILL.md + skills/django-q2/SKILL.md +``` + +Use a Git-backed marketplace repo where possible. Relative plugin paths such as +`./plugins/django` resolve relative to the marketplace root when the marketplace +is added from Git. + +Because this repository publishes `.claude-plugin/marketplace.json` at the root, +`/plugin marketplace add LVTD-LLC/skills` can work directly without cloning and +building locally. + +Installation flow: + +```bash +/plugin marketplace add LVTD-LLC/skills +/plugin install django@lvtd-skills +/reload-plugins +``` + +#### Codex + +Codex plugins package workflow guidance, skills, and optionally apps or app +templates. For this repo, start with skills-only Codex plugins and add apps only +when a skill genuinely needs a connected system. + +Recommended Codex output: + +```text +.agents/plugins/marketplace.json +plugins/django/ + .codex-plugin/plugin.json + skills/django-htmx/SKILL.md + skills/django-q2/SKILL.md +``` + +Codex marketplace entries should include installation policy, authentication +policy, and category. Plugin manifests should use strict semver, real author +metadata, and only include app/MCP paths when those files exist. + +#### OpenClaw + +OpenClaw has native skills and plugins: + +- Skills are plain `SKILL.md` folders and can be installed from ClawHub, Git, + or local paths. +- Plugins can ship skills, but native plugins are more appropriate when adding + runtime tools, providers, channels, or hooks. + +Recommended OpenClaw output: + +- Publish each skill individually to ClawHub. +- Generate `openclaw` install docs and `clawhub skill publish` commands. +- Create native OpenClaw plugin packages only for tool-backed capabilities. + +Example install commands: + +```bash +openclaw skills install django-htmx +openclaw skills install ./skills/django-htmx --as django-htmx +``` + +For Git-based OpenClaw installs, publish a generated per-skill repository, +branch, or archive whose root contains that skill's `SKILL.md`; OpenClaw's Git +install path expects one skill at the source root. + +### 9. Keep the Registry Useful Outside Any One Host + +Expand `dist/registry.json` into a proper marketplace API surface: + +```json +{ + "schemaVersion": 2, + "name": "LVTD Skills", + "repository": "https://github.com/LVTD-LLC/skills", + "generatedAt": "2026-06-08T00:00:00.000Z", + "skills": [ + { + "name": "django-htmx", + "displayName": "Django HTMX", + "description": "Build and review HTMX interactions in Django server-rendered projects.", + "version": "0.1.0", + "license": "MIT", + "category": "Web Development", + "tags": ["django", "htmx", "server-rendered-ui"], + "path": "skills/django-htmx", + "entrypoint": "skills/django-htmx/SKILL.md", + "sha256": "...", + "hosts": { + "codex": { "plugin": "django" }, + "claudeCode": { "plugin": "django" }, + "openclaw": { "slug": "django-htmx" } + } + } + ] +} +``` + +That registry can drive: + +- A website marketplace. +- Search and filtering. +- Generated install commands. +- Host-specific marketplace generation. +- Changelog and update checks. + +## Implementation Roadmap + +### Phase 1: Normalize and Enrich Skills + +- Add `license`, `compatibility`, and marketplace `metadata` fields to each skill. +- Replace custom frontmatter parsing with a YAML parser. +- Validate Agent Skills naming rules, max description length, and optional + metadata. +- Add registry fields for version, license, category, tags, file list, and hash. + +### Phase 2: Generate Marketplace Adapters + +- Add `scripts/build-marketplaces.mjs`. +- Generate Claude Code marketplace artifacts at `.claude-plugin/` and + `plugins/`. +- Generate Codex marketplace artifacts at `.agents/plugins/` and `plugins/`. +- Copy plugin skill folders from canonical `skills//` folders so + Git-backed marketplace installs include real `SKILL.md` files. +- Generate OpenClaw publish plan. +- Commit the generated root marketplace artifacts so Git-backed installs work + directly. + +### Phase 3: Add Host Validation to CI + +- Validate core skills. +- Build all marketplace adapters. +- Validate generated Claude plugin folders. +- Validate generated Codex plugin folders. +- Run smoke prompts or script tests for skills with executable resources. + +### Phase 4: Publish Channels + +- Stable channel: GitHub releases and release tags. +- Preview channel: branch or prerelease tag. +- Claude Code marketplace: Git-backed `.claude-plugin/marketplace.json`. +- Codex marketplace: Codex plugin directory or private/team marketplace. +- OpenClaw: ClawHub skill publishing. +- Generic clients: `dist/registry.json` and release tarball. + +### Phase 5: Build the Marketplace UI + +- Static site reads `dist/registry.json`. +- Users filter by host, category, tag, and capability. +- Each skill page shows install commands for Codex, Claude Code, OpenClaw, and + direct skill installation. +- Include trust metadata: version, release tag, hash, license, last scan, and + whether the skill bundles scripts or external tool requirements. + +## Sources + +- [Agent Skills overview](https://agentskills.io/home) +- [Agent Skills specification](https://agentskills.io/specification) +- [Agent Skills best practices](https://agentskills.io/skill-creation/best-practices) +- [Claude Code skills](https://code.claude.com/docs/en/skills) +- [Claude Code plugins](https://code.claude.com/docs/en/plugins) +- [Claude Code plugin marketplaces](https://code.claude.com/docs/en/plugin-marketplaces) +- [Claude Code plugins reference](https://code.claude.com/docs/en/plugins-reference) +- [OpenAI Codex plugins and skills](https://openai.com/academy/codex-plugins-and-skills/) +- [OpenAI Help: Plugins in Codex](https://help.openai.com/en/articles/20001256-plugins-in-codex) +- [OpenClaw skills](https://docs.openclaw.ai/tools/skills) +- [OpenClaw plugins](https://docs.openclaw.ai/tools/plugin) +- [OpenClaw ClawHub](https://docs.openclaw.ai/clawhub) diff --git a/plugins/LVTD-LLC/skills/package-lock.json b/plugins/LVTD-LLC/skills/package-lock.json new file mode 100644 index 00000000..4bc82620 --- /dev/null +++ b/plugins/LVTD-LLC/skills/package-lock.json @@ -0,0 +1,15 @@ +{ + "name": "@lvtd/skills", + "version": "0.1.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@lvtd/skills", + "version": "0.1.2", + "engines": { + "node": ">=20" + } + } + } +} diff --git a/plugins/LVTD-LLC/skills/package.json b/plugins/LVTD-LLC/skills/package.json new file mode 100644 index 00000000..5f3f323a --- /dev/null +++ b/plugins/LVTD-LLC/skills/package.json @@ -0,0 +1,19 @@ +{ + "name": "@lvtd/skills", + "version": "0.1.2", + "private": true, + "description": "Reusable agent skills for LVTD projects and Django SaaS workflows.", + "type": "module", + "scripts": { + "build": "node scripts/validate-skills.mjs && node scripts/build-registry.mjs --skip-validation && node scripts/build-marketplaces.mjs --skip-validation", + "build:registry": "node scripts/build-registry.mjs", + "build:marketplaces": "node scripts/build-marketplaces.mjs", + "check": "npm run build && npm run validate:marketplaces && node scripts/check-generated-clean.mjs .claude-plugin .agents plugins", + "test": "npm run check", + "validate:marketplaces": "node scripts/validate-marketplaces.mjs", + "validate": "node scripts/validate-skills.mjs" + }, + "engines": { + "node": ">=20" + } +} diff --git a/plugins/LVTD-LLC/skills/skills/alpinejs-django/SKILL.md b/plugins/LVTD-LLC/skills/skills/alpinejs-django/SKILL.md new file mode 100644 index 00000000..8df0070b --- /dev/null +++ b/plugins/LVTD-LLC/skills/skills/alpinejs-django/SKILL.md @@ -0,0 +1,202 @@ +--- +name: alpinejs-django +description: Use when adding, changing, or debugging Alpine.js behavior in this Django SaaS Starter project, especially in Django templates that may also use HTMX partial updates. +license: MIT +compatibility: Codex, Claude Code, and other Agent Skills-compatible clients. +metadata: + version: "0.1.0" + displayName: Alpine.js Django + category: Django + tags: alpinejs,django,frontend,htmx +--- + +# Alpine.js with Django + +Use this skill for local browser state in Django-rendered templates: dropdowns, +modals, tabs, disclosures, inline filters, disabled/loading states, small +preview interactions, and client-only toggles. Use Django views/forms/models as +the source of truth for durable state. Use HTMX when the server needs to return +fresh HTML. + +## Project setup + +- Alpine is installed from npm and copied by `scripts/copy-vendor-assets.mjs` + to `frontend/static/vendors/js/alpine.min.js`. +- `base_app.html` and `base_landing.html` load HTMX first, Alpine second, and + `frontend/static/js/app.js` third. +- The loaded Alpine file is the self-starting CDN build. Do not call + `Alpine.start()` from `frontend/src/js/app.js`. +- Simple Alpine behavior should usually live inline in the Django template with + `x-data`. +- If a reusable component or store is worth extracting, register it before + Alpine starts. With the current script order, `frontend/src/js/app.js` runs too + late for reliable `document.addEventListener("alpine:init", ...)` + registration unless the script order is changed. +- When reusable Alpine registration is needed, add a dedicated classic script + such as `frontend/src/js/alpine-components.js`, register components/stores + inside `document.addEventListener("alpine:init", ...)`, and include the copied + `frontend/static/js/alpine-components.js` before `vendors/js/alpine.min.js` in + both base templates. Keep `app.js` after Alpine, keep the self-starting Alpine + build, and still do not call `Alpine.start()` manually. + +## Ownership rules + +- Django owns persistence, authorization, validation, redirects, and rendered + HTML. +- HTMX owns server round trips and DOM swaps. +- Alpine owns ephemeral state already present in the browser. +- Plain modules in `frontend/src/js/` own shared DOM behavior that is not + naturally scoped to one Alpine component. +- Do not duplicate the same behavior in Alpine and a plain JS module. + +## Template patterns + +Use a small `x-data` object near the markup it controls: + +```html +
+ + +
+ ... +
+
+``` + +Prefer Alpine directives over manual DOM manipulation: + +- `x-show` for toggling visibility while keeping the element in the DOM. +- `x-if` on a `