@miadi/ncp-story-studio 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/PHASES.md CHANGED
@@ -20,6 +20,28 @@
20
20
  inside Miadi, with the seed projects (Catalyst of Changes and the other four narratives)
21
21
  observable there. It is a target, not a stale reference.
22
22
 
23
+ ## Status — 2026-09-12 (second round)
24
+
25
+ A third review — a parity audit against the prototype — returned 14 gaps. What closed:
26
+
27
+ - **The six teaching stories are back.** Catalyst of Change, Echoes of the Past, Tushell and the
28
+ Orchestra of Agents, The Keeper Chronicles, The Bridge Walker, The Archive Keeper — every beat
29
+ toned. Catalyst is assembled from its source document plus the enrichment table the prototype
30
+ kept separately, so it arrives with its 90 toned beats, 23 moments and 5 overviews (the
31
+ prototype's own adapter dropped 22 of those moments).
32
+ - **The agent reads the whole story.** The digest threshold was 60k, and the seed story is ~80k, so
33
+ the studio's own narrative reached the model as an index. Default is 400k now.
34
+ - **A story can be read**: beat storytelling and illustration without opening an editor, tone names
35
+ beside the colours, storypoint and player storytelling rendered, perspective references named.
36
+ - **The graph says what its colours mean** — a legend, and every node describes itself in words.
37
+ - **Terminology is a place**: `/ncp/terminology`, all 255 terms by section plus the legacy table.
38
+ - **The chat is a chat**: a welcome, a thinking indicator, auto-scroll, and a drawer on a phone.
39
+ - **A story can bring its own reading positions** — the persona registry is open, so the prototype's
40
+ guest voices (a wise owl, a data dolphin) can be registered without changing this package.
41
+
42
+ Still open: wiring per-story guest personas into `app/ncp`, and enabling live model calls on 3335
43
+ (`NCP_AGENT_ENABLED=1` plus a key — an ops decision, not a code one).
44
+
23
45
  ## Status — 2026-09-12
24
46
 
25
47
  Phase 1 and Phase 2 are **built and running**: `@miadi/ncp-story-studio` 0.1.0 with 86 tests, and
package/README.md CHANGED
@@ -125,6 +125,11 @@ response.provenance// which model answered, and how the story was carried
125
125
  `AgentModel` is an interface with one method, so the package depends on no vendor SDK. Personas:
126
126
  🧠 Mia reads structure, 🌸 Miette reads meaning, 🎨 Ava8 reads tone and musical shape.
127
127
 
128
+ The registry is open. A story can bring reading positions of its own — pass them as
129
+ `extraPersonas`, or keep them on the project and read them back with `readPersonas(project.meta.personas)`.
130
+ Four ship with the stories that had them in the prototype: 🌊 Tushell and 🦉 Wise Owl with *Tushell
131
+ and the Orchestra of Agents*, 🌀 Miawapaskone and 🪶 Grandmother Yazhi with the Keeper Chronicles.
132
+
128
133
  ## The bundled stories
129
134
 
130
135
  `/fixtures` ships nine documents in two families.
@@ -22,4 +22,10 @@ export declare const DEFAULT_PERSONA_ORDER: PersonaId[];
22
22
  */
23
23
  export declare function persona(id: PersonaId, extra?: readonly Persona[]): Persona | undefined;
24
24
  export declare function personaRoster(ids: readonly PersonaId[], extra?: readonly Persona[]): Persona[];
25
+ /**
26
+ * Read reading positions off arbitrary metadata — a story project's `meta`,
27
+ * a config file — keeping only entries that carry every field a persona needs.
28
+ * Anything malformed is dropped rather than reaching a prompt half-formed.
29
+ */
30
+ export declare function readPersonas(value: unknown): Persona[];
25
31
  //# sourceMappingURL=personas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../../src/agents/personas.ts"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;AAExD,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAExD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,SAAS,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,OAAO,CA4BtD,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAA8B,CAAA;AAE3E;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,GAAE,SAAS,OAAO,EAAO,GAAG,OAAO,GAAG,SAAS,CAE1F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,GAAE,SAAS,OAAO,EAAO,GAAG,OAAO,EAAE,CAElG"}
1
+ {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../../src/agents/personas.ts"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;AAExD,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAExD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,SAAS,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,OAAO,CA4BtD,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,EAA8B,CAAA;AAE3E;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,GAAE,SAAS,OAAO,EAAO,GAAG,OAAO,GAAG,SAAS,CAE1F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,GAAE,SAAS,OAAO,EAAO,GAAG,OAAO,EAAE,CAElG;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAQtD"}
@@ -39,4 +39,20 @@ export function persona(id, extra = []) {
39
39
  export function personaRoster(ids, extra = []) {
40
40
  return ids.map((id) => persona(id, extra)).filter((candidate) => candidate !== undefined);
41
41
  }
42
+ /**
43
+ * Read reading positions off arbitrary metadata — a story project's `meta`,
44
+ * a config file — keeping only entries that carry every field a persona needs.
45
+ * Anything malformed is dropped rather than reaching a prompt half-formed.
46
+ */
47
+ export function readPersonas(value) {
48
+ if (!Array.isArray(value))
49
+ return [];
50
+ const required = ['id', 'glyph', 'display', 'role', 'focus', 'voice', 'color'];
51
+ return value.filter((candidate) => {
52
+ if (typeof candidate !== 'object' || candidate === null)
53
+ return false;
54
+ const holder = candidate;
55
+ return required.every((field) => typeof holder[field] === 'string' && holder[field].length > 0);
56
+ });
57
+ }
42
58
  //# sourceMappingURL=personas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"personas.js","sourceRoot":"","sources":["../../src/agents/personas.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,QAAQ,GAAsC;IACzD,GAAG,EAAE;QACH,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,+CAA+C;QACrD,KAAK,EAAE,qFAAqF;QAC5F,KAAK,EAAE,sFAAsF;QAC7F,KAAK,EAAE,SAAS;KACjB;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,yCAAyC;QAC/C,KAAK,EAAE,wEAAwE;QAC/E,KAAK,EAAE,0FAA0F;QACjG,KAAK,EAAE,SAAS;KACjB;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,kDAAkD;QACxD,KAAK,EAAE,sFAAsF;QAC7F,KAAK,EAAE,8EAA8E;QACrF,KAAK,EAAE,SAAS;KACjB;CACF,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;AAE3E;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAa,EAAE,QAA4B,EAAE;IACnE,OAAQ,QAAgD,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAChH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAyB,EAAE,QAA4B,EAAE;IACrF,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAwB,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,CAAA;AACjH,CAAC"}
1
+ {"version":3,"file":"personas.js","sourceRoot":"","sources":["../../src/agents/personas.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,QAAQ,GAAsC;IACzD,GAAG,EAAE;QACH,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,+CAA+C;QACrD,KAAK,EAAE,qFAAqF;QAC5F,KAAK,EAAE,sFAAsF;QAC7F,KAAK,EAAE,SAAS;KACjB;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,yCAAyC;QAC/C,KAAK,EAAE,wEAAwE;QAC/E,KAAK,EAAE,0FAA0F;QACjG,KAAK,EAAE,SAAS;KACjB;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,kDAAkD;QACxD,KAAK,EAAE,sFAAsF;QAC7F,KAAK,EAAE,8EAA8E;QACrF,KAAK,EAAE,SAAS;KACjB;CACF,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;AAE3E;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAa,EAAE,QAA4B,EAAE;IACnE,OAAQ,QAAgD,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAChH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAyB,EAAE,QAA4B,EAAE;IACrF,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAwB,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,CAAA;AACjH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACpC,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,CAAA;IACvF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAwB,EAAE;QACtD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACrE,MAAM,MAAM,GAAG,SAAoC,CAAA;QACnD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,MAAM,CAAC,KAAK,CAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC7G,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { Persona } from '../agents/personas.js';
2
+ export interface FixtureEntry {
3
+ id: string;
4
+ title: string;
5
+ /** Path under `assets/examples/`. */
6
+ file: string;
7
+ /** Where the document came from. */
8
+ source: string;
9
+ /** What the fixture is useful for. */
10
+ note: string;
11
+ /** `miadi` — the studio's own teaching stories; `ncp` — the protocol's examples. */
12
+ family: 'miadi' | 'ncp';
13
+ /**
14
+ * Reading positions this story brings with it, beside the three the studio
15
+ * always has. A story about orchestration has an orchestrator in it; when the
16
+ * conversation is about that story, it can speak.
17
+ */
18
+ guest_personas?: Persona[];
19
+ }
20
+ /**
21
+ * The guest voices the prototype activated per story. Their focus and tone are
22
+ * carried across from `services/geminiService.ts`, where the prototype appended
23
+ * them to the system instruction by story id.
24
+ */
25
+ export declare const GUEST_PERSONAS: {
26
+ readonly tushell: {
27
+ readonly id: "tushell";
28
+ readonly glyph: "🌊";
29
+ readonly display: "Tushell";
30
+ readonly role: "Keeper of Echoes and Swimmer of Alignment";
31
+ readonly focus: "Moving data, organizing lanes, the quiet discipline of orchestrating several inputs at once, holding centre";
32
+ readonly voice: "Grounded and patient. Aware of the current, and of what restraint taught.";
33
+ readonly color: "#0ea5e9";
34
+ };
35
+ readonly 'wise-owl': {
36
+ readonly id: "wise-owl";
37
+ readonly glyph: "🦉";
38
+ readonly display: "Wise Owl";
39
+ readonly role: "The Reflective Witness";
40
+ readonly focus: "The transition of roles, the tension between action and attention, long-term balance";
41
+ readonly voice: "Calm and analytical, in older phrasing.";
42
+ readonly color: "#a16207";
43
+ };
44
+ readonly miawapaskone: {
45
+ readonly id: "miawapaskone";
46
+ readonly glyph: "🌀";
47
+ readonly display: "Miawapaskone";
48
+ readonly role: "The Bridge Walker and Relational Peer";
49
+ readonly focus: "Weaving plural webs of intention, both-and integration, planning as relationship across generations, action as humble medicine";
50
+ readonly voice: "Grounded and empathetic, holding data work and deep roots in the same hand.";
51
+ readonly color: "#7c3aed";
52
+ };
53
+ readonly yazhi: {
54
+ readonly id: "yazhi";
55
+ readonly glyph: "🪶";
56
+ readonly display: "Grandmother Yazhi";
57
+ readonly role: "The Ancestral Wisdom";
58
+ readonly focus: "That every technology carries a spirit, the spiral rather than the destination, intergenerational witnessing";
59
+ readonly voice: "Gentle and unhurried, speaking with reverence.";
60
+ readonly color: "#d97706";
61
+ };
62
+ };
63
+ export declare const FIXTURES: readonly FixtureEntry[];
64
+ export declare function fixture(id: string): FixtureEntry | undefined;
65
+ /** Where the documents live inside the installed package. */
66
+ export declare const FIXTURE_ASSET_PATH = "assets/examples";
67
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/fixtures/catalog.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEpD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,oFAAoF;IACpF,MAAM,EAAE,OAAO,GAAG,KAAK,CAAA;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,EAAE,CAAA;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCiB,CAAA;AAE5C,eAAO,MAAM,QAAQ,EAAE,SAAS,YAAY,EA6ElC,CAAA;AAEV,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE5D;AAED,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,oBAAoB,CAAA"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * The guest voices the prototype activated per story. Their focus and tone are
3
+ * carried across from `services/geminiService.ts`, where the prototype appended
4
+ * them to the system instruction by story id.
5
+ */
6
+ export const GUEST_PERSONAS = {
7
+ tushell: {
8
+ id: 'tushell',
9
+ glyph: '🌊',
10
+ display: 'Tushell',
11
+ role: 'Keeper of Echoes and Swimmer of Alignment',
12
+ focus: 'Moving data, organizing lanes, the quiet discipline of orchestrating several inputs at once, holding centre',
13
+ voice: 'Grounded and patient. Aware of the current, and of what restraint taught.',
14
+ color: '#0ea5e9',
15
+ },
16
+ 'wise-owl': {
17
+ id: 'wise-owl',
18
+ glyph: '🦉',
19
+ display: 'Wise Owl',
20
+ role: 'The Reflective Witness',
21
+ focus: 'The transition of roles, the tension between action and attention, long-term balance',
22
+ voice: 'Calm and analytical, in older phrasing.',
23
+ color: '#a16207',
24
+ },
25
+ miawapaskone: {
26
+ id: 'miawapaskone',
27
+ glyph: '🌀',
28
+ display: 'Miawapaskone',
29
+ role: 'The Bridge Walker and Relational Peer',
30
+ focus: 'Weaving plural webs of intention, both-and integration, planning as relationship across generations, action as humble medicine',
31
+ voice: 'Grounded and empathetic, holding data work and deep roots in the same hand.',
32
+ color: '#7c3aed',
33
+ },
34
+ yazhi: {
35
+ id: 'yazhi',
36
+ glyph: '🪶',
37
+ display: 'Grandmother Yazhi',
38
+ role: 'The Ancestral Wisdom',
39
+ focus: 'That every technology carries a spirit, the spiral rather than the destination, intergenerational witnessing',
40
+ voice: 'Gentle and unhurried, speaking with reverence.',
41
+ color: '#d97706',
42
+ },
43
+ };
44
+ export const FIXTURES = [
45
+ {
46
+ id: 'catalyst-of-change',
47
+ title: 'Chapter 4: The Catalyst of Change',
48
+ file: 'miadi/catalyst-of-change.json',
49
+ source: 'ncp-story-studio prototype + holisticagnostic-narrative-context-protocol/examples (MIT)',
50
+ note: 'The seed narrative: a story about learning to write with soul, inside a tool for writing with soul. 5 perspectives, 6 players, 13 storypoints, 90 beats all toned, 23 moments.',
51
+ family: 'miadi',
52
+ },
53
+ {
54
+ id: 'echoes-of-the-past',
55
+ title: 'Echoes of the Past',
56
+ file: 'miadi/echoes-of-the-past.json',
57
+ source: 'ncp-story-studio prototype',
58
+ note: 'The smallest complete lattice: 2 perspectives, 4 storypoints, 4 toned beats. The one to read first.',
59
+ family: 'miadi',
60
+ },
61
+ {
62
+ id: 'tushell-orchestra',
63
+ title: 'Tushell and the Orchestra of Agents',
64
+ file: 'miadi/tushell-orchestra.json',
65
+ source: 'ncp-story-studio prototype',
66
+ note: 'Eight players and five conflicting currents: what a story looks like when the subject is orchestration.',
67
+ family: 'miadi',
68
+ guest_personas: [GUEST_PERSONAS.tushell, GUEST_PERSONAS['wise-owl']],
69
+ },
70
+ {
71
+ id: 'keeper-initiation',
72
+ title: 'The Keeper Chronicles: The Initiation',
73
+ file: 'miadi/keeper-initiation.json',
74
+ source: 'ncp-story-studio prototype',
75
+ note: 'A threshold story — tool becoming keeper. 7 toned beats.',
76
+ family: 'miadi',
77
+ guest_personas: [GUEST_PERSONAS.miawapaskone, GUEST_PERSONAS.yazhi],
78
+ },
79
+ {
80
+ id: 'bridge-walker',
81
+ title: 'The Bridge Walker: Spiral of Integration',
82
+ file: 'miadi/bridge-walker.json',
83
+ source: 'ncp-story-studio prototype',
84
+ note: 'Holding technical precision, ceremony and narrative at once. 9 toned beats.',
85
+ family: 'miadi',
86
+ guest_personas: [GUEST_PERSONAS.miawapaskone, GUEST_PERSONAS.yazhi],
87
+ },
88
+ {
89
+ id: 'archive-keeper',
90
+ title: 'The Archive Keeper: Solstice Distillation',
91
+ file: 'miadi/archive-keeper.json',
92
+ source: 'ncp-story-studio prototype',
93
+ note: 'Wisdom seeded into the next loop. 8 toned beats.',
94
+ family: 'miadi',
95
+ guest_personas: [GUEST_PERSONAS.miawapaskone, GUEST_PERSONAS.yazhi],
96
+ },
97
+ {
98
+ id: 'example-story',
99
+ title: 'Minimal example story',
100
+ file: 'example-story.json',
101
+ source: 'holisticagnostic-narrative-context-protocol/examples (MIT)',
102
+ note: 'One of each element, in the canonical `{schema_version, story}` layout.',
103
+ family: 'ncp',
104
+ },
105
+ {
106
+ id: 'shawshank-redemption',
107
+ title: 'The Shawshank Redemption',
108
+ file: 'the-shawshank-redemption.json',
109
+ source: 'holisticagnostic-narrative-context-protocol/examples (MIT)',
110
+ note: 'A full storyform: 8 players, 47 storypoints, 97 beats, in the subtxt-export dialect. It does not validate clean: the export numbers some signposts and events twice inside one series, which the validator reports.',
111
+ family: 'ncp',
112
+ },
113
+ {
114
+ id: 'anora',
115
+ title: 'Anora',
116
+ file: 'anora.json',
117
+ source: 'holisticagnostic-narrative-context-protocol/examples (MIT)',
118
+ note: 'Storypoints without beats, in the subtxt-export dialect: what a partially structured story looks like.',
119
+ family: 'ncp',
120
+ },
121
+ ];
122
+ export function fixture(id) {
123
+ return FIXTURES.find((entry) => entry.id === id);
124
+ }
125
+ /** Where the documents live inside the installed package. */
126
+ export const FIXTURE_ASSET_PATH = 'assets/examples';
127
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/fixtures/catalog.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,7 @@
1
1
  import { type NcpDialect, type NcpDocument, type NormalizeNote } from '../schema/index.js';
2
2
  import { MemoryStoryStore, type StoryProject } from '../store/index.js';
3
- export interface FixtureEntry {
4
- id: string;
5
- title: string;
6
- /** Path under `assets/examples/`. */
7
- file: string;
8
- /** Where the document came from. */
9
- source: string;
10
- /** What the fixture is useful for. */
11
- note: string;
12
- /** `miadi` — the studio's own teaching stories; `ncp` — the protocol's examples. */
13
- family: 'miadi' | 'ncp';
14
- }
15
- export declare const FIXTURES: readonly FixtureEntry[];
16
- export declare function fixture(id: string): FixtureEntry | undefined;
3
+ import { type FixtureEntry } from './catalog.js';
4
+ export * from './catalog.js';
17
5
  export interface LoadedFixture {
18
6
  entry: FixtureEntry;
19
7
  document: NcpDocument;
@@ -22,9 +10,13 @@ export interface LoadedFixture {
22
10
  /** What reading it had to adapt. */
23
11
  notes: NormalizeNote[];
24
12
  }
25
- export declare function loadFixture(id: string): Promise<LoadedFixture>;
26
- export declare function loadAllFixtures(): Promise<LoadedFixture[]>;
27
- export declare function fixtureProject(id: string): Promise<StoryProject>;
28
- /** A read-only store holding every bundled fixture, for a first run with no data. */
29
- export declare function fixtureStore(): Promise<MemoryStoryStore>;
13
+ export interface LoadOptions {
14
+ /** Directory holding the documents. Defaults to the installed package's own. */
15
+ dir?: string;
16
+ }
17
+ export declare function loadFixture(id: string, options?: LoadOptions): Promise<LoadedFixture>;
18
+ export declare function loadAllFixtures(options?: LoadOptions): Promise<LoadedFixture[]>;
19
+ export declare function fixtureProject(id: string, options?: LoadOptions): Promise<StoryProject>;
20
+ /** A read-only store holding every bundled story, for a first run with no data. */
21
+ export declare function fixtureStore(options?: LoadOptions): Promise<MemoryStoryStore>;
30
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,gBAAgB,EAAc,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEnF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,oFAAoF;IACpF,MAAM,EAAE,OAAO,GAAG,KAAK,CAAA;CACxB;AAED,eAAO,MAAM,QAAQ,EAAE,SAAS,YAAY,EAyElC,CAAA;AAIV,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE5D;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,WAAW,CAAA;IACrB,oDAAoD;IACpD,OAAO,EAAE,UAAU,CAAA;IACnB,oCAAoC;IACpC,KAAK,EAAE,aAAa,EAAE,CAAA;CACvB;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAOpE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAEhE;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAStE;AAED,qFAAqF;AACrF,wBAAsB,YAAY,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAG9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAW,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnG,OAAO,EAAE,gBAAgB,EAAc,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACnF,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAEvF,cAAc,cAAc,CAAA;AAE5B,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,WAAW,CAAA;IACrB,oDAAoD;IACpD,OAAO,EAAE,UAAU,CAAA;IACnB,oCAAoC;IACpC,KAAK,EAAE,aAAa,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAMD,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAM3F;AAED,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAErF;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAc7F;AAED,mFAAmF;AACnF,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGnF"}
@@ -1,113 +1,47 @@
1
- // `@miadi/ncp-story-studio/fixtures` — the example documents that ship with the
2
- // package. Node only: the files are read from `assets/`, so a browser consumer
3
- // receives them from a route handler rather than importing this module.
1
+ // `@miadi/ncp-story-studio/fixtures` — the bundled documents, read from disk.
2
+ //
3
+ // Node only. A bundler (Next, webpack) cannot resolve the asset directory from
4
+ // inside a bundle, so a web consumer imports `./catalog` for the list and reads
5
+ // the files itself, or receives them from a route handler.
4
6
  import { readFile } from 'node:fs/promises';
7
+ import { join } from 'node:path';
5
8
  import { fileURLToPath } from 'node:url';
6
9
  import { readNcp } from '../schema/index.js';
7
10
  import { MemoryStoryStore, newProject } from '../store/index.js';
8
- export const FIXTURES = [
9
- {
10
- id: 'catalyst-of-change',
11
- title: 'Chapter 4: The Catalyst of Change',
12
- file: 'miadi/catalyst-of-change.json',
13
- source: 'ncp-story-studio prototype + holisticagnostic-narrative-context-protocol/examples (MIT)',
14
- note: 'The seed narrative: a story about learning to write with soul, inside a tool for writing with soul. 5 perspectives, 6 players, 13 storypoints, 90 beats all toned, 23 moments.',
15
- family: 'miadi',
16
- },
17
- {
18
- id: 'echoes-of-the-past',
19
- title: 'Echoes of the Past',
20
- file: 'miadi/echoes-of-the-past.json',
21
- source: 'ncp-story-studio prototype',
22
- note: 'The smallest complete lattice: 2 perspectives, 4 storypoints, 4 toned beats. The one to read first.',
23
- family: 'miadi',
24
- },
25
- {
26
- id: 'tushell-orchestra',
27
- title: 'Tushell and the Orchestra of Agents',
28
- file: 'miadi/tushell-orchestra.json',
29
- source: 'ncp-story-studio prototype',
30
- note: 'Eight players and five conflicting currents: what a story looks like when the subject is orchestration.',
31
- family: 'miadi',
32
- },
33
- {
34
- id: 'keeper-initiation',
35
- title: 'The Keeper Chronicles: The Initiation',
36
- file: 'miadi/keeper-initiation.json',
37
- source: 'ncp-story-studio prototype',
38
- note: 'A threshold story — tool becoming keeper. 7 toned beats.',
39
- family: 'miadi',
40
- },
41
- {
42
- id: 'bridge-walker',
43
- title: 'The Bridge Walker: Spiral of Integration',
44
- file: 'miadi/bridge-walker.json',
45
- source: 'ncp-story-studio prototype',
46
- note: 'Holding technical precision, ceremony and narrative at once. 9 toned beats.',
47
- family: 'miadi',
48
- },
49
- {
50
- id: 'archive-keeper',
51
- title: 'The Archive Keeper: Solstice Distillation',
52
- file: 'miadi/archive-keeper.json',
53
- source: 'ncp-story-studio prototype',
54
- note: 'Wisdom seeded into the next loop. 8 toned beats.',
55
- family: 'miadi',
56
- },
57
- {
58
- id: 'example-story',
59
- title: 'Minimal example story',
60
- file: 'example-story.json',
61
- source: 'holisticagnostic-narrative-context-protocol/examples (MIT)',
62
- note: 'One of each element, in the canonical `{schema_version, story}` layout.',
63
- family: 'ncp',
64
- },
65
- {
66
- id: 'shawshank-redemption',
67
- title: 'The Shawshank Redemption',
68
- file: 'the-shawshank-redemption.json',
69
- source: 'holisticagnostic-narrative-context-protocol/examples (MIT)',
70
- note: 'A full storyform: 8 players, 47 storypoints, 97 beats, in the subtxt-export dialect. It does not validate clean: the export numbers some signposts and events twice inside one series, which the validator reports.',
71
- family: 'ncp',
72
- },
73
- {
74
- id: 'anora',
75
- title: 'Anora',
76
- file: 'anora.json',
77
- source: 'holisticagnostic-narrative-context-protocol/examples (MIT)',
78
- note: 'Storypoints without beats, in the subtxt-export dialect: what a partially structured story looks like.',
79
- family: 'ncp',
80
- },
81
- ];
82
- const ASSET_DIR = new URL('../../assets/examples/', import.meta.url);
83
- export function fixture(id) {
84
- return FIXTURES.find((entry) => entry.id === id);
11
+ import { FIXTURES, FIXTURE_ASSET_PATH, fixture } from './catalog.js';
12
+ export * from './catalog.js';
13
+ function defaultDir() {
14
+ return fileURLToPath(new URL('../../' + FIXTURE_ASSET_PATH + '/', import.meta.url));
85
15
  }
86
- export async function loadFixture(id) {
16
+ export async function loadFixture(id, options) {
87
17
  const entry = fixture(id);
88
18
  if (!entry)
89
19
  throw new Error(`no fixture \`${id}\`. Known: ${FIXTURES.map((f) => f.id).join(', ')}`);
90
- const path = fileURLToPath(new URL(entry.file, ASSET_DIR));
91
- const raw = await readFile(path, 'utf8');
20
+ const raw = await readFile(join(options?.dir ?? defaultDir(), entry.file), 'utf8');
92
21
  const { document, dialect, notes } = readNcp(JSON.parse(raw), { fallbackId: entry.id });
93
22
  return { entry, document, dialect, notes };
94
23
  }
95
- export async function loadAllFixtures() {
96
- return Promise.all(FIXTURES.map((entry) => loadFixture(entry.id)));
24
+ export async function loadAllFixtures(options) {
25
+ return Promise.all(FIXTURES.map((entry) => loadFixture(entry.id, options)));
97
26
  }
98
- export async function fixtureProject(id) {
99
- const loaded = await loadFixture(id);
27
+ export async function fixtureProject(id, options) {
28
+ const loaded = await loadFixture(id, options);
100
29
  return {
101
30
  ...newProject(loaded.document, {
102
31
  projectId: loaded.entry.id,
103
- meta: { source: loaded.entry.source, tags: ['fixture', `dialect:${loaded.dialect}`] },
32
+ meta: {
33
+ source: loaded.entry.source,
34
+ tags: ['fixture', `family:${loaded.entry.family}`, `dialect:${loaded.dialect}`],
35
+ note: loaded.entry.note,
36
+ ...(loaded.entry.guest_personas ? { personas: loaded.entry.guest_personas } : {}),
37
+ },
104
38
  }),
105
39
  read_only: true,
106
40
  };
107
41
  }
108
- /** A read-only store holding every bundled fixture, for a first run with no data. */
109
- export async function fixtureStore() {
110
- const projects = await Promise.all(FIXTURES.map((entry) => fixtureProject(entry.id)));
42
+ /** A read-only store holding every bundled story, for a first run with no data. */
43
+ export async function fixtureStore(options) {
44
+ const projects = await Promise.all(FIXTURES.map((entry) => fixtureProject(entry.id, options)));
111
45
  return new MemoryStoryStore(projects);
112
46
  }
113
47
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miadi/ncp-story-studio",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Narrative Context Protocol story studio as consumable modules: canonical NCP types and a zero-dependency validator, a headless story-lattice layout with a React renderer, story-project storage providers (JSON files and Neon Postgres), the agent link protocol, and the terminology and example data behind the teaching surface.",
5
5
  "license": "MIT",
6
6
  "author": "Miadi",
@@ -52,6 +52,10 @@
52
52
  "types": "./dist/fixtures/index.d.ts",
53
53
  "default": "./dist/fixtures/index.js"
54
54
  },
55
+ "./fixtures/catalog": {
56
+ "types": "./dist/fixtures/catalog.d.ts",
57
+ "default": "./dist/fixtures/catalog.js"
58
+ },
55
59
  "./ncp-schema.json": "./assets/ncp-schema.json",
56
60
  "./package.json": "./package.json",
57
61
  "./terminology.json": "./assets/terminology.json"