@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.
- package/README.md +47 -33
- package/dist/commands/checks-command.d.ts.map +1 -1
- package/dist/commands/checks-command.js +8 -1
- package/dist/commands/checks-command.js.map +1 -1
- package/dist/commands/fingerprint-commands.d.ts.map +1 -1
- package/dist/commands/fingerprint-commands.js +1 -6
- package/dist/commands/fingerprint-commands.js.map +1 -1
- package/dist/commands/gather-command.d.ts.map +1 -1
- package/dist/commands/gather-command.js +26 -30
- package/dist/commands/gather-command.js.map +1 -1
- package/dist/commands/init-command.d.ts.map +1 -1
- package/dist/commands/init-command.js +23 -13
- package/dist/commands/init-command.js.map +1 -1
- package/dist/commands/pull-command.d.ts.map +1 -1
- package/dist/commands/pull-command.js +12 -19
- package/dist/commands/pull-command.js.map +1 -1
- package/dist/commands/pulse-command.js +1 -10
- package/dist/commands/pulse-command.js.map +1 -1
- package/dist/commands/review-command.d.ts.map +1 -1
- package/dist/commands/review-command.js +1 -0
- package/dist/commands/review-command.js.map +1 -1
- package/dist/ghost-core/catalog/assemble.d.ts +0 -4
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
- package/dist/ghost-core/catalog/assemble.js +0 -10
- package/dist/ghost-core/catalog/assemble.js.map +1 -1
- package/dist/ghost-core/catalog/index.d.ts +1 -1
- package/dist/ghost-core/catalog/index.d.ts.map +1 -1
- package/dist/ghost-core/catalog/index.js +1 -1
- package/dist/ghost-core/catalog/index.js.map +1 -1
- package/dist/ghost-core/catalog/menu.d.ts +1 -11
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
- package/dist/ghost-core/catalog/menu.js +1 -6
- package/dist/ghost-core/catalog/menu.js.map +1 -1
- package/dist/ghost-core/catalog/types.d.ts +0 -6
- package/dist/ghost-core/catalog/types.d.ts.map +1 -1
- package/dist/ghost-core/glossary.d.ts +0 -13
- package/dist/ghost-core/glossary.d.ts.map +1 -1
- package/dist/ghost-core/glossary.js +0 -7
- package/dist/ghost-core/glossary.js.map +1 -1
- package/dist/ghost-core/index.d.ts +2 -2
- package/dist/ghost-core/index.d.ts.map +1 -1
- package/dist/ghost-core/index.js +1 -1
- package/dist/ghost-core/index.js.map +1 -1
- package/dist/ghost-core/package-manifest.d.ts +7 -0
- package/dist/ghost-core/package-manifest.d.ts.map +1 -1
- package/dist/ghost-core/package-manifest.js +10 -0
- package/dist/ghost-core/package-manifest.js.map +1 -1
- package/dist/init-payloads/median/cliche.median.md +86 -0
- package/dist/init-payloads/median/median-tells.md +117 -0
- package/dist/init-payloads/skeleton/brand.md +22 -0
- package/dist/init-payloads/skeleton/context.conversation.md +24 -0
- package/dist/init-payloads/skeleton/foundation.color.md +39 -0
- package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
- package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
- package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
- package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
- package/dist/init-payloads/skeleton/foundation.type.md +44 -0
- package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
- package/dist/init-payloads/skeleton/glossary.md +39 -0
- package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
- package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
- package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
- package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
- package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
- package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
- package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
- package/dist/init-payloads/vessel-light/checks/values.md +51 -0
- package/dist/init-payloads/vessel-light/glossary.md +44 -0
- package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
- package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
- package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
- package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
- package/dist/init-payloads/vessel-light/index.md +33 -0
- package/dist/init-payloads/vessel-light/manifest.yml +3 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
- package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
- package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
- package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
- package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
- package/dist/init-payloads/vessel-light/register.email.md +43 -0
- package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
- package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
- package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
- package/dist/init-payloads/vessel-light/signature.type.md +37 -0
- package/dist/observability-events.d.ts +0 -3
- package/dist/observability-events.d.ts.map +1 -1
- package/dist/observability-events.js.map +1 -1
- package/dist/review/resolve.d.ts +3 -4
- package/dist/review/resolve.d.ts.map +1 -1
- package/dist/review/resolve.js +12 -9
- package/dist/review/resolve.js.map +1 -1
- package/dist/review/review-packet.d.ts +2 -1
- package/dist/review/review-packet.d.ts.map +1 -1
- package/dist/review/review-packet.js +9 -20
- package/dist/review/review-packet.js.map +1 -1
- package/dist/scan/check-files.d.ts.map +1 -1
- package/dist/scan/check-files.js +0 -15
- package/dist/scan/check-files.js.map +1 -1
- package/dist/scan/check-scaffold.d.ts +1 -0
- package/dist/scan/check-scaffold.d.ts.map +1 -1
- package/dist/scan/check-scaffold.js +17 -1
- package/dist/scan/check-scaffold.js.map +1 -1
- package/dist/scan/fingerprint-package-lint.d.ts +8 -0
- package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-lint.js +284 -0
- package/dist/scan/fingerprint-package-lint.js.map +1 -0
- package/dist/scan/fingerprint-package-loader.d.ts.map +1 -1
- package/dist/scan/fingerprint-package-loader.js +2 -29
- package/dist/scan/fingerprint-package-loader.js.map +1 -1
- package/dist/scan/fingerprint-package.d.ts +16 -8
- package/dist/scan/fingerprint-package.d.ts.map +1 -1
- package/dist/scan/fingerprint-package.js +41 -241
- package/dist/scan/fingerprint-package.js.map +1 -1
- package/dist/scan/node-files.d.ts.map +1 -1
- package/dist/scan/node-files.js +1 -3
- package/dist/scan/node-files.js.map +1 -1
- package/dist/scan/packed-payloads.d.ts +4 -0
- package/dist/scan/packed-payloads.d.ts.map +1 -0
- package/dist/scan/packed-payloads.js +55 -0
- package/dist/scan/packed-payloads.js.map +1 -0
- package/dist/scan/templates.d.ts +20 -2
- package/dist/scan/templates.d.ts.map +1 -1
- package/dist/scan/templates.js +106 -26
- package/dist/scan/templates.js.map +1 -1
- package/dist/skill-bundle/SKILL.md +16 -13
- package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
- package/dist/skill-bundle/references/authoring-scenarios.md +42 -5
- package/dist/skill-bundle/references/blocks.md +1 -1
- package/dist/skill-bundle/references/brief.md +5 -6
- package/dist/skill-bundle/references/capture.md +52 -41
- package/dist/skill-bundle/references/concrete-tiers.md +95 -0
- package/dist/skill-bundle/references/recall.md +6 -12
- package/dist/skill-bundle/references/schema.md +15 -24
- package/dist/skill-bundle/references/self-check.md +2 -2
- package/dist/skill-bundle/references/steering-audit.md +7 -10
- package/package.json +2 -2
- package/dist/scan/steering-template.d.ts +0 -8
- package/dist/scan/steering-template.d.ts.map +0 -1
- package/dist/scan/steering-template.js +0 -266
- package/dist/scan/steering-template.js.map +0 -1
- package/dist/skill-bundle/references/wild.md +0 -30
package/dist/scan/templates.js
CHANGED
|
@@ -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 {
|
|
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`
|
|
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
|
|
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.
|
|
86
|
-
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
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
|
|
277
|
-
|
|
278
|
-
|
|
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
|
-
[
|
|
331
|
+
[SKELETON_TEMPLATE.name, SKELETON_TEMPLATE],
|
|
284
332
|
]);
|
|
285
|
-
|
|
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
|
-
|
|
289
|
-
|
|
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,
|
|
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
|
|
38
|
-
- The
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
66
|
-
|
|
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 (
|
|
71
|
-
prose rules
|
|
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,
|
|
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
|
|
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…] [--
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
13
|
-
|
|
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,
|
|
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
|
-
-
|
|
49
|
-
|
|
47
|
+
- Anti-goals are review-critical: state the positive replacement, not just the
|
|
48
|
+
rejected pattern.
|