Initial commit of Descrybe v2 without local scratch artifacts.

Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
This commit is contained in:
2026-08-09 22:47:43 +02:00
commit 8580c996c3
1285 changed files with 325780 additions and 0 deletions
@@ -0,0 +1,243 @@
openapi: 3.1.0
info:
title: Descrybe plan feature permissions (session API)
version: "1.0.0"
description: >
Dashboard/admin session endpoints for plan ∩ global feature permissions.
Not part of the public /api/v1 OpenAPI document.
paths:
/api/billing/capabilities:
get:
operationId: getBillingCapabilities
tags: [billing]
security: [{ sessionCookie: [] }]
summary: Effective plan ∩ global feature matrix for the active company
responses:
"200":
description: Capabilities
content:
application/json:
schema:
$ref: "#/components/schemas/Capabilities"
"401":
$ref: "#/components/responses/Error"
/api/admin/plans/{planID}/features:
parameters:
- $ref: "#/components/parameters/PlanID"
get:
operationId: adminGetPlanFeatures
tags: [admin]
security: [{ sessionCookie: [], platformAdmin: [] }]
summary: Plan feature overrides + resolved plan_allows matrix
responses:
"200":
description: Plan features
content:
application/json:
schema:
$ref: "#/components/schemas/PlanFeaturesView"
"400":
$ref: "#/components/responses/Error"
"403":
$ref: "#/components/responses/Error"
put:
operationId: adminPutPlanFeatures
tags: [admin]
security: [{ sessionCookie: [], platformAdmin: [] }]
summary: Replace plan feature overrides
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/PlanFeaturesUpdate"
responses:
"200":
description: Updated plan features
content:
application/json:
schema:
$ref: "#/components/schemas/PlanFeaturesView"
"400":
$ref: "#/components/responses/Error"
"403":
$ref: "#/components/responses/Error"
/api/admin/plans/{planID}/features/enable-all:
parameters:
- $ref: "#/components/parameters/PlanID"
post:
operationId: adminEnableAllPlanFeatures
tags: [admin]
security: [{ sessionCookie: [], platformAdmin: [] }]
summary: Enable every registry feature on the plan (custom packages)
responses:
"200":
description: Updated plan features
content:
application/json:
schema:
$ref: "#/components/schemas/PlanFeaturesView"
"400":
$ref: "#/components/responses/Error"
"403":
$ref: "#/components/responses/Error"
/api/admin/feature-gates:
get:
operationId: adminGetFeatureGates
tags: [admin]
security: [{ sessionCookie: [], platformAdmin: [] }]
summary: Global section and feature master switches
responses:
"200":
description: Feature gates
content:
application/json:
schema:
$ref: "#/components/schemas/FeatureGatesView"
"403":
$ref: "#/components/responses/Error"
put:
operationId: adminPutFeatureGates
tags: [admin]
security: [{ sessionCookie: [], platformAdmin: [] }]
summary: Partial upsert of global gates
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/FeatureGatesUpdate"
responses:
"200":
description: Updated gates
content:
application/json:
schema:
$ref: "#/components/schemas/FeatureGatesView"
"400":
$ref: "#/components/responses/Error"
"403":
$ref: "#/components/responses/Error"
/api/admin/feature-gates/sections/{section}:
parameters:
- name: section
in: path
required: true
schema:
type: string
enum: [shell, dashboard, catalog, feeds, stores, processing, marketing, integrations, billing, settings, support, capabilities]
put:
operationId: adminPutFeatureGateSection
tags: [admin]
security: [{ sessionCookie: [], platformAdmin: [] }]
summary: Enable or disable a section for ALL plans
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/SectionGateUpdate"
responses:
"200":
description: Updated gates
content:
application/json:
schema:
$ref: "#/components/schemas/FeatureGatesView"
"400":
$ref: "#/components/responses/Error"
"403":
$ref: "#/components/responses/Error"
components:
securitySchemes:
sessionCookie:
type: apiKey
in: cookie
name: session
platformAdmin:
type: http
scheme: bearer
description: Requires users.is_platform_admin (session-derived; bearer shown for tooling only)
parameters:
PlanID:
name: planID
in: path
required: true
schema:
type: integer
format: int64
minimum: 1
responses:
Error:
description: Error
content:
application/json:
schema:
type: object
required: [error]
properties:
error:
type: string
schemas:
Capabilities:
type: object
properties:
plan_id: { type: integer, format: int64 }
plan_name: { type: string }
is_custom: { type: boolean }
has_active_plan: { type: boolean }
features:
type: object
additionalProperties: { type: boolean }
sections:
type: object
additionalProperties: { type: boolean }
disabled_features:
type: array
items: { type: string }
feature_etag: { type: string }
entitlements:
type: object
additionalProperties: true
PlanFeaturesView:
type: object
properties:
plan_id: { type: integer, format: int64 }
plan_name: { type: string }
is_custom: { type: boolean }
features:
type: object
additionalProperties: { type: boolean }
resolved_features:
type: object
additionalProperties: { type: boolean }
PlanFeaturesUpdate:
type: object
required: [features]
properties:
features:
type: object
additionalProperties: { type: boolean }
FeatureGatesView:
type: object
properties:
sections:
type: object
additionalProperties: { type: boolean }
features:
type: object
additionalProperties: { type: boolean }
FeatureGatesUpdate:
type: object
properties:
sections:
type: object
additionalProperties: { type: boolean }
features:
type: object
additionalProperties: { type: boolean }
SectionGateUpdate:
type: object
required: [enabled]
properties:
enabled: { type: boolean }