Skip to content

feat: add missing API methods, local-auth client_credentials support & bug fixes#93

Open
flovntp wants to merge 43 commits into
mainfrom
add-missing-api-call
Open

feat: add missing API methods, local-auth client_credentials support & bug fixes#93
flovntp wants to merge 43 commits into
mainfrom
add-missing-api-call

Conversation

@flovntp

@flovntp flovntp commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR completes the Upsun API coverage in the PHP SDK: it adds the missing methods across several Task classes, introduces a new client_credentials authentication mode (local in-container token service), hardens the OAuth/auth layer, and fixes several bugs. It also includes a full SDK regeneration and a significant increase in test coverage.

What's new

🔌 API coverage

  • Added the missing API methods across 9 Task classes (Projects, Organizations, Metrics, Resources, SupportTickets, Teams, Users, Certificates, SystemOperations, TaskContainers, …).
  • Added ->taskContainers access on the client.
  • Added ndjson response handling + ResponseObject initialization.

🔐 Authentication

  • New client_credentials mode, auto-enabled via UpsunConfig::LOCAL_AUTH (local token service, e.g. inside an Upsun container).
  • Support for the x-token-ttl header (clamped to 60–900 s) via the tokenTtl parameter.
  • Introduced the TokenProvider interface (typed token acquisition).
  • Bearer mode, Fiber-based thundering-herd guard, anti double-retry, refresh_token / forceRefresh with a 120s buffer.
  • Renamed APIConfigurationApiConfiguration (backward-compat alias removed).

🐛 Bug fixes

  • ResourcesTask::updateAutoscalerSettings(): no more TypeError when $services is omitted.
  • SupportTicketsTask::listCategories() / listPriorities(): correct handling of null arguments (no more parse_url(null) nor validation on a null id).
  • TeamsTask::grantTeamProjectAccessToTeam(): removed a duplicate checkProjectId validation (wrong error message).
  • Improved the ApiException handler.

📝 Docs & templates

  • README updated with both usage scenarios (default API token + local in-container token).
  • Synced the mustache templates (oauth_provider, abstract_api, README, ApiException, …) with the generated code.

✅ Tests

  • Full SDK regeneration (Api / Model / Serializer).
  • Significant coverage increase on the Task classes and the OAuth layer.
  • Dedicated regression tests for the 3 fixed bugs.
  • Green suite: 772 tests, 3933 assertions ✅ — phpcs exit 0.

Notes

  • ⚠️ Breaking: APIConfiguration was renamed to ApiConfiguration with no backward-compat alias.
  • Most of the diff (~800 src/Model/* files) comes from the automatic SDK regeneration.

Add methods identified as missing from task classes after comparing
against the OpenAPI spec and low-level generated APIs:

- MetricsTask: inject HttpTrafficApi, BlackfireMonitoringApi and
  ContinuousProfilingApi; add httpMetricsTimeline*, blackfireServer*
  and getContinuousProfiling* methods
- CertificatesTask: getProvisioner(), listProvisioners(),
  updateProvisioner()
- EnvironmentsTask: deploy(), maintenanceRedeploy()
- OrganizationsTask: listReferencedOrgs/Projects, queryCarbon,
  listSubscriptions and related billing/MFA helpers
- ProjectsTask: DeploymentTarget CRUD, Alerts, DomainClaims, carbon
  query, usage alerts
- RegionsTask: listReferencedRegions() via ReferencesApi
- RepositoriesTask: listGitDiffs() via DiffApi
- ResourcesTask: patchAutoscalerSettings()
- TeamsTask: listReferencedTeams()
- UsersTask: getCurrentUserDeprecated(), createProfilePicture(),
  getAccessDocument(), listReferencedUsers()

UpsunClient: instantiate and inject HttpTrafficApi,
BlackfireMonitoringApi, ContinuousProfilingApi, DiffApi for the
updated task constructors.

fix(templates): add missing FormDataProcessor import and 'object' deserialize case

- api.mustache: add use {{invokerPackage}}\FormDataProcessor so all
  generated API classes that use FormDataProcessor have the correct
  import after regeneration
- ObjectSerializer.mustache: add case 'object': return (object)$data
  in deserialize() switch to handle generic object return types

Fix FormDataProcessor missing import in UserProfilesApi (generated).
Fix ObjectSerializer missing 'object' case in deserialize() (generated).

Tests: add 31 new test methods across 11 existing test files to cover
all added methods; fix MetricsTaskTest, TaskContainersTaskTest and
SystemOperationsTaskTest which were mocking final classes.

636 tests pass, 0 failures.
@platformsh-devrel

platformsh-devrel commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

🧾 API Coverage Report

Last updated: 10949ec • Run #247

Metric Value
Total API methods 272
Called from facades 251
Unmapped API methods 21
Invalid Facade API calls 0
Coverage 92.28%
📋 Full JSON report
{
  "total_api_methods": 272,
  "called_methods": 251,
  "unmapped_methods": [
    "Upsun\\Api\\DiscountsApi::listOrgDiscounts",
    "Upsun\\Api\\SubscriptionsApi::getSubscriptionUsageAlerts",
    "Upsun\\Api\\SubscriptionsApi::listSubscriptionAddons",
    "Upsun\\Api\\SubscriptionsApi::updateSubscriptionUsageAlerts",
    "Upsun\\Api\\SbomApi::getProjectsEnvironmentsDeploymentsSboms",
    "Upsun\\Api\\SbomApi::listProjectsEnvironmentsDeploymentsSboms",
    "Upsun\\Api\\RegistryCredentialApi::createProjectsOciRegistries",
    "Upsun\\Api\\RegistryCredentialApi::deleteProjectsOciRegistries",
    "Upsun\\Api\\RegistryCredentialApi::getProjectsOciRegistries",
    "Upsun\\Api\\RegistryCredentialApi::listProjectsOciRegistries",
    "Upsun\\Api\\RegistryCredentialApi::updateProjectsOciRegistries",
    "Upsun\\Api\\OrganizationManagementApi::estimateOrg",
    "Upsun\\Api\\OrganizationManagementApi::getOrgBillingAlertConfig",
    "Upsun\\Api\\OrganizationManagementApi::getOrgPrepaymentInfo",
    "Upsun\\Api\\OrganizationManagementApi::listOrgPrepaymentTransactions",
    "Upsun\\Api\\OrganizationManagementApi::updateOrgBillingAlertConfig",
    "Upsun\\Api\\ProfilesApi::getOrgAddress",
    "Upsun\\Api\\ProfilesApi::getOrgProfile",
    "Upsun\\Api\\ProfilesApi::updateOrgAddress",
    "Upsun\\Api\\ProfilesApi::updateOrgProfile",
    "Upsun\\Api\\UsersApi::getCurrentUserDeprecated"
  ],
  "invalid_facade_calls": [],
  "coverage_percentage": 92.28
}

@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - queryProjectCarbon()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listOrgDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 65 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@codecov

codecov Bot commented Jun 3, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - queryProjectCarbon()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listOrgDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 65 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


1 similar comment
@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - queryProjectCarbon()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listOrgDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 65 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - queryProjectCarbon()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listOrgDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()
       - getSbom()
       - listSboms()
       - createOciRegistry()
       - deleteOciRegistry()
       - getOciRegistry()
       - listOciRegistries()
       - updateOciRegistry()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 84 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - queryProjectCarbon()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listOrgDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()
       - getSbom()
       - listSboms()
       - createOciRegistry()
       - deleteOciRegistry()
       - getOciRegistry()
       - listOciRegistries()
       - updateOciRegistry()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 84 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - queryProjectCarbon()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listOrgDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()
       - getSbom()
       - listSboms()
       - createOciRegistry()
       - deleteOciRegistry()
       - getOciRegistry()
       - listOciRegistries()
       - updateOciRegistry()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 84 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - queryProjectCarbon()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listOrgDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()
       - getSbom()
       - listSboms()
       - createOciRegistry()
       - deleteOciRegistry()
       - getOciRegistry()
       - listOciRegistries()
       - updateOciRegistry()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 84 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


flovntp and others added 12 commits June 8, 2026 15:56
… buffer, refreshEndpoint, re-entrance guard

FIX 1 — 401 retry middleware calls forceRefresh() instead of exchangeCodeForToken()
        AbstractApi::sendAuthenticatedRequest() intercepts 401, calls
        OAuthProvider::forceRefresh() and retries once (RFC 6750 §3.1).

FIX 2 — refreshAccessToken() sends Authorization: Basic header
        Required for confidential clients per RFC 6749 §3.2.1.

FIX 3 — Proactive refresh buffer raised from 60 s to 120 s
        Mitigates clock skew between client and auth server.

FIX 4 — Configurable refreshEndpoint (distinct from tokenEndpoint)
        OAuthProvider accepts an optional refreshEndpoint parameter (default =
        tokenEndpoint). UpsunClient passes auth_url + refresh_endpoint.

FIX 5 — Re-entrance guard (thundering-herd protection)
        acquiringToken bool prevents recursive acquisition in PHP Fiber
        contexts. Multi-process FPM protection requires external lock (out of scope).

Also adds:
- doAcquireToken(): prefers refresh_token grant, falls back to api_token
- forceRefresh(): clears access token without touching refreshToken or acquiringToken
- storeTokenData() now persists refresh_token and token_type from response
- 9 new unit tests covering all 5 fixes (567 tests, 3395 assertions — all green)
- Minor CI workflow label fixes and composer clean script
doAcquireToken() already guards $this->refreshToken before calling
refreshAccessToken(), making the inner check dead code (never reachable).
Removing it achieves 100% line + method coverage on OAuthProvider.

Also syncs template (oauth_provider.mustache) and commits phpunit.xml
coverage-scope update (added src/Api/AbstractApi.php).
…double-retry

Change 1 — Bearer-only mode + \Closure tokenProvider in AbstractApi
- AbstractApi: replace OAuthProvider $oauthProvider with \Closure $tokenProvider
  - getAuthorizationHeader() → ($this->tokenProvider)()
  - refreshToken() → ($this->tokenProvider)()
- All ~62 concrete API files: sed OAuthProvider → \Closure tokenProvider
- api.mustache + abstract_api.mustache: updated to match
- UpsunClient: $auth nullable (?OAuthProvider), only created when apiToken !== ''
  - new setBearerToken(string $token): void
  - getToken() three-way: auth → bearerToken → throw RuntimeException
  - $tokenProvider closure passed to all concrete APIs instead of $this->auth

Change 2 — Fiber-based thundering-herd guard in OAuthProvider::ensureValidToken()
- Replace bool $acquiringToken with ?\Fiber $acquiringFiber
- Concurrent Fiber callers suspend (via \Fiber::getCurrent()?->suspend()) until the
  first acquisition completes, then return without a second HTTP call
- In sync (FPM) contexts \Fiber::getCurrent() is null, so acquiringFiber is always
  null and the guard is a no-op — identical behaviour to the old bool flag

Change 3 — $_retried guard in sendAuthenticatedRequest() prevents double forceRefresh
- Add bool $_retried = false param; on 401 call tokenProvider(true) then recurse
  with $_retried=true so a second 401 goes straight to ApiException without
  a redundant force-refresh call

Tests:
- AbstractApiTest: rewritten to use closure tracking (tokenCallCount/forceRefreshCount)
  instead of OAuthProvider mock; 401-retry $_retried guard verified
- UpsunClientTest: removed testGetTokenReturnsApiToken (now HTTP-backed); added
  testGetTokenDelegatesToOAuthProvider, testGetTokenReturnsBearerToken,
  testGetTokenThrowsWhenNoAuthMethodSet
- OAuthProviderTest: replaced reflection-based acquiringToken test with proper
  Fiber concurrency test (testFiberGuardPreventsDoubleAcquisitionUnderConcurrency)
- BaseTestCase + all ~25 TaskTests: OAuthProvider mock → \Closure tokenProvider

Result: 584/584 tests pass, lint clean
…uisition

Replaces bare Closure with a proper TokenProvider interface, aligning naming
with the Node SDK's `type TokenProvider = (force?: boolean) => string`.

- src/Core/TokenProvider.php: new interface with __invoke(bool $force=false): string
- OAuthProvider: implements TokenProvider, adds __invoke() covering force-refresh path
- AbstractApi: TokenProvider type hint replacing Closure
- UpsunClient: $tokenProvider declared as named variable before $taskParams array
  (facade does not implement the interface — clean separation of concerns)
- All 62 concrete API files + mustache templates updated
- All tests updated: anonymous class implements TokenProvider (Closure != interface in PHP)
- 25 task test files: multi-line anonymous class format (PHPCS compliant)
…d file

Alphabetical use-statement order (matching PHPCS rule) was broken after
introducing TokenProvider — `use {{invokerPackage}}\Core\TokenProvider;`
was sitting between JsonException and Http\ imports.
Now matches the order produced by phpcbf on AbstractApi.php.
…code

fix:all (phpcbf + rector + php-cs-fixer) applied:
- OAuthProvider: remove redundant `use Upsun\Core\TokenProvider;` (same namespace)
- 25 task test files: FQNS `\Upsun\Core\TokenProvider` → `use` import + short name

oauth_provider.mustache synced with OAuthProvider.php:
- use Fiber; import (was \Fiber FQNS)
- class OAuthProvider implements TokenProvider
- short Fiber name throughout (not \Fiber)
- __invoke(bool $force = false): string method added
Theosakamg and others added 12 commits June 8, 2026 16:02
…lsafe instance call

Fiber::suspend() is a static method. Calling it via a nullsafe instance
reference ($fiber?->suspend()) is technically valid but a PHP anti-pattern
(calling static methods on instances). The correct form is:

  if (Fiber::getCurrent() !== null) { Fiber::suspend(); }

This is explicit about the guard intent and avoids potential deprecation
warnings from static-via-instance call patterns.
Add methods identified as missing from task classes after comparing
against the OpenAPI spec and low-level generated APIs:

- MetricsTask: inject HttpTrafficApi, BlackfireMonitoringApi and
  ContinuousProfilingApi; add httpMetricsTimeline*, blackfireServer*
  and getContinuousProfiling* methods
- CertificatesTask: getProvisioner(), listProvisioners(),
  updateProvisioner()
- EnvironmentsTask: deploy(), maintenanceRedeploy()
- OrganizationsTask: listReferencedOrgs/Projects, queryCarbon,
  listSubscriptions and related billing/MFA helpers
- ProjectsTask: DeploymentTarget CRUD, Alerts, DomainClaims, carbon
  query, usage alerts
- RegionsTask: listReferencedRegions() via ReferencesApi
- RepositoriesTask: listGitDiffs() via DiffApi
- ResourcesTask: patchAutoscalerSettings()
- TeamsTask: listReferencedTeams()
- UsersTask: getCurrentUserDeprecated(), createProfilePicture(),
  getAccessDocument(), listReferencedUsers()

UpsunClient: instantiate and inject HttpTrafficApi,
BlackfireMonitoringApi, ContinuousProfilingApi, DiffApi for the
updated task constructors.

fix(templates): add missing FormDataProcessor import and 'object' deserialize case

- api.mustache: add use {{invokerPackage}}\FormDataProcessor so all
  generated API classes that use FormDataProcessor have the correct
  import after regeneration
- ObjectSerializer.mustache: add case 'object': return (object)$data
  in deserialize() switch to handle generic object return types

Fix FormDataProcessor missing import in UserProfilesApi (generated).
Fix ObjectSerializer missing 'object' case in deserialize() (generated).

Tests: add 31 new test methods across 11 existing test files to cover
all added methods; fix MetricsTaskTest, TaskContainersTaskTest and
SystemOperationsTaskTest which were mocking final classes.

636 tests pass, 0 failures.
@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 77 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 77 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 77 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


1 similar comment
@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 77 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - canUpdateSubscription()
       - getSubscriptionUsageAlerts()
       - listSubscriptionAddons()
       - updateOrgSubscription()
       - updateSubscriptionUsageAlerts()
       - getDiscount()
       - getTypeAllowance()
       - listDiscounts()
       - estimateOrg()
       - getOrgBillingAlertConfig()
       - getOrgPrepaymentInfo()
       - listOrgPrepaymentTransactions()
       - updateOrgBillingAlertConfig()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 77 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@flovntp flovntp changed the title feat(tasks): add missing API methods across 9 task classes feat: add missing API methods, local-auth client_credentials support & bug fixes Jun 16, 2026
@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - canUpdateSubscription()
       - updateOrgSubscription()
       - getSubscriptionUsageAlerts()
       - updateSubscriptionUsageAlerts()
       - createOrgProject()
       - deleteOrgProject()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - getDiscount()
       - getTypeAllowance()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

  ⚠️  Signature Differences:

     Method: getAddress()
       node: (organizationId: string)
       php: (userId: string)

     Method: getProfile()
       node: (organizationId: string)
       php: (userId: string)

     Method: updateAddress()
       node: (organizationId: string)
       php: (userId: string)

     Method: updateProfile()
       node: (organizationId: string)
       php: (userId: string)

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createProfilePicture()
       - getAccessDocument()
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 76 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - canUpdateSubscription()
       - updateOrgSubscription()
       - getSubscriptionUsageAlerts()
       - updateSubscriptionUsageAlerts()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - getDiscount()
       - getTypeAllowance()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

  ⚠️  Signature Differences:

     Method: updateProfile()
       node: (organizationId: string)
       php: (userId: string)

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createProfilePicture()
       - getAccessDocument()
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 71 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


@upsun-bot

Copy link
Copy Markdown

Upsun SDK checker report

Display raw output

════════════════════════════════════════════════════════════════════════════════
  SDK Signature Comparison Report
════════════════════════════════════════════════════════════════════════════════

❌ Missing Classes

────────────────────────────────────────────────────────────────────────────────

📦 SystemOperationsTask
   Missing from: node

📦 TaskContainersTask
   Missing from: node

────────────────────────────────────────────────────────────────────────────────
════════════════════════════════════════════════════════════════════════════════


📦 Class: CertificatesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProvisioner()
       - listProvisioners()
       - updateProvisioner()

📦 Class: DomainsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: add()
       node: (projectId: string, domain: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: EnvironmentsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - maintenanceRedeploy()

  ⚠️  Signature Differences:

     Method: init()
       node: (projectId: string, environmentId: string, profile: string, repository: string, files: FilesInner[])
       php: (projectId: string, environmentId: string, profile: string, repository: string, fileMode: string, filePath: string, fileContents: string)

     Method: addDomain()
       node: (projectId: string, environmentId: string, domainName: string)
       php: (projectId: string, domainCreateInput: DomainCreateInput)

📦 Class: IntegrationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Signature Differences:

     Method: createIntegration()
       node: (projectId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationCreateInput: IntegrationCreateCreateInput)

     Method: updateIntegration()
       node: (projectId: string, integrationId: string, type: string, params: IntegrationCreateData)
       php: (projectId: string, integrationId: string, integrationUpdateInput: IntegrationPatch)

📦 Class: MetricsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     php:
       - fetchMetrics()
     node:
       - httpMetricsTimelineIps()
       - httpMetricsTimelineUrls()
       - httpMetricsTimelineUserAgents()
       - blackfirePhpServerCaches()
       - blackfireServerGlobal()
       - blackfireServerTopSpans()
       - blackfireServerTransactionsBreakdown()
       - listContinuousProfilingApplications()
       - getContinuousProfilingApplicationFilter()
       - getContinuousProfilingApplicationMerge()
       - getContinuousProfilingApplicationTimeline()
       - blackfireProfileGraph()
       - blackfireProfileProfile()
       - blackfireProfileSubprofiles()
       - blackfireProfileTimeline()
       - blackfireProfilesList()
       - blackfireProfilesRecommendations()
       - observabilityEntrypoint()

📦 Class: OrganizationsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - canUpdateSubscription()
       - updateOrgSubscription()
       - getSubscriptionUsageAlerts()
       - updateSubscriptionUsageAlerts()
       - getOrgProject()
       - getCarbonEmissions()
       - canAffordSubscription()
       - getDiscount()
       - getTypeAllowance()
       - listReferencedOrgs()
       - listReferencedProjects()
       - queryOrganiationCarbon()
       - streamOrgProjectProvisioning()

  ⚠️  Signature Differences:

     Method: updateProfile()
       node: (organizationId: string)
       php: (userId: string)

📦 Class: ProjectsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - getProjectsDeployments()
       - listProjectsDeployments()
       - updateProjectsDeployments()
       - getUsageAlerts()
       - updateUsageAlerts()
       - createProjectsDomainClaims()
       - deleteProjectsDomainClaims()
       - getProjectsDomainClaims()
       - listProjectsDomainClaims()
       - updateProjectsDomainClaims()
       - queryProjectCarbon()
       - maintenanceRedeployProject()
       - listOrgProjectHistory()

  ⚠️  Signature Differences:

     Method: updateSettings()
       node: (projectId: string, settings: ProjectSettings)
       php: (projectId: string)

📦 Class: RegionsTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listReferencedRegions()

📦 Class: RepositoriesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - listGitDiffs()

📦 Class: ResourcesTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - patchAutoscalerSettings()
       - resourcesByService()
       - resourcesOverview()
       - resourcesSummary()

📦 Class: UsersTask
   Languages: node, php
────────────────────────────────────────────────────────────────────────────────

  ⚠️  Missing Methods:
     node:
       - createProfilePicture()
       - getAccessDocument()
       - listReferencedUsers()

════════════════════════════════════════════════════════════════════════════════
  Summary
────────────────────────────────────────────────────────────────────────────────
  Total classes analyzed: 28
  Missing classes: 2
  ⚠️  Found 71 issue(s)

❌ Missing Classes:
   - SystemOperationsTask: missing from node
   - TaskContainersTask: missing from node
════════════════════════════════════════════════════════════════════════════════


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants