@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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// Standalone CSP declaration syntax snapshot; server capability and approval remain separate.
|
|
2
|
+
export const EMBED_CSP_SOURCE_FIELDS = Object.freeze([
|
|
3
|
+
"connectSrc",
|
|
4
|
+
"scriptSrc",
|
|
5
|
+
"styleSrc",
|
|
6
|
+
"fontSrc",
|
|
7
|
+
"imgSrc",
|
|
8
|
+
"mediaSrc"
|
|
9
|
+
]);
|
|
10
|
+
export const EMBED_CSP_PLATFORM_FIELDS = Object.freeze([
|
|
11
|
+
"scriptSrc",
|
|
12
|
+
"styleSrc",
|
|
13
|
+
"fontSrc",
|
|
14
|
+
"connectSrc"
|
|
15
|
+
]);
|
|
16
|
+
const unsafe = /[\s\u0000-\u001f\u007f-\u009f\\'"`{};*]/u;
|
|
17
|
+
const CONNECT_SCHEME_SOURCES = ["blob:", "data:"];
|
|
18
|
+
function fail(field, reason) {
|
|
19
|
+
throw new Error(`${field}: ${reason}`);
|
|
20
|
+
}
|
|
21
|
+
function record(value, allowed, field) {
|
|
22
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
23
|
+
fail(field, "expected an object");
|
|
24
|
+
}
|
|
25
|
+
const prototype = Object.getPrototypeOf(value);
|
|
26
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
27
|
+
fail(field, "expected a plain object");
|
|
28
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
29
|
+
if (typeof key !== "string" || !allowed.includes(key))
|
|
30
|
+
fail(field, "unknown field");
|
|
31
|
+
if (!("value" in Object.getOwnPropertyDescriptor(value, key)))
|
|
32
|
+
fail(field, "accessors are not allowed");
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function origin(value, field, options, allowWebSocket, allowPath = false) {
|
|
37
|
+
if (typeof value !== "string")
|
|
38
|
+
fail(field, "expected a string");
|
|
39
|
+
const source = value.replace(/^ +| +$/g, "");
|
|
40
|
+
if (!source || unsafe.test(source))
|
|
41
|
+
fail(field, "empty source or unsafe characters");
|
|
42
|
+
const parts = /^([a-z][a-z0-9+.-]*):\/\/([^/?#]+)(\/[^?#]*)?$/i.exec(source);
|
|
43
|
+
if (!parts)
|
|
44
|
+
fail(field, "expected an explicit origin without query or fragment");
|
|
45
|
+
if (parts[2].includes("@"))
|
|
46
|
+
fail(field, "credentials are not allowed");
|
|
47
|
+
if (!allowPath && parts[3] !== undefined && parts[3] !== "/")
|
|
48
|
+
fail(field, "paths are not allowed");
|
|
49
|
+
let url;
|
|
50
|
+
try {
|
|
51
|
+
url = new URL(source);
|
|
52
|
+
} catch {
|
|
53
|
+
fail(field, "invalid URL");
|
|
54
|
+
}
|
|
55
|
+
const secure = url.protocol === "https:" || allowWebSocket && url.protocol === "wss:";
|
|
56
|
+
const devScheme = url.protocol === "http:" || allowWebSocket && url.protocol === "ws:";
|
|
57
|
+
const exactLoopback = /^(?:localhost|127\.0\.0\.1|\[::1\])(?::[0-9]+)?$/i.test(parts[2]);
|
|
58
|
+
if (!secure && !(options.allowDevLoopback === true && devScheme && exactLoopback)) {
|
|
59
|
+
fail(field, "scheme is not allowed; insecure origins require explicit development loopback");
|
|
60
|
+
}
|
|
61
|
+
if (url.username || url.password || url.search || url.hash || url.origin === "null" || unsafe.test(url.origin)) {
|
|
62
|
+
fail(field, "invalid origin");
|
|
63
|
+
}
|
|
64
|
+
return url.origin;
|
|
65
|
+
}
|
|
66
|
+
export function normalizeEmbedCsp(value, options = {}) {
|
|
67
|
+
if (value === undefined || value === null)
|
|
68
|
+
return value;
|
|
69
|
+
const input = record(value, [...EMBED_CSP_SOURCE_FIELDS, "platformSources"], "embedCsp");
|
|
70
|
+
const result = {};
|
|
71
|
+
for (const field of EMBED_CSP_SOURCE_FIELDS) {
|
|
72
|
+
if (!Object.prototype.hasOwnProperty.call(input, field))
|
|
73
|
+
continue;
|
|
74
|
+
const sources = input[field];
|
|
75
|
+
if (!Array.isArray(sources))
|
|
76
|
+
fail(`embedCsp.${field}`, "expected an array");
|
|
77
|
+
const normalized = [];
|
|
78
|
+
for (const source of sources) {
|
|
79
|
+
if (field === "connectSrc" && typeof source === "string" && CONNECT_SCHEME_SOURCES.includes(source.replace(/^ +| +$/g, "")))
|
|
80
|
+
normalized.push(source.replace(/^ +| +$/g, ""));
|
|
81
|
+
else
|
|
82
|
+
normalized.push(origin(source, `embedCsp.${field}`, options, field === "connectSrc"));
|
|
83
|
+
}
|
|
84
|
+
if (normalized.length)
|
|
85
|
+
result[field] = [...new Set(normalized)].sort();
|
|
86
|
+
}
|
|
87
|
+
if (Object.prototype.hasOwnProperty.call(input, "platformSources")) {
|
|
88
|
+
const aliases = record(input.platformSources, EMBED_CSP_PLATFORM_FIELDS, "embedCsp.platformSources");
|
|
89
|
+
const platformSources = {};
|
|
90
|
+
for (const field of EMBED_CSP_PLATFORM_FIELDS) {
|
|
91
|
+
if (!Object.prototype.hasOwnProperty.call(aliases, field))
|
|
92
|
+
continue;
|
|
93
|
+
const values = aliases[field];
|
|
94
|
+
if (!Array.isArray(values))
|
|
95
|
+
fail(`embedCsp.platformSources.${field}`, "expected an array");
|
|
96
|
+
for (const alias of values) {
|
|
97
|
+
if (alias !== "jsCdn")
|
|
98
|
+
fail(`embedCsp.platformSources.${field}`, "expected jsCdn alias");
|
|
99
|
+
}
|
|
100
|
+
if (values.length)
|
|
101
|
+
platformSources[field] = ["jsCdn"];
|
|
102
|
+
}
|
|
103
|
+
if (Object.keys(platformSources).length)
|
|
104
|
+
result.platformSources = platformSources;
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
export function resolveEmbedCsp(csp, jsCdnBase, options = {}) {
|
|
109
|
+
const normalized = normalizeEmbedCsp(csp, options);
|
|
110
|
+
const result = {};
|
|
111
|
+
if (!normalized)
|
|
112
|
+
return result;
|
|
113
|
+
for (const field of EMBED_CSP_SOURCE_FIELDS) {
|
|
114
|
+
if (normalized[field])
|
|
115
|
+
result[field] = [...normalized[field]];
|
|
116
|
+
}
|
|
117
|
+
if (normalized.platformSources) {
|
|
118
|
+
const cdnOrigin = origin(jsCdnBase, "jsCdnBase", options, false, true);
|
|
119
|
+
for (const field of EMBED_CSP_PLATFORM_FIELDS) {
|
|
120
|
+
if (normalized.platformSources[field]?.includes("jsCdn")) {
|
|
121
|
+
result[field] = [...new Set([...result[field] ?? [], cdnOrigin])].sort();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 前端归档与同步验收
|
|
2
|
+
|
|
3
|
+
适用于带同源前端的应用发布,以及「manifest 已有但前端包缺失」的调查。
|
|
4
|
+
服务型应用没有前端,不要求 dist;有前端的应用不能用「只发 manifest/镜像」代替前端交付。
|
|
5
|
+
|
|
6
|
+
## 三处存储的区别
|
|
7
|
+
|
|
8
|
+
| 位置 | 内容 | 能证明什么 |
|
|
9
|
+
| --- | --- | --- |
|
|
10
|
+
| App 仓/CI 的持久制品存储 | 本次实际上传的原始 tgz、SHA-256 与发布记录 | 可以重传完全相同的字节 |
|
|
11
|
+
| 目标门户发布面 | 生效清单、解压后的前端及当前原始归档 | 当前应用的实际交付 |
|
|
12
|
+
| MANIFEST_STORE 的 catalog | 净化后的公开 manifest,没有前端包 | 可以查清单,不能证明可同步 |
|
|
13
|
+
|
|
14
|
+
跨平台同步源读取主平台的已生效 listing。若 TARGET_XGENT_PLATFORM 与主平台不同,
|
|
15
|
+
向 MANIFEST_STORE 投清单不会把 tgz 发到主平台,也不会让主平台 listing 生效。
|
|
16
|
+
主平台上的发布使用绑定该 App 的 xrel_ 走发布提案;xcat_ 只能读同步源,不能上传前端包。
|
|
17
|
+
|
|
18
|
+
## 先留存实际上传的包
|
|
19
|
+
|
|
20
|
+
CLI 的 `--dist dist/` 会生成临时 tgz,命令结束后删除它。预检也只生成临时包。
|
|
21
|
+
二者都不是持久归档。先预检 dist 目录,再显式打包并将文件交给 CLI:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
set -e
|
|
25
|
+
# LISTING_KEY、VER 已从本次配置与版本确定;不把令牌取出写入发布记录。
|
|
26
|
+
RELEASE_DIR=".xgent-releases/$LISTING_KEY/$VER"
|
|
27
|
+
DIST_ARCHIVE="$RELEASE_DIR/dist.tgz"
|
|
28
|
+
mkdir -p "$RELEASE_DIR"
|
|
29
|
+
if test -e "$DIST_ARCHIVE"; then
|
|
30
|
+
echo "已有发布包:核对记录后复用,或使用新版本;不要覆盖原归档" >&2
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
tar czf "$DIST_ARCHIVE" -C dist .
|
|
34
|
+
gzip -t "$DIST_ARCHIVE"
|
|
35
|
+
shasum -a 256 "$DIST_ARCHIVE" > "$DIST_ARCHIVE.sha256"
|
|
36
|
+
bunx @xgent/release-cli publish --version "$VER" --dist "$DIST_ARCHIVE" \
|
|
37
|
+
--manifest deploy/portal/app.manifest.json
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
发布后把目标门户、key、version、proposalId、包摘要及提交/审批结果写入项目现有发布记录,
|
|
41
|
+
并核对发布响应的 distDigest 与包摘要一致。pending 时保留包并报告待审,不能报告已生效。
|
|
42
|
+
将 `.xgent-releases/` 加入项目 gitignore;产物不提交源码仓。CI 必须将包、校验文件和发布记录
|
|
43
|
+
上传到项目已有的持久制品存储,记录下载位置;仅留 runner 临时目录不算归档。
|
|
44
|
+
该目录与存储中不放发布令牌或配置文件。
|
|
45
|
+
|
|
46
|
+
## 可同步性单独验收
|
|
47
|
+
|
|
48
|
+
主平台的同步源需要部署级 xcat_ 读取权限,App 发布用的 xrel_ 无此权限。
|
|
49
|
+
已有权限时只读检查;没有权限时由平台管理员核验,明确记录未验证,不自行签发令牌或改平台设置。
|
|
50
|
+
|
|
51
|
+
1. 查询 `GET /api/federation/apps/:key`,要求 Envelope.ok 为 true、data 非 null、
|
|
52
|
+
syncable 为 true、version 与本次已生效版一致;带前端应用的 distDigest 必须非空且等于上传包摘要。
|
|
53
|
+
列表 `/api/federation/apps` 不检查归档,不能用列表的 syncable 代替条目检查。
|
|
54
|
+
2. 下载 `GET /api/federation/apps/:key/dist` 的实际 tgz,拒绝 JSON 错误体;复核 SHA-256
|
|
55
|
+
等于条目 distDigest 与留存包摘要,并验证压缩包完整、根下有 index.html。
|
|
56
|
+
3. 分别记录发布、审批/部署/网关、浏览器主路径、原始包留存、主平台可同步性结果。
|
|
57
|
+
页面能开或 status 的 digest 正确,都不能代替第 1、2 项。
|
|
58
|
+
|
|
59
|
+
## 调查 DIST_ARCHIVE_MISSING
|
|
60
|
+
|
|
61
|
+
先核对当前 distDigest、发布时点、当时门户版本与包留存记录,再检查主平台本地/平台池的当前归档。
|
|
62
|
+
不要把这个错误直接归因于 App 团队漏传 dist:摘要存在通常说明曾上传过,可能是历史服务端删除了包。
|
|
63
|
+
旧版门户发布成功会删除提案归档,控制台直传也未保留原包;升级后的归档保留逻辑不会恢复已删历史包。
|
|
64
|
+
|
|
65
|
+
若多个 App 同时缺包,整理所有受影响 key、版本、摘要、发布路径与原因,核对归档保留功能的
|
|
66
|
+
上线时间;修正发布/验收流程,不能只修一条后宣称整个流程恢复。
|
|
67
|
+
已有原始包时可以提出同字节重传方案;没有原始包时,解压目录重打包会改变摘要,不能冒称恢复原归档。
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 发布后的公开面、CSP 与交付确认
|
|
2
|
+
|
|
3
|
+
## 版本与启用前提
|
|
4
|
+
|
|
5
|
+
本节契约由 `@xgent/shared 0.7.0`、`@xgent/release-cli 0.7.0` 起提供,两包已在私有包仓发布。
|
|
6
|
+
装上新版本只代表客户端认识这些字段与交付状态,**不代表目标门户已上线对应能力**:实际使用前回读
|
|
7
|
+
目标门户的能力,并以平台发布公告为准。
|
|
8
|
+
|
|
9
|
+
严格 CSP 校验默认关闭。平台完成历史来源盘点、兼容检查及受控 v2 网关切换后,才可启用扩展声明。
|
|
10
|
+
只更新 App 的依赖、看到 whoami 成功或通过本地预检,都不代表服务器已启用。未启用时旧门户仍只接受
|
|
11
|
+
connectSrc 兼容契约;不能凭空添加其他指令后宣称生效。预检会按新生产语法检查并提示能力门,不能替平台开启它。
|
|
12
|
+
|
|
13
|
+
## 入口与权限边界
|
|
14
|
+
|
|
15
|
+
| 页面 | 正式入口 | 关键责任 |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| 前端静态/SPA 匿名页 | `/apps/<key>/…` | 正确 base、嵌套路由刷新、匿名页不先强制登录;数据授权仍由 App 验证 |
|
|
18
|
+
| 后端直出 HTML | `/svc/<key>/…` | App 适配 cookie Path、form、fetch、Location、资源与预览;后端自己设置 CSP |
|
|
19
|
+
| 站点/独立域名 | `publicEntrypoints` + Sites | 申请 sites 服务特权,满足平台开关、DNS/TLS/路由和租户权益;独立核对站点修订 |
|
|
20
|
+
|
|
21
|
+
Sites 需要平台启用、登记入口和 DNS,租户具有 sites.enabled/portal.public_sites,自定义域还需
|
|
22
|
+
portal.custom_site_domains。`sites.read/write` 经 privilegedServiceScopes 申请,不是用户权限。
|
|
23
|
+
publicEntrypoints 只声明站点可绑定的后端前缀,不增加门户根代理。新 App 不得占用 `/v`、`/share`。
|
|
24
|
+
历史根路径和 listingKey 改名均需另行迁移授权;改链接前缀不能代替 cookie、子请求和数据归属迁移。
|
|
25
|
+
|
|
26
|
+
## 六类来源声明
|
|
27
|
+
|
|
28
|
+
`embedCsp` 仅扩展本 App 的 `/apps/<key>/` 托管前端策略,不改变门户壳、沙箱或后端公开 HTML 的 CSP。
|
|
29
|
+
完整 manifest 中可申报:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"embedCsp": {
|
|
34
|
+
"connectSrc": ["https://api.example.com", "wss://events.example.com"],
|
|
35
|
+
"scriptSrc": ["https://components.example.com"],
|
|
36
|
+
"styleSrc": ["https://styles.example.com"],
|
|
37
|
+
"fontSrc": ["https://fonts.example.com"],
|
|
38
|
+
"imgSrc": ["https://images.example.com"],
|
|
39
|
+
"mediaSrc": ["https://media.example.com"],
|
|
40
|
+
"platformSources": { "scriptSrc": ["jsCdn"], "styleSrc": ["jsCdn"], "fontSrc": ["jsCdn"], "connectSrc": ["jsCdn"] }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
来源是精确 origin(协议、主机、可选端口),生产只接受 HTTPS;仅 connectSrc 另接受 WSS。
|
|
46
|
+
允许末尾 `/`,不允许路径、query、fragment、凭据、通配符、控制字符、嵌入空白或未知字段。
|
|
47
|
+
唯一例外:connectSrc 可原样申报 `blob:`、`data:`(前端 `fetch()` 本地 blob/data URL 时需要),
|
|
48
|
+
其余字段不接受,`blob:https://…`、`data:,x` 等带内容的写法也不接受。
|
|
49
|
+
不能申报 unsafe-inline、unsafe-eval、self、nonce、hash 等 CSP 关键字,也不能申报其他 scheme 源。
|
|
50
|
+
App 不能修改 frame-ancestors、base-uri、object-src;平台既有兼容基线不是可自行申请的权限。
|
|
51
|
+
开发环回 HTTP/WS 仅在服务端显式开发模式允许,本发布预检按生产规则拒绝。
|
|
52
|
+
|
|
53
|
+
platformSources 只允许上述四个指令,值只允许 jsCdn,映射到目标门户当前配置的 CDN origin;
|
|
54
|
+
不把某套门户 CDN 域名写死在 App 清单。它不能用于 imgSrc/mediaSrc,也不扩散到其他 App。
|
|
55
|
+
|
|
56
|
+
省略整个 embedCsp 沿用已批准声明;null 清空额外声明;提供对象是**完整替换**,不是逐指令合并,
|
|
57
|
+
未写指令会撤回,空数组表示该指令无额外来源。来源增删、清空和别名变更均按实际差异进入治理审核;
|
|
58
|
+
排序、重复项及等价 origin 归一化后不制造变更。若省略后没有差异,不会仅因省略而进审。
|
|
59
|
+
|
|
60
|
+
## 固定提案的四阶段
|
|
61
|
+
|
|
62
|
+
1. 审批:pending 等人工;提交成功不等于批准。
|
|
63
|
+
2. 清单/产物应用:提案 applied 只说明这一阶段完成,仍检查 applyError。
|
|
64
|
+
3. 后端:只接受本次固定配置目标的实际运行证据;最近任务 succeeded 或别的镜像 ready 不代替它。
|
|
65
|
+
4. 网关:只接受本次目标摘要和修订匹配的回执;纯前端后端为 not_applicable,仍要等待网关。
|
|
66
|
+
|
|
67
|
+
支持新 delivery 的门户配合新版 CLI:`publish --wait` 等获批后的后端与网关;pending 仍直接退出 0,
|
|
68
|
+
需要等人工决定使用 `--wait-review`。继续追踪用 `status --proposal-id <id> --wait`。
|
|
69
|
+
失败或 superseded 非零退出;unknown 不能当成功,继续等待到预算结束仍未确认则非零退出。
|
|
70
|
+
旧门户没有 delivery 时只按旧后端规则兼容,并明确提示“无法核验网关”;退出 0 也不声称完整交付确认。
|
|
71
|
+
|
|
72
|
+
网关失败由平台管理员重试网关配置,不必重发清单,也不触发后端重部署。发布令牌没有管理员重试权限。
|
|
73
|
+
API 字段与端点见 [发布 API](publish-api.md)。交付确认仍不是业务可用性的替代:真实验正文、CSP、
|
|
74
|
+
正确/错误口令、过期/撤销、表单/数据源、预览权限、跨租户拒绝和重部署后的访问。HTTP 200 可能是占位页。
|
|
75
|
+
交接只给提案号、版本、时间、脱敏状态和路径形状,不发 token、环境值或内部上游地址。
|
|
@@ -54,6 +54,10 @@ npx @xgent/release-cli status # 地址与令牌都不用写在命令里
|
|
|
54
54
|
| 第一站(真发版) | `POST <TARGET_XGENT_PLATFORM>/api/market/release/<key>` | **必成**:失败 ⇒ 整体非零退出,且**不投目录** |
|
|
55
55
|
| 第二站(投目录) | `PUT <MANIFEST_STORE>/api/market/catalog/<key>` | **best-effort**:连不上 / 非 2xx / `ok:false` 都只 warn,退出码不变 |
|
|
56
56
|
|
|
57
|
+
第二站仅发送 manifest,**没有 dist 文件**。跨平台同步使用主平台已生效 listing 与原始包,
|
|
58
|
+
不是 catalog。主平台归档留存、目标门户与主平台不同时的交付边界,以及同步验收见
|
|
59
|
+
[前端归档与同步验收](frontend-archive.md)。不要把投目录成功报告成「前端包已归档/可同步」。
|
|
60
|
+
|
|
57
61
|
两个地址相同时**照常两次调用** —— 它们是不同端点,不会互撞。
|
|
58
62
|
没带 `--manifest` 就不投(没有清单可投),CLI 会提示一句 —— 所以**标准发布命令要带上它**。
|
|
59
63
|
|
|
@@ -80,7 +84,7 @@ npx @xgent/release-cli status # 地址与令牌都不用写在命令里
|
|
|
80
84
|
- **一枚令牌只对一个 listing 有效**。拿它去动别的 key 一律 `404`——门户**故意不区分**
|
|
81
85
|
「不属于你」和「那个 App 不存在」,免得令牌变成探测别人 App 是否存在的工具。
|
|
82
86
|
- 可随时吊销、可设过期时间。**每次调用实时查库**,所以吊销后下一次调用就 `401`,没有缓存窗口。
|
|
83
|
-
-
|
|
87
|
+
- 它能**无需人工批准而应用**的仍只有自动通过档:`dist` · `version` · `deployDescriptor.image` ·
|
|
84
88
|
展示字段 ·「值是 App 内路由 `/…`」的 `helpEntry`(外站 `https://…` 那一形态进审核档)。
|
|
85
89
|
治理变更只能**提议**(随 `manifest` 提交,进平台审核队列,批准前库里一字不动)。
|
|
86
90
|
它也**读不回** `descriptor.env`——响应体里永远没有它,因为那里面是生产密钥。
|
|
@@ -90,8 +94,8 @@ npx @xgent/release-cli status # 地址与令牌都不用写在命令里
|
|
|
90
94
|
```
|
|
91
95
|
POST /api/market/release/:key 发布(落成一条发布提案)
|
|
92
96
|
GET /api/market/release/:key whoami(校验令牌,只返回持有者本就知道的东西)
|
|
93
|
-
GET /api/market/release/:key/status
|
|
94
|
-
GET /api/market/release/:key/proposals/:id
|
|
97
|
+
GET /api/market/release/:key/status?proposalId=<id> 只读:兼容状态 + 指定提案 delivery;省略 id 默认最新
|
|
98
|
+
GET /api/market/release/:key/proposals/:id 只读:单条提案状态 + delivery(--wait-review 审批轮询用)
|
|
95
99
|
DELETE /api/market/release/:key/proposals/:id 撤回自己【待审】的提案(提交方的权利)
|
|
96
100
|
```
|
|
97
101
|
|
|
@@ -105,7 +109,7 @@ curl -X POST "$XGENT_PORTAL_URL/api/market/release/<key>" \
|
|
|
105
109
|
-H "authorization: Bearer $XGENT_RELEASE_TOKEN" \
|
|
106
110
|
-F version=1.4.2 \
|
|
107
111
|
-F image=<key>:1.4.2 \ # 可选;没有后端的纯前端 App 省掉
|
|
108
|
-
-F dist=@dist.tgz \ #
|
|
112
|
+
-F dist=@dist.tgz \ # 使用持久留存的原始包;只换后端可省,但不代表前端归档已补齐
|
|
109
113
|
-F manifest=@deploy/portal/app.manifest.json # 可选;清单变更/首次接入时带上
|
|
110
114
|
```
|
|
111
115
|
|
|
@@ -135,7 +139,7 @@ curl -X POST "$XGENT_PORTAL_URL/api/market/release/<key>" \
|
|
|
135
139
|
(scopes / aclManifest / dependencies / exchangeTargets / serviceScopes /
|
|
136
140
|
privilegedServiceScopes / usageMetrics / serviceBaseUrl /
|
|
137
141
|
seat* / scopeLabels / embedUrl / embedCsp / type / 部署形态…,以及**任何门户不认识的字段**)
|
|
138
|
-
⇒ 提案 `pending` 等平台审批;只有版本/产物/镜像/展示字段的差异 ⇒ `auto_approved`
|
|
142
|
+
⇒ 提案 `pending` 等平台审批;只有版本/产物/镜像/展示字段的差异 ⇒ `auto_approved` 自动通过并应用清单/产物。
|
|
139
143
|
其中 `privilegedServiceScopes`(平台特权 scope 的申请,如 `seats.read`)是最高一档:
|
|
140
144
|
审批人要**逐条勾选确认**才能批准 —— 每条都带上说清用途的 `reason`,等待会短很多;
|
|
141
145
|
已持有的特权 scope 幂等重放不再进审。
|
|
@@ -154,7 +158,7 @@ SERVICE_ONLY scope 写进 `serviceScopes`(申请要走 `privilegedServiceScope
|
|
|
154
158
|
|
|
155
159
|
只有三种情况不是 200:`401`(令牌无效/吊销/过期)、`404`(令牌不是为这个 key 签发的),以及真故障。
|
|
156
160
|
|
|
157
|
-
成功时 `data` 里(先看 `status`:`"applied"` =
|
|
161
|
+
成功时 `data` 里(先看 `status`:`"applied"` = 清单/产物阶段已应用,不代表整条交付已确认;`"pending"` = 等审批,此时只有
|
|
158
162
|
`proposalId` / `kind` / `governance`(待审字段清单)有意义):
|
|
159
163
|
|
|
160
164
|
| 字段 | 含义 |
|
|
@@ -166,14 +170,13 @@ SERVICE_ONLY scope 写进 `serviceScopes`(申请要走 `privilegedServiceScope
|
|
|
166
170
|
| `distFiles` | 产物顶层条目数 |
|
|
167
171
|
| `distStores` | 落了哪些存储 |
|
|
168
172
|
| `image` / `imageChanged` / `redeployQueued` | 镜像引用、是否变了、是否排了重部署任务 |
|
|
173
|
+
| `delivery` | 新门户的本提案交付投影;旧门户可能没有该字段,不能据此确认网关 |
|
|
169
174
|
|
|
170
|
-
## 5.
|
|
171
|
-
|
|
172
|
-
一次调用内:解压 → 验根 `index.html` → 落 staging → rename 换上 → **同一次落库** `version` + `distDigest`。
|
|
173
|
-
被拒时 `version` 与 `digest` 都不动,线上产物原封不动。
|
|
175
|
+
## 5. 应用与执行不是一个事务
|
|
174
176
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
+
坏包在解压/staging 校验阶段被拒时不会替换线上产物。之后的清单/产物应用、后端部署与网关加载
|
|
178
|
+
是分阶段执行:后续失败可能发生在清单已经应用之后,须查看 applyError 与 delivery.failureStage。
|
|
179
|
+
不能把任意“发布失败”解释为所有副作用都没发生,也不能把提案 applied 当成完整交付。
|
|
177
180
|
|
|
178
181
|
## 6. `--image` / `image`
|
|
179
182
|
|
|
@@ -201,61 +204,59 @@ SERVICE_ONLY scope 写进 `serviceScopes`(申请要走 `privilegedServiceScope
|
|
|
201
204
|
要多 arch 用 `docker buildx --platform`。
|
|
202
205
|
|
|
203
206
|
引用一变,门户排一条重部署任务:pm2 侧**先拉后换**(拉不到则旧容器原封不动、任务转 failed),
|
|
204
|
-
|
|
207
|
+
执行失败须回读对应阶段;旧容器一旦已被替换,不能承诺继续提供旧服务。
|
|
205
208
|
|
|
206
|
-
## 6.1
|
|
209
|
+
## 6.1 按本次提案查询交付
|
|
207
210
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
不确认这一步,CI 会绿着退出而线上还跑着旧容器。
|
|
211
|
+
新增契约的版本与启用前提见 [公开面与交付确认](public-delivery.md):这些能力尚待正式发包/上线;
|
|
212
|
+
目标门户须提供 delivery,扩展 CSP 还须 strict 与受控 v2 网关。不得仅按包版本标签猜能力已开。
|
|
211
213
|
|
|
212
214
|
```bash
|
|
213
|
-
|
|
214
|
-
npx @xgent/release-cli publish --
|
|
215
|
-
|
|
216
|
-
# 必须卡在人工审批上的流水线,再加一个开关(默认 1800s)
|
|
217
|
-
npx @xgent/release-cli publish --key $KEY --manifest app.manifest.json --wait-review
|
|
218
|
-
|
|
219
|
-
# 或任何时候单查
|
|
220
|
-
npx @xgent/release-cli status --key $KEY
|
|
215
|
+
npx @xgent/release-cli publish --version "$VER" --dist dist/ --manifest app.manifest.json --wait
|
|
216
|
+
npx @xgent/release-cli publish --manifest app.manifest.json --wait-review
|
|
217
|
+
npx @xgent/release-cli status --proposal-id <id> --wait
|
|
221
218
|
```
|
|
222
219
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
| 开关 | 等什么 | 提案落成待审时 |
|
|
220
|
+
| 开关 | 等什么 | 新提交为 pending 时 |
|
|
226
221
|
| --- | --- | --- |
|
|
227
|
-
| `--wait [秒]` |
|
|
228
|
-
| `--wait-review [秒]` |
|
|
229
|
-
|
|
230
|
-
`--wait` 之所以不再等审批:审批是分钟到小时级的人的动作,而**提案落成的那一刻平台管理员就
|
|
231
|
-
收到了站内 + 邮件通知**,把 runner 挂在上面既烧机器又什么都没保证。
|
|
232
|
-
⚠️ 从 0.4.x 升上来:以前写 `--wait` 指望它等审批的流水线,现在会在提案待审时**直接绿**——
|
|
233
|
-
要保持旧行为,把那一处改成 `--wait-review`。
|
|
234
|
-
|
|
235
|
-
`--wait` 成功 → 打印实际在跑的镜像引用、零退出;失败或超时 → 打印原因、**非零退出**。
|
|
236
|
-
没换镜像时它直接跳过,不空等。镜像来源不限 `--image`:**manifest 的
|
|
237
|
-
`deployDescriptor.image` 换了镜像同样会等**(`--wait-review` 下则是提案批准后接着等)。
|
|
238
|
-
判据看的是最近一条 `deploy|redeploy` 任务,不掺 `provision-tenant`(那是某个租户的 bootstrap,
|
|
239
|
-
与镜像滚动无关)。
|
|
222
|
+
| `--wait [秒]` | 获批后,本次固定目标的后端 + 网关;默认 1800 秒 | 打印提案号,退出 0;不等待人工 |
|
|
223
|
+
| `--wait-review [秒]` | 人工审批,再等待本次交付;默认 1800 秒 | 等待;拒绝、撤回或超时非零退出 |
|
|
224
|
+
| `status --proposal-id <id> --wait` | 继续查询这一提案,不能偷换成最新任务 | 等本次提案交付或超时 |
|
|
240
225
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
226
|
+
纯前端 backend=not_applicable,仍要等 gateway。failed/superseded 使等待非零退出;unknown 保持
|
|
227
|
+
未确认,超时非零退出。普通 status 只展示;配 --wait 才按交付结果设置退出码。
|
|
228
|
+
旧门户完全没有 delivery 字段时,CLI 明示“无法核验网关”,只兼容原后端规则;即使退出 0,
|
|
229
|
+
也不能声称端到端确认。有字段但为 null/unknown 则缺乏证据,不能冒用旧任务成功。
|
|
244
230
|
|
|
245
|
-
|
|
231
|
+
旧版 status 字段保留 version/distDigest/distUpdatedAt/image/deployment/proposal;指定 proposalId
|
|
232
|
+
只限定新增 delivery,旧 proposal 字段仍可能是最近提案。不要混用两者。新 delivery 的形状:
|
|
246
233
|
|
|
247
234
|
| 字段 | 含义 |
|
|
248
235
|
| --- | --- |
|
|
249
|
-
|
|
|
250
|
-
|
|
|
251
|
-
|
|
|
252
|
-
|
|
|
253
|
-
|
|
|
254
|
-
|
|
|
236
|
+
| proposalId / approval | 被查询提案及其审批状态 |
|
|
237
|
+
| state | pending / applied / failed / unknown / superseded |
|
|
238
|
+
| target | null 或固定目标摘要:manifestDigest、distDigest、deploymentConfigDigest、gatewayDigest、gatewayRevision |
|
|
239
|
+
| backend | state= pending / ready / failed / unknown / not_applicable;jobId 与脱敏 error |
|
|
240
|
+
| gateway | state= pending / applied / failed / unknown / not_applicable;desiredRevision、appliedRevision 与脱敏 error |
|
|
241
|
+
| failureStage / error | approval / application / backend / gateway,或 null;仅公开脱敏状态 |
|
|
255
242
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
243
|
+
旧目标缺失及无法证明的运行事实为 unknown;后续目标取代本次为 superseded,哪怕摘要后来回到
|
|
244
|
+
相同值也不能借旧修订冒认。只有本次实际后端目标和匹配网关回执齐备才 applied。
|
|
245
|
+
最近一条 succeeded job 或 deployment.ready 不能替代上述判据。
|
|
246
|
+
|
|
247
|
+
维护者查询仍用绑定此 App 的 release token:跨 key 不可读,指定别的 App 的 proposalId 也无数据。
|
|
248
|
+
新交付状态不返回环境值、内部 upstream 或原始执行日志。可交接提案号、摘要和脱敏失败阶段。
|
|
249
|
+
|
|
250
|
+
平台管理员另有控制台 session 接口:
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
GET /api/console/releases/:id/delivery
|
|
254
|
+
POST /api/console/releases/:id/retry-gateway
|
|
255
|
+
Body: { "expectedTargetDigest": "<当前提案的 gatewayDigest>" }
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Envelope.data 为同一 delivery DTO;重试必须目标仍有效,旧目标冲突拒绝。重试仅协调网关,
|
|
259
|
+
不重放清单,不触发后端重部署。发布令牌不能调用该管理接口;非平台租户无权使用。
|
|
259
260
|
|
|
260
261
|
## 7. CI 范式
|
|
261
262
|
|
|
@@ -276,10 +277,15 @@ steps:
|
|
|
276
277
|
- run: npx @xgent/release-cli whoami # ① 先验令牌,别等构建完才发现过期
|
|
277
278
|
- run: <你自己的依赖安装与构建> # ② base=/apps/<key>/
|
|
278
279
|
- run: node "$SKILL_DIR/scripts/preflight.mjs" --dist dist --version $VER
|
|
279
|
-
|
|
280
|
+
# 按 frontend-archive.md 生成 DIST_ARCHIVE、校验文件;使用 CI 的跨步骤变量机制传递包路径。
|
|
281
|
+
- run: bunx @xgent/release-cli publish --version "$VER" --dist "$DIST_ARCHIVE" --image <key>:$VER --wait
|
|
280
282
|
--manifest deploy/portal/app.manifest.json # ← 不带它目录永远是空的
|
|
283
|
+
# 无论发布成功、待审或失败,都将原始包、校验文件及发布记录存到项目的持久制品存储。
|
|
281
284
|
```
|
|
282
285
|
|
|
286
|
+
涉及跨平台同步的交付还需按 [前端归档与同步验收](frontend-archive.md) 检查主平台条目与下载摘要;
|
|
287
|
+
`--wait` 等部署/网关,不核验当前归档可下载。
|
|
288
|
+
|
|
283
289
|
`--wait` 是让这条流水线**诚实**的那一步:没有它,换版失败时任务照样绿。
|
|
284
290
|
它**不会**把流水线卡在人工审批上——改了权限面的那次发版会打印提案号后退出 0,平台管理员
|
|
285
291
|
已被通知;真要门禁到审批,把 `--wait` 换成 `--wait-review`。
|
|
@@ -291,7 +297,7 @@ steps:
|
|
|
291
297
|
|
|
292
298
|
## 8. 私有包只读令牌(`GET /api/market/release/:key/npm-token`)
|
|
293
299
|
|
|
294
|
-
`@xgent/{release-cli,shared,portal-sdk,portal-ui}` 都在私有包仓上 —— **包括发版用的 CLI 本身**,
|
|
300
|
+
`@xgent/{release-cli,shared,portal-sdk,portal-server-sdk,portal-ui}` 都在私有包仓上 —— **包括发版用的 CLI 本身**,
|
|
295
301
|
所以这一步是整条发布链的前置,不只是装依赖。**你不需要云账号**:拿同一枚 `xrel_`
|
|
296
302
|
向门户换一枚 ≤12 h 的只读令牌,门户持那把云凭据。
|
|
297
303
|
|
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
# 排查速查
|
|
2
2
|
|
|
3
|
+
**跨平台同步报 DIST_ARCHIVE_MISSING,尤其多个应用都缺包**:按
|
|
4
|
+
[前端归档与同步验收](frontend-archive.md) 核对发布时点、服务端保留逻辑与实际上传包的留存。
|
|
5
|
+
catalog 只收 manifest;旧版发布成功后会删归档。有 distDigest 不代表原始包仍在。
|
|
6
|
+
|
|
3
7
|
先分清事故落在哪一层——**发不出去** / **发出去了但页面坏** / **发出去了但线上没变**。
|
|
4
8
|
三层的成因不重叠,混着猜会很久。
|
|
5
9
|
|
|
10
|
+
**已审批、后端 ready,仍打不开公开页或画布**:还要核验网关与业务层,见
|
|
11
|
+
[public-delivery.md](public-delivery.md)。标准 /svc 可以承载正式公开 HTML,但 App 必须
|
|
12
|
+
适配所有外部路径;publicEntrypoints 不创建门户根级路由;connectSrc 不放行脚本/字体。
|
|
13
|
+
|
|
6
14
|
## A. 发不出去(命令报错)
|
|
7
15
|
|
|
8
16
|
| 症状 | 多半原因 | 怎么确认 |
|
|
@@ -17,6 +25,7 @@
|
|
|
17
25
|
| `200` 但 `ok:false`,`PROPOSAL_PENDING` | 该 App 已有一条待审提案挡路——待审期间**任何**新提交都拒,纯 dist/version 也一样(放行会「后交先生效」) | 等平台审批,或先撤回:`DELETE …/proposals/<id>`(错误 details 里带在审提案 id) |
|
|
18
26
|
| `200` 但 `ok:false`,说没有部署描述 | 带了 `--image`,但该 App 还没被平台管理员配 `deployDescriptor` | 纯前端 App 本来就不该带 `--image`,去掉即可;真是新后端就在 manifest 里声明 `deployDescriptor` 随提案提交审核 |
|
|
19
27
|
| `npx @xgent/release-cli` 取不到(`E404 … registry.npmjs.org/@xgent%2frelease-cli`) | **CLI 自己就在私有包仓上**,而这个 repo 的 `.npmrc` 没配 `@xgent:registry` —— 公共 npm 上当然没有 | `npm config get @xgent:registry`,是 `undefined` 就 `node "$SKILL_DIR/scripts/npm-token.mjs" --npmrc >> .npmrc` 再重试(SKILL.md 第 0 步)。**只有**换令牌这步本身报 `NPM_REGISTRY_NOT_CONFIGURED`(平台侧没配)才用 `curl` 兜底,能力完全等价(见 `publish-api.md` §2) |
|
|
28
|
+
| App 代码 `bun install` / `npm install` 装 `@xgent/*` 报 E404 / 401,或私有仓上没有要的那一版 | E404 指向 `registry.npmjs.org` ⇒ `.npmrc` 没配;401 ⇒ 只读令牌过期(≤12 h);版本不存在 ⇒ 那一版还没发布 | 前两种回 SKILL.md 第 0 步(没有 `.xgent-registry.env` 就停下,请开发者去「开发者应用」生成配置文件);版本不存在就停下找平台团队发布。**任何一种都不许 vendor**:不拷产物或源码进仓、不用 `file:` / `link:` / tar 依赖 |
|
|
20
29
|
| 缺少应用标识 | 没传 `--key`,配置文件里也没有 `LISTING_KEY` | 二选一,见 `publish-api.md` §0 |
|
|
21
30
|
| 缺少发布令牌 / 令牌形状不对 | 没设 `XGENT_RELEASE_TOKEN`、也没传 `--token`;或把别的令牌拿来了 | 令牌以 `xrel_` 开头。**别写进配置文件**——CLI 会告警并忽略 |
|
|
22
31
|
| 卡几分钟后 `fetch failed` / 上传超时,产物只有一两 MB | **本机配了代理,而 Node 内置 `fetch` 不读它**——直连跨境上行实测约 10 KB/s | 环境里有 `HTTPS_PROXY` / `HTTP_PROXY` 就是它。升到 `@xgent/release-cli` ≥0.6.0(检测到代理会带 `NODE_USE_ENV_PROXY=1` 重启自身);Node 既不是 ≥22.21 也不是 ≥24 时按 `publish-api.md` §2 用 curl 兜底 |
|
|
@@ -70,9 +79,9 @@ curl -s -o /dev/null -w 'status %{http_code}\n' -H "$H" "$XGENT_PORTAL_URL/api/m
|
|
|
70
79
|
|
|
71
80
|
| 症状 | 多半原因 |
|
|
72
81
|
| --- | --- |
|
|
73
|
-
| 换了 `--image`,容器还是旧的 | `status
|
|
82
|
+
| 换了 `--image`,容器还是旧的 | 用 `status --proposal-id <id>` 看本次 delivery.backend 与失败阶段;可能是镜像、迁移或健康失败。旧容器已被替换时不保证旧服务仍可用 |
|
|
74
83
|
| `status` 显示任务还在 `queued`/`running` | 就是还没轮到/还没跑完。发布时加 `--wait` 就不用手动盯 |
|
|
75
|
-
| 提案一直 `pending`,`--wait` 却早早退出 0 |
|
|
84
|
+
| 提案一直 `pending`,`--wait` 却早早退出 0 | **仍保留提交与审批分离语义**:`--wait` 等获批后的本次交付。要卡在审批上用 `--wait-review`;平台管理员在提案落成时已收到通知,不必催 |
|
|
76
85
|
| 审批屏说某个库 / Redis 的键「缺」 | 这个键不叫约定名(`<PREFIX>_DATABASE_URL` / `REDIS_CONN_STRING`),平台自动供给不到 ⇒ 只能人工点一下「从平台服务取值」。改成约定名后下次就零手填(预检会提前 warn 这一条) |
|
|
77
86
|
| 同一个 tag 重推了,门户没反应 | tag 不可变是硬约定:引用没变**根本不排任务**(`status` 里看不到新任务就是这个)。新版本必须新 tag;真要按原样重建只能找平台管理员点面板的「重新部署」 |
|
|
78
87
|
| 版本号发上去了,过一阵又变回旧值 | 该 key 是**门户仓内 App**(清单定义在门户代码里),version 随门户部署被等值对齐回定义值——仓内 App 不走自助发版面。外部 App 的清单事实源在你仓,不存在这个症状;真遇到就是有人在门户控制台手改过,找平台管理员对账 |
|
|
@@ -106,3 +115,10 @@ npx @xgent/release-cli status --key <key> # 发
|
|
|
106
115
|
前者一次性覆盖 A 类的绝大多数与 B 类的头两条,后者覆盖 C 类(`status` 在这个门户上不存在
|
|
107
116
|
就跳过它,不要为了让它绿而改令牌或改 key)。**先跑它再猜**——
|
|
108
117
|
这些成因的共同点是 `tsc` / lint / 单测全都发现不了,靠读代码找它们非常慢。
|
|
118
|
+
|
|
119
|
+
## 新交付状态与旧门户
|
|
120
|
+
|
|
121
|
+
新版本与能力前提见 [公开面与交付确认](public-delivery.md)。纯前端也须等网关。
|
|
122
|
+
`delivery.state=unknown` 表示证据不足,不能报成功;superseded 表示本次目标已被取代,查询后续提案。
|
|
123
|
+
网关失败请平台管理员重试网关配置,不必重提清单或更换镜像。旧门户无 delivery 会明确提示无法核验网关。
|
|
124
|
+
CSP 扩展语法通过但服务器拒绝新指令时,先确认 strict 与 v2 是否由平台受控启用,不能自行放宽策略。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import { normalizeEmbedCsp } from "./embed-csp.mjs";
|
|
8
|
+
|
|
9
|
+
export const cases = [
|
|
10
|
+
["omitted", undefined, true], ["clear", null, true], ["empty", {}, true],
|
|
11
|
+
["all directives", Object.fromEntries(["connectSrc","scriptSrc","styleSrc","fontSrc","imgSrc","mediaSrc"].map(k=>[k,["https://cdn.example.com"]])), true],
|
|
12
|
+
["websocket connect", {connectSrc:["wss://events.example.com"]}, true],
|
|
13
|
+
["local schemes connect", {connectSrc:["blob:","data:"]}, true],
|
|
14
|
+
["local scheme with payload", {connectSrc:["data:,x"]}, false],
|
|
15
|
+
["alias", {platformSources:{scriptSrc:["jsCdn"],styleSrc:["jsCdn"],fontSrc:["jsCdn"],connectSrc:["jsCdn"]}}, true],
|
|
16
|
+
["origin normalization", {imgSrc:[" https://EXAMPLE.com:443/ ","https://example.com"]}, true],
|
|
17
|
+
["empty arrays", {scriptSrc:[],platformSources:{scriptSrc:[]}}, true],
|
|
18
|
+
["unknown field", {frameAncestors:["https://example.com"]}, false],
|
|
19
|
+
["unknown alias", {platformSources:{scriptSrc:["other"]}}, false],
|
|
20
|
+
["unsupported alias directive", {platformSources:{imgSrc:["jsCdn"]}}, false],
|
|
21
|
+
["wrong collection", {scriptSrc:"https://example.com"}, false],
|
|
22
|
+
["wrong source", {scriptSrc:[null]}, false],
|
|
23
|
+
...["https://*.example.com","https://example.com/script.js","https://example.com?x=1","https://example.com#x",
|
|
24
|
+
"https://user:private@localhost","unsafe-inline","'unsafe-eval'","data:","blob:","http://example.com",
|
|
25
|
+
"http://localhost:8080","wss://example.com","https:example.com","https://example.com\n","https://example.com;"].map((value,i)=>[`invalid origin ${i}`,{scriptSrc:[value]},false]),
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
29
|
+
const root = mkdtempSync(join(tmpdir(),"release-preflight-fixture-"));
|
|
30
|
+
const preflight = resolve(dirname(fileURLToPath(import.meta.url)),"../scripts/preflight.mjs");
|
|
31
|
+
let passed = 0;
|
|
32
|
+
try {
|
|
33
|
+
mkdirSync(join(root,"dist"));
|
|
34
|
+
writeFileSync(join(root,"dist/index.html"),'<script src="/apps/demo/main.js"></script>');
|
|
35
|
+
writeFileSync(join(root,"dist/main.js"),'console.log("fixture")');
|
|
36
|
+
writeFileSync(join(root,"fixture.env"),"LISTING_KEY=demo\n");
|
|
37
|
+
for (const [label,value,valid] of cases) {
|
|
38
|
+
const manifest = {listingKey:"demo",name:"Demo",version:"1",...(value===undefined?{}:{embedCsp:value})};
|
|
39
|
+
writeFileSync(join(root,"app.manifest.json"),JSON.stringify(manifest));
|
|
40
|
+
const result = spawnSync(process.execPath,[preflight,"--offline","--config","fixture.env","--key","demo","--dist","dist","--version","1","--manifest","app.manifest.json"],{cwd:root,env:{PATH:process.env.PATH},encoding:"utf8",timeout:15000});
|
|
41
|
+
assert.equal(result.status,valid?0:1,label);
|
|
42
|
+
if (value!==undefined) assert.match(result.stdout,/能力门未核验/,label);
|
|
43
|
+
assert.ok(!result.stdout.includes("private@localhost"),"不回显非法来源中的凭据");
|
|
44
|
+
passed++;
|
|
45
|
+
}
|
|
46
|
+
assert.deepEqual(normalizeEmbedCsp(cases.find(c=>c[0]==="origin normalization")[1]),{imgSrc:["https://example.com"]});passed++;
|
|
47
|
+
assert.throws(()=>normalizeEmbedCsp(Object.defineProperty({},"scriptSrc",{get(){throw new Error("must-not-run");}})),/accessors/);passed++;
|
|
48
|
+
console.log(`exported preflight: ${passed}/0`);
|
|
49
|
+
} finally { rmSync(root,{recursive:true,force:true}); }
|
|
50
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* node npm-token.mjs --npmrc # 打印可直接追加进 .npmrc 的三行
|
|
8
8
|
* node npm-token.mjs --check # 只体检:能不能换到、还剩多久,不打印令牌
|
|
9
9
|
*
|
|
10
|
-
* `@xgent/{release-cli,shared,portal-sdk,portal-ui}` 都装在私有仓上 —— **发版用的 CLI 本身也在**,
|
|
10
|
+
* `@xgent/{release-cli,shared,portal-sdk,portal-server-sdk,portal-ui}` 都装在私有仓上 —— **发版用的 CLI 本身也在**,
|
|
11
11
|
* 所以 `.npmrc` 没配好时 `npx @xgent/release-cli` 第一条就 E404。你**不需要**任何云账号或 CLI:
|
|
12
12
|
* 用已有的发布令牌(`XGENT_RELEASE_TOKEN`,就是发版那枚)向门户换一枚 ≤12 h 的
|
|
13
13
|
* **只读**令牌即可。门户持那把云凭据,轮换时你这边零改动。
|
|
@@ -36,9 +36,14 @@ const die = (msg, ...hints) => {
|
|
|
36
36
|
process.exit(1);
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
+
// 三样都缺 = 压根没有配置文件:指向唯一的来源,别让人(或 agent)去找别的办法装包。
|
|
40
|
+
const GET_CONFIG = "去门户「开发者应用」› 你的应用 › 凭证 › 生成配置文件,把 .xgent-registry.env 放到仓根后重跑";
|
|
41
|
+
const NO_APP_YET = "开发者应用里还没有这个应用 ⇒ 先「申请建立应用」,平台管理员批准后才能生成";
|
|
42
|
+
const NO_VENDOR = "拿到之前停下:不要把 @xgent/* 拷进 vendor/ 或改用 file:/tar 依赖";
|
|
43
|
+
if (!key && !portal && !token) die("没找到 .xgent-registry.env(也没有对应的环境变量)", GET_CONFIG, NO_APP_YET, NO_VENDOR);
|
|
39
44
|
if (!key) die("缺少 LISTING_KEY", "在 .xgent-registry.env 里写 LISTING_KEY=<你的应用标识>,或用 --key 传");
|
|
40
45
|
if (!portal) die("缺少门户地址", "在 .xgent-registry.env 里写 TARGET_XGENT_PLATFORM=<门户地址>,或用 --portal 传");
|
|
41
|
-
if (!token) die("缺少发布令牌",
|
|
46
|
+
if (!token) die("缺少发布令牌", GET_CONFIG, NO_APP_YET, NO_VENDOR);
|
|
42
47
|
|
|
43
48
|
warnIfProxyIgnored();
|
|
44
49
|
|
|
@@ -53,7 +58,7 @@ try {
|
|
|
53
58
|
die(`连不上门户:${e?.message ?? e}`, `确认 ${portal} 可达(公司网络 / VPN)`, "稍后重试;这条链路超时不代表令牌有问题");
|
|
54
59
|
}
|
|
55
60
|
|
|
56
|
-
if (res.status === 401) die("发布令牌无效或已失效(401)", "
|
|
61
|
+
if (res.status === 401) die("发布令牌无效或已失效(401)", "去门户「开发者应用」› 你的应用 › 凭证 重新生成配置文件");
|
|
57
62
|
if (res.status === 404) die(`门户上没有 ${key} 这个应用,或令牌绑的是别的应用(404)`, "核对 LISTING_KEY 与令牌是否同一个应用");
|
|
58
63
|
if (res.status === 429) die("触发限流(429)", "稍等一分钟再试;CI 里别在每个 job 都换一次,换一次传下去");
|
|
59
64
|
|