name: "skill-publish"
description: "Publish trustless, immutable, on-chain skill releases and return canonical references"
author: "Hashgraph Online"
branding:
  icon: "upload-cloud"
  color: "blue"
inputs:
  api-base-url:
    description: "Registry Broker base URL (either .../registry or .../registry/api/v1)"
    required: false
    default: "https://hol.org/registry/api/v1"
  mode:
    description: "Execution mode: validate, monitor, quote, or publish"
    required: false
    default: "publish"
  api-key:
    description: "Registry Broker API key (required for quote and publish, optional for validate)"
    required: false
  account-id:
    description: "Optional Hedera account ID used for publish authorization"
    required: false
  skill-dir:
    description: "Path to the skill package folder containing SKILL.md and skill.json"
    required: true
  name:
    description: "Optional name override for skill.json"
    required: false
  version:
    description: "Optional version override for skill.json"
    required: false
  allow-nonstable-production-version:
    description: "When true, permits publishing a non-stable custom version to the production registry"
    required: false
    default: "false"
  stamp-repo-commit:
    description: "When true, writes repo and commit fields into the publish payload"
    required: false
    default: "true"
  poll-timeout-ms:
    description: "Publish job poll timeout in milliseconds"
    required: false
    default: "720000"
  poll-interval-ms:
    description: "Publish job poll interval in milliseconds"
    required: false
    default: "4000"
  annotate:
    description: "When true, posts results to release notes or merged PR"
    required: false
    default: "true"
  submit-indexnow:
    description: "When true, submits canonical skill URLs to IndexNow after publish or skip-existing"
    required: false
    default: "false"
  github-token:
    description: "GitHub token used for release or PR annotations"
    required: false
  preview-upload:
    description: "When true, uploads validate or monitor previews through GitHub OIDC when available"
    required: false
    default: "true"
  comment-mode:
    description: "Managed comment behavior: off, failures-only, state-changes, or always"
    required: false
    default: "state-changes"
  comment-on-success:
    description: "When true, allows managed comments on successful state changes"
    required: false
    default: "true"
  quote-preview:
    description: "When true, requests an estimated publish cost preview when the skill is publish-ready"
    required: false
    default: "false"
  conversion-hint-level:
    description: "Conversion hint verbosity: off, soft, or detailed"
    required: false
    default: "soft"
  group-key:
    description: "Optional grouping key for multi-skill monitor summaries"
    required: false
outputs:
  preview-json:
    description: "Validate or monitor preview artifact JSON payload"
    value: ${{ steps.publish.outputs.preview-json }}
  hcs28-json:
    description: "HCS-28 baseline trust payload generated during validate or monitor"
    value: ${{ steps.publish.outputs.hcs28-json }}
  hcs28-score-total:
    description: "HCS-28 total score generated during validate or monitor"
    value: ${{ steps.publish.outputs.hcs28-score-total }}
  preview-json-path:
    description: "Path to the local preview artifact JSON file written during validate or monitor"
    value: ${{ steps.publish.outputs.preview-json-path }}
  status-url:
    description: "Lifecycle status page URL when a preview or publish status page exists"
    value: ${{ steps.publish.outputs.status-url }}
  trust-tier:
    description: "Lifecycle trust tier for the current skill state"
    value: ${{ steps.publish.outputs.trust-tier }}
  publish-readiness:
    description: "Publish readiness summary for validate or monitor runs"
    value: ${{ steps.publish.outputs.publish-readiness }}
  missing-requirements:
    description: "JSON array describing missing publish or trust requirements"
    value: ${{ steps.publish.outputs.missing-requirements }}
  estimated-credits-range:
    description: "Estimated publish credit range when quote preview is available"
    value: ${{ steps.publish.outputs.estimated-credits-range }}
  managed-comment-url:
    description: "Managed GitHub comment URL when the action updates a PR or issue comment"
    value: ${{ steps.publish.outputs.managed-comment-url }}
  purchase-url:
    description: "Deep link to purchase or top up credits for publish"
    value: ${{ steps.publish.outputs.purchase-url }}
  publish-url:
    description: "Deep link to publish or setup a publish flow"
    value: ${{ steps.publish.outputs.publish-url }}
  verification-url:
    description: "Deep link to verification or trust-upgrade guidance"
    value: ${{ steps.publish.outputs.verification-url }}
  published:
    description: "Whether a publish operation executed (false when skipped because version already exists)"
    value: ${{ steps.publish.outputs.published }}
  skip-reason:
    description: "Reason the action skipped publishing"
    value: ${{ steps.publish.outputs.skip-reason }}
  skill-name:
    description: "Published skill name"
    value: ${{ steps.publish.outputs.skill-name }}
  skill-version:
    description: "Published skill version"
    value: ${{ steps.publish.outputs.skill-version }}
  quote-id:
    description: "Quote identifier used for publish"
    value: ${{ steps.publish.outputs.quote-id }}
  job-id:
    description: "Publish job identifier"
    value: ${{ steps.publish.outputs.job-id }}
  directory-topic-id:
    description: "Directory topic ID returned by publish completion"
    value: ${{ steps.publish.outputs.directory-topic-id }}
  package-topic-id:
    description: "Package topic ID returned by publish completion"
    value: ${{ steps.publish.outputs.package-topic-id }}
  skill-json-hrl:
    description: "HCS-1 HRL for skill.json"
    value: ${{ steps.publish.outputs.skill-json-hrl }}
  credits:
    description: "Credits consumed for the publish"
    value: ${{ steps.publish.outputs.credits }}
  estimated-cost-hbar:
    description: "Estimated HBAR quoted for the publish"
    value: ${{ steps.publish.outputs.estimated-cost-hbar }}
  skill-page-url:
    description: "Canonical skill detail page URL for the resolved name@version"
    value: ${{ steps.publish.outputs.skill-page-url }}
  entity-url:
    description: "Machine-readable entity metadata URL for the canonical skill page"
    value: ${{ steps.publish.outputs.entity-url }}
  docs-url:
    description: "Canonical HOL docs URL for the registry"
    value: ${{ steps.publish.outputs.docs-url }}
  openapi-url:
    description: "Canonical OpenAPI URL for the registry API"
    value: ${{ steps.publish.outputs.openapi-url }}
  install-url-pinned-skill-md:
    description: "Pinned SKILL.md resolver URL"
    value: ${{ steps.publish.outputs.install-url-pinned-skill-md }}
  install-url-latest-skill-md:
    description: "Latest SKILL.md resolver URL"
    value: ${{ steps.publish.outputs.install-url-latest-skill-md }}
  install-url-pinned-manifest:
    description: "Pinned manifest resolver URL"
    value: ${{ steps.publish.outputs.install-url-pinned-manifest }}
  install-url-latest-manifest:
    description: "Latest manifest resolver URL"
    value: ${{ steps.publish.outputs.install-url-latest-manifest }}
  install-metadata-pinned-url:
    description: "Pinned install metadata URL"
    value: ${{ steps.publish.outputs.install-metadata-pinned-url }}
  install-metadata-latest-url:
    description: "Latest install metadata URL"
    value: ${{ steps.publish.outputs.install-metadata-latest-url }}
  badge-markdown:
    description: "Markdown badge snippet for the resolved version"
    value: ${{ steps.publish.outputs.badge-markdown }}
  badge-html:
    description: "HTML badge snippet for the resolved version"
    value: ${{ steps.publish.outputs.badge-html }}
  markdown-link:
    description: "Markdown link snippet for the canonical skill page"
    value: ${{ steps.publish.outputs.markdown-link }}
  html-link:
    description: "HTML link snippet for the canonical skill page"
    value: ${{ steps.publish.outputs.html-link }}
  readme-snippet:
    description: "README markdown snippet with canonical install links"
    value: ${{ steps.publish.outputs.readme-snippet }}
  docs-snippet:
    description: "Docs snippet with canonical HOL links"
    value: ${{ steps.publish.outputs.docs-snippet }}
  citation-snippet:
    description: "Citation snippet pointing to canonical HOL metadata"
    value: ${{ steps.publish.outputs.citation-snippet }}
  release-notes:
    description: "Release notes markdown snippet with canonical install and badge links"
    value: ${{ steps.publish.outputs.release-notes }}
  package-metadata-json:
    description: "Package metadata JSON block pointing to canonical HOL URLs"
    value: ${{ steps.publish.outputs.package-metadata-json }}
  codemeta-json:
    description: "CodeMeta JSON document for the resolved skill version"
    value: ${{ steps.publish.outputs.codemeta-json }}
  attested-kit-json:
    description: "Full attested distribution kit JSON payload"
    value: ${{ steps.publish.outputs.attested-kit-json }}
  next-actions:
    description: "Post-publish next steps summary"
    value: ${{ steps.publish.outputs.next-actions }}
  result-json:
    description: "Raw result JSON payload"
    value: ${{ steps.publish.outputs.result-json }}
  annotation-target:
    description: "Where annotations were posted"
    value: ${{ steps.publish.outputs.annotation-target }}
  indexnow-result:
    description: "IndexNow submission result when submit-indexnow is enabled"
    value: ${{ steps.publish.outputs.indexnow-result }}
runs:
  using: "composite"
  steps:
    - name: Setup Node
      uses: actions/setup-node@v4
      with:
        node-version: 20
    - name: Enable pnpm
      shell: bash
      working-directory: ${{ github.action_path }}
      run: corepack enable pnpm
    - name: Install action dependencies
      shell: bash
      working-directory: ${{ github.action_path }}
      run: pnpm install --frozen-lockfile --prod --ignore-scripts
    - name: Publish skill
      id: publish
      shell: bash
      env:
        INPUT_API_BASE_URL: ${{ inputs.api-base-url }}
        INPUT_MODE: ${{ inputs.mode }}
        INPUT_API_KEY: ${{ inputs.api-key }}
        INPUT_ACCOUNT_ID: ${{ inputs.account-id }}
        INPUT_SKILL_DIR: ${{ inputs.skill-dir }}
        INPUT_NAME: ${{ inputs.name }}
        INPUT_VERSION: ${{ inputs.version }}
        INPUT_ALLOW_NONSTABLE_PRODUCTION_VERSION: ${{ inputs.allow-nonstable-production-version }}
        INPUT_STAMP_REPO_COMMIT: ${{ inputs.stamp-repo-commit }}
        INPUT_POLL_TIMEOUT_MS: ${{ inputs.poll-timeout-ms }}
        INPUT_POLL_INTERVAL_MS: ${{ inputs.poll-interval-ms }}
        INPUT_ANNOTATE: ${{ inputs.annotate }}
        INPUT_PREVIEW_UPLOAD: ${{ inputs.preview-upload }}
        INPUT_SUBMIT_INDEXNOW: ${{ inputs.submit-indexnow }}
        INPUT_GITHUB_TOKEN: ${{ inputs.github-token }}
        INPUT_COMMENT_MODE: ${{ inputs.comment-mode }}
        INPUT_COMMENT_ON_SUCCESS: ${{ inputs.comment-on-success }}
        INPUT_QUOTE_PREVIEW: ${{ inputs.quote-preview }}
        INPUT_CONVERSION_HINT_LEVEL: ${{ inputs.conversion-hint-level }}
        INPUT_GROUP_KEY: ${{ inputs.group-key }}
      run: node "${{ github.action_path }}/entrypoint.mjs"
