@xulthekl/team-flow 0.22.4
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/.agents/plugins/marketplace.json +20 -0
- package/.agents/skills +1 -0
- package/.claude/always/phase-guard.md +3 -0
- package/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +31 -0
- package/.codex-plugin/plugin.json +45 -0
- package/.codexignore +6 -0
- package/.cursor-plugin/marketplace.json +17 -0
- package/.cursor-plugin/plugin.json +31 -0
- package/.github/copilot-instructions.md +15 -0
- package/.github/dependabot.yml +10 -0
- package/.github/plugin/marketplace.json +42 -0
- package/.github/workflows/ci.yml +98 -0
- package/.github/workflows/hol-plugin-scanner.yml +17 -0
- package/.opencode/INSTALL.md +61 -0
- package/.opencode/plugins/team-flow.js +70 -0
- package/AGENTS.md +280 -0
- package/CHANGELOG.md +635 -0
- package/CONTRIBUTING.md +115 -0
- package/GEMINI.md +14 -0
- package/HANDOFF.md +219 -0
- package/INSTALL.md +810 -0
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/SECURITY.md +37 -0
- package/agents/bug-investigator.md +180 -0
- package/agents/change-split-auditor.md +257 -0
- package/agents/code-reviewer.md +171 -0
- package/agents/cross-change-consistency-checker.md +215 -0
- package/agents/prd-completeness-reviewer.md +197 -0
- package/agents/prototype-builder.md +230 -0
- package/agents/prototype-env-scout.md +156 -0
- package/agents/prototype-reviewer.md +226 -0
- package/assets/icon.svg +6 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +5 -0
- package/dist/parsing/change-parser.d.ts +12 -0
- package/dist/parsing/change-parser.js +54 -0
- package/dist/parsing/requirement-blocks.d.ts +31 -0
- package/dist/parsing/requirement-blocks.js +192 -0
- package/dist/schema/base.d.ts +7 -0
- package/dist/schema/base.js +1 -0
- package/dist/schema/change.d.ts +25 -0
- package/dist/schema/change.js +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.js +1 -0
- package/dist/schema/spec.d.ts +11 -0
- package/dist/schema/spec.js +1 -0
- package/dist/validation/constants.d.ts +42 -0
- package/dist/validation/constants.js +42 -0
- package/dist/validation/tokenizer.d.ts +17 -0
- package/dist/validation/tokenizer.js +173 -0
- package/dist/validation/types.d.ts +40 -0
- package/dist/validation/types.js +1 -0
- package/dist/validation/validator.d.ts +21 -0
- package/dist/validation/validator.js +489 -0
- package/docs/README_en.md +358 -0
- package/docs/artifact-contract.md +96 -0
- package/docs/decision-points.md +88 -0
- package/docs/e2e-integration-design.md +207 -0
- package/docs/examples/README.md +25 -0
- package/docs/examples/add-dark-mode/README.md +13 -0
- package/docs/examples/add-dark-mode/design.md +49 -0
- package/docs/examples/add-dark-mode/execution-contract.md +56 -0
- package/docs/examples/add-dark-mode/proposal.md +46 -0
- package/docs/examples/add-dark-mode/specs/ui-theme/spec.md +35 -0
- package/docs/examples/add-dark-mode/tasks.md +26 -0
- package/docs/examples/refactor-auth-boundary/README.md +15 -0
- package/docs/examples/refactor-auth-boundary/design.md +41 -0
- package/docs/examples/refactor-auth-boundary/execution-contract.md +61 -0
- package/docs/examples/refactor-auth-boundary/proposal.md +47 -0
- package/docs/examples/refactor-auth-boundary/specs/auth-boundary/spec.md +45 -0
- package/docs/examples/refactor-auth-boundary/tasks.md +25 -0
- package/docs/plans/2026-07-07-fix-batch-design.md +68 -0
- package/docs/plans/2026-07-20-001-refactor-skill-collaboration-protocol-plan.md +128 -0
- package/docs/platform-matrix.md +45 -0
- package/docs/prototype-design-research.md +206 -0
- package/docs/release-checklist.md +96 -0
- package/docs/showcase.html +699 -0
- package/docs/skill-rename-v0.8.0.md +49 -0
- package/docs/state-machine.md +162 -0
- package/gemini-extension.json +6 -0
- package/hooks/hooks-cursor.json +8 -0
- package/hooks/hooks.json +26 -0
- package/hooks/pre-tool-use-guard +116 -0
- package/hooks/session-start +14 -0
- package/llms.txt +51 -0
- package/package.json +48 -0
- package/plugin.json +27 -0
- package/prd/v1/plan.md +443 -0
- package/prd/v1/prd.md +580 -0
- package/scripts/check-update.mjs +91 -0
- package/scripts/check-version-consistency.mjs +345 -0
- package/scripts/ensure-branch.mjs +71 -0
- package/scripts/get-config +31 -0
- package/scripts/guard/checks/artifacts-exist.mjs +36 -0
- package/scripts/guard/checks/contract-current.mjs +33 -0
- package/scripts/guard/checks/contract-fresh.mjs +17 -0
- package/scripts/guard/checks/dp-gate-passed.mjs +35 -0
- package/scripts/guard/checks/dp3-approved.mjs +22 -0
- package/scripts/guard/checks/execution-plan-ready.mjs +40 -0
- package/scripts/guard/checks/execution-reviews-passed.mjs +36 -0
- package/scripts/guard/checks/schema-valid.mjs +63 -0
- package/scripts/guard/checks/specs-merged.mjs +51 -0
- package/scripts/guard/checks/tasks-complete.mjs +31 -0
- package/scripts/guard/checks/tests-passing.mjs +31 -0
- package/scripts/guard/design-token-guard.mjs +237 -0
- package/scripts/guard/guard.mjs +205 -0
- package/scripts/infer-workflow.mjs +136 -0
- package/scripts/install-amazon-q.mjs +9 -0
- package/scripts/install-cline.mjs +9 -0
- package/scripts/install-continue.mjs +9 -0
- package/scripts/install-cursor.mjs +265 -0
- package/scripts/install-git-hooks.mjs +82 -0
- package/scripts/install-kiro.mjs +9 -0
- package/scripts/install-pi.mjs +9 -0
- package/scripts/install-qoder.mjs +9 -0
- package/scripts/install-qwen.mjs +9 -0
- package/scripts/install-roocode.mjs +9 -0
- package/scripts/install-windsurf.mjs +9 -0
- package/scripts/install-zcode.mjs +265 -0
- package/scripts/lib/cmd-audit.mjs +127 -0
- package/scripts/lib/cmd-checkpoint.mjs +118 -0
- package/scripts/lib/cmd-config.mjs +88 -0
- package/scripts/lib/cmd-doctor.mjs +267 -0
- package/scripts/lib/cmd-execution.mjs +206 -0
- package/scripts/lib/cmd-handoff.mjs +94 -0
- package/scripts/lib/cmd-inject.mjs +310 -0
- package/scripts/lib/cmd-install-amazon-q.mjs +11 -0
- package/scripts/lib/cmd-install-cline.mjs +11 -0
- package/scripts/lib/cmd-install-continue.mjs +11 -0
- package/scripts/lib/cmd-install-cursor.mjs +14 -0
- package/scripts/lib/cmd-install-kiro.mjs +11 -0
- package/scripts/lib/cmd-install-pi.mjs +11 -0
- package/scripts/lib/cmd-install-qoder.mjs +11 -0
- package/scripts/lib/cmd-install-qwen.mjs +11 -0
- package/scripts/lib/cmd-install-roocode.mjs +11 -0
- package/scripts/lib/cmd-install-windsurf.mjs +11 -0
- package/scripts/lib/cmd-install-workbuddy.mjs +359 -0
- package/scripts/lib/cmd-install-zcode.mjs +14 -0
- package/scripts/lib/cmd-isolate.mjs +37 -0
- package/scripts/lib/cmd-list.mjs +71 -0
- package/scripts/lib/cmd-runtime.mjs +85 -0
- package/scripts/lib/cmd-solutions.mjs +71 -0
- package/scripts/lib/cmd-state.mjs +231 -0
- package/scripts/lib/cmd-sync.mjs +102 -0
- package/scripts/lib/cmd-validate.mjs +105 -0
- package/scripts/lib/cmd-version.mjs +148 -0
- package/scripts/lib/config-loader.mjs +107 -0
- package/scripts/lib/execution-plan.mjs +492 -0
- package/scripts/lib/execution-recommendation.mjs +221 -0
- package/scripts/lib/hash.mjs +74 -0
- package/scripts/lib/install.mjs +267 -0
- package/scripts/lib/platform-runtime-inventory.mjs +27 -0
- package/scripts/lib/platforms.mjs +165 -0
- package/scripts/lib/prototype-sync.mjs +192 -0
- package/scripts/lib/sdd-overlay.mjs +262 -0
- package/scripts/lib/shell-quote.mjs +4 -0
- package/scripts/lib/solutions-capture.mjs +102 -0
- package/scripts/lib/solutions-index-gen.mjs +112 -0
- package/scripts/lib/solutions-inject.mjs +77 -0
- package/scripts/lib/solutions-promote.mjs +145 -0
- package/scripts/lib/spec-paths.mjs +85 -0
- package/scripts/lib/state-loader.mjs +154 -0
- package/scripts/lint/lint-skills.mjs +149 -0
- package/scripts/lint/rules/behavior-consistency.mjs +56 -0
- package/scripts/lint/rules/dp-trigger-points.mjs +60 -0
- package/scripts/lint/rules/exception-handling.mjs +59 -0
- package/scripts/lint/rules/no-contradictory-instructions.mjs +67 -0
- package/scripts/lint/rules/no-redundant-checks.mjs +50 -0
- package/scripts/lint/rules/token-rules.mjs +122 -0
- package/scripts/review-package +44 -0
- package/scripts/task-brief +40 -0
- package/scripts/team-flow.mjs +164 -0
- package/scripts/token-baseline.mjs +158 -0
- package/scripts/validate-artifacts +96 -0
- package/scripts/verify-marketplace-release.mjs +59 -0
- package/skills/architecture-design/SKILL.md +140 -0
- package/skills/architecture-design/chapters/ch01-4a-domains.md +27 -0
- package/skills/architecture-design/chapters/ch02-change-cascade.md +27 -0
- package/skills/architecture-design/chapters/ch03-architecture-outputs.md +25 -0
- package/skills/architecture-design/chapters/ch04-entity-to-aggregate.md +27 -0
- package/skills/architecture-design/chapters/ch05-cqrs.md +32 -0
- package/skills/architecture-design/chapters/ch06-integration.md +54 -0
- package/skills/architecture-design/cheatsheet.md +51 -0
- package/skills/architecture-design/glossary.md +23 -0
- package/skills/architecture-design/patterns.md +32 -0
- package/skills/bug-investigator/SKILL.md +77 -0
- package/skills/build-executor/SKILL.md +163 -0
- package/skills/build-executor/implementer-prompt.md +162 -0
- package/skills/build-executor/references/execution-modes.md +86 -0
- package/skills/build-executor/task-reviewer-prompt.md +195 -0
- package/skills/ce-brainstorm/SKILL.md +415 -0
- package/skills/ce-brainstorm/references/agents/slack-researcher.md +127 -0
- package/skills/ce-brainstorm/references/blindspot-pass.md +70 -0
- package/skills/ce-brainstorm/references/brainstorm-sections.md +285 -0
- package/skills/ce-brainstorm/references/handoff.md +168 -0
- package/skills/ce-brainstorm/references/html-rendering.md +634 -0
- package/skills/ce-brainstorm/references/markdown-rendering.md +241 -0
- package/skills/ce-brainstorm/references/model-tiers.md +9 -0
- package/skills/ce-brainstorm/references/prd-mapping.md +71 -0
- package/skills/ce-brainstorm/references/product-pressure-test.md +42 -0
- package/skills/ce-brainstorm/references/reasoning-elevation.md +63 -0
- package/skills/ce-brainstorm/references/settled-decisions.md +45 -0
- package/skills/ce-brainstorm/references/synthesis-summary.md +282 -0
- package/skills/ce-brainstorm/references/universal-brainstorming.md +73 -0
- package/skills/ce-brainstorm/references/verdict-routing.md +26 -0
- package/skills/ce-brainstorm/references/visual-probes.md +158 -0
- package/skills/ce-brainstorm/scripts/visual-probe-server.js +418 -0
- package/skills/ce-compound/SKILL.md +114 -0
- package/skills/ce-compound/assets/resolution-template.md +94 -0
- package/skills/ce-compound/references/agents/best-practices-researcher.md +115 -0
- package/skills/ce-compound/references/agents/data-integrity-guardian.md +68 -0
- package/skills/ce-compound/references/agents/framework-docs-researcher.md +93 -0
- package/skills/ce-compound/references/agents/pattern-recognition-specialist.md +55 -0
- package/skills/ce-compound/references/agents/performance-oracle.md +108 -0
- package/skills/ce-compound/references/agents/security-sentinel.md +91 -0
- package/skills/ce-compound/references/agents/session-historian.md +83 -0
- package/skills/ce-compound/references/concepts-vocabulary.md +78 -0
- package/skills/ce-compound/references/full-mode-workflow.md +413 -0
- package/skills/ce-compound/references/grounding-validation.md +84 -0
- package/skills/ce-compound/references/lightweight-mode.md +53 -0
- package/skills/ce-compound/references/output-standards.md +182 -0
- package/skills/ce-compound/references/promotion-rules.md +38 -0
- package/skills/ce-compound/references/schema.yaml +231 -0
- package/skills/ce-compound/references/three-tier-index.md +55 -0
- package/skills/ce-compound/references/v0.5-upgrade.md +32 -0
- package/skills/ce-compound/references/write-flow.md +36 -0
- package/skills/ce-compound/references/yaml-schema.md +118 -0
- package/skills/ce-compound/scripts/session-history/discover-sessions.sh +130 -0
- package/skills/ce-compound/scripts/session-history/extract-errors.py +254 -0
- package/skills/ce-compound/scripts/session-history/extract-metadata.py +456 -0
- package/skills/ce-compound/scripts/session-history/extract-skeleton.py +575 -0
- package/skills/ce-compound/scripts/validate-doc-claims.py +346 -0
- package/skills/ce-compound/scripts/validate-frontmatter.py +137 -0
- package/skills/ce-ideate/SKILL.md +402 -0
- package/skills/ce-ideate/references/agents/issue-intelligence-analyst.md +200 -0
- package/skills/ce-ideate/references/agents/learnings-researcher.md +247 -0
- package/skills/ce-ideate/references/agents/slack-researcher.md +127 -0
- package/skills/ce-ideate/references/agents/web-researcher.md +121 -0
- package/skills/ce-ideate/references/divergent-ideation.md +89 -0
- package/skills/ce-ideate/references/html-rendering.md +634 -0
- package/skills/ce-ideate/references/ideation-sections.md +191 -0
- package/skills/ce-ideate/references/markdown-rendering.md +238 -0
- package/skills/ce-ideate/references/post-ideation-workflow.md +167 -0
- package/skills/ce-ideate/references/universal-ideation.md +107 -0
- package/skills/ce-ideate/references/web-research-cache.md +56 -0
- package/skills/ce-plan/SKILL.md +137 -0
- package/skills/ce-plan/references/agents/agent-native-planning-strategist.md +62 -0
- package/skills/ce-plan/references/agents/architecture-strategist.md +46 -0
- package/skills/ce-plan/references/agents/best-practices-researcher.md +114 -0
- package/skills/ce-plan/references/agents/data-integrity-guardian.md +68 -0
- package/skills/ce-plan/references/agents/data-migration-reviewer.md +103 -0
- package/skills/ce-plan/references/agents/deployment-verification-agent.md +157 -0
- package/skills/ce-plan/references/agents/framework-docs-researcher.md +93 -0
- package/skills/ce-plan/references/agents/git-history-analyzer.md +40 -0
- package/skills/ce-plan/references/agents/learnings-researcher.md +247 -0
- package/skills/ce-plan/references/agents/pattern-recognition-specialist.md +55 -0
- package/skills/ce-plan/references/agents/performance-oracle.md +108 -0
- package/skills/ce-plan/references/agents/repo-research-analyst.md +258 -0
- package/skills/ce-plan/references/agents/security-sentinel.md +91 -0
- package/skills/ce-plan/references/agents/slack-researcher.md +127 -0
- package/skills/ce-plan/references/agents/spec-flow-analyzer.md +80 -0
- package/skills/ce-plan/references/agents/web-researcher.md +121 -0
- package/skills/ce-plan/references/approach-altitude.md +55 -0
- package/skills/ce-plan/references/change-splitting.md +65 -0
- package/skills/ce-plan/references/completion-contract.md +33 -0
- package/skills/ce-plan/references/core-principles.md +40 -0
- package/skills/ce-plan/references/deepening-workflow.md +263 -0
- package/skills/ce-plan/references/dependency-graph.md +36 -0
- package/skills/ce-plan/references/html-rendering.md +634 -0
- package/skills/ce-plan/references/intake-routing.md +189 -0
- package/skills/ce-plan/references/markdown-rendering.md +238 -0
- package/skills/ce-plan/references/plan-handoff.md +150 -0
- package/skills/ce-plan/references/plan-sections.md +427 -0
- package/skills/ce-plan/references/plan-structure.md +120 -0
- package/skills/ce-plan/references/planning-modes.md +69 -0
- package/skills/ce-plan/references/reasoning-elevation.md +63 -0
- package/skills/ce-plan/references/research-workflow.md +165 -0
- package/skills/ce-plan/references/review-and-write.md +127 -0
- package/skills/ce-plan/references/settled-decisions.md +45 -0
- package/skills/ce-plan/references/synthesis-summary.md +418 -0
- package/skills/ce-plan/references/universal-planning.md +168 -0
- package/skills/ce-proof/SKILL.md +346 -0
- package/skills/ce-strategy/SKILL.md +97 -0
- package/skills/ce-strategy/references/interview.md +143 -0
- package/skills/ce-strategy/references/strategy-template.md +89 -0
- package/skills/code-reviewer/SKILL.md +84 -0
- package/skills/code-reviewer/code-reviewer-prompt.md +195 -0
- package/skills/contract-builder/SKILL.md +72 -0
- package/skills/design-system/SKILL.md +75 -0
- package/skills/design-system/references/agents/design-system-architect.md +138 -0
- package/skills/design-system/references/creation-flow.md +170 -0
- package/skills/design-system/references/preview-template.html +319 -0
- package/skills/design-system/references/token-derivation.md +115 -0
- package/skills/design-system/references/variant-schema.md +60 -0
- package/skills/e2e/SKILL.md +56 -0
- package/skills/e2e/references/test-verifier.md +40 -0
- package/skills/need-explorer/SKILL.md +79 -0
- package/skills/prototype/SKILL.md +98 -0
- package/skills/prototype/references/agents/design-system-architect.md +122 -0
- package/skills/prototype/references/checklist.md +82 -0
- package/skills/prototype/references/craft/accessibility-baseline.md +71 -0
- package/skills/prototype/references/craft/anti-ai-slop.md +87 -0
- package/skills/prototype/references/craft/laws-of-ux.md +60 -0
- package/skills/prototype/references/craft/state-coverage.md +81 -0
- package/skills/prototype/references/craft/typography-hierarchy.md +50 -0
- package/skills/prototype/references/layouts.md +223 -0
- package/skills/prototype/references/orchestration-flow.md +101 -0
- package/skills/prototype/references/prototype-scaffold/assets/design-tokens.css +19 -0
- package/skills/prototype/references/prototype-scaffold/components/button.html +3 -0
- package/skills/prototype/references/prototype-scaffold/design-system.md +7 -0
- package/skills/prototype/references/prototype-scaffold/flow.md +11 -0
- package/skills/prototype/references/prototype-scaffold/index.html +20 -0
- package/skills/prototype/references/prototype-scaffold/pages/index.html +11 -0
- package/skills/prototype/references/template.html +396 -0
- package/skills/release-archivist/SKILL.md +166 -0
- package/skills/release-archivist/references/closing-procedures.md +81 -0
- package/skills/session-handoff/SKILL.md +110 -0
- package/skills/session-handoff/references/context-extraction.md +70 -0
- package/skills/session-handoff/references/handoff-template.md +90 -0
- package/skills/session-handoff/references/skill-recommendation.md +43 -0
- package/skills/spec-merger/SKILL.md +66 -0
- package/skills/spec-writer/SKILL.md +149 -0
- package/skills/workflow-bootstrap/SKILL.md +148 -0
- package/skills/workflow-bootstrap/references/agents/codebase-recon-analyst.md +121 -0
- package/skills/workflow-bootstrap/references/b1-reconnaissance.md +80 -0
- package/skills/workflow-bootstrap/scripts/recon-probe.sh +328 -0
- package/skills/workflow-feedback/SKILL.md +120 -0
- package/skills/workflow-feedback/references/category-guide.md +121 -0
- package/skills/workflow-feedback/references/feedback-template.md +73 -0
- package/skills/workflow-feedback/references/review-mode.md +92 -0
- package/skills/workflow-orchestrator/SKILL.md +94 -0
- package/skills/workflow-orchestrator/references/feedback-loops.md +56 -0
- package/skills/workflow-orchestrator/references/s1-path-router.md +81 -0
- package/skills/workflow-orchestrator/references/s2-prd-prototype-loop.md +96 -0
- package/skills/workflow-orchestrator/references/s3-plan-pipeline.md +50 -0
- package/skills/workflow-orchestrator/references/s4-split-validate.md +108 -0
- package/skills/workflow-orchestrator/references/s5-monitoring.md +61 -0
- package/skills/workflow-orchestrator/references/state-model.md +185 -0
- package/skills/workflow-start/SKILL.md +147 -0
- package/skills/workflow-start/references/routing-rules.md +155 -0
- package/src/index.ts +16 -0
- package/src/parsing/change-parser.ts +79 -0
- package/src/parsing/requirement-blocks.ts +244 -0
- package/src/schema/base.ts +8 -0
- package/src/schema/change.ts +29 -0
- package/src/schema/index.ts +3 -0
- package/src/schema/spec.ts +12 -0
- package/src/validation/constants.ts +53 -0
- package/src/validation/tokenizer.ts +180 -0
- package/src/validation/types.ts +47 -0
- package/src/validation/validator.ts +552 -0
- package/templates/abandonment-summary.md +29 -0
- package/templates/design.md +37 -0
- package/templates/execution-contract.md +99 -0
- package/templates/plan.md +86 -0
- package/templates/prd.md +468 -0
- package/templates/proposal.md +37 -0
- package/templates/spec.md +31 -0
- package/templates/tasks.md +47 -0
- package/tests/e2e.test.mjs +266 -0
- package/tests/lib/cmd-audit.test.mjs +202 -0
- package/tests/lib/cmd-checkpoint.test.mjs +98 -0
- package/tests/lib/cmd-config.test.mjs +101 -0
- package/tests/lib/cmd-doctor.test.mjs +450 -0
- package/tests/lib/cmd-execution.test.mjs +647 -0
- package/tests/lib/cmd-handoff.test.mjs +137 -0
- package/tests/lib/cmd-inject.test.mjs +218 -0
- package/tests/lib/cmd-install-workbuddy.test.mjs +113 -0
- package/tests/lib/cmd-install-zcode.test.mjs +42 -0
- package/tests/lib/cmd-isolate.test.mjs +68 -0
- package/tests/lib/cmd-list.test.mjs +127 -0
- package/tests/lib/cmd-runtime.test.mjs +83 -0
- package/tests/lib/cmd-state-missing.test.mjs +65 -0
- package/tests/lib/cmd-state.test.mjs +365 -0
- package/tests/lib/cmd-sync-paths.test.mjs +84 -0
- package/tests/lib/cmd-validate-paths.test.mjs +90 -0
- package/tests/lib/config-loader.test.mjs +175 -0
- package/tests/lib/ensure-branch.test.mjs +59 -0
- package/tests/lib/execution-control-plane.test.mjs +168 -0
- package/tests/lib/execution-plan.test.mjs +474 -0
- package/tests/lib/guard-specs-merged.test.mjs +108 -0
- package/tests/lib/guard-tests-passing.test.mjs +112 -0
- package/tests/lib/guard-transitions.test.mjs +262 -0
- package/tests/lib/guard.test.mjs +611 -0
- package/tests/lib/hash.test.mjs +138 -0
- package/tests/lib/infer-workflow.test.mjs +161 -0
- package/tests/lib/install-git-hooks.test.mjs +20 -0
- package/tests/lib/marketplace-release-docs.test.mjs +31 -0
- package/tests/lib/minimality-discipline.test.mjs +37 -0
- package/tests/lib/model-profiles-docs.test.mjs +33 -0
- package/tests/lib/node20-compatibility.test.mjs +73 -0
- package/tests/lib/node20-test-entry.test.mjs +17 -0
- package/tests/lib/platform-runtime-distribution.test.mjs +150 -0
- package/tests/lib/raw-mode-smoke.test.mjs +42 -0
- package/tests/lib/sdd-overlay.test.mjs +118 -0
- package/tests/lib/spec-paths.test.mjs +80 -0
- package/tests/lib/state-loader.test.mjs +251 -0
- package/tests/lib/token-baseline.test.mjs +72 -0
- package/tests/lib/token-rules.test.mjs +94 -0
- package/tests/lib/verify-marketplace-release.test.mjs +128 -0
- package/tests/tsconfig.json +12 -0
- package/token-baseline.json +95 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# 交互创建流程(Creation Flow)
|
|
2
|
+
|
|
3
|
+
设计系统创建的 6 步详细规程。**用户主导**:LLM 预填推荐值 + 报告选择原因,用户原样确认或调整。
|
|
4
|
+
**确定性**:相同的 5 维输入永远派生出相同的 token 体系(rule-based,非随机)。
|
|
5
|
+
|
|
6
|
+
> Token 四层模型(A1-identity / A1-structure / A2-derived / B-slot)+ C-extension 名单制,
|
|
7
|
+
> 与 prototype skill 的 `design-token-guard.mjs` 共享同一完整性约束。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Step 1: 需求收集(5 维封闭词汇)
|
|
12
|
+
|
|
13
|
+
用 **AskUserQuestion** 一次性收集 5 个维度。每个问题预填 LLM 推荐默认值,并附「为什么推荐这个」。
|
|
14
|
+
用户可原样确认,也可改成封闭词汇内的其它值。**封闭词汇外的自由输入 → 追问澄清,不猜测。**
|
|
15
|
+
|
|
16
|
+
### 维度 1:品牌调性(mood)— 决定调色板方向
|
|
17
|
+
|
|
18
|
+
| 值 | 含义 | 适配场景 |
|
|
19
|
+
|----|------|---------|
|
|
20
|
+
| `professional_minimal` | 专业克制 | B 端 SaaS、企业后台、金融/数据平台(**默认**) |
|
|
21
|
+
| `warm_approachable` | 温暖亲和 | C 端生活/教育/健康、社区产品 |
|
|
22
|
+
| `technical_dense` | 技术密集 | 开发者工具、监控/运维、IDE 类 |
|
|
23
|
+
| `editorial` | 编辑排版 | 内容/媒体/阅读类、品牌官网 |
|
|
24
|
+
| `brutalist` | 粗野主义 | 实验性/艺术/独立产品、强个性品牌 |
|
|
25
|
+
|
|
26
|
+
### 维度 2:品牌主色(brand_color)
|
|
27
|
+
|
|
28
|
+
- 用户给具体 `#RRGGBB` → 直接采用为 `--accent`。
|
|
29
|
+
- 用户答「帮我选」/未给 → 按 mood 取映射表的 accent(见 Step 2 表),并记入透明报告。
|
|
30
|
+
- 非法 hex(非 6 位、非 hex 字符)→ 追问「你是指 #RRGGBB 格式吗?」。
|
|
31
|
+
|
|
32
|
+
### 维度 3:展示字体(display_font)— 决定 `--font-display`
|
|
33
|
+
|
|
34
|
+
| 值 | font-display 栈 | 默认配 mood |
|
|
35
|
+
|----|----------------|------------|
|
|
36
|
+
| `serif_display` | `'Iowan Old Style', Charter, Georgia, serif` | editorial |
|
|
37
|
+
| `sans_display` | `-apple-system, 'Segoe UI', system-ui, sans-serif` | professional_minimal / warm_approachable / brutalist(**全局默认**) |
|
|
38
|
+
| `mono_accent` | `'SF Mono', 'JetBrains Mono', ui-monospace, monospace` | technical_dense |
|
|
39
|
+
|
|
40
|
+
> `--font-body` 恒定 `-apple-system, 'Segoe UI', system-ui, sans-serif`(A1-identity 必选);
|
|
41
|
+
> `--font-mono` 属 A2-derived,按代码场景派生。零外部依赖:只用系统字体栈,不引 webfont。
|
|
42
|
+
|
|
43
|
+
### 维度 4:信息密度(density)— 决定 spacing/typography 变体
|
|
44
|
+
|
|
45
|
+
| 值 | 基准间距 `--space-4` | 行高 | 字号基准 | 默认配 |
|
|
46
|
+
|----|---------------------|------|---------|--------|
|
|
47
|
+
| `compact` | 12px | 1.4 | 14px | technical_dense |
|
|
48
|
+
| `balanced` | 16px | 1.5 | 16px | professional_minimal(**全局默认**) |
|
|
49
|
+
| `spacious` | 20px | 1.65 | 17px | warm_approachable / editorial |
|
|
50
|
+
|
|
51
|
+
### 维度 5:目标端(target)— 决定产出几个变体文件
|
|
52
|
+
|
|
53
|
+
| 值 | 产出 |
|
|
54
|
+
|----|------|
|
|
55
|
+
| `b_end` | base.md + b-end.md |
|
|
56
|
+
| `c_end` | base.md + c-end.md |
|
|
57
|
+
| `both` | base.md + b-end.md + c-end.md(**默认**,覆盖最广) |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Step 2: 确定性 Token 派生
|
|
62
|
+
|
|
63
|
+
### Mood → 调色板映射表(确定性,同 mood 同色)
|
|
64
|
+
|
|
65
|
+
| mood | accent(品牌主色 `--accent`) | neutral 锚点(ink `--fg` 基调) |
|
|
66
|
+
|------|------------------------------|--------------------------------|
|
|
67
|
+
| `professional_minimal` | `#3B82F6`(blue) | `#64748B`(slate) |
|
|
68
|
+
| `warm_approachable` | `#C96442`(terracotta) | `#D97706`(amber) |
|
|
69
|
+
| `technical_dense` | `#0891B2`(cyan) | `#059669`(emerald) |
|
|
70
|
+
| `editorial` | `#1A1916`(ink) | `#6B6964`(stone) |
|
|
71
|
+
| `brutalist` | `#DC2626`(red) | `#000000`(black) |
|
|
72
|
+
|
|
73
|
+
- 用户给了 brand_color → 覆盖表中 accent,neutral 锚点仍按 mood 取。
|
|
74
|
+
- 派生顺序:**palette first** → A1-identity → A2-derived → B-slot。
|
|
75
|
+
- 5 方向调色板(neutral / primary / success / warning / danger)各派生 50–900 阶梯;
|
|
76
|
+
primary 阶梯以 accent 为 500 锚点向两端推。具体公式见 `token-derivation.md`。
|
|
77
|
+
|
|
78
|
+
### A1-identity(8 必选,缺 = guard 失败)
|
|
79
|
+
`--bg` `--surface` `--fg` `--muted` `--border` `--accent` `--font-display` `--font-body`
|
|
80
|
+
|
|
81
|
+
### A2-derived(color-mix 公式派生,不手写固定 hex)
|
|
82
|
+
```
|
|
83
|
+
--accent-hover: color-mix(in oklab, var(--accent), black 8%)
|
|
84
|
+
--accent-active: color-mix(in oklab, var(--accent), black 14%)
|
|
85
|
+
--focus-ring: color-mix(in oklab, var(--accent), transparent 70%)
|
|
86
|
+
--elev-raised: color-mix(in oklab, var(--fg), transparent 92%)
|
|
87
|
+
```
|
|
88
|
+
另含 `--success` `--warn` `--danger` `--font-mono` `--space-1~12` `--radius-sm/md/lg/pill`
|
|
89
|
+
`--motion-fast/base` `--ease-standard`。
|
|
90
|
+
|
|
91
|
+
### B-slot(4 别名,组件引用永远可解析)
|
|
92
|
+
`--fg-2 → var(--fg)` / `--meta → var(--muted)` / `--border-soft → var(--border)` / `--surface-warm → var(--surface)`
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Step 3-4: 草稿 + 预览
|
|
97
|
+
- 按 target 生成 base.md + 变体(schema 见 `variant-schema.md`)。
|
|
98
|
+
- 用 `preview-template.html` 填 token 值 → 自包含 `preview.html`(色板/排版/间距/组件/明暗切换)。
|
|
99
|
+
|
|
100
|
+
## Step 5: 用户评审 + 确认
|
|
101
|
+
呈现三件套:① token 摘要表 ② preview.html 路径 ③ **默认值透明报告**。
|
|
102
|
+
AskUserQuestion 三选项:**确认落盘 / 调整某项(回到 Step 1 对应维度)/ 重新来(清空重来)**。
|
|
103
|
+
|
|
104
|
+
## Step 6: 落盘 + guard
|
|
105
|
+
两阶段写入由子代理执行(confirmed:false 草案 → 人工确认 → confirmed:true 写正式路径)。
|
|
106
|
+
落盘后运行 `node scripts/guard/design-token-guard.mjs`,校验 A1+A2+B-slot 完整性。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 默认解析规则(Default Resolution)
|
|
111
|
+
|
|
112
|
+
| 触发条件 | 应用的默认 | 理由 |
|
|
113
|
+
|---------|-----------|------|
|
|
114
|
+
| mood 未给 | `professional_minimal` | 最通用,B 端覆盖面最大,风险最低 |
|
|
115
|
+
| brand_color 未给/「帮我选」 | mood 表 accent | 保持调性与色彩一致 |
|
|
116
|
+
| display_font 未给 | `sans_display` | 系统栈零依赖,跨端最稳 |
|
|
117
|
+
| density 未给 | `balanced` | 16px 基准,适配多数信息场景 |
|
|
118
|
+
| target 未给 | `both` | 一次产出双端,避免后续补做 |
|
|
119
|
+
| mood 与某维度冲突(如 technical_dense + spacious) | 保留用户显式选择,仅在透明报告标注「非常规组合」 | 用户显式输入优先于推荐 |
|
|
120
|
+
|
|
121
|
+
**优先级**:用户显式输入 > mood 联动推荐 > 全局默认。冲突时不静默改写,标注后由 Step 5 确认。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 默认值透明报告模板(Transparency Report)
|
|
126
|
+
|
|
127
|
+
每次创建/迭代都必须随 Step 5 呈现,逐项列出「用了什么默认 + 为什么」:
|
|
128
|
+
|
|
129
|
+
```markdown
|
|
130
|
+
## 默认值透明报告
|
|
131
|
+
| 维度 | 最终值 | 来源 | 选择原因 |
|
|
132
|
+
|------|--------|------|---------|
|
|
133
|
+
| 品牌调性 | professional_minimal | 默认 | 未指定,取最通用 B 端调性 |
|
|
134
|
+
| 品牌主色 | #3B82F6 | mood 推荐 | 未给主色,按 professional_minimal 取 blue |
|
|
135
|
+
| 展示字体 | sans_display | 默认 | 未指定,系统字体栈零外部依赖 |
|
|
136
|
+
| 信息密度 | balanced | 默认 | 未指定,16px 基准适配多数场景 |
|
|
137
|
+
| 目标端 | both | 默认 | 未指定,一次覆盖 B/C 双端 |
|
|
138
|
+
|
|
139
|
+
### 非常规组合提示
|
|
140
|
+
- (若有)technical_dense + spacious:保留你的显式选择,已按此派生。
|
|
141
|
+
|
|
142
|
+
### 假设(Assumptions)
|
|
143
|
+
- 无品牌输入,采用调性默认调色板;如需精确品牌色请提供 #RRGGBB。
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## AskUserQuestion 格式示例
|
|
149
|
+
|
|
150
|
+
预填推荐 + 封闭选项,用户原样确认或改选:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
Q1 品牌调性?(推荐:professional_minimal — 最通用 B 端调性)
|
|
154
|
+
[ professional_minimal | warm_approachable | technical_dense | editorial | brutalist ]
|
|
155
|
+
|
|
156
|
+
Q2 品牌主色?(推荐:#3B82F6 — 按 professional_minimal 推荐)
|
|
157
|
+
[ 用推荐 #3B82F6 | 我来填 hex… ]
|
|
158
|
+
|
|
159
|
+
Q3 展示字体?(推荐:sans_display — 系统栈零依赖)
|
|
160
|
+
[ serif_display | sans_display | mono_accent ]
|
|
161
|
+
|
|
162
|
+
Q4 信息密度?(推荐:balanced — 16px 基准)
|
|
163
|
+
[ compact | balanced | spacious ]
|
|
164
|
+
|
|
165
|
+
Q5 目标端?(推荐:both — 一次覆盖双端)
|
|
166
|
+
[ b_end | c_end | both ]
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**封闭词汇校验**:用户答「极简」→ 追问「你是指 professional_minimal 吗?」;
|
|
170
|
+
答「蓝绿色」→ 追问具体 hex,不自行映射。澄清前不进入 Step 2。
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
<!-- design-system 预览画廊(v0.19.0):由 design-system skill 生成,token 值已填充。零外部依赖。 -->
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="zh-CN" data-theme="light" data-density="balanced">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Design System 预览画廊</title>
|
|
8
|
+
<style>
|
|
9
|
+
/* ===== TOKEN 定义(由 skill 从派生规则填充) ===== */
|
|
10
|
+
:root {
|
|
11
|
+
/* A1-identity */
|
|
12
|
+
--bg: #FAFAF9;
|
|
13
|
+
--surface: #FFFFFF;
|
|
14
|
+
--fg: #1A1916;
|
|
15
|
+
--muted: #6B6964;
|
|
16
|
+
--border: #E8E5DF;
|
|
17
|
+
--accent: #3B82F6;
|
|
18
|
+
--font-display: Georgia, serif;
|
|
19
|
+
--font-body: -apple-system, system-ui, sans-serif;
|
|
20
|
+
|
|
21
|
+
/* A2-derived */
|
|
22
|
+
--accent-hover: color-mix(in oklab, var(--accent), black 8%);
|
|
23
|
+
--accent-active: color-mix(in oklab, var(--accent), black 14%);
|
|
24
|
+
--accent-soft: color-mix(in oklab, var(--accent), transparent 86%);
|
|
25
|
+
--focus-ring: 0 0 0 3px color-mix(in oklab, var(--accent), transparent 70%);
|
|
26
|
+
--elev-raised: 0 2px 8px color-mix(in oklab, var(--fg), transparent 92%);
|
|
27
|
+
--success: #16A34A;
|
|
28
|
+
--warn: #EAB308;
|
|
29
|
+
--danger: #DC2626;
|
|
30
|
+
--font-mono: ui-monospace, 'JetBrains Mono', monospace;
|
|
31
|
+
--space-1: 4px; --space-2: 8px; --space-3: 12px;
|
|
32
|
+
--space-4: 16px; --space-5: 20px; --space-6: 24px;
|
|
33
|
+
--space-7: 32px; --space-8: 40px; --space-9: 48px;
|
|
34
|
+
--space-10: 64px; --space-11: 80px; --space-12: 96px;
|
|
35
|
+
--radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-pill: 9999px;
|
|
36
|
+
--motion-fast: 150ms; --motion-base: 200ms;
|
|
37
|
+
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
|
|
38
|
+
|
|
39
|
+
/* B-slot 别名 */
|
|
40
|
+
--fg-2: var(--fg);
|
|
41
|
+
--meta: var(--muted);
|
|
42
|
+
--border-soft: var(--border);
|
|
43
|
+
--surface-warm: var(--surface);
|
|
44
|
+
|
|
45
|
+
/* 5 方向调色板 — primary */
|
|
46
|
+
--primary-50: color-mix(in oklab, var(--accent), white 95%);
|
|
47
|
+
--primary-100: color-mix(in oklab, var(--accent), white 90%);
|
|
48
|
+
--primary-200: color-mix(in oklab, var(--accent), white 75%);
|
|
49
|
+
--primary-300: color-mix(in oklab, var(--accent), white 55%);
|
|
50
|
+
--primary-400: color-mix(in oklab, var(--accent), white 30%);
|
|
51
|
+
--primary-500: var(--accent);
|
|
52
|
+
--primary-600: color-mix(in oklab, var(--accent), black 10%);
|
|
53
|
+
--primary-700: color-mix(in oklab, var(--accent), black 22%);
|
|
54
|
+
--primary-800: color-mix(in oklab, var(--accent), black 35%);
|
|
55
|
+
--primary-900: color-mix(in oklab, var(--accent), black 48%);
|
|
56
|
+
|
|
57
|
+
/* 密度修正(balanced 默认) */
|
|
58
|
+
--text-base: 16px;
|
|
59
|
+
--container: 1120px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Dark 模式覆盖 */
|
|
63
|
+
[data-theme="dark"] {
|
|
64
|
+
--bg: #1A1916;
|
|
65
|
+
--surface: #26251F;
|
|
66
|
+
--fg: #F5F5F4;
|
|
67
|
+
--muted: #A8A29E;
|
|
68
|
+
--border: #44403C;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Density: compact */
|
|
72
|
+
[data-density="compact"] { --text-base: 14px; --container: 1280px; }
|
|
73
|
+
/* Density: spacious */
|
|
74
|
+
[data-density="spacious"] { --text-base: 18px; --container: 960px; }
|
|
75
|
+
|
|
76
|
+
/* ===== 基础样式 ===== */
|
|
77
|
+
* { box-sizing: border-box; margin: 0; }
|
|
78
|
+
body {
|
|
79
|
+
font-family: var(--font-body);
|
|
80
|
+
font-size: var(--text-base);
|
|
81
|
+
background: var(--bg);
|
|
82
|
+
color: var(--fg);
|
|
83
|
+
line-height: 1.6;
|
|
84
|
+
padding: var(--space-6);
|
|
85
|
+
transition: background var(--motion-base) var(--ease-standard),
|
|
86
|
+
color var(--motion-base) var(--ease-standard);
|
|
87
|
+
}
|
|
88
|
+
.container { max-width: var(--container); margin: 0 auto; }
|
|
89
|
+
h1, h2, h3, h4 { font-family: var(--font-display); line-height: 1.25; }
|
|
90
|
+
section { margin-bottom: var(--space-9); }
|
|
91
|
+
section > h2 { margin-bottom: var(--space-4); border-bottom: 1px solid var(--border-soft); padding-bottom: var(--space-2); }
|
|
92
|
+
|
|
93
|
+
/* ===== 控制面板 ===== */
|
|
94
|
+
.tweaks {
|
|
95
|
+
display: flex; gap: var(--space-3); align-items: center;
|
|
96
|
+
padding: var(--space-3) var(--space-4);
|
|
97
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
98
|
+
border-radius: var(--radius-md); margin-bottom: var(--space-7);
|
|
99
|
+
}
|
|
100
|
+
.tweaks button {
|
|
101
|
+
padding: var(--space-1) var(--space-3);
|
|
102
|
+
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
|
103
|
+
background: var(--surface); color: var(--fg); cursor: pointer;
|
|
104
|
+
font-size: 0.85em; transition: all var(--motion-fast) var(--ease-standard);
|
|
105
|
+
}
|
|
106
|
+
.tweaks button:hover { background: var(--accent-soft); }
|
|
107
|
+
|
|
108
|
+
/* ===== 色板区 ===== */
|
|
109
|
+
.swatch-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: var(--space-3); }
|
|
110
|
+
.swatch {
|
|
111
|
+
border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
|
|
112
|
+
overflow: hidden; text-align: center; font-size: 0.75em;
|
|
113
|
+
}
|
|
114
|
+
.swatch .block { height: 64px; }
|
|
115
|
+
.swatch .label { padding: var(--space-1) var(--space-2); color: var(--meta); }
|
|
116
|
+
.palette-row { display: flex; gap: 2px; margin-bottom: var(--space-2); }
|
|
117
|
+
.palette-row .cell { flex: 1; height: 40px; display: flex; align-items: flex-end; justify-content: center; font-size: 0.6em; padding: 2px; }
|
|
118
|
+
|
|
119
|
+
/* ===== 排版区 ===== */
|
|
120
|
+
.type-specimen { margin-bottom: var(--space-3); }
|
|
121
|
+
.type-specimen .px-label { font-size: 0.7em; color: var(--meta); font-family: var(--font-mono); }
|
|
122
|
+
|
|
123
|
+
/* ===== 间距区 ===== */
|
|
124
|
+
.space-ruler { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
125
|
+
.space-bar { display: flex; align-items: center; gap: var(--space-2); }
|
|
126
|
+
.space-bar .bar { height: 16px; background: var(--accent-soft); border: 1px solid var(--accent); border-radius: 2px; }
|
|
127
|
+
.space-bar .lbl { font-size: 0.75em; color: var(--meta); font-family: var(--font-mono); white-space: nowrap; }
|
|
128
|
+
|
|
129
|
+
/* ===== 组件区 ===== */
|
|
130
|
+
.component-row { display: flex; flex-wrap: wrap; gap: var(--space-4); align-items: flex-start; margin-bottom: var(--space-4); }
|
|
131
|
+
.btn {
|
|
132
|
+
padding: var(--space-2) var(--space-4); border-radius: var(--radius-sm);
|
|
133
|
+
font-size: 0.9em; cursor: pointer; border: 1px solid transparent;
|
|
134
|
+
transition: all var(--motion-fast) var(--ease-standard);
|
|
135
|
+
}
|
|
136
|
+
.btn-primary { background: var(--accent); color: #fff; }
|
|
137
|
+
.btn-primary:hover { background: var(--accent-hover); }
|
|
138
|
+
.btn-primary:active { background: var(--accent-active); }
|
|
139
|
+
.btn-secondary { background: var(--surface); color: var(--fg); border-color: var(--border); }
|
|
140
|
+
.btn-secondary:hover { background: var(--accent-soft); }
|
|
141
|
+
.btn-ghost { background: transparent; color: var(--accent); }
|
|
142
|
+
.btn-ghost:hover { background: var(--accent-soft); }
|
|
143
|
+
.input-field {
|
|
144
|
+
padding: var(--space-2) var(--space-3); border: 1px solid var(--border);
|
|
145
|
+
border-radius: var(--radius-sm); font-size: 0.9em; background: var(--surface); color: var(--fg);
|
|
146
|
+
width: 240px;
|
|
147
|
+
}
|
|
148
|
+
.input-field:focus { outline: none; box-shadow: var(--focus-ring); border-color: var(--accent); }
|
|
149
|
+
.card {
|
|
150
|
+
background: var(--surface); border: 1px solid var(--border-soft);
|
|
151
|
+
border-radius: var(--radius-md); padding: var(--space-5);
|
|
152
|
+
box-shadow: var(--elev-raised); max-width: 280px;
|
|
153
|
+
}
|
|
154
|
+
.card h4 { margin-bottom: var(--space-2); }
|
|
155
|
+
.card p { font-size: 0.85em; color: var(--meta); }
|
|
156
|
+
.demo-table { border-collapse: collapse; font-size: 0.85em; }
|
|
157
|
+
.demo-table th, .demo-table td {
|
|
158
|
+
padding: var(--space-2) var(--space-3); border: 1px solid var(--border); text-align: left;
|
|
159
|
+
}
|
|
160
|
+
.demo-table th { background: var(--accent-soft); font-weight: 600; }
|
|
161
|
+
.badge {
|
|
162
|
+
display: inline-block; padding: 2px var(--space-2);
|
|
163
|
+
border-radius: var(--radius-pill); font-size: 0.75em; font-weight: 500;
|
|
164
|
+
}
|
|
165
|
+
.badge-success { background: color-mix(in oklab, var(--success), transparent 85%); color: var(--success); }
|
|
166
|
+
.badge-warn { background: color-mix(in oklab, var(--warn), transparent 85%); color: #92610A; }
|
|
167
|
+
.badge-danger { background: color-mix(in oklab, var(--danger), transparent 85%); color: var(--danger); }
|
|
168
|
+
|
|
169
|
+
/* ===== 派生色区 ===== */
|
|
170
|
+
.state-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: var(--space-3); }
|
|
171
|
+
.state-chip {
|
|
172
|
+
padding: var(--space-3); border-radius: var(--radius-sm);
|
|
173
|
+
text-align: center; font-size: 0.8em; border: 1px solid var(--border-soft);
|
|
174
|
+
}
|
|
175
|
+
.focus-demo { padding: var(--space-3); box-shadow: var(--focus-ring); border-radius: var(--radius-sm); text-align: center; font-size: 0.8em; }
|
|
176
|
+
</style>
|
|
177
|
+
</head>
|
|
178
|
+
<body>
|
|
179
|
+
<div class="container">
|
|
180
|
+
|
|
181
|
+
<!-- 控制面板 -->
|
|
182
|
+
<div class="tweaks">
|
|
183
|
+
<button id="themeToggle">🌙 切换暗色</button>
|
|
184
|
+
<button id="densityCompact">紧凑</button>
|
|
185
|
+
<button id="densityBalanced">均衡</button>
|
|
186
|
+
<button id="densitySpacious">宽松</button>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
<!-- 1. 色板区 -->
|
|
190
|
+
<section>
|
|
191
|
+
<h2>色板区 Color Palette</h2>
|
|
192
|
+
<div class="swatch-grid">
|
|
193
|
+
<div class="swatch"><div class="block" style="background:var(--bg)"></div><div class="label">--bg</div></div>
|
|
194
|
+
<div class="swatch"><div class="block" style="background:var(--surface)"></div><div class="label">--surface</div></div>
|
|
195
|
+
<div class="swatch"><div class="block" style="background:var(--fg)"></div><div class="label">--fg</div></div>
|
|
196
|
+
<div class="swatch"><div class="block" style="background:var(--muted)"></div><div class="label">--muted</div></div>
|
|
197
|
+
<div class="swatch"><div class="block" style="background:var(--border)"></div><div class="label">--border</div></div>
|
|
198
|
+
<div class="swatch"><div class="block" style="background:var(--accent)"></div><div class="label">--accent</div></div>
|
|
199
|
+
</div>
|
|
200
|
+
<h3 style="margin:var(--space-4) 0 var(--space-2)">Primary 50–900</h3>
|
|
201
|
+
<div class="palette-row">
|
|
202
|
+
<div class="cell" style="background:var(--primary-50)">50</div>
|
|
203
|
+
<div class="cell" style="background:var(--primary-100)">100</div>
|
|
204
|
+
<div class="cell" style="background:var(--primary-200)">200</div>
|
|
205
|
+
<div class="cell" style="background:var(--primary-300)">300</div>
|
|
206
|
+
<div class="cell" style="background:var(--primary-400)">400</div>
|
|
207
|
+
<div class="cell" style="background:var(--primary-500);color:#fff">500</div>
|
|
208
|
+
<div class="cell" style="background:var(--primary-600);color:#fff">600</div>
|
|
209
|
+
<div class="cell" style="background:var(--primary-700);color:#fff">700</div>
|
|
210
|
+
<div class="cell" style="background:var(--primary-800);color:#fff">800</div>
|
|
211
|
+
<div class="cell" style="background:var(--primary-900);color:#fff">900</div>
|
|
212
|
+
</div>
|
|
213
|
+
</section>
|
|
214
|
+
|
|
215
|
+
<!-- 2. 排版区 -->
|
|
216
|
+
<section>
|
|
217
|
+
<h2>排版区 Typography</h2>
|
|
218
|
+
<div class="type-specimen"><span class="px-label">32px / font-display</span><h1>Heading 1 标题一</h1></div>
|
|
219
|
+
<div class="type-specimen"><span class="px-label">26px / font-display</span><h2 style="border:none;padding:0">Heading 2 标题二</h2></div>
|
|
220
|
+
<div class="type-specimen"><span class="px-label">22px / font-display</span><h3>Heading 3 标题三</h3></div>
|
|
221
|
+
<div class="type-specimen"><span class="px-label">18px / font-display</span><h4>Heading 4 标题四</h4></div>
|
|
222
|
+
<div class="type-specimen"><span class="px-label">16px / font-body</span><p>正文段落。设计系统确保跨页面的视觉一致性,所有颜色与间距均来自 token 变量。</p></div>
|
|
223
|
+
<div class="type-specimen"><span class="px-label">14px / font-body small</span><p style="font-size:0.875em;color:var(--meta)">辅助文字 / 说明信息。</p></div>
|
|
224
|
+
<div class="type-specimen"><span class="px-label">14px / font-mono</span><code style="font-family:var(--font-mono);font-size:0.875em;background:var(--accent-soft);padding:2px 6px;border-radius:4px">const token = "deterministic";</code></div>
|
|
225
|
+
</section>
|
|
226
|
+
|
|
227
|
+
<!-- 3. 间距区 -->
|
|
228
|
+
<section>
|
|
229
|
+
<h2>间距区 Spacing</h2>
|
|
230
|
+
<div class="space-ruler">
|
|
231
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-1)"></div><div class="lbl">space-1: 4px</div></div>
|
|
232
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-2)"></div><div class="lbl">space-2: 8px</div></div>
|
|
233
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-3)"></div><div class="lbl">space-3: 12px</div></div>
|
|
234
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-4)"></div><div class="lbl">space-4: 16px</div></div>
|
|
235
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-5)"></div><div class="lbl">space-5: 20px</div></div>
|
|
236
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-6)"></div><div class="lbl">space-6: 24px</div></div>
|
|
237
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-7)"></div><div class="lbl">space-7: 32px</div></div>
|
|
238
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-8)"></div><div class="lbl">space-8: 40px</div></div>
|
|
239
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-9)"></div><div class="lbl">space-9: 48px</div></div>
|
|
240
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-10)"></div><div class="lbl">space-10: 64px</div></div>
|
|
241
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-11)"></div><div class="lbl">space-11: 80px</div></div>
|
|
242
|
+
<div class="space-bar"><div class="bar" style="width:var(--space-12)"></div><div class="lbl">space-12: 96px</div></div>
|
|
243
|
+
</div>
|
|
244
|
+
</section>
|
|
245
|
+
|
|
246
|
+
<!-- 4. 组件区 -->
|
|
247
|
+
<section>
|
|
248
|
+
<h2>组件区 Components</h2>
|
|
249
|
+
<div class="component-row">
|
|
250
|
+
<button class="btn btn-primary">主按钮</button>
|
|
251
|
+
<button class="btn btn-secondary">次按钮</button>
|
|
252
|
+
<button class="btn btn-ghost">幽灵按钮</button>
|
|
253
|
+
</div>
|
|
254
|
+
<div class="component-row">
|
|
255
|
+
<input class="input-field" type="text" placeholder="输入框示例…">
|
|
256
|
+
<span class="badge badge-success">成功</span>
|
|
257
|
+
<span class="badge badge-warn">警告</span>
|
|
258
|
+
<span class="badge badge-danger">危险</span>
|
|
259
|
+
</div>
|
|
260
|
+
<div class="component-row">
|
|
261
|
+
<div class="card">
|
|
262
|
+
<h4>卡片标题</h4>
|
|
263
|
+
<p>卡片内容示例。所有样式均来自 token 变量,零硬编码色值。</p>
|
|
264
|
+
</div>
|
|
265
|
+
<table class="demo-table">
|
|
266
|
+
<thead><tr><th>列 A</th><th>列 B</th><th>状态</th></tr></thead>
|
|
267
|
+
<tbody>
|
|
268
|
+
<tr><td>数据 1</td><td>值 X</td><td><span class="badge badge-success">通过</span></td></tr>
|
|
269
|
+
<tr><td>数据 2</td><td>值 Y</td><td><span class="badge badge-warn">待定</span></td></tr>
|
|
270
|
+
</tbody>
|
|
271
|
+
</table>
|
|
272
|
+
</div>
|
|
273
|
+
</section>
|
|
274
|
+
|
|
275
|
+
<!-- 5. 派生色区 -->
|
|
276
|
+
<section>
|
|
277
|
+
<h2>派生色区 Derived States</h2>
|
|
278
|
+
<div class="state-grid">
|
|
279
|
+
<div class="state-chip" style="background:var(--accent);color:#fff">accent</div>
|
|
280
|
+
<div class="state-chip" style="background:var(--accent-hover);color:#fff">accent-hover</div>
|
|
281
|
+
<div class="state-chip" style="background:var(--accent-active);color:#fff">accent-active</div>
|
|
282
|
+
<div class="state-chip" style="background:var(--accent-soft)">accent-soft</div>
|
|
283
|
+
<div class="focus-demo">focus-ring 演示</div>
|
|
284
|
+
</div>
|
|
285
|
+
</section>
|
|
286
|
+
|
|
287
|
+
</div>
|
|
288
|
+
|
|
289
|
+
<script>
|
|
290
|
+
(function() {
|
|
291
|
+
var html = document.documentElement;
|
|
292
|
+
// 恢复 localStorage 偏好
|
|
293
|
+
var savedTheme = localStorage.getItem('ds-theme');
|
|
294
|
+
var savedDensity = localStorage.getItem('ds-density');
|
|
295
|
+
if (savedTheme) html.setAttribute('data-theme', savedTheme);
|
|
296
|
+
if (savedDensity) html.setAttribute('data-density', savedDensity);
|
|
297
|
+
updateLabels();
|
|
298
|
+
|
|
299
|
+
document.getElementById('themeToggle').addEventListener('click', function() {
|
|
300
|
+
var next = html.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';
|
|
301
|
+
html.setAttribute('data-theme', next);
|
|
302
|
+
localStorage.setItem('ds-theme', next);
|
|
303
|
+
updateLabels();
|
|
304
|
+
});
|
|
305
|
+
['compact','balanced','spacious'].forEach(function(d) {
|
|
306
|
+
document.getElementById('density' + d.charAt(0).toUpperCase() + d.slice(1))
|
|
307
|
+
.addEventListener('click', function() {
|
|
308
|
+
html.setAttribute('data-density', d);
|
|
309
|
+
localStorage.setItem('ds-density', d);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
function updateLabels() {
|
|
313
|
+
document.getElementById('themeToggle').textContent =
|
|
314
|
+
html.getAttribute('data-theme') === 'dark' ? '☀️ 切换亮色' : '🌙 切换暗色';
|
|
315
|
+
}
|
|
316
|
+
})();
|
|
317
|
+
</script>
|
|
318
|
+
</body>
|
|
319
|
+
</html>
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# 确定性 Token 派生规则(v0.19.0)
|
|
2
|
+
|
|
3
|
+
> **原则**: 同输入 = 同输出。不即兴发挥。每个 token 值由映射表确定性决定。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## A1-identity(8 必选 token)
|
|
8
|
+
|
|
9
|
+
| Token | Source | Example (professional_minimal) |
|
|
10
|
+
|-------|--------|-------------------------------|
|
|
11
|
+
| `--bg` | mood→bg mapping | `#FAFAF9` |
|
|
12
|
+
| `--surface` | mood→surface | `#FFFFFF` |
|
|
13
|
+
| `--fg` | mood→fg | `#1A1916` |
|
|
14
|
+
| `--muted` | fg lightened 40% | `#6B6964` |
|
|
15
|
+
| `--border` | fg lightened 80% | `#E8E5DF` |
|
|
16
|
+
| `--accent` | mood→accent mapping (or user hex) | `#3B82F6` |
|
|
17
|
+
| `--font-display` | font preference→stack | `Georgia, serif` (serif_display) |
|
|
18
|
+
| `--font-body` | always system sans | `-apple-system, system-ui, sans-serif` |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Mood → 色彩映射表(5 moods × 6 colors = 确定性)
|
|
23
|
+
|
|
24
|
+
| Mood | bg | surface | fg | muted | border | accent |
|
|
25
|
+
|------|-----|---------|-----|-------|--------|--------|
|
|
26
|
+
| professional_minimal | #FAFAF9 | #FFFFFF | #1A1916 | #6B6964 | #E8E5DF | #3B82F6 |
|
|
27
|
+
| warm_approachable | #FDF8F4 | #FFFFFF | #292524 | #78716C | #E7E5E4 | #C96442 |
|
|
28
|
+
| technical_dense | #F8FAFC | #FFFFFF | #0F172A | #64748B | #E2E8F0 | #0891B2 |
|
|
29
|
+
| editorial | #FAFAF7 | #FFFFFF | #1A1916 | #6B6964 | #E8E5DF | #1A1916 |
|
|
30
|
+
| brutalist | #FFFFFF | #F5F5F5 | #000000 | #525252 | #D4D4D4 | #DC2626 |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## A2-derived(color-mix 公式,mood 无关)
|
|
35
|
+
|
|
36
|
+
```css
|
|
37
|
+
/* 交互状态色 */
|
|
38
|
+
--accent-hover: color-mix(in oklab, var(--accent), black 8%);
|
|
39
|
+
--accent-active: color-mix(in oklab, var(--accent), black 14%);
|
|
40
|
+
--accent-soft: color-mix(in oklab, var(--accent), transparent 86%);
|
|
41
|
+
--focus-ring: 0 0 0 3px color-mix(in oklab, var(--accent), transparent 70%);
|
|
42
|
+
--elev-raised: 0 2px 8px color-mix(in oklab, var(--fg), transparent 92%);
|
|
43
|
+
|
|
44
|
+
/* 语义色(固定) */
|
|
45
|
+
--success: #16A34A;
|
|
46
|
+
--warn: #EAB308;
|
|
47
|
+
--danger: #DC2626;
|
|
48
|
+
|
|
49
|
+
/* 字体 */
|
|
50
|
+
--font-mono: ui-monospace, 'JetBrains Mono', monospace;
|
|
51
|
+
|
|
52
|
+
/* 间距(4px base scale) */
|
|
53
|
+
--space-1: 4px; --space-2: 8px; --space-3: 12px;
|
|
54
|
+
--space-4: 16px; --space-5: 20px; --space-6: 24px;
|
|
55
|
+
--space-7: 32px; --space-8: 40px; --space-9: 48px;
|
|
56
|
+
--space-10: 64px; --space-11: 80px; --space-12: 96px;
|
|
57
|
+
|
|
58
|
+
/* 圆角 */
|
|
59
|
+
--radius-sm: 8px;
|
|
60
|
+
--radius-md: 12px;
|
|
61
|
+
--radius-lg: 16px;
|
|
62
|
+
--radius-pill: 9999px;
|
|
63
|
+
|
|
64
|
+
/* 动效 */
|
|
65
|
+
--motion-fast: 150ms;
|
|
66
|
+
--motion-base: 200ms;
|
|
67
|
+
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## B-slot 别名(4 项)
|
|
73
|
+
|
|
74
|
+
```css
|
|
75
|
+
--fg-2: var(--fg);
|
|
76
|
+
--meta: var(--muted);
|
|
77
|
+
--border-soft: var(--border);
|
|
78
|
+
--surface-warm: var(--surface);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
组件始终引用 B-slot 别名 → 永远可解析,与底层 A1 解耦。
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 5 方向调色板派生规则
|
|
86
|
+
|
|
87
|
+
从 accent hex 生成 primary 方向 50–900 阶梯:
|
|
88
|
+
|
|
89
|
+
| Step | 派生公式 |
|
|
90
|
+
|------|---------|
|
|
91
|
+
| 50 | color-mix(in oklab, accent, white 95%) |
|
|
92
|
+
| 100 | color-mix(in oklab, accent, white 90%) |
|
|
93
|
+
| 200 | color-mix(in oklab, accent, white 75%) |
|
|
94
|
+
| 300 | color-mix(in oklab, accent, white 55%) |
|
|
95
|
+
| 400 | color-mix(in oklab, accent, white 30%) |
|
|
96
|
+
| 500 | accent(基准色) |
|
|
97
|
+
| 600 | color-mix(in oklab, accent, black 10%) |
|
|
98
|
+
| 700 | color-mix(in oklab, accent, black 22%) |
|
|
99
|
+
| 800 | color-mix(in oklab, accent, black 35%) |
|
|
100
|
+
| 900 | color-mix(in oklab, accent, black 48%) |
|
|
101
|
+
|
|
102
|
+
- **neutral** 方向:从 fg 同理派生(白/黑混合)。
|
|
103
|
+
- **success / warning / danger**:固定语义色(#16A34A / #EAB308 / #DC2626),各派生同结构阶梯。
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Density → 间距/排版修正
|
|
108
|
+
|
|
109
|
+
| Density | base font | space unit | container |
|
|
110
|
+
|---------|-----------|------------|-----------|
|
|
111
|
+
| compact | 14px | 4px | 1280px |
|
|
112
|
+
| balanced | 16px | 4px | 1120px |
|
|
113
|
+
| spacious | 18px | 8px | 960px |
|
|
114
|
+
|
|
115
|
+
density 只影响数值倍率,不影响 token 名称或色彩。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Base / Variant 拆分 Schema(variant-schema)
|
|
2
|
+
|
|
3
|
+
设计系统拆为 **base 品牌共享层** + **端变体层**。base 管「品牌是什么」,变体管「在该端怎么排布」。
|
|
4
|
+
变体读 base 取色与品牌,覆写排版/间距/布局/组件/动效。合并后 = 一份完整 token 集(喂给 design-tokens.css)。
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
.team-flow/design-system/
|
|
8
|
+
├── base.md # 品牌共享层(color/brand/voice/anti-patterns/extensions)
|
|
9
|
+
├── b-end.md # B 端变体(typography/spacing/layout/components/motion)
|
|
10
|
+
├── c-end.md # C 端变体(同结构,按 C 端密度/字号覆写)
|
|
11
|
+
└── preview.html
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## base.md 段落(品牌共享,端无关)
|
|
17
|
+
|
|
18
|
+
| 段 | 内容 | Token 归属 |
|
|
19
|
+
|----|------|-----------|
|
|
20
|
+
| `color` | A1-identity 8 必选(`--bg/--surface/--fg/--muted/--border/--accent/--font-display/--font-body`)+ 5 方向调色板(neutral/primary/success/warning/danger,各 50–900 阶梯) | A1-identity + palette |
|
|
21
|
+
| `brand` | logo 规范 + 品牌主色(accent 的品牌语境用法、留白、最小尺寸) | brand |
|
|
22
|
+
| `voice` | 文案语气(专业/简洁/温度等级),跨端统一 | voice |
|
|
23
|
+
| `anti-patterns` | 禁止内联样式漂移 / 禁止非 token 颜色 / 禁止跨端私改品牌色(**必含前两条**) | anti-patterns |
|
|
24
|
+
| `extensions` | C-token 名单制清单:品牌专有 token + 提升路径标注(C→B→A2) | C-extension |
|
|
25
|
+
|
|
26
|
+
> base 不含排版/间距/布局——这些随端变化,归变体。base 的 A1+A2+B-slot 必须完整可过 guard。
|
|
27
|
+
|
|
28
|
+
## 变体 .md 段落(b-end.md / c-end.md,端特定)
|
|
29
|
+
|
|
30
|
+
| 段 | 内容 | Token 归属 |
|
|
31
|
+
|----|------|-----------|
|
|
32
|
+
| `typography` | font-display/body/mono 引用 + type scale(`--text-xs~4xl`,1.25 比例)+ weights + line-height(按 density) | A1-structure |
|
|
33
|
+
| `spacing` | `--space-1~12` 阶梯(基于 density 基准:compact 12 / balanced 16 / spacious 20) | A2-derived |
|
|
34
|
+
| `layout` | 栅格 12 列 / 断点 sm/md/lg / 容器 max-width(B 端宽容器、C 端窄容器) | A1-structure |
|
|
35
|
+
| `components` | button / input / card / table 规范(**最少这 4 类**),全部 token-bound,引用 B-slot | components |
|
|
36
|
+
| `motion` | duration(`--motion-fast/base`,150–300ms)+ `--ease-standard` | A2-derived |
|
|
37
|
+
|
|
38
|
+
> B 端 vs C 端差异示例:B 端 compact + 14px + 宽表格容器;C 端 spacious + 17px + 窄卡片容器。
|
|
39
|
+
> 两端共享 base 的 color/brand/voice,绝不各自重定义品牌色。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 继承规则(Inheritance)
|
|
44
|
+
|
|
45
|
+
1. 变体**只读** base 的 `color` / `brand` / `voice` / `anti-patterns` / `extensions`——不复制、不覆写品牌色。
|
|
46
|
+
2. 变体**覆写** `typography` / `spacing` / `layout` / `components` / `motion`——这是端差异的合法表达。
|
|
47
|
+
3. 变体新增 token 必须引用 base 已有 token(如 `--card-bg: var(--surface)`),禁止孤立 token、禁止硬编码 hex。
|
|
48
|
+
4. 变体需要的品牌专有 token → 先列入 base 的 `extensions`(C-token 名单制),达晋升条件再升级。
|
|
49
|
+
|
|
50
|
+
## Token 合并规则(Merge → design-tokens.css)
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
完整 token 集 = base(A1-identity + A1-structure 颜色/字体部分 + A2-derived + B-slot + palette)
|
|
54
|
+
+ 变体(A1-structure 排版/布局 + spacing + components + motion)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- 渲染某端时:把 base `:root` + 该端变体 `:root` 合并进**单个 `<style>`**(无全局级联)。
|
|
58
|
+
- 缺任何一个 A1/A2/B-slot token → 规则悄悄失效 → `design-token-guard.mjs` 失败。
|
|
59
|
+
- 同 token 名 base 与变体冲突时:**变体优先**(仅限排版/间距/布局/动效类);颜色/品牌类冲突 = 错误,guard 报错。
|
|
60
|
+
- 迭代(iterate)走 MERGE 不 OVERWRITE:新组件进变体 `components`,新共享色进 base `color`,并记变更履历。
|