@xgent-ai/skills 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -10
- package/bin/xgent-skills.js +55 -9
- package/package.json +1 -1
- package/skills/agi-mode/SKILL.md +225 -0
- package/skills/agi-mode/evals/baseline-coverage.md +96 -0
- package/skills/agi-mode/evals/scenarios.md +331 -0
- package/skills/agi-mode/evals/test_check_evidence.py +141 -0
- package/skills/agi-mode/playbooks/arena.md +47 -0
- package/skills/agi-mode/playbooks/authoring-a-skill.md +26 -0
- package/skills/agi-mode/playbooks/autonomous-run.md +39 -0
- package/skills/agi-mode/playbooks/bug-fix.md +27 -0
- package/skills/agi-mode/playbooks/design-prototype.md +41 -0
- package/skills/agi-mode/playbooks/eval.md +72 -0
- package/skills/agi-mode/playbooks/feature.md +26 -0
- package/skills/agi-mode/playbooks/forensics.md +31 -0
- package/skills/agi-mode/playbooks/hillclimb.md +73 -0
- package/skills/agi-mode/playbooks/investigation.md +29 -0
- package/skills/agi-mode/playbooks/migration-refactoring.md +27 -0
- package/skills/agi-mode/playbooks/optimization.md +27 -0
- package/skills/agi-mode/playbooks/pr-lifecycle.md +38 -0
- package/skills/agi-mode/playbooks/program.md +57 -0
- package/skills/agi-mode/playbooks/reflection.md +41 -0
- package/skills/agi-mode/playbooks/resource-cleanup.md +24 -0
- package/skills/agi-mode/playbooks/review.md +27 -0
- package/skills/agi-mode/playbooks/session-handoff.md +37 -0
- package/skills/agi-mode/playbooks/shipping.md +35 -0
- package/skills/agi-mode/playbooks/ui-delivery.md +34 -0
- package/skills/agi-mode/playbooks/unblock.md +54 -0
- package/skills/agi-mode/principles/autonomous-decisions.md +21 -0
- package/skills/agi-mode/principles/behavioral-tests.md +21 -0
- package/skills/agi-mode/principles/boundary-discipline.md +21 -0
- package/skills/agi-mode/principles/bounded-convergence.md +21 -0
- package/skills/agi-mode/principles/build-leverage.md +21 -0
- package/skills/agi-mode/principles/challenge-premises.md +21 -0
- package/skills/agi-mode/principles/complete-migrations.md +21 -0
- package/skills/agi-mode/principles/context-as-state.md +21 -0
- package/skills/agi-mode/principles/critical-path-throughput.md +21 -0
- package/skills/agi-mode/principles/domain-models-and-types.md +23 -0
- package/skills/agi-mode/principles/evidence-lifetime.md +21 -0
- package/skills/agi-mode/principles/experience-first.md +21 -0
- package/skills/agi-mode/principles/explore-alternatives.md +21 -0
- package/skills/agi-mode/principles/falsifiable-verification.md +21 -0
- package/skills/agi-mode/principles/foundations-first.md +21 -0
- package/skills/agi-mode/principles/idempotent-effects.md +21 -0
- package/skills/agi-mode/principles/information-first.md +21 -0
- package/skills/agi-mode/principles/minimize-complexity.md +21 -0
- package/skills/agi-mode/principles/outcome-ownership.md +21 -0
- package/skills/agi-mode/principles/prove-real-outcomes.md +21 -0
- package/skills/agi-mode/principles/redesign-from-constraints.md +21 -0
- package/skills/agi-mode/principles/root-cause.md +21 -0
- package/skills/agi-mode/principles/state-ownership.md +21 -0
- package/skills/agi-mode/principles/structural-learning.md +21 -0
- package/skills/agi-mode/principles/verifiable-units.md +21 -0
- package/skills/agi-mode/references/continuity.md +75 -0
- package/skills/agi-mode/references/eval-protocol.md +71 -0
- package/skills/agi-mode/references/evidence-contract.md +57 -0
- package/skills/agi-mode/references/evolution-evidence.md +71 -0
- package/skills/agi-mode/references/experiments.md +82 -0
- package/skills/agi-mode/references/reflection/divergent-reviewer.md +45 -0
- package/skills/agi-mode/references/reflection/judgment-reviewer.md +44 -0
- package/skills/agi-mode/references/reflection/synthesizer.md +39 -0
- package/skills/agi-mode/references/reflection/tooling-reviewer.md +57 -0
- package/skills/agi-mode/references/skill-evolution.md +50 -0
- package/skills/agi-mode/scripts/check_evidence.py +147 -0
- package/skills/apply-code-review/SKILL.md +53 -0
- package/skills/apply-code-review/agents/openai.yaml +4 -0
- package/skills/apply-code-review/references/record-contract.md +77 -0
- package/skills/apply-doc-review/SKILL.md +79 -0
- package/skills/apply-doc-review/agents/openai.yaml +4 -0
- package/skills/apply-doc-review/references/disposition-contract.md +57 -0
- package/skills/archify/LICENSE +22 -0
- package/skills/archify/SKILL.md +137 -0
- package/skills/archify/THIRD_PARTY_NOTICES.md +69 -0
- package/skills/archify/assets/JetBrainsMono-OFL.txt +93 -0
- package/skills/archify/assets/template.html +14937 -0
- package/skills/archify/bin/archify.mjs +2139 -0
- package/skills/archify/bin/open-artifact.mjs +86 -0
- package/skills/archify/bin/preview.mjs +653 -0
- package/skills/archify/bin/visual-check.mjs +829 -0
- package/skills/archify/brand-marks/README.md +31 -0
- package/skills/archify/brand-marks/catalog.json +131 -0
- package/skills/archify/delta/architecture-delta.mjs +1232 -0
- package/skills/archify/examples/agent-run.lifecycle.json +60 -0
- package/skills/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/archify/examples/cache-miss-request.sequence.json +82 -0
- package/skills/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/archify/examples/dataflow-product-analytics.html +15048 -0
- package/skills/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/archify/examples/incident-response.workflow.json +64 -0
- package/skills/archify/examples/lifecycle-agent-run.html +14983 -0
- package/skills/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/archify/examples/sequence-cache-miss-request.html +15063 -0
- package/skills/archify/examples/web-app-rendered.html +15012 -0
- package/skills/archify/examples/web-app.architecture.json +46 -0
- package/skills/archify/examples/workflow-agent-tool-call-rendered.html +15054 -0
- package/skills/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/archify/package-lock.json +149 -0
- package/skills/archify/package.json +39 -0
- package/skills/archify/recipes/scenarios.mjs +391 -0
- package/skills/archify/references/authoring-contract.md +247 -0
- package/skills/archify/references/brand-marks.md +65 -0
- package/skills/archify/references/delivery-contract.md +138 -0
- package/skills/archify/references/viewer-runtime.md +45 -0
- package/skills/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/archify/renderers/dataflow/README.md +104 -0
- package/skills/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/archify/renderers/lifecycle/README.md +115 -0
- package/skills/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/archify/renderers/sequence/README.md +114 -0
- package/skills/archify/renderers/sequence/render-sequence.mjs +464 -0
- package/skills/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/archify/renderers/shared/cli.mjs +218 -0
- package/skills/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/archify/renderers/shared/diagnostics.mjs +160 -0
- package/skills/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/archify/renderers/shared/i18n.mjs +595 -0
- package/skills/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/archify/renderers/shared/legend.mjs +217 -0
- package/skills/archify/renderers/shared/output-path.mjs +340 -0
- package/skills/archify/renderers/shared/repository-evidence.mjs +239 -0
- package/skills/archify/renderers/shared/repository-location.mjs +58 -0
- package/skills/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/archify/renderers/shared/utils.mjs +232 -0
- package/skills/archify/renderers/shared/validator.mjs +86 -0
- package/skills/archify/renderers/workflow/README.md +223 -0
- package/skills/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/archify/schemas/README.md +211 -0
- package/skills/archify/schemas/architecture.schema.json +178 -0
- package/skills/archify/schemas/common.schema.json +115 -0
- package/skills/archify/schemas/dataflow.schema.json +243 -0
- package/skills/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/archify/schemas/sequence.schema.json +223 -0
- package/skills/archify/schemas/workflow.schema.json +428 -0
- package/skills/archify/scripts/check-render-output.mjs +916 -0
- package/skills/archify/scripts/check-update.mjs +1667 -0
- package/skills/archify/scripts/generate-brand-marks.mjs +141 -0
- package/skills/archify/scripts/generate-validators.mjs +66 -0
- package/skills/archify/scripts/render-examples.mjs +26 -0
- package/skills/archify/scripts/update-contract.mjs +182 -0
- package/skills/archify/skill-release.json +10 -0
- package/skills/archify/test/adaptive-reader-layout.test.mjs +86 -0
- package/skills/archify/test/animation.test.mjs +179 -0
- package/skills/archify/test/architecture-compare-recovery.test.mjs +157 -0
- package/skills/archify/test/architecture-delta-markers.test.mjs +137 -0
- package/skills/archify/test/architecture-delta.test.mjs +705 -0
- package/skills/archify/test/artifact-receipt-flush.test.mjs +126 -0
- package/skills/archify/test/authored-reachability.test.mjs +95 -0
- package/skills/archify/test/authoring-safety-contract.test.mjs +54 -0
- package/skills/archify/test/automatic-port-spread.test.mjs +376 -0
- package/skills/archify/test/base-input-compatibility.test.mjs +42 -0
- package/skills/archify/test/brand-marks.test.mjs +678 -0
- package/skills/archify/test/chapter-delta-preview.test.mjs +157 -0
- package/skills/archify/test/chapter-handoff.test.mjs +97 -0
- package/skills/archify/test/chapter-rail.test.mjs +86 -0
- package/skills/archify/test/checkout-line-endings.test.mjs +72 -0
- package/skills/archify/test/ci-scope.test.mjs +59 -0
- package/skills/archify/test/clean-skill-staging.test.mjs +440 -0
- package/skills/archify/test/cli-output-types.test.mjs +201 -0
- package/skills/archify/test/cli.test.mjs +986 -0
- package/skills/archify/test/community-proof-intake.test.mjs +125 -0
- package/skills/archify/test/cursor-onboarding.test.mjs +74 -0
- package/skills/archify/test/degraded.test.mjs +161 -0
- package/skills/archify/test/delivery-contract.test.mjs +52 -0
- package/skills/archify/test/desktop-reader-browser.test.mjs +80 -0
- package/skills/archify/test/diagram-guide.test.mjs +92 -0
- package/skills/archify/test/engineering-profile.test.mjs +209 -0
- package/skills/archify/test/export-browser.test.mjs +305 -0
- package/skills/archify/test/export-cleanup-browser.test.mjs +294 -0
- package/skills/archify/test/finder-browser.test.mjs +274 -0
- package/skills/archify/test/finder.test.mjs +104 -0
- package/skills/archify/test/fixtures/automatic-routing-node-border-clearance.workflow.json +40 -0
- package/skills/archify/test/fixtures/fail-migration-cleanup.mjs +17 -0
- package/skills/archify/test/fixtures/issue-126/custom-widths.workflow.json +18 -0
- package/skills/archify/test/fixtures/issue-126/explicit-route.workflow.json +28 -0
- package/skills/archify/test/fixtures/issue-126/explicit-viewbox.workflow.json +19 -0
- package/skills/archify/test/fixtures/issue-126/labels.workflow.json +18 -0
- package/skills/archify/test/fixtures/v1-baseline/agent-run.lifecycle.json +64 -0
- package/skills/archify/test/fixtures/v1-baseline/agent-tool-call.workflow.json +88 -0
- package/skills/archify/test/fixtures/v1-baseline/cache-miss-request.sequence.json +75 -0
- package/skills/archify/test/fixtures/v1-baseline/event-stream.dataflow.json +57 -0
- package/skills/archify/test/fixtures/v1-baseline/product-analytics.dataflow.json +70 -0
- package/skills/archify/test/fixtures/v1-baseline/production-deployment.architecture.json +71 -0
- package/skills/archify/test/fixtures/v1-baseline/web-app.architecture.json +41 -0
- package/skills/archify/test/fixtures/v1-workflow-700x400.workflow.json +22 -0
- package/skills/archify/test/fixtures/v1-workflow-explicit-coordinates.workflow.json +47 -0
- package/skills/archify/test/focus-browser.test.mjs +226 -0
- package/skills/archify/test/gallery.test.mjs +130 -0
- package/skills/archify/test/generate-validators.test.mjs +59 -0
- package/skills/archify/test/generate-viewer.test.mjs +165 -0
- package/skills/archify/test/generated-artifact-xml.test.mjs +88 -0
- package/skills/archify/test/geometry.test.mjs +739 -0
- package/skills/archify/test/golden.mjs +207 -0
- package/skills/archify/test/grid.test.mjs +47 -0
- package/skills/archify/test/guide-page.test.mjs +85 -0
- package/skills/archify/test/guide.test.mjs +81 -0
- package/skills/archify/test/guided-views-browser.test.mjs +460 -0
- package/skills/archify/test/guided-views.test.mjs +144 -0
- package/skills/archify/test/helpers/desktop-browser.mjs +48 -0
- package/skills/archify/test/helpers/offline-fonts.mjs +76 -0
- package/skills/archify/test/helpers/viewer-click.mjs +72 -0
- package/skills/archify/test/helpers/xml.mjs +37 -0
- package/skills/archify/test/i18n.test.mjs +422 -0
- package/skills/archify/test/intent-trace-browser.test.mjs +284 -0
- package/skills/archify/test/intent-trace.test.mjs +111 -0
- package/skills/archify/test/landing.test.mjs +97 -0
- package/skills/archify/test/layout-rules.test.mjs +1498 -0
- package/skills/archify/test/legend-contract.test.mjs +404 -0
- package/skills/archify/test/motion-governor-browser.test.mjs +342 -0
- package/skills/archify/test/motion-governor.test.mjs +111 -0
- package/skills/archify/test/offline-font-browser.test.mjs +210 -0
- package/skills/archify/test/offline-self-containment.test.mjs +80 -0
- package/skills/archify/test/open-artifact.test.mjs +118 -0
- package/skills/archify/test/ordinary-model-floor.test.mjs +1052 -0
- package/skills/archify/test/output-path.test.mjs +587 -0
- package/skills/archify/test/presentation.test.mjs +71 -0
- package/skills/archify/test/preset-tryon.test.mjs +113 -0
- package/skills/archify/test/preview-contract.test.mjs +40 -0
- package/skills/archify/test/preview.test.mjs +530 -0
- package/skills/archify/test/proof-aperture.test.mjs +78 -0
- package/skills/archify/test/reach-share-card.test.mjs +149 -0
- package/skills/archify/test/reader-layout-browser.test.mjs +320 -0
- package/skills/archify/test/readme-showcase.test.mjs +319 -0
- package/skills/archify/test/real-repository-proof.test.mjs +209 -0
- package/skills/archify/test/relationship-direct-explorer.test.mjs +115 -0
- package/skills/archify/test/relationship-lens.test.mjs +128 -0
- package/skills/archify/test/relationship-permalink.test.mjs +130 -0
- package/skills/archify/test/relationship-pulse.test.mjs +122 -0
- package/skills/archify/test/release-identity.test.mjs +476 -0
- package/skills/archify/test/release-package-gates.test.mjs +750 -0
- package/skills/archify/test/render-output-checks.test.mjs +588 -0
- package/skills/archify/test/renderer-diagnostic-boundary.test.mjs +107 -0
- package/skills/archify/test/repair-receipt.test.mjs +181 -0
- package/skills/archify/test/repository-evidence-replacement.test.mjs +136 -0
- package/skills/archify/test/repository-evidence.test.mjs +605 -0
- package/skills/archify/test/repository-language-metadata.test.mjs +67 -0
- package/skills/archify/test/route-journey.test.mjs +125 -0
- package/skills/archify/test/route-probe-browser.test.mjs +363 -0
- package/skills/archify/test/route-probe.test.mjs +114 -0
- package/skills/archify/test/route-share-card.test.mjs +163 -0
- package/skills/archify/test/semantic-camera.test.mjs +88 -0
- package/skills/archify/test/semantic-flow.test.mjs +90 -0
- package/skills/archify/test/semantic-legend-gateway.test.mjs +156 -0
- package/skills/archify/test/semantic-lens-browser.test.mjs +372 -0
- package/skills/archify/test/semantic-lens.test.mjs +103 -0
- package/skills/archify/test/semantic-passport.test.mjs +99 -0
- package/skills/archify/test/semantic-radar.test.mjs +735 -0
- package/skills/archify/test/semantic-zoom.test.mjs +86 -0
- package/skills/archify/test/sequence-column-fit.test.mjs +137 -0
- package/skills/archify/test/settled-flow.test.mjs +97 -0
- package/skills/archify/test/share-card-export.test.mjs +132 -0
- package/skills/archify/test/site-language-continuity.test.mjs +569 -0
- package/skills/archify/test/site-language-integration.mjs +9 -0
- package/skills/archify/test/skill-metadata.test.mjs +84 -0
- package/skills/archify/test/stable-update-manifest.test.mjs +167 -0
- package/skills/archify/test/start-page.test.mjs +312 -0
- package/skills/archify/test/story-beat-navigator.test.mjs +103 -0
- package/skills/archify/test/story-carrier.test.mjs +90 -0
- package/skills/archify/test/story-director-strip.test.mjs +91 -0
- package/skills/archify/test/story-follow-camera.test.mjs +103 -0
- package/skills/archify/test/story-horizon.test.mjs +91 -0
- package/skills/archify/test/story-moment-link.test.mjs +93 -0
- package/skills/archify/test/story-shelf.test.mjs +84 -0
- package/skills/archify/test/story-trail.test.mjs +81 -0
- package/skills/archify/test/toolbar-polish.test.mjs +57 -0
- package/skills/archify/test/update-contract.test.mjs +133 -0
- package/skills/archify/test/update-notifier.test.mjs +3317 -0
- package/skills/archify/test/v1-compatibility.test.mjs +329 -0
- package/skills/archify/test/vertical-edge.test.mjs +68 -0
- package/skills/archify/test/viewer-camera-browser.test.mjs +395 -0
- package/skills/archify/test/viewer-chrome-layout.test.mjs +1104 -0
- package/skills/archify/test/viewer-identifiers-browser.test.mjs +135 -0
- package/skills/archify/test/visual-check.test.mjs +400 -0
- package/skills/archify/test/webm-artifact.smoke.mjs +1855 -0
- package/skills/archify/test/workflow-compiler-hard-contract.test.mjs +2136 -0
- package/skills/archify/test/workflow-compiler.test.mjs +1163 -0
- package/skills/archify/test/workflow-migration.test.mjs +620 -0
- package/skills/archify/test/workflow-semantic-contract.test.mjs +131 -0
- package/skills/architect/SKILL.md +83 -0
- package/skills/architect/references/design-red-flags.md +33 -0
- package/skills/architect/references/rationale-template.md +35 -0
- package/skills/architect/references/runner-prompt.md +20 -0
- package/skills/arena/SKILL.md +13 -0
- package/skills/automate-me/SKILL.md +104 -0
- package/skills/autoresearch/SKILL.md +14 -0
- package/skills/debugging/SKILL.md +279 -0
- package/skills/dev-plan/SKILL.md +24 -19
- package/skills/dev-plan/references/execution-workflow.md +8 -61
- package/skills/dev-plan/references/plan-skeleton.md +43 -28
- package/skills/dev-plan/scripts/check_progress.sh +4 -0
- package/skills/documentation-writer/SKILL.md +204 -0
- package/skills/documentation-writer/assets/templates/ARCHITECTURE.md +49 -0
- package/skills/documentation-writer/assets/templates/CONCERNS.md +56 -0
- package/skills/documentation-writer/assets/templates/CONVENTIONS.md +52 -0
- package/skills/documentation-writer/assets/templates/FEATURES.md +43 -0
- package/skills/documentation-writer/assets/templates/INTEGRATIONS.md +48 -0
- package/skills/documentation-writer/assets/templates/STACK.md +56 -0
- package/skills/documentation-writer/assets/templates/STRUCTURE.md +44 -0
- package/skills/documentation-writer/assets/templates/TESTING.md +57 -0
- package/skills/documentation-writer/references/api-docs.md +185 -0
- package/skills/documentation-writer/references/architecture.md +134 -0
- package/skills/documentation-writer/references/codebase-map.md +113 -0
- package/skills/documentation-writer/references/inquiry-checkpoints.md +78 -0
- package/skills/documentation-writer/references/readme.md +89 -0
- package/skills/documentation-writer/references/stack-detection.md +134 -0
- package/skills/documentation-writer/references/user-manual.md +103 -0
- package/skills/documentation-writer/references/writing-style.md +220 -0
- package/skills/documentation-writer/scripts/check_doc.py +273 -0
- package/skills/documentation-writer/scripts/scan.py +712 -0
- package/skills/elintp/SKILL.md +27 -1
- package/skills/figure-it-out/SKILL.md +53 -0
- package/skills/gdpr-compliant/SKILL.md +283 -0
- package/skills/gdpr-compliant/references/Security.md +266 -0
- package/skills/gdpr-compliant/references/data-rights.md +177 -0
- package/skills/how/SKILL.md +58 -0
- package/skills/how/references/explainer-prompt.md +55 -0
- package/skills/how/references/explorer-prompt.md +52 -0
- package/skills/humanize-writing/SKILL.md +417 -0
- package/skills/humanize-writing/references/ai-tells.md +291 -0
- package/skills/kpi-dashboard-design/SKILL.md +103 -0
- package/skills/landing-page-conversion-audit/SKILL.md +122 -0
- package/skills/meeting-minutes/SKILL.md +235 -0
- package/skills/portal-app-exchange/SKILL.md +8 -17
- package/skills/portal-dev-setup/SKILL.md +137 -46
- package/skills/portal-dev-setup/puller.env.example +3 -2
- package/skills/portal-dev-setup/references/kafka.md +140 -0
- package/skills/portal-dev-setup/references/troubleshooting.md +22 -26
- package/skills/portal-dev-setup/scripts/onebox.sh +510 -56
- package/skills/portal-external-app/SKILL.md +57 -21
- package/skills/portal-external-app/references/contract-doc-template.md +1 -1
- package/skills/portal-external-app/references/integration-contract.md +4 -4
- package/skills/portal-external-app/references/public-entrypoints.md +100 -0
- package/skills/portal-external-app/references/quota-and-seats.md +12 -31
- package/skills/portal-external-app/references/registration-and-onebox.md +67 -11
- package/skills/portal-micro-app/SKILL.md +18 -28
- package/skills/portal-micro-app/references/manifest-and-acl.md +21 -3
- package/skills/portal-micro-app/references/open-api-and-extensions.md +1 -1
- package/skills/portal-micro-app/references/sdk-reference.md +1 -1
- package/skills/prd/SKILL.md +56 -38
- package/skills/prd/references/prd-skeleton.md +72 -34
- package/skills/prd/references/product-quality.md +89 -0
- package/skills/prd/references/spms-mapping.md +9 -7
- package/skills/react/SKILL.md +26 -4
- package/skills/react/references/actions.md +251 -0
- package/skills/react/references/data-fetching.md +25 -1
- package/skills/react/references/react19-migration.md +407 -0
- package/skills/reflect/SKILL.md +13 -0
- package/skills/review-code/SKILL.md +63 -0
- package/skills/review-code/agents/openai.yaml +4 -0
- package/skills/review-code/references/git-scopes.md +38 -0
- package/skills/review-code/references/report-contract.md +56 -0
- package/skills/review-code/references/review-lenses.md +33 -0
- package/skills/review-dev-plan/SKILL.md +88 -0
- package/skills/review-dev-plan/agents/openai.yaml +4 -0
- package/skills/review-dev-plan/references/report-contract.md +59 -0
- package/skills/review-dev-plan/references/review-lenses.md +82 -0
- package/skills/review-prd/SKILL.md +84 -0
- package/skills/review-prd/agents/openai.yaml +4 -0
- package/skills/review-prd/references/report-contract.md +64 -0
- package/skills/review-prd/references/review-lenses.md +82 -0
- package/skills/review-prd-dev-gaps/SKILL.md +84 -0
- package/skills/review-prd-dev-gaps/agents/openai.yaml +4 -0
- package/skills/review-prd-dev-gaps/references/report-contract.md +72 -0
- package/skills/security-audit/SKILL.md +191 -0
- package/skills/security-audit/references/language-patterns.md +221 -0
- package/skills/security-audit/references/report-format.md +194 -0
- package/skills/security-audit/references/secret-patterns.md +178 -0
- package/skills/security-audit/references/vuln-categories.md +288 -0
- package/skills/security-audit/references/vulnerable-packages.md +111 -0
- package/skills/sql-optimization/SKILL.md +296 -0
- package/skills/summarize/SKILL.md +1 -0
- package/skills/swarm/references/teams/product.md +2 -2
- package/skills/tdd/SKILL.md +42 -0
- package/skills/teach/SKILL.md +21 -0
- package/skills/test-plan/SKILL.md +12 -11
- package/skills/test-plan/references/case-taxonomy.md +3 -2
- package/skills/why/SKILL.md +158 -0
- package/skills/why/references/epistemics.md +144 -0
- package/skills/why/references/investigator-prompt.md +103 -0
- package/skills/why/references/source-playbook.md +17 -0
- package/skills/why/references/sources/code-archaeology.md +88 -0
- package/skills/why/references/sources/databricks.md +70 -0
- package/skills/why/references/sources/datadog.md +99 -0
- package/skills/why/references/sources/incident-postmortem.md +15 -0
- package/skills/why/references/sources/linear.md +48 -0
- package/skills/why/references/sources/notion.md +55 -0
- package/skills/why/references/sources/sentry.md +100 -0
- package/skills/why/references/sources/slack.md +54 -0
- package/skills/why/references/synthesizer-prompt.md +135 -0
- package/skills/xgent-app-release/SKILL.md +97 -28
- package/skills/xgent-app-release/references/build-and-package.md +8 -3
- package/skills/xgent-app-release/references/embed-csp.mjs +126 -0
- package/skills/xgent-app-release/references/frontend-archive.md +67 -0
- package/skills/xgent-app-release/references/public-delivery.md +75 -0
- package/skills/xgent-app-release/references/publish-api.md +62 -56
- package/skills/xgent-app-release/references/troubleshooting.md +18 -2
- package/skills/xgent-app-release/references/verify-preflight.mjs +50 -0
- package/skills/xgent-app-release/scripts/npm-token.mjs +8 -3
- package/skills/xgent-app-release/scripts/preflight.mjs +13 -2
- package/skills/xgent-init/SKILL.md +23 -82
- package/skills/xgent-init/references/external-app-AGENTS.template.md +149 -0
- package/skills/xgent-init/references/fill-guide.md +10 -22
- package/skills/xgent-init/scripts/check-docs.mjs +14 -86
- package/vendor/impeccable/VERSION.json +10 -16
- package/vendor/impeccable/bundle/blobs/{daa2a8ecd874f9f940dfd72aaa329318b06bb9be25515be85fea84c871b637a6 → 00c067253d37cd20a41dbe9c806d6a72cbff983ad1418b3c3e447998f577b9c2} +18 -11
- package/vendor/impeccable/bundle/blobs/{4ce929b8cafd37247ea4c148bbe39a9afe15908d1abf4a8248c5122275d16499 → 00d167d9183c8d0c6c0682055107382e6672bacf7a712de0abc8f157c2cb2210} +3 -2
- package/vendor/impeccable/bundle/blobs/{a9515f6f084d8f51c378eb3cdc6db1f12e06dba2d32fc61b7ee7950fa2586f2e → 016c082dcd2aa8f3c080a757c8ed335c6070a904bd2f39668bb9d3e6f95929c1} +1 -1
- package/vendor/impeccable/bundle/blobs/0221a193d111a9de33a785706a603e55dd974a115f549dbdf74e0f9ec72bde7d +101 -0
- package/vendor/impeccable/bundle/blobs/055c571f2960b8f929d6a8d3806a4d32dfcb9750b3ef8b60adc8930fff34b559 +101 -0
- package/vendor/impeccable/bundle/blobs/{3aa908c18db91d5f31d6bba6402eab6afc4e0b75137f841a86bd012386e0d8e2 → 0605c8729dc638a46798e90ab12486fe3ae3372a869757cfb387a08e23b3c84a} +18 -11
- package/vendor/impeccable/bundle/blobs/{ec58806f16fc7ba29bccef08f2e158cd00be077ce05d45e943a59bd26dc6dc55 → 0648e4e06d01cabc91fa7dc19256ceedeeeea213b9265e9d36b0918370e16fb2} +6 -0
- package/vendor/impeccable/bundle/blobs/06b20bd42e5682a42c5d6fbfaad4c55e66ff9b9d99a604bd31d3545af120fc2d +101 -0
- package/vendor/impeccable/bundle/blobs/{420e2fdee2b7f555d9a37ce348cf62610ddd98f96b1a0a511796ba600881588c → 08346755b13f1a3f7c6fb4e512387884b80467aaeff109fd41f5521d2a95635a} +3 -1
- package/vendor/impeccable/bundle/blobs/{8f651cb1f8cde0acc5cc511b77fddd98558a527f54974698a1650b0fd7e849a7 → 08398fa2d8e2b06b849f1c0f032e1e93b832e9294aed35c1c7f62b938d62ee80} +1 -1
- package/vendor/impeccable/bundle/blobs/087f6715114e901c2ce00b438e75b82fd48978c020a782f3dc361d39eb7198a6 +26 -0
- package/vendor/impeccable/bundle/blobs/{bc7a5128cfed46148396c08798b6b9429406fbe477e84e331a36ee2840b6b776 → 09310582ed23393b171eb99ad4a288cc422ac53c26d76311586ce54c6df77b22} +3 -1
- package/vendor/impeccable/bundle/blobs/{633903ba7cb38ed502448a66691fbf655805786a2f06be67043f12294ad08e86 → 0bc2bc36ca6e74f9f610392f1a4fb8f57b2676238ba1f9c65cd8714f5d27e8a2} +5 -0
- package/vendor/impeccable/bundle/blobs/0c064c9975f25f6eb5cf7911c2eeafd3e695d729f8c86a49a24ff2d76cb3cd94 +63 -0
- package/vendor/impeccable/bundle/blobs/{4a7d8695741e2cd354baada215b06798c050aa7a8e1ca6814f0e395e054d1ab1 → 0ccf57f758eb0d53bc32c5c77156f016e528d20fe2c2740662bf19964dfbb00b} +18 -11
- package/vendor/impeccable/bundle/blobs/0dd1e6ccf053cb80e057caf7bf2fef30fd0197a41d907a1a8d2d2d02f6978674 +63 -0
- package/vendor/impeccable/bundle/blobs/{943b0d7c9ce4f6802d8440a07b2ad3c61cbd1cc00ab63962bab7eea9ca584d20 → 0ed5986d1503399f48c11104df5e523a63be2d6558770ebfbbeb2323ca3f2ad3} +5 -5
- package/vendor/impeccable/bundle/blobs/14c9c9a7816026dd77494d06b8d1777c8d64785126b0c9ac8db5ebd996dfd6b6 +101 -0
- package/vendor/impeccable/bundle/blobs/{54cb270e8826380caefc8c40642a5d973f27df46bfdb762d822541a0c72a9877 → 14ef0ab84c10331f8af6b4124387a3f80b493175a04a3f89200719b4b5aea221} +18 -11
- package/vendor/impeccable/bundle/blobs/{6abbf5979db5cb1d7965bf5f91d589e984843069c587f4d1e63aab135bbace0f → 1547005438784032de3254cb35bff393e8187d7a459d0c20a693d9bfb0b5c1a4} +5 -0
- package/vendor/impeccable/bundle/blobs/162b814ddd1133923b9584bb95f85959e64844c94341d6bf10a81c06ab7cc02c +101 -0
- package/vendor/impeccable/bundle/blobs/16498466a97a5b19a593d5b3f245468c71784bea069d7fc8aa9690db5ac1d968 +29 -0
- package/vendor/impeccable/bundle/blobs/{b31ff29c7a1ea979c6d039f7e8d17007410697ab49536690dca109f0af3f20f8 → 16ba7fca1973c5faf53dd2ca523559129c0fe9e5f8d50b645f527afa78186cd2} +9 -0
- package/vendor/impeccable/bundle/blobs/1725ca4aa546a34770f29191b58bf8dc14957d4258fb9e7d02f7b1c59c412ea4 +63 -0
- package/vendor/impeccable/bundle/blobs/{598bfed550954471ba4d257d46b4d608cd82e4cdbf36d07bf93c5f4a563f7727 → 1898529e994bf0a31ee9ff3f87c343caea3d8a7e0986f404e129fbf89078ade0} +4 -3
- package/vendor/impeccable/bundle/blobs/{6e20041e209e8705d14aa9c4fb8cca3f0d743791de633785e5b46e2dd1ff1a6b → 19b439d7d16e139357459d3874f739ea94dbdffeb2a0e201df1620ed1e40574d} +1 -1
- package/vendor/impeccable/bundle/blobs/{04af9f2d6883fe76f9539d310d9c369052822a24886d2c330ab1e3fe5981c8a1 → 1b289c8c09de9d4442109ada91b1fa3a190e113a310cab7aa26a3633c5df0bb0} +1 -1
- package/vendor/impeccable/bundle/blobs/{eb3213b9c9f4d6b2f153e7b457f13aa131bcf633695229dad4eac39a920bdf38 → 1bb3bdce54386e96e21b5956713a80583e6b3b9d1170f3bb8dec3819fa341bc3} +5 -5
- package/vendor/impeccable/bundle/blobs/{e71d6b97680084a7ccec01844e658cbd2042aec00da0c91bec62a240ad7dcf6a → 1c11cb8ea42536c7a51e197f1aa32198960bb89262da2eaf32e0feb03c70792c} +18 -11
- package/vendor/impeccable/bundle/blobs/{f0c4d0615c7d520dfc2536c01cc7f1f3aab9b60ddc399ba01289fe62edb12370 → 1c6258015ed02c522948f8f1a3b6457395a8f7954497b87c1cd83f1791f9f819} +1 -1
- package/vendor/impeccable/bundle/blobs/{27c4b6c90ad12a186136f9ece9cb1830d4a6e36b11382ab334efc4543f8082de → 1d7145fd5bf65282b2e05cf42faf41766d68e83e2b75f460b3b62d81ada5e5d7} +18 -11
- package/vendor/impeccable/bundle/blobs/{1484a7ae206ab4f0e6262b21afe0f6307a629ed27d28fb7de69536a6800a4883 → 1e2f696760ee55fb154bdcc302c7d7b0fbb807e0308130594bd892dae14dc9ea} +5 -0
- package/vendor/impeccable/bundle/blobs/{6989120346e87907d59cc6d4708dd9dee29227ad583fbefee28935395b68ce34 → 1f6c3a1d7344f44eaa88b6f38334ad7d7b60201709589039a58cee73de486f5d} +1 -1
- package/vendor/impeccable/bundle/blobs/207d443cabe4e6fe1351f91785748957f757bf1e7aeca405433c0329dad46a15 +63 -0
- package/vendor/impeccable/bundle/blobs/{f7916d0113da7a19d4e03c113d5563d181457e44f1646ecab9191cfee5ae776d → 20e2111b3e065e8e8054f715ea3902e64b77886b30d2bddee723558f22942620} +4 -3
- package/vendor/impeccable/bundle/blobs/21e78c8a77badb3f83290cd4577ed3b24bd4dd3b57136d7da75733d4f3ee9ac0 +19 -0
- package/vendor/impeccable/bundle/blobs/{0f83648f6b425225290305bced51eacebacf9bf9bc05e21cdbad46863fbc89ce → 223f08673b267f81d7586f686afe05d7cd7529a8e11ac37d979f95c2ceaae8ce} +1 -1
- package/vendor/impeccable/bundle/blobs/2499b18f26639694344ca95682f47c65494f730cfff88aa9bd2aa83a22e5926d +101 -0
- package/vendor/impeccable/bundle/blobs/{074575671f24cf4298d06f0019f76e94f62e9a6ed205fce05b8e507341e64266 → 26cd88d10f8a14ed0ddb6e6b21e5e2c981f410eac93afa179202c354d7d1c0d5} +3 -1
- package/vendor/impeccable/bundle/blobs/{5f24c5a97b4ffcabc7c432b064cfdd04c7a2ad52f52e765be648dc0aadab8f38 → 275dd1b6e63bbd30d2713227c4f79b880a8bc4e01cc48d392068bb86939d3afa} +1 -1
- package/vendor/impeccable/bundle/blobs/{356cfa0ebf61589cf5d52691d101a69d69256062fe1d11d71d95d41a78289cbd → 28f65b42c1ce9aaea35dc37a51257d7c703bb7f6553ebe3b8ca238a1007251e0} +3 -1
- package/vendor/impeccable/bundle/blobs/{a1dbde501ffabb50f30f28f2de6755b5e91b3d4028292c5a3abd3358106eb457 → 2ac1624b1253f3b6fcf2da54d54293624176539b2e9609a49245e7e46c65ca5f} +5 -0
- package/vendor/impeccable/bundle/blobs/{3895765e9434400dfc1b30e364be002cf499c1718fb2431e65b907c14ae2cb27 → 2b9379cdb329890eebe2384fbaa23f771745f30d8cfc43e180ebd092e69bcd2f} +4 -3
- package/vendor/impeccable/bundle/blobs/{1a9180cec754f8afd354e7cb759750247e97c5bd26d3242ad4c45e315069e8c0 → 2bc5d62463cc83d6417df7b8f4a02b4135e2b1bb654aa7727890662496f86e3d} +5 -0
- package/vendor/impeccable/bundle/blobs/2ce1722bd1a9f366182d9357d629796b1448f7a0126a854df507eb044d891cab +26 -0
- package/vendor/impeccable/bundle/blobs/{e21af575fcc0f1df54ae422bea4dfa1e5211422606908919f6a86e19e0d5c20c → 3149a87bbed84bffe3558d5eaf1dc596b2e84d3c1be290fc7b1c13e481ae0803} +4 -3
- package/vendor/impeccable/bundle/blobs/3253eab02b62efa80abc74a5c85da08f3e2c6c20dff8dec38f4d236cbbfa0f3c +63 -0
- package/vendor/impeccable/bundle/blobs/{38c2e839e130008b6da814ab9c16f3fcbbedfdf721a9638eebd31a9e65341a7a → 37680abf9a8e446619fcd33862718f483d197bf2652f966adca8dc54d2909b9d} +3 -2
- package/vendor/impeccable/bundle/blobs/385a0efe833bd4afe4a257e7159590de0cf1b7fd8f7b213b732f1e537c62dab7 +21 -0
- package/vendor/impeccable/bundle/blobs/{8a1c872773996dfa1c1eb765ac7ed8e8d41f99d4f12f090b4725b694e85eaa62 → 3898bd9b56a042e860a0db4fb4dd81ac81126fa218b604702e2ac0c2287ae09b} +9 -0
- package/vendor/impeccable/bundle/blobs/3b2b60f23fa8ed9d73e721e17142c3933dc5318fa9a251742a76fee890ac81a8 +26 -0
- package/vendor/impeccable/bundle/blobs/3bd55b35c253f7841ca4e6e1a855a4b477d59aa2daf6e61e93fd685caaaff131 +63 -0
- package/vendor/impeccable/bundle/blobs/{dde1b74aeab3d90320e134f0ed0422bef99917dcab4c1749aa1720a2c94f725f → 3bed76a0d528e2d73da8acae4dc63702bdb5baca5ab11600d70e75fc9f2ba90b} +5 -0
- package/vendor/impeccable/bundle/blobs/{9b2fc50c5062073d097140cde85602bba181e325ec6b9eea1bd3da74582acb9d → 3ef9a43006bc68d83bc958fc8401e59f9beb6379048f5ced047747fdad05b895} +5 -5
- package/vendor/impeccable/bundle/blobs/{30e006fdee873bac23edaeadce0371161625e021e3cf442dff4b05bb82297ba1 → 400419aaa20f710e1a7e5ca1fce9e8bc995c4db84053f40cf778d987619e0210} +1 -1
- package/vendor/impeccable/bundle/blobs/40cd6024312a1339aa66801df533afa543e60c36e708f0f9659dd8d558f83dce +63 -0
- package/vendor/impeccable/bundle/blobs/{55e95137b3f9198c1d4dfc425366b82f1ef5f77d602682b2edf91f2ce9296289 → 412dd9a5238aee223397591fe49b3bd27b6b53d649a0e67ed8570f3e199cebb9} +1 -1
- package/vendor/impeccable/bundle/blobs/{181e814c1b9317098b2300c1b02ad0d137b6d82bd1e7e8cc64de4d00b4c50c25 → 41ef23c048ab739f48afdce26a2678d36ee40bcced34ef4b969d1d8ffafca64c} +3 -1
- package/vendor/impeccable/bundle/blobs/{edddeb3fad88adec9a055b1bf9d5c75418cbe97a13b1a7f6765e73249e482563 → 42831c3cd874346d8e7f120808d91e6ed3cda5c3eca6eefd76b126659536bc87} +5 -1
- package/vendor/impeccable/bundle/blobs/{e3c331cc21d9a216e25e08628610ea99c97e150893c3d26e5c0cecc532f26d7b → 43dbfcb7c2e54c9cca9fce66024f17c06a2f2be645547b718b75c8828a463de2} +1 -1
- package/vendor/impeccable/bundle/blobs/4435529820c3fc2eceae8b1ee35c906a34c7612fb860117e896152b45aee0770 +26 -0
- package/vendor/impeccable/bundle/blobs/44a60aedcc350c2d7d501d0f830a31a586a6511a9ff9b4e361cb328bb747339d +101 -0
- package/vendor/impeccable/bundle/blobs/{c6a0ec6c28ae55fe539f0f41a507b1638495afd285d6eb15c00245fc8cc7e7fe → 45dcea8da47cc21f447041daa942cf5d92cddde9a5a02c196cedbd159c829304} +5 -0
- package/vendor/impeccable/bundle/blobs/{015725eeca94f52bffd2132d4cb49bc3eb1ee76e6ac7378c065e629d59f56613 → 4700adf4542874f204c680ebad8317a97bf7169dbc04147082618ab59ce70c7d} +3 -2
- package/vendor/impeccable/bundle/blobs/4777bbeaff2efcd6a2a66b07aacaaf57cd32f3fab1c1da5a0513937fafb48bd1 +63 -0
- package/vendor/impeccable/bundle/blobs/{b6022a8c7200e96b0b55c2ff599a01d64123a2f5fe01557d4ca5192a6e0f0b0c → 484ea165f6d49ecc15b7a5c5623e377f2e203f4dad366df23eae99255ecf4572} +18 -11
- package/vendor/impeccable/bundle/blobs/485774d58dfd5796956024cdd9c12f05e692a3703f70b12a02ab43918885c3fd +101 -0
- package/vendor/impeccable/bundle/blobs/{3bf5d8661351831dbb2195e3b677fea1f128ca319c0589d538b66d9c9d7dddbc → 488da2e7406c6b4b5c92d7bc8cbd370cdaafc82a5f3ab5adbcffb21d1d1c4df4} +3 -1
- package/vendor/impeccable/bundle/blobs/{6f1d52863482fa0f6fff877f0cc8f6dd0b4230d28050b0d267e082776e61a332 → 492a8030d11e2f4908d934bd817bd6d16a3164056c74a7172f60e2cec5ff3055} +5 -0
- package/vendor/impeccable/bundle/blobs/{51e2f8963377f142ebdc9864e0ecc5aa1e5b7d344ed72d0e9d748d2d3d8c71b3 → 4972f28d96897c8dec891f0de7a0d9d51f36030ff780ed9d960241c75413da2b} +5 -5
- package/vendor/impeccable/bundle/blobs/4a6f0386bff78bb42efa285df2919e75209ec336672cf5fff91ba66ffb352eaa +63 -0
- package/vendor/impeccable/bundle/blobs/{12c1afcd15e86d840b89a78c6d17ce6d1b5609bac713d59271c6ab5932975dac → 4e3cc4d0e229ca96dd2e28fb2da0478a7f0bb64e447d07a652c425d8fbc57573} +3 -1
- package/vendor/impeccable/bundle/blobs/4ea8e05d0f88d24f182ad554da84317f90b9730e29fad262143ddf423a1f8645 +26 -0
- package/vendor/impeccable/bundle/blobs/{402656ca6df17bad1cd55ede0a966a7bb5b187cf4f89c517851f9efe7f14c0fd → 50d4b14134fc06daeac0aab6960800f171ef85250d3bcce6f246cf81e824463f} +3 -2
- package/vendor/impeccable/bundle/blobs/{43852ca5917de66704f73f9019d15482bb1efd92f2eefaeeeae23610b4c0c6a0 → 50f3b5714ca3e2c1bcf070003733407935ee050609d3123c2c065489fbc9950b} +5 -0
- package/vendor/impeccable/bundle/blobs/{f597742c8e5562263d3bce725cb55e920d8c2c60223f41a632d523ca30cdd12b → 51032bb883137007127d30189b44b516d0e6140271bf5881da7eca76f8bd282c} +3 -1
- package/vendor/impeccable/bundle/blobs/{13bd27aa8573e6d45d8bbf9f3fc991e4719d28a7e8f709009a4a5a49a227fff3 → 511ecde67e6bd976c9bdfa8d92f0dba359621344f8135c2a5ce5a66b385a4cb5} +5 -0
- package/vendor/impeccable/bundle/blobs/514a27fc9830455828d337cfc2fa95fa86be8e5464501bbabb9aca09a66b40ad +63 -0
- package/vendor/impeccable/bundle/blobs/{78ac93689928a580c2f90242cbaa96dda3fa4e55ff1f1d00e412b2a62ad85232 → 529cb2ace696ec11a86f4b010c9b137acf282072e483932181be1871df2aa690} +18 -11
- package/vendor/impeccable/bundle/blobs/53628d05b7eff0d4f48b95e48fad40266452fe1b42f398bd88dd9328353e0dd8 +101 -0
- package/vendor/impeccable/bundle/blobs/{00023f9e7f2e27604fde978b56510a8f837b76eeadd93221d11adcf4c98f1a10 → 53de37260c4f1c37e467557e9b038faa0f285b056bb2b95f435e0a7d1b69b0de} +3 -2
- package/vendor/impeccable/bundle/blobs/{0dbbef70048cc3ae44e6710ff09992ce14ad049ce8ed519b0ff8a1ddb4633f4e → 5415103ca4422ea1422e23bfe9f9bae181f5d6d6407442f7fba31856ada58d12} +3 -1
- package/vendor/impeccable/bundle/blobs/{af34b8af89edb10e228c0482754423f48238fce816eceb8703b8781c130da54e → 56285b28b0ffe471761c2ad062d3f933ed2346ca1b617f1323a30fed99a1a852} +1 -1
- package/vendor/impeccable/bundle/blobs/{12fefe52d80d25014e5f7e2f9b278275a675653d3d99ae8f0ecf344cdb9abbe6 → 56cc1bba51e6805de370160ce4a9399fef3740571204f13c3c751725870305e5} +3 -1
- package/vendor/impeccable/bundle/blobs/571f5c3bcf01c9b1bd02ab853a54db3f88375c4b8f39dd67d53e983a33e08bb7 +26 -0
- package/vendor/impeccable/bundle/blobs/{5ce02fc8f353d7f659535fb80e453963dc047a07c4396adf098fe010b479e7c0 → 5855d7595b0212bb8d521e0265378d437df8d2343d5f8a30408c3edde0a14d96} +3 -2
- package/vendor/impeccable/bundle/blobs/{2b21f0142ee88a11dbe2593362f5a910718a61062e3a64e7ff936ef1e74fd394 → 5a07d4769a741cd00fdf8c95b943ef072eb12cd0c9e2c2d2622d5fe0a4fa3894} +5 -5
- package/vendor/impeccable/bundle/blobs/{3dd45e1c32db3d3163a96ef198954905807b25cb9a1d206a7d77986f21d27652 → 5a9626fb8c1e9051155c68626fe7c765a55be325113245d44b4991fc3d3b014e} +5 -0
- package/vendor/impeccable/bundle/blobs/{d07e3131cdf3e392e59eaa3e2f59fcb0799d9494df4adfee12a21067fb8365ce → 5e354ae11913d5846faa3681a9ed98b68d1881fbbb1ecebf0769e3010bb0a426} +5 -0
- package/vendor/impeccable/bundle/blobs/{ad389ab12800738b0e5c97618278b7a824654b25990166ec9f389caa5c3386ca → 5e6eea05456108b8766cf354dda998e90b6a5ecca7f15d807e28659ee78c306f} +5 -0
- package/vendor/impeccable/bundle/blobs/{85b9c2d051de94ee9129c58be111946f73035ca62bbd2a3936f4fa48768fe5cf → 634257e766b1fecacd25e27dbfc7e21ef3b440b01e94e92b8b17711018d8a661} +18 -11
- package/vendor/impeccable/bundle/blobs/6428239079f98fd6500e9fd032dd289b52052da7a4364ff357b0a5341b6444db +63 -0
- package/vendor/impeccable/bundle/blobs/{f424dafa190533cd32c0bc3e4131d0c472d58e16bb191eab14f0ae73c2cea917 → 647bab2f5cf6279d58d808f4df05d1ac63c1c86c6df9d13406ae776458653995} +5 -0
- package/vendor/impeccable/bundle/blobs/{8e7bb79db7331b93f99de314dd5599de8587ec0b6c25e26cf1efab25c0777fcb → 6528f2aebe4a425b724de293c8f6dc8a42ca80c7f1ed3039b8b9a813b004956a} +4 -3
- package/vendor/impeccable/bundle/blobs/{89eb0206a0d9308c6c6a7cc01bc4fd8812d2bd34bb9a831988c5d86fac2c60de → 6575a657642ccdab42d0743ceaee06621c77811b4dc4f21c616e28aabf5e28ef} +1 -1
- package/vendor/impeccable/bundle/blobs/66d60356172ccafdd334fca9bf33243c8409216a733dcde0d66a24fd70ee8132 +1 -0
- package/vendor/impeccable/bundle/blobs/{759bab1d8adc071fdde2efcf6e2157aa4026f3c2b4f3c342a8070bf328011616 → 69cad1ae7355825ef320ac9638a1c9675ba9fda01c9a0fa12244cc4a1973e550} +2 -2
- package/vendor/impeccable/bundle/blobs/6d21d8e2729effaecc5b6239dadbcffb1ec8d51e8bdadeb47a39827266a61c5e +26 -0
- package/vendor/impeccable/bundle/blobs/{ff882c59c9aced92338aa194cc99a521ea2f083fd22eef3b1c1225e06bc72f66 → 6d9258a49c0b0583ec255eeb1092554298d5eea676fb9391f5a5a1377c3fd770} +4 -3
- package/vendor/impeccable/bundle/blobs/{68bc52a604731ca024610051fc763f4d78a53eb2a45d35b40a8c0383043baa63 → 6f4dfe968f47302ea64dca0e02f8c6d81497d93e4f436d09236e305456cbcc02} +4 -3
- package/vendor/impeccable/bundle/blobs/{f97a6891c80bbbc728edefcf4b638d1a823b38f3cb16ecd0fbb717734cc5c0c8 → 6f7f1639a933ed88e116aa8ab0cfb951096930d14f413349ae22ed04e28d2358} +5 -5
- package/vendor/impeccable/bundle/blobs/713a942482531ef8ef103adf48d9decd7327697450e444289aa0479458e4ee1f +101 -0
- package/vendor/impeccable/bundle/blobs/{6d47503587ad6da17ac529f44a96123bbb96a9c91a7a9350b7690fc467561a5d → 7212014fb2477d1d54aedaa79cdb861071a58afb2ae6d4dc5a495fa4810c6f8a} +5 -5
- package/vendor/impeccable/bundle/blobs/{21bc91f6e07691e82b7bba99f9e1d956f9d7a6810dcdc18d231fe73b53a13b23 → 73f8bdec7d9a97476fd7d7e0b4114b5c3e9c7b84c22cbb876cd18c3e64a9b8c5} +5 -0
- package/vendor/impeccable/bundle/blobs/{a8547c8565979894f0c07f92a96ac2a38e681a31fbf155ffeefc7566e185d9c2 → 754e9f0aa2101245a83cb17d8cc5bc49cf87997b29a83dedbfff283dbd0a8c4f} +5 -0
- package/vendor/impeccable/bundle/blobs/{84df879a0332a56ece4bff1922ecf4f50635951b3c67e67eb46f31bc5d30fa9a → 765d3e890cd7f58ca94b6834181052166e9c4f9ef06278dc241da4d64da2d595} +3 -1
- package/vendor/impeccable/bundle/blobs/778cedc9199b407d3e23fa1041e38d548b00b1101a33517aa2a2eb299f9d0edc +26 -0
- package/vendor/impeccable/bundle/blobs/{ef0b8eca20e1321cf7216fd0bda41ce54b0cca197cfd1b075eb51f3436f59059 → 77ae09542fbc10aa4e8b119d6fd19359908a47c13c30068d6a150bfdb50e3e10} +1 -1
- package/vendor/impeccable/bundle/blobs/{15b4837dccb27d7382e2f134ef050b244c4488b1906e0308f288112183cc09ac → 796bbd8231413fcbf22eb7e6f40c402842aa4b10b1894545a7b05d9201ca7c4a} +18 -11
- package/vendor/impeccable/bundle/blobs/{5e3616ac45568f239fda3a4764f7d3bf3473b8b5eefd91e402dd9208a4b851d1 → 7af7fcc09c6b14f26ba78734460a2f9dddd2dcd2e2fa0c47c682f539e2f4cad5} +1 -1
- package/vendor/impeccable/bundle/blobs/7b1a4cc5ce94837c8309962a204c47361927e442b7a1c3cc472f90276eca8b8c +63 -0
- package/vendor/impeccable/bundle/blobs/7c417abe75f0ce4341b6f5acbadcafbbeabcc32cdb13c930aecc5cabda9f9242 +26 -0
- package/vendor/impeccable/bundle/blobs/7e36403ed58e0e82c0e42bf2fbea1c066b8e63276978647a6f1e44bf1edb23fb +63 -0
- package/vendor/impeccable/bundle/blobs/80191b3580a996a2045105976f728e0f46de22c412fc7640741add9767b2d8f4 +101 -0
- package/vendor/impeccable/bundle/blobs/814610dee1081abc4213476ff0c4ae3e8f457909550d250ea0f89953687c85c6 +63 -0
- package/vendor/impeccable/bundle/blobs/8157b5a376e46980117f1ad6d08b24ee7be966f5de64b041bd213d486ea8c077 +26 -0
- package/vendor/impeccable/bundle/blobs/{bad9250670c18d89722563fd747bae4c4bec64d1db0ee09d12d4fea04fe271b8 → 8373668da1aa37c39888809ed9e834a7edfcb884af12f74934c270d004fba626} +3 -2
- package/vendor/impeccable/bundle/blobs/{46250caaec1bd69619a5b28a73cb3c845b319d029b0af9228aaa7001e7e0104a → 83d614fec61078175383012a088f49a9c0bb08b9ebd2b651c77cb94a323474ab} +5 -0
- package/vendor/impeccable/bundle/blobs/{a5371492582dbeb69b24a1a2947b256a2da8a4d55917af709bbab6e452d9d23c → 8449781319a33d4a10a7fab9bfa4812241c303b95f33703b300b097dba51089a} +18 -11
- package/vendor/impeccable/bundle/blobs/{12d2a8043ae8668ad29c32bfa92995849fc49cb016e6ebd4f7e59539d96e7b03 → 857c4a0db5859f1fa91152db684528299dfc552525f50f416d1625a270e12671} +5 -5
- package/vendor/impeccable/bundle/blobs/{bead87679caad7c537dd7c04c3bb78be56ac7eec279ad6aad7322f48ff2df2d9 → 871a8e4d749b807c693ebabd83defbd6c76e1bd2a0f53a28a460cb1308ba8634} +6 -0
- package/vendor/impeccable/bundle/blobs/{cf3ae16765e7b5bc333ef76e24ab37f080e3d62e931c4986158e3cbcda6b9f7a → 881a58aadf300bcc8f4947243e82192ae8dd7f14822a70fabc84fc74a5f9199c} +5 -5
- package/vendor/impeccable/bundle/blobs/{896da399bafcffb0623bdd81bb18709d6eab25c9d5917e739c8798f31ff0d076 → 88549c11ea55d5dfc9f551db9a9c270d7362a9d42aa83db7747c9a7f020e1255} +5 -5
- package/vendor/impeccable/bundle/blobs/9287af96048c58ed0e72493cf7eb90c3957d4ba8b19e70ecf5d1f54264e9e597 +101 -0
- package/vendor/impeccable/bundle/blobs/92b7ab84c828fa888f4882c417c3d7f8fde2e5445b40f96f4fc8181a3e058afc +101 -0
- package/vendor/impeccable/bundle/blobs/{e2f98c4136d0ab70ec32fcdef58edb20ed8ec4f6cc067e0dae952b22cfd6a471 → 93c53421c3376f695fe9dad5c82102f74bb5dd15e4ced81bb4ad50a71e5f1027} +1 -1
- package/vendor/impeccable/bundle/blobs/{a8f4056a85706c0c8f80ec48e9b437e198464100aa42786f9252051f4b931c19 → 95f0c7935a6d0375e09ae67ae0066c0ce7b583bf1d445d268cc4d2f4f900b1bb} +3 -1
- package/vendor/impeccable/bundle/blobs/98384b78af087855dbb526ec1e870a676ecd87f57237643dfea815317dad8a07 +26 -0
- package/vendor/impeccable/bundle/blobs/{948326fab89f0d5c07355a06b9b9c30d08bba2e3a673a0151ebbf5a39dff7b9a → 99e4a6facdb07986aa721bda8a4e35466b30091f32e38d7a71d9fcbe3591f65a} +5 -0
- package/vendor/impeccable/bundle/blobs/{44a91b3f0810f43829d8584e912812444d15614e4b57ca8070aee7ab899f7c1e → 9a4aa0d4903eabee987fdc92053466ff7f6eb0604797aee0efe67d67999b3eae} +5 -5
- package/vendor/impeccable/bundle/blobs/{9b85b85443aec09918befb83208c72f475457db8261a8fc5e83ef7eec474c869 → 9d45e5f6c082de6df4a2cfff11deb969715c49b5d9891d100dd1b2252c5bdcdd} +18 -11
- package/vendor/impeccable/bundle/blobs/9db3c0857f4c2c8877b1fe24a47a229fee0de76ec9057bd8ee95f0677fb58d74 +26 -0
- package/vendor/impeccable/bundle/blobs/{5738bcf9ac21dbb2113fd0c5cc7e4bbfc8174778916ab5843644332b3dbbc36e → 9e82126a2e08aa365f9c430d383cf6e1921e04d1e0a1b5777716ff97828cfad8} +5 -5
- package/vendor/impeccable/bundle/blobs/{b3782f2d9215eb0f5df4fe3c0e0bec07cef011e1836d4d0e45ef02bc48d3adde → 9f2993499adadfdef4065a9a7fb69c75f888d892d4ee6bdbe62619bc772f495c} +1 -1
- package/vendor/impeccable/bundle/blobs/{1c804990fd8ac23a4b19c42972b5ae591d17f620d0006f0f32927c8db5d5bf50 → a1af8b8a97665a3692eb39872c235796684a387a0b83785872f81aebd9dab046} +18 -11
- package/vendor/impeccable/bundle/blobs/{824b994782a1fe68a244bbdff7218a2e0854655d90cc0fb5ade7ef9259ba6305 → a27399e3056c77a28ddd310fb5b4dee6e8e440dfa1737f7e38815097bec4c3a9} +5 -5
- package/vendor/impeccable/bundle/blobs/a569989e6a3d6453b4c45e9474e162a15cc54e11732ac6baa7990a6e7cccc0b5 +21 -0
- package/vendor/impeccable/bundle/blobs/a75b892696469e3ccd2af33c9eef793e635efc3c5ac45336b0c1373d90c856b0 +63 -0
- package/vendor/impeccable/bundle/blobs/{3ba92d4aa840ec1b6c2fda224339489d6dd65eedf43bb45836af02584d1faa88 → a7e8e60df83c6f47590467094ab2a13f1fe28ce45959a4e69dd89575a4208646} +5 -0
- package/vendor/impeccable/bundle/blobs/{e49d2b0110c55751da3c965b4ae4d294aa676c961a09f8efbbbf22c1ec7c4fa0 → a892e337eee548d53252abb72ba5aa85cbcf556ffd8dc74e05534652c010d574} +1 -1
- package/vendor/impeccable/bundle/blobs/{8f0867db7c6f6a54348a0d951f198a1bd852cd12505d821e6e1ac6bd42e7fcea → a93397adc906e245c69b42d4b25931fc92dc75baa60ca9a3749ba23b52ba01a0} +3 -2
- package/vendor/impeccable/bundle/blobs/{424b2e75cb204e2dca7db4a40dfe5a81f78dc0fc58ac4790e8b7bbf2f330bba4 → a9e63b2df611805e845e0bb1cca1a0c27e83640a78185c9fd9de90d53a539cdc} +5 -0
- package/vendor/impeccable/bundle/blobs/ab80e6a971baa66342548a846ce3fb69824ef9ef4e0f26c6f02685f225d00bbd +26 -0
- package/vendor/impeccable/bundle/blobs/af35b5fb6e45acb6483a5fbb864c3eaa9c57bacc43857f48183c836041c670ae +101 -0
- package/vendor/impeccable/bundle/blobs/af5842c4844b692b817319d5375611d4211dc7f459fb12da358baefc3a6cd373 +63 -0
- package/vendor/impeccable/bundle/blobs/b2732083f8f1d1924d38f84f179491430aebda8e0fd1f1d0785e3f883bcf3a40 +63 -0
- package/vendor/impeccable/bundle/blobs/b3b1d5a4c80ce279d88896601deee9ccfeacdae0d0cd433600985a5f7ac93c72 +26 -0
- package/vendor/impeccable/bundle/blobs/{fd5579dbae1fc2495b7dddde48df9673acebd27953bbb56d506d3b470375c9e9 → b4be5499f404a926cdd2c55d8fb7409ba74a56b3d0c7d865594cc0254d3e499a} +5 -0
- package/vendor/impeccable/bundle/blobs/{2fd096823e4a93f19edd421a69e10f90ebb630a014c673d1802a927c6f47b7d2 → b626e0677288a1660e9ce80c4f0454b527010239681f6b8dcc0f36b4a4d6bcb2} +3 -1
- package/vendor/impeccable/bundle/blobs/{33b6b32c0c3c0c4a2b22bd2275176b1c88a006dd94592a854f629911a0b21cdc → b719be9c5d4ced5d649ec6c0c90630196e7ee513d0da482aef13c705fdc23ab6} +3 -1
- package/vendor/impeccable/bundle/blobs/{df0eb9e9a484fc7b8a0f3e50573a7d7f81e0f17598ac30d9f3fe5a6c6aa5fefa → b8938fea3399aa639b4c873248035c219658069eef7be62672254e2f72c056f4} +5 -0
- package/vendor/impeccable/bundle/blobs/{ee0a15fcfc244b76b896a2650a17b35e444d4311166b69a3cfa32d11f8f44851 → ba0d96d88ab40fad1cb522e60b11affc568cfe9d340110ac5e71f834ac3d0f4a} +12 -0
- package/vendor/impeccable/bundle/blobs/{426c7f5437dd3c23a4cfaef6964dc7f1e038480f92238499b85f3ce7e4472bf4 → bc48bca63dff44e1f0205bafb64e16b2d6fb294ace405dbc9ae06a3bc6107154} +3 -1
- package/vendor/impeccable/bundle/blobs/{c3ad2a5fa570876af6645c48d246c664859e19f253d2dc9e0ead34e785d5b40a → bdd676c8f29295addfdbceaab285bb1184ec3ef7ff60501908b97ea8269580c4} +3 -2
- package/vendor/impeccable/bundle/blobs/{38d4d404030c6ea935d3223db1eeb22c45d04a94f41f98e02a43cdc5af7ff2e3 → c06effcdc60859157208d3b7ee23d56160f2386f6a2dfa2514ba82fe21828ae0} +1 -1
- package/vendor/impeccable/bundle/blobs/c100b67a4ae248ad564182b181acb1ee2fe64c00049aeef62d4e7a3213726f37 +26 -0
- package/vendor/impeccable/bundle/blobs/c2dfc965319745c403b99e00e9e97de15f1300ea721bd3f708f0ac47aadc537b +101 -0
- package/vendor/impeccable/bundle/blobs/{e9da72a13eb3411d6bbb316953022f62abc4434f505e5345907b216eda9f793b → c6b3bc811eb23d90ff9add1e0e5b40999a0bbbab364f5e6d08061f36d30429a5} +1 -1
- package/vendor/impeccable/bundle/blobs/{82a5e564563333aabb7ab4d2f8c26c785dfe2c2416ac6e9f30cba31440676194 → cdf8a88b9865599c58fe285041d2d46eea7d9bd2d4075d82de358191742b20ad} +5 -5
- package/vendor/impeccable/bundle/blobs/cf3d3a296890ac1ee363fee930f252e20d0935cd575367ad017b3cdc2dc5a50d +26 -0
- package/vendor/impeccable/bundle/blobs/{a1e4febca3455787d7c753fe177a150dccde6e742957de400b0307247802d200 → d2e16da9bb6b33c931378d1bf57dcfff5dc426a71434bc352cec6aece715a66f} +18 -11
- package/vendor/impeccable/bundle/blobs/{c36f6aac0ddf52eabbb21df09fd3310540dca6b09e7a4017d18e94c06c469405 → d4a9e18a879bbb92aa0a56e16b45481090dffa4470efdecf52fb0da8c900be5d} +5 -5
- package/vendor/impeccable/bundle/blobs/{869fa5390b84bfd00d072f5280a9002ea3e3936edf5985241be641a87f03ff7b → d57c3e0453f601ad688911fca4471057c7b46b561fcd42a1e12a581101c5186c} +1 -1
- package/vendor/impeccable/bundle/blobs/{910461b1c1f8216155165955c860a884a1e2f557cb38f21ef512ea90ef6503c2 → d5f83912eda93d42f93522bb74aeff0ea04d9c559577ec52fcccc130dd03166d} +2 -1
- package/vendor/impeccable/bundle/blobs/{9deb14303b421b5a9232755b5b9f317716f33e1e211557a98a00a9c409775c4d → d6489d7f3e607ce3f8514a7a7d3a0eb5e8f1ac55859eaf7d5c31b53de8fab9f3} +18 -11
- package/vendor/impeccable/bundle/blobs/{37080ea5e5b381adb7eae7a427231b0ad0dee0f0916fc1d6b673b7101a5b425b → d6a51f4df6d76f16b95ab81268a689f4c5936d505c5bb25c80ad7423f927bbc6} +5 -0
- package/vendor/impeccable/bundle/blobs/{61c72fdde649bf7f2e0668e48f9d222666c81672100b5f2265940e7aa13c8767 → d7b99a57652cb8741d57a15ba7e06de4707fac02a97e5e001179da007272f2b8} +3 -1
- package/vendor/impeccable/bundle/blobs/{57402ef6fd9d0745f8c60d778f77da83a8b16edf751fa1013598a0f6e5f0f541 → d9963fd73bf6129fe0c8ec25c5148f50617ec85683b8eeae7e411c9a42e2db33} +2 -1
- package/vendor/impeccable/bundle/blobs/{581409ace104a81744b7d08f5398a2c207cf76d9e50751f807b4382eaf66454f → da3b2399814db89d67959268c646601957d3e8c641b09a5bdbce84217c1c2cfe} +5 -5
- package/vendor/impeccable/bundle/blobs/{249f0437a52ab3eb4bc4d4a9f38e085334c0fbb7795e88dd419e32b5f58c924d → dc3aeccbea3e997704ce8b170f56b0eaf343a14ad4fedb22a6dbee0f205aa37f} +5 -0
- package/vendor/impeccable/bundle/blobs/{433a79eee3ce4c99e79a7aebe3a6d8ec9ff70216772e0c2ff9dce3a01d672963 → dcc1572e739cdabcbf084f276b447cb686aa18459896e6d8fe29f4d7d807bd1d} +5 -5
- package/vendor/impeccable/bundle/blobs/{2d7086992c07df1fc734cdf9c420c4bd8ad409ab7909e07c8b486c303d420732 → dd66761b291c7dbca6e9efd22023e38f8c53ad310f3a6cdab5dc7ecd7ae8f31f} +3 -2
- package/vendor/impeccable/bundle/blobs/dd953992625c240fd1842aaf533a865aabd09487cbc16fa01fe8bb4b4365b843 +101 -0
- package/vendor/impeccable/bundle/blobs/{df4f14df1daaad1606b682995f649da19a85debf264092447b3b7ddb8b4bc1ce → de70398719140e4951aa111e9625de5ed916ad1ef0877e4ab6f6b4a7e3cc5f8f} +18 -11
- package/vendor/impeccable/bundle/blobs/{8b23562ccc3e41609ce6e67fdad6cc57b6c961964c329eff6975a1b4c5471c0d → deaaa533475b6a9f7dd52e01a1f1997aa3af146694334981650f8c846f939559} +3 -1
- package/vendor/impeccable/bundle/blobs/{041535231366047a0beeb5daa64ea9c23d5a566580f7dafdb8c0623cb4a7e76b → e07176229b8a330970ca3c9c5e3dd68c2aaeb726285e30f471e91053d7f8e798} +1 -1
- package/vendor/impeccable/bundle/blobs/{115e1c3f1b58b5129910ed925dbf65d61d5ac4c2036618847555ce40098aae97 → e1075ea5b34ac9c60f7c5bda97356eeaf1b683b599592d324fd3704f0852ad7a} +18 -11
- package/vendor/impeccable/bundle/blobs/e3af212117e0c552b0976687200fe8f95846a01725a482e8e4dbfd75e40dbfa6 +26 -0
- package/vendor/impeccable/bundle/blobs/e3c2031978cd670d7150ff3140f12cf8b6882ef638ea9a9985caffa9a80c8713 +63 -0
- package/vendor/impeccable/bundle/blobs/e6e18e7c23cfe82961d90b9714cb466c20bd83f222ac63e9339b6b2c304e1787 +26 -0
- package/vendor/impeccable/bundle/blobs/e7af7ad18b307a3171fcf49421df2a557f93289d27af2430f10ee74e2a2fc2d3 +101 -0
- package/vendor/impeccable/bundle/blobs/{b161198874e4e77599bc31691e78790be14bacc2eb03be168c8a7543ece9fbe1 → e85da3098368807689009184eca2bb09a91bdb6cb1be3e7a61f91f1ae31cd69b} +18 -11
- package/vendor/impeccable/bundle/blobs/{6bdbc3f745ceee15e10b050f109ce42bbeb53ab3c3b5239257de1d596654dee7 → e8720f3aa41135211cc58cc299a39eeda86c75651f4279cc1ede8db10dcc0584} +4 -0
- package/vendor/impeccable/bundle/blobs/e9861052457cc1ddc42c687bb8c33a877834ced94fed74af2a4f00f6bae50795 +101 -0
- package/vendor/impeccable/bundle/blobs/{d1faa55eb956033d28e9f27fd2bc2a9f62c5da0f0abd6534819cc0a04db54d9d → eb3e86876c20f1cfc443dcbe48d8f41fea6e815082a304610be432272429a06d} +5 -0
- package/vendor/impeccable/bundle/blobs/{0e1819750e5448311a051d35ab6d0be0830418f78ca872ef10469fafebb27d4f → eba472f6190541c28e2e647ed019f43564ba5b92d629963f34c899175b25b31e} +5 -5
- package/vendor/impeccable/bundle/blobs/{f173ff03f989f162cee815feb2d8ca72daf00019c48694d89db16d52171a79c0 → eba609589a5a051643a7bae60b7cceef7cfe44d0f8bd9229e61473ac75910fb3} +1 -1
- package/vendor/impeccable/bundle/blobs/{8eb466778023fccea641654d662157b123eeb360f4a0875bf6fbe3d93680851c → ec81b008d2641402e3352b09b1a90562ef7a24598d7c5aded475038cce63aca0} +1 -1
- package/vendor/impeccable/bundle/blobs/{4acfb9e38f6e09f7484e36fc19704d69eab159436ee9329168be74c493042f22 → ec86b8633fbeb14ef2272f220fdd98089972b03b99da83e49eeb6a8b73b00617} +3 -1
- package/vendor/impeccable/bundle/blobs/{d15a2914d93e07a4956acd5c8b8211af17380f527acd10d8acf4f4920badaaaf → ef2e97cd690baf6fe5c895dd2d8844aff9fcc4a8bc04973402678a739c81d712} +4 -3
- package/vendor/impeccable/bundle/blobs/f0fbe529f63961a027bada2e6a3cbe86f4af0dba4b8e1010da22b007f9002f66 +63 -0
- package/vendor/impeccable/bundle/blobs/{c02feba25a961a72647ad317aba2d65baeeed53c4cdcc072f25bb37f4d867d43 → f254d59ff973e907cacdc2c34b8b4de075437d292de31dac30e10a9d7035086c} +3 -2
- package/vendor/impeccable/bundle/blobs/f5efb1b1dd4cd18e1d4789d7c8e0188f4342b25fffd53af6088ba8b67774fb99 +26 -0
- package/vendor/impeccable/bundle/blobs/{7af0a8665057c83b39bca2c8c7427ef2343734f70d4128c377113a6726a1e3b1 → f68a3d68ac92606e91aa8878e003d9432ddd09aa97ca01c6b3ce46c937dca316} +524 -4
- package/vendor/impeccable/bundle/blobs/{381ff89aa76e82a0d98456ec31cb117555ae045539fba47c45056daa50f611ca → f84b653ede0804d21e6210c6d21fd5352023914fedceae6ff14e20f1e93b06e7} +5 -5
- package/vendor/impeccable/bundle/blobs/{5b30a06646ad5e453d6b5ed1b8d446f69fca3cd13b8aeda28f0d0b2cbe8f62d1 → fb32d99751c5fc24493ff4460be1767bd5236dc820fd337775067c0620d1a7a6} +3 -1
- package/vendor/impeccable/bundle/blobs/{733504a70ed20bcfca9c26c353f7b88f8491d24f3f2fe124dc1e73b28eefa296 → fb5fec24adafa48df43eece6907c1c986a4772cbdc64142c881f00c3b312e9ca} +18 -11
- package/vendor/impeccable/bundle/blobs/fc149b5bc7a8d0cc9b9bf86e5013793f3857c1c302212e9aaf101cb95427386b +101 -0
- package/vendor/impeccable/bundle/manifest.json +413 -298
- package/skills/grafton-view-dev/SKILL.md +0 -195
- package/skills/grafton-view-dev/references/bindings.md +0 -120
- package/skills/grafton-view-dev/references/components.md +0 -168
- package/skills/grafton-view-dev/references/recipes.md +0 -208
- package/skills/grafton-view-dev/references/schema.md +0 -86
- package/skills/grafton-view-dev/references/stores.md +0 -310
- package/skills/portal-backend-app/SKILL.md +0 -56
- package/skills/portal-backend-app/references/gate-and-tokens.md +0 -93
- package/skills/portal-backend-app/references/wiring-and-conventions.md +0 -71
- package/skills/xgent-init/references/external-app-CLAUDE.template.md +0 -249
- package/vendor/impeccable/bundle/blobs/800cf1c0392b24de7c0a1c6ea6778ecb433dec71c49a150bce96a98477527b2f +0 -1
|
@@ -5,17 +5,10 @@ description: '接入「外部镜像服务类应用」——服务端代码不在
|
|
|
5
5
|
|
|
6
6
|
# portal-external-app · 外部镜像服务类应用接入
|
|
7
7
|
|
|
8
|
-
外部镜像 App = 服务端在别的 repo(任意语言/栈)、独立镜像交付、**常驻**(不走按需缩零)。鉴权与业务 API 遵循门户运行时契约;**`/health` 支持平铺 JSON 与 Envelope,检测规则与平台运行时一致**。本文件是判断与流程;具体契约按需读 `references
|
|
8
|
+
外部镜像 App = 服务端在别的 repo(任意语言/栈)、独立镜像交付、**常驻**(不走按需缩零)。鉴权与业务 API 遵循门户运行时契约;**`/health` 支持平铺 JSON 与 Envelope,检测规则与平台运行时一致**。本文件是判断与流程;具体契约按需读 `references/`(可整目录拷到 App repo 独立使用)。
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
> `deploy/…` 这类路径**都在门户仓**。在 App 自己的 repo 里它们**不存在** —— 它们标注的是
|
|
13
|
-
> 「门户侧要做什么」或某段内容的出处,**不是让你去打开的文件**。找不到不是配置错误:
|
|
14
|
-
> 别去创建、别去全局搜、别把它当缺失依赖报出来。你需要的一切都在本 skill 的
|
|
15
|
-
> `references/`(自包含)。若你正在门户仓里工作,那这些路径就是可以直接打开的真实文件。
|
|
16
|
-
>
|
|
17
|
-
> ⚠️ 一个例外:`/apps/<key>/`(带前导斜杠)是**线上 URL 路径**——微应用产物的挂载点,
|
|
18
|
-
> 与仓内的 `apps/<key>-app/` 目录无关,别混。
|
|
11
|
+
`/apps/<key>/` 与 `/svc/<key>/` 是线上 URL;本文的 `references/` 和 `scripts/` 相对于本 skill 目录。
|
|
19
12
|
|
|
20
13
|
## 按任务读参考
|
|
21
14
|
|
|
@@ -24,6 +17,7 @@ description: '接入「外部镜像服务类应用」——服务端代码不在
|
|
|
24
17
|
| 实现/评审资源服务器(四道闸、health、env、认证面划界、配置面) | [references/integration-contract.md](references/integration-contract.md) |
|
|
25
18
|
| 实现 `/health`、出仓迁移、发布镜像或健康检查失败(必读) | [references/health-contract.md](references/health-contract.md):两种正确实现、实际判据、发布前检查命令 |
|
|
26
19
|
| 写 manifest、注册布线、一盒联调、排查 | [references/registration-and-onebox.md](references/registration-and-onebox.md) |
|
|
20
|
+
| 匿名页、后端直出 HTML、公开站点/独立域名、旧链接或 listingKey 迁移 | [references/public-entrypoints.md](references/public-entrypoints.md):现有 /apps、/svc、Sites 三种通路及各自责任 |
|
|
27
21
|
| 为外部服务写/审对接契约文档 | [references/contract-doc-template.md](references/contract-doc-template.md) |
|
|
28
22
|
| 有「每租户最多几个 X」的配额诉求(选模型、数值谁配、已用怎么来) | [references/quota-and-seats.md](references/quota-and-seats.md) |
|
|
29
23
|
|
|
@@ -53,6 +47,13 @@ description: '接入「外部镜像服务类应用」——服务端代码不在
|
|
|
53
47
|
|
|
54
48
|
## 资源服务器硬契约(外部实现最常炸的四处)
|
|
55
49
|
|
|
50
|
+
**Bun / TypeScript 后端不自己实现第 1 条**:直接用 `@xgent/portal-server-sdk` 的 `createPortalAuthenticator`,
|
|
51
|
+
信封解包、主体与凭证类型校验、缓存与故障映射都在里面;其他语言才按下面的契约自己实现。
|
|
52
|
+
`@xgent/*` 从平台私有包仓安装,配法见 `xgent-app-release` skill「第 0 步」;仓里还没有
|
|
53
|
+
`.xgent-registry.env` ⇒ 停下,请开发者先去门户「开发者应用」生成配置文件。**不许 vendor**:
|
|
54
|
+
不把 SDK 的产物或源码拷进仓,不用 `file:` / `link:` / tar 依赖顶替。收外部团队交付时,看到
|
|
55
|
+
`vendor/` 下有 `@xgent/*` 就打回。
|
|
56
|
+
|
|
56
57
|
1. **自省信封解包**:门户响应必须先检查 `ok === true` 且 `data` 为对象,再校验 `data`;失败信封或缺 data 返回 503,不能回退到顶层。只有合法 `active:false` 才表示凭证失效。TDT 的 exp 必填;无过期长期 key 才可省略 exp。主体/凭证类型矩阵、ACL 范围与缓存预算见 integration-contract.md §3;
|
|
57
58
|
2. **`/health` 按响应形状判定**:HTTP 非 2xx 不通过;2xx 响应顶层有 `ok` 时,必须 `ok === true && data.db === true`;没有顶层 `ok` 时按 2xx 判健康。平铺 `{"service":"my-app","db":"ok"}` 与信封 `{"ok":true,"data":{"db":true}}` 都支持,不按内建/外部 App 区分。平铺依赖故障须用 HTTP 503 表达;不要给字符串状态直接套 `ok(...)`。完整示例与同源检查脚本见 [health-contract.md](references/health-contract.md)。
|
|
58
59
|
3. **门户三变量 all-or-nothing**:自省地址 + SA clientId + secret 全缺→鉴权停用 503;缺一→启动 fail-fast 打印缺失项。
|
|
@@ -60,6 +61,15 @@ description: '接入「外部镜像服务类应用」——服务端代码不在
|
|
|
60
61
|
|
|
61
62
|
完整契约(四道闸、三种令牌来路、审计、划界)见 [references/integration-contract.md](references/integration-contract.md)。
|
|
62
63
|
|
|
64
|
+
## 一盒初始化与升级
|
|
65
|
+
|
|
66
|
+
首次联调用 `portal-dev-setup` 的 `onebox.sh init` → `up`;已有一盒换版本用
|
|
67
|
+
`upgrade [--image <ref>]` → `up`;沿用 latest 先 `pull` 更新缓存,已加载的本地新镜像可离线升级。
|
|
68
|
+
不使用 `init --force` 代替升级。升级保留配置、generated/、backup/、
|
|
69
|
+
端口与卷;`up` 仍重种门户库,不重种 App 自己的库。自带对象存储为 RustFS,保留 `MINIO_*`
|
|
70
|
+
配置与 `minio:9000` 网络别名;控制台路径为 `/rustfs/console/`。存量对象由切换脚本复制、核对后才切换,
|
|
71
|
+
切换后有新写入时不能直接回旧卷,细节见 [registration-and-onebox.md](references/registration-and-onebox.md)。
|
|
72
|
+
|
|
63
73
|
## 注册布线(细节见 registration-and-onebox.md)
|
|
64
74
|
|
|
65
75
|
- **dev / 一盒**:`bun run register-app <manifest>`(幂等,生产拒跑)= upsert listing + 直写服务账号 + 写发起方 App Secret + 写 `/svc` 白名单 map。⚠️ `exchangeInitiatorSecret` 的哈希在**首个租户**安装时还没有任何实例可布——先安装 App,**再重跑一次** register-app,否则发起交换 401(之后装的租户会随安装自动补布,见 registration-and-onebox.md §2.2)。日志里 `wired into N …` 的 N 是「**改了**几个实例」,0 也可能是「本来就对」——判据是比哈希,见 registration-and-onebox.md §2.2。
|
|
@@ -67,14 +77,11 @@ description: '接入「外部镜像服务类应用」——服务端代码不在
|
|
|
67
77
|
- **生产(标准路径)**:清单事实源在**对方仓的 `app.manifest.json`**,经
|
|
68
78
|
**发布提案**到达:平台管理员在 控制台 › 应用市场 › 接入新应用 按 key 签发 `xrel_` 令牌
|
|
69
79
|
(无行先建 draft 占位),对方 `publish --manifest … --dist … --image …` ⇒ 首次必进
|
|
70
|
-
「发布审核」队列 ⇒
|
|
71
|
-
|
|
72
|
-
`
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
特权服务态 scope 经对方 manifest 的 `privilegedServiceScopes` 申请、审批即授予(SA_DEFS
|
|
76
|
-
不再是唯一授予点,union top-up 也不会回滚审批授予);用量指标经 manifest `usageMetrics`
|
|
77
|
-
声明(治理档);控制台应用配置的 scope 校验运行时按 listing 声明放行(不卡编译期枚举)。
|
|
80
|
+
「发布审核」队列 ⇒ 批准后更新清单、服务账号与已装租户,后端和网关分别交付。
|
|
81
|
+
密钥一次性回显给审批人;平台运行配置由管理员维护,App 团队无需修改门户代码。
|
|
82
|
+
特权服务态 scope 经 manifest 的 `privilegedServiceScopes` 申请、逐项审批后授予;
|
|
83
|
+
用量指标经 manifest `usageMetrics` 声明(治理档)。批准不等于部署与网关已经生效,
|
|
84
|
+
交付判据见 [公开入口](references/public-entrypoints.md)。
|
|
78
85
|
- **后续版本**:对方 CI 自助(`xgent-app-release` skill)——无治理变更自动通过,
|
|
79
86
|
治理变更进「发布审核」等平台批准。
|
|
80
87
|
- **scope 三规则**:平台基础 scope ∪ 自己命名空间(含连字符→下划线变体)∪ 已声明 `exchangeTargets` 的目标命名空间;越界 `VALIDATION_FAILED`。
|
|
@@ -138,12 +145,32 @@ manifest 的 `requiredEnv`**(改名走 `renamedFrom`),并把「本版新
|
|
|
138
145
|
| 档 | 键 | 值从哪来 |
|
|
139
146
|
| --- | --- | --- |
|
|
140
147
|
| **平台注入** | `PORT` · `<PREFIX>_SERVER_PORT` · `PORTAL_INTROSPECT_URL` · `API_BASE_URL` · `PORTAL_BASE_URL` · `<PREFIX>_SA_CLIENT_ID` · `<PREFIX>_SA_CLIENT_SECRET` | 平台换版时自己算并注入,没有人手填 |
|
|
141
|
-
| **自动供给** | 库连接串 · Redis 地址 |
|
|
148
|
+
| **自动供给** | 库连接串 · Redis 地址 · 对象存储桶 · Kafka 五键 | 批准时平台按登记的服务代建资源 / 取地址并注入 |
|
|
142
149
|
| **自定** | 其余一切 | 平台管理员手填:非密钥进 `descriptor.env`,密钥进主机 `envFile` |
|
|
143
150
|
|
|
144
151
|
`<PREFIX>` = `listingKey` 全大写、连字符换下划线。`PORTAL_BASE_URL` 是门户**公开源**(也是调
|
|
145
152
|
别的 App `/svc/<key>` 的基址),`API_BASE_URL` 是内部 portal-api,**不代理 `/svc`**。
|
|
146
153
|
|
|
154
|
+
**门户内 App 的服务地址由代码派生,不逐个要求平台手填。** 以 Page Builder 为例:
|
|
155
|
+
|
|
156
|
+
| 原来的地址变量 | 应用代码使用的默认基址 |
|
|
157
|
+
| --- | --- |
|
|
158
|
+
| `LLM_GATEWAY_SERVER_URL` | `${PORTAL_BASE_URL}/svc/llm-gateway` |
|
|
159
|
+
| `FILES_SERVER_URL` | `${PORTAL_BASE_URL}/svc/files` |
|
|
160
|
+
|
|
161
|
+
接入或审核时核对这几项:
|
|
162
|
+
|
|
163
|
+
- **清单**:`requiredEnv` 声明 `PORTAL_BASE_URL`,保留其他确实必需的键;上面两个可推导的
|
|
164
|
+
地址不再列为必填。平台注入的是门户基址,**不会自动注入这两个旧变量**,也不要把派生地址值写进 manifest。
|
|
165
|
+
- **实现与迁移**:代码去掉门户基址末尾的 `/` 后拼接 `/svc/<key>`,再追加具体 API 路径。
|
|
166
|
+
旧变量可保留为本地调试或特殊部署的可选覆盖项。代码默认值、启动校验、清单与新镜像同步交付,
|
|
167
|
+
不能只删 `requiredEnv`;平台侧核对已有覆盖值是否保留,并在未设置旧变量时验证实际调用。
|
|
168
|
+
- **权限**:统一入口不替代鉴权。代表用户调用仍需 `exchangeTargets`、目标 scopes 与令牌交换;
|
|
169
|
+
后台调用仍用获准的服务账号权限,具体姿态见下文「App 型公共服务」。
|
|
170
|
+
|
|
171
|
+
这条约定针对门户内的 App 服务;第三方 API 等无法从门户基址推导的地址仍按需声明。
|
|
172
|
+
发布操作见 `xgent-app-release` skill「调用门户内的其他 App:从 `PORTAL_BASE_URL` 派生地址」。
|
|
173
|
+
|
|
147
174
|
**服务怎么绑到键**:键名按约定命名(`<PREFIX>_DATABASE_URL` / `REDIS_CONN_STRING`),再声明要哪条服务 ——
|
|
148
175
|
|
|
149
176
|
```jsonc
|
|
@@ -155,6 +182,15 @@ manifest 的 `requiredEnv`**(改名走 `renamedFrom`),并把「本版新
|
|
|
155
182
|
这种上游定死的名字)也能发**,只是平台管理员要在审批屏上逐个点一下「从平台服务取值」,
|
|
156
183
|
每次发版多等一轮。收交付物时把这一条当作可读性问题看:不是错,是白等。
|
|
157
184
|
|
|
185
|
+
**Kafka**:声明 `requiredServices: [{"kind":"kafka","name":"main"}]`,并在 `requiredEnv` 列出
|
|
186
|
+
`<PREFIX>_KAFKA_BROKERS` / `_KAFKA_USERNAME` / `_KAFKA_PASSWORD` / `_KAFKA_SASL_MECHANISM` /
|
|
187
|
+
`_KAFKA_TOPIC_PREFIX`(每项均带 `<PREFIX>`)。机制固定 `SCRAM-SHA-512`,用户名 `app_<key>`
|
|
188
|
+
把连字符改为下划线;主题、消费组、事务 ID 的前缀 `app.<listingKey>.` **保留连字符**。
|
|
189
|
+
App 显式建主题、副本数 1,不能更改保留期或增加分区;不申请管理员密码。平台是单节点
|
|
190
|
+
at-least-once 消息服务,不是业务记录系统,App 负责重复消费、重连与租户隔离。
|
|
191
|
+
一盒新版 `add` 自动供给相同权限并沿用已有密码,但整份 `compose.env` 仍注入所有容器,
|
|
192
|
+
不提供容器间密钥隔离。完整联调步骤见 [注册布线与一盒](references/registration-and-onebox.md#44-kafka-接入)。
|
|
193
|
+
|
|
158
194
|
⚠️ 服务账号密钥**不再要求进 envFile**:门户保管并在换版时注入容器,明文只在批准那次一次性
|
|
159
195
|
回显(留给对方本地联调)。收交付物时别再问对方「密钥写进 envFile 了吗」。
|
|
160
196
|
另外,平台级能力(如日志写入)会直接出现在对方的服务令牌里,**不需要在 manifest 里申请**。
|
|
@@ -166,9 +202,9 @@ manifest 还有两节**同形的审批前置闸**(与 `requiredEnv` 同一挂
|
|
|
166
202
|
- `deployRequirements`(`{ region?, size?, gpu?, network? }`)—— 这个 App 的后端需要什么样的
|
|
167
203
|
机器。批准那一刻按本环境的资源池逐维匹配,不满足就拒绝生效;通过时把落点固定到命中的
|
|
168
204
|
那台。**需要 `deployDescriptor`**,且只收**名字与档位** —— 网段 / IP / URL 提交即拒。
|
|
169
|
-
- `requiredServices`(`[{ name, kind, note
|
|
205
|
+
- `requiredServices`(`[{ name, kind, note? }]`)—— 运行需要哪些外部服务。批准时比对
|
|
170
206
|
本环境**已登记**的「已具备服务」(控制台 › 平台设置 › App 清单目录),未登记或缺条目就
|
|
171
|
-
|
|
207
|
+
拒绝生效。登记表描述已有服务;支持自动供给的类型还会按所选档案为 App 建资源与注入约定键。
|
|
172
208
|
|
|
173
209
|
收交付物时按这两节问三个问题:**它要跑在哪个网络里**(对方写的名字与本环境登记的名字对不
|
|
174
210
|
对得上)、**它连的那些基础服务本环境有没有并且登记了没有**、以及**远端主机上没有门户的
|
|
@@ -254,7 +290,7 @@ compose 网络** —— 一份在一盒里能跑的 descriptor,`env` 里写着
|
|
|
254
290
|
App,门户在 TDT 签发时收口,App 侧零代码)/ `seatRoles`(App 自管账号或资源,门户只发数、
|
|
255
291
|
App 自己在建号路径上收口)。
|
|
256
292
|
- **role 由对方在 `app.manifest.json` 里声明**(不需要门户改代码);**各套餐的数值进不了
|
|
257
|
-
manifest
|
|
293
|
+
manifest**,只有平台管理员在控制台能写 —— 应用侧一条写路径都没有。
|
|
258
294
|
这是有意的:数值是商务面,改它等于改可售卖档位。
|
|
259
295
|
- 对接面只有一个:`POST /api/v1/seats/quota`(服务态令牌 + `seats.read`)。**`available === null`
|
|
260
296
|
⇒ 该租户 unlimited,放行、不要收口** —— 把 null 当 0 是这个契约最容易踩的一处。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 对接契约文档模板(外部服务 → 平台)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 本模板自包含,可直接在 App 仓库填写。每个外部服务接入前都要按此结构交一份契约文档,且**与已实现代码 1:1 对齐**(理想状态:有回归测试保证路由表与代码同步)。没有这份文档的接入不算完成。
|
|
4
4
|
|
|
5
5
|
按节填写,方括号处替换:
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 外部镜像服务类应用 · 集成契约
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 本文是可在 App 仓库独立使用的契约参考;能力以目标平台已发布版本和管理员配置为准。
|
|
4
4
|
|
|
5
5
|
## 1. 形态与分界
|
|
6
6
|
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
| | 内建 App | 外部镜像 App |
|
|
10
10
|
| --- | --- | --- |
|
|
11
11
|
| 镜像 | 全部长在同一 runtime 镜像 | 独立镜像(`docker save` tar / 私有 registry,不发公共 dockerhub) |
|
|
12
|
-
| 部署 | deploy-controller 按需拉起/缩零 |
|
|
13
|
-
| 注册 | seed / bootstrap 内建 | `app.manifest.json` + register-app
|
|
12
|
+
| 部署 | deploy-controller 按需拉起/缩零 | 由平台按部署描述交付;支持的部署驱动和副本能力须与管理员确认 |
|
|
13
|
+
| 注册 | seed / bootstrap 内建 | `app.manifest.json` + register-app(本地一盒)/ 发布提案审批(生产) |
|
|
14
14
|
|
|
15
15
|
**App 类型**:有用户前端 → `micro`(前端 dist 由平台同源托管到 `/apps/<key>/`);无前端 → **`service`**(headless:应用市场/应用中心不露卡、不可打开,仅作被调用方;平台控制台清单管理仍可治理,可作依赖被补装)。
|
|
16
16
|
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
## 3. 运行时鉴权(四道闸)
|
|
33
33
|
|
|
34
|
-
每个受保护请求:取 `Authorization: Bearer <TDT 或端点已接纳的长期凭证>` → 调门户自省并校验声明 → 四道闸。Bun/TypeScript
|
|
34
|
+
每个受保护请求:取 `Authorization: Bearer <TDT 或端点已接纳的长期凭证>` → 调门户自省并校验声明 → 四道闸。Bun/TypeScript 使用服务端 SDK `@xgent/portal-server-sdk`(`createPortalAuthenticator`,从平台私有包仓安装,不 vendor);其他语言实现下述相同契约。
|
|
35
35
|
|
|
36
36
|
```
|
|
37
37
|
POST {PORTAL_INTROSPECT_URL} # 如 http://portal-api:3000/api/tokens/introspect
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 公开页面、站点与应用身份迁移
|
|
2
|
+
|
|
3
|
+
本文说明当前接入方式;能力是否已部署到目标门户,要用实际接口和浏览器确认。发布审核通过与后端健康都不能代替公开页面验收。
|
|
4
|
+
|
|
5
|
+
## 1. 先选入口
|
|
6
|
+
|
|
7
|
+
| 需求 | 入口 | 前提 |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| 匿名 SPA、分享页面 | `/apps/<listingKey>/…` | 匿名页不先强制 SDK 登录;读取的数据仍需业务授权 |
|
|
10
|
+
| 后端直接返回 HTML、公开回调 | `/svc/<listingKey>/…` | 平台去掉服务前缀;App 自己区分匿名与受保护路由,公开服务应常驻 |
|
|
11
|
+
| 租户站点、独立域名 | `publicEntrypoints` + Sites 服务 | 入口声明、服务特权、平台站点配置、租户权益及路由就绪 |
|
|
12
|
+
|
|
13
|
+
前两条已经是正式接入方式,不需要为了每个新 App 请求门户增加根级路径。
|
|
14
|
+
`publicEntrypoints` 是**站点可以绑定的后端入口目录**,不是“在门户根路径新增一条代理”。
|
|
15
|
+
仅声明它,不会让门户根级 `/v`、`/share` 等路径指向你的服务。
|
|
16
|
+
历史根路径属于兼容契约,需要与平台约定数据迁移和切换,不可自行复用或覆盖。
|
|
17
|
+
|
|
18
|
+
## 2. 后端直出页必须认识外部路径
|
|
19
|
+
|
|
20
|
+
例如外部 `/svc/demo/v/abc` 转到后端 `/v/abc`。后端路由可以继续用 `/v`,
|
|
21
|
+
但发给浏览器的 URL 必须包含外部 base:公开链接、表单 action、fetch、资源引用、
|
|
22
|
+
重定向 Location、口令 cookie 的 Path,以及受保护预览的票据交接。
|
|
23
|
+
|
|
24
|
+
将这些地址集中从可信的 public base 配置生成;不要只修改“复制链接”字段。
|
|
25
|
+
不要信任任意请求自报的 Host 或转发前缀生成外部地址。不同入口的 cookie 名/Path 应避免冲突。
|
|
26
|
+
仅换前缀会破坏既有 App 时,应先发布完整路径适配版本,再切换正式链接。
|
|
27
|
+
|
|
28
|
+
后端 HTML 自己设置 CSP;`embedCsp` 是前端 `/apps/<key>/` 托管策略,不会替代后端公开页的策略。
|
|
29
|
+
匿名可达不等于数据公开:token、口令、过期、撤销、租户边界、数据源与提交配额仍由 App 验证。
|
|
30
|
+
|
|
31
|
+
## 3. 复用已有 Sites 能力
|
|
32
|
+
|
|
33
|
+
清单片段(合并到自己完整 manifest;特权 reason 写实际用途):
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"publicEntrypoints": [{ "key": "pages", "pathPrefix": "/public" }],
|
|
38
|
+
"privilegedServiceScopes": [
|
|
39
|
+
{ "scope": "sites.read", "reason": "查询本应用在本租户的站点和域名就绪状态" },
|
|
40
|
+
{ "scope": "sites.write", "reason": "为本应用在本租户创建公开站点并管理域名" }
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
同时在既有 `deployDescriptor` 中设置 `alwaysOn: true`。入口最多 8 条;key 小写字母开头,
|
|
46
|
+
只含小写字母、数字、连字符,最长 40;pathPrefix 是后端站内绝对路径,不能是 URL,
|
|
47
|
+
不能有 query、fragment、点段、空段或控制字符。末尾斜杠会归一化。
|
|
48
|
+
省略 publicEntrypoints 保留既有登记;`[]` 弃用所有入口,会影响引用它们的站点。
|
|
49
|
+
|
|
50
|
+
申报走发布提案治理审核。`sites.read/write` 是服务专用权限,写进
|
|
51
|
+
`privilegedServiceScopes` 申请并由管理员批准,不能放入用户 `scopes` 或普通 `serviceScopes`。
|
|
52
|
+
|
|
53
|
+
平台须打开 `PUBLIC_SITES_ENABLED`,配置站点 baseDomain/入口 DNS,租户具有
|
|
54
|
+
`sites.enabled`、`portal.public_sites`,绑定自定义域时还需 `portal.custom_site_domains`。
|
|
55
|
+
没有这些前提,应向平台明确反馈缺哪一项,不能仅因声明批准就发链接。
|
|
56
|
+
|
|
57
|
+
后端以自己的服务账号,逐租户换取 `client_credentials` 服务票,调用:
|
|
58
|
+
|
|
59
|
+
1. `POST /api/v1/sites { siteKey, entrypointKey, name? }`,同租户、App、siteKey 幂等。
|
|
60
|
+
响应 Envelope 的 `data.site` 含站点事实;平台地址由返回的 code 与平台配置派生,不硬编码域名。
|
|
61
|
+
2. 需要自定义域名时 `POST /api/v1/sites/:id/domains { domain, operationKey }`,
|
|
62
|
+
按返回挑战配置 TXT 和入口 DNS,再 `POST /api/v1/sites/:id/domains/:domainId/check`。
|
|
63
|
+
3. 四项 ownership/dns/tls/routing 全过才把该域名视为 ready。
|
|
64
|
+
`GET /api/v1/sites/:id` 回读站点修订,路由 appliedRevision 到达目标 revision 才算送达。
|
|
65
|
+
4. 暂停用 `POST /api/v1/sites/:id/suspend`;域名释放和归档按响应的修订做并发检查,
|
|
66
|
+
不靠删 manifest 字段假装已经清理完。
|
|
67
|
+
|
|
68
|
+
租户与应用从服务票推导,不能用请求体指定其他租户。
|
|
69
|
+
站点请求按 pathPrefix 重写并保留 query;App 必须适配站点外部 URL。
|
|
70
|
+
边缘路由头用于选站而非登录凭证;站点路径会剥除门户 `xg_sess`,
|
|
71
|
+
受保护预览需自己的票据交接,不能依赖门户会话 cookie 跨到独立域名。
|
|
72
|
+
|
|
73
|
+
## 4. 改 listingKey 是身份迁移
|
|
74
|
+
|
|
75
|
+
改显示名不需要换 key。确需换 key 时,它是新的 aud、服务身份、安装身份和资源所有者,
|
|
76
|
+
不能只重发同一镜像或复制业务数据库。迁移必须覆盖旧公开链接、页面版本、口令/撤销/过期、
|
|
77
|
+
文件应用空间与授权、内容 schema、加密字段及新旧写入归属。
|
|
78
|
+
|
|
79
|
+
在双方确认迁移和回滚前保留旧数据库、服务和路由。不能用 HTTP 404、HTTP 200 或 HTML
|
|
80
|
+
标题猜 token 属于哪个服务;“不存在”可能返回 200 占位页。切回路由也不会自动搬回新产生的数据。
|
|
81
|
+
|
|
82
|
+
## 5. 验收与交接
|
|
83
|
+
|
|
84
|
+
至少检验:正式匿名页真实正文;有效/口令/过期/撤销;GET 与 POST 子请求;cookie/Location;
|
|
85
|
+
有权与错误/过期预览;跨租户拒绝;重部署后地址仍可用。HTTP 200 和 `/health` 通过都不够。
|
|
86
|
+
|
|
87
|
+
反馈平台时交提案号、镜像/版本、失败路径形状、时间、脱敏错误与浏览器 CSP 指令;
|
|
88
|
+
不贴链接 token、口令、服务密钥。区分缺少接入说明、平台能力不足与 App 路径适配问题。
|
|
89
|
+
|
|
90
|
+
## 6. 扩展 CSP 与交付能力门
|
|
91
|
+
|
|
92
|
+
开发版本已实现 embedCsp 六类精确来源(connectSrc/scriptSrc/styleSrc/fontSrc/imgSrc/mediaSrc),
|
|
93
|
+
以及 platformSources 在 script/style/font/connect 四类中的 jsCdn 别名。它只作用于 /apps 托管前端,
|
|
94
|
+
不能替代本后端 HTML 的 CSP。生产来源须 HTTPS(connect 另可 WSS),不可通配、带路径/凭据或
|
|
95
|
+
unsafe-inline/unsafe-eval 等关键字;增删均需治理审核。省略沿用、null 清空,对象完整替换。
|
|
96
|
+
|
|
97
|
+
这些能力尚待正式发布与目标门户受控启用,strict 缺省关闭,不能从已有包版本或 whoami 推断已开启。
|
|
98
|
+
支持 delivery 的门户按 proposalId 分别确认审批、清单/产物、实际后端及网关;纯前端也等网关。
|
|
99
|
+
unknown 不能报成功,superseded 查询后续提案;旧门户无 delivery 时 CLI 明示无法核验网关。
|
|
100
|
+
网关失败由平台管理员单独重试,不必重发镜像。Sites 权限与站点修订仍按本文独立核验。
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# 配额与席位(seatBased / seatRoles)
|
|
2
2
|
|
|
3
|
-
> 有「每租户最多能建几个 X
|
|
4
|
-
> `packages/shared/src/constants.ts`、`apps/api/src/db/provisioning.ts`(门户仓文件,App 自己的
|
|
5
|
-
> repo 里没有;本文件已自包含)。冲突时以门户仓库为准。
|
|
3
|
+
> 有「每租户最多能建几个 X」这类诉求时读本文。App 声明角色和用量指标,平台管理员维护套餐数值;不需要访问门户源码。
|
|
6
4
|
|
|
7
5
|
## 0. 红线
|
|
8
6
|
|
|
@@ -17,12 +15,12 @@
|
|
|
17
15
|
|
|
18
16
|
两者都是 listing 上的标记,且**仅 backed listing** 可声明 —— end-state 得有 `serviceBaseUrl` 或
|
|
19
17
|
`deployDescriptor`,否则 `createListing`/`updateListing` 直接 `VALIDATION_FAILED`:「只有带独立后端
|
|
20
|
-
(serviceBaseUrl / 部署描述)
|
|
18
|
+
(serviceBaseUrl / 部署描述)的应用可声明席位制」。
|
|
21
19
|
|
|
22
20
|
| | 用在哪 | 谁收口 |
|
|
23
21
|
| --- | --- | --- |
|
|
24
22
|
| `seatBased: true` | 计「门户成员」用不用得了这个 App | **门户**。TDT 签发时就拦:无席位 ⇒ `SEAT_REQUIRED`,App 侧零代码 |
|
|
25
|
-
| `seatRoles: ["teacher","student"]` | App
|
|
23
|
+
| `seatRoles: ["teacher","student"]` | App **自管账号/资源**(学校管理 `lms-school` 的师生号那类) | **App 自己**。门户只发数,不拦对方的建号请求 |
|
|
26
24
|
|
|
27
25
|
## 2. 四要素分属四个事实源
|
|
28
26
|
|
|
@@ -30,14 +28,13 @@
|
|
|
30
28
|
|
|
31
29
|
| 要素 | 谁写 / 写在哪 | 要门户发版吗 |
|
|
32
30
|
| --- | --- | --- |
|
|
33
|
-
| role 存不存在(`seatRoles: ["service"]`) | **对方自己的 `app.manifest.json
|
|
31
|
+
| role 存不存在(`seatRoles: ["service"]`) | **对方自己的 `app.manifest.json`** | 不用 |
|
|
34
32
|
| 各套餐给几个(生效值) | 平台管理员 → `PUT /api/console/seat-plans` upsert `app_seat_quotas(listing_key, plan, role)` | 不用 |
|
|
35
33
|
| 单租户加购 | 平台管理员 → `PUT /api/console/tenants/:id/seat-addons`(仅 pro/ultra 可加购) | 不用 |
|
|
36
|
-
| role 的三语标签 `SEAT_ROLE_LABELS` |
|
|
37
|
-
| SA 的 `seats.read` | **对方 manifest `privilegedServiceScopes: [{scope, reason}]` 申请** →
|
|
34
|
+
| role 的三语标签 `SEAT_ROLE_LABELS` | 平台维护的本地化标签(联系管理员) | **要**(不加则控制台显示裸 role key,`?? role` 兜底不报错) |
|
|
35
|
+
| SA 的 `seats.read` | **对方 manifest `privilegedServiceScopes: [{scope, reason}]` 申请** → 「发布审核」逐条确认批准即授予 | 不用 |
|
|
38
36
|
|
|
39
|
-
⚠️ **各套餐的数值进不了 manifest
|
|
40
|
-
都只有 `seatBased` / `seatRoles` 两个字段,没有任何 per-plan 数值字段。应用侧**没有任何写路径**
|
|
37
|
+
⚠️ **各套餐的数值进不了 manifest** —— App 清单只有 `seatBased` / `seatRoles` 两个字段,没有任何 per-plan 数值字段。应用侧**没有任何写路径**
|
|
41
38
|
(manifest 没这字段 · 发布提案携带的未知字段一律进人工审而非生效 · `seats.read` 只读)。这是有意的:
|
|
42
39
|
数值是商务面,改它等于改可售卖档位、影响所有租户。应用侧能做的是在契约里**提议**一组数。
|
|
43
40
|
|
|
@@ -66,11 +63,7 @@
|
|
|
66
63
|
- 写进 manifest 后随 `publish --manifest` 提交 —— `seatRoles` 是治理档,提案进「发布审核」
|
|
67
64
|
等平台批准后生效(`register-app --prod` / 控制台「导入 manifest」是运维兜底路径,同一段
|
|
68
65
|
`registerFromManifest`)。
|
|
69
|
-
-
|
|
70
|
-
里 —— 清单唯一事实源就是对方仓的 manifest,不存在双事实源问题;**别把定义加回门户**
|
|
71
|
-
(verify-split「清单零残留」棘轮看守)。
|
|
72
|
-
- 仓内 App 在 `LISTING_DEFS` 加 `seatRoles` **不用 bump version**:它走「代码权威
|
|
73
|
-
字段」通道,每次部署都对齐,跟版本治理无关。
|
|
66
|
+
- App 自己仓库的 manifest 是开发者声明的事实源;修改后提交新提案,并核对已安装租户的同步结果。
|
|
74
67
|
|
|
75
68
|
## 4. 对接面与三态
|
|
76
69
|
|
|
@@ -100,7 +93,7 @@ body { roles: ["service","node"] }
|
|
|
100
93
|
|
|
101
94
|
平台不掌握 `seatRoles` 的占用数(收口在 App 侧),所以「已用」来自 App 自己上报的日快照:
|
|
102
95
|
metricKey 约定 `<listingKey>.<role>-seats.allocated`(`latestRoleAllocated` 读最近一天)。
|
|
103
|
-
|
|
96
|
+
学校管理(`lms-school`)先例每个 role 报两条(`allocated` + `available`),两个 role 共 4 条。
|
|
104
97
|
|
|
105
98
|
⚠️ **硬门**:`ingestUsage` 对**未注册**的 metricKey **拒收该条记录**,且指标的
|
|
106
99
|
`appKey` 必须等于上报者的 azp。漏注册的症状是上报接口返 200 但记录进 `rejected`,
|
|
@@ -110,7 +103,7 @@ sms 先例每个 role 报两条(`allocated` + `available`),两个 role 共
|
|
|
110
103
|
**外部 App 在自己 manifest 的 `usageMetrics` 里声明 gauge 条目**
|
|
111
104
|
(`[{ key, kind: "gauge", unit: "count", label: {zh,…} }]`,key 前缀必须=listingKey、
|
|
112
105
|
金额单位 microAmount 不开放;治理档,批准后生效)——不再需要门户发版;
|
|
113
|
-
|
|
106
|
+
平台内建指标由平台维护,外部 App 无需修改平台代码。
|
|
114
107
|
|
|
115
108
|
## 6. 两层快照:谁读哪一层
|
|
116
109
|
|
|
@@ -122,12 +115,7 @@ sms 先例每个 role 报两条(`allocated` + `available`),两个 role 共
|
|
|
122
115
|
| 租户加购 `getTenantAddons` | **`apps.seat_roles`(已装租户快照)** |
|
|
123
116
|
| `POST /api/v1/seats/quota` | **两者都不读** —— roles 来自请求体,只查 plan + 配额表 + 加购表 |
|
|
124
117
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
- `LISTING_DEFS` 路:`syncFromSource` 对 listing 层与已装 `apps` 行**各打一次**
|
|
128
|
-
`codeAuthoritativePatch`(union 语义),随 `bootstrap:prod` 自动到达。
|
|
129
|
-
- manifest 路:`updateListing` 直接批量 update 所有已装 `apps` 行,`registerFromManifest` 之后
|
|
130
|
-
还会再跑一次 `syncInstalledAppsFromListing`。
|
|
118
|
+
**已批准的 manifest 变更会同步到已安装租户。** 发布后核对控制台配额矩阵与租户加购面;异常交平台管理员处理,不直接修改平台数据库。
|
|
131
119
|
|
|
132
120
|
推论:**漏声明不会 fail-closed**。`/api/v1/seats/quota` 不读任何 seatRoles 声明,照样按请求体里的
|
|
133
121
|
role 返回兜底值。真实症状是**控制台配额矩阵与加购面不出这一行** ⇒ 平台配不了、租户加购不了
|
|
@@ -138,7 +126,6 @@ role 返回兜底值。真实症状是**控制台配额矩阵与加购面不出
|
|
|
138
126
|
- **manifest 的 `seatRoles` 是整份覆盖,不是 union**(`updateListing`,改动还会批量传播到所有已装
|
|
139
127
|
租户的 `apps` 行)。下一版 manifest 少写一个 role ⇒ 那个 role 从所有租户消失。清单字段
|
|
140
128
|
「只增不减」那条规矩管的是 scopes/dependencies/exchangeTargets,**不覆盖 `seatRoles`**。
|
|
141
|
-
(走 `LISTING_DEFS` 那条是 union,不会静默删。)
|
|
142
129
|
- **role 名没有格式校验,改名 = 换一个新 role**:旧 `(listing_key, plan, role)` 配额行成孤儿 ——
|
|
143
130
|
全仓没有任何地方删它们,`getSeatPlans` 只按当前 `seatRoles` 出行,于是孤儿行在控制台不可见
|
|
144
131
|
却还躺在库里(改回同名会「复活」旧数值),而新 role 悄悄回落兜底。**role 名定下来就别动。**
|
|
@@ -198,13 +185,7 @@ role 返回兜底值。真实症状是**控制台配额矩阵与加购面不出
|
|
|
198
185
|
4. (可选)门户 `SEAT_ROLE_LABELS` 加三语标签 —— 唯一仍要门户发版的一件;不加则控制台显示裸 role key
|
|
199
186
|
5. 批准部署后,平台管理员在控制台按 `App × role × 套餐` 配一轮真实数值
|
|
200
187
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
1. `LISTING_DEFS[<key>]` 加 `seatRoles: [...]`
|
|
204
|
-
2. `SEAT_ROLE_LABELS` 加三语标签;`SEAT_ROLE_DEFAULTS` 加各档默认值(可选;不加则一律兜底 1)
|
|
205
|
-
3. `USAGE_METRICS` 加 gauge 条目(每 role 两条)
|
|
206
|
-
4. `SA_DEFS[<key>].serviceScopes` 加 `seats.read`
|
|
207
|
-
5. 部署后控制台配数值
|
|
188
|
+
**平台管理员**:维护套餐/加购数值与可选本地化标签;App 团队不能用发布令牌修改这些配置。
|
|
208
189
|
|
|
209
190
|
**App 侧**
|
|
210
191
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 注册布线与一盒(one-box)本地联调
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 本文是可在 App 仓库独立使用的契约参考;能力以目标平台已发布版本和管理员配置为准。
|
|
4
4
|
|
|
5
5
|
## 1. `app.manifest.json`(单一事实源,放你自己的 repo)
|
|
6
6
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
`scopeLabels` 同时是那个勾选列表的正文——不写就只显示裸 scope 串。
|
|
16
16
|
- 关系:`dependencies`、`exchangeTargets`、`serviceBaseUrl`(`/svc/<listingKey>`)
|
|
17
17
|
- 服务态与计量:`usageReporter`(true ⇒ SA 得 `client_credentials` + `usage.report`)、`serviceScopes`(服务态 scope;SERVICE_ONLY **永拒**)、`privilegedServiceScopes`(SERVICE_ONLY 的**申请**:`[{scope, reason}]`,reason 必填,最高治理档、审批逐条确认后授予)、`usageMetrics`(用量指标声明:key 前缀必须=listingKey、金额单位不开放;治理档,批准后 ingest 才认这些 key)
|
|
18
|
-
- 部署/运维:`requiredEnv`(部署所需 env 的**键名**清单,值永远由平台配;元素可写 `{ key, renamedFrom }` 表达改名。键集合一变提案转入「发布审核」,且**批准前门户会比对 `descriptor.env ∪ envFile` 的键集合,缺了拒绝生效**(`REQUIRED_ENV_MISSING`,提案留 pending))、`deployDescriptor`(`image` 归自动档、`hostPort` 归平台不算变更,**其余一切属治理档**)、`deployRequirements`(后端要跑在**什么样的机器**上:`{region?, size?, gpu?, network?}`,只写**名字与档位**,网段/IP/URL 提交即拒;批准时按目标环境**当时**的资源池逐维匹配,不满足则拒绝生效、提案留待审,通过则把首次落点固定住;需要 `deployDescriptor`)、`requiredServices`(运行所需的**外部服务** `[{name, kind, note
|
|
18
|
+
- 部署/运维:`requiredEnv`(部署所需 env 的**键名**清单,值永远由平台配;元素可写 `{ key, renamedFrom }` 表达改名。键集合一变提案转入「发布审核」,且**批准前门户会比对 `descriptor.env ∪ envFile` 的键集合,缺了拒绝生效**(`REQUIRED_ENV_MISSING`,提案留 pending))、`deployDescriptor`(`image` 归自动档、`hostPort` 归平台不算变更,**其余一切属治理档**)、`deployRequirements`(后端要跑在**什么样的机器**上:`{region?, size?, gpu?, network?}`,只写**名字与档位**,网段/IP/URL 提交即拒;批准时按目标环境**当时**的资源池逐维匹配,不满足则拒绝生效、提案留待审,通过则把首次落点固定住;需要 `deployDescriptor`)、`requiredServices`(运行所需的**外部服务** `[{name, kind, note?}]`,身份是 `(kind, name)` 二元组;批准时比对本环境**已登记**的「已具备服务」,未登记或缺条目则拒绝生效 —— 登记表核对已有服务;支持自动供给的类型按选定档案建资源并注入约定键,不收 `envKey`)
|
|
19
19
|
|
|
20
20
|
⚠️ **`deployDescriptor.hostPort`(宿主机发布口)不归 App 定**:它是部署环境相关的事实——同一份 manifest 会发到一盒与好几套生产门户,各自端口地貌不同,而 App 团队看不见目标机器上谁占了什么。规则三句话:**首次注册**当建议值采纳(撞了自动退让到平台端口池 20000–20999,**不会因此拒掉注册**);**listing 已存在则一律忽略**(那个口已经写进 Caddy 的 `/svc` map、也是在跑的容器发布出来的口);发布响应的 `warnings` 会说明实际是哪个口。App 只管 `port`(容器内监听口,约定 8080)。
|
|
21
21
|
**例外**:`extraPorts[].host` **不参与退让**,撞了硬拒——那些是对外契约口(worker 节点连的就是那个数字),静默挪走等于把它们全断掉,且门户侧一条都测不到。
|
|
@@ -48,6 +48,10 @@
|
|
|
48
48
|
|
|
49
49
|
## 2. 注册(dev / 一盒):`register-app`
|
|
50
50
|
|
|
51
|
+
**公开面另有接入契约**:普通匿名页面走 `/apps/<key>/…` 或 `/svc/<key>/…`;
|
|
52
|
+
独立域名用 `publicEntrypoints` + Sites。入口声明不会自动接管门户根路径。
|
|
53
|
+
完整步骤、服务特权申请与 key 迁移见 [public-entrypoints.md](public-entrypoints.md)。
|
|
54
|
+
|
|
51
55
|
```bash
|
|
52
56
|
bun run register-app <你的>.manifest.json # 幂等;NODE_ENV=production 拒跑
|
|
53
57
|
```
|
|
@@ -108,10 +112,7 @@ provisioning 路径)能写。所以装完第一个租户后的那次重跑仍
|
|
|
108
112
|
生产的清单事实源就是对方仓的 `app.manifest.json`:平台在控制台
|
|
109
113
|
「应用市场 › 接入新应用」按 key 签发 `xrel_` 令牌(无行先建 draft 占位),对方
|
|
110
114
|
`publish --manifest` 提交,平台在「发布审核」批准 = `registerFromManifest` 建全
|
|
111
|
-
|
|
112
|
-
门户只保留平台侧事实(`EXCHANGE_WIRING` / Caddy 内联行 / 部署行,及作为**种子**的
|
|
113
|
-
`SA_DEFS` 与 scope 常量 —— 特权 scope 已可经 `privilegedServiceScopes` 申请、审批授予),
|
|
114
|
-
`bootstrap:prod` 对外部 key 只自愈 SA 与部署行。**生产没有 manifest 明文密钥这条路**:
|
|
115
|
+
(清单、服务账号与已装租户对齐,后端部署和网关交付随后独立核验)。App 团队无需修改门户源码;平台配置由管理员管理。**生产没有 manifest 明文密钥这条路**:
|
|
115
116
|
SA 密钥与交换发起方密钥(`<PREFIX>_APP_SECRET`)都由平台在批准时生成、enc:v1 保管、
|
|
116
117
|
换版时注入容器(EXCHANGE-SECRET-HOLD);明文只回显给审批人一次(供本地联调),轮换走
|
|
117
118
|
控制台(应用清单 ›「轮换交换密钥」/ 服务账号 ›「轮换密钥」),都顺带排换版。要交接一枚
|
|
@@ -136,11 +137,31 @@ SA 密钥与交换发起方密钥(`<PREFIX>_APP_SECRET`)都由平台在批
|
|
|
136
137
|
匿名拉取,得有一个 **puller 账号**(只读凭证,按团队发放),`docker login <registry>` 用的就是它;
|
|
137
138
|
凭证别转发给团队外的人、别写进会提交的文件(`portal-dev-setup` skill 把这两样收在一份
|
|
138
139
|
`.xgent-registry.env` 里,照它配即可)。② **这两个调试镜像有 `latest`**(跟着最新一版走,开新项目
|
|
139
|
-
不用先问 tag);代价是本地已有同名 `latest` 时 compose
|
|
140
|
+
不用先问 tag);代价是本地已有同名 `latest` 时 compose **不回仓库查**,沿用 latest 先 `onebox.sh pull` 更新缓存,再 `upgrade` → `up` 同步资产。
|
|
140
141
|
要钉住某一版就写 `:v<版本>-<7位sha>`(当前 `v1.1.0-5c1660e`),那种 tag 不可变。③ **一盒只发 `arm64`**(它是给开发机用的调试底座,开发机全是
|
|
141
142
|
Apple Silicon),生产门户走另一条链。无 registry 访问时则要离线 `docker save` tar,`docker load` 即可
|
|
142
143
|
(那条路上镜像的本地 tag 可能叫 `ai-portal-one-box:local` / `xgent-ai-portal-proxy:local`)。
|
|
143
144
|
|
|
145
|
+
已有一盒不要重跑 `init --force` 来升级。使用已安装 `portal-dev-setup` skill 的脚本:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
S="<portal-dev-setup 的 SKILL.md 所在目录>/scripts/onebox.sh"
|
|
149
|
+
"$S" upgrade --image <registry>/<项目>/one-box:v<版本>-<sha>
|
|
150
|
+
"$S" up
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
初始化是 `init` → `up`;升级是 `upgrade` → `up`;主动删数据重置才是 `dc down -v` → `init --force` → `up`。
|
|
154
|
+
升级保留 `compose.env`、`generated/`、`backup/`、端口、密钥和卷,只追加变更的镜像/版本行,
|
|
155
|
+
不重生成配置。两个目标镜像都已缓存时支持离线升级;沿用 latest 先 `pull`,再 `upgrade` → `up`。
|
|
156
|
+
`up` 仍重种门户库(租户/用户/清单/安装),不会重种 App 自己的数据库。
|
|
157
|
+
数据库启动前按现有 PG_VERSION 保留大版本和挂载布局;未知/冲突布局拒绝启动,不能用删卷来解决。
|
|
158
|
+
门户升级不执行 PostgreSQL 大版本迁移,后者需要单独备份与维护窗口。
|
|
159
|
+
|
|
160
|
+
对象存储是 RustFS,原 `MINIO_*` 与 `minio:9000` 地址继续使用。`up`/`add`/建桶都先通过迁移门,
|
|
161
|
+
旧 MinIO 卷复制到新卷并核对后才提交;原卷及 `backup/` 的镜像归档、清单、回退入口保留。
|
|
162
|
+
提交后新卷是权威;有新写入时回退入口会隔离 RustFS 并拒绝切回旧卷,需在副本上人工验证后恢复,
|
|
163
|
+
不能通过删新卷或 `down -v` 处理升级失败。完整恢复步骤见 `portal-dev-setup` §6。
|
|
164
|
+
|
|
144
165
|
### 4.1 一盒里有什么,以及刻意没有什么
|
|
145
166
|
|
|
146
167
|
一盒是**调试底座,不是门户**:它按 `deploy/onebox/Dockerfile` 单独构建,只带四个**基础服务 App**——
|
|
@@ -158,11 +179,12 @@ Apple Silicon),生产门户走另一条链。无 registry 访问时则要离
|
|
|
158
179
|
|
|
159
180
|
### 4.2 起栈之前:躲开本机已占的端口与项目名
|
|
160
181
|
|
|
161
|
-
|
|
162
|
-
`POSTGRES_PORT`、redis 6379 → `REDIS_PORT`、
|
|
182
|
+
一盒发布 reverse-proxy 80/443 → `HTTP_PORT`/`HTTPS_PORT`、postgres 5432 →
|
|
183
|
+
`POSTGRES_PORT`、redis 6379 → `REDIS_PORT`、RustFS 9000/9001 → `MINIO_PORT`/`MINIO_CONSOLE_PORT`,
|
|
184
|
+
以及 Kafka HOST → `KAFKA_PORT`(自动避让 9092/19092/29092)、EXTERNAL → `KAFKA_EXTERNAL_PORT`(默认回环 9095,不自动避让);
|
|
163
185
|
其余(portal-api 的 3000、各 `<key>-server` 的 8080、你的 app-backend 的 8080)只 `expose`,不占宿主。
|
|
164
186
|
撞了就在 `compose.env` 里改这几个;改的只是发布口,一盒内部一律走 compose 网络的
|
|
165
|
-
`postgres:5432` / `redis:6379` / `minio:9000
|
|
187
|
+
`postgres:5432` / `redis:6379` / `minio:9000`(RustFS 的兼容别名)。控制台路径为 `/rustfs/console/`。改了 `HTTP_PORT` 之后门户地址随之变化,下文冒烟里的
|
|
166
188
|
`http://localhost/…` 都要跟着改。
|
|
167
189
|
|
|
168
190
|
⚠️ 两个必改/必不做:
|
|
@@ -184,7 +206,8 @@ Apple Silicon),生产门户走另一条链。无 registry 访问时则要离
|
|
|
184
206
|
# cat deploy/app-devkit/compose.env.app.example >> deploy/compose.env
|
|
185
207
|
# 填 XGENT_IMAGE / XGENT_PROXY_IMAGE / APP_KEY / APP_IMAGE /(micro)APP_FRONTEND_DIST
|
|
186
208
|
# + 你后端读的 SA 密钥与 DSN(与 manifest 的 serviceAccount.secret 等值)+ 强随机门户密钥
|
|
187
|
-
# 2)
|
|
209
|
+
# 2) 仅全新环境起基础设施: --profile local-infra up -d postgres redis rustfs
|
|
210
|
+
# 存量一盒先按下面的升级路径处理;不要直接起 rustfs。
|
|
188
211
|
# 3) 门户迁移 + 基线 seed:
|
|
189
212
|
# run --rm portal-api bun run db:migrate
|
|
190
213
|
# run --rm portal-api bun run db:seed:onebox # ★ 不是 db:seed
|
|
@@ -216,6 +239,39 @@ Apple Silicon),生产门户走另一条链。无 registry 访问时则要离
|
|
|
216
239
|
细节(含 App 自带基础设施如向量库 sidecar、把后端跑在宿主上保留热重载的 socat 绕法)见交付包内
|
|
217
240
|
`deploy/app-devkit/README.md`。
|
|
218
241
|
|
|
242
|
+
### 4.4 Kafka 接入
|
|
243
|
+
|
|
244
|
+
以 `listingKey: "order-worker"` 为例,清单包含:
|
|
245
|
+
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"requiredServices": [{ "kind": "kafka", "name": "main" }],
|
|
249
|
+
"requiredEnv": [
|
|
250
|
+
"ORDER_WORKER_KAFKA_BROKERS", "ORDER_WORKER_KAFKA_USERNAME",
|
|
251
|
+
"ORDER_WORKER_KAFKA_PASSWORD", "ORDER_WORKER_KAFKA_SASL_MECHANISM",
|
|
252
|
+
"ORDER_WORKER_KAFKA_TOPIC_PREFIX"
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
用新版 `portal-dev-setup/scripts/onebox.sh add order-worker --manifest ./app.manifest.json --image <镜像>`。
|
|
258
|
+
`add` 会创建 `app_order_worker`,SCRAM-SHA-512 / 8192 次迭代,写入五键;重复执行沿用本地密码。
|
|
259
|
+
容器连接 `kafka:9092`,宿主客户端改用 `127.0.0.1:<KAFKA_PORT>`,机制为 SCRAM-SHA-512、协议为
|
|
260
|
+
SASL_PLAINTEXT。密码写入只显示 `***`;供给失败只告警,检查 Kafka 日志后重跑原命令。
|
|
261
|
+
|
|
262
|
+
主题、消费组、事务 ID 都以 `app.order-worker.` 开头,保留 listingKey 的连字符。平台关闭自动建主题,
|
|
263
|
+
App 必须显式创建、副本数 1;主题授权 CREATE / DELETE / DESCRIBE / DESCRIBE_CONFIGS / READ / WRITE,
|
|
264
|
+
消费组 READ / DESCRIBE / DELETE,事务 ID WRITE / DESCRIBE,全部 PREFIXED。没有 ALTER / ALTER_CONFIGS:
|
|
265
|
+
不能改保留期或增加分区,保留策略由平台决定。前缀外主题、消费组与事务 ID 不可访问。
|
|
266
|
+
|
|
267
|
+
Kafka 是单节点、at-least-once,重启会短暂不可用;App 做重连、去重及处理成功后提交 offset,不能把
|
|
268
|
+
Kafka 当权威业务记录系统。权限按 App 隔离,App 自行实现租户数据隔离。SASL_PLAINTEXT 不加密消息,
|
|
269
|
+
外部口保持回环,跨 VM 开放交给运维配置广告地址与限来源安全组。
|
|
270
|
+
|
|
271
|
+
不要把 `KAFKA_ADMIN_PASSWORD` 写入 App 的 `requiredEnv`。一盒仍将整份 `compose.env` 注入容器,
|
|
272
|
+
只适合可信团队本地联调,不承诺容器间秘密隔离。客户端配置与手工修复命令随 `portal-dev-setup` 的
|
|
273
|
+
`references/kafka.md` 交付,也见门户《平台 Kafka 接入指引》。
|
|
274
|
+
|
|
219
275
|
## 5. 冒烟
|
|
220
276
|
|
|
221
277
|
打开 `http://localhost/` → 登录页的「本地开发账号」按钮(没有就直接开 `/auth/dev/start`)→ 选 `rockie`(租户 admin + 平台管理员)。
|