@owlmeans/viable-common 0.0.44 → 0.0.46
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 +4 -3
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/agent-presentation/SKILL.md +4 -4
- package/agent-meta/skills/viable-common/SKILL.md +59 -30
- package/build/agent/index.d.ts +1 -0
- package/build/agent/index.d.ts.map +1 -1
- package/build/agent/index.js.map +1 -1
- package/build/agent/presentation/types.d.ts +21 -0
- package/build/agent/presentation/types.d.ts.map +1 -0
- package/build/agent/presentation/types.js +2 -0
- package/build/agent/presentation/types.js.map +1 -0
- package/build/agent/presentation.d.ts +10 -8
- package/build/agent/presentation.d.ts.map +1 -1
- package/build/agent/presentation.js +216 -195
- package/build/agent/presentation.js.map +1 -1
- package/build/agent/types.local.d.ts +3 -1
- package/build/agent/types.local.d.ts.map +1 -1
- package/build/areas/index.d.ts +1 -0
- package/build/areas/index.d.ts.map +1 -1
- package/build/areas/index.js.map +1 -1
- package/build/areas/tenancy/types.d.ts +23 -0
- package/build/areas/tenancy/types.d.ts.map +1 -0
- package/build/areas/tenancy/types.js +2 -0
- package/build/areas/tenancy/types.js.map +1 -0
- package/build/areas/tenancy.d.ts +5 -14
- package/build/areas/tenancy.d.ts.map +1 -1
- package/build/areas/tenancy.js +20 -26
- package/build/areas/tenancy.js.map +1 -1
- package/build/ba/connecting/types.d.ts +45 -0
- package/build/ba/connecting/types.d.ts.map +1 -0
- package/build/ba/connecting/types.js +2 -0
- package/build/ba/connecting/types.js.map +1 -0
- package/build/ba/connecting.d.ts +4 -0
- package/build/ba/connecting.d.ts.map +1 -0
- package/build/ba/connecting.js +47 -0
- package/build/ba/connecting.js.map +1 -0
- package/build/ba/helpers.d.ts +4 -39
- package/build/ba/helpers.d.ts.map +1 -1
- package/build/ba/helpers.js +5 -79
- package/build/ba/helpers.js.map +1 -1
- package/build/ba/index.d.ts +2 -0
- package/build/ba/index.d.ts.map +1 -1
- package/build/ba/index.js +1 -0
- package/build/ba/index.js.map +1 -1
- package/build/blueprint/types.d.ts +1 -2
- package/build/blueprint/types.d.ts.map +1 -1
- package/build/connect/branding/types.d.ts +28 -0
- package/build/connect/branding/types.d.ts.map +1 -0
- package/build/connect/branding/types.js +2 -0
- package/build/connect/branding/types.js.map +1 -0
- package/build/connect/consts.d.ts +2 -0
- package/build/connect/consts.d.ts.map +1 -1
- package/build/connect/consts.js +2 -0
- package/build/connect/consts.js.map +1 -1
- package/build/connect/conversion/types.d.ts +93 -0
- package/build/connect/conversion/types.d.ts.map +1 -0
- package/build/connect/conversion/types.js +2 -0
- package/build/connect/conversion/types.js.map +1 -0
- package/build/connect/entrypoints/types.d.ts +30 -0
- package/build/connect/entrypoints/types.d.ts.map +1 -0
- package/build/connect/entrypoints/types.js +2 -0
- package/build/connect/entrypoints/types.js.map +1 -0
- package/build/connect/entrypoints.d.ts +17 -11
- package/build/connect/entrypoints.d.ts.map +1 -1
- package/build/connect/entrypoints.js.map +1 -1
- package/build/connect/errors/types.d.ts +20 -0
- package/build/connect/errors/types.d.ts.map +1 -0
- package/build/connect/errors/types.js +2 -0
- package/build/connect/errors/types.js.map +1 -0
- package/build/connect/errors.d.ts +1 -1
- package/build/connect/errors.d.ts.map +1 -1
- package/build/connect/index.d.ts +13 -3
- package/build/connect/index.d.ts.map +1 -1
- package/build/connect/index.js +1 -1
- package/build/connect/index.js.map +1 -1
- package/build/connect/kit/types.d.ts +52 -0
- package/build/connect/kit/types.d.ts.map +1 -0
- package/build/connect/kit/types.js +2 -0
- package/build/connect/kit/types.js.map +1 -0
- package/build/connect/model-tier/types.d.ts +16 -0
- package/build/connect/model-tier/types.d.ts.map +1 -0
- package/build/connect/model-tier/types.js +2 -0
- package/build/connect/model-tier/types.js.map +1 -0
- package/build/connect/model-tier.d.ts +4 -0
- package/build/connect/model-tier.d.ts.map +1 -0
- package/build/connect/model-tier.js +21 -0
- package/build/connect/model-tier.js.map +1 -0
- package/build/connect/ops/types.d.ts +198 -0
- package/build/connect/ops/types.d.ts.map +1 -0
- package/build/connect/ops/types.js +2 -0
- package/build/connect/ops/types.js.map +1 -0
- package/build/connect/pipeline/types.d.ts +39 -0
- package/build/connect/pipeline/types.d.ts.map +1 -0
- package/build/connect/pipeline/types.js +2 -0
- package/build/connect/pipeline/types.js.map +1 -0
- package/build/connect/project/types.d.ts +127 -0
- package/build/connect/project/types.d.ts.map +1 -0
- package/build/connect/project/types.js +2 -0
- package/build/connect/project/types.js.map +1 -0
- package/build/connect/references/types.d.ts +157 -0
- package/build/connect/references/types.d.ts.map +1 -0
- package/build/connect/references/types.js +2 -0
- package/build/connect/references/types.js.map +1 -0
- package/build/connect/references/types.local.d.ts +5 -0
- package/build/connect/references/types.local.d.ts.map +1 -0
- package/build/connect/references/types.local.js.map +1 -0
- package/build/connect/references.d.ts +1 -1
- package/build/connect/references.d.ts.map +1 -1
- package/build/connect/references.js.map +1 -1
- package/build/connect/schemas.d.ts +8 -5
- package/build/connect/schemas.d.ts.map +1 -1
- package/build/connect/schemas.js +1 -3
- package/build/connect/schemas.js.map +1 -1
- package/build/connect/session/types.d.ts +73 -0
- package/build/connect/session/types.d.ts.map +1 -0
- package/build/connect/session/types.js +2 -0
- package/build/connect/session/types.js.map +1 -0
- package/build/connect/settings/types.d.ts +48 -0
- package/build/connect/settings/types.d.ts.map +1 -0
- package/build/connect/settings/types.js +2 -0
- package/build/connect/settings/types.js.map +1 -0
- package/build/connect/types.d.ts +1 -198
- package/build/connect/types.d.ts.map +1 -1
- package/build/convert/analysis/types.d.ts +93 -0
- package/build/convert/analysis/types.d.ts.map +1 -0
- package/build/convert/analysis/types.js +2 -0
- package/build/convert/analysis/types.js.map +1 -0
- package/build/convert/{consts.local.d.ts → census/consts.local.d.ts} +1 -1
- package/build/convert/census/consts.local.d.ts.map +1 -0
- package/build/convert/{consts.local.js → census/consts.local.js} +1 -1
- package/build/convert/census/consts.local.js.map +1 -0
- package/build/convert/census/types.d.ts +176 -0
- package/build/convert/census/types.d.ts.map +1 -0
- package/build/convert/census/types.js +2 -0
- package/build/convert/census/types.js.map +1 -0
- package/build/convert/census.d.ts +4 -0
- package/build/convert/census.d.ts.map +1 -0
- package/build/convert/census.js +83 -0
- package/build/convert/census.js.map +1 -0
- package/build/convert/consts.d.ts +4 -0
- package/build/convert/consts.d.ts.map +1 -1
- package/build/convert/consts.js +4 -0
- package/build/convert/consts.js.map +1 -1
- package/build/convert/detection/types.d.ts +67 -0
- package/build/convert/detection/types.d.ts.map +1 -0
- package/build/convert/detection/types.js +2 -0
- package/build/convert/detection/types.js.map +1 -0
- package/build/convert/docs/types.d.ts +129 -0
- package/build/convert/docs/types.d.ts.map +1 -0
- package/build/convert/docs/types.js +2 -0
- package/build/convert/docs/types.js.map +1 -0
- package/build/convert/docs.d.ts +4 -0
- package/build/convert/docs.d.ts.map +1 -0
- package/build/convert/docs.js +9 -0
- package/build/convert/docs.js.map +1 -0
- package/build/convert/estimate/types.d.ts +77 -0
- package/build/convert/estimate/types.d.ts.map +1 -0
- package/build/convert/estimate/types.js +2 -0
- package/build/convert/estimate/types.js.map +1 -0
- package/build/convert/estimate.d.ts +11 -0
- package/build/convert/estimate.d.ts.map +1 -0
- package/build/convert/estimate.js +18 -0
- package/build/convert/estimate.js.map +1 -0
- package/build/convert/helpers.d.ts +14 -78
- package/build/convert/helpers.d.ts.map +1 -1
- package/build/convert/helpers.js +27 -199
- package/build/convert/helpers.js.map +1 -1
- package/build/convert/index.d.ts +14 -0
- package/build/convert/index.d.ts.map +1 -1
- package/build/convert/index.js +5 -0
- package/build/convert/index.js.map +1 -1
- package/build/convert/origin/types.d.ts +41 -0
- package/build/convert/origin/types.d.ts.map +1 -0
- package/build/convert/origin/types.js +2 -0
- package/build/convert/origin/types.js.map +1 -0
- package/build/convert/origin.d.ts +4 -0
- package/build/convert/origin.d.ts.map +1 -0
- package/build/convert/origin.js +25 -0
- package/build/convert/origin.js.map +1 -0
- package/build/convert/record/types.d.ts +98 -0
- package/build/convert/record/types.d.ts.map +1 -0
- package/build/convert/record/types.js +2 -0
- package/build/convert/record/types.js.map +1 -0
- package/build/convert/schemas.d.ts +7 -6
- package/build/convert/schemas.d.ts.map +1 -1
- package/build/convert/schemas.js +1 -5
- package/build/convert/schemas.js.map +1 -1
- package/build/convert/stage/types.d.ts +27 -0
- package/build/convert/stage/types.d.ts.map +1 -0
- package/build/convert/stage/types.js +2 -0
- package/build/convert/stage/types.js.map +1 -0
- package/build/convert/stage.d.ts +4 -0
- package/build/convert/stage.d.ts.map +1 -0
- package/build/convert/stage.js +25 -0
- package/build/convert/stage.js.map +1 -0
- package/build/convert/taxonomy/types.d.ts +71 -0
- package/build/convert/taxonomy/types.d.ts.map +1 -0
- package/build/convert/taxonomy/types.js +2 -0
- package/build/convert/taxonomy/types.js.map +1 -0
- package/build/convert/types.d.ts +1 -657
- package/build/convert/types.d.ts.map +1 -1
- package/build/convert/utils.d.ts +2 -1
- package/build/convert/utils.d.ts.map +1 -1
- package/build/convert/utils.js +5 -4
- package/build/convert/utils.js.map +1 -1
- package/build/design/helpers.d.ts +9 -49
- package/build/design/helpers.d.ts.map +1 -1
- package/build/design/helpers.js +17 -224
- package/build/design/helpers.js.map +1 -1
- package/build/design/index.d.ts +3 -0
- package/build/design/index.d.ts.map +1 -1
- package/build/design/index.js +1 -0
- package/build/design/index.js.map +1 -1
- package/build/design/runtime/types.d.ts +16 -0
- package/build/design/runtime/types.d.ts.map +1 -0
- package/build/design/runtime/types.js +2 -0
- package/build/design/runtime/types.js.map +1 -0
- package/build/design/runtime.d.ts +6 -2
- package/build/design/runtime.d.ts.map +1 -1
- package/build/design/runtime.js +13 -5
- package/build/design/runtime.js.map +1 -1
- package/build/design/story/types.d.ts +67 -0
- package/build/design/story/types.d.ts.map +1 -0
- package/build/design/story/types.js +2 -0
- package/build/design/story/types.js.map +1 -0
- package/build/design/story.d.ts +4 -0
- package/build/design/story.d.ts.map +1 -0
- package/build/design/story.js +184 -0
- package/build/design/story.js.map +1 -0
- package/build/dev/types.local.d.ts +2 -1
- package/build/dev/types.local.d.ts.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/integrity/index.d.ts +4 -0
- package/build/integrity/index.d.ts.map +1 -1
- package/build/integrity/index.js +2 -0
- package/build/integrity/index.js.map +1 -1
- package/build/integrity/layout/consts.d.ts +59 -0
- package/build/integrity/layout/consts.d.ts.map +1 -0
- package/build/integrity/layout/consts.js +66 -0
- package/build/integrity/layout/consts.js.map +1 -0
- package/build/integrity/layout/consts.local.d.ts +18 -0
- package/build/integrity/layout/consts.local.d.ts.map +1 -0
- package/build/integrity/layout/consts.local.js +176 -0
- package/build/integrity/layout/consts.local.js.map +1 -0
- package/build/integrity/layout/types.d.ts +35 -0
- package/build/integrity/layout/types.d.ts.map +1 -0
- package/build/integrity/layout/types.js +2 -0
- package/build/integrity/layout/types.js.map +1 -0
- package/build/integrity/layout.d.ts +4 -0
- package/build/integrity/layout.d.ts.map +1 -0
- package/build/integrity/layout.js +25 -0
- package/build/integrity/layout.js.map +1 -0
- package/build/integrity/types.d.ts +3 -1
- package/build/integrity/types.d.ts.map +1 -1
- package/build/integrity/utils.d.ts +6 -81
- package/build/integrity/utils.d.ts.map +1 -1
- package/build/integrity/utils.js +11 -279
- package/build/integrity/utils.js.map +1 -1
- package/build/integrity/verify/types.d.ts +26 -0
- package/build/integrity/verify/types.d.ts.map +1 -0
- package/build/integrity/verify/types.js +2 -0
- package/build/integrity/verify/types.js.map +1 -0
- package/build/integrity/verify.d.ts +5 -19
- package/build/integrity/verify.d.ts.map +1 -1
- package/build/integrity/verify.js +164 -175
- package/build/integrity/verify.js.map +1 -1
- package/build/intent/consts.d.ts +16 -0
- package/build/intent/consts.d.ts.map +1 -1
- package/build/intent/consts.js +63 -0
- package/build/intent/consts.js.map +1 -1
- package/build/intent/entrypoints.d.ts +2 -11
- package/build/intent/entrypoints.d.ts.map +1 -1
- package/build/intent/entrypoints.js.map +1 -1
- package/build/intent/flow.d.ts.map +1 -1
- package/build/intent/flow.js +2 -2
- package/build/intent/flow.js.map +1 -1
- package/build/intent/index.d.ts +0 -1
- package/build/intent/index.d.ts.map +1 -1
- package/build/intent/index.js +0 -1
- package/build/intent/index.js.map +1 -1
- package/build/intent/types.d.ts +13 -2
- package/build/intent/types.d.ts.map +1 -1
- package/build/legal/consts.d.ts +36 -0
- package/build/legal/consts.d.ts.map +1 -0
- package/build/legal/consts.js +16 -0
- package/build/legal/consts.js.map +1 -0
- package/build/legal/index.d.ts +3 -0
- package/build/legal/index.d.ts.map +1 -0
- package/build/legal/index.js +2 -0
- package/build/legal/index.js.map +1 -0
- package/build/legal/types.d.ts +10 -0
- package/build/legal/types.d.ts.map +1 -0
- package/build/legal/types.js +2 -0
- package/build/legal/types.js.map +1 -0
- package/build/moderation/index.d.ts +2 -0
- package/build/moderation/index.d.ts.map +1 -1
- package/build/moderation/index.js +1 -0
- package/build/moderation/index.js.map +1 -1
- package/build/moderation/utils.d.ts +3 -15
- package/build/moderation/utils.d.ts.map +1 -1
- package/build/moderation/utils.js +5 -30
- package/build/moderation/utils.js.map +1 -1
- package/build/moderation/verdict/types.d.ts +24 -0
- package/build/moderation/verdict/types.d.ts.map +1 -0
- package/build/moderation/verdict/types.js +2 -0
- package/build/moderation/verdict/types.js.map +1 -0
- package/build/moderation/verdict.d.ts +4 -0
- package/build/moderation/verdict.d.ts.map +1 -0
- package/build/moderation/verdict.js +21 -0
- package/build/moderation/verdict.js.map +1 -0
- package/build/planning/card/types.d.ts +42 -0
- package/build/planning/card/types.d.ts.map +1 -0
- package/build/planning/card/types.js +2 -0
- package/build/planning/card/types.js.map +1 -0
- package/build/planning/card.d.ts +4 -0
- package/build/planning/card.d.ts.map +1 -0
- package/build/planning/card.js +51 -0
- package/build/planning/card.js.map +1 -0
- package/build/planning/flows.d.ts +34 -0
- package/build/planning/flows.d.ts.map +1 -0
- package/build/planning/flows.js +174 -0
- package/build/planning/flows.js.map +1 -0
- package/build/planning/helpers.d.ts +11 -37
- package/build/planning/helpers.d.ts.map +1 -1
- package/build/planning/helpers.js +24 -103
- package/build/planning/helpers.js.map +1 -1
- package/build/planning/index.d.ts +5 -0
- package/build/planning/index.d.ts.map +1 -1
- package/build/planning/index.js +2 -0
- package/build/planning/index.js.map +1 -1
- package/build/planning/landing/types.d.ts +16 -0
- package/build/planning/landing/types.d.ts.map +1 -0
- package/build/planning/landing/types.js +2 -0
- package/build/planning/landing/types.js.map +1 -0
- package/build/planning/landing.d.ts +5 -10
- package/build/planning/landing.d.ts.map +1 -1
- package/build/planning/landing.js +20 -22
- package/build/planning/landing.js.map +1 -1
- package/build/planning/schemas.d.ts +1 -5
- package/build/planning/schemas.d.ts.map +1 -1
- package/build/planning/schemas.js +3 -3
- package/build/planning/schemas.js.map +1 -1
- package/build/planning/spec/types.d.ts +22 -0
- package/build/planning/spec/types.d.ts.map +1 -0
- package/build/planning/spec/types.js +2 -0
- package/build/planning/spec/types.js.map +1 -0
- package/build/planning/spec.d.ts +4 -0
- package/build/planning/spec.d.ts.map +1 -0
- package/build/planning/spec.js +30 -0
- package/build/planning/spec.js.map +1 -0
- package/build/planning/types.d.ts +4 -3
- package/build/planning/types.d.ts.map +1 -1
- package/build/scaffold/consts.d.ts +40 -1
- package/build/scaffold/consts.d.ts.map +1 -1
- package/build/scaffold/consts.js +52 -0
- package/build/scaffold/consts.js.map +1 -1
- package/build/scaffold/helpers.d.ts +4 -16
- package/build/scaffold/helpers.d.ts.map +1 -1
- package/build/scaffold/helpers.js +9 -64
- package/build/scaffold/helpers.js.map +1 -1
- package/build/scaffold/index.d.ts +4 -0
- package/build/scaffold/index.d.ts.map +1 -1
- package/build/scaffold/index.js +2 -0
- package/build/scaffold/index.js.map +1 -1
- package/build/scaffold/landing/types.d.ts +48 -0
- package/build/scaffold/landing/types.d.ts.map +1 -0
- package/build/scaffold/landing/types.js +2 -0
- package/build/scaffold/landing/types.js.map +1 -0
- package/build/scaffold/landing.d.ts +4 -0
- package/build/scaffold/landing.d.ts.map +1 -0
- package/build/scaffold/landing.js +95 -0
- package/build/scaffold/landing.js.map +1 -0
- package/build/scaffold/schemas.d.ts +3 -2
- package/build/scaffold/schemas.d.ts.map +1 -1
- package/build/scaffold/schemas.js +177 -7
- package/build/scaffold/schemas.js.map +1 -1
- package/build/scaffold/share/types.d.ts +35 -0
- package/build/scaffold/share/types.d.ts.map +1 -0
- package/build/scaffold/share/types.js +2 -0
- package/build/scaffold/share/types.js.map +1 -0
- package/build/scaffold/share.d.ts +4 -0
- package/build/scaffold/share.d.ts.map +1 -0
- package/build/scaffold/share.js +42 -0
- package/build/scaffold/share.js.map +1 -0
- package/build/scaffold/types.d.ts +112 -2
- package/build/scaffold/types.d.ts.map +1 -1
- package/build/skills/consts.d.ts +42 -0
- package/build/skills/consts.d.ts.map +1 -1
- package/build/skills/consts.js +43 -0
- package/build/skills/consts.js.map +1 -1
- package/build/skills/index.d.ts +0 -1
- package/build/skills/index.d.ts.map +1 -1
- package/build/skills/index.js +0 -1
- package/build/skills/index.js.map +1 -1
- package/build/slot/command/types.d.ts +21 -0
- package/build/slot/command/types.d.ts.map +1 -0
- package/build/slot/command/types.js +2 -0
- package/build/slot/command/types.js.map +1 -0
- package/build/slot/command.d.ts +4 -0
- package/build/slot/command.d.ts.map +1 -0
- package/build/slot/command.js +31 -0
- package/build/slot/command.js.map +1 -0
- package/build/slot/helpers.d.ts +2 -16
- package/build/slot/helpers.d.ts.map +1 -1
- package/build/slot/helpers.js +5 -26
- package/build/slot/helpers.js.map +1 -1
- package/build/slot/index.d.ts +5 -0
- package/build/slot/index.d.ts.map +1 -1
- package/build/slot/index.js +2 -0
- package/build/slot/index.js.map +1 -1
- package/build/slot/layout/types.d.ts +17 -0
- package/build/slot/layout/types.d.ts.map +1 -0
- package/build/slot/layout/types.js +2 -0
- package/build/slot/layout/types.js.map +1 -0
- package/build/slot/layout.d.ts +4 -9
- package/build/slot/layout.d.ts.map +1 -1
- package/build/slot/layout.js +13 -15
- package/build/slot/layout.js.map +1 -1
- package/build/slot/origin/types.d.ts +23 -0
- package/build/slot/origin/types.d.ts.map +1 -0
- package/build/slot/origin/types.js +2 -0
- package/build/slot/origin/types.js.map +1 -0
- package/build/slot/origin.d.ts +4 -0
- package/build/slot/origin.d.ts.map +1 -0
- package/build/slot/origin.js +15 -0
- package/build/slot/origin.js.map +1 -0
- package/build/slot/types.d.ts.map +1 -1
- package/build/slot/utils.d.ts +3 -15
- package/build/slot/utils.d.ts.map +1 -1
- package/build/slot/utils.js +5 -40
- package/build/slot/utils.js.map +1 -1
- package/build/topology/card/types.d.ts +21 -0
- package/build/topology/card/types.d.ts.map +1 -0
- package/build/topology/card/types.js +2 -0
- package/build/topology/card/types.js.map +1 -0
- package/build/topology/card.d.ts +6 -13
- package/build/topology/card.d.ts.map +1 -1
- package/build/topology/card.js +83 -86
- package/build/topology/card.js.map +1 -1
- package/build/topology/helpers.d.ts +7 -33
- package/build/topology/helpers.d.ts.map +1 -1
- package/build/topology/helpers.js +15 -111
- package/build/topology/helpers.js.map +1 -1
- package/build/topology/index.d.ts +3 -0
- package/build/topology/index.d.ts.map +1 -1
- package/build/topology/index.js +1 -0
- package/build/topology/index.js.map +1 -1
- package/build/topology/resolve/types.d.ts +47 -0
- package/build/topology/resolve/types.d.ts.map +1 -0
- package/build/topology/resolve/types.js +2 -0
- package/build/topology/resolve/types.js.map +1 -0
- package/build/topology/resolve.d.ts +4 -0
- package/build/topology/resolve.d.ts.map +1 -0
- package/build/topology/resolve.js +89 -0
- package/build/topology/resolve.js.map +1 -0
- package/package.json +18 -11
- package/src/agent/index.ts +1 -0
- package/src/agent/presentation/types.ts +21 -0
- package/src/agent/presentation.ts +199 -165
- package/src/agent/types.local.ts +3 -1
- package/src/areas/index.ts +1 -0
- package/src/areas/tenancy/types.ts +23 -0
- package/src/areas/tenancy.ts +26 -25
- package/src/ba/connecting/types.ts +45 -0
- package/src/ba/connecting.ts +64 -0
- package/src/ba/helpers.ts +8 -92
- package/src/ba/index.ts +2 -0
- package/src/blueprint/types.ts +2 -2
- package/src/connect/branding/types.ts +29 -0
- package/src/connect/consts.ts +3 -0
- package/src/connect/conversion/types.ts +96 -0
- package/src/connect/entrypoints/types.ts +25 -0
- package/src/connect/entrypoints.ts +13 -2
- package/src/connect/errors/types.ts +22 -0
- package/src/connect/errors.ts +1 -1
- package/src/connect/index.ts +13 -3
- package/src/connect/kit/types.ts +56 -0
- package/src/connect/model-tier/types.ts +16 -0
- package/src/connect/model-tier.ts +22 -0
- package/src/connect/{ops.ts → ops/types.ts} +13 -3
- package/src/connect/pipeline/types.ts +41 -0
- package/src/connect/project/types.ts +127 -0
- package/src/connect/references/types.local.ts +5 -0
- package/src/connect/references/types.ts +73 -0
- package/src/connect/references.ts +13 -2
- package/src/connect/schemas.ts +9 -13
- package/src/connect/session/types.ts +81 -0
- package/src/connect/settings/types.ts +52 -0
- package/src/convert/analysis/types.ts +89 -0
- package/src/convert/{consts.local.ts → census/consts.local.ts} +1 -1
- package/src/convert/census/types.ts +181 -0
- package/src/convert/census.ts +95 -0
- package/src/convert/consts.ts +5 -0
- package/src/convert/detection/types.ts +74 -0
- package/src/convert/docs/types.ts +151 -0
- package/src/convert/docs.ts +15 -0
- package/src/convert/estimate/types.ts +75 -0
- package/src/convert/estimate.ts +19 -0
- package/src/convert/helpers.ts +29 -210
- package/src/convert/index.ts +14 -0
- package/src/convert/origin/types.ts +43 -0
- package/src/convert/origin.ts +33 -0
- package/src/convert/record/types.ts +105 -0
- package/src/convert/schemas.ts +13 -12
- package/src/convert/stage/types.ts +27 -0
- package/src/convert/stage.ts +31 -0
- package/src/convert/taxonomy/types.ts +74 -0
- package/src/convert/types.ts +5 -709
- package/src/convert/utils.ts +5 -6
- package/src/design/helpers.ts +20 -245
- package/src/design/index.ts +3 -0
- package/src/design/runtime/types.ts +14 -0
- package/src/design/runtime.ts +22 -7
- package/src/design/story/types.ts +67 -0
- package/src/design/story.ts +221 -0
- package/src/dev/types.local.ts +1 -1
- package/src/index.ts +1 -0
- package/src/integrity/index.ts +4 -0
- package/src/integrity/layout/consts.local.ts +188 -0
- package/src/integrity/layout/consts.ts +79 -0
- package/src/integrity/layout/types.ts +35 -0
- package/src/integrity/layout.ts +39 -0
- package/src/integrity/types.ts +3 -1
- package/src/integrity/utils.ts +14 -313
- package/src/integrity/verify/types.ts +26 -0
- package/src/integrity/verify.ts +177 -181
- package/src/intent/consts.ts +67 -0
- package/src/intent/entrypoints.ts +2 -2
- package/src/intent/index.ts +0 -1
- package/src/intent/types.ts +9 -2
- package/src/legal/consts.ts +17 -0
- package/src/legal/index.ts +2 -0
- package/src/legal/types.ts +11 -0
- package/src/moderation/index.ts +2 -0
- package/src/moderation/utils.ts +7 -30
- package/src/moderation/verdict/types.ts +22 -0
- package/src/moderation/verdict.ts +28 -0
- package/src/planning/card/types.ts +44 -0
- package/src/planning/card.ts +77 -0
- package/src/planning/helpers.ts +28 -116
- package/src/planning/index.ts +5 -0
- package/src/planning/landing/types.ts +15 -0
- package/src/planning/landing.ts +27 -24
- package/src/planning/schemas.ts +3 -3
- package/src/planning/spec/types.ts +22 -0
- package/src/planning/spec.ts +41 -0
- package/src/planning/types.ts +4 -4
- package/src/scaffold/consts.ts +65 -1
- package/src/scaffold/helpers.ts +14 -77
- package/src/scaffold/index.ts +4 -0
- package/src/scaffold/landing/types.ts +48 -0
- package/src/scaffold/landing.ts +120 -0
- package/src/scaffold/schemas.ts +183 -7
- package/src/scaffold/share/types.ts +35 -0
- package/src/scaffold/share.ts +60 -0
- package/src/scaffold/types.ts +120 -1
- package/src/skills/consts.ts +46 -0
- package/src/skills/index.ts +0 -1
- package/src/slot/command/types.ts +21 -0
- package/src/slot/command.ts +38 -0
- package/src/slot/helpers.ts +5 -25
- package/src/slot/index.ts +5 -0
- package/src/slot/layout/types.ts +17 -0
- package/src/slot/layout.ts +19 -16
- package/src/slot/origin/types.ts +23 -0
- package/src/slot/origin.ts +20 -0
- package/src/slot/types.ts +1 -0
- package/src/slot/utils.ts +8 -43
- package/src/topology/card/types.ts +21 -0
- package/src/topology/card.ts +84 -82
- package/src/topology/helpers.ts +20 -125
- package/src/topology/index.ts +3 -0
- package/src/topology/resolve/types.ts +47 -0
- package/src/topology/resolve.ts +118 -0
- package/tests/blueprint.spec.ts +1 -2
- package/tests/connect-errors.spec.ts +1 -1
- package/tests/convert.spec.ts +50 -50
- package/tests/design.spec.ts +13 -16
- package/tests/planning.spec.ts +57 -59
- package/tests/presentation.spec.ts +20 -20
- package/tests/scaffold.spec.ts +286 -6
- package/tests/tenancy.spec.ts +21 -21
- package/build/connect/types.local.d.ts +0 -4
- package/build/connect/types.local.d.ts.map +0 -1
- package/build/connect/types.local.js.map +0 -1
- package/build/connect/utils.d.ts +0 -12
- package/build/connect/utils.d.ts.map +0 -1
- package/build/connect/utils.js +0 -25
- package/build/connect/utils.js.map +0 -1
- package/build/convert/consts.local.d.ts.map +0 -1
- package/build/convert/consts.local.js.map +0 -1
- package/build/intent/consts.local.d.ts +0 -4
- package/build/intent/consts.local.d.ts.map +0 -1
- package/build/intent/consts.local.js +0 -3
- package/build/intent/consts.local.js.map +0 -1
- package/src/connect/types.local.ts +0 -5
- package/src/connect/types.ts +0 -589
- package/src/connect/utils.ts +0 -23
- package/src/intent/consts.local.ts +0 -3
- package/src/intent/flow.ts +0 -66
- package/src/skills/roles.ts +0 -46
- /package/build/connect/{types.local.js → references/types.local.js} +0 -0
package/src/scaffold/helpers.ts
CHANGED
|
@@ -1,81 +1,18 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { scaffoldShareHelper } from './share.js'
|
|
2
|
+
import type { ScaffoldPlan, ShareKind } from './types.js'
|
|
2
3
|
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* The plan carries `sharesWidgetWith` / `sharesScreenWith` as untrusted hints — a model may drop
|
|
7
|
-
* them, invent a code, point forwards, or build a cycle. These resolve all of that away, and
|
|
8
|
-
* every one is TOTAL: a code the plan does not hold answers itself, which is the unshared
|
|
9
|
-
* behaviour and therefore exactly today's drawn tree.
|
|
10
|
-
*
|
|
11
|
-
* Pure and IO-free. `fillScaffoldPlan` normalises a plan through them before anything is stamped,
|
|
12
|
-
* so the stampers and the scaffold loop can read a plan that is already sane.
|
|
13
|
-
*/
|
|
4
|
+
/** @deprecated compat:factory-refactor — use `scaffoldShareHelper.shareOwner(…)` */
|
|
5
|
+
export const shareOwner = (plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'): string =>
|
|
6
|
+
scaffoldShareHelper.shareOwner(plan, code, kind)
|
|
14
7
|
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
/** @deprecated compat:factory-refactor — use `scaffoldShareHelper.shareGroups(…)` */
|
|
9
|
+
export const shareGroups = (plan: Pick<ScaffoldPlan, 'stories'>, kind: ShareKind = 'widget'): Map<string, string[]> =>
|
|
10
|
+
scaffoldShareHelper.shareGroups(plan, kind)
|
|
17
11
|
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
* Backward-only and bounded: an arrow is followed only to a story EARLIER in plan order, which
|
|
22
|
-
* makes a cycle unrepresentable rather than merely unlikely, and makes the owner the earliest
|
|
23
|
-
* member of its group. That is what keeps `widgetDefinition(owner)` stable — the name is a
|
|
24
|
-
* function of one code, never of the group, so adding a member renames nothing.
|
|
25
|
-
*/
|
|
26
|
-
export const shareOwner = (
|
|
27
|
-
plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'
|
|
28
|
-
): string => {
|
|
29
|
-
const order = new Map(plan.stories.map((story, index) => [story.code, index]))
|
|
30
|
-
const byCode = new Map(plan.stories.map(story => [story.code, story]))
|
|
12
|
+
/** @deprecated compat:factory-refactor — use `scaffoldShareHelper.shareMembers(…)` */
|
|
13
|
+
export const shareMembers = (plan: Pick<ScaffoldPlan, 'stories'>, owner: string, kind: ShareKind = 'widget'): string[] =>
|
|
14
|
+
scaffoldShareHelper.shareMembers(plan, owner, kind)
|
|
31
15
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const story = byCode.get(current)
|
|
36
|
-
const target = story != null ? pointerOf(story, kind) : undefined
|
|
37
|
-
if (story == null || target == null || target === '' || target === current) {
|
|
38
|
-
return current
|
|
39
|
-
}
|
|
40
|
-
const here = order.get(current)
|
|
41
|
-
const there = order.get(target)
|
|
42
|
-
// Unknown, forward or self-referential — none of them is a group, so the story owns its own.
|
|
43
|
-
if (here == null || there == null || there >= here) {
|
|
44
|
-
return current
|
|
45
|
-
}
|
|
46
|
-
current = target
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return current
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Owner code → every member, owner first, in plan order.
|
|
54
|
-
*
|
|
55
|
-
* The shape the stampers need: one artifact per entry, and the full member list for the notice
|
|
56
|
-
* that names them.
|
|
57
|
-
*/
|
|
58
|
-
export const shareGroups = (
|
|
59
|
-
plan: Pick<ScaffoldPlan, 'stories'>, kind: ShareKind = 'widget'
|
|
60
|
-
): Map<string, string[]> => {
|
|
61
|
-
const groups = new Map<string, string[]>()
|
|
62
|
-
for (const story of plan.stories) {
|
|
63
|
-
const owner = shareOwner(plan, story.code, kind)
|
|
64
|
-
const members = groups.get(owner) ?? []
|
|
65
|
-
if (!members.includes(owner)) members.push(owner)
|
|
66
|
-
if (!members.includes(story.code)) members.push(story.code)
|
|
67
|
-
groups.set(owner, members)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return groups
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** Every story that renders this owner's artifact, owner first. Total: an owner alone answers `[code]`. */
|
|
74
|
-
export const shareMembers = (
|
|
75
|
-
plan: Pick<ScaffoldPlan, 'stories'>, owner: string, kind: ShareKind = 'widget'
|
|
76
|
-
): string[] => shareGroups(plan, kind).get(owner) ?? [owner]
|
|
77
|
-
|
|
78
|
-
/** Whether this story draws the artifact, as opposed to rendering somebody else's. */
|
|
79
|
-
export const ownsShare = (
|
|
80
|
-
plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'
|
|
81
|
-
): boolean => shareOwner(plan, code, kind) === code
|
|
16
|
+
/** @deprecated compat:factory-refactor — use `scaffoldShareHelper.ownsShare(…)` */
|
|
17
|
+
export const ownsShare = (plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'): boolean =>
|
|
18
|
+
scaffoldShareHelper.ownsShare(plan, code, kind)
|
package/src/scaffold/index.ts
CHANGED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { GuestHomePlan, LandingBand, LandingMenuEntry, LandingSlot } from '../types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ONE reading of what a landing page draws, so the stamper, the menu and the link planner agree.
|
|
5
|
+
*
|
|
6
|
+
* Pure, IO-free and total over a stored plan of any age: every optional band may be absent or
|
|
7
|
+
* `null`, and blank model text counts as absent.
|
|
8
|
+
*/
|
|
9
|
+
export interface LandingPlanHelper {
|
|
10
|
+
/**
|
|
11
|
+
* The bands a landing page draws, in the house order `LANDING_BAND_ORDER`.
|
|
12
|
+
*
|
|
13
|
+
* One presence rule per band:
|
|
14
|
+
*
|
|
15
|
+
* - `hero`, `features`, `problem` (problem and solution) — always;
|
|
16
|
+
* - `steps` — at least one step with a title;
|
|
17
|
+
* - `use-cases` — at least `LANDING_USE_CASES.min` titled cases;
|
|
18
|
+
* - `differentiator` — at least `LANDING_CONTRAST.min` contrast rows filled on both sides,
|
|
19
|
+
* OR a title and a text: the band is a heading and a paragraph, and the table under them is
|
|
20
|
+
* drawn only when it has enough rows;
|
|
21
|
+
* - `approach` — at least `LANDING_PRINCIPLES.min` titled principles;
|
|
22
|
+
* - `testimonials` — at least two quotes;
|
|
23
|
+
* - `about` — a title and a text;
|
|
24
|
+
* - `closing` — whenever the plan carries one.
|
|
25
|
+
*/
|
|
26
|
+
landingBandsOf: (home: GuestHomePlan) => LandingBand[]
|
|
27
|
+
/**
|
|
28
|
+
* The guest header menu a page draws.
|
|
29
|
+
*
|
|
30
|
+
* Keeps only entries whose band the page draws (and whose anchor exists), the first of each
|
|
31
|
+
* anchor, in page order; caps the list at `max` (never below `LANDING_MENU.min`); then pads
|
|
32
|
+
* to `LANDING_MENU.min` with `how`, `features` and the first other band the page draws. A
|
|
33
|
+
* label falls back to the page's own section label, then to `LANDING_ANCHOR_LABELS`.
|
|
34
|
+
*/
|
|
35
|
+
landingMenuOf: (home: GuestHomePlan, max?: number) => LandingMenuEntry[]
|
|
36
|
+
/**
|
|
37
|
+
* The buttons and links of a landing page that exist — the places a home link can attach to,
|
|
38
|
+
* in page order.
|
|
39
|
+
*
|
|
40
|
+
* - `hero.cta` and `closing.primary` (with a closing) — only without a usable gate, which takes
|
|
41
|
+
* their place (`LANDING_GATE_SLOTS`);
|
|
42
|
+
* - `hero.secondary` — only without a usable gate, and only when the plan labels it;
|
|
43
|
+
* - `hero.browse`, `closing.secondary` — when the plan labels them;
|
|
44
|
+
* - `closing.link.N` — one per titled closing card, at most two;
|
|
45
|
+
* - `useCase.N` — one per drawn case, when the use-cases band is drawn.
|
|
46
|
+
*/
|
|
47
|
+
homeSlotsOf: (home: GuestHomePlan) => LandingSlot[]
|
|
48
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LANDING_ANCHOR_BAND, LANDING_ANCHOR_LABELS, LANDING_ANCHORS, LANDING_BAND_ORDER, LANDING_CONTRAST,
|
|
3
|
+
LANDING_MENU, LANDING_PRINCIPLES, LANDING_USE_CASES,
|
|
4
|
+
} from './consts.js'
|
|
5
|
+
import type { GuestHomePlan, LandingAnchor, LandingBand, LandingMenuEntry, LandingSlot } from './types.js'
|
|
6
|
+
import type { LandingPlanHelper } from './landing/types.js'
|
|
7
|
+
|
|
8
|
+
const filled = (value: string | null | undefined): boolean => (value?.trim() ?? '') !== ''
|
|
9
|
+
|
|
10
|
+
export const createLandingPlanHelper = (): LandingPlanHelper => {
|
|
11
|
+
/** The use cases a page draws: titled ones, at most {@link LANDING_USE_CASES}.max. */
|
|
12
|
+
const drawnUseCases = (home: GuestHomePlan) =>
|
|
13
|
+
(home.useCases?.cases ?? []).filter(entry => filled(entry.title)).slice(0, LANDING_USE_CASES.max)
|
|
14
|
+
|
|
15
|
+
/** The closing link cards a page draws: titled ones, at most two. */
|
|
16
|
+
const drawnClosingLinks = (home: GuestHomePlan) =>
|
|
17
|
+
(home.closing?.links ?? []).filter(entry => filled(entry.title)).slice(0, 2)
|
|
18
|
+
|
|
19
|
+
/** Whether the gate is drawn: a gate is a form, and one without fields is no gate at all. */
|
|
20
|
+
const usableGate = (home: GuestHomePlan): boolean =>
|
|
21
|
+
home.gate != null && (home.gate.fields ?? []).length > 0
|
|
22
|
+
|
|
23
|
+
/** One presence rule per band — see {@link LandingPlanHelper.landingBandsOf}. */
|
|
24
|
+
const bandPresent: Record<LandingBand, (home: GuestHomePlan) => boolean> = {
|
|
25
|
+
hero: () => true,
|
|
26
|
+
steps: home => (home.steps ?? []).some(step => filled(step.title)),
|
|
27
|
+
features: () => true,
|
|
28
|
+
'use-cases': home => drawnUseCases(home).length >= LANDING_USE_CASES.min,
|
|
29
|
+
problem: () => true,
|
|
30
|
+
differentiator: home => {
|
|
31
|
+
const band = home.differentiator
|
|
32
|
+
if (band == null) return false
|
|
33
|
+
const rows = (band.contrast ?? []).filter(row => filled(row.usual) && filled(row.ours))
|
|
34
|
+
|
|
35
|
+
return rows.length >= LANDING_CONTRAST.min || (filled(band.title) && filled(band.text))
|
|
36
|
+
},
|
|
37
|
+
approach: home =>
|
|
38
|
+
(home.approach?.principles ?? []).filter(entry => filled(entry.title)).length >= LANDING_PRINCIPLES.min,
|
|
39
|
+
testimonials: home => (home.testimonials ?? []).filter(entry => filled(entry.quote)).length >= 2,
|
|
40
|
+
about: home => home.about != null && filled(home.about.title) && filled(home.about.text),
|
|
41
|
+
closing: home => home.closing != null,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const landingBandsOf: LandingPlanHelper['landingBandsOf'] = home =>
|
|
45
|
+
LANDING_BAND_ORDER.filter(band => bandPresent[band](home))
|
|
46
|
+
|
|
47
|
+
/** The page's own section label for an anchor's band, when the plan wrote one. */
|
|
48
|
+
const sectionLabel = (home: GuestHomePlan, anchor: LandingAnchor): string | null | undefined => {
|
|
49
|
+
const labels = home.labels ?? {}
|
|
50
|
+
switch (anchor) {
|
|
51
|
+
case 'how': return labels.steps
|
|
52
|
+
case 'features': return labels.features
|
|
53
|
+
case 'use-cases': return labels.useCases
|
|
54
|
+
case 'why': return labels.differentiator
|
|
55
|
+
case 'approach': return labels.approach
|
|
56
|
+
case 'community': return labels.testimonials
|
|
57
|
+
case 'about': return labels.about
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const landingMenuOf: LandingPlanHelper['landingMenuOf'] = (home, max = LANDING_MENU.max) => {
|
|
62
|
+
const bands = landingBandsOf(home)
|
|
63
|
+
const drawn = (anchor: LandingAnchor) =>
|
|
64
|
+
LANDING_ANCHORS.includes(anchor) && bands.includes(LANDING_ANCHOR_BAND[anchor])
|
|
65
|
+
const order = (anchor: LandingAnchor) => LANDING_ANCHORS.indexOf(anchor)
|
|
66
|
+
const label = (anchor: LandingAnchor, own?: string | null): string => {
|
|
67
|
+
const candidates = [own, sectionLabel(home, anchor)]
|
|
68
|
+
const chosen = candidates.find(filled)
|
|
69
|
+
|
|
70
|
+
return chosen?.trim() ?? LANDING_ANCHOR_LABELS[anchor]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const chosen: LandingMenuEntry[] = []
|
|
74
|
+
for (const entry of home.menu ?? []) {
|
|
75
|
+
if (entry == null || !drawn(entry.anchor) || chosen.some(kept => kept.anchor === entry.anchor)) {
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
chosen.push({ anchor: entry.anchor, label: label(entry.anchor, entry.label) })
|
|
79
|
+
}
|
|
80
|
+
chosen.sort((a, b) => order(a.anchor) - order(b.anchor))
|
|
81
|
+
chosen.splice(Math.max(LANDING_MENU.min, max))
|
|
82
|
+
|
|
83
|
+
const padding: LandingAnchor[] = ['how', 'features', ...LANDING_ANCHORS.filter(
|
|
84
|
+
anchor => anchor !== 'how' && anchor !== 'features'
|
|
85
|
+
)]
|
|
86
|
+
for (const anchor of padding) {
|
|
87
|
+
if (chosen.length >= LANDING_MENU.min) break
|
|
88
|
+
if (drawn(anchor) && !chosen.some(kept => kept.anchor === anchor)) {
|
|
89
|
+
chosen.push({ anchor, label: label(anchor) })
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return chosen.sort((a, b) => order(a.anchor) - order(b.anchor))
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const homeSlotsOf: LandingPlanHelper['homeSlotsOf'] = home => {
|
|
97
|
+
const gate = usableGate(home)
|
|
98
|
+
const slots: LandingSlot[] = []
|
|
99
|
+
|
|
100
|
+
if (!gate) slots.push('hero.cta')
|
|
101
|
+
if (!gate && filled(home.hero.secondary?.label)) slots.push('hero.secondary')
|
|
102
|
+
if (filled(home.hero.browse?.label)) slots.push('hero.browse')
|
|
103
|
+
|
|
104
|
+
if (bandPresent['use-cases'](home)) {
|
|
105
|
+
drawnUseCases(home).forEach((_, index) => slots.push(`useCase.${index + 1}` as LandingSlot))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (home.closing != null) {
|
|
109
|
+
if (!gate) slots.push('closing.primary')
|
|
110
|
+
if (filled(home.closing.secondary?.label)) slots.push('closing.secondary')
|
|
111
|
+
drawnClosingLinks(home).forEach((_, index) => slots.push(`closing.link.${index + 1}` as LandingSlot))
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return slots
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return { landingBandsOf, landingMenuOf, homeSlotsOf }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export const landingPlanHelper = createLandingPlanHelper()
|
package/src/scaffold/schemas.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { JSONSchemaType } from 'ajv'
|
|
2
2
|
|
|
3
3
|
import { ProjectArea } from '../areas/consts.js'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
BENTO_FRAGMENT_KINDS, LANDING_ANCHORS, LANDING_GATE_FIELD_KINDS, LANDING_SLOTS, WidgetKind,
|
|
6
|
+
} from './consts.js'
|
|
5
7
|
import type {
|
|
6
8
|
BentoFragment, GuestHomePlan, LandingGateAnswer, LandingGateField, LandingGatePlan, ProductIdentity,
|
|
7
9
|
ScaffoldAreaPlan, ScaffoldPlan, ScaffoldStoryPlan, SketchContent,
|
|
@@ -352,6 +354,27 @@ const LandingGatePlanSchema: JSONSchemaType<LandingGatePlan> = {
|
|
|
352
354
|
additionalProperties: false,
|
|
353
355
|
}
|
|
354
356
|
|
|
357
|
+
/**
|
|
358
|
+
* The `basis` every band added with the gated landing page carries — one text, so the model reads
|
|
359
|
+
* the same rule on each band and the check downstream has one contract to enforce.
|
|
360
|
+
*/
|
|
361
|
+
const BASIS_TEXT = 'A short passage (a few words up to one sentence) copied EXACTLY, word for word,'
|
|
362
|
+
+ ' from the person\'s own words, the specification or the vision, that this band is built on.'
|
|
363
|
+
+ ' It is checked; a band whose basis is not found there is removed.'
|
|
364
|
+
|
|
365
|
+
const basis = { type: 'string' as const, description: BASIS_TEXT }
|
|
366
|
+
|
|
367
|
+
/** A title + text pair inside a band — required, because the band object itself is optional. */
|
|
368
|
+
const titledText = (title: string, text: string) => ({
|
|
369
|
+
type: 'object' as const,
|
|
370
|
+
properties: {
|
|
371
|
+
title: { type: 'string' as const, description: title },
|
|
372
|
+
text: { type: 'string' as const, description: text },
|
|
373
|
+
},
|
|
374
|
+
required: ['title', 'text'] as ('title' | 'text')[],
|
|
375
|
+
additionalProperties: false as const,
|
|
376
|
+
})
|
|
377
|
+
|
|
355
378
|
const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
356
379
|
type: 'object',
|
|
357
380
|
title: 'GuestHomePlan',
|
|
@@ -425,7 +448,7 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
425
448
|
+ ' specification actually describes. Give most of them a fragment'
|
|
426
449
|
},
|
|
427
450
|
testimonials: {
|
|
428
|
-
type: 'array',
|
|
451
|
+
type: 'array', nullable: true,
|
|
429
452
|
items: {
|
|
430
453
|
type: 'object',
|
|
431
454
|
properties: {
|
|
@@ -436,7 +459,8 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
436
459
|
required: ['quote', 'name', 'role'],
|
|
437
460
|
additionalProperties: false,
|
|
438
461
|
},
|
|
439
|
-
description: '2 illustrative testimonials
|
|
462
|
+
description: 'OPTIONAL: 0 or exactly 2 illustrative testimonials; leave it out unless the'
|
|
463
|
+
+ ' product\'s end users choose it for themselves. No ratings, no numbers, no company names'
|
|
440
464
|
},
|
|
441
465
|
steps: {
|
|
442
466
|
type: 'array', nullable: true,
|
|
@@ -452,6 +476,94 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
452
476
|
description: '"How it works": 3 steps taken from the main flow, in order, the last one'
|
|
453
477
|
+ ' delivering the value'
|
|
454
478
|
},
|
|
479
|
+
useCases: {
|
|
480
|
+
type: 'object', nullable: true,
|
|
481
|
+
description: 'OPTIONAL "Use cases": who the product is for, case by case - only cases the'
|
|
482
|
+
+ ' person\'s words, the specification or the vision actually name',
|
|
483
|
+
properties: {
|
|
484
|
+
cases: {
|
|
485
|
+
type: 'array',
|
|
486
|
+
items: {
|
|
487
|
+
type: 'object',
|
|
488
|
+
properties: {
|
|
489
|
+
audience: { type: 'string', description: 'Who this case is for, 1-4 words' },
|
|
490
|
+
title: { type: 'string', description: 'What they do with the product, 2-5 words' },
|
|
491
|
+
text: { type: 'string', description: 'One sentence on what it gives them' },
|
|
492
|
+
},
|
|
493
|
+
required: ['audience', 'title', 'text'],
|
|
494
|
+
additionalProperties: false,
|
|
495
|
+
},
|
|
496
|
+
description: '2 to 4 cases',
|
|
497
|
+
},
|
|
498
|
+
basis,
|
|
499
|
+
},
|
|
500
|
+
required: ['cases', 'basis'],
|
|
501
|
+
additionalProperties: false,
|
|
502
|
+
},
|
|
503
|
+
differentiator: {
|
|
504
|
+
type: 'object', nullable: true,
|
|
505
|
+
description: 'OPTIONAL "Why us": what this product does differently from the usual way,'
|
|
506
|
+
+ ' only when the person\'s words, the specification or the vision say so',
|
|
507
|
+
properties: {
|
|
508
|
+
title: { type: 'string', description: 'The difference in 3-6 words' },
|
|
509
|
+
text: { type: 'string', description: 'One or two sentences on it. No invented numbers' },
|
|
510
|
+
contrast: {
|
|
511
|
+
type: 'array',
|
|
512
|
+
items: {
|
|
513
|
+
type: 'object',
|
|
514
|
+
properties: {
|
|
515
|
+
usual: { type: 'string', description: 'How it is usually done, at most 6 words' },
|
|
516
|
+
ours: { type: 'string', description: 'How this product does it, at most 6 words' },
|
|
517
|
+
},
|
|
518
|
+
required: ['usual', 'ours'],
|
|
519
|
+
additionalProperties: false,
|
|
520
|
+
},
|
|
521
|
+
description: '2 to 3 usual-vs-ours rows',
|
|
522
|
+
},
|
|
523
|
+
usualLabel: {
|
|
524
|
+
type: 'string', nullable: true,
|
|
525
|
+
description: 'OPTIONAL heading over the usual column, 1-2 words - e.g. "Usually"',
|
|
526
|
+
},
|
|
527
|
+
oursLabel: {
|
|
528
|
+
type: 'string', nullable: true,
|
|
529
|
+
description: 'OPTIONAL heading over this product\'s column, 1-2 words - e.g. "With us"',
|
|
530
|
+
},
|
|
531
|
+
basis,
|
|
532
|
+
},
|
|
533
|
+
required: ['title', 'text', 'contrast', 'basis'],
|
|
534
|
+
additionalProperties: false,
|
|
535
|
+
},
|
|
536
|
+
approach: {
|
|
537
|
+
type: 'object', nullable: true,
|
|
538
|
+
description: 'OPTIONAL "How we work": the principles the product is run by, only when the'
|
|
539
|
+
+ ' person\'s words, the specification or the vision state them',
|
|
540
|
+
properties: {
|
|
541
|
+
title: {
|
|
542
|
+
type: 'string', nullable: true,
|
|
543
|
+
description: 'OPTIONAL heading of the band, one short concrete sentence',
|
|
544
|
+
},
|
|
545
|
+
principles: {
|
|
546
|
+
type: 'array',
|
|
547
|
+
items: titledText('The principle, 2-4 words', 'One sentence on what it means in practice'),
|
|
548
|
+
description: '3 to 4 principles',
|
|
549
|
+
},
|
|
550
|
+
basis,
|
|
551
|
+
},
|
|
552
|
+
required: ['principles', 'basis'],
|
|
553
|
+
additionalProperties: false,
|
|
554
|
+
},
|
|
555
|
+
about: {
|
|
556
|
+
type: 'object', nullable: true,
|
|
557
|
+
description: 'OPTIONAL "About": who is behind the product, only when the person\'s words,'
|
|
558
|
+
+ ' the specification or the vision say who',
|
|
559
|
+
properties: {
|
|
560
|
+
title: { type: 'string', description: 'The heading, 2-5 words' },
|
|
561
|
+
text: { type: 'string', description: 'Two or three sentences. Nothing invented' },
|
|
562
|
+
basis,
|
|
563
|
+
},
|
|
564
|
+
required: ['title', 'text', 'basis'],
|
|
565
|
+
additionalProperties: false,
|
|
566
|
+
},
|
|
455
567
|
labels: {
|
|
456
568
|
type: 'object', nullable: true,
|
|
457
569
|
description: 'The small label over each section and that section\'s heading, in the product\'s'
|
|
@@ -472,6 +584,17 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
472
584
|
},
|
|
473
585
|
problem: { type: 'string', nullable: true, description: 'e.g. "The problem"' },
|
|
474
586
|
solution: { type: 'string', nullable: true, description: 'e.g. "The solution"' },
|
|
587
|
+
useCases: { type: 'string', nullable: true, description: 'e.g. "Use cases"' },
|
|
588
|
+
useCasesTitle: {
|
|
589
|
+
type: 'string', nullable: true, description: 'e.g. "Made for every kind of home baker."'
|
|
590
|
+
},
|
|
591
|
+
differentiator: { type: 'string', nullable: true, description: 'e.g. "Why us"' },
|
|
592
|
+
approach: { type: 'string', nullable: true, description: 'e.g. "How we work"' },
|
|
593
|
+
approachTitle: {
|
|
594
|
+
type: 'string', nullable: true,
|
|
595
|
+
description: 'e.g. "Small batches, honest notes." - used when the approach has no title'
|
|
596
|
+
},
|
|
597
|
+
about: { type: 'string', nullable: true, description: 'e.g. "About"' },
|
|
475
598
|
},
|
|
476
599
|
required: [],
|
|
477
600
|
additionalProperties: false,
|
|
@@ -511,8 +634,57 @@ const GuestHomePlanSchema: JSONSchemaType<GuestHomePlan> = {
|
|
|
511
634
|
description: 'ONLY when you were given a landing story; omit it otherwise. '
|
|
512
635
|
+ LandingGatePlanSchema.description,
|
|
513
636
|
},
|
|
637
|
+
menu: {
|
|
638
|
+
type: 'array', nullable: true,
|
|
639
|
+
items: {
|
|
640
|
+
type: 'object',
|
|
641
|
+
properties: {
|
|
642
|
+
anchor: {
|
|
643
|
+
type: 'string',
|
|
644
|
+
enum: LANDING_ANCHORS,
|
|
645
|
+
description: 'The band it jumps to: how (how it works), features, use-cases, why'
|
|
646
|
+
+ ' (the differentiator), approach (how we work), community (testimonials), about'
|
|
647
|
+
},
|
|
648
|
+
label: { type: 'string', description: 'The menu word, 1-2 words in the product\'s language' },
|
|
649
|
+
},
|
|
650
|
+
required: ['anchor', 'label'],
|
|
651
|
+
additionalProperties: false,
|
|
652
|
+
},
|
|
653
|
+
description: 'The header menu of the landing page: 2 to 4 entries, each pointing at a band'
|
|
654
|
+
+ ' this page carries, in page order'
|
|
655
|
+
},
|
|
656
|
+
links: {
|
|
657
|
+
type: 'array', nullable: true,
|
|
658
|
+
items: {
|
|
659
|
+
type: 'object',
|
|
660
|
+
properties: {
|
|
661
|
+
slot: {
|
|
662
|
+
type: 'string',
|
|
663
|
+
enum: LANDING_SLOTS,
|
|
664
|
+
description: 'The button: hero.cta, hero.secondary, hero.browse, closing.primary,'
|
|
665
|
+
+ ' closing.secondary, closing.link.1/2 (the closing cards), useCase.1-4 (the use'
|
|
666
|
+
+ ' cases in order). Without a gate only; with one, hero.cta, hero.secondary and'
|
|
667
|
+
+ ' closing.primary do not exist'
|
|
668
|
+
},
|
|
669
|
+
story: {
|
|
670
|
+
type: 'string',
|
|
671
|
+
description: 'The story code, copied EXACTLY from the story list given to you'
|
|
672
|
+
},
|
|
673
|
+
},
|
|
674
|
+
required: ['slot', 'story'],
|
|
675
|
+
additionalProperties: false,
|
|
676
|
+
},
|
|
677
|
+
description: 'Which home buttons open which user story. Leave it out when undecided; an'
|
|
678
|
+
+ ' empty list means decided: none. At most one entry per button'
|
|
679
|
+
},
|
|
680
|
+
linksDecided: {
|
|
681
|
+
type: 'array', nullable: true,
|
|
682
|
+
items: { type: 'string' },
|
|
683
|
+
description: 'Story codes whose links were decided at development time (a decision of no'
|
|
684
|
+
+ ' button included). Absent on a plan whose links the planner decided. Filled by code'
|
|
685
|
+
},
|
|
514
686
|
},
|
|
515
|
-
required: ['hero', 'problem', 'solution', 'features'
|
|
687
|
+
required: ['hero', 'problem', 'solution', 'features'],
|
|
516
688
|
additionalProperties: false,
|
|
517
689
|
}
|
|
518
690
|
|
|
@@ -567,10 +739,14 @@ export const ScaffoldPlanSchema: JSONSchemaType<ScaffoldPlan> = {
|
|
|
567
739
|
additionalProperties: false,
|
|
568
740
|
}
|
|
569
741
|
|
|
742
|
+
/** The guest home's keys a model may answer: `linksDecided` is written by code, never asked. */
|
|
743
|
+
const { linksDecided: _linksDecided, ...answeredHomeProperties } = GuestHomePlanSchema.properties!
|
|
744
|
+
|
|
570
745
|
/**
|
|
571
746
|
* The plan as the planning MODEL answers it — {@link ScaffoldPlanSchema} with the gate held to the
|
|
572
|
-
* form
|
|
573
|
-
* offering them to the model would let it write a chip
|
|
747
|
+
* form and without the code-written `linksDecided`. The stored schema keeps the pre-form gate keys
|
|
748
|
+
* optional so an old plan still validates; offering them to the model would let it write a chip
|
|
749
|
+
* picker again. Typed as the stored plan
|
|
574
750
|
* because every answer is one: the answer's gate is a subset of the stored gate.
|
|
575
751
|
*/
|
|
576
752
|
export const ScaffoldPlanAnswerSchema = {
|
|
@@ -580,7 +756,7 @@ export const ScaffoldPlanAnswerSchema = {
|
|
|
580
756
|
guestHome: {
|
|
581
757
|
...GuestHomePlanSchema,
|
|
582
758
|
properties: {
|
|
583
|
-
...
|
|
759
|
+
...answeredHomeProperties,
|
|
584
760
|
gate: {
|
|
585
761
|
...LandingGateAnswerSchema,
|
|
586
762
|
nullable: true,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ScaffoldPlan, ShareKind } from '../types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ONE reading of who owns a drawn artifact, so no consumer has to interpret the plan itself.
|
|
5
|
+
*
|
|
6
|
+
* The plan carries `sharesWidgetWith` / `sharesScreenWith` as untrusted hints — a model may drop
|
|
7
|
+
* them, invent a code, point forwards, or build a cycle. These resolve all of that away, and
|
|
8
|
+
* every one is TOTAL: a code the plan does not hold answers itself, which is the unshared
|
|
9
|
+
* behaviour and therefore exactly today's drawn tree.
|
|
10
|
+
*
|
|
11
|
+
* Pure and IO-free. `fillScaffoldPlan` normalises a plan through them before anything is stamped,
|
|
12
|
+
* so the stampers and the scaffold loop can read a plan that is already sane.
|
|
13
|
+
*/
|
|
14
|
+
export interface ScaffoldShareHelper {
|
|
15
|
+
/**
|
|
16
|
+
* The code whose artifact this story renders — itself when it owns one.
|
|
17
|
+
*
|
|
18
|
+
* Backward-only and bounded: an arrow is followed only to a story EARLIER in plan order, which
|
|
19
|
+
* makes a cycle unrepresentable rather than merely unlikely, and makes the owner the earliest
|
|
20
|
+
* member of its group. That is what keeps `widgetDefinition(owner)` stable — the name is a
|
|
21
|
+
* function of one code, never of the group, so adding a member renames nothing.
|
|
22
|
+
*/
|
|
23
|
+
shareOwner: (plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind?: ShareKind) => string
|
|
24
|
+
/**
|
|
25
|
+
* Owner code → every member, owner first, in plan order.
|
|
26
|
+
*
|
|
27
|
+
* The shape the stampers need: one artifact per entry, and the full member list for the notice
|
|
28
|
+
* that names them.
|
|
29
|
+
*/
|
|
30
|
+
shareGroups: (plan: Pick<ScaffoldPlan, 'stories'>, kind?: ShareKind) => Map<string, string[]>
|
|
31
|
+
/** Every story that renders this owner's artifact, owner first. Total: an owner alone answers `[code]`. */
|
|
32
|
+
shareMembers: (plan: Pick<ScaffoldPlan, 'stories'>, owner: string, kind?: ShareKind) => string[]
|
|
33
|
+
/** Whether this story draws the artifact, as opposed to rendering somebody else's. */
|
|
34
|
+
ownsShare: (plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind?: ShareKind) => boolean
|
|
35
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ScaffoldPlan, ScaffoldStoryPlan, ShareKind } from './types.js'
|
|
2
|
+
import type { ScaffoldShareHelper } from './share/types.js'
|
|
3
|
+
|
|
4
|
+
export const createScaffoldShareHelper = (): ScaffoldShareHelper => {
|
|
5
|
+
const pointerOf = (story: ScaffoldStoryPlan, kind: ShareKind): string | undefined =>
|
|
6
|
+
kind === 'widget' ? story.sharesWidgetWith : story.sharesScreenWith
|
|
7
|
+
|
|
8
|
+
const shareOwner = (
|
|
9
|
+
plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'
|
|
10
|
+
): string => {
|
|
11
|
+
const order = new Map(plan.stories.map((story, index) => [story.code, index]))
|
|
12
|
+
const byCode = new Map(plan.stories.map(story => [story.code, story]))
|
|
13
|
+
|
|
14
|
+
let current = code
|
|
15
|
+
// Bounded by the list length: every hop strictly decreases the plan index, so it terminates.
|
|
16
|
+
for (let hop = 0; hop <= plan.stories.length; hop++) {
|
|
17
|
+
const story = byCode.get(current)
|
|
18
|
+
const target = story != null ? pointerOf(story, kind) : undefined
|
|
19
|
+
if (story == null || target == null || target === '' || target === current) {
|
|
20
|
+
return current
|
|
21
|
+
}
|
|
22
|
+
const here = order.get(current)
|
|
23
|
+
const there = order.get(target)
|
|
24
|
+
// Unknown, forward or self-referential — none of them is a group, so the story owns its own.
|
|
25
|
+
if (here == null || there == null || there >= here) {
|
|
26
|
+
return current
|
|
27
|
+
}
|
|
28
|
+
current = target
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return current
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const shareGroups = (
|
|
35
|
+
plan: Pick<ScaffoldPlan, 'stories'>, kind: ShareKind = 'widget'
|
|
36
|
+
): Map<string, string[]> => {
|
|
37
|
+
const groups = new Map<string, string[]>()
|
|
38
|
+
for (const story of plan.stories) {
|
|
39
|
+
const owner = shareOwner(plan, story.code, kind)
|
|
40
|
+
const members = groups.get(owner) ?? []
|
|
41
|
+
if (!members.includes(owner)) members.push(owner)
|
|
42
|
+
if (!members.includes(story.code)) members.push(story.code)
|
|
43
|
+
groups.set(owner, members)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return groups
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const shareMembers = (
|
|
50
|
+
plan: Pick<ScaffoldPlan, 'stories'>, owner: string, kind: ShareKind = 'widget'
|
|
51
|
+
): string[] => shareGroups(plan, kind).get(owner) ?? [owner]
|
|
52
|
+
|
|
53
|
+
const ownsShare = (
|
|
54
|
+
plan: Pick<ScaffoldPlan, 'stories'>, code: string, kind: ShareKind = 'widget'
|
|
55
|
+
): boolean => shareOwner(plan, code, kind) === code
|
|
56
|
+
|
|
57
|
+
return { shareOwner, shareGroups, shareMembers, ownsShare }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export const scaffoldShareHelper = createScaffoldShareHelper()
|