{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "billing-portal",
  "type": "registry:block",
  "title": "Billing Portal",
  "description": "Self-service billing portal link helpers and access checks.",
  "dependencies": [],
  "devDependencies": [],
  "registryDependencies": [
    "https://stackfoundry.dev/r/billing-core.json"
  ],
  "files": [
    {
      "path": "apps/web/src/lib/stackfoundry/billing-portal.ts",
      "type": "registry:file",
      "target": "apps/web/src/lib/stackfoundry/billing-portal.ts",
      "content": "export type BillingPortalConfig = {\n  key: string;\n  enabled?: boolean;\n  metadata?: Record<string, unknown>;\n};\n\nexport function createBillingPortalConfig(config: BillingPortalConfig) {\n  return {\n    key: config.key,\n    enabled: config.enabled ?? true,\n    metadata: config.metadata ?? {},\n  };\n}\n\nexport const billingPortalChecks = [\n  \"Validate tenant and permission boundaries\",\n  \"Record audit events for sensitive changes\",\n  \"Document deployment and rollback behavior\",\n] as const;\n"
    },
    {
      "path": "apps/web/src/app/(console)/billing/portal/page.tsx",
      "type": "registry:page",
      "target": "apps/web/src/app/(console)/billing/portal/page.tsx",
      "content": "const checklist = [\n  \"Confirm ownership boundaries\",\n  \"Wire persistence and authorization\",\n  \"Run smoke checks before production\",\n];\n\nexport default function BillingPortalPage() {\n  return (\n    <main className=\"flex flex-col gap-6 p-6\">\n      <div>\n        <h1 className=\"text-2xl font-semibold\">Billing Portal</h1>\n        <p className=\"text-muted-foreground\">Self-service billing portal link helpers and access checks.</p>\n      </div>\n      <div className=\"grid gap-3\">\n        {checklist.map((item) => (\n          <div key={item} className=\"rounded-lg border p-4 text-sm\">{item}</div>\n        ))}\n      </div>\n    </main>\n  );\n}\n"
    }
  ],
  "maintenanceSkills": [
    {
      "name": "billing-portal",
      "target": ".stackfoundry/skills/billing-portal/SKILL.md",
      "content": "---\nname: billing-portal\ndescription: Maintain the Billing Portal module installed by StackFoundry.\n---\n\n# Billing Portal Skill\n\n## Boundary\n\nThis module owns the Billing Portal source block and its safety checklist. Keep business-specific behavior outside the reusable block until an app adopts it.\n\n## Shared Skills\n\nWhen provider, framework, or database behavior changes, load the installed shared skill before editing implementation details:\n\n- `.stackfoundry/skills/nextjs/SKILL.md` (source: `registry/skills/nextjs/SKILL.md`)\n\nKeep this module skill focused on ownership, installed files, env vars, deployment checks, and module-specific invariants.\n\n## Source Files\n\n- `apps/web/src/lib/stackfoundry/billing-portal.ts`\n- `apps/web/src/app/(console)/billing/portal/page.tsx`\n\n## Dependencies\n\n- Depends on `billing-core`\n\n## Maintenance Rules\n\n- Preserve tenant, permission, and data-safety boundaries.\n- Keep examples small, typed, and replaceable.\n- Update docs and checklist with behavior changes.\n- Do not add secrets, credentials, or generated machine metadata.\n"
    },
    {
      "name": "nextjs",
      "target": ".stackfoundry/skills/nextjs/SKILL.md",
      "content": "---\nname: nextjs\ndescription: Maintain Next.js App Router code installed by StackFoundry modules.\n---\n\n# Next.js Operating Instructions\n\n## Installed Location\n\n- Installed target: `.stackfoundry/skills/nextjs/SKILL.md`\n- Registry source: `registry/skills/nextjs/SKILL.md`\n\nAgents maintaining an installed module should load this shared skill from the installed target when provider, framework, database, SDK, or platform behavior is involved. Keep provider-specific API details here instead of duplicating them inside module maintenance skills.\n\n- Keep server-only data access out of Client Components.\n- Put route handlers under `app/api` and UI routes under the relevant App Router segment.\n- Prefer Server Components for data loading and add `\"use client\"` only for interactivity.\n- Keep public environment variables prefixed with `NEXT_PUBLIC_`; keep secrets server-only.\n- Re-run typecheck and build after changing route handlers, layouts, or shared app configuration.\n"
    }
  ],
  "envVars": {},
  "docs": "# Billing Portal Module\n\nSelf-service billing portal link helpers and access checks.\n\n## Owns\n\n- `apps/web/src/lib/stackfoundry/billing-portal.ts`\n- `apps/web/src/app/(console)/billing/portal/page.tsx`\n\n## Safety Notes\n\n- Keep tenant, permission, and billing boundaries explicit.\n- Validate all server inputs before side effects.\n- Record audit events for sensitive state changes.\n- Do not commit secrets, credentials, local caches, or provider tokens.\n\n## Maintenance\n\n- Update `module.json`, `docs.md`, `skill/SKILL.md`, and `tests/checklist.md` together.\n- Verify install output with `pnpm stackfoundry add billing-portal --target /tmp/app --dry-run`.\n",
  "meta": {
    "category": "billing",
    "env": [],
    "status": "ready",
    "maturity": "ready",
    "recommendedFor": []
  }
}
