@owlmeans/viable-common 0.0.25 → 0.0.27
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 +3 -3
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/agent-presentation/SKILL.md +1 -1
- package/agent-meta/skills/viable-common/SKILL.md +111 -8
- package/build/blueprint/case.d.ts.map +1 -1
- package/build/blueprint/case.js +58 -16
- package/build/blueprint/case.js.map +1 -1
- package/build/blueprint/resolve.d.ts.map +1 -1
- package/build/blueprint/resolve.js +3 -0
- package/build/blueprint/resolve.js.map +1 -1
- package/build/blueprint/types.d.ts +44 -2
- package/build/blueprint/types.d.ts.map +1 -1
- package/build/blueprint/types.js +35 -1
- package/build/blueprint/types.js.map +1 -1
- package/build/branding.d.ts +5 -1
- package/build/branding.d.ts.map +1 -1
- package/build/branding.js +6 -0
- package/build/branding.js.map +1 -1
- package/build/connect/consts.d.ts +21 -0
- package/build/connect/consts.d.ts.map +1 -1
- package/build/connect/consts.js +21 -0
- package/build/connect/consts.js.map +1 -1
- package/build/connect/entrypoints.d.ts +15 -1
- package/build/connect/entrypoints.d.ts.map +1 -1
- package/build/connect/entrypoints.js +16 -1
- package/build/connect/entrypoints.js.map +1 -1
- package/build/connect/references.d.ts +14 -1
- package/build/connect/references.d.ts.map +1 -1
- package/build/connect/references.js +4 -0
- package/build/connect/references.js.map +1 -1
- package/build/connect/schemas.d.ts +12 -1
- package/build/connect/schemas.d.ts.map +1 -1
- package/build/connect/schemas.js +27 -1
- package/build/connect/schemas.js.map +1 -1
- package/build/connect/types.d.ts +27 -0
- package/build/connect/types.d.ts.map +1 -1
- package/build/consts.d.ts +1 -1
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +3 -0
- package/build/consts.js.map +1 -1
- package/build/metadata/types.d.ts +8 -0
- package/build/metadata/types.d.ts.map +1 -1
- package/build/metadata/types.js.map +1 -1
- package/build/planning/helpers.d.ts +2 -1
- package/build/planning/helpers.d.ts.map +1 -1
- package/build/planning/helpers.js +5 -2
- package/build/planning/helpers.js.map +1 -1
- package/build/planning/index.d.ts +1 -0
- package/build/planning/index.d.ts.map +1 -1
- package/build/planning/index.js +1 -0
- package/build/planning/index.js.map +1 -1
- package/build/planning/landing.d.ts +25 -0
- package/build/planning/landing.d.ts.map +1 -0
- package/build/planning/landing.js +38 -0
- package/build/planning/landing.js.map +1 -0
- package/build/planning/schemas.d.ts.map +1 -1
- package/build/planning/schemas.js +13 -0
- package/build/planning/schemas.js.map +1 -1
- package/build/planning/types.d.ts +28 -3
- package/build/planning/types.d.ts.map +1 -1
- package/build/scaffold/consts.d.ts +8 -0
- package/build/scaffold/consts.d.ts.map +1 -1
- package/build/scaffold/consts.js +7 -0
- package/build/scaffold/consts.js.map +1 -1
- package/build/scaffold/schemas.d.ts.map +1 -1
- package/build/scaffold/schemas.js +257 -12
- package/build/scaffold/schemas.js.map +1 -1
- package/build/scaffold/types.d.ts +119 -4
- package/build/scaffold/types.d.ts.map +1 -1
- package/build/skills/catalogue.d.ts.map +1 -1
- package/build/skills/catalogue.js +128 -24
- package/build/skills/catalogue.js.map +1 -1
- package/build/skills/consts.d.ts +5 -0
- package/build/skills/consts.d.ts.map +1 -1
- package/build/skills/consts.js +8 -0
- package/build/skills/consts.js.map +1 -1
- package/build/skills/roles.d.ts.map +1 -1
- package/build/skills/roles.js +11 -5
- package/build/skills/roles.js.map +1 -1
- package/build/types.d.ts +30 -0
- package/build/types.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/blueprint/case.ts +64 -16
- package/src/blueprint/resolve.ts +3 -0
- package/src/blueprint/types.ts +57 -1
- package/src/branding.ts +6 -0
- package/src/connect/consts.ts +22 -0
- package/src/connect/entrypoints.ts +26 -4
- package/src/connect/references.ts +16 -3
- package/src/connect/schemas.ts +33 -4
- package/src/connect/types.ts +28 -0
- package/src/consts.ts +3 -0
- package/src/metadata/types.ts +8 -0
- package/src/planning/helpers.ts +5 -2
- package/src/planning/index.ts +1 -0
- package/src/planning/landing.ts +43 -0
- package/src/planning/schemas.ts +13 -0
- package/src/planning/types.ts +29 -3
- package/src/scaffold/consts.ts +10 -0
- package/src/scaffold/schemas.ts +262 -13
- package/src/scaffold/types.ts +105 -5
- package/src/skills/catalogue.ts +129 -24
- package/src/skills/consts.ts +8 -0
- package/src/skills/roles.ts +11 -5
- package/src/types.ts +30 -0
- package/tests/blueprint.spec.ts +98 -0
- package/tests/branding.spec.ts +21 -1
- package/tests/connect-entrypoints.spec.ts +44 -5
- package/tests/planning.spec.ts +56 -1
- package/tests/scaffold.spec.ts +131 -0
- package/tests/skills.spec.ts +65 -2
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ filesystem, no inference SDK. It is safe to import from a browser bundle.
|
|
|
21
21
|
## Installation
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
bun add @owlmeans/viable-common@^0.0.
|
|
24
|
+
bun add @owlmeans/viable-common@^0.0.27
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
## Rules worth knowing before you change something
|
|
@@ -39,7 +39,7 @@ means "inherit" has no other spelling. `tests/convert.spec.ts` walks every expor
|
|
|
39
39
|
both faults, and for draft-04 tuple `items`.
|
|
40
40
|
|
|
41
41
|
**A field that crosses a version skew carries no `enum`.** A connector is installed with
|
|
42
|
-
`npx -y @owlmeans/viable-mcp@^0.1.18-rc.
|
|
42
|
+
`npx -y @owlmeans/viable-mcp@^0.1.18-rc.23` and talks to a separately deployed platform, so an executor kind it
|
|
43
43
|
sends must remain an unused capability on an older platform rather than a refused session.
|
|
44
44
|
|
|
45
45
|
**A ceiling exists once.** The inquiry answer cap here equals `DEFAULT_INQUIRY_ANSWER_CHARS` in
|
|
@@ -59,7 +59,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
|
|
|
59
59
|
your project's skill store (`.agents/skills/`):
|
|
60
60
|
|
|
61
61
|
```sh
|
|
62
|
-
npx @owlmeans/agent-skills@^0.1.18-rc.
|
|
62
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.31
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
The embedded files are version-matched to this package release. Do not edit them
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/viable-common",
|
|
4
|
-
"version": "0.0.
|
|
5
|
-
"generatedAt": "2026-09-
|
|
4
|
+
"version": "0.0.27",
|
|
5
|
+
"generatedAt": "2026-09-22T09:20:40.384Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -6,7 +6,7 @@ description: Shared, runtime-free taxonomy for presenting OwlMeans Viable agent
|
|
|
6
6
|
|
|
7
7
|
# Agent output presentation
|
|
8
8
|
|
|
9
|
-
**Install:** `"@owlmeans/viable-common": "^0.0.
|
|
9
|
+
**Install:** `"@owlmeans/viable-common": "^0.0.27"` in `dependencies`
|
|
10
10
|
|
|
11
11
|
`@owlmeans/viable-common`'s `agent/presentation.ts` owns the browser-safe vocabulary for agent
|
|
12
12
|
output. Keep the server and every client on `classifyAgentMessage()`; consumers may refine a
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: viable-common
|
|
3
|
-
description: How to use @owlmeans/viable-common — the runtime-free contract package of the OwlMeans Viable platform. Covers planning cards and flows, project/story refusals, slot commands and layouts, target integrity, connector domain statuses, conversion vocabulary, generated-project analysis/design/metadata shapes, StoryDesignPort, schema conventions, and wire-version rules. Auto-invoked when importing a viable card type or flow, a slot command, a connector or conversion type, a target-integrity helper, or any *Schema this package exports.
|
|
3
|
+
description: How to use @owlmeans/viable-common — the runtime-free contract package of the OwlMeans Viable platform. Covers planning cards and flows (including the landing-gate fields), project/story refusals, slot commands and layouts, slot metadata keys, target integrity, connector domain statuses and routes, conversion vocabulary, blueprint layers and cases, the persona/skill catalogue and its design house style, generated-project analysis/design/scaffold/metadata shapes, StoryDesignPort, schema conventions, and wire-version rules. Auto-invoked when importing a viable card type or flow, a slot command, a connector or conversion type, a target-integrity helper, or any *Schema this package exports.
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
<!-- AUTO-GENERATED — do not edit. Regenerate via sync-agent-meta. -->
|
|
@@ -8,7 +8,7 @@ user-invocable: false
|
|
|
8
8
|
# @owlmeans/viable-common
|
|
9
9
|
|
|
10
10
|
**Layer:** Cross-cutting domain (contracts only)
|
|
11
|
-
**Install:** `"@owlmeans/viable-common": "^0.0.
|
|
11
|
+
**Install:** `"@owlmeans/viable-common": "^0.0.27"` in `dependencies`
|
|
12
12
|
**Subpaths:** `.` · `./slot` · `./connect` · `./convert` · `./integrity`
|
|
13
13
|
**Runtime-free:** no `@langchain/*`, no filesystem, no Ajv at run time (a devDependency, for the
|
|
14
14
|
tests that compile the schemas). It depends on `@owlmeans/planning`, `@owlmeans/resource`,
|
|
@@ -25,9 +25,9 @@ refusal two spellings, and one ceiling two values.
|
|
|
25
25
|
|
|
26
26
|
| Subpath | What it declares |
|
|
27
27
|
|---|---|
|
|
28
|
-
| `.` (barrel) | The planning module (`VIABLE_*_TYPE`, `VIABLE_TYPE_SCHEMAS`, `VIABLE_FLOW_SCHEMAS`, `ViableStoryStatus`/`ViableProjectStatus` and their transitions, `ViableSpecCategory`, `ViableRelationship`, `ViableChannel`, `ViableProjectCard`/`ViableStoryCard`, the card helpers, the `Project*` refusals); `SlotMetadata` and the three metadata vocabularies (`metadataConfigs`, `metadataLists`, `metadataSecrets`)
|
|
28
|
+
| `.` (barrel) | The planning module (`VIABLE_*_TYPE`, `VIABLE_TYPE_SCHEMAS`, `VIABLE_FLOW_SCHEMAS`, `ViableStoryStatus`/`ViableProjectStatus` and their transitions, `ViableSpecCategory`, `ViableRelationship`, `ViableChannel`, `ViableProjectCard`/`ViableStoryCard`, the card helpers, the landing sentence helpers, the `Project*` refusals); `SlotMetadata` and the three metadata vocabularies (`metadataConfigs`, `metadataLists`, `metadataSecrets`), `BRANDING_ENV_KEYS` / `brandingEnv`; `ProjectArea` / `AREA_PATHS` / `AREA_ACCESS` / `AREA_TIER`; `ModelRole` and the viable `ExecutionState`; `ViableSkill` / `ViablePersona` / `VIABLE_SKILLS`; the blueprint, its cases and `landingGatePreferenceOf`; the BA, dev, UX, design and scaffold shapes and their schemas, `StoryDesignPort`; `ModerationCategory` / `ModerationSubject` / `decideModeration`; the `docs/` metadata paths; `PreviewEventType` |
|
|
29
29
|
| `./slot` | `SlotCommandType` and the `SlotFileCommand` / `SlotShellCommand` / `SlotGitCommand` sets, `SubProject`, `WorkloadKind`, the target ports and process markers, `slotOrigin` / `targetRedirectUrisForOrigin` |
|
|
30
|
-
| `./connect` | `ConnectTarget`, `ConnectLlm`, `ConnectHarness`, `ConnectExecutor`, `ConnectOpKind`, `ConnectProjectStatus`, `ConnectStoryStatus`, `ConnectPipelineState`, `ConnectWaitReason`, `ModelTier` + `tierOfRole`/`clampTier`, `ModelTask*`, `InquiryPayload` + `ConnectInquiryKind`, the session and domain-status views, the `Connect*` error family, `connectProtocols(opts)` and every `*Schema` behind them |
|
|
30
|
+
| `./connect` | `ConnectTarget`, `ConnectLlm`, `ConnectHarness`, `ConnectExecutor`, `ConnectOpKind`, `ConnectProjectStatus`, `ConnectStoryStatus`, `ConnectPipelineState`, `ConnectWaitReason`, `ConnectProjectBranding` / `ConnectProjectBrandingSave`, `ModelTier` + `tierOfRole`/`clampTier`, `ModelTask*`, `InquiryPayload` + `ConnectInquiryKind`, the session and domain-status views, the `Connect*` error family, `connectProtocols(opts)` and every `*Schema` behind them |
|
|
31
31
|
| `./convert` | `ConversionStage`/`Status`/`Decision` and the `stageAfter`/`decisionFor`/`canEnter` transitions, `OriginKind`/`Shape`/`State`, `StackId` + `STACK_FAMILY`, `ArchitectureCase`, `ConvertibilityVerdict`/`Reason`, the census classifiers (`fileClassOf`, `sizeClassOf`, `entropyClassOf`, `binaryByExtension`), the `docs/conversion/` paths, `CONVERTED_ORIGIN_DIR`, `SOURCE_LIST_EXCLUSIONS`, `CENSUS_SKIP_DIRS`, `RELOCATE_ALWAYS_KEEP`, and the model-answer schemas the conversion asks with |
|
|
32
32
|
| `./integrity` | `TargetLayout` + `TARGET_LAYOUTS`, `detectTargetLayout`, `verifyTargetShape`, `TARGET_INTEGRITY_FILES`, `TARGET_PROTECTED_FILES`, `isLegacyLayout`, `targetPackageName` |
|
|
33
33
|
|
|
@@ -110,12 +110,13 @@ the wire and in target files — a parent agent's vocabulary, which never change
|
|
|
110
110
|
| project `description` | `description` |
|
|
111
111
|
| project `specification` / `vision` / `designSystem` | specification bodies, categories `specification` / `vision` / `design-system` |
|
|
112
112
|
| project `formerAliases`, `language`, `blueprint`, `blueprintCase`, `gameKind`, `target`, `origin`, `connectLlmMode`, `converterLlmMode` | `fields.*` |
|
|
113
|
+
| the landing-gate decision | project `fields.landing` — `{ story: code \| null, at }` |
|
|
113
114
|
| story narrative (`story`) | `title` |
|
|
114
115
|
| story `code` | `code` |
|
|
115
116
|
| story `status` | `status` (same strings) |
|
|
116
117
|
| story `projectId` | `parent` |
|
|
117
118
|
| story position in the flow | `order` — a double; a connective story sits between two flow steps (`3.5`) |
|
|
118
|
-
| story `area`, `primary`, `actor`, `warning`, `kind` | `fields.*` (`kind` is persisted) |
|
|
119
|
+
| story `area`, `primary`, `actor`, `warning`, `kind`, `landing` | `fields.*` (`kind` is persisted) |
|
|
119
120
|
| a story's design | specification `design` under the STORY card |
|
|
120
121
|
| the scaffold plan | specification `scaffold` under the PROJECT card |
|
|
121
122
|
|
|
@@ -124,6 +125,27 @@ still valid when it is checked, because validation runs after the planning middl
|
|
|
124
125
|
viable plugin fills the area of a narrative a person wrote. `storyFieldsOf` answers an absent area
|
|
125
126
|
as `guest` and an absent flag as `false`.
|
|
126
127
|
|
|
128
|
+
### The landing gate on the cards
|
|
129
|
+
|
|
130
|
+
The landing gate is the key end-user story a guest starts on the landing page and continues on its
|
|
131
|
+
full-scale screen after signing in. Two fields record it, and they answer different questions:
|
|
132
|
+
|
|
133
|
+
- project `fields.landing` is the DECISION, in three states: absent — never decided (a run that has
|
|
134
|
+
not reached it, a project older than the gate); `{ story: null, at }` — decided, no gate;
|
|
135
|
+
`{ story: <code>, at }` — that story. A failed decision is never written: `null` would read as a
|
|
136
|
+
decided "none" and nothing would ask again. The schema keeps `story` nullable for exactly that
|
|
137
|
+
reason, and `at` carries no `format` because the planning registry compiles without ajv-formats.
|
|
138
|
+
- story `fields.landing: true` marks the chosen card — at most one per project — and is what the
|
|
139
|
+
design and development stages key on. `storyWriteInputOf` copies it into
|
|
140
|
+
`StoryWriteInput.landing` only when set, so `StoryMeta.landing` appears only in that story's
|
|
141
|
+
`docs/stories/<code>.md`; like `primary` it is the CARD's and is never passed in
|
|
142
|
+
`StoryWriteContent`.
|
|
143
|
+
|
|
144
|
+
The chosen narrative also carries `LANDING_STORY_SENTENCE`, appended by `withLandingSentence` — a
|
|
145
|
+
note for the people reading the board, never the authority. It is idempotent (checked with
|
|
146
|
+
`hasLandingSentence`, whitespace-insensitive), joined with one space, and never pushes a title past
|
|
147
|
+
`TITLE_MAX`: a narrative with no room is returned uncut rather than truncated.
|
|
148
|
+
|
|
127
149
|
### Slots
|
|
128
150
|
|
|
129
151
|
| Card | Category | Format | Rule |
|
|
@@ -221,8 +243,17 @@ in a design, a slot or a connector schema:
|
|
|
221
243
|
- **`items` is never an array.** A draft-04 tuple is refused wherever the schema reaches a
|
|
222
244
|
provider or a collection validator.
|
|
223
245
|
|
|
246
|
+
**A schema that validates a STORED document only grows optional.** `ScaffoldPlanSchema` is both a
|
|
247
|
+
model-answer schema and the validator of the project card's `scaffold` slot, so a plan written
|
|
248
|
+
before a field existed must still pass whenever it is carried into a new revision. Every field
|
|
249
|
+
added to it — the hero's `secondary`/`browse` links, `steps`, `labels`, `closing`, a feature's bento
|
|
250
|
+
`fragment`, the landing `gate` — is optional in the type and `nullable` in the schema, and a count
|
|
251
|
+
the model should respect ("4 tiles", "5–8 chips") lives in the `description` and is clamped in
|
|
252
|
+
code, never as `minItems`/`maxItems`. The descriptions are what the planning model reads, so they
|
|
253
|
+
state each field's purpose and bounds; `gate.target` is filled by code and described as such.
|
|
254
|
+
|
|
224
255
|
**A field that crosses a version skew carries no `enum`.** Users run
|
|
225
|
-
`npx -y @owlmeans/viable-mcp@^0.1.18-rc.
|
|
256
|
+
`npx -y @owlmeans/viable-mcp@^0.1.18-rc.23` (the moving prerelease tag) against a separately deployed
|
|
226
257
|
platform, so `ConnectCapabilitiesSchema.executors.items`
|
|
227
258
|
is a bare string: a newer executor kind must stay an unused capability on an older platform, never
|
|
228
259
|
a refused session. Apply the same reasoning to anything else a newer connector may send an older
|
|
@@ -250,12 +281,78 @@ card into the names a parent agent reads (`name` = title, `alias` = code, the th
|
|
|
250
281
|
plus the card's `status` and `intrinsic` as plain strings, and `ConnectConfirmBody` carries the
|
|
251
282
|
three brief parts including `designSystem`.
|
|
252
283
|
|
|
284
|
+
A project's branding is read and saved at `/project/:id/branding` (`connect.project.branding.get`
|
|
285
|
+
GET, `.save` POST) under `base` — the guard and the ownership gate, no paid gate. The save body
|
|
286
|
+
(`ConnectProjectBrandingSaveSchema`) is a PATCH of strings with structural bounds only
|
|
287
|
+
(`CONNECT_BRANDING_*_MAX`, each equal to its twin in the platform's branding contract); what makes a
|
|
288
|
+
value acceptable — non-empty copyright and organization, a legal link that is `https://` or a
|
|
289
|
+
same-origin path, a real Google tag id — is the platform's rule, applied to the MERGED record. The
|
|
290
|
+
platform credit is never part of either record: hiding it is a paid capability with its own route.
|
|
291
|
+
|
|
253
292
|
Long work is read through the domain that owns it: `ConnectProjectStatus`, `ConnectStoryStatus`,
|
|
254
293
|
`ConversionStatusView` and `ConnectPipelineState`. Each view composes its current card/record, run,
|
|
255
294
|
pending inquiry and `waitingFor` reason; none exposes a generic technical operation identity. Add a
|
|
256
295
|
new long-running domain by extending its status view and endpoint, not by adding a parallel polling
|
|
257
296
|
vocabulary.
|
|
258
297
|
|
|
298
|
+
## Slot metadata keys: optional means omitted
|
|
299
|
+
|
|
300
|
+
`SlotMetadata` is what the platform signs and pushes into a slot, and a slot publisher validates it
|
|
301
|
+
against its own declared schema — refusing the WHOLE configuration with a 401 when the body carries
|
|
302
|
+
a key it does not know. A key added after slots exist is therefore OPTIONAL in the type and OMITTED
|
|
303
|
+
from a push while unset: `brandingGoogleTag` (in `metadataConfigs`), `cspSources` (in
|
|
304
|
+
`SlotListMetadata`). The build ENVIRONMENT is different — `brandingEnv` always emits every
|
|
305
|
+
`BRANDING_ENV_KEYS` entry, `BRANDING_GOOGLE_TAG` as `''` when unset, because the application's own
|
|
306
|
+
build reads `''` as "none".
|
|
307
|
+
|
|
308
|
+
`metadataConfigs` / `metadataLists` / `metadataSecrets` enumerate what an owner STORES — one
|
|
309
|
+
`project-config` / `project-secret` row per key, loaded on every metadata read. `cspSources` is not
|
|
310
|
+
an owner setting, so it is declared on the type and kept out of them. The Google tag's CSP hosts
|
|
311
|
+
never travel in it: the publisher derives them from `brandingGoogleTag` itself (and from the record a
|
|
312
|
+
production build writes), so the tag and the hosts it needs cannot disagree.
|
|
313
|
+
|
|
314
|
+
## Blueprint layers and the case table
|
|
315
|
+
|
|
316
|
+
A `Blueprint` has five REQUIRED build layers (`technology`, `stack`, `template`, `createApp`,
|
|
317
|
+
`packages`) and one OPTIONAL `experience` layer — what the product should do for its users,
|
|
318
|
+
changing no dependency and no coder prompt. Read it only through a helper that answers the default
|
|
319
|
+
for an absent layer: `landingGatePreferenceOf(blueprint)` answers `LandingGatePreference.Allow` for
|
|
320
|
+
no layer, no key or a value this deploy does not know. `freezeBlueprint` freezes the layer when
|
|
321
|
+
present and never adds it when absent.
|
|
322
|
+
|
|
323
|
+
The preference is a PRIOR for the model that decides the landing gate, never the decision:
|
|
324
|
+
|
|
325
|
+
| Case | `experience.landingGate` | `ViableSkill.LandingGate` added to |
|
|
326
|
+
|---|---|---|
|
|
327
|
+
| `web`, `ai-pipeline`, `ai-agent` | `encourage` | `BusinessAnalyst`, `UxDesigner`, `LayoutArchitect`, `ComponentArchitect`, `UiViewCoder`, `UiNavCoder` |
|
|
328
|
+
| `scalable` | `allow` | — |
|
|
329
|
+
| `game` | `discourage` | — |
|
|
330
|
+
|
|
331
|
+
A case's `personaSkills` are composed with `joinPersonaSkills`, which UNIONS a persona two maps
|
|
332
|
+
both name — an object spread keeps only the last list and silently drops the other case's skill.
|
|
333
|
+
`applyBlueprintCase` then unions the case's persona skills with the base blueprint's.
|
|
334
|
+
|
|
335
|
+
## The design house style in the catalogue
|
|
336
|
+
|
|
337
|
+
The `VisualDesigner` persona and the `ShadcnUi` skill teach one house style, and the template seed
|
|
338
|
+
ships the same values: a white ground (black in dark mode) on `bg-background`; colour from ONE
|
|
339
|
+
product accent, never from a background; depth only from a hairline, the neutral tile (`bg-muted`)
|
|
340
|
+
and one `shadow-floating`; a heavy grotesk display face with tight tracking; motion that belongs
|
|
341
|
+
to the illustration. The older classes (`gradient-heading`, `glass-card`, `eyebrow`, `glow-orb`,
|
|
342
|
+
the soft/raised/glow shadows, `pulse-soft`, `spin-slow`) stay DEFINED because existing targets use
|
|
343
|
+
them, are repainted flat, and are never taught as decoration. Any of it changes only when the
|
|
344
|
+
customer's specification explicitly asks — a named background colour, a dark-only or coloured
|
|
345
|
+
theme, a brand palette, gradients; the product's subject matter is not a request.
|
|
346
|
+
`tests/skills.spec.ts` pins both texts against drifting back.
|
|
347
|
+
|
|
348
|
+
`ViableSkill.LandingGate` teaches the gate-worthy story, the gate card, the synchronous handoff
|
|
349
|
+
(`useLandingStart(target)` from the seed's `@/lib/handoff`: write, then navigate when signed in or
|
|
350
|
+
start the plain sign-in; the guest home's `useLandingContinuation` sends the visitor on after
|
|
351
|
+
sign-in — never `useLogin(target)`, whose continuation lands on the guarded screen) and the
|
|
352
|
+
full-scale screen that reads and clears it. Every `ViableSkill` member has a body in `VIABLE_SKILLS` and a weight in
|
|
353
|
+
`SKILL_ORDER`: the prompt service skips an alias it cannot resolve, so a missing body is a rule no
|
|
354
|
+
model ever receives.
|
|
355
|
+
|
|
259
356
|
## Closed sets that mean something
|
|
260
357
|
|
|
261
358
|
- **`ProjectArea`** — guest `/`, user `/frontoffice`, admin `/admin`, operator `/backoffice`. A
|
|
@@ -344,8 +441,14 @@ with it.
|
|
|
344
441
|
helpers — status keys as literals, `failed` intrinsically planned, the transition table — the type
|
|
345
442
|
declarations, slots with no co-located category, code policies, reserved types outside `cardTypes`,
|
|
346
443
|
the field schemas accepting `null` and refusing an undeclared field or a value outside a closed
|
|
347
|
-
set, the card helpers, the `follows` anchor, and the
|
|
348
|
-
`
|
|
444
|
+
set, the landing fields and the landing sentence, the card helpers, the `follows` anchor, and the
|
|
445
|
+
refusals' type names surviving a marshal), `scaffold.spec.ts` (an old-shape and a new-shape plan
|
|
446
|
+
both passing the schema and the `scaffold` slot, `null` optionals accepted, no `minItems`),
|
|
447
|
+
`blueprint.spec.ts` (each case's gate preference, the default, and the persona-skill unions),
|
|
448
|
+
`branding.spec.ts` (the build env and the metadata vocabulary), `skills.spec.ts` (every skill has a
|
|
449
|
+
body and a weight, the handler wrap-once teaching, the house style and the landing-gate skill),
|
|
450
|
+
`connect-entrypoints.spec.ts` (the tree's protocol count, no story route, the job-id round trip,
|
|
451
|
+
the branding routes and their save body),
|
|
349
452
|
`convert.spec.ts` (the three structural walks over the barrel, the
|
|
350
453
|
conversion schemas compiling, a nullable enum accepting `null` under Ajv while still refusing an
|
|
351
454
|
unknown member, the census classifiers and the stage transitions), `connect-convert.spec.ts` (the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"case.d.ts","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"case.d.ts","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;;;;;;;;GAYG;AACH,oBAAY,aAAa;IACvB,mGAAmG;IACnG,GAAG,QAAQ;IACX,+EAA+E;IAC/E,QAAQ,aAAa;IACrB,gFAAgF;IAChF,UAAU,gBAAgB;IAC1B,uFAAuF;IACvF,OAAO,aAAa;IACpB,iFAAiF;IACjF,IAAI,SAAS;CACd;AAED;;;;;;;GAOG;AACH,oBAAY,QAAQ;IAClB,MAAM,WAAW;IACjB,UAAU,gBAAgB;IAC1B,UAAU,gBAAgB;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,aAAa,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,8FAA8F;IAC9F,KAAK,EAAE,cAAc,CAAA;CACtB;AAkHD;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAsH1E,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,uBAAuB,GAAG,SACqB,CAAA;AAE/F,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAE,aAAa,EAM/C,CAAA"}
|
package/build/blueprint/case.js
CHANGED
|
@@ -2,6 +2,7 @@ import { SubProject } from '../slot/consts.js';
|
|
|
2
2
|
import { ViableSkill } from '../skills/consts.js';
|
|
3
3
|
import { ViablePersona } from '../skills/roles.js';
|
|
4
4
|
import { aiLibraryList, gameLibraryList } from '../skills/catalogue.js';
|
|
5
|
+
import { LandingGatePreference } from './types.js';
|
|
5
6
|
/**
|
|
6
7
|
* WHICH KIND of product is being built on a blueprint.
|
|
7
8
|
*
|
|
@@ -45,8 +46,8 @@ export var GameKind;
|
|
|
45
46
|
/** What every AI case installs. The langchain peers are declared here, at ONE range. */
|
|
46
47
|
const AI_DEPS = {
|
|
47
48
|
[SubProject.Backend]: {
|
|
48
|
-
'@owlmeans/llm': '^0.1.18-rc.
|
|
49
|
-
'@owlmeans/agent': '^0.1.18-rc.
|
|
49
|
+
'@owlmeans/llm': '^0.1.18-rc.31',
|
|
50
|
+
'@owlmeans/agent': '^0.1.18-rc.32',
|
|
50
51
|
'@langchain/core': '^1.2.9',
|
|
51
52
|
'@langchain/anthropic': '^1.5.8',
|
|
52
53
|
'@langchain/openai': '^1.5.10',
|
|
@@ -66,12 +67,6 @@ const AI_SKILLS = [
|
|
|
66
67
|
ViableSkill.TargetLlm,
|
|
67
68
|
ViableSkill.LibrariesAi,
|
|
68
69
|
];
|
|
69
|
-
/**
|
|
70
|
-
* What the analysis stage is told about a product whose value is a model.
|
|
71
|
-
*
|
|
72
|
-
* The pairing rule is the load-bearing one: an agent holds no permissions and owns no screen, so
|
|
73
|
-
* a story that is the AGENT's work is invisible unless a human story starts it and watches it.
|
|
74
|
-
*/
|
|
75
70
|
/**
|
|
76
71
|
* What the API side is told once a project may have a queue.
|
|
77
72
|
*
|
|
@@ -85,6 +80,12 @@ const PRODUCER_PERSONA_SKILLS = {
|
|
|
85
80
|
[ViablePersona.ApiArchitect]: [ViableSkill.QueueDiscipline, ViableSkill.WorkerJobs],
|
|
86
81
|
[ViablePersona.ApiCoder]: [ViableSkill.WorkerJobs],
|
|
87
82
|
};
|
|
83
|
+
/**
|
|
84
|
+
* What the analysis stage is told about a product whose value is a model.
|
|
85
|
+
*
|
|
86
|
+
* The pairing rule is the load-bearing one: an agent holds no permissions and owns no screen, so
|
|
87
|
+
* a story that is the AGENT's work is invisible unless a human story starts it and watches it.
|
|
88
|
+
*/
|
|
88
89
|
const AI_PERSONA_SKILLS = {
|
|
89
90
|
...PRODUCER_PERSONA_SKILLS,
|
|
90
91
|
[ViablePersona.BusinessAnalyst]: [ViableSkill.AgenticChoice],
|
|
@@ -94,6 +95,40 @@ const AI_PERSONA_SKILLS = {
|
|
|
94
95
|
ViableSkill.AgenticChoice, ViableSkill.TargetLlm, ViableSkill.LibrariesAi,
|
|
95
96
|
],
|
|
96
97
|
};
|
|
98
|
+
/**
|
|
99
|
+
* Join persona-skill maps, UNIONING a persona two maps both name.
|
|
100
|
+
*
|
|
101
|
+
* An object spread would keep only the last map's list for that persona — `BusinessAnalyst`
|
|
102
|
+
* carries `AgenticChoice` in an AI case and `LandingGate` from the gate map, and a spread would
|
|
103
|
+
* silently drop whichever came first.
|
|
104
|
+
*/
|
|
105
|
+
const joinPersonaSkills = (...maps) => {
|
|
106
|
+
const out = {};
|
|
107
|
+
for (const map of maps) {
|
|
108
|
+
for (const [persona, skills] of Object.entries(map)) {
|
|
109
|
+
const key = persona;
|
|
110
|
+
out[key] = [...new Set([...(out[key] ?? []), ...(skills ?? [])])];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Who has to know the landing-gate pattern in a case that encourages one.
|
|
117
|
+
*
|
|
118
|
+
* The analyst decides whether a story is gate-worthy and plans the gate's copy; the UX designer
|
|
119
|
+
* shapes the full-scale screen that continues what the guest started; the frontend personas draw
|
|
120
|
+
* the gate, write the handoff and read it back. Nobody else touches it.
|
|
121
|
+
*/
|
|
122
|
+
const LANDING_GATE_PERSONA_SKILLS = {
|
|
123
|
+
[ViablePersona.BusinessAnalyst]: [ViableSkill.LandingGate],
|
|
124
|
+
[ViablePersona.UxDesigner]: [ViableSkill.LandingGate],
|
|
125
|
+
[ViablePersona.LayoutArchitect]: [ViableSkill.LandingGate],
|
|
126
|
+
[ViablePersona.ComponentArchitect]: [ViableSkill.LandingGate],
|
|
127
|
+
[ViablePersona.UiViewCoder]: [ViableSkill.LandingGate],
|
|
128
|
+
[ViablePersona.UiNavCoder]: [ViableSkill.LandingGate],
|
|
129
|
+
};
|
|
130
|
+
/** The experience layer of a case whose product usually has a step a guest can begin. */
|
|
131
|
+
const ENCOURAGE_GATE = { landingGate: LandingGatePreference.Encourage };
|
|
97
132
|
const GAME_PERSONA_SKILLS = {
|
|
98
133
|
[ViablePersona.BusinessAnalyst]: [ViableSkill.GameDesign],
|
|
99
134
|
[ViablePersona.UxDesigner]: [ViableSkill.GameDesign, ViableSkill.GameUi],
|
|
@@ -129,7 +164,9 @@ party, nothing walks an unbounded set, nothing is scheduled. Most products are t
|
|
|
129
164
|
patch: {
|
|
130
165
|
packages: {
|
|
131
166
|
capabilities: { postgres: true, kv: false, queue: false, worker: false, agents: false, validation: true },
|
|
167
|
+
personaSkills: LANDING_GATE_PERSONA_SKILLS,
|
|
132
168
|
},
|
|
169
|
+
experience: ENCOURAGE_GATE,
|
|
133
170
|
},
|
|
134
171
|
},
|
|
135
172
|
[BlueprintCase.Scalable]: {
|
|
@@ -150,6 +187,9 @@ to call a model at all.
|
|
|
150
187
|
capabilities: { postgres: true, kv: true, queue: true, worker: true, agents: false, validation: true },
|
|
151
188
|
personaSkills: PRODUCER_PERSONA_SKILLS,
|
|
152
189
|
},
|
|
190
|
+
// Neutral: the named off-request part is usually operator-side work, and whether a guest
|
|
191
|
+
// can begin anything is the specification's to say.
|
|
192
|
+
experience: { landingGate: LandingGatePreference.Allow },
|
|
153
193
|
},
|
|
154
194
|
},
|
|
155
195
|
[BlueprintCase.AiPipeline]: {
|
|
@@ -170,8 +210,9 @@ application, and never merely a scalable one.
|
|
|
170
210
|
deps: AI_DEPS,
|
|
171
211
|
libraries: AI_LIBRARIES,
|
|
172
212
|
skills: AI_SKILLS,
|
|
173
|
-
personaSkills: AI_PERSONA_SKILLS,
|
|
213
|
+
personaSkills: joinPersonaSkills(AI_PERSONA_SKILLS, LANDING_GATE_PERSONA_SKILLS),
|
|
174
214
|
},
|
|
215
|
+
experience: ENCOURAGE_GATE,
|
|
175
216
|
},
|
|
176
217
|
},
|
|
177
218
|
[BlueprintCase.AiAgent]: {
|
|
@@ -189,18 +230,16 @@ in advance.
|
|
|
189
230
|
deps: {
|
|
190
231
|
[SubProject.Backend]: {
|
|
191
232
|
...AI_DEPS[SubProject.Backend],
|
|
192
|
-
'@owlmeans/agent-skills': '^0.1.18-rc.
|
|
233
|
+
'@owlmeans/agent-skills': '^0.1.18-rc.31',
|
|
193
234
|
},
|
|
194
235
|
},
|
|
195
236
|
libraries: AI_LIBRARIES,
|
|
196
237
|
skills: [...AI_SKILLS, ViableSkill.TargetAgentTools],
|
|
197
|
-
personaSkills: {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
...AI_PERSONA_SKILLS[ViablePersona.WorkerCoder], ViableSkill.TargetAgentTools,
|
|
201
|
-
],
|
|
202
|
-
},
|
|
238
|
+
personaSkills: joinPersonaSkills(AI_PERSONA_SKILLS, LANDING_GATE_PERSONA_SKILLS, {
|
|
239
|
+
[ViablePersona.WorkerCoder]: [ViableSkill.TargetAgentTools],
|
|
240
|
+
}),
|
|
203
241
|
},
|
|
242
|
+
experience: ENCOURAGE_GATE,
|
|
204
243
|
},
|
|
205
244
|
},
|
|
206
245
|
[BlueprintCase.Game]: {
|
|
@@ -222,6 +261,9 @@ is not it.
|
|
|
222
261
|
skills: [ViableSkill.GameScene, ViableSkill.GameUi, ViableSkill.LibrariesGame],
|
|
223
262
|
personaSkills: { ...PRODUCER_PERSONA_SKILLS, ...GAME_PERSONA_SKILLS },
|
|
224
263
|
},
|
|
264
|
+
// A game's first value is PLAYING it, and the play screen is its own front door — a
|
|
265
|
+
// pick-and-preview card on a landing page is the wrong shape for it.
|
|
266
|
+
experience: { landingGate: LandingGatePreference.Discourage },
|
|
225
267
|
},
|
|
226
268
|
},
|
|
227
269
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"case.js","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"case.js","sourceRoot":"","sources":["../../src/blueprint/case.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAK3D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,QAAQ,CAAC,SAAS,OAAO,KAAG,CAWhE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,SAAU,SAAS,UAAU,cAAc,KAAG,SAQ7E,CAAA;AAED,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAK3D;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,QAAQ,CAAC,SAAS,OAAO,KAAG,CAWhE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,SAAU,SAAS,UAAU,cAAc,KAAG,SAQ7E,CAAA;AAED,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,SAarD,CAAA;AAEF,iFAAiF;AACjF,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,CACT,CAAA;AAMzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,SAAU,SAAS,SAAS,MAAM,KAAG,SAwBnE,CAAA;AAeD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,cACf,SAAS,WAAW,aAAa,KAC3C,WAAW,EAAuD,CAAA"}
|
|
@@ -44,6 +44,9 @@ export const freezeBlueprint = (blueprint) => Object.freeze({
|
|
|
44
44
|
...blueprint.packages,
|
|
45
45
|
capabilities: Object.freeze({ ...blueprint.packages.capabilities }),
|
|
46
46
|
}),
|
|
47
|
+
// The one optional layer: frozen when present, and never ADDED when absent, so a blueprint that
|
|
48
|
+
// has none still compares equal to what it was before the layer existed.
|
|
49
|
+
...(blueprint.experience != null ? { experience: Object.freeze({ ...blueprint.experience }) } : {}),
|
|
47
50
|
});
|
|
48
51
|
/** Every skill the blueprint asks for, stack first, deduped, order preserved. */
|
|
49
52
|
export const blueprintSkills = (blueprint) => [...new Set([...blueprint.stack.skills, ...blueprint.packages.skills])];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,MAAM,aAAa,GAAG,CAAC,KAAc,EAAoC,EAAE,CACzE,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAErE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAI,IAAO,EAAE,KAAc,EAAK,EAAE;IACnE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAU,CAAA;IAEpE,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAA;IAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,GAAG,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;IACjD,CAAC;IAED,OAAO,GAAQ,CAAA;AACjB,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAe,EAAE,KAAsB,EAAa,EAAE;IACxF,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,MAAM,GAAG,mBAAmB,CAChC,IAA0C,EAAE,KAAK,CAC1B,CAAA;IAEzB,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;AAChC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAoB,EAAa,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IAChF,GAAG,SAAS;IACZ,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;IACpD,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,GAAG,SAAS,CAAC,QAAQ;QACrB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;KACpE,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/blueprint/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,12 @@ import type { TopologyDescriptor } from '../topology/types.js';
|
|
|
15
15
|
* Deliberately NOT called a preset: `presets/` in the agent library already means the LLM
|
|
16
16
|
* model/provider configurations, and the two are asked at different moments about different
|
|
17
17
|
* things.
|
|
18
|
+
*
|
|
19
|
+
* Five layers are REQUIRED and say what the project is built WITH; the sixth, `experience`, is
|
|
20
|
+
* OPTIONAL and says what its product should do for the people using it. Optional because a
|
|
21
|
+
* blueprint registered before the layer existed — or a patch serialized into a run row — must keep
|
|
22
|
+
* resolving: every reader asks through a helper that answers the default for an absent layer
|
|
23
|
+
* ({@link landingGatePreferenceOf}).
|
|
18
24
|
*/
|
|
19
25
|
export interface Blueprint {
|
|
20
26
|
id: string;
|
|
@@ -24,22 +30,58 @@ export interface Blueprint {
|
|
|
24
30
|
template: TemplateLayer;
|
|
25
31
|
createApp: CreateAppLayer;
|
|
26
32
|
packages: PackagesLayer;
|
|
33
|
+
experience?: ExperienceLayer;
|
|
27
34
|
}
|
|
28
35
|
/**
|
|
29
36
|
* The layers, lowest first. A higher layer's value replaces the same key from a lower one.
|
|
30
37
|
*
|
|
31
38
|
* The ordering is the point: `technology` overrides everything, because a change of language
|
|
32
39
|
* invalidates every template, prompt and package below it. Nothing today has more than one
|
|
33
|
-
* technology — the ladder exists so that adding one is a data change.
|
|
40
|
+
* technology — the ladder exists so that adding one is a data change. `experience` is last and
|
|
41
|
+
* optional: it shares no key with the five build layers, so its place decides nothing today.
|
|
34
42
|
*/
|
|
35
43
|
export declare enum BlueprintLayer {
|
|
36
44
|
Technology = "technology",
|
|
37
45
|
Stack = "stack",
|
|
38
46
|
Template = "template",
|
|
39
47
|
CreateApp = "create-app",
|
|
40
|
-
Packages = "packages"
|
|
48
|
+
Packages = "packages",
|
|
49
|
+
Experience = "experience"
|
|
41
50
|
}
|
|
42
51
|
export declare const BLUEPRINT_LAYER_ORDER: BlueprintLayer[];
|
|
52
|
+
/**
|
|
53
|
+
* How strongly a product of this kind wants a LANDING GATE — the working entry into the key
|
|
54
|
+
* end-user workflow drawn on the guest home, where a guest starts before signing in.
|
|
55
|
+
*
|
|
56
|
+
* A PRIOR handed to the model that decides, never the decision itself: `Encourage` still lets it
|
|
57
|
+
* answer "no gate" for a product with no end-user step a guest could begin, and `Discourage` still
|
|
58
|
+
* lets it choose one when the specification plainly describes such a step.
|
|
59
|
+
*/
|
|
60
|
+
export declare enum LandingGatePreference {
|
|
61
|
+
/** Most products of this kind have a first-value step a guest can begin — look for it. */
|
|
62
|
+
Encourage = "encourage",
|
|
63
|
+
/** Neutral: decide from the specification alone. */
|
|
64
|
+
Allow = "allow",
|
|
65
|
+
/** Products of this kind rarely have one — choose a gate only when the specification asks. */
|
|
66
|
+
Discourage = "discourage"
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* What the product should do for the people using it, independent of the stack it is built on.
|
|
70
|
+
*
|
|
71
|
+
* A layer of its own rather than a field of `packages`, because it changes no dependency, no
|
|
72
|
+
* capability and no prompt a coder reads — it is asked by the analysis stage about the PRODUCT.
|
|
73
|
+
*/
|
|
74
|
+
export interface ExperienceLayer {
|
|
75
|
+
landingGate: LandingGatePreference;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The landing-gate preference of a resolved blueprint.
|
|
79
|
+
*
|
|
80
|
+
* Total: an absent layer, an absent key and a value this deploy does not know (a patch serialized
|
|
81
|
+
* by a newer one) all answer `Allow` — the neutral prior, which leaves the decision to the
|
|
82
|
+
* specification rather than tilting it either way on a value nobody set.
|
|
83
|
+
*/
|
|
84
|
+
export declare const landingGatePreferenceOf: (blueprint?: Pick<Blueprint, 'experience'> | null) => LandingGatePreference;
|
|
43
85
|
/** Language and toolchain. Overrides everything below it. */
|
|
44
86
|
export interface TechnologyLayer {
|
|
45
87
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAE9D
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"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"}
|
package/build/blueprint/types.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The ordering is the point: `technology` overrides everything, because a change of language
|
|
5
5
|
* invalidates every template, prompt and package below it. Nothing today has more than one
|
|
6
|
-
* technology — the ladder exists so that adding one is a data change.
|
|
6
|
+
* technology — the ladder exists so that adding one is a data change. `experience` is last and
|
|
7
|
+
* optional: it shares no key with the five build layers, so its place decides nothing today.
|
|
7
8
|
*/
|
|
8
9
|
export var BlueprintLayer;
|
|
9
10
|
(function (BlueprintLayer) {
|
|
@@ -12,6 +13,7 @@ export var BlueprintLayer;
|
|
|
12
13
|
BlueprintLayer["Template"] = "template";
|
|
13
14
|
BlueprintLayer["CreateApp"] = "create-app";
|
|
14
15
|
BlueprintLayer["Packages"] = "packages";
|
|
16
|
+
BlueprintLayer["Experience"] = "experience";
|
|
15
17
|
})(BlueprintLayer || (BlueprintLayer = {}));
|
|
16
18
|
export const BLUEPRINT_LAYER_ORDER = [
|
|
17
19
|
BlueprintLayer.Technology,
|
|
@@ -19,7 +21,39 @@ export const BLUEPRINT_LAYER_ORDER = [
|
|
|
19
21
|
BlueprintLayer.Template,
|
|
20
22
|
BlueprintLayer.CreateApp,
|
|
21
23
|
BlueprintLayer.Packages,
|
|
24
|
+
BlueprintLayer.Experience,
|
|
22
25
|
];
|
|
26
|
+
/**
|
|
27
|
+
* How strongly a product of this kind wants a LANDING GATE — the working entry into the key
|
|
28
|
+
* end-user workflow drawn on the guest home, where a guest starts before signing in.
|
|
29
|
+
*
|
|
30
|
+
* A PRIOR handed to the model that decides, never the decision itself: `Encourage` still lets it
|
|
31
|
+
* answer "no gate" for a product with no end-user step a guest could begin, and `Discourage` still
|
|
32
|
+
* lets it choose one when the specification plainly describes such a step.
|
|
33
|
+
*/
|
|
34
|
+
export var LandingGatePreference;
|
|
35
|
+
(function (LandingGatePreference) {
|
|
36
|
+
/** Most products of this kind have a first-value step a guest can begin — look for it. */
|
|
37
|
+
LandingGatePreference["Encourage"] = "encourage";
|
|
38
|
+
/** Neutral: decide from the specification alone. */
|
|
39
|
+
LandingGatePreference["Allow"] = "allow";
|
|
40
|
+
/** Products of this kind rarely have one — choose a gate only when the specification asks. */
|
|
41
|
+
LandingGatePreference["Discourage"] = "discourage";
|
|
42
|
+
})(LandingGatePreference || (LandingGatePreference = {}));
|
|
43
|
+
const LANDING_GATE_PREFERENCES = new Set(Object.values(LandingGatePreference));
|
|
44
|
+
/**
|
|
45
|
+
* The landing-gate preference of a resolved blueprint.
|
|
46
|
+
*
|
|
47
|
+
* Total: an absent layer, an absent key and a value this deploy does not know (a patch serialized
|
|
48
|
+
* by a newer one) all answer `Allow` — the neutral prior, which leaves the decision to the
|
|
49
|
+
* specification rather than tilting it either way on a value nobody set.
|
|
50
|
+
*/
|
|
51
|
+
export const landingGatePreferenceOf = (blueprint) => {
|
|
52
|
+
const value = blueprint?.experience?.landingGate;
|
|
53
|
+
return value != null && LANDING_GATE_PREFERENCES.has(value)
|
|
54
|
+
? value
|
|
55
|
+
: LandingGatePreference.Allow;
|
|
56
|
+
};
|
|
23
57
|
export var BlueprintPatchKind;
|
|
24
58
|
(function (BlueprintPatchKind) {
|
|
25
59
|
/** Deep-merge a JSON document — the manifests, the tsconfigs. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blueprint/types.ts"],"names":[],"mappings":"AAoCA;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,cAOX;AAPD,WAAY,cAAc;IACxB,2CAAyB,CAAA;IACzB,iCAAe,CAAA;IACf,uCAAqB,CAAA;IACrB,0CAAwB,CAAA;IACxB,uCAAqB,CAAA;IACrB,2CAAyB,CAAA;AAC3B,CAAC,EAPW,cAAc,KAAd,cAAc,QAOzB;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,cAAc,CAAC,UAAU;IACzB,cAAc,CAAC,KAAK;IACpB,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,SAAS;IACxB,cAAc,CAAC,QAAQ;IACvB,cAAc,CAAC,UAAU;CAC1B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC/B,0FAA0F;IAC1F,gDAAuB,CAAA;IACvB,oDAAoD;IACpD,wCAAe,CAAA;IACf,8FAA8F;IAC9F,kDAAyB,CAAA;AAC3B,CAAC,EAPW,qBAAqB,KAArB,qBAAqB,QAOhC;AAYD,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAA;AAEtF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,SAAgD,EACzB,EAAE;IACzB,MAAM,KAAK,GAAG,SAAS,EAAE,UAAU,EAAE,WAAW,CAAA;IAEhD,OAAO,KAAK,IAAI,IAAI,IAAI,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC;QACzD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAA;AACjC,CAAC,CAAA;AA6DD,MAAM,CAAN,IAAY,kBAOX;AAPD,WAAY,kBAAkB;IAC5B,iEAAiE;IACjE,8CAAwB,CAAA;IACxB,4EAA4E;IAC5E,4CAAsB,CAAA;IACtB,6DAA6D;IAC7D,yCAAmB,CAAA;AACrB,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,QAO7B"}
|