@design-intelligence/ghost 0.0.0-next-20260715121453
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/LICENSE +201 -0
- package/README.md +89 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +19 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/checks-command.d.ts +9 -0
- package/dist/commands/checks-command.d.ts.map +1 -0
- package/dist/commands/checks-command.js +52 -0
- package/dist/commands/checks-command.js.map +1 -0
- package/dist/commands/command-discovery.d.ts +57 -0
- package/dist/commands/command-discovery.d.ts.map +1 -0
- package/dist/commands/command-discovery.js +220 -0
- package/dist/commands/command-discovery.js.map +1 -0
- package/dist/commands/errors.d.ts +7 -0
- package/dist/commands/errors.d.ts.map +1 -0
- package/dist/commands/errors.js +19 -0
- package/dist/commands/errors.js.map +1 -0
- package/dist/commands/export-command.d.ts +3 -0
- package/dist/commands/export-command.d.ts.map +1 -0
- package/dist/commands/export-command.js +157 -0
- package/dist/commands/export-command.js.map +1 -0
- package/dist/commands/fingerprint-commands.d.ts +10 -0
- package/dist/commands/fingerprint-commands.d.ts.map +1 -0
- package/dist/commands/fingerprint-commands.js +69 -0
- package/dist/commands/fingerprint-commands.js.map +1 -0
- package/dist/commands/gather-command.d.ts +3 -0
- package/dist/commands/gather-command.d.ts.map +1 -0
- package/dist/commands/gather-command.js +214 -0
- package/dist/commands/gather-command.js.map +1 -0
- package/dist/commands/init-command.d.ts +3 -0
- package/dist/commands/init-command.d.ts.map +1 -0
- package/dist/commands/init-command.js +89 -0
- package/dist/commands/init-command.js.map +1 -0
- package/dist/commands/manifest-command.d.ts +9 -0
- package/dist/commands/manifest-command.d.ts.map +1 -0
- package/dist/commands/manifest-command.js +33 -0
- package/dist/commands/manifest-command.js.map +1 -0
- package/dist/commands/pull-command.d.ts +3 -0
- package/dist/commands/pull-command.d.ts.map +1 -0
- package/dist/commands/pull-command.js +230 -0
- package/dist/commands/pull-command.js.map +1 -0
- package/dist/commands/pulse-command.d.ts +3 -0
- package/dist/commands/pulse-command.d.ts.map +1 -0
- package/dist/commands/pulse-command.js +248 -0
- package/dist/commands/pulse-command.js.map +1 -0
- package/dist/commands/review-command.d.ts +3 -0
- package/dist/commands/review-command.d.ts.map +1 -0
- package/dist/commands/review-command.js +78 -0
- package/dist/commands/review-command.js.map +1 -0
- package/dist/commands/skill-command.d.ts +3 -0
- package/dist/commands/skill-command.d.ts.map +1 -0
- package/dist/commands/skill-command.js +96 -0
- package/dist/commands/skill-command.js.map +1 -0
- package/dist/fingerprint.d.ts +5 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +3 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/ghost-core/catalog/assemble.d.ts +26 -0
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -0
- package/dist/ghost-core/catalog/assemble.js +29 -0
- package/dist/ghost-core/catalog/assemble.js.map +1 -0
- package/dist/ghost-core/catalog/closest.d.ts +16 -0
- package/dist/ghost-core/catalog/closest.d.ts.map +1 -0
- package/dist/ghost-core/catalog/closest.js +63 -0
- package/dist/ghost-core/catalog/closest.js.map +1 -0
- package/dist/ghost-core/catalog/index.d.ts +10 -0
- package/dist/ghost-core/catalog/index.d.ts.map +1 -0
- package/dist/ghost-core/catalog/index.js +9 -0
- package/dist/ghost-core/catalog/index.js.map +1 -0
- package/dist/ghost-core/catalog/menu.d.ts +28 -0
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -0
- package/dist/ghost-core/catalog/menu.js +23 -0
- package/dist/ghost-core/catalog/menu.js.map +1 -0
- package/dist/ghost-core/catalog/types.d.ts +33 -0
- package/dist/ghost-core/catalog/types.d.ts.map +1 -0
- package/dist/ghost-core/catalog/types.js +2 -0
- package/dist/ghost-core/catalog/types.js.map +1 -0
- package/dist/ghost-core/check/index.d.ts +12 -0
- package/dist/ghost-core/check/index.d.ts.map +1 -0
- package/dist/ghost-core/check/index.js +12 -0
- package/dist/ghost-core/check/index.js.map +1 -0
- package/dist/ghost-core/check/lint.d.ts +9 -0
- package/dist/ghost-core/check/lint.d.ts.map +1 -0
- package/dist/ghost-core/check/lint.js +119 -0
- package/dist/ghost-core/check/lint.js.map +1 -0
- package/dist/ghost-core/check/load.d.ts +7 -0
- package/dist/ghost-core/check/load.d.ts.map +1 -0
- package/dist/ghost-core/check/load.js +44 -0
- package/dist/ghost-core/check/load.js.map +1 -0
- package/dist/ghost-core/check/parse.d.ts +12 -0
- package/dist/ghost-core/check/parse.d.ts.map +1 -0
- package/dist/ghost-core/check/parse.js +13 -0
- package/dist/ghost-core/check/parse.js.map +1 -0
- package/dist/ghost-core/check/source-ref.d.ts +27 -0
- package/dist/ghost-core/check/source-ref.d.ts.map +1 -0
- package/dist/ghost-core/check/source-ref.js +58 -0
- package/dist/ghost-core/check/source-ref.js.map +1 -0
- package/dist/ghost-core/check/types.d.ts +48 -0
- package/dist/ghost-core/check/types.d.ts.map +1 -0
- package/dist/ghost-core/check/types.js +4 -0
- package/dist/ghost-core/check/types.js.map +1 -0
- package/dist/ghost-core/errors.d.ts +30 -0
- package/dist/ghost-core/errors.d.ts.map +1 -0
- package/dist/ghost-core/errors.js +33 -0
- package/dist/ghost-core/errors.js.map +1 -0
- package/dist/ghost-core/glob.d.ts +5 -0
- package/dist/ghost-core/glob.d.ts.map +1 -0
- package/dist/ghost-core/glob.js +68 -0
- package/dist/ghost-core/glob.js.map +1 -0
- package/dist/ghost-core/glossary.d.ts +25 -0
- package/dist/ghost-core/glossary.d.ts.map +1 -0
- package/dist/ghost-core/glossary.js +69 -0
- package/dist/ghost-core/glossary.js.map +1 -0
- package/dist/ghost-core/index.d.ts +13 -0
- package/dist/ghost-core/index.d.ts.map +1 -0
- package/dist/ghost-core/index.js +19 -0
- package/dist/ghost-core/index.js.map +1 -0
- package/dist/ghost-core/markdown.d.ts +15 -0
- package/dist/ghost-core/markdown.d.ts.map +1 -0
- package/dist/ghost-core/markdown.js +30 -0
- package/dist/ghost-core/markdown.js.map +1 -0
- package/dist/ghost-core/material-transport.d.ts +43 -0
- package/dist/ghost-core/material-transport.d.ts.map +1 -0
- package/dist/ghost-core/material-transport.js +231 -0
- package/dist/ghost-core/material-transport.js.map +1 -0
- package/dist/ghost-core/materials.d.ts +14 -0
- package/dist/ghost-core/materials.d.ts.map +1 -0
- package/dist/ghost-core/materials.js +52 -0
- package/dist/ghost-core/materials.js.map +1 -0
- package/dist/ghost-core/node/index.d.ts +11 -0
- package/dist/ghost-core/node/index.d.ts.map +1 -0
- package/dist/ghost-core/node/index.js +11 -0
- package/dist/ghost-core/node/index.js.map +1 -0
- package/dist/ghost-core/node/parse.d.ts +16 -0
- package/dist/ghost-core/node/parse.d.ts.map +1 -0
- package/dist/ghost-core/node/parse.js +55 -0
- package/dist/ghost-core/node/parse.js.map +1 -0
- package/dist/ghost-core/node/schema.d.ts +17 -0
- package/dist/ghost-core/node/schema.d.ts.map +1 -0
- package/dist/ghost-core/node/schema.js +49 -0
- package/dist/ghost-core/node/schema.js.map +1 -0
- package/dist/ghost-core/node/serialize.d.ts +12 -0
- package/dist/ghost-core/node/serialize.d.ts.map +1 -0
- package/dist/ghost-core/node/serialize.js +39 -0
- package/dist/ghost-core/node/serialize.js.map +1 -0
- package/dist/ghost-core/node/steering.d.ts +19 -0
- package/dist/ghost-core/node/steering.d.ts.map +1 -0
- package/dist/ghost-core/node/steering.js +68 -0
- package/dist/ghost-core/node/steering.js.map +1 -0
- package/dist/ghost-core/node/types.d.ts +43 -0
- package/dist/ghost-core/node/types.d.ts.map +1 -0
- package/dist/ghost-core/node/types.js +2 -0
- package/dist/ghost-core/node/types.js.map +1 -0
- package/dist/ghost-core/package-manifest.d.ts +19 -0
- package/dist/ghost-core/package-manifest.d.ts.map +1 -0
- package/dist/ghost-core/package-manifest.js +24 -0
- package/dist/ghost-core/package-manifest.js.map +1 -0
- package/dist/ghost-core/skill-bundle-loader.d.ts +28 -0
- package/dist/ghost-core/skill-bundle-loader.d.ts.map +1 -0
- package/dist/ghost-core/skill-bundle-loader.js +51 -0
- package/dist/ghost-core/skill-bundle-loader.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- 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 +23 -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/internal/fs.d.ts +4 -0
- package/dist/internal/fs.d.ts.map +1 -0
- package/dist/internal/fs.js +24 -0
- package/dist/internal/fs.js.map +1 -0
- package/dist/observability-events.d.ts +34 -0
- package/dist/observability-events.d.ts.map +1 -0
- package/dist/observability-events.js +68 -0
- package/dist/observability-events.js.map +1 -0
- package/dist/package-version.d.ts +3 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +10 -0
- package/dist/package-version.js.map +1 -0
- package/dist/review/baseline.d.ts +11 -0
- package/dist/review/baseline.d.ts.map +1 -0
- package/dist/review/baseline.js +35 -0
- package/dist/review/baseline.js.map +1 -0
- package/dist/review/diff.d.ts +7 -0
- package/dist/review/diff.d.ts.map +1 -0
- package/dist/review/diff.js +41 -0
- package/dist/review/diff.js.map +1 -0
- package/dist/review/glob.d.ts +2 -0
- package/dist/review/glob.d.ts.map +1 -0
- package/dist/review/glob.js +2 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/probes.d.ts +13 -0
- package/dist/review/probes.d.ts.map +1 -0
- package/dist/review/probes.js +45 -0
- package/dist/review/probes.js.map +1 -0
- package/dist/review/resolve.d.ts +28 -0
- package/dist/review/resolve.d.ts.map +1 -0
- package/dist/review/resolve.js +90 -0
- package/dist/review/resolve.js.map +1 -0
- package/dist/review/review-packet.d.ts +41 -0
- package/dist/review/review-packet.d.ts.map +1 -0
- package/dist/review/review-packet.js +128 -0
- package/dist/review/review-packet.js.map +1 -0
- package/dist/scan/check-files.d.ts +23 -0
- package/dist/scan/check-files.d.ts.map +1 -0
- package/dist/scan/check-files.js +75 -0
- package/dist/scan/check-files.js.map +1 -0
- package/dist/scan/check-scaffold.d.ts +8 -0
- package/dist/scan/check-scaffold.d.ts.map +1 -0
- package/dist/scan/check-scaffold.js +53 -0
- package/dist/scan/check-scaffold.js.map +1 -0
- package/dist/scan/constants.d.ts +21 -0
- package/dist/scan/constants.d.ts.map +1 -0
- package/dist/scan/constants.js +21 -0
- package/dist/scan/constants.js.map +1 -0
- package/dist/scan/file-kind.d.ts +12 -0
- package/dist/scan/file-kind.d.ts.map +1 -0
- package/dist/scan/file-kind.js +114 -0
- package/dist/scan/file-kind.js.map +1 -0
- 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 +5 -0
- package/dist/scan/fingerprint-package-loader.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-loader.js +78 -0
- package/dist/scan/fingerprint-package-loader.js.map +1 -0
- package/dist/scan/fingerprint-package.d.ts +66 -0
- package/dist/scan/fingerprint-package.d.ts.map +1 -0
- package/dist/scan/fingerprint-package.js +101 -0
- package/dist/scan/fingerprint-package.js.map +1 -0
- package/dist/scan/index.d.ts +3 -0
- package/dist/scan/index.d.ts.map +1 -0
- package/dist/scan/index.js +3 -0
- package/dist/scan/index.js.map +1 -0
- package/dist/scan/lint.d.ts +15 -0
- package/dist/scan/lint.d.ts.map +1 -0
- package/dist/scan/lint.js +2 -0
- package/dist/scan/lint.js.map +1 -0
- package/dist/scan/node-files.d.ts +25 -0
- package/dist/scan/node-files.d.ts.map +1 -0
- package/dist/scan/node-files.js +112 -0
- package/dist/scan/node-files.js.map +1 -0
- package/dist/scan/package-paths.d.ts +10 -0
- package/dist/scan/package-paths.d.ts.map +1 -0
- package/dist/scan/package-paths.js +49 -0
- package/dist/scan/package-paths.js.map +1 -0
- 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/tarball.d.ts +23 -0
- package/dist/scan/tarball.d.ts.map +1 -0
- package/dist/scan/tarball.js +145 -0
- package/dist/scan/tarball.js.map +1 -0
- package/dist/scan/templates.d.ts +42 -0
- package/dist/scan/templates.d.ts.map +1 -0
- package/dist/scan/templates.js +375 -0
- package/dist/scan/templates.js.map +1 -0
- package/dist/skill-bundle/SKILL.md +146 -0
- package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
- package/dist/skill-bundle/references/authoring-scenarios.md +184 -0
- package/dist/skill-bundle/references/blocks.md +179 -0
- package/dist/skill-bundle/references/brief.md +50 -0
- package/dist/skill-bundle/references/capture.md +392 -0
- package/dist/skill-bundle/references/concrete-tiers.md +95 -0
- package/dist/skill-bundle/references/recall.md +36 -0
- package/dist/skill-bundle/references/schema.md +114 -0
- package/dist/skill-bundle/references/self-check.md +65 -0
- package/dist/skill-bundle/references/steering-audit.md +60 -0
- package/package.json +79 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: authoring-scenarios
|
|
3
|
+
description: Choose the right human-agent workflow for authoring Ghost brand fingerprints.
|
|
4
|
+
handoffs:
|
|
5
|
+
- label: Validate the fingerprint
|
|
6
|
+
command: ghost validate --format json
|
|
7
|
+
prompt: Classify this fingerprint's authoring scenario and confirm the package validates.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Recipe: Collaborative Fingerprint Authoring
|
|
11
|
+
|
|
12
|
+
**Goal:** help a human and agent co-author durable brand truths through
|
|
13
|
+
conversation — without laundering what a codebase happens to do into what the
|
|
14
|
+
brand means.
|
|
15
|
+
|
|
16
|
+
The fingerprint is medium-agnostic and is not derived from a repo. Its raw
|
|
17
|
+
material is **elicitation**: what the human says, shows, and points at — words,
|
|
18
|
+
screenshots, links, exemplar products, marketing copy, a competitor they define
|
|
19
|
+
themselves against. Agent synthesis is draft work until the human curates it
|
|
20
|
+
and ordinary Git review accepts it.
|
|
21
|
+
|
|
22
|
+
Repo-bound reality — components, tokens, paths, building blocks — can be
|
|
23
|
+
recorded as `materials` on the node whose prose explains their purpose. When a
|
|
24
|
+
conversation surfaces "we have a component for that," treat it as material to
|
|
25
|
+
locate and interpret, not as brand truth by itself.
|
|
26
|
+
|
|
27
|
+
## 1. Start With One Repeated Decision
|
|
28
|
+
|
|
29
|
+
Do not try to fingerprint the whole brand at once. Ask the human for the one
|
|
30
|
+
decision whose feedback keeps repeating — the checkout always flagged for
|
|
31
|
+
trust, the voice always re-toned, the empty state always rewritten — and
|
|
32
|
+
capture that one truth as a node first. One high-confidence truth beats an
|
|
33
|
+
empty catalog; the fingerprint grows as the next repeated decision shows up.
|
|
34
|
+
|
|
35
|
+
The scenario below tunes the authoring *posture* for that first node; it is not
|
|
36
|
+
a gate to clear before writing anything.
|
|
37
|
+
|
|
38
|
+
| Scenario | Default authoring posture |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| Net new brand | Stance-first. Elicit feel, audience, and early anti-goals before anything else exists to point at. |
|
|
41
|
+
| Established brand, first fingerprint | Artifact-rich interview. The human can show a lot — shipped surfaces, brand docs, campaigns. Elicit which of it is *intentional*. |
|
|
42
|
+
| Strong opinions, weak articulation | Example-led. The human knows it when they see it: work from exemplars and counter-exemplars ("this feels like us, this never would") toward the stance underneath. |
|
|
43
|
+
| Brand doc or design-language deck exists | Distillation. The document is testimony, not truth: pull the claims that actually steer decisions, drop the aspirational filler, and have the human ratify each survivor. |
|
|
44
|
+
| Rebrand, redesign, migration | Transition-led. Capture current, target, and what must not be lost in between. |
|
|
45
|
+
| Fork, white label, tenant variant | Shared base + local divergence. Keep common truths broad; scope divergence with conditions. |
|
|
46
|
+
| Monorepo or product suite | One contract per package. |
|
|
47
|
+
|
|
48
|
+
If more than one applies, start with the broad scenario, then narrow.
|
|
49
|
+
|
|
50
|
+
## 2. Interview The Human
|
|
51
|
+
|
|
52
|
+
The interview is the engine. Ask only high-leverage questions that change the
|
|
53
|
+
fingerprint:
|
|
54
|
+
|
|
55
|
+
- What should this brand feel like, and what should it never become? (The
|
|
56
|
+
"never become" answers are anti-goal nodes — capture them with the same care
|
|
57
|
+
as the affirmative stance.)
|
|
58
|
+
- Who is the audience, and what are they trying to get done?
|
|
59
|
+
- Which surfaces, campaigns, or moments show the brand at its best? Show me.
|
|
60
|
+
- Which brand or product do you admire — and where do you deliberately differ?
|
|
61
|
+
(The deliberate differences also route to anti-goal nodes: the rejected
|
|
62
|
+
neighbor, named.)
|
|
63
|
+
- What keeps getting flagged in review, re-toned, or rewritten?
|
|
64
|
+
- Where do trust, density, pacing, accessibility, recovery, or disclosure
|
|
65
|
+
matter most?
|
|
66
|
+
- Which truths are universal, and which only hold under a specific situation?
|
|
67
|
+
|
|
68
|
+
Capture human-authored or human-approved answers as nodes. Do not treat
|
|
69
|
+
unapproved notes as canonical.
|
|
70
|
+
|
|
71
|
+
## 3. Work The Material The Human Brings
|
|
72
|
+
|
|
73
|
+
Ask for artifacts and read them closely: screenshots, links, exemplar products,
|
|
74
|
+
brand docs, marketing copy, past campaigns, a rejected design and why it was
|
|
75
|
+
rejected. Treat every artifact as *testimony* — evidence of a stance the human
|
|
76
|
+
holds — never as truth by itself. A pattern that appears everywhere may be
|
|
77
|
+
legacy; a pattern that appears once may be the brand at its best. The human
|
|
78
|
+
says which.
|
|
79
|
+
|
|
80
|
+
Counter-exemplars are as valuable as exemplars when they name the replacement.
|
|
81
|
+
"We would never ship this; we would ship that instead" with artifacts attached
|
|
82
|
+
usually yields a sharper anti-goal than an hour of affirmative description. Avoid
|
|
83
|
+
blacklist-only anti-goals: the rejected pattern should be purged from exemplars
|
|
84
|
+
and enforced in review, not repeated as the model's main example.
|
|
85
|
+
|
|
86
|
+
## 4. Draft The Nodes
|
|
87
|
+
|
|
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 node body: why (the stance), with what
|
|
90
|
+
(the materials), and how it is assembled (the patterns). These are drafting
|
|
91
|
+
prompts, not fields.
|
|
92
|
+
|
|
93
|
+
Draft only what the human said or showed. State universal truths plainly; give
|
|
94
|
+
narrower truths a **condition** in the prose — the situation they apply in,
|
|
95
|
+
never a destination. Label uncertain reasoning as provisional. Prefer a few
|
|
96
|
+
high-confidence truths over a broad catalog. Hold draft prose to the node prose
|
|
97
|
+
stances in [capture.md](capture.md) and score each node against its drafting
|
|
98
|
+
gate before presenting drafts for curation.
|
|
99
|
+
|
|
100
|
+
## 5. Curate With The Human
|
|
101
|
+
|
|
102
|
+
Before treating draft content as durable, ask the human to classify important
|
|
103
|
+
claims:
|
|
104
|
+
|
|
105
|
+
- keep as canonical
|
|
106
|
+
- soften into guidance
|
|
107
|
+
- reject as accidental or legacy
|
|
108
|
+
- move to scratch notes
|
|
109
|
+
- restate at a broader or narrower altitude (add or drop a condition)
|
|
110
|
+
|
|
111
|
+
## 6. Decide Kinds And Altitude
|
|
112
|
+
|
|
113
|
+
Two authoring decisions replace any notion of hierarchy:
|
|
114
|
+
|
|
115
|
+
- **Kind** — declare the kind vocabulary in `glossary.md` and name each node
|
|
116
|
+
`<kind>.<slug>.md` so its normative weight is clear. The glossary defines what
|
|
117
|
+
each kind means and how strongly it binds. Kinds are your choice;
|
|
118
|
+
Ghost ships no fixed vocabulary.
|
|
119
|
+
- **Altitude** — state a truth at the level it is actually true. Universal → state
|
|
120
|
+
it plainly. Narrower → name the situation that activates it, in the prose. Never
|
|
121
|
+
file a truth by destination (`for-emails.md`); the model reads the condition and
|
|
122
|
+
decides when it applies.
|
|
123
|
+
|
|
124
|
+
## 7. Validate And Ratify
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
ghost validate .ghost
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`validate` checks artifact shape, per-node validity, and that each node's kind
|
|
131
|
+
prefix is a declared glossary kind (undeclared → warning with a "did you
|
|
132
|
+
mean" suggestion). Use ordinary Git review as the approval boundary: uncommitted
|
|
133
|
+
edits are drafts; checked-in nodes are canonical.
|
|
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
|
+
|
|
174
|
+
## Never
|
|
175
|
+
|
|
176
|
+
- Never derive brand truth from repo code alone; what the codebase repeats may
|
|
177
|
+
be legacy, not stance. Use repo paths as `materials` only after the prose
|
|
178
|
+
truth has been curated.
|
|
179
|
+
- Never draft a node the human neither said nor showed; that is invention
|
|
180
|
+
wearing the brand's clothes.
|
|
181
|
+
- Never treat a brand doc, an artifact, or repetition frequency as brand
|
|
182
|
+
authority; the human ratifies what is intentional.
|
|
183
|
+
- Never invent a hierarchy, inheritance, or edges — the package is flat.
|
|
184
|
+
- Never file a truth by destination; state its condition in the prose.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: blocks
|
|
3
|
+
description: Author block and material nodes so an agent can match a fingerprint's stance to concrete building blocks.
|
|
4
|
+
handoffs:
|
|
5
|
+
- label: List the node menu
|
|
6
|
+
command: ghost gather
|
|
7
|
+
prompt: What materials does this fingerprint document, and what is absent?
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Recipe: Author Block And Material Nodes
|
|
11
|
+
|
|
12
|
+
**Goal:** when you are documenting the **materials** a brand draws from — its
|
|
13
|
+
building blocks, assets, and reusable pieces — write that prose so an agent can
|
|
14
|
+
translate the fingerprint's stance into concrete building blocks without the
|
|
15
|
+
fingerprint ever naming a component.
|
|
16
|
+
|
|
17
|
+
This is opinionated method, not new schema. **"Block node" is shorthand in this
|
|
18
|
+
recipe, not a Ghost concept**: it means any node whose truth is a reusable
|
|
19
|
+
building block, whatever kind the author's glossary declares for it (`block`,
|
|
20
|
+
`asset`, `pattern`, …). A block node is a node like any other: a markdown file
|
|
21
|
+
with a `description` and a prose body, named `<kind>.<slug>.md` (or a bare
|
|
22
|
+
slug). See [capture.md](capture.md) for the node shape. Block prose can be one
|
|
23
|
+
paragraph inside a broader node, or split across many nodes, one per block,
|
|
24
|
+
whatever keeps each node purpose-coherent.
|
|
25
|
+
|
|
26
|
+
## Where it sits
|
|
27
|
+
|
|
28
|
+
A fingerprint declares stance. Block and material nodes ground that stance in
|
|
29
|
+
concrete material: materials, substantial fenced examples, or Skeletons. A
|
|
30
|
+
realizing agent **reads** them and matches against them. Strip every block node
|
|
31
|
+
and the fingerprint is still valid — it just gives the agent less to draw on,
|
|
32
|
+
and prose-only steering is weak steering. The agent does the matching.
|
|
33
|
+
|
|
34
|
+
## Concreteness is the grounding dial
|
|
35
|
+
|
|
36
|
+
This trade belongs to the author:
|
|
37
|
+
|
|
38
|
+
- **Abstract materials** (principles, arrangement, no concrete components) →
|
|
39
|
+
leaves the agent more room, grounds it less.
|
|
40
|
+
- **Concrete materials** (named building blocks) → strongly grounds the agent in
|
|
41
|
+
the materials it should reach for, at the cost of that room.
|
|
42
|
+
|
|
43
|
+
Neither is correct. A concrete block node is a deliberate trade, not a leak.
|
|
44
|
+
|
|
45
|
+
## Tier first: not everything earns a node
|
|
46
|
+
|
|
47
|
+
- **Primitives** (button, input, badge, avatar, spinner…) get **no prose body**
|
|
48
|
+
when the generic form serves. They are shared vocabulary, not stance. If you
|
|
49
|
+
record one at all, give it only a `description` so `gather` can surface it;
|
|
50
|
+
the absence of a body is the signal that training priors are acceptable here.
|
|
51
|
+
When a primitive is itself brand-distinctive (a button whose shape, weight, or
|
|
52
|
+
focus treatment is a recognizable brand move), its *divergence from the
|
|
53
|
+
generic form* is a truth worth a body: state what differs and why, not the
|
|
54
|
+
full API.
|
|
55
|
+
- **Anything that encodes a user moment** (confirmation, plan, task, tool,
|
|
56
|
+
reasoning, sources…) earns **one short prose body**. This is what the method is
|
|
57
|
+
for.
|
|
58
|
+
- The **composer middle** (card, table, form, sidebar…) is a call to weigh. Give
|
|
59
|
+
it a prose body when its arrangement carries a stance worth matching.
|
|
60
|
+
|
|
61
|
+
If a primitive ever seems to need stance guidance, that is a signal it is doing
|
|
62
|
+
a composer's job. Promote the pattern into a node; do not write a body on the
|
|
63
|
+
primitive.
|
|
64
|
+
|
|
65
|
+
## The shape of a block node
|
|
66
|
+
|
|
67
|
+
A node like any other. Frontmatter carries `description` (the retrieval payload —
|
|
68
|
+
write one on every block worth matching); the body is prose the agent reasons
|
|
69
|
+
over.
|
|
70
|
+
|
|
71
|
+
**Body:** one short paragraph in a consistent rhythm, *for / reach when / not
|
|
72
|
+
when (use X instead) / never*:
|
|
73
|
+
|
|
74
|
+
- **for**: the user need or moment it exists for, framed as the problem, not the
|
|
75
|
+
widget.
|
|
76
|
+
- **reach when**: phrased as the user's *first question* ("who/what is this?" vs
|
|
77
|
+
"what's happening / what do I do?"). First-question framing forces a clean pick
|
|
78
|
+
between overlapping blocks.
|
|
79
|
+
- **not when**: name the rival node to reach for instead, by its id. This is what
|
|
80
|
+
makes the set navigable — since the package is flat with no edges, the prose
|
|
81
|
+
"not when" *is* the see-also link. Point at the other node's id in the text.
|
|
82
|
+
- **never**: what it must not be conscripted into, so the agent does not stretch
|
|
83
|
+
it to fit.
|
|
84
|
+
|
|
85
|
+
Keep props, markup, and API reference out; the body documents purpose, and the
|
|
86
|
+
implementation beneath it is swappable. Explicit values are the exception when
|
|
87
|
+
the value itself is the brand truth — an exact color, a specific corner radius —
|
|
88
|
+
not a swappable implementation detail.
|
|
89
|
+
|
|
90
|
+
## How a match runs
|
|
91
|
+
|
|
92
|
+
The agent reads the fingerprint's stance, `gather`s the menu, pulls block nodes
|
|
93
|
+
whose descriptions apply, separates near-neighbors on *not when* and *never*,
|
|
94
|
+
and assembles. The realizing surface authors the chosen blocks in its medium.
|
|
95
|
+
The fingerprint never named a component; the agent bridged via documented
|
|
96
|
+
purpose.
|
|
97
|
+
|
|
98
|
+
## Curation rule
|
|
99
|
+
|
|
100
|
+
A block earns its node when its purpose is **distinguishable** from every
|
|
101
|
+
other's. Two blocks may overlap heavily and still be distinct *as long as their
|
|
102
|
+
"reach when" answers a different first question*. If they answer the same first
|
|
103
|
+
question, they are one node, not two.
|
|
104
|
+
|
|
105
|
+
## Worked example
|
|
106
|
+
|
|
107
|
+
These examples use a `block` kind. The starter glossary does not ship one, so
|
|
108
|
+
declare it (or reuse a declared kind such as `pattern`) before copying the
|
|
109
|
+
filenames:
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
kinds:
|
|
113
|
+
- name: block
|
|
114
|
+
purpose: a reusable building block matched by purpose, not named by component
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`block.confirmation.md` (kind `block`, slug `confirmation`):
|
|
118
|
+
|
|
119
|
+
```markdown
|
|
120
|
+
---
|
|
121
|
+
description: Gate a consequential action behind explicit user approval.
|
|
122
|
+
---
|
|
123
|
+
Gates a tool action behind explicit user approval. Reach for it when the user's
|
|
124
|
+
first question is "do I allow this?", when a consequential action needs a human
|
|
125
|
+
decision before it runs. Not when the action is already complete (that's
|
|
126
|
+
`block.tool`) or when no decision is required. It is never a status display;
|
|
127
|
+
with no decision to make, it only manufactures friction.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`block.table.md`:
|
|
131
|
+
|
|
132
|
+
```markdown
|
|
133
|
+
---
|
|
134
|
+
description: Present many records across shared, comparable columns.
|
|
135
|
+
---
|
|
136
|
+
Presents many records across shared, comparable columns. Reach for it when the
|
|
137
|
+
user's first question is "how do these compare across the same attributes?" Not
|
|
138
|
+
when each item needs rich, non-uniform presentation (use repeated `block.card`)
|
|
139
|
+
or there is a single subject rather than a collection. It is never a single
|
|
140
|
+
record's detail view.
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
`block.button.md`:
|
|
144
|
+
|
|
145
|
+
```markdown
|
|
146
|
+
---
|
|
147
|
+
description: A primitive action trigger.
|
|
148
|
+
---
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
(A primitive the generic form serves: a `description` so `gather` can surface
|
|
152
|
+
it, no body. If this brand's button were itself a recognizable brand move, its
|
|
153
|
+
divergence from the generic form would earn a short body.)
|
|
154
|
+
|
|
155
|
+
## Materials: bundle brand-owned materials, reference implementations
|
|
156
|
+
|
|
157
|
+
Use the rule of thumb literally. Bundle brand-owned materials: brand-owned artifacts that
|
|
158
|
+
should travel with the fingerprint and survive export or refactors — tokens.css,
|
|
159
|
+
motion.json, logo.svg, type materials. Reference implementations: living app
|
|
160
|
+
code, components, stories, or tests whose home is still the product repo. The
|
|
161
|
+
`materials` list locates both; the prose says what the material proves.
|
|
162
|
+
|
|
163
|
+
## Reuse vs. free-compose
|
|
164
|
+
|
|
165
|
+
Do not pin a block by prop or markup shape. Document the *purpose* and any
|
|
166
|
+
*guarantees* a block must hold (an action routes through a declared tool, a
|
|
167
|
+
control is keyboard-reachable). Let the realizing agent author the form. Pinning
|
|
168
|
+
prop APIs re-imports implementation opinion and creates a mirror to maintain.
|
|
169
|
+
|
|
170
|
+
## Never
|
|
171
|
+
|
|
172
|
+
- Never write a prose body on a primitive the generic form serves; the absence
|
|
173
|
+
of a body is the signal. A brand-distinctive primitive earns a body for its
|
|
174
|
+
divergence, never for its API.
|
|
175
|
+
- Never put props, markup, or API reference in a block body; explicit
|
|
176
|
+
values belong only when the value itself is the brand truth.
|
|
177
|
+
- Never let the fingerprint reference the realizing surface; blocks are read,
|
|
178
|
+
not addressed.
|
|
179
|
+
- Never split two blocks that answer the same first question; that is one node.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brief
|
|
3
|
+
description: Build a compact pre-generation packet from pulled Ghost truths.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Recipe: Brief Work From Ghost Fingerprint
|
|
7
|
+
|
|
8
|
+
A brief is an ephemeral steering packet for the generating pass. It is not a new
|
|
9
|
+
schema and is never written back into `.ghost/`.
|
|
10
|
+
|
|
11
|
+
1. Run `ghost gather <ask> --format json` and select against descriptions.
|
|
12
|
+
2. The cover is already in context and outside selection. Pull every applicable
|
|
13
|
+
node with `ghost pull <id> [<id>…]`; skip nodes whose stated situation does
|
|
14
|
+
not apply. Topic overlap alone is not applicability.
|
|
15
|
+
3. Note gather payload labels where present: `materials`, substantial fenced
|
|
16
|
+
examples, or a `## Skeleton`. If there is no concrete material for this
|
|
17
|
+
surface, the readiness ceiling is **Yellow**.
|
|
18
|
+
4. If no node applies, name the fingerprint's silence, follow the cover silence
|
|
19
|
+
posture, and keep provisional reasoning separate from Ghost-backed claims.
|
|
20
|
+
|
|
21
|
+
## The packet: five sections only
|
|
22
|
+
|
|
23
|
+
Return this shape:
|
|
24
|
+
|
|
25
|
+
```markdown
|
|
26
|
+
## Grounded in
|
|
27
|
+
- `node.id` — why it was selected
|
|
28
|
+
|
|
29
|
+
## Non-negotiables
|
|
30
|
+
- ≤5 lines, each cited to a node id
|
|
31
|
+
|
|
32
|
+
## Materials inline
|
|
33
|
+
- concrete locators, inlined snippets, inspect-pointers, and what to view/use
|
|
34
|
+
|
|
35
|
+
## Skeleton
|
|
36
|
+
- matching pulled Skeleton, or "none pulled"
|
|
37
|
+
|
|
38
|
+
## Silent / provisional
|
|
39
|
+
- what Ghost does not cover and what local evidence carries
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Rules:
|
|
43
|
+
|
|
44
|
+
- Do not add sections for every kind. Sections dilute instruction weight.
|
|
45
|
+
- Treat `ghost pull` ordering as packet structure: stance first, concrete-material
|
|
46
|
+
nodes next, prose rules, Skeletons dead last.
|
|
47
|
+
- If a pulled Skeleton matches the surface, begin the artifact from it verbatim
|
|
48
|
+
before filling.
|
|
49
|
+
- Anti-goals are review-critical: state the positive replacement, not just the
|
|
50
|
+
rejected pattern.
|