Claude Skill

fluentcart-licensing-pro

Implements and audits FluentCart Pro product licensing, license generation, activation limits, site activation/deactivation, customer/admin access, subscription validity, refunds, update checks, package delivery, and legacy EDD-compatible clients. Use when working with the Pro Li

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download lonsdale201-wp-agent-skills-fluentcart_fluentcart-licensing-pro-52f6020.zip · 4 KB
Part of lonsdale201/wp-agent-skills — 226 skills

Install

skills CLI npx skills add https://github.com/Lonsdale201/wp-agent-skills/tree/main/fluentcart/fluentcart-licensing-pro
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install lonsdale201-wp-agent-skills@llmmart
Git git clone https://github.com/Lonsdale201/wp-agent-skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole lonsdale201/wp-agent-skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

FluentCart Pro licensing

This skill is Pro-only. Verify FluentCart Pro is active and the license module is enabled before using its models, routes, tables, or hooks.

Read licensing-protocol.md before extending generation, activation, update delivery, or client compatibility.

Configure products through the module

Use the Licensing module's product settings and LicenseManager/LicenseHelper services. Do not create keys or activation rows with ad-hoc SQL. The module relates licenses to customer, order, product, variation, subscription, sites, activations, and meta, and applies lifecycle rules to those relations.

Feature-detect ModuleSettings::isActive('license') and Pro classes after fluent_cart/init. A product being downloadable or subscription-based does not itself mean licensing is enabled for that variation.

Follow the commerce lifecycle

The built-in handler generates licenses after fluent_cart/order_paid for initial payment/subscription orders; extends validity on subscription renewal; reactivates where appropriate; and disables/expires/deletes licenses according to payment failure, full refund, validity expiry, order deletion, and module policy.

Listen to license-specific hooks for addon side effects instead of duplicating generation. Make extensions replay-safe: payment/webhook and repair flows may re-enter lifecycle code. Preserve the distinction among active, disabled, and expired plus the stored reason and previous status.

Do not revoke automatically on every transient renewal failure unless that is the explicit access policy. Subscription grace, next billing date, cancellation at period end, EOT, refund, and manual administration are separate decisions.

Treat credentials and activations as bearer authority

License keys and activation hashes are secrets. Never log them in full, expose them in public REST serializers, place them in analytics/referrers, or accept a license ID alone as authorization. Normalize the site URL through LicenseHelper and validate product/item binding on every check, activation, deactivation, version, and package request.

Activation must be concurrency-safe around the limit. Test simultaneous first activations and activation/deactivation races; a read-count-create-recount sequence alone is not proof of atomic enforcement.

Customer-profile endpoints require WordPress login and must remain scoped to the resolved FluentCart customer. Admin endpoints use LicensePolicy permissions such as licenses/view, licenses/manage, and licenses/delete.

Use the public protocol as installed

License client calls enter FluentCart's public action dispatcher and map to check_license, activate_license, deactivate_license, get_license_version, and download_license_package handlers. Match the installed request/response shape and distinguish transport HTTP success from the returned license status/error.

Do not reuse fct_package as a general-purpose signed URL scheme. In the tested 1.6.0 source it is a base64-encoded credential payload, and the download parser does not consume the appended expiry field as a verified cryptographic claim. Use the built-in path only for required compatibility, keep TTL/authorization under version-specific audit, and implement new protected delivery with a server-held, tamper-evident, expiring token or opaque one-time record.

Protect package and update delivery

  • Store packages outside direct public access or behind controlled storage.
  • Resolve the current entitled product/variation and valid activation again at download time.
  • Validate expiry server-side and prevent path traversal/open redirects.
  • Stream or redirect using the storage driver's safe contract.
  • Rate-limit checks, activation, version and package endpoints.
  • Avoid leaking whether arbitrary keys or customer emails exist.
  • Record redacted audit events and provider/client version for reconciliation.

Test matrix

Test disabled module/Pro absence, one-time and subscription products, quantity and variation license settings, duplicate paid event, payment failure, full and partial refund, renewal/grace/expiry/EOT/reactivation, key regeneration, limit change, local/staging classification, normalized URL variants, concurrent limit race, activation replay, wrong item/site/hash, customer cross-account access, admin capability boundaries, expired/tampered package URL, update response, and legacy EDD client compatibility.

Cross-references

  • Use fluentcart-subscriptions-renewals for validity timing.
  • Use fluentcart-downloads-storage for protected files.
  • Use fluentcart-rest-headless for public/customer/admin authorization.
  • Use fluentcart-migration for EDD license migration.

References

  • Verified Pro source paths:
    • fluent-cart-pro/app/Modules/Licensing/Licensing.php
    • fluent-cart-pro/app/Modules/Licensing/Models/
    • fluent-cart-pro/app/Modules/Licensing/Services/LicenseManager.php
    • fluent-cart-pro/app/Modules/Licensing/Services/LicenseHelper.php
    • fluent-cart-pro/app/Modules/Licensing/Hooks/Handlers/
    • fluent-cart-pro/app/Modules/Licensing/Http/licensing-api.php
    • fluent-cart-pro/app/Http/Policies/LicensePolicy.php
Files (wp-agent-skills)
  • agents
    • openai.yaml 325 B
      interface:
        display_name: "FluentCart Pro licensing"
        short_description: "Extend product licensing and package delivery safely"
        default_prompt: "Use $fluentcart-licensing-pro to implement or audit this FluentCart Pro licensing flow with lifecycle, ownership, activation-limit, credential, and package-delivery controls."
      
  • references
    • licensing-protocol.md 2.8 KB
      # FluentCart Pro 1.6.0 licensing protocol
      
      ## Module boundary
      
      The Pro module owns these records:
      
      - fct_licenses: entitlement/key, owner, product/variation/order/subscription,
        status, limit and expiration;
      - fct_license_sites: normalized installation identity and environment data;
      - fct_license_activations: license-to-site binding and activation hash;
      - fct_license_meta: extension metadata.
      
      Use relationships/services so counts and lifecycle hooks remain consistent.
      
      ## Lifecycle map
      
      ~~~text
      paid initial order -> generate configured product/variation licenses
      subscription renewal/data update -> align license validity
      subscription validity expiry -> expire
      reactivation -> reactivate eligible disabled license
      payment failure/full refund -> disable under current policy
      order deletion -> delete unless filtered
      customer merge/change -> move license ownership
      ~~~
      
      LicenseGenerationHandler is the source of truth for exact event and order-type
      conditions in the installed release. An addon should react to emitted license
      events rather than running a second generator.
      
      ## Public client operations
      
      | Operation | Minimum credential binding |
      |---|---|
      | check_license | key or activation hash, item, normalized site |
      | activate_license | key, item, normalized site |
      | deactivate_license | key, item, normalized site/activation context |
      | get_license_version | license/activation context and item |
      | download_license_package | validated entitlement and protected package |
      
      These are intentionally public machine-to-machine endpoints. CSRF nonces do not
      solve their authorization; the secret and object bindings do. Apply abuse
      limits and avoid distinguishable enumeration responses where compatibility
      allows.
      
      ## Package token warning
      
      The 1.6.0 get-version handler builds fct_package by base64-encoding colon-
      separated license, activation, site, product and expiry data. The corresponding
      download parser reads the first four fields but does not visibly verify the
      fifth expiry field. Base64 also supplies no integrity.
      
      Consequences for extension work:
      
      - do not describe this token as cryptographically signed;
      - do not copy it into a new API;
      - do not rely on the embedded timestamp without a source-confirmed check;
      - re-audit the installed handler after every update;
      - use an HMAC with constant-time verification and enforced expiry, or an opaque
        random server-side token, for new protocols.
      
      Continue to validate current license status, product binding and activation at
      download time even when a token is tamper-evident.
      
      ## Client compatibility
      
      Version/update clients must tolerate the installed endpoint's status/error
      conventions. HTTP 200 can carry an invalid license result in selected actions.
      Parse both transport status and body fields, redact secrets from errors, and
      back off rather than repeatedly activating after a network ambiguity.
      
  • SKILL.md 5.9 KB
    ---
    name: fluentcart-licensing-pro
    description: >-
      Implements and audits FluentCart Pro product licensing, license generation,
      activation limits, site activation/deactivation, customer/admin access,
      subscription validity, refunds, update checks, package delivery, and legacy
      EDD-compatible clients. Use when working with the Pro Licensing module,
      LicenseManager, LicenseHelper, fct_licenses, fct_license_activations,
      fluent_cart_action_* license endpoints, license lifecycle hooks, protected
      plugin downloads, local/staging activations, or license migrations.
    metadata:
      wp-skills-author: "Soczó Kristóf"
      wp-skills-contact: "mailto:lonsdale201@hotmail.com"
      wp-skills-plugin: "fluent-cart-pro"
      wp-skills-plugin-version-tested: "1.6.0"
      wp-skills-wp-version-tested: "7.0.2"
      wp-skills-php-min: "7.4"
      wp-skills-last-updated: "2026-08-06"
    ---
    
    # FluentCart Pro licensing
    
    This skill is Pro-only. Verify FluentCart Pro is active and the license module
    is enabled before using its models, routes, tables, or hooks.
    
    Read [licensing-protocol.md](references/licensing-protocol.md) before extending
    generation, activation, update delivery, or client compatibility.
    
    ## Configure products through the module
    
    Use the Licensing module's product settings and LicenseManager/LicenseHelper
    services. Do not create keys or activation rows with ad-hoc SQL. The module
    relates licenses to customer, order, product, variation, subscription, sites,
    activations, and meta, and applies lifecycle rules to those relations.
    
    Feature-detect ModuleSettings::isActive('license') and Pro classes after
    fluent_cart/init. A product being downloadable or subscription-based does not
    itself mean licensing is enabled for that variation.
    
    ## Follow the commerce lifecycle
    
    The built-in handler generates licenses after fluent_cart/order_paid for
    initial payment/subscription orders; extends validity on subscription renewal;
    reactivates where appropriate; and disables/expires/deletes licenses according
    to payment failure, full refund, validity expiry, order deletion, and module
    policy.
    
    Listen to license-specific hooks for addon side effects instead of duplicating
    generation. Make extensions replay-safe: payment/webhook and repair flows may
    re-enter lifecycle code. Preserve the distinction among active, disabled, and
    expired plus the stored reason and previous status.
    
    Do not revoke automatically on every transient renewal failure unless that is
    the explicit access policy. Subscription grace, next billing date, cancellation
    at period end, EOT, refund, and manual administration are separate decisions.
    
    ## Treat credentials and activations as bearer authority
    
    License keys and activation hashes are secrets. Never log them in full, expose
    them in public REST serializers, place them in analytics/referrers, or accept a
    license ID alone as authorization. Normalize the site URL through LicenseHelper
    and validate product/item binding on every check, activation, deactivation,
    version, and package request.
    
    Activation must be concurrency-safe around the limit. Test simultaneous first
    activations and activation/deactivation races; a read-count-create-recount
    sequence alone is not proof of atomic enforcement.
    
    Customer-profile endpoints require WordPress login and must remain scoped to
    the resolved FluentCart customer. Admin endpoints use LicensePolicy permissions
    such as licenses/view, licenses/manage, and licenses/delete.
    
    ## Use the public protocol as installed
    
    License client calls enter FluentCart's public action dispatcher and map to
    check_license, activate_license, deactivate_license, get_license_version, and
    download_license_package handlers. Match the installed request/response shape
    and distinguish transport HTTP success from the returned license status/error.
    
    Do not reuse fct_package as a general-purpose signed URL scheme. In the tested
    1.6.0 source it is a base64-encoded credential payload, and the download parser
    does not consume the appended expiry field as a verified cryptographic claim.
    Use the built-in path only for required compatibility, keep TTL/authorization
    under version-specific audit, and implement new protected delivery with a
    server-held, tamper-evident, expiring token or opaque one-time record.
    
    ## Protect package and update delivery
    
    - Store packages outside direct public access or behind controlled storage.
    - Resolve the current entitled product/variation and valid activation again at
      download time.
    - Validate expiry server-side and prevent path traversal/open redirects.
    - Stream or redirect using the storage driver's safe contract.
    - Rate-limit checks, activation, version and package endpoints.
    - Avoid leaking whether arbitrary keys or customer emails exist.
    - Record redacted audit events and provider/client version for reconciliation.
    
    ## Test matrix
    
    Test disabled module/Pro absence, one-time and subscription products, quantity
    and variation license settings, duplicate paid event, payment failure, full and
    partial refund, renewal/grace/expiry/EOT/reactivation, key regeneration, limit
    change, local/staging classification, normalized URL variants, concurrent limit
    race, activation replay, wrong item/site/hash, customer cross-account access,
    admin capability boundaries, expired/tampered package URL, update response, and
    legacy EDD client compatibility.
    
    ## Cross-references
    
    - Use fluentcart-subscriptions-renewals for validity timing.
    - Use fluentcart-downloads-storage for protected files.
    - Use fluentcart-rest-headless for public/customer/admin authorization.
    - Use fluentcart-migration for EDD license migration.
    
    ## References
    
    - Verified Pro source paths:
      - fluent-cart-pro/app/Modules/Licensing/Licensing.php
      - fluent-cart-pro/app/Modules/Licensing/Models/
      - fluent-cart-pro/app/Modules/Licensing/Services/LicenseManager.php
      - fluent-cart-pro/app/Modules/Licensing/Services/LicenseHelper.php
      - fluent-cart-pro/app/Modules/Licensing/Hooks/Handlers/
      - fluent-cart-pro/app/Modules/Licensing/Http/licensing-api.php
      - fluent-cart-pro/app/Http/Policies/LicensePolicy.php
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related