@xgent-ai/skills 0.3.0 → 0.5.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 +117 -11
- package/bin/xgent-skills.js +269 -9
- package/docs/claude-context-goal-guard.md +125 -0
- package/docs/codex-context-goal-guard.md +110 -0
- package/hooks/claude/context-goal-guard.js +139 -0
- package/hooks/claude/settings.example.json +26 -0
- package/hooks/codex/context-goal-guard.py +189 -0
- package/hooks/codex/hooks.example.json +26 -0
- package/package.json +7 -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 +25 -18
- 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 +5 -1
- 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
|
@@ -40,8 +40,8 @@ S="$SKILL_DIR/scripts/onebox.sh"
|
|
|
40
40
|
|
|
41
41
|
- 要拉平台侧的别的 App 进来陪调:`onebox.sh add <key>`(§2.1),它进的就是这套。
|
|
42
42
|
- 要调你自己的**另一个** App(在另一个 repo):`XGENT_ONEBOX_HOME=<已有 portal-onebox/ 的路径>`
|
|
43
|
-
复用那套栈跑 `register-app` / `dc`;宿主上的 dev 后端则直连一盒的 pg/redis/
|
|
44
|
-
- 不用担心端口打架:init 挑宿主端口时逐个探测退让,一盒的 pg/redis/
|
|
43
|
+
复用那套栈跑 `register-app` / `dc`;宿主上的 dev 后端则直连一盒的 pg/redis/RustFS(§5)。
|
|
44
|
+
- 不用担心端口打架:init 挑宿主端口时逐个探测退让,一盒的 pg/redis/RustFS 落位永远避开
|
|
45
45
|
你本地 dev 栈的 5432/6379/9000-9001(见 §5 的直连表)。
|
|
46
46
|
|
|
47
47
|
## 0. 先备齐三样
|
|
@@ -80,8 +80,8 @@ chmod 600 ./.xgent-registry.env
|
|
|
80
80
|
|
|
81
81
|
### 装 `@xgent/*` 私有包?不需要云账号
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
要装 `@xgent/shared` / `@xgent/portal-sdk` / `@xgent/portal-server-sdk` / `@xgent/portal-ui` 时,
|
|
84
|
+
**别去申请云账号、也别装云厂商 CLI**:拿你的**发布令牌**向门户换一枚 ≤12 h 的只读令牌就行(门户持云凭据):
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
87
|
RELEASE_SKILL_DIR="<xgent-app-release 的 SKILL.md 所在目录>"
|
|
@@ -89,7 +89,12 @@ eval "$(node "$RELEASE_SKILL_DIR/scripts/npm-token.mjs")"
|
|
|
89
89
|
npm install
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
- **还没有发布令牌就停下。** 仓里没有 `.xgent-registry.env`(或里面没有 `XGENT_RELEASE_TOKEN`)⇒ 请开发者
|
|
93
|
+
先去门户「开发者应用」› 你的应用 › 凭证 › **生成配置文件**;应用还没建 ⇒ 先在开发者应用里
|
|
94
|
+
「申请建立应用」,平台管理员批准后才能生成。拿到之前**不许 vendor**:不把 `@xgent/*` 拷进仓、
|
|
95
|
+
不用 `file:` / `link:` / tar 依赖。
|
|
96
|
+
- 报 `NPM_REGISTRY_NOT_CONFIGURED` 是**平台侧**还没配,贴给管理员,你这边不用改任何配置。
|
|
97
|
+
|
|
93
98
|
细节见 `xgent-app-release` skill 的「第 0 步」。
|
|
94
99
|
|
|
95
100
|
## 1. 首次用:一条命令铺好
|
|
@@ -100,7 +105,7 @@ npm install
|
|
|
100
105
|
|
|
101
106
|
不给 `--image` 就取 `<REGISTRY>/<ONEBOX_PROJECT>/one-box:latest`(反代同仓同 tag)——**开新项目不用先去问 tag**。
|
|
102
107
|
`latest` 是**可变指针**:它跟着最新一版走,本地已经有同名镜像时 compose 不会回仓库看一眼,
|
|
103
|
-
|
|
108
|
+
所以沿用 `latest` 升级先 `onebox.sh pull`,再 `upgrade` → `up`(§6),同时更新镜像与部署资产。要钉住某一版(复现一个 bug、或团队统一版本)就显式
|
|
104
109
|
`--image <registry>/<项目>/one-box:v<版本>-<sha>`,那种 tag 是不可变的。
|
|
105
110
|
|
|
106
111
|
它做五件事,都在**你的 repo 根**落到 `portal-onebox/`:
|
|
@@ -111,14 +116,16 @@ npm install
|
|
|
111
116
|
不会让人跑到一半才发现,也不会留下半个空目录。
|
|
112
117
|
1. **从镜像里取出 compose 资产**(`docker create` + `docker cp /app/deploy`)——所以版本天然与镜像对齐,
|
|
113
118
|
不需要门户仓,也不会有「文档里的 compose 和镜像对不上」这种漂移。
|
|
114
|
-
2.
|
|
115
|
-
|
|
116
|
-
|
|
119
|
+
2. **挑空闲端口**。HTTP/HTTPS、pg、redis、RustFS 的 6 个宿主端口逐个探测并退让;
|
|
120
|
+
Kafka HOST 另按 9092/19092/29092 挑选,结果写进 `KAFKA_PORT`。Kafka EXTERNAL 独立默认
|
|
121
|
+
发布回环 9095,若已占用,在 `compose.env` 末尾另设 `KAFKA_EXTERNAL_PORT`;它不参与自动挑选。
|
|
122
|
+
挑出来的 pg/redis/RustFS 端口同时就是你宿主进程直连一盒基建的口(见 §5 的直连表)。
|
|
117
123
|
3. **生成 `compose.env`**:三段模板拼装 + 一段本机覆盖块(随机密钥、端口、项目名、镜像 tag)。
|
|
124
|
+
Kafka 的 `KAFKA_CLUSTER_ID` 与 `KAFKA_ADMIN_PASSWORD` 每个新盒随机生成,密码不回显;文件权限为 600。
|
|
118
125
|
覆盖块**放在文件最末尾**,因为 docker compose 读 env-file 是**后定义者胜**——以后要改配置也往那下面加,别回上面改。
|
|
119
126
|
4. 把 `portal-onebox/` 加进 `.gitignore`(里面是密钥,且随时能重新生成)。
|
|
120
127
|
|
|
121
|
-
它**不会**覆盖已存在的 `compose.env
|
|
128
|
+
它**不会**覆盖已存在的 `compose.env`(那是这台机器唯一的一份密钥)。已有一盒走 §6 的 `upgrade`;只有重置才用 `init --force`。
|
|
122
129
|
|
|
123
130
|
跑完编辑 `portal-onebox/compose.env` 末尾,填你的 App:`APP_IMAGE`(后端镜像 tag),
|
|
124
131
|
micro 型再加 `APP_FRONTEND_DIST`(前端 dist 的**绝对路径**,目录里要有 `index.html`)。
|
|
@@ -149,7 +156,8 @@ micro 型再加 `APP_FRONTEND_DIST`(前端 dist 的**绝对路径**,目录
|
|
|
149
156
|
| `onebox.sh smoke` | 只跑健康探测 |
|
|
150
157
|
| `onebox.sh dc <args>` | `docker compose <拼好的参数> <args>` |
|
|
151
158
|
| `onebox.sh chain` | 打印那串参数(想自己敲 compose 时抄它) |
|
|
152
|
-
| `onebox.sh pull` |
|
|
159
|
+
| `onebox.sh pull` | 只(重)拉门户镜像,不更新部署资产。不带参数时从 `compose.env` 读当前版本 |
|
|
160
|
+
| `onebox.sh upgrade [--image <ref>]` | 更新镜像与部署资产,保留配置和数据;完成后运行 `up`(§6) |
|
|
153
161
|
|
|
154
162
|
## 2. 起栈:顺序本身是契约
|
|
155
163
|
|
|
@@ -162,8 +170,9 @@ S="$SKILL_DIR/scripts/onebox.sh"
|
|
|
162
170
|
它幂等,改完 manifest 或 compose.env 重跑即可。下面这几步是它替你做的事——想手动控某一步时照着敲:
|
|
163
171
|
|
|
164
172
|
```bash
|
|
165
|
-
# 1)
|
|
166
|
-
|
|
173
|
+
# 1) 基础设施由 "$S" up 先做资产检查、存量对象存储切换,再起 postgres/redis/rustfs/kafka。
|
|
174
|
+
# 不手工 dc up rustfs;旧资产会在启动前拒绝并提示先 upgrade。
|
|
175
|
+
# 以下是 up 成功后单独重跑某一步的示例。
|
|
167
176
|
|
|
168
177
|
# 2) 门户库 + 四个基础服务各自的库(它们的 xgent-* 库由 postgres 首次初始化时建好)
|
|
169
178
|
"$S" dc run --rm portal-api bun run db:migrate
|
|
@@ -200,7 +209,7 @@ for k in files llm-gateway git org; do "$S" dc run --rm portal-api bun run db:$k
|
|
|
200
209
|
反代已经在跑就补一句 `"$S" dc exec reverse-proxy caddy reload`,否则 `/svc/<key>` 一直 404。
|
|
201
210
|
- **`register-app` 跑完先去市场里确认卡片在。** dev 模式下它会顺手把这条 listing 授予现有租户(生产是平台管理员显式勾选),
|
|
202
211
|
但**旧一点的一盒镜像里没有这段代码**——症状是控制台显示已上架、租户市场里连卡片都不出现,且**没有任何报错**。
|
|
203
|
-
|
|
212
|
+
看不到就按 §6 更新镜像缓存后 `"$S" upgrade` → `"$S" up` 同步资产,或按 troubleshooting §6 手工授予,别接着往下排查前端。
|
|
204
213
|
- **要做跨应用交换的,`register-app` 得跑两次。** 发起方 App Secret 绑在**已安装实例**上,所以是
|
|
205
214
|
`register-app` → 在应用市场里装上你的 App → **再跑一次 `register-app`**(幂等)。漏了的症状是交换在发起方 401。
|
|
206
215
|
|
|
@@ -209,20 +218,53 @@ for k in files llm-gateway git org; do "$S" dc run --rm portal-api bun run db:$k
|
|
|
209
218
|
你的 App 要用前四个的数据,就在 manifest 里声明 `exchangeTargets` 走令牌交换;
|
|
210
219
|
组织架构另有一条**服务态**只读面(`org.read`,不走用户态交换、也不需要 consent):
|
|
211
220
|
`/svc/org/api/v1/query/superiors`(批量查直属上级,上限 200)与 `/svc/org/api/v1/query/capabilities`
|
|
212
|
-
(`{ superior: boolean }` ——
|
|
213
|
-
|
|
221
|
+
(`{ superior: boolean }` —— 本租户有没有汇报数据);`/svc/org/api/v1/query/users/{userId}/assignments`
|
|
222
|
+
按**门户 userId** 查当前生效任职的平面集合(`{userId, employeeId, reason, items, total, page, pageSize}`,
|
|
223
|
+
`items[] = {assignmentId, departmentId, departmentName, departmentArchived, isPrimary, startDate}`,
|
|
224
|
+
缺省一次拿全;`reason` ∈ `ok`/`no-employee`/`employee-left`/`no-open-assignment`,空集合是 200 不是 404)。
|
|
225
|
+
它**不给树语义**:要「本部门及下级」就用 `/svc/org/api/v1/query/departments?includeArchived=true` 分页取完、
|
|
226
|
+
按 `parentId` 自己建树(**必须传 `includeArchived=true`**,否则归档的那一代会在链上留洞)。
|
|
227
|
+
注意既有 `/query/employees/{employeeId}/assignments` 入参是 org 员工 id、容器键是 `assignments`、返回全部历史,
|
|
228
|
+
两个任职端点的键名与排序都不同,别混拼。
|
|
229
|
+
⚠️ **只有 HTTP 200 ∧ `ok:true` 是成功**:401/403/429/5xx/超时,以及门户回滚后的 **404 必须当查询失败**,
|
|
230
|
+
不能缓存成「无任职」。**持续 403 `INSUFFICIENT_SCOPE` 先查 manifest**:铸服务令牌看响应 `scope` 有没有 `org.read`,
|
|
231
|
+
没有就在 `serviceScopes` 加它(且 `org` 在 `dependencies` 或 `exchangeTargets` 里)走发布提案。
|
|
232
|
+
限频 600 次/分钟,按 (令牌 `aud`, 租户) 计数、org 全部端点共享:服务态令牌 `aud` 是你的 SA clientId(独占一个桶),用户态令牌 `aud` 恒为 `org`(同租户所有 App 共用一个桶);结果建议 ≤60s 进程内缓存、不得落表。
|
|
233
|
+
⚠️ 一盒装上的是**空组织**,要数据先在 App 里走「员工 → 导入」(CSV),否则上级一律回 `null` /
|
|
234
|
+
`reason: "no-employee"`,任职一律回空集合。
|
|
214
235
|
|
|
215
236
|
日志与监控不用声明——种子把它登记成平台基础服务应用,你的 App 的服务账号
|
|
216
237
|
**默认就持有 `observability.ingest`**,拿服务态令牌直接写 `/svc/observability/v1/ingest/<stream>`(落 `app_<你的key>_<stream>`)。
|
|
217
238
|
|
|
239
|
+
### Kafka 的启动边界
|
|
240
|
+
|
|
241
|
+
Kafka 随基础设施常驻,`up` 单独启动并最多等健康 60 秒;失败只告警并显示日志,继续门户与现有 App 初始化。
|
|
242
|
+
`doctor` 检查 Kafka 的 TCP 监听;探针只证明监听已打开,不能替代客户端的认证、授权与收发验证。
|
|
243
|
+
`add` 识别 `requiredServices: [{"kind":"kafka","name":"main"}]`,也兼容 `requiredEnv` 中的
|
|
244
|
+
`<PREFIX>_KAFKA_USERNAME`。它为 App 创建 SCRAM-SHA-512 用户与前缀 ACL,并写入五键:
|
|
245
|
+
`<PREFIX>_KAFKA_BROKERS`、`_KAFKA_USERNAME`、`_KAFKA_PASSWORD`、`_KAFKA_SASL_MECHANISM`、
|
|
246
|
+
`_KAFKA_TOPIC_PREFIX`(后四项同样带 `<PREFIX>`)。`<PREFIX>` 是 listingKey 大写、连字符改成下划线。
|
|
247
|
+
密码第一次生成后写入 `compose.env` 并显示 `***`,重复 `add` 及失败重试沿用原值。
|
|
248
|
+
不要为联调把 `KAFKA_ADMIN_PASSWORD` 加进 App 的 `requiredEnv`。
|
|
249
|
+
|
|
250
|
+
例如 `order-worker` 的用户名是 `app_order_worker`,主题、消费组、事务 ID 都必须以
|
|
251
|
+
`app.order-worker.` 开头。机制固定 `SCRAM-SHA-512`。App 必须显式建主题(副本数 1),不能修改
|
|
252
|
+
保留期或增加分区;前缀外访问被 broker 拒绝。Kafka 供给失败只告警,保留已保存的密码,按提示
|
|
253
|
+
修复后重跑原 `add`。一盒仍向容器注入整份 `compose.env`,不承诺 App 容器之间的密钥隔离。
|
|
254
|
+
声明范例、客户端配置、最小 ACL 与可粘的手工修复命令见 [Kafka 接入指引](references/kafka.md)。
|
|
255
|
+
|
|
256
|
+
宿主地址为 `127.0.0.1:<KAFKA_PORT>`,容器网络为 `kafka:9092`,均使用 SASL_PLAINTEXT。
|
|
257
|
+
一盒 EXTERNAL 默认 `127.0.0.1:9095`,保持回环,不开放公网。生产跨 VM 的外部口配置由运维处理:
|
|
258
|
+
监听地址、非回环广告地址和安全组需同时匹配,且 SASL_PLAINTEXT 不加密消息。
|
|
259
|
+
|
|
218
260
|
### 2.0a 日志与监控是怎么进来的(`up` 替你做的 ④b / ⑥)
|
|
219
261
|
|
|
220
262
|
- **④b** `observability` 不是门户内置 workspace,是清单型 App(`app-devkit/manifests/observability.manifest.json`)。
|
|
221
263
|
`up` 对目录里每个清单型 App 自动走一遍 `add`:拉镜像(`<REGISTRY>/<ONEBOX_PROJECT>/observability:v0.5.4-…`;
|
|
222
264
|
多架构清单会自动挑本机架构,只有单 amd64 的版本才要在 compose.env 钉 `OBSERVABILITY_PLATFORM=linux/amd64`
|
|
223
|
-
走仿真)→ 注册 → 建库 `xgent-observability` + 在一盒
|
|
265
|
+
走仿真)→ 注册 → 建库 `xgent-observability` + 在一盒 RustFS
|
|
224
266
|
建桶 `xgent-observability` → `init-db`(清单 `deployDescriptor.migrateArgs`)→ 生成 `generated/observability.yml` 起容器。
|
|
225
|
-
它要的那批 `ZO_*` 值(元数据库/对象存储)已经在 `onebox/compose.env.onebox.example` 里指向一盒的 postgres/
|
|
267
|
+
它要的那批 `ZO_*` 值(元数据库/对象存储)已经在 `onebox/compose.env.onebox.example` 里指向一盒的 postgres/RustFS;
|
|
226
268
|
`OBSERVABILITY_PORT=8080` 让它在 8080 上听(一盒反代只反代 `<key>-server:8080`)。
|
|
227
269
|
- **⑥** 门户自身的控制台日志:`up` 用 `portal-self` 签一把只带 `observability.ingest` 的 `xsak_` 写进 compose.env
|
|
228
270
|
的 `OBS_ACCESS_KEY`,再起 `portal-logs`(fluent-bit);portal-api 的 stdout/stderr 走 docker 的 fluentd 日志驱动
|
|
@@ -276,6 +318,11 @@ release-cli 在一盒里是**通的**(`/api/market/release/*` 就在 portal-ap
|
|
|
276
318
|
它按 manifest 把这个 App 装起来:拉镜像 → 注册清单+服务账号(**非破坏性、幂等**,不是那个会
|
|
277
319
|
truncate 的 `db:seed:onebox`)→ 建 `xgent-<key>` 库 → **生成** compose 片段 → 起容器 → 冒烟。
|
|
278
320
|
|
|
321
|
+
**清单声明了 `dependencies` 的**(比如 workflow 依赖 files 和 task-gateway):注册时门户要求每个依赖在**这台一盒里**
|
|
322
|
+
已经有清单,否则拒绝(`DEPENDENCY_UNAVAILABLE`),跟依赖装没装无关。`add` 会在拉镜像之前先查一遍,把缺的依赖一次列全,然后停下。
|
|
323
|
+
这时先逐个 `"$S" add <依赖>`,再重跑原来那条 `add`。之后在「应用管理 → 应用市场」里安装这个 App,依赖会一起装上、自动授予,不用一个个去装。
|
|
324
|
+
依赖的清单要是没写 `deployDescriptor.image`,`add` 它时带上 `--image <REGISTRY>/<ONEBOX_PROJECT>/<key>:<tag>`。
|
|
325
|
+
|
|
279
326
|
**compose 片段是从 manifest 生成的,不是每个 App 在 skill 里预置一份 YAML。** 那样每接一个新
|
|
280
327
|
App 都要改一次 skill,等于把问题换了个地方。manifest 里已经有全部所需:
|
|
281
328
|
|
|
@@ -284,8 +331,9 @@ App 都要改一次 skill,等于把问题换了个地方。manifest 里已经
|
|
|
284
331
|
| 镜像(**版本由清单钉住,可复现**;相对名按 `<REGISTRY>/<ONEBOX_PROJECT>/` 补全) | `deployDescriptor.image` |
|
|
285
332
|
| 容器内端口 / 健康路径 | `deployDescriptor.port` / `.healthPath` |
|
|
286
333
|
| 网络别名 `<key>-server`、库名 `xgent-<key>` | `listingKey`(约定) |
|
|
334
|
+
| 库连接串 `<PREFIX>_DATABASE_URL`(与生产同一个约定名),另带旧名 `<PREFIX>_PG_DSN` / `DATABASE_URL`,都指向 `xgent-<key>` | `listingKey`(约定) |
|
|
287
335
|
| 自省身份 | `serviceAccount.clientId` |
|
|
288
|
-
| 还要补哪些 env
|
|
336
|
+
| 还要补哪些 env(值归平台;`add` 会点名片段与 `compose.env` 里都没有的那几个) | `requiredEnv` |
|
|
289
337
|
|
|
290
338
|
**密钥不从清单来**:一盒现生成,**同时**写进本地门户 DB 与容器 env —— `add` 会在注册前把
|
|
291
339
|
密钥注进临时清单(用完即删)。所以清单里有没有明文密钥都无所谓,这也正是 release-cli
|
|
@@ -328,7 +376,9 @@ MANIFEST_STORE_READ_TOKEN=xcat_… # 只读令牌:只能读公开清单
|
|
|
328
376
|
`data:null` = 目录里还没有这个 key(那个 App 还没发过版?)· 连不上 = 检查地址与网络。
|
|
329
377
|
|
|
330
378
|
**镜像不用你操心**:配合调试用的平台侧 App 一律以**稳定版**发到与一盒**同一个项目**下,同一把
|
|
331
|
-
puller key 就能拉。要换版才加 `--image <ref
|
|
379
|
+
puller key 就能拉。要换版才加 `--image <ref>`。有些镜像只发了 amd64,在 Apple Silicon 上直接 pull 会报
|
|
380
|
+
`no matching manifest`。这种情况 `add` 会自动改拉 amd64 那一份(仿真运行,冷启动慢),并把
|
|
381
|
+
`<PREFIX>_PLATFORM=linux/amd64` 写进 `compose.env`。
|
|
332
382
|
|
|
333
383
|
> **你要花时间排查的只有你自己那个 App。** 别人的 App 在这里是稳定件——起不来先 `"$S" doctor`,
|
|
334
384
|
> 还不行报给门户团队,别自己去调它。
|
|
@@ -350,8 +400,8 @@ puller key 就能拉。要换版才加 `--image <ref>`。
|
|
|
350
400
|
|
|
351
401
|
首次跨应用调用浏览器会多弹一次交换授权页,是正常的。
|
|
352
402
|
|
|
353
|
-
> **为什么建库/迁移在一盒要 `add` 代劳,生产不用。**
|
|
354
|
-
>
|
|
403
|
+
> **为什么建库/迁移在一盒要 `add` 代劳,生产不用。** 生产上这两件各有其主:**建库**归批准时的
|
|
404
|
+
> 平台供给(按约定名 `<PREFIX>_DATABASE_URL` 建库并注入,不在部署链里),**迁移**归部署链——`deployDescriptor.migrateArgs` 让 deploy-controller 在换
|
|
355
405
|
> 容器**之前**跑一个一次性容器(同镜像、同 env、只换 argv),失败就让这次部署失败而**旧容器
|
|
356
406
|
> 继续服务**,不会变成换完之后的崩溃循环。一盒**两样都没有**(没有 controller,`migrateArgs`
|
|
357
407
|
> 一次也不会跑),所以 `add` 替你建库,迁移靠镜像自己启动时迁——**这也意味着一盒里验不出
|
|
@@ -371,7 +421,7 @@ puller key 就能拉。要换版才加 `--image <ref>`。
|
|
|
371
421
|
`XGENT_ONEBOX_HOME=portal-onebox "$S" dc -f portal-onebox/<你的>.yml up -d <服务名>`。
|
|
372
422
|
`-f` 出现在子命令前就仍是全局选项,位置没问题。
|
|
373
423
|
3. **别改 `portal-onebox/` 里 init 铺出来的那几个 yml** —— 它们是从镜像里取出来的,
|
|
374
|
-
`init --force`
|
|
424
|
+
`upgrade` 会同步这些平台资产,`init --force` 也会覆盖;不要在平台原文件里维护自己的改动。你的东西永远是**新文件**。
|
|
375
425
|
|
|
376
426
|
**合并规则(实测 `docker compose config`,三条都不直觉):**
|
|
377
427
|
|
|
@@ -406,7 +456,7 @@ amd64 镜像要 `linux/amd64`)· 网络别名 `<key>-server`(反代靠它找
|
|
|
406
456
|
**dev 登录的入口**:登录页密码表单下方的「本地开发账号」按钮(`DEV_MOCK_OAUTH=true` 才出现),
|
|
407
457
|
或直接打开 `/auth/dev/start` 进 mock IdP 选账号 → 选 `rockie@xgent.ai`(演示租户 admin + 平台管理员)。
|
|
408
458
|
**按钮没出现**:先 `curl <地址>/auth/providers` 看 `dev` 字段在不在——在就走 `/auth/dev/start`,
|
|
409
|
-
那说明这版镜像的前端与 API
|
|
459
|
+
那说明这版镜像的前端与 API 对不齐,按 §6 更新缓存后运行 `upgrade` → `up`。
|
|
410
460
|
|
|
411
461
|
种子只种两个账号,另一个是 `liming@xgent.ai`(普通成员)——**ACL 成员基线没到位的问题只在非管理员身上现形**,
|
|
412
462
|
验收要用它再走一遍,管理员那边永远是绿的。
|
|
@@ -434,7 +484,7 @@ amd64 镜像要 `linux/amd64`)· 网络别名 `<key>-server`(反代靠它找
|
|
|
434
484
|
> **「照文档做,行为却不符」先看版本。** `status` / `smoke` 里 `/health` 那行会回一个 `version`:
|
|
435
485
|
> `init` 把镜像的 tag + ID + 构建日期写进了 `compose.env` 的 `APP_VERSION`。报 `dev` 说明这份 compose.env
|
|
436
486
|
> 是老 `init` 铺的(或你自己改过)。一盒镜像比文档旧一天,就足以让「注册后自动授予租户」这类行为整个不存在,
|
|
437
|
-
> 而现场没有任何报错 —— 真实案例(CR-4
|
|
487
|
+
> 而现场没有任何报错 —— 真实案例(CR-4)。按 §6 更新缓存并运行 `upgrade` → `up`,同步新镜像与资产再判。
|
|
438
488
|
那张表按「你看到什么」编排。最容易白白浪费半天的两条先放这儿:
|
|
439
489
|
|
|
440
490
|
> **看到 `unhealthy` 先读那条探针,再决定要不要查。**
|
|
@@ -445,7 +495,7 @@ amd64 镜像要 `linux/amd64`)· 网络别名 `<key>-server`(反代靠它找
|
|
|
445
495
|
> 假红:Caddy 把它 308 到 `https://127.0.0.1/`,对一个 IP 建 TLS 没有 SNI,回 `SSL alert number 80`。
|
|
446
496
|
> · 探针已是 `bun -e fetch(...)` / `curl -fsS -o /dev/null http://127.0.0.1:80/`(新镜像的两条)
|
|
447
497
|
> 却仍 `unhealthy` ⇒ **真红**,去看 `"$S" dc logs <服务>`。
|
|
448
|
-
>
|
|
498
|
+
> 判活以 `"$S" smoke` 的宿主侧探测为准;pg/redis/RustFS 的 healthy 检查对应服务。Kafka 看 `doctor`,其 TCP healthy 不代表 App 凭据与 ACL 已可用。
|
|
449
499
|
|
|
450
500
|
> **`COMPOSE_PROJECT_NAME` 固定是 `xgent-onebox`,别靠改名来「并存」两套。** 同机两套 compose
|
|
451
501
|
> 项目名相同,compose 会认为它们是同一项目——容器互相接管、命名卷共享,症状是「我起了一盒,
|
|
@@ -469,7 +519,7 @@ services:
|
|
|
469
519
|
然后 `XGENT_ONEBOX_HOME=portal-onebox "$S" dc -f portal-onebox/host-backend.yml up -d app-backend`。
|
|
470
520
|
此时 `APP_IMAGE` 不再被用到(compose 仍要求它有值,随便填一个);`APP_KEY` 照旧——别名还是靠它。
|
|
471
521
|
|
|
472
|
-
**宿主进程的 DB / 缓存 / 对象存储也用一盒的,别再单起。** postgres / redis /
|
|
522
|
+
**宿主进程的 DB / 缓存 / 对象存储也用一盒的,别再单起。** postgres / redis / RustFS 都发布了
|
|
473
523
|
宿主端口,而 init 挑端口时避开了本机已占用的口——所以它们和你本地 dev 栈的
|
|
474
524
|
5432 / 6379 / 9000-9001 不冲突(典型落位 15432 / 16379 / 19000-19001;以 `compose.env` 末尾的
|
|
475
525
|
`POSTGRES_PORT` / `REDIS_PORT` / `MINIO_PORT` / `MINIO_CONSOLE_PORT` 为准,`"$S" env` 也回显)。
|
|
@@ -479,33 +529,69 @@ services:
|
|
|
479
529
|
| --- | --- | --- |
|
|
480
530
|
| Postgres | `postgres://postgres:postgres@localhost:<POSTGRES_PORT>/xgent-<你的key>` | 库不存在先建(§2 3b 那条 CREATE DATABASE) |
|
|
481
531
|
| Redis | `localhost:<REDIS_PORT>` | 无密码 |
|
|
482
|
-
|
|
|
532
|
+
| RustFS (S3) | `http://localhost:<MINIO_PORT>` | `minioadmin` / `minioadmin`;控制台在 `http://localhost:<MINIO_CONSOLE_PORT>/rustfs/console/`,桶自己建(建议 `xgent-<你的key>`) |
|
|
483
533
|
|
|
484
534
|
这样宿主进程和容器里的 App 看到的是同一份库、同一个桶。注意上面是**宿主侧**地址——
|
|
485
|
-
|
|
535
|
+
容器网里地址不变(`postgres:5432` / `redis:6379` / `minio:9000`);`minio` 是 RustFS 的兼容别名,`MINIO_*` 配置继续使用。
|
|
486
536
|
|
|
487
|
-
## 6.
|
|
537
|
+
## 6. 初始化、升级与重置
|
|
538
|
+
|
|
539
|
+
三条路径各有用途:
|
|
540
|
+
|
|
541
|
+
| 目的 | 命令 | 配置与数据 |
|
|
542
|
+
| --- | --- | --- |
|
|
543
|
+
| 首次初始化 | `"$S" init --key <listingKey>` → 编辑 App 配置 → `"$S" up` | 新建资产、密钥与端口配置 |
|
|
544
|
+
| 已有一盒升级 | `"$S" upgrade [--image <ref>]` → `"$S" up` | 保留 compose.env、generated/、backup/、端口与数据卷 |
|
|
545
|
+
| 主动清空联调数据重置 | `"$S" dc down -v` → `"$S" init --force --key <listingKey>` → `"$S" up` | 删除当前 compose 的命名卷并重新生成配置;不可当升级使用 |
|
|
546
|
+
|
|
547
|
+
### 升级:换资产,保留本机配置与对象
|
|
488
548
|
|
|
489
549
|
```bash
|
|
490
550
|
S="$SKILL_DIR/scripts/onebox.sh"
|
|
491
|
-
"$S"
|
|
492
|
-
"$S"
|
|
551
|
+
"$S" upgrade --image <registry>/<项目>/one-box:v<版本>-<sha>
|
|
552
|
+
"$S" up
|
|
493
553
|
```
|
|
494
554
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
555
|
+
不指定 `--image` 时使用当前 `XGENT_IMAGE`;显式换 runtime 后会按同仓同 tag 推导 proxy,
|
|
556
|
+
需要不同反代镜像可加 `--proxy-image <ref>`。`upgrade` 要求已有 `compose.env`,
|
|
557
|
+
重新从镜像取出部署资产,**不重建配置、不重挑端口、不删卷**。只有镜像或版本变化时,
|
|
558
|
+
才在文件末尾追加 `XGENT_IMAGE` / `XGENT_PROXY_IMAGE` / `APP_VERSION`;原有密钥、自定义行和 `add` 写入的键保留。
|
|
559
|
+
Kafka 另按需补缺 `KAFKA_CLUSTER_ID` / `KAFKA_ADMIN_PASSWORD` / `KAFKA_PORT`:新 ID 与密码随机生成,
|
|
560
|
+
新端口按 9092/19092/29092 挑选,已有的三键一个不改。密码写入不回显,`compose.env` 保持 600。
|
|
561
|
+
`generated/` 和 `backup/` 原样保留。两个目标镜像本地都在时跳过拉取,支持本地构建或离线 `docker load`。
|
|
562
|
+
沿用可变 `latest` 要先更新缓存:`"$S" pull` → `"$S" upgrade` → `"$S" up`;显式指定新的不可变 tag
|
|
563
|
+
或已载入的本地新 tag,可直接 `upgrade --image <ref>`。单独 `pull` 不更新资产,不能代替 `upgrade`。
|
|
564
|
+
|
|
565
|
+
升级也保留 PostgreSQL 的**现有数据大版本与挂载布局**。脚本在启动数据库前只读检查卷内
|
|
566
|
+
`PG_VERSION`,已有 18 的一盒不会因新模板默认 16 而被降级;旧布局挂 `/var/lib/postgresql/data`,
|
|
567
|
+
18 起的版本目录布局挂其父目录 `/var/lib/postgresql`。未知、冲突或非空但无法识别的布局会中止,
|
|
568
|
+
不冒险初始化另一份空库。此时保留卷与原镜像,按提示核对;**不要删卷解决版本错误**。
|
|
569
|
+
真正升级 PostgreSQL 大版本需要另行备份并安排 pg_upgrade 或导出/恢复,不随门户换版自动执行。
|
|
570
|
+
|
|
571
|
+
`up` 先检查资产,再通过共用切换脚本把存量 MinIO 复制到全新的 RustFS 卷;旧卷保留,
|
|
572
|
+
桶列表、对象清单和正文摘要一致才提交。正式 RustFS 只在脚本成功后启动,并等待 `/health`。
|
|
573
|
+
`add` 与建桶入口同样经过这道切换门。**`up` 仍会重种门户库**(租户、用户、清单、安装与 UUID),
|
|
574
|
+
这是一盒原有契约;App 自己的数据库不被重种,对象存储数据由切换校验保留。
|
|
575
|
+
|
|
576
|
+
备份在一盒目录的 `backup/`,包含旧镜像归档、每次切换清单及 `rollback-minio.sh`。
|
|
577
|
+
失败时先读退出提示:提交前失败恢复旧服务;已提交但新服务不健康时保留 `rustfs-data`,
|
|
578
|
+
按日志排错后重跑 `up`。**不要删除权威新卷。** 回退入口会先停掉正式 RustFS,重新核对当前数据:
|
|
579
|
+
有切换后写入则拒绝回退并保留新卷;此时需在副本上验证 MinIO 兼容与全部对象,再由人工安排恢复,
|
|
580
|
+
不能直接把服务指回旧卷。运行回退入口时通过 `--env-file <一盒目录>/compose.env` 提供原凭据,勿写入命令行。
|
|
581
|
+
|
|
582
|
+
Kafka 数据也随升级保留。`KAFKA_CLUSTER_ID` 与 `kafka-data` 绑定,备份需同时保留配置与卷;
|
|
583
|
+
已有数据时不能重生成 ID、换空卷或改 `KAFKA_DATA_DIR` 来消除拒启。改变目录不会迁移消息。
|
|
584
|
+
单节点没有高可用,重启期间不可用;需要回退平台代码时保留 Kafka 卷与原配置。
|
|
585
|
+
|
|
586
|
+
### 停栈与重置
|
|
587
|
+
|
|
588
|
+
`"$S" dc down` 只停容器、保留卷;下次 `up` 仍会重种门户库。只想重置门户数据也可重跑
|
|
589
|
+
`db:seed:onebox`,随后重跑 `register-app`、重载 Caddy;浏览器需要重新登录。
|
|
590
|
+
|
|
591
|
+
`down -v` 是主动删除当前 compose 命名卷的操作,pg、RustFS、Kafka、apps、caddy 数据会丢失。
|
|
592
|
+
先备份要保留的 App 数据与对象,再按上表重置;退役 MinIO 卷和 `backup/` 不在新 compose 删除范围内,
|
|
593
|
+
保留供核对,不因升级自动删除。命名卷属主故障按 [排查表 §7](references/troubleshooting.md#7-命名卷属主不对eacces-一族)
|
|
594
|
+
处理,升级本身不要求清空所有数据。
|
|
509
595
|
|
|
510
596
|
## 7. 一盒不是门户,别拿它当门户
|
|
511
597
|
|
|
@@ -514,6 +600,11 @@ S="$SKILL_DIR/scripts/onebox.sh"
|
|
|
514
600
|
- `bootstrap:prod` 与部署控制器**启动即拒**并打印原因;完整的 `db:seed`(十几个 App 的种子链)也必失败,
|
|
515
601
|
一盒只能用 `db:seed:onebox`。
|
|
516
602
|
- 它是 dev 联调套件:mock OAuth 常开、服务账号密钥是已知明文。**不要用于生产,也不要暴露到公网。**
|
|
603
|
+
- `compose.env` 权限 600 只保护宿主文件;一盒仍把整份配置注入容器,是可信 App 之间的本地联调模型,
|
|
604
|
+
不构成对恶意 App 的凭据隔离。不要把 Kafka 管理密码当作 App 的连接凭据。
|
|
517
605
|
- 不装 ffmpeg:`PREVIEW_MEDIA_CONVERTER_URL` 必须留空,视频海报/网格缩略图退化成图标。
|
|
518
606
|
- 文件管理界面**不渲染预览**(镜像构建时关掉了前端的格式渲染器),打开任何文件都是下载卡;
|
|
519
607
|
服务端的预览描述符 API 不变,你的 App 自带 `@xgent/file-preview` 时照常渲染。
|
|
608
|
+
- **套件(bundle)的共享后端去重在一盒里不发生**:一盒不跑部署控制器(上面那条),
|
|
609
|
+
套件成员各自仍是「视作 ready」;两个成员共用一个容器这件事要验,去预发或一台 VM 栈,
|
|
610
|
+
别拿一盒当证据。套件的建/删/成员管理与发版(单发与批次)在一盒里照常可用。
|
|
@@ -41,8 +41,9 @@ PROJECT=
|
|
|
41
41
|
# 目录部署的地址(带协议,无尾斜杠)。同时是 release-cli 投递清单的第二站。
|
|
42
42
|
MANIFEST_STORE=
|
|
43
43
|
|
|
44
|
-
# 目录【只读】令牌(xcat_…)。它是跨 App 的读凭证 —— 一把泄露 =
|
|
45
|
-
#
|
|
44
|
+
# 目录【只读】令牌(xcat_…)。它是跨 App 的读凭证 —— 一把泄露 = 全部已上架外部 App 的公开
|
|
45
|
+
# 清单与前端产物可读(公开字段与静态文件而已,里面没有任何密钥),但仍要按凭证对待:
|
|
46
|
+
# chmod 600 + 别提交。
|
|
46
47
|
MANIFEST_STORE_READ_TOKEN=
|
|
47
48
|
|
|
48
49
|
# ── 发布(xgent-app-release 用的三项,两个 skill 共用本文件)────────────
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# 平台 Kafka 接入指引
|
|
2
|
+
|
|
3
|
+
平台为每个 App 供给一个 Kafka 用户及限定前缀的权限。App 只使用自己的五个环境变量;不要申请或读取 `KAFKA_ADMIN_PASSWORD`。
|
|
4
|
+
|
|
5
|
+
## 清单与环境变量
|
|
6
|
+
|
|
7
|
+
以 `listingKey: "order-worker"` 为例,清单声明:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"requiredServices": [{ "kind": "kafka", "name": "main" }],
|
|
12
|
+
"requiredEnv": [
|
|
13
|
+
"ORDER_WORKER_KAFKA_BROKERS",
|
|
14
|
+
"ORDER_WORKER_KAFKA_USERNAME",
|
|
15
|
+
"ORDER_WORKER_KAFKA_PASSWORD",
|
|
16
|
+
"ORDER_WORKER_KAFKA_SASL_MECHANISM",
|
|
17
|
+
"ORDER_WORKER_KAFKA_TOPIC_PREFIX"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`requiredServices` 的每项只写 `kind`、`name`、可选 `note`,不写地址、密码或 `envKey`。生产由平台管理员登记 Kafka 服务与自动供给档案,批准应用时选择档案、建用户及授权。也兼容只在 `requiredEnv` 声明约定键名的应用;完整列出五键便于交付检查。
|
|
23
|
+
|
|
24
|
+
| 键后缀 | 用途 / 例子 |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `_KAFKA_BROKERS` | 逗号分隔的 `host:port`;容器一盒为 `kafka:9092` |
|
|
27
|
+
| `_KAFKA_USERNAME` | `app_order_worker`;连字符转换成下划线 |
|
|
28
|
+
| `_KAFKA_PASSWORD` | 平台供给的密码,不写进清单、源码或日志 |
|
|
29
|
+
| `_KAFKA_SASL_MECHANISM` | 固定 `SCRAM-SHA-512` |
|
|
30
|
+
| `_KAFKA_TOPIC_PREFIX` | `app.order-worker.`;保留原始 listingKey 的连字符与末尾点 |
|
|
31
|
+
|
|
32
|
+
环境变量前缀是 listingKey 大写、连字符改成下划线。**主题、消费组、事务 ID 都必须使用 `_KAFKA_TOPIC_PREFIX`**,不能从用户名反推。例如主题 `app.order-worker.events`,消费组 `app.order-worker.readers`,事务 ID `app.order-worker.tx-01`。
|
|
33
|
+
|
|
34
|
+
## 客户端配置与主题创建
|
|
35
|
+
|
|
36
|
+
协议为 `SASL_PLAINTEXT`,认证为 `SCRAM-SHA-512`,不是管理员使用的 PLAIN。客户端必须支持 SCRAM-SHA-512,并在重连时继续使用收到的 broker 广告地址。地址不含 `http://`。
|
|
37
|
+
|
|
38
|
+
以下是 Bun / `@platformatic/kafka` 的配置示例;初始化主题和生产消息使用的是 **App 用户**:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import { Admin, Producer, stringSerializers } from "@platformatic/kafka";
|
|
42
|
+
|
|
43
|
+
function required(key: string): string {
|
|
44
|
+
const value = process.env[key];
|
|
45
|
+
if (!value) throw new Error(`缺少 ${key}`);
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
const prefix = required("ORDER_WORKER_KAFKA_TOPIC_PREFIX");
|
|
49
|
+
if (required("ORDER_WORKER_KAFKA_SASL_MECHANISM") !== "SCRAM-SHA-512") {
|
|
50
|
+
throw new Error("Kafka 认证机制不匹配");
|
|
51
|
+
}
|
|
52
|
+
const connection = {
|
|
53
|
+
clientId: "order-worker",
|
|
54
|
+
bootstrapBrokers: required("ORDER_WORKER_KAFKA_BROKERS").split(",").map(s => s.trim()),
|
|
55
|
+
sasl: {
|
|
56
|
+
mechanism: "SCRAM-SHA-512" as const,
|
|
57
|
+
username: required("ORDER_WORKER_KAFKA_USERNAME"),
|
|
58
|
+
password: required("ORDER_WORKER_KAFKA_PASSWORD"),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const topic = `${prefix}events`;
|
|
62
|
+
const admin = new Admin(connection);
|
|
63
|
+
try {
|
|
64
|
+
// 首次部署显式创建;重跑只把“主题已存在”当成功,其它错误必须保留。
|
|
65
|
+
await admin.createTopics({ topics: [topic], partitions: 1, replicas: 1 });
|
|
66
|
+
} finally {
|
|
67
|
+
await admin.close();
|
|
68
|
+
}
|
|
69
|
+
const producer = new Producer({ ...connection, serializers: stringSerializers });
|
|
70
|
+
try {
|
|
71
|
+
await producer.send({ messages: [{ topic, key: "order-42", value: JSON.stringify({ eventId: "unique-event-id" }) }] });
|
|
72
|
+
} finally {
|
|
73
|
+
await producer.close();
|
|
74
|
+
}
|
|
75
|
+
// 消费者 groupId 使用 `${prefix}readers`;业务处理成功后才提交 offset。
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
平台关闭自动建主题。App 必须在首次部署或迁移阶段显式创建主题,副本数为 1;不能靠第一次发送消息触发创建。保留期由平台决定,创建时不传 `retention.ms` 等保留配置,需要调整时联系平台管理员。
|
|
79
|
+
|
|
80
|
+
| 资源(均为 App 前缀) | 授权操作 |
|
|
81
|
+
| --- | --- |
|
|
82
|
+
| 主题 | CREATE、DELETE、DESCRIBE、DESCRIBE_CONFIGS、READ、WRITE |
|
|
83
|
+
| 消费组 | READ、DESCRIBE、DELETE |
|
|
84
|
+
| 事务 ID | WRITE、DESCRIBE |
|
|
85
|
+
|
|
86
|
+
不授权 ALTER、ALTER_CONFIGS、ALL:App 不能修改主题保留期或增加分区,也不能创建或读写他人主题、加入他人消费组、使用他人事务 ID。幂等生产可用;业务仍需处理重复投递。
|
|
87
|
+
|
|
88
|
+
## 一盒联调
|
|
89
|
+
|
|
90
|
+
使用新版 `portal-dev-setup` 的公开脚本:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
S=/path/to/portal-dev-setup/scripts/onebox.sh
|
|
94
|
+
"$S" add order-worker --manifest ./app.manifest.json --image <已交付的App镜像>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`add` 在清单包含 `<PREFIX>_KAFKA_USERNAME` 或 `requiredServices.kind=kafka` 时启动 Kafka,等待监听,创建 SCRAM-SHA-512 用户(8192 次迭代)和三组前缀 ACL,再把五键写入 `compose.env`。随机密码在第一次写 broker 之前保存;重复 `add` 和部分失败后的重试都沿用它,不会更换已连接客户端的密码。写密钥只显示 `***`。不要手工删掉已保存的密码行后重跑。
|
|
98
|
+
|
|
99
|
+
容器内连接 `kafka:9092`。宿主热重载进程使用同一用户和密码,但将 BROKERS 改为 `127.0.0.1:<compose.env 的 KAFKA_PORT>`;不要把这一宿主地址写回容器用的五键。`doctor` 只检查 TCP 监听,绿灯不代替认证与收发验证。
|
|
100
|
+
|
|
101
|
+
一盒将整份 `compose.env` 注入容器,**不提供 App 容器之间的密钥隔离**;仅用于可信团队的本地联调。App 自律只读自己的五键,权限验证也只用该用户,不能把管理员凭据交给 App 客户端。
|
|
102
|
+
|
|
103
|
+
### 一盒故障恢复
|
|
104
|
+
|
|
105
|
+
供给失败只告警,门户与应用初始化继续;依赖 Kafka 的 App 可能暂时不可用。先看 `"$S" dc logs --tail 50 kafka`,检查资产版本、磁盘与管理密码是否匹配,再粘贴告警中的 `add` 命令重试。旧资产先 `"$S" upgrade --image <新版一盒镜像>`;保留原 `compose.env` 与 Kafka 卷,不能改 `KAFKA_CLUSTER_ID`。
|
|
106
|
+
|
|
107
|
+
需要手工确认或修复时,下面的命令只从本地配置读取密码,命令行不含密码字面量。把 `BOX`、`KEY` 改为自己的目录和 listingKey;脚本只接受自动生成的十六进制 / base64 / URL-safe App 密码,不自动覆盖不受支持的自定义密码。
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
BOX=./portal-onebox
|
|
111
|
+
KEY=order-worker
|
|
112
|
+
P=$(printf '%s' "$KEY" | tr 'a-z-' 'A-Z_')
|
|
113
|
+
PASSWORD=$(awk -v key="${P}_KAFKA_PASSWORD" 'index($0,key"=")==1 {v=substr($0,length(key)+2)} END {print v}' "$BOX/compose.env")
|
|
114
|
+
test -n "$PASSWORD" || { echo '先重跑 add,保留它生成的密码'; exit 1; }
|
|
115
|
+
printf '%s\n' "$PASSWORD" | XGENT_ONEBOX_HOME="$BOX" "$S" dc exec -T kafka bash -ec '
|
|
116
|
+
umask 077; IFS= read -r password
|
|
117
|
+
dir=$(mktemp -d /tmp/xgent-kafka-admin.XXXXXX)
|
|
118
|
+
trap '\''rm -rf "$dir"'\'' EXIT
|
|
119
|
+
trap '\''exit 1'\'' HUP INT TERM
|
|
120
|
+
jaas=$KAFKA_LISTENER_NAME_INTERNAL_PLAIN_SASL_JAAS_CONFIG
|
|
121
|
+
printf "security.protocol=SASL_PLAINTEXT\nsasl.mechanism=PLAIN\nsasl.jaas.config=%s\n" "${jaas//\\/\\\\}" > "$dir/admin.properties"
|
|
122
|
+
printf "SCRAM-SHA-512=iterations=8192,password=%s\n" "$password" > "$dir/user.properties"
|
|
123
|
+
/opt/kafka/bin/kafka-configs.sh --bootstrap-server kafka:9092 --command-config "$dir/admin.properties" --alter --add-config-file "$dir/user.properties" --entity-type users --entity-name "app_${1//-/_}"
|
|
124
|
+
acl=(--bootstrap-server kafka:9092 --command-config "$dir/admin.properties" --add --allow-principal "User:app_${1//-/_}" --allow-host "*" --resource-pattern-type prefixed)
|
|
125
|
+
/opt/kafka/bin/kafka-acls.sh "${acl[@]}" --topic "app.$1." --operation Create --operation Delete --operation Describe --operation DescribeConfigs --operation Read --operation Write
|
|
126
|
+
/opt/kafka/bin/kafka-acls.sh "${acl[@]}" --group "app.$1." --operation Read --operation Describe --operation Delete
|
|
127
|
+
/opt/kafka/bin/kafka-acls.sh "${acl[@]}" --transactional-id "app.$1." --operation Write --operation Describe
|
|
128
|
+
' bash "$KEY"
|
|
129
|
+
unset PASSWORD
|
|
130
|
+
# 用原 manifest / image 参数重跑,让 add 补齐五键并重建 App 容器。
|
|
131
|
+
XGENT_ONEBOX_HOME="$BOX" "$S" add "$KEY" --manifest ./app.manifest.json
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 可靠性与网络边界
|
|
135
|
+
|
|
136
|
+
当前平台 Kafka 是单节点,重启会短暂不可用;没有高可用承诺。按 at-least-once 设计,消费方用业务事件 ID 去重、成功处理后提交 offset,并实现重连与重试。Kafka 不是业务记录系统,权威数据仍在业务数据库 / 对象存储;消息过期后的补偿由 App 自己实现。
|
|
137
|
+
|
|
138
|
+
隔离粒度是 **App,不是租户**。一个 App 内不同租户的消息,租户字段、消费授权及数据隔离由 App 负责。
|
|
139
|
+
|
|
140
|
+
SASL_PLAINTEXT 只认证,不加密消息。HOST 和一盒 EXTERNAL 默认回环;跨 VM 接入由运维同时配置外部监听、客户端可达的广告地址与限来源安全组,不能只改 bootstrap 地址。不要自行开放公网端口。备份 / 恢复必须同时保留 Kafka 卷、`KAFKA_CLUSTER_ID` 和配置,不能把同一个卷搭配新集群 ID。
|
|
@@ -22,8 +22,13 @@
|
|
|
22
22
|
|
|
23
23
|
| 你看到 | 真相 |
|
|
24
24
|
| --- | --- |
|
|
25
|
-
| `portal-api` / `files-server` / `git-server` … 长期 `(unhealthy)`,但功能一切正常 | **先读探针再判**:`docker inspect <容器> --format '{{json .Config.Healthcheck.Test}}'`。是 `curl -fsS …/health` ⇒ **假红**,且说明这盒的 compose 是旧镜像那份(精简镜像没装 `curl`,`.State.Health` 里清一色 `curl: not found`);已经是 `bun -e fetch(...)` ⇒ **真红**,去看 `"$S" dc logs <服务>`。判活一律以 `"$S" smoke` 为准;pg/redis/
|
|
25
|
+
| `portal-api` / `files-server` / `git-server` … 长期 `(unhealthy)`,但功能一切正常 | **先读探针再判**:`docker inspect <容器> --format '{{json .Config.Healthcheck.Test}}'`。是 `curl -fsS …/health` ⇒ **假红**,且说明这盒的 compose 是旧镜像那份(精简镜像没装 `curl`,`.State.Health` 里清一色 `curl: not found`);已经是 `bun -e fetch(...)` ⇒ **真红**,去看 `"$S" dc logs <服务>`。判活一律以 `"$S" smoke` 为准;pg/redis/RustFS 的 healthy 一直是真的 |
|
|
26
26
|
| `reverse-proxy` 长期 `(unhealthy)`,而 `https://localhost/` 一切正常 | **旧镜像上必然的假红**(与站点地址有关,不是 Caddy 坏了):那条探针是 `wget -q -O /dev/null http://127.0.0.1:80/`,`XGENT_SITE_ADDRESS` 一旦是主机名,Caddy 就把它 308 到 `https://127.0.0.1/` —— 对一个 **IP** 建 TLS 没有 SNI,`on_demand_tls` 选不出证书,回 `SSL alert number 80`(`docker inspect <容器> --format '{{range .State.Health.Log}}{{.Output}}{{end}}'` 能看到)。新镜像换成了不跟随重定向的 `curl -fsS -o /dev/null http://127.0.0.1:80/`,308 本身即判活 |
|
|
27
|
+
| `up` 提示「资产是旧版」/ 没有 rustfs 服务或切换脚本 | 指定新版 tag 跑 `"$S" upgrade --image <ref>` 后 `up`;沿用 latest 先 pull,再 upgrade → up。init --force 是重置,不用于升级 |
|
|
28
|
+
| RustFS 控制台端口根路径返回 403 | 打开 `http://localhost:<MINIO_CONSOLE_PORT>/rustfs/console/`;存活探测走 API 口 `/health` |
|
|
29
|
+
| PostgreSQL 报版本不兼容,或升级前检查提示未知/冲突数据布局 | 保留现有卷和原镜像,勿 down -v。脚本按卷内 PG_VERSION 保留已有大版本与挂载点;不能识别时先核对布局,不初始化空库。真正的大版本迁移另行备份并用 pg_upgrade/导出恢复 |
|
|
30
|
+
| 对象存储切换未提交、退出 10/20 | 按脚本提示处理并保留备份;原服务会在安全条件满足时恢复。已检测到正式 RustFS 时不要删除新卷 |
|
|
31
|
+
| 已提交但 RustFS 不健康 / 回退提示数据有变化 | `rustfs-data` 是权威,勿删。回退先隔离正式服务,变化时拒绝回旧卷,需复制新卷做人工核验;细节见 SKILL.md §6 |
|
|
27
32
|
| `curl http://localhost/api/health` → 404 `路由不存在` | **探错路径了。** 门户健康端点是 `/health`,不带 `/api`;各服务是 `/svc/<key>/health` |
|
|
28
33
|
| 改了 `compose.env` 却「没生效」 | 这份文件是**拼装**出来的(基础模板 + 一盒增量 + devkit 增量 + 本机覆盖块),同一个键出现三四次很常见。**docker compose 后定义者胜**,你多半改在了中间那处。`"$S" env` 会把「同键多个不同值」标出来,并显示实际生效的那个。改配置一律往**文件最末尾**加 |
|
|
29
34
|
| 一盒里 `bun --filter @xgent/<某个>-server …` 报 `no packages matched the filter` | **刻意的。** 精简镜像只保留 `files` / `llm-gateway` / `git` / `org` 四个基础服务的代码,其余在构建时就删掉了(`ingest` 已移出基础集) |
|
|
@@ -47,7 +52,7 @@
|
|
|
47
52
|
| 「镜像域名与配置里的 REGISTRY 对不上」 | `--image` 的域名段和 `REGISTRY` 不是同一个 —— 登录 A 却去 B 拉,必然 401。对齐这两个再来 |
|
|
48
53
|
| 想确认账号到底能不能用 | **判据只有 `docker pull` 本身。** 别拿 `curl` 去探仓库的管理 API(`/v2/_catalog` 之类)——只读账号在那里的 401/403 跟能不能拉是两回事 |
|
|
49
54
|
| `manifest unknown` / `not found` | 按顺序查两条。① **项目名不对**——一盒镜像与**你自己 App 的镜像不在同一个项目**下,而 `.xgent-registry.env` 里的 `PROJECT` 是后者(`xgent-image-push` 用的那个)。填 `ONEBOX_PROJECT=<一盒的项目名>`(找开发团队要),或 `--image` 给全。脚本回退用 `PROJECT` 时会打一行黄色告警,**那行就是答案**。② **tag 写错**——一盒只有 `:latest`(可变指针)和 `:v<版本>-<7位sha>`(不可变)两种,别自己编版本号 |
|
|
50
|
-
| 拉过了却还是旧的一版(修好的 bug 又出现) | 用的是 `:latest` 而本地已经有一份同名的 —— `docker run` / compose
|
|
55
|
+
| 拉过了却还是旧的一版(修好的 bug 又出现) | 用的是 `:latest` 而本地已经有一份同名的 —— `docker run` / compose **默认不回仓库查**。先 `onebox.sh pull` 更新 latest 缓存,再 `upgrade` → `up` 同步资产;要钉住某一版用 `upgrade --image <ref>` |
|
|
51
56
|
| `no matching manifest for linux/amd64` | 一盒只发 arm64(它是给开发机用的调试底座)。`--platform linux/arm64` 硬拉下来容器也起不来(`exec format error`)。要 amd64 找开发团队 |
|
|
52
57
|
| **你自己的** `app-backend` 起来就 `exec format error`(或 `no matching manifest`) | 架构反了:生产镜像按规矩是 **amd64**,而开发机多半是 arm64,devkit 跟随本机架构、不会替你转译。叠一层 override 指定平台(SKILL.md §1 有现成的 `app-platform.yml`),Apple Silicon 上走 Rosetta,慢但能跑。⚠️ 别为了本地方便去发一个 arm64 的生产 tag |
|
|
53
58
|
| 卡在 `Retrying in N seconds` 直到超时 | 链路或代理。把 `HTTP_PROXY`/`HTTPS_PROXY` 与 Docker Desktop 的代理设置对齐,或临时关掉代理重试 |
|
|
@@ -62,7 +67,13 @@
|
|
|
62
67
|
|
|
63
68
|
| 症状 | 成因与修法 |
|
|
64
69
|
| --- | --- |
|
|
65
|
-
| `port is already allocated` |
|
|
70
|
+
| `port is already allocated` | HTTP/HTTPS、PG、Redis、RustFS 加上 Kafka HOST/EXTERNAL 共 8 个宿主口。`init` 为原有 6 口与 Kafka HOST(`KAFKA_PORT`,9092/19092/29092)自动避让;Kafka EXTERNAL 默认回环 9095,占用时另设 `KAFKA_EXTERNAL_PORT`。自动挑选只避开当时被占的,但你**之后**又起了别的东西就会撞——改 `compose.env` 末尾那几行。⚠️ 改了 `HTTP_PORT` 要同步 `PORTAL_BASE_URL` 与 `FILES_APP_URL`,否则浏览器侧的绝对链接指错端口(`"$S" env` 会告警) |
|
|
71
|
+
| Kafka 未健康,但 `up` 继续运行 | Kafka 最多软等 60 秒,失败不阻塞门户。先 `"$S" doctor`、`"$S" dc logs --tail 50 kafka`;TCP healthy 也不代表某个 App 的账号/ACL 可用。基础设施起停不会自动供给 App 身份,勿拿管理员密码替代 |
|
|
72
|
+
| Kafka 日志报 `InconsistentClusterIdException` / cluster ID 不匹配 | 配置与已有卷不配对。保留卷,恢复与该卷对应的原 `KAFKA_CLUSTER_ID`;从备份核对,不运行 `init --force` 重生成,不删卷、不换空目录 |
|
|
73
|
+
| Kafka `Permission denied`,使用了 `KAFKA_DATA_DIR` | 确认使用原来的绝对路径、目录属主为 `1000:1000`,再重试。默认命名卷不需要另找宿主目录;不要用换目录绕过权限问题 |
|
|
74
|
+
| Kafka 外部 bootstrap 能连,但读取 metadata 后超时 | broker 返回的 EXTERNAL 广告地址对客户端不可达;生产运维需同时核对 `KAFKA_EXTERNAL_BIND`、非回环的 `KAFKA_EXTERNAL_HOST`、端口与安全组。一盒保持回环;宿主用 HOST,同 compose 网络用 `kafka:9092` |
|
|
75
|
+
| 升级后缺 Kafka 三键 / 仍是开发默认 | `"$S" upgrade` 使用新版资产,只补缺 `KAFKA_CLUSTER_ID` / `KAFKA_ADMIN_PASSWORD` / `KAFKA_PORT`,已有值保留;不要手动填空赋值阻止生成。需修复已有空值时先核对卷和原配置,不要给已有卷随机新 ID |
|
|
76
|
+
| Kafka 主题不存在且没有自动创建 | `auto.create.topics.enable=false` 是配置约定,不能靠发送消息隐式创建;App 身份与主题授权由后续供给流程处理,不使用管理账号接业务 |
|
|
66
77
|
| 起了一盒,**别的** compose 栈的容器被停/被接管 | 两套栈同名。`COMPOSE_PROJECT_NAME` 相同 ⇒ compose 认为是同一项目,容器名冲突、命名卷共享。一盒项目名固定 `xgent-onebox`,同机只该有一套——已有在跑的一盒时别再 init 第二套,把你的 App 接进现有那套(SKILL.md 文首「一套就够」) |
|
|
67
78
|
| 报缺 `APP_IMAGE` / `APP_KEY` | `docker-compose.app-dev.yml` 里的 `${APP_IMAGE:?}` 是**解析期**求值的,跟 profile 无关。`$S` 会按 `compose.env` 里这两行有没有值自动决定带不带那层——手敲 compose 时才会撞上 |
|
|
68
79
|
| 报缺 `APP_FRONTEND_DIST` | 你给 `service` 型 App 叠了前端 override。service 无前端,不要那层 |
|
|
@@ -78,7 +89,7 @@
|
|
|
78
89
|
|
|
79
90
|
| 症状 | 成因与修法 |
|
|
80
91
|
| --- | --- |
|
|
81
|
-
| `/svc/<key>/...` → **404** | `/svc` 放行 map 没写成,或**反代在写 map 之前就起了**(Caddy 启动时才读那个目录,不会热重载)。跑 `register-app`,然后 `"$S" dc exec reverse-proxy caddy reload` |
|
|
92
|
+
| `/svc/<key>/...` → **404** | `/svc` 放行 map 没写成,或**反代在写 map 之前就起了**(Caddy 启动时才读那个目录,不会热重载)。跑 `register-app`,然后 `"$S" dc exec reverse-proxy caddy reload`(`add` / `up` 注册完会自动重读;只有自己手工跑 `register-app` 时才要这一步) |
|
|
82
93
|
| `register-app` 输出里有 `/svc 放行未写成 … EACCES: permission denied`,随后 `/svc/<key>` 404 | 命名卷属主不对,见 **[§7](#7-命名卷属主不对eacces-一族)**(那一节的修法一次修好全部三个卷)。注册本身是成功的,缺的只是那一行放行 |
|
|
83
94
|
| `/svc/<key>/...` → **502** | 后端不在。① 容器没起/崩了:`"$S" dc logs app-backend`;② 没监听容器内 **8080**(反代的通用规则是 `/svc/<key>/* → <key>-server:8080`,多数镜像认 `PORT`,你的若要别的变量名就在 `compose.env` 里补);③ `APP_KEY` 与 manifest 的 `listingKey` 不一致,网络别名 `<key>-server` 没命中 |
|
|
84
95
|
| 探测全是 **000** | 反代根本没起,或你探的端口不是 `HTTP_PORT`。`"$S" dc ps` / `"$S" dc logs reverse-proxy` |
|
|
@@ -104,8 +115,9 @@
|
|
|
104
115
|
|
|
105
116
|
| 症状 | 成因与修法 |
|
|
106
117
|
| --- | --- |
|
|
107
|
-
| `register-app` 成功、控制台「清单管理」也看得到,但**演示租户的应用市场里没有卡片** | 授予行没写成。市场对租户是 **fail-closed** 的:没有 `tenant_listing_grants` 行就连卡片都不出现,且**不报错**。dev 模式的 `register-app`
|
|
118
|
+
| `register-app` 成功、控制台「清单管理」也看得到,但**演示租户的应用市场里没有卡片** | 授予行没写成。市场对租户是 **fail-closed** 的:没有 `tenant_listing_grants` 行就连卡片都不出现,且**不报错**。dev 模式的 `register-app` 本该顺手授予现有租户——**旧一点的一盒镜像里没有这段代码**,所以按 SKILL.md §6 更新缓存后 `upgrade` → `up` 换新镜像与资产重跑一遍;换了还没有,就用平台管理员账号在控制台「租户 → 可用应用」里把它勾上(或 `PUT /api/console/tenants/<id>/apps`),再回市场安装 |
|
|
108
119
|
| `register-app` 报 `VALIDATION_FAILED`(scope) | manifest 声明了**别的 App 的 scope**,却没把那个 App 列进 `exchangeTargets`。规则:一个 listing 能声明的 scope = 平台基础 scope ∪ 本 namespace(`<listingKey>` 及其下划线变体,如 `omni-parser` → `omni_parser`)∪ 已声明 `exchangeTargets` 的 namespace |
|
|
120
|
+
| `register-app` 报 `DEPENDENCY_UNAVAILABLE`(依赖的应用清单不存在:`<dep>`) | 清单 `dependencies` 里的 App 在这台一盒里还没有**注册**(跟装没装无关)。先 `"$S" add <dep>`(`add` 会在拉镜像之前预检,把缺的一次列全)。如果你自己的 App 是靠 `up` 注册的,补完依赖后**单独**重跑注册那一条:`"$S" dc run --rm -v "$PWD:/devkit:ro" portal-api bun run register-app /devkit/app.manifest.json`。**别重跑 `up`**:它的种子会 truncate 清单表,刚加的依赖又没了。之后在「应用管理 → 应用市场」里安装你的 App,依赖会一起装上 |
|
|
109
121
|
| `register-app` 拒跑,提到 production | dev 模式的 `register-app` 拒绝 `NODE_ENV=production`。`compose.env` 末尾必须有 `NODE_ENV=development` |
|
|
110
122
|
| 跑完 `db:seed:onebox` 后市场里找不到你的 App | **顺序反了。** 种子第一步是 `truncate … marketplace_listings … cascade`,先注册后种子 = 注册被清掉。必须 seed 在前、register-app 在后 |
|
|
111
123
|
| `seed:onebox` 报 `unknown listing key` | 那个 key 既不是内置基础服务,`app-devkit/manifests/<key>.manifest.json` 也不存在。要么放一份 manifest 进去,要么把它从 `XGENT_APP_CATALOG` 里去掉 |
|
|
@@ -124,29 +136,13 @@
|
|
|
124
136
|
旧镜像里这三个目录压根不存在,于是谁先起谁定调,卷落到 root 手里,portal-api 就写不进去了。
|
|
125
137
|
`one-box` / `proxy` 的 **v1.2.0 起**已在 runtime 层预建这三个目录并 chown 给 `bun`(`latest` 已指向它)。
|
|
126
138
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
> 两件事要一起做,顺序是 **先换镜像、再删卷**。
|
|
139
|
+
镜像升级不会自动改变已有卷的属主。先按 SKILL.md §6 更新镜像缓存,再用 `"$S" upgrade` 同步部署资产,再按下面的定点修法纠正
|
|
140
|
+
这三个目录的属主;不需要删除 PostgreSQL 或对象存储卷。随后 `"$S" up` 会按一盒既有规则重种门户库。
|
|
130
141
|
|
|
131
|
-
|
|
142
|
+
若主动选择丢弃所有当前联调数据,可按 SKILL.md §6 的重置路径执行 `dc down -v` → `init --force` → `up`。
|
|
143
|
+
重置会丢失 App 数据与对象;它不是升级的必经步骤。
|
|
132
144
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
```bash
|
|
136
|
-
S="$SKILL_DIR/scripts/onebox.sh"
|
|
137
|
-
# 1) 换到 v1.2.0+(compose.env 末尾若把 XGENT_IMAGE / XGENT_PROXY_IMAGE 钉了 tag,先改成 latest 或 v1.2.0-*)
|
|
138
|
-
"$S" pull
|
|
139
|
-
# 2) 连卷一起删 —— pg / minio / apps / caddy 全没,这一步就是目的
|
|
140
|
-
"$S" dc down -v
|
|
141
|
-
# 3) 按 SKILL.md §2 的固定顺序重铺:migrate → seed:onebox → 各库 migrate → register-app → up
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
重铺完记得**重跑 `register-app`**(listing 被种子清掉了),浏览器要重登一次 dev 登录(种子换了 UUID)。
|
|
145
|
-
|
|
146
|
-
**自查在哪一版**:`docker images --digests | grep -E 'one-box|/proxy'`。旧版 `one-box` 是
|
|
147
|
-
`sha256:76b99254…`、`proxy` 是 `sha256:1e44e014…`;新版分别是 `sha256:7011de3b…` / `sha256:a0c9f304…`。
|
|
148
|
-
|
|
149
|
-
### 备选:就地 chown(只在你确实不想重跑种子时)
|
|
145
|
+
### 定点修复属主
|
|
150
146
|
|
|
151
147
|
反代是 root 且挂着同样这三个卷,所以补属主不必进 portal-api:
|
|
152
148
|
|