@design-intelligence/ghost 0.20.0 → 0.22.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.
Files changed (157) hide show
  1. package/README.md +47 -33
  2. package/dist/commands/checks-command.d.ts.map +1 -1
  3. package/dist/commands/checks-command.js +8 -1
  4. package/dist/commands/checks-command.js.map +1 -1
  5. package/dist/commands/fingerprint-commands.d.ts.map +1 -1
  6. package/dist/commands/fingerprint-commands.js +1 -6
  7. package/dist/commands/fingerprint-commands.js.map +1 -1
  8. package/dist/commands/gather-command.d.ts.map +1 -1
  9. package/dist/commands/gather-command.js +26 -30
  10. package/dist/commands/gather-command.js.map +1 -1
  11. package/dist/commands/init-command.d.ts.map +1 -1
  12. package/dist/commands/init-command.js +23 -13
  13. package/dist/commands/init-command.js.map +1 -1
  14. package/dist/commands/pull-command.d.ts.map +1 -1
  15. package/dist/commands/pull-command.js +12 -19
  16. package/dist/commands/pull-command.js.map +1 -1
  17. package/dist/commands/pulse-command.js +1 -10
  18. package/dist/commands/pulse-command.js.map +1 -1
  19. package/dist/commands/review-command.d.ts.map +1 -1
  20. package/dist/commands/review-command.js +1 -0
  21. package/dist/commands/review-command.js.map +1 -1
  22. package/dist/ghost-core/catalog/assemble.d.ts +0 -4
  23. package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
  24. package/dist/ghost-core/catalog/assemble.js +0 -10
  25. package/dist/ghost-core/catalog/assemble.js.map +1 -1
  26. package/dist/ghost-core/catalog/index.d.ts +1 -1
  27. package/dist/ghost-core/catalog/index.d.ts.map +1 -1
  28. package/dist/ghost-core/catalog/index.js +1 -1
  29. package/dist/ghost-core/catalog/index.js.map +1 -1
  30. package/dist/ghost-core/catalog/menu.d.ts +1 -11
  31. package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
  32. package/dist/ghost-core/catalog/menu.js +1 -6
  33. package/dist/ghost-core/catalog/menu.js.map +1 -1
  34. package/dist/ghost-core/catalog/types.d.ts +0 -6
  35. package/dist/ghost-core/catalog/types.d.ts.map +1 -1
  36. package/dist/ghost-core/glossary.d.ts +0 -13
  37. package/dist/ghost-core/glossary.d.ts.map +1 -1
  38. package/dist/ghost-core/glossary.js +0 -7
  39. package/dist/ghost-core/glossary.js.map +1 -1
  40. package/dist/ghost-core/index.d.ts +2 -2
  41. package/dist/ghost-core/index.d.ts.map +1 -1
  42. package/dist/ghost-core/index.js +1 -1
  43. package/dist/ghost-core/index.js.map +1 -1
  44. package/dist/ghost-core/package-manifest.d.ts +7 -0
  45. package/dist/ghost-core/package-manifest.d.ts.map +1 -1
  46. package/dist/ghost-core/package-manifest.js +10 -0
  47. package/dist/ghost-core/package-manifest.js.map +1 -1
  48. package/dist/init-payloads/median/cliche.median.md +86 -0
  49. package/dist/init-payloads/median/median-tells.md +117 -0
  50. package/dist/init-payloads/skeleton/brand.md +22 -0
  51. package/dist/init-payloads/skeleton/context.conversation.md +24 -0
  52. package/dist/init-payloads/skeleton/foundation.color.md +39 -0
  53. package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
  54. package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
  55. package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
  56. package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
  57. package/dist/init-payloads/skeleton/foundation.type.md +44 -0
  58. package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
  59. package/dist/init-payloads/skeleton/glossary.md +39 -0
  60. package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
  61. package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
  62. package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
  63. package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
  64. package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
  65. package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
  66. package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
  67. package/dist/init-payloads/vessel-light/checks/values.md +51 -0
  68. package/dist/init-payloads/vessel-light/glossary.md +44 -0
  69. package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
  70. package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
  71. package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
  72. package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
  73. package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
  74. package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
  75. package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
  76. package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
  77. package/dist/init-payloads/vessel-light/index.md +33 -0
  78. package/dist/init-payloads/vessel-light/manifest.yml +3 -0
  79. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
  80. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
  81. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
  82. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
  83. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
  84. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
  85. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
  86. package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
  87. package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
  88. package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
  89. package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
  90. package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
  91. package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
  92. package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
  93. package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
  94. package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
  95. package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
  96. package/dist/init-payloads/vessel-light/register.email.md +43 -0
  97. package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
  98. package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
  99. package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
  100. package/dist/init-payloads/vessel-light/signature.type.md +37 -0
  101. package/dist/observability-events.d.ts +0 -3
  102. package/dist/observability-events.d.ts.map +1 -1
  103. package/dist/observability-events.js.map +1 -1
  104. package/dist/review/resolve.d.ts +3 -4
  105. package/dist/review/resolve.d.ts.map +1 -1
  106. package/dist/review/resolve.js +12 -9
  107. package/dist/review/resolve.js.map +1 -1
  108. package/dist/review/review-packet.d.ts +2 -1
  109. package/dist/review/review-packet.d.ts.map +1 -1
  110. package/dist/review/review-packet.js +9 -20
  111. package/dist/review/review-packet.js.map +1 -1
  112. package/dist/scan/check-files.d.ts.map +1 -1
  113. package/dist/scan/check-files.js +0 -15
  114. package/dist/scan/check-files.js.map +1 -1
  115. package/dist/scan/check-scaffold.d.ts +1 -0
  116. package/dist/scan/check-scaffold.d.ts.map +1 -1
  117. package/dist/scan/check-scaffold.js +17 -1
  118. package/dist/scan/check-scaffold.js.map +1 -1
  119. package/dist/scan/fingerprint-package-lint.d.ts +8 -0
  120. package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
  121. package/dist/scan/fingerprint-package-lint.js +284 -0
  122. package/dist/scan/fingerprint-package-lint.js.map +1 -0
  123. package/dist/scan/fingerprint-package-loader.d.ts.map +1 -1
  124. package/dist/scan/fingerprint-package-loader.js +2 -29
  125. package/dist/scan/fingerprint-package-loader.js.map +1 -1
  126. package/dist/scan/fingerprint-package.d.ts +16 -8
  127. package/dist/scan/fingerprint-package.d.ts.map +1 -1
  128. package/dist/scan/fingerprint-package.js +41 -241
  129. package/dist/scan/fingerprint-package.js.map +1 -1
  130. package/dist/scan/node-files.d.ts.map +1 -1
  131. package/dist/scan/node-files.js +1 -3
  132. package/dist/scan/node-files.js.map +1 -1
  133. package/dist/scan/packed-payloads.d.ts +4 -0
  134. package/dist/scan/packed-payloads.d.ts.map +1 -0
  135. package/dist/scan/packed-payloads.js +55 -0
  136. package/dist/scan/packed-payloads.js.map +1 -0
  137. package/dist/scan/templates.d.ts +20 -2
  138. package/dist/scan/templates.d.ts.map +1 -1
  139. package/dist/scan/templates.js +106 -26
  140. package/dist/scan/templates.js.map +1 -1
  141. package/dist/skill-bundle/SKILL.md +16 -13
  142. package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
  143. package/dist/skill-bundle/references/authoring-scenarios.md +42 -5
  144. package/dist/skill-bundle/references/blocks.md +1 -1
  145. package/dist/skill-bundle/references/brief.md +5 -6
  146. package/dist/skill-bundle/references/capture.md +52 -41
  147. package/dist/skill-bundle/references/concrete-tiers.md +95 -0
  148. package/dist/skill-bundle/references/recall.md +6 -12
  149. package/dist/skill-bundle/references/schema.md +15 -24
  150. package/dist/skill-bundle/references/self-check.md +2 -2
  151. package/dist/skill-bundle/references/steering-audit.md +7 -10
  152. package/package.json +2 -2
  153. package/dist/scan/steering-template.d.ts +0 -8
  154. package/dist/scan/steering-template.d.ts.map +0 -1
  155. package/dist/scan/steering-template.js +0 -266
  156. package/dist/scan/steering-template.js.map +0 -1
  157. package/dist/skill-bundle/references/wild.md +0 -30
@@ -1,10 +1,10 @@
1
1
  import { GHOST_FINGERPRINT_PACKAGE_SCHEMA } from "#ghost-core";
2
2
  import { GHOST_EVENTS_FILENAME, LEGACY_PULL_HISTORY_FILENAME, } from "./constants.js";
3
- import { createSteeringTemplate } from "./steering-template.js";
4
- function manifestFile() {
3
+ import { loadPackedPayload, loadPayloadFile } from "./packed-payloads.js";
4
+ function manifestFile(cover) {
5
5
  return {
6
6
  relativePath: "manifest.yml",
7
- content: `schema: ${GHOST_FINGERPRINT_PACKAGE_SCHEMA}\nid: local\n`,
7
+ content: `schema: ${GHOST_FINGERPRINT_PACKAGE_SCHEMA}\nid: local\n${cover ? `cover: ${cover}\n` : ""}`,
8
8
  };
9
9
  }
10
10
  /**
@@ -20,16 +20,17 @@ function gitignoreFile() {
20
20
  }
21
21
  /**
22
22
  * The minimal starter: a manifest, a package-level glossary declaring the
23
- * starter kind vocabulary, and a package-root `index.md` node. Additional
23
+ * starter kind vocabulary, and a package-root `index.md` cover. Additional
24
24
  * truths are plain markdown nodes; optional material locators live on the node
25
25
  * that explains them. Checks are opt-in via `ghost checks init`.
26
26
  */
27
27
  const MINIMAL_TEMPLATE = {
28
28
  name: "minimal",
29
- description: "Minimal node package: manifest + glossary + a starter index node.",
30
- files() {
29
+ description: "Minimal node package: manifest + glossary + a starter cover node.",
30
+ async files() {
31
+ const medianFile = await medianTemplateFile();
31
32
  return [
32
- manifestFile(),
33
+ manifestFile("index"),
33
34
  gitignoreFile(),
34
35
  {
35
36
  relativePath: "glossary.md",
@@ -39,9 +40,9 @@ kinds:
39
40
  - name: condition
40
41
  - name: exemplar
41
42
  - name: anti-goal
43
+ - name: cliche
42
44
  - name: asset
43
45
  - name: pattern
44
- # - { name: provocation, posture: wild, purpose: a deliberate provocation past the fingerprint — surfaced only on request }
45
46
  ---
46
47
 
47
48
  # principle
@@ -63,6 +64,13 @@ What this brand must never look, sound, or feel like — named generic patterns
63
64
  and rejected neighbors. Always-on, like a principle, but stated as the thing
64
65
  to steer away from.
65
66
 
67
+ # cliche
68
+
69
+ The defaults a generative model falls back on when no brand is steering it.
70
+ These are nobody's brand. Each entry pairs the tired move with the honest
71
+ replacement. Gather before styling anything greenfield; enforced by paired
72
+ checks at review.
73
+
66
74
  # asset
67
75
 
68
76
  Material truth about concrete brand assets such as logos, illustrations, motion, imagery, or files.
@@ -82,18 +90,18 @@ Replace this placeholder prose with two things:
82
90
 
83
91
  **The non-negotiables.** The handful of truths that apply to every task, every
84
92
  medium, no matter what else is gathered — hard invariants, the anti-goals, the
85
- one-sentence stance. This node is the only one an agent is told to always pull,
86
- so anything that must never be missed belongs here (stated briefly; link out to
87
- the full node by id for depth).
93
+ one-sentence stance. Anything that must never be missed belongs here, stated
94
+ briefly; link out to the full node by id for depth.
88
95
 
89
96
  **How to read the rest.** What this fingerprint covers, how its kinds organize
90
97
  the corpus, and where the fingerprint deliberately stays silent — including, if
91
98
  you want one, a stricter silence posture ("when this fingerprint is silent on X,
92
99
  ask a human") that overrides the default proceed-provisionally behavior.
93
100
 
94
- \`index\` is an ordinary node in every mechanical sense — everything below the
95
- \`---\` is its body; the frontmatter above is the retrieval description. Its
96
- privilege is pure convention: the recipes tell agents to pull it first.
101
+ \`index\` is this package's manifest-declared cover: \`ghost gather\` inlines its
102
+ body before the menu and excludes it from selection. Its privilege comes from
103
+ \`cover: index\` in \`manifest.yml\`, not from the filename. You may rename it;
104
+ update the manifest's \`cover\` id at the same time.
97
105
 
98
106
  The glossary declares the kind vocabulary. A node's kind comes from its
99
107
  filename prefix: \`principle.density.md\` has kind \`principle\` and slug
@@ -102,13 +110,14 @@ When a truth is narrower, state the condition in the prose — the situation whe
102
110
  it applies — never a filing destination.
103
111
  `,
104
112
  },
113
+ medianFile,
105
114
  ];
106
115
  },
107
116
  };
108
117
  /**
109
118
  * The composition starter: everything in `minimal`, plus a worked composition
110
119
  * ladder — an invariants floor (`principle.composition`), one bound/open
111
- * pattern, and an index that teaches the convention. For teams whose
120
+ * pattern, and a cover that teaches the convention. For teams whose
112
121
  * fingerprint must steer *what agents build*, not only what they say.
113
122
  *
114
123
  * The ladder is an authoring convention, not a schema: patterns state what is
@@ -119,9 +128,10 @@ it applies — never a filing destination.
119
128
  const COMPOSITION_TEMPLATE = {
120
129
  name: "composition",
121
130
  description: "Composition starter: minimal files + an invariants floor and a worked bound/open pattern.",
122
- files() {
131
+ async files() {
132
+ const medianFile = await medianTemplateFile();
123
133
  return [
124
- manifestFile(),
134
+ manifestFile("index"),
125
135
  gitignoreFile(),
126
136
  {
127
137
  relativePath: "glossary.md",
@@ -131,9 +141,9 @@ kinds:
131
141
  - name: condition
132
142
  - name: exemplar
133
143
  - name: anti-goal
144
+ - name: cliche
134
145
  - name: asset
135
146
  - name: pattern
136
- # - { name: provocation, posture: wild, purpose: a deliberate provocation past the fingerprint — surfaced only on request }
137
147
  ---
138
148
 
139
149
  # principle
@@ -159,6 +169,13 @@ What this brand must never look, sound, or feel like — named generic patterns
159
169
  and rejected neighbors. Always-on, like a principle, but stated as the thing
160
170
  to steer away from.
161
171
 
172
+ # cliche
173
+
174
+ The defaults a generative model falls back on when no brand is steering it.
175
+ These are nobody's brand. Each entry pairs the tired move with the honest
176
+ replacement. Gather before styling anything greenfield; enforced by paired
177
+ checks at review.
178
+
162
179
  # asset
163
180
 
164
181
  Material truth about concrete brand assets such as logos, illustrations, motion,
@@ -270,23 +287,86 @@ When a blessed render of this pattern exists, add an \`exemplar.*\` node with
270
287
  \`materials\` pointing at the screenshot and the implementation path.
271
288
  `,
272
289
  },
290
+ medianFile,
273
291
  ];
274
292
  },
275
293
  };
276
- const STEERING_TEMPLATE = createSteeringTemplate({
277
- manifestFile,
278
- gitignoreFile,
279
- });
294
+ const SKELETON_FILE_ORDER = new Map([
295
+ "glossary.md",
296
+ "brand.md",
297
+ "cliche.median.md",
298
+ "foundation.composition.md",
299
+ "foundation.color.md",
300
+ "foundation.type.md",
301
+ "foundation.controls.md",
302
+ "foundation.layout.md",
303
+ "foundation.motion.md",
304
+ "foundation.voice.md",
305
+ "context.conversation.md",
306
+ ].map((path, index) => [path, index]));
307
+ const SKELETON_TEMPLATE = {
308
+ name: "skeleton",
309
+ description: "Naked skeleton: a brand cover, foundation chapters with open questions, and the cliche floor.",
310
+ async files() {
311
+ const skeletonFiles = [
312
+ ...(await loadPackedPayload("skeleton")),
313
+ await medianTemplateFile(),
314
+ ];
315
+ skeletonFiles.sort((a, b) => (SKELETON_FILE_ORDER.get(a.relativePath) ?? Number.MAX_SAFE_INTEGER) -
316
+ (SKELETON_FILE_ORDER.get(b.relativePath) ??
317
+ Number.MAX_SAFE_INTEGER) ||
318
+ a.relativePath.localeCompare(b.relativePath));
319
+ return [manifestFile("brand"), gitignoreFile(), ...skeletonFiles];
320
+ },
321
+ };
322
+ async function medianTemplateFile() {
323
+ return {
324
+ relativePath: "cliche.median.md",
325
+ content: await loadPayloadFile("median", "cliche.median.md"),
326
+ };
327
+ }
280
328
  const TEMPLATES = new Map([
281
329
  [MINIMAL_TEMPLATE.name, MINIMAL_TEMPLATE],
282
330
  [COMPOSITION_TEMPLATE.name, COMPOSITION_TEMPLATE],
283
- [STEERING_TEMPLATE.name, STEERING_TEMPLATE],
331
+ [SKELETON_TEMPLATE.name, SKELETON_TEMPLATE],
284
332
  ]);
285
- export const DEFAULT_TEMPLATE_NAME = STEERING_TEMPLATE.name;
333
+ const VESSEL_LIGHT_BODY = {
334
+ name: "vessel-light",
335
+ description: "Vessel's design language at full strength: corpus, tokens, fonts, refs, and checks.",
336
+ includesChecks: true,
337
+ async files() {
338
+ const payload = await loadPackedPayload("vessel-light");
339
+ payload.sort((a, b) => {
340
+ const ao = BODY_FILE_ORDER.get(a.relativePath);
341
+ const bo = BODY_FILE_ORDER.get(b.relativePath);
342
+ return ((ao ?? Number.MAX_SAFE_INTEGER) - (bo ?? Number.MAX_SAFE_INTEGER) ||
343
+ a.relativePath.localeCompare(b.relativePath));
344
+ });
345
+ // The payload carries its own manifest.yml (id stays `vessel-light`);
346
+ // only the gitignore is generated locally.
347
+ return [gitignoreFile(), ...payload];
348
+ },
349
+ };
350
+ /** Listing order for the body scaffold output: anchors first, then the rest. */
351
+ const BODY_FILE_ORDER = new Map(["manifest.yml", "glossary.md", "index.md"].map((path, i) => [path, i]));
352
+ const BODIES = new Map([
353
+ [VESSEL_LIGHT_BODY.name, VESSEL_LIGHT_BODY],
354
+ ]);
355
+ /** Look up a registered init body by name. */
356
+ export function getInitBody(name) {
357
+ return BODIES.get(name);
358
+ }
359
+ export function listInitBodies() {
360
+ return [...BODIES.keys()];
361
+ }
362
+ export const DEFAULT_TEMPLATE_NAME = SKELETON_TEMPLATE.name;
286
363
  /** Look up a registered init template by name. */
287
364
  export function getInitTemplate(name) {
288
- if (name === "default")
289
- return STEERING_TEMPLATE;
365
+ // `default` and `steering` are silent aliases for the skeleton starter:
366
+ // `default` for callers that never named a template, `steering` for
367
+ // callers pinned to the pre-skeleton default's name.
368
+ if (name === "default" || name === "steering")
369
+ return SKELETON_TEMPLATE;
290
370
  return TEMPLATES.get(name);
291
371
  }
292
372
  export function listInitTemplates() {
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scan/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAoBhE,SAAS,YAAY;IACnB,OAAO;QACL,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,WAAW,gCAAgC,eAAe;KACpE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa;IACpB,OAAO;QACL,YAAY,EAAE,YAAY;QAC1B,OAAO,EAAE,GAAG,qBAAqB,KAAK,4BAA4B,IAAI;KACvE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,gBAAgB,GAAsB;IAC1C,IAAI,EAAE,SAAS;IACf,WAAW,EACT,mEAAmE;IACrE,KAAK;QACH,OAAO;YACL,YAAY,EAAE;YACd,aAAa,EAAE;YACf;gBACE,YAAY,EAAE,aAAa;gBAC3B,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqChB;aACM;YACD;gBACE,YAAY,EAAE,UAAU;gBACxB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhB;aACM;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,oBAAoB,GAAsB;IAC9C,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,2FAA2F;IAC7F,KAAK;QACH,OAAO;YACL,YAAY,EAAE;YACd,aAAa,EAAE;YACf;gBACE,YAAY,EAAE,aAAa;gBAC3B,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ChB;aACM;YACD;gBACE,YAAY,EAAE,UAAU;gBACxB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhB;aACM;YACD;gBACE,YAAY,EAAE,0BAA0B;gBACxC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BhB;aACM;YACD;gBACE,YAAY,EAAE,kCAAkC;gBAChD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BhB;aACM;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;IAC/C,YAAY;IACZ,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,GAAG,CAA4B;IACnD,CAAC,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC;IACzC,CAAC,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACjD,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,IAAI,CAAC;AAE5D,kDAAkD;AAClD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,iBAAiB,CAAC;IACjD,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scan/templates.ts"],"names":[],"mappings":"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"}
@@ -34,10 +34,12 @@ true, and an agent reads the relevant truths before building.
34
34
  Guidance stays in prose.
35
35
  - A node's **kind** comes from its filename prefix (`principle.density.md` →
36
36
  kind `principle`). A bare name (`voice.md`) has no kind.
37
- - The **glossary** declares the kind vocabulary, what each kind means, and optional consumption posture: `steady` by default, `posture: wild` for truths that require explicit request, or `posture: guard` for review-critical anti-goals with positive replacement.
38
- - The starter `index.md` node (id `index`) is the human-curated front door:
39
- by convention it carries the non-negotiables and reading posture, and agents
40
- pull it first.
37
+ - The **glossary** declares the kind vocabulary and what each kind means.
38
+ - The manifest's `cover` names the node `gather` inlines above the menu every
39
+ time. It carries essence, temperature, and brand-only refusals. Admission
40
+ test: a violation visible in one element belongs in that element's chapter;
41
+ visible in one view, in the composition chapter; visible only across the
42
+ whole body of work, on the cover.
41
43
  - There is **no hierarchy, no inheritance, no edges**. Directories are for browsing
42
44
  only; the model reads a flat menu.
43
45
  - **Checks** are optional review assertions in a flat `.ghost/checks/*.md`
@@ -62,27 +64,27 @@ ghost pulse # summarize local gather/pull events while tuning
62
64
 
63
65
  `gather` does no selection. It emits the menu and you read the ask against it,
64
66
  then pull the truths you judge relevant. Its header includes a coverage line —
65
- total nodes, nodes carrying concrete material, and guards — so an all-prose or
66
- unrouted fingerprint is visible before generation.
67
+ total nodes and nodes carrying concrete material — so an all-prose
68
+ fingerprint is visible before generation.
67
69
 
68
70
  Prefer `ghost pull` over reading files directly: it emits the same prose,
69
71
  inlines small local materials by default, turns binary materials into
70
- inspect-pointers, orders the packet for steering (`index`, concrete nodes,
71
- prose rules, guards), extracts Skeletons dead last, and appends structured
72
+ inspect-pointers, orders the packet for steering (cover when selected, concrete nodes,
73
+ prose rules), extracts Skeletons dead last, and appends structured
72
74
  events to `.ghost/.events` for local tuning.
73
75
 
74
76
  `review` does no grading. It assembles an advisory packet: touched files,
75
- matched material-backed nodes, matched guard nodes, offered checks, probe
77
+ matched material-backed nodes, offered checks, probe
76
78
  evidence, coverage gaps, and the diff. The host agent renders findings.
77
79
 
78
80
  ## CLI verbs
79
81
 
80
82
  | Verb | Purpose |
81
83
  |---|---|
82
- | `ghost init` | Scaffold `.ghost/` with the steering starter: manifest, glossary, `index.md`, and demo nodes for stance, composition, anti-goals, patterns, exemplars, materials, and decisions. `--template minimal` writes only the small manifest/glossary/index starter. `--with checks` also adds the checks directory. |
84
+ | `ghost init` | Scaffold `.ghost/` with the skeleton starter: manifest, glossary, a `brand.md` cover, foundation chapters, context nodes, and the cliche floor. `--template minimal` writes a smaller cover-led starter. `--with checks` also adds the checks directory. |
83
85
  | `ghost checks init` | Scaffold `.ghost/checks/` with an example review assertion. |
84
86
  | `ghost validate [file-or-dir]` | Validate manifest, nodes, material locators, check references, and glossary kind prefixes. |
85
- | `ghost gather [ask…] [--wild] [--format json]` | Emit the node menu for selection plus coverage line; log exposed ids. Default gather excludes wild kinds unless `--wild` is explicit. |
87
+ | `ghost gather [ask…] [--format json]` | Emit the node menu for selection plus coverage line; log exposed ids. |
86
88
  | `ghost pull <id> [<id>…]` | Emit selected nodes' full bodies and materials in steering order; log selected/missed ids. |
87
89
  | `ghost review [--diff <path|->] [--base <ref>] [--format json] [--no-probes]` | Emit an advisory review packet for a diff (requires `.ghost/checks/`). |
88
90
  | `ghost export [--out <path>] [--no-checks] [--strict] [--format json]` | Package `.ghost/` as a portable brand artifact and report which material locators will not travel. |
@@ -109,10 +111,11 @@ against the unpacked package with `--package <dir>`.
109
111
 
110
112
  - Author or update the fingerprint: follow [references/capture.md](references/capture.md).
111
113
  - Author material-backed nodes: follow [references/blocks.md](references/blocks.md).
114
+ - Choose which concrete code tiers the package carries: follow [references/concrete-tiers.md](references/concrete-tiers.md).
112
115
  - Choose the right human-agent authoring workflow: follow [references/authoring-scenarios.md](references/authoring-scenarios.md).
116
+ - Adapt a starter (a body or the skeleton) to your brand: follow [references/adapting-a-starter.md](references/adapting-a-starter.md).
113
117
  - Gather applicable truths for a task: follow [references/recall.md](references/recall.md).
114
118
  - Shape a pre-generation brief: follow [references/brief.md](references/brief.md).
115
- - Explore deliberate provocations with wild nodes: follow [references/wild.md](references/wild.md).
116
119
  - Probe readiness before generating: follow [references/self-check.md](references/self-check.md).
117
120
  - Audit steering coverage: follow [references/steering-audit.md](references/steering-audit.md).
118
121
  - Understand the package shape: see [references/schema.md](references/schema.md).
@@ -127,7 +130,7 @@ conventions, but durable brand truth should be curated by the human.
127
130
  A silent fingerprint does not require stopping. Proceed from nearby product
128
131
  surfaces, local conventions, and ordinary reasoning when safe, and label that
129
132
  reasoning as provisional and non-Ghost-backed — unless the fingerprint itself
130
- declares a stricter silence posture (check the `index` node), which overrides
133
+ declares a stricter silence posture (check the cover), which overrides
131
134
  this default. Ask a human before high-risk, irreversible, privacy, security,
132
135
  legal, or brand-defining choices.
133
136
 
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: adapting-a-starter
3
+ description: Transplant a starter fingerprint — a body like vessel-light or the naked skeleton — into your own brand, one procedure from manifest id to regenerated refs.
4
+ handoffs:
5
+ - label: Validate the adapted package
6
+ command: ghost validate --format json
7
+ prompt: Does the adapted fingerprint validate, and did any pruned rule orphan a check reference?
8
+ ---
9
+
10
+ # Recipe: Adapt A Starter Fingerprint
11
+
12
+ **Goal:** turn an installed starter — a full body (`ghost init --body
13
+ vessel-light`) or the naked skeleton (`ghost init`) — into *your* brand's
14
+ fingerprint without shipping a self-contradicting package.
15
+
16
+ The naked skeleton is factored by what must happen during adaptation:
17
+
18
+ | Stratum | Files | On adaptation |
19
+ | --- | --- | --- |
20
+ | Cover | `brand.md` | Write it — essence in one paragraph, temperature, and brand-only refusals. Apply the admission test to every line: a violation visible in one element belongs in that element's chapter; visible in one view, in the composition chapter; visible only across the whole body of work, here. Keep a one-screen budget and delete every scaffolding sentence when real. |
21
+ | Foundation | `foundation.*` | Answer each chapter's open section (`Palette`, `Typeface`, `Radius`, `Character`, `Warmth`), restate it as the brand's current answer, and edit misuse lists to the brand's real failure modes. |
22
+ | Context | `context.*` | Add or re-tune after the open questions are answered; context nodes state only what inverts in a matching situation. |
23
+ | Cliche floor | `cliche.*` | Prune — delete entries a foundation misuse list absorbs, delete the paired check flag with it, and replace generic entries with refusals only this brand makes. If a refusal passes the cover admission test, graduate it to `brand.md`. |
24
+ | Materials and refs | `materials/*`, referenced implementations, refs | Add or regenerate so the prose has concrete material to inspect. |
25
+ | Checks | `checks/*` | Keep paired with the nodes they enforce; delete or rewrite flags when their source rule changes. |
26
+
27
+ Do the steps **in order and in one sitting** where possible. A half-adapted
28
+ package is worse than an unadapted one: stale refs steer harder than any prose
29
+ you rewrote, so stopping before refs and checks are current ships a fingerprint
30
+ that contradicts itself.
31
+
32
+ ## The procedure
33
+
34
+ 1. **Change the manifest id.** Edit `id:` in `manifest.yml` to your brand's
35
+ name. This is deliberately first: it is the explicit act that marks the
36
+ adaptation as begun. Until it changes, the package honestly claims to be the
37
+ starter, and every consuming agent cites it as a starter default.
38
+ 2. **Write the cover.** Replace `brand.md` with the brand's essence in one
39
+ paragraph, the shared temperature of words and motion, and the refusals only
40
+ this brand makes. Test every line: a violation visible in one element moves
41
+ to that element's chapter; visible in one view, to the composition chapter;
42
+ only what shows solely across the whole body of work stays. Keep the cover
43
+ to one screen and delete every scaffolding sentence when it is real.
44
+ 3. **Answer the foundation chapters.** Walk each `foundation.*` node. Keep the
45
+ usage rules that describe the closed vocabulary; answer the open section as
46
+ the brand's current answer. Ask the human for undecided values; never
47
+ freehand a value and present it as brand-backed. Edit each misuse list to the
48
+ failures this brand actually needs to avoid.
49
+ 4. **Add or edit materials.** Record literal values where the implementation or
50
+ asset materials live, then add `materials` locators to the nodes that explain
51
+ them. Role names can stay stable while values change. The point is that a
52
+ realizing agent can inspect the same concrete source the prose governs.
53
+ 5. **Re-tune contexts.** Revisit each `context.*` node after the foundation
54
+ answers exist. Keep only inversions that apply in that situation; delete
55
+ generic foundation rules repeated there, and add new contexts only when a
56
+ task situation truly bends the defaults.
57
+ 6. **Prune `cliche.median`.** Each rule is a `###` heading section; delete the
58
+ whole section for every rule a foundation misuse list now absorbs or your
59
+ brand legitimately violates. Do not rewrite surviving measured defaults into
60
+ taste. Then run `ghost validate`: every check reference orphaned by a pruned
61
+ heading surfaces as its own warning — delete the paired flag and its
62
+ reference from the check.
63
+ 7. **Regenerate refs.** Exemplars dominate prose: a prose rule contradicted by a
64
+ stale ref loses. Rebuild each ref against the new values and chapter answers,
65
+ keep any annotation headers current, and make each ref demonstrate its closed
66
+ sets completely. If the starter shipped no refs, generate them now — a
67
+ fingerprint with no exemplars steers at half strength.
68
+ 8. **Rewrite checks and near-miss nodes.** For each answered foundation chapter,
69
+ name the failure mode one step away from the answer and its replacement. Put
70
+ pre-generation guidance in nodes and review assertions in `checks/`; never
71
+ leave a check that asserts an obligation no node states.
72
+ 9. **Re-run the checks, including against refs.** `ghost validate` for package
73
+ shape, then review the regenerated refs against the median and value checks
74
+ (stage the ref changes and run `ghost review`). The floor only holds if the
75
+ refs hold it too: a ref that trips a median flag will teach every future
76
+ generation the violation.
77
+
78
+ ## Consuming an unadapted starter
79
+
80
+ Work does not block on adaptation. Before the procedure runs (or midway through
81
+ it), cite starter content honestly:
82
+
83
+ - Cover scaffolding and unanswered foundation sections: **provisional** — never
84
+ plain brand truth.
85
+ - Foundation usage rules: **Ghost-backed starter structure** until the human
86
+ answers the open sections and edits the misuse lists.
87
+ - Surviving median rules: **owner-backed after init** — Ghost stamps this
88
+ measured model truth into every initialized package; you own the pruning and
89
+ any adaptation thereafter.
90
+ - Context nodes: **conditional** — read only when their situation matches, and
91
+ revisit them after the foundation answers change.
92
+ - The manifest id tells you which state you are in: a starter id means
93
+ unadapted.
94
+
95
+ ## Never
96
+
97
+ - Never leave cover scaffolding in a real fingerprint.
98
+ - Never present your provisional value as the brand's answer.
99
+ - Never leave stale refs alongside new values — regenerate or delete; a stale
100
+ exemplar outweighs rewritten prose.
101
+ - Never prune a median rule without deleting its paired check flag, or keep a
102
+ check that asserts an obligation no node states.
103
+ - Never pre-write the manifest id change into automation — it is the human's
104
+ act of ownership, the one step an agent should not take alone.
@@ -79,14 +79,14 @@ says which.
79
79
 
80
80
  Counter-exemplars are as valuable as exemplars when they name the replacement.
81
81
  "We would never ship this; we would ship that instead" with artifacts attached
82
- usually yields a sharper guard than an hour of affirmative description. Avoid
82
+ usually yields a sharper anti-goal than an hour of affirmative description. Avoid
83
83
  blacklist-only anti-goals: the rejected pattern should be purged from exemplars
84
84
  and enforced in review, not repeated as the model's main example.
85
85
 
86
86
  ## 4. Draft The Nodes
87
87
 
88
88
  Write the smallest useful set of nodes, each a purpose-coherent prose truth with
89
- a one-line `description`, named `<kind>.<slug>.md` (or a bare slug when no kind is present). Ask three questions of each body: why (the stance), with what
89
+ a one-line `description`, named `<kind>.<slug>.md` (or a bare slug when no kind is present). Ask three questions of each node body: why (the stance), with what
90
90
  (the materials), and how it is assembled (the patterns). These are drafting
91
91
  prompts, not fields.
92
92
 
@@ -114,9 +114,7 @@ Two authoring decisions replace any notion of hierarchy:
114
114
 
115
115
  - **Kind** — declare the kind vocabulary in `glossary.md` and name each node
116
116
  `<kind>.<slug>.md` so its normative weight is clear. The glossary defines what
117
- each kind means and how strongly it binds. Use `posture: guard` for
118
- review-critical replacement nodes, `posture: wild` for opt-in provocations,
119
- and the default steady posture for ordinary truths. Kinds are your choice;
117
+ each kind means and how strongly it binds. Kinds are your choice;
120
118
  Ghost ships no fixed vocabulary.
121
119
  - **Altitude** — state a truth at the level it is actually true. Universal → state
122
120
  it plainly. Narrower → name the situation that activates it, in the prose. Never
@@ -134,6 +132,45 @@ prefix is a declared glossary kind (undeclared → warning with a "did you
134
132
  mean" suggestion). Use ordinary Git review as the approval boundary: uncommitted
135
133
  edits are drafts; checked-in nodes are canonical.
136
134
 
135
+ ## Shapes Of A Useful Node
136
+
137
+ The shapes below teach what steering prose looks like when it works. The
138
+ examples use **Morrow Ledger**, a fictional bookkeeping product — teaching
139
+ fiction for this recipe only, never content for a real corpus. Each shape is a
140
+ pattern to imitate with the human's real truths.
141
+
142
+ - **Stance as forced choices.** Not adjectives — decisions under pressure:
143
+ "Clarity beats momentum: write '3 invoices are 14+ days late', not 'Cash
144
+ flow needs attention.'" A stance earns its place when it rejects a plausible
145
+ wrong answer.
146
+ - **Composition floor.** Hard invariants with numbers, holding unless a
147
+ narrower condition says otherwise: "Maximum three figures above the fold —
148
+ if there are four, demote one into details instead of shrinking type."
149
+ - **Anti-goal as not-X-instead-Y.** The rejected default *and* its committed
150
+ replacement: "Not 'Revenue is up 24% 🎉' — instead 'July receipts are $4,820
151
+ higher than June; 2 invoices explain most of the change.'" A bare ban prunes
152
+ one path; the replacement commits another.
153
+ - **Pattern as bound/open.** Say what is decided and what remains free:
154
+ "Bound: status line first, one sentence, ≤11 words; one primary next step
155
+ last. Open: evidence may be a table row or a two-item list." All bound is a
156
+ template; nothing bound is vibes.
157
+ - **Annotated exemplar.** A concrete reference plus what it is normative for
158
+ and what is incidental: "Copy the square edge, measured evidence, and action
159
+ cost. Do not copy the exact amounts or dates." An unannotated exemplar
160
+ teaches its accidents as brand.
161
+ - **Material inventory.** `materials` locates; prose explains meaning:
162
+ "`src/styles/tokens.css` should define the ink, ledger, amber, and paper
163
+ colors." Never duplicate API docs unless the API itself is the brand truth.
164
+ - **Decision trace.** A worked tradeoff with the reversal condition: "We chose
165
+ visible evidence over shorter surfaces… Reverses when the evidence would
166
+ expose sensitive third-party details — then show the count only." Models
167
+ imitate reasoning as well as outputs.
168
+
169
+ State the silence posture on the manifest-declared cover, which `gather`
170
+ inlines for every task: when the fingerprint is silent, proceed provisionally
171
+ from local conventions only when safe, and ask before brand-defining,
172
+ irreversible, legal, privacy-sensitive, or high-risk choices.
173
+
137
174
  ## Never
138
175
 
139
176
  - Never derive brand truth from repo code alone; what the codebase repeats may
@@ -57,7 +57,7 @@ Neither is correct. A concrete block node is a deliberate trade, not a leak.
57
57
  reasoning, sources…) earns **one short prose body**. This is what the method is
58
58
  for.
59
59
  - The **composer middle** (card, table, form, sidebar…) is a call to weigh. Give
60
- it a body when its arrangement carries a stance worth matching.
60
+ it a prose body when its arrangement carries a stance worth matching.
61
61
 
62
62
  If a primitive ever seems to need stance guidance, that is a signal it is doing
63
63
  a composer's job. Promote the pattern into a node; do not write a body on the
@@ -9,9 +9,8 @@ A brief is an ephemeral steering packet for the generating pass. It is not a new
9
9
  schema and is never written back into `.ghost/`.
10
10
 
11
11
  1. Run `ghost gather <ask> --format json` and select against descriptions.
12
- 2. Pull a small set: **3–5 nodes is normal; 10 is a bad selection** unless the
13
- task is unusually broad. Always include `index` unless already read this
14
- session.
12
+ 2. The cover is already in context. Pull a small set from the menu: **3–5 nodes
13
+ is normal; 10 is a bad selection** unless the task is unusually broad.
15
14
  3. Prefer concrete nodes: `materials`, substantial fenced examples, or a
16
15
  `## Skeleton`. If there is **no concrete material for this surface**, the
17
16
  readiness ceiling is **Yellow**.
@@ -42,8 +41,8 @@ Rules:
42
41
 
43
42
  - Do not add sections for every kind. Sections dilute instruction weight.
44
43
  - Treat `ghost pull` ordering as signal: stance first, concrete material next,
45
- prose rules, guards late, Skeletons dead last.
44
+ prose rules, Skeletons dead last.
46
45
  - If a pulled Skeleton matches the surface, begin the artifact from it verbatim
47
46
  before filling.
48
- - Guards (`posture: guard`) are review-critical anti-goals: state the positive
49
- replacement, not just the rejected pattern.
47
+ - Anti-goals are review-critical: state the positive replacement, not just the
48
+ rejected pattern.