@design-intelligence/ghost 0.23.0 → 0.25.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 +55 -28
- package/dist/commands/checks-command.js +3 -3
- package/dist/commands/checks-command.js.map +1 -1
- package/dist/commands/command-discovery.d.ts.map +1 -1
- package/dist/commands/command-discovery.js +5 -5
- package/dist/commands/command-discovery.js.map +1 -1
- package/dist/commands/export-command.d.ts.map +1 -1
- package/dist/commands/export-command.js +10 -10
- package/dist/commands/export-command.js.map +1 -1
- package/dist/commands/fingerprint-commands.d.ts +2 -2
- package/dist/commands/fingerprint-commands.d.ts.map +1 -1
- package/dist/commands/fingerprint-commands.js +7 -7
- 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 +72 -87
- 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 +6 -6
- 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 +87 -140
- package/dist/commands/pull-command.js.map +1 -1
- package/dist/commands/pulse-command.js +6 -6
- package/dist/commands/pulse-command.js.map +1 -1
- package/dist/commands/review-command.js +7 -7
- package/dist/commands/review-command.js.map +1 -1
- package/dist/commands/skill-command.js +2 -2
- package/dist/embed/gather.d.ts +9 -0
- package/dist/embed/gather.d.ts.map +1 -0
- package/dist/embed/gather.js +80 -0
- package/dist/embed/gather.js.map +1 -0
- package/dist/embed/index.d.ts +9 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +6 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/inspect.d.ts +3 -0
- package/dist/embed/inspect.d.ts.map +1 -0
- package/dist/embed/inspect.js +155 -0
- package/dist/embed/inspect.js.map +1 -0
- package/dist/embed/pull.d.ts +8 -0
- package/dist/embed/pull.d.ts.map +1 -0
- package/dist/embed/pull.js +96 -0
- package/dist/embed/pull.js.map +1 -0
- package/dist/embed/readonly-map.d.ts +3 -0
- package/dist/embed/readonly-map.d.ts.map +1 -0
- package/dist/embed/readonly-map.js +33 -0
- package/dist/embed/readonly-map.js.map +1 -0
- package/dist/embed/snapshot.d.ts +4 -0
- package/dist/embed/snapshot.d.ts.map +1 -0
- package/dist/embed/snapshot.js +105 -0
- package/dist/embed/snapshot.js.map +1 -0
- package/dist/embed/types.d.ts +156 -0
- package/dist/embed/types.d.ts.map +1 -0
- package/dist/embed/types.js +2 -0
- package/dist/embed/types.js.map +1 -0
- package/dist/fingerprint.d.ts +2 -1
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +1 -0
- package/dist/fingerprint.js.map +1 -1
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -1
- package/dist/ghost-core/catalog/assemble.js +2 -1
- package/dist/ghost-core/catalog/assemble.js.map +1 -1
- package/dist/ghost-core/catalog/menu.d.ts +6 -4
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -1
- package/dist/ghost-core/catalog/menu.js +1 -0
- package/dist/ghost-core/catalog/menu.js.map +1 -1
- package/dist/ghost-core/catalog/types.d.ts +4 -2
- package/dist/ghost-core/catalog/types.d.ts.map +1 -1
- package/dist/ghost-core/check/index.d.ts +1 -1
- package/dist/ghost-core/check/index.js +1 -1
- package/dist/ghost-core/check/lint.d.ts +2 -2
- package/dist/ghost-core/check/lint.js +2 -2
- package/dist/ghost-core/check/load.d.ts +1 -1
- package/dist/ghost-core/check/load.js +3 -3
- package/dist/ghost-core/check/types.d.ts +3 -3
- package/dist/ghost-core/index.d.ts +10 -4
- package/dist/ghost-core/index.d.ts.map +1 -1
- package/dist/ghost-core/index.js +7 -3
- package/dist/ghost-core/index.js.map +1 -1
- package/dist/ghost-core/markdown.d.ts +1 -1
- package/dist/ghost-core/markdown.js +1 -1
- package/dist/ghost-core/material-transport.d.ts +11 -0
- package/dist/ghost-core/material-transport.d.ts.map +1 -1
- package/dist/ghost-core/material-transport.js +80 -8
- package/dist/ghost-core/material-transport.js.map +1 -1
- package/dist/ghost-core/node/index.d.ts +1 -1
- package/dist/ghost-core/node/index.d.ts.map +1 -1
- package/dist/ghost-core/node/index.js +1 -1
- package/dist/ghost-core/node/index.js.map +1 -1
- package/dist/ghost-core/node/schema.js +1 -1
- package/dist/ghost-core/node/steering.d.ts +1 -0
- package/dist/ghost-core/node/steering.d.ts.map +1 -1
- package/dist/ghost-core/node/steering.js +4 -1
- package/dist/ghost-core/node/steering.js.map +1 -1
- package/dist/ghost-core/node/types.d.ts +4 -5
- package/dist/ghost-core/node/types.d.ts.map +1 -1
- package/dist/ghost-core/package-manifest.d.ts +23 -13
- package/dist/ghost-core/package-manifest.d.ts.map +1 -1
- package/dist/ghost-core/package-manifest.js +20 -7
- package/dist/ghost-core/package-manifest.js.map +1 -1
- package/dist/ghost-core/skill-bundle-loader.d.ts +1 -1
- package/dist/ghost-core/skill-bundle-loader.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/init-payloads/median/cliche.median.md +6 -6
- package/dist/init-payloads/median/median-tells.md +1 -1
- package/dist/init-payloads/skeleton/brand.md +4 -3
- package/dist/init-payloads/skeleton/glossary.md +1 -1
- package/dist/init-payloads/vessel-light/anti-goal.median.md +6 -6
- package/dist/init-payloads/vessel-light/checks/motion-restraint.md +1 -1
- package/dist/init-payloads/vessel-light/manifest.yml +1 -1
- package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +2 -2
- package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +3 -3
- package/dist/observability-events.d.ts +1 -0
- package/dist/observability-events.d.ts.map +1 -1
- package/dist/observability-events.js +4 -1
- package/dist/observability-events.js.map +1 -1
- package/dist/package.d.ts +7 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +4 -0
- package/dist/package.js.map +1 -0
- package/dist/review/resolve.js +1 -1
- package/dist/review/resolve.js.map +1 -1
- package/dist/review/review-packet.d.ts +5 -3
- package/dist/review/review-packet.d.ts.map +1 -1
- package/dist/review/review-packet.js +12 -11
- package/dist/review/review-packet.js.map +1 -1
- package/dist/scan/constants.d.ts +6 -2
- package/dist/scan/constants.d.ts.map +1 -1
- package/dist/scan/constants.js +8 -4
- package/dist/scan/constants.js.map +1 -1
- package/dist/scan/file-kind.d.ts +1 -1
- package/dist/scan/file-kind.d.ts.map +1 -1
- package/dist/scan/file-kind.js +11 -11
- package/dist/scan/file-kind.js.map +1 -1
- package/dist/scan/fingerprint-package-lint.d.ts +3 -1
- package/dist/scan/fingerprint-package-lint.d.ts.map +1 -1
- package/dist/scan/fingerprint-package-lint.js +14 -12
- package/dist/scan/fingerprint-package-lint.js.map +1 -1
- package/dist/scan/fingerprint-package-loader.d.ts +7 -3
- package/dist/scan/fingerprint-package-loader.d.ts.map +1 -1
- package/dist/scan/fingerprint-package-loader.js +10 -6
- package/dist/scan/fingerprint-package-loader.js.map +1 -1
- package/dist/scan/fingerprint-package.d.ts +30 -14
- package/dist/scan/fingerprint-package.d.ts.map +1 -1
- package/dist/scan/fingerprint-package.js +17 -9
- package/dist/scan/fingerprint-package.js.map +1 -1
- package/dist/scan/index.d.ts +3 -1
- package/dist/scan/index.d.ts.map +1 -1
- package/dist/scan/index.js +3 -1
- package/dist/scan/index.js.map +1 -1
- package/dist/scan/tarball.d.ts +2 -2
- package/dist/scan/tarball.js +3 -3
- package/dist/scan/tarball.js.map +1 -1
- package/dist/scan/templates.d.ts +1 -1
- package/dist/scan/templates.d.ts.map +1 -1
- package/dist/scan/templates.js +7 -283
- package/dist/scan/templates.js.map +1 -1
- package/dist/skill-bundle/SKILL.md +40 -32
- package/dist/skill-bundle/references/adapting-a-starter.md +11 -11
- package/dist/skill-bundle/references/authoring-scenarios.md +33 -30
- package/dist/skill-bundle/references/blocks.md +19 -20
- package/dist/skill-bundle/references/brief.md +13 -11
- package/dist/skill-bundle/references/capture.md +66 -39
- package/dist/skill-bundle/references/concrete-tiers.md +7 -7
- package/dist/skill-bundle/references/distill.md +204 -0
- package/dist/skill-bundle/references/making.md +113 -0
- package/dist/skill-bundle/references/recall.md +11 -7
- package/dist/skill-bundle/references/schema.md +16 -12
- package/dist/skill-bundle/references/self-check.md +12 -12
- package/dist/skill-bundle/references/steering-audit.md +19 -9
- package/package.json +11 -3
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { buildCatalogMenu, parseGlossary, } from "#ghost-core";
|
|
3
|
-
import { resolveFingerprintPackage } from "../fingerprint.js";
|
|
4
|
-
import { isMissingPathError } from "../internal/fs.js";
|
|
1
|
+
import { gatherGhostPackage, loadGhostSnapshot } from "../embed/index.js";
|
|
5
2
|
import { appendGhostEvent, resolveRunId } from "../observability-events.js";
|
|
6
|
-
import {
|
|
3
|
+
import { resolveGhostPackage } from "../package.js";
|
|
7
4
|
import { failFromError } from "./errors.js";
|
|
8
5
|
export function registerGatherCommand(cli) {
|
|
9
6
|
cli
|
|
10
|
-
.command("gather [...ask]", "Emit the
|
|
11
|
-
.option("--package <dir>", "Use this
|
|
7
|
+
.command("gather [...ask]", "Emit the complete available guidance menu so the agent can pull applicable nodes.")
|
|
8
|
+
.option("--package <dir>", "Use this ghost package directory (default: ./.ghost)")
|
|
12
9
|
.option("--format <fmt>", "Output format: markdown or json", {
|
|
13
10
|
default: "markdown",
|
|
14
11
|
})
|
|
@@ -20,43 +17,25 @@ export function registerGatherCommand(cli) {
|
|
|
20
17
|
process.exit(2);
|
|
21
18
|
return;
|
|
22
19
|
}
|
|
23
|
-
const ask =
|
|
24
|
-
const paths =
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const coverNode = coverId
|
|
28
|
-
? loaded.catalog.nodes.get(coverId)
|
|
29
|
-
: undefined;
|
|
30
|
-
const menu = buildCatalogMenu(loaded.catalog).filter((entry) => entry.id !== coverNode?.id);
|
|
31
|
-
const kinds = await readMenuKinds(paths.glossary);
|
|
20
|
+
const ask = normalizeAskParts(askParts);
|
|
21
|
+
const paths = resolveGhostPackage(opts.package, process.cwd());
|
|
22
|
+
const snapshot = await loadGhostSnapshot(paths);
|
|
23
|
+
const menu = gatherGhostPackage(snapshot, { ask });
|
|
32
24
|
const runId = resolveRunId(opts.run);
|
|
33
25
|
await appendGhostEvent(paths.packageDir, {
|
|
34
26
|
event: "gather",
|
|
35
27
|
...(runId ? { run: runId } : {}),
|
|
36
|
-
...(ask ? { ask } : {}),
|
|
37
|
-
menu: menu.map((entry) => entry.id),
|
|
28
|
+
...(menu.ask ? { ask: menu.ask } : {}),
|
|
29
|
+
menu: menu.nodes.map((entry) => entry.id),
|
|
38
30
|
});
|
|
39
|
-
//
|
|
40
|
-
// ask against it and pulls the nodes
|
|
31
|
+
// ghost does no selection. It emits the complete catalog; the agent
|
|
32
|
+
// reads the ask against it and pulls the nodes whose described
|
|
33
|
+
// conditions apply.
|
|
41
34
|
if (opts.format === "json") {
|
|
42
|
-
process.stdout.write(`${JSON.stringify(
|
|
43
|
-
kind: "menu",
|
|
44
|
-
...(ask ? { ask } : {}),
|
|
45
|
-
...(coverNode
|
|
46
|
-
? { cover: { id: coverNode.id, body: coverNode.body } }
|
|
47
|
-
: {}),
|
|
48
|
-
coverage: menuCoverage(menu),
|
|
49
|
-
...(kinds.length > 0 ? { kinds } : {}),
|
|
50
|
-
nodes: menu,
|
|
51
|
-
}, null, 2)}\n`);
|
|
35
|
+
process.stdout.write(`${JSON.stringify(formatGatherJson(menu), null, 2)}\n`);
|
|
52
36
|
}
|
|
53
37
|
else {
|
|
54
|
-
process.stdout.write(formatMenuMarkdown(menu
|
|
55
|
-
ask,
|
|
56
|
-
cover: coverNode
|
|
57
|
-
? { id: coverNode.id, body: coverNode.body }
|
|
58
|
-
: undefined,
|
|
59
|
-
}));
|
|
38
|
+
process.stdout.write(formatMenuMarkdown(menu));
|
|
60
39
|
}
|
|
61
40
|
process.exit(0);
|
|
62
41
|
}
|
|
@@ -65,76 +44,71 @@ export function registerGatherCommand(cli) {
|
|
|
65
44
|
}
|
|
66
45
|
});
|
|
67
46
|
}
|
|
68
|
-
function
|
|
47
|
+
function normalizeAskParts(askParts) {
|
|
69
48
|
const ask = (askParts ?? []).join(" ").trim();
|
|
70
49
|
return ask.length > 0 ? ask : undefined;
|
|
71
50
|
}
|
|
72
|
-
|
|
73
|
-
* Read the glossary's declared kinds and their prose purposes for the menu
|
|
74
|
-
* header. Missing or malformed glossaries degrade to no legend — the menu
|
|
75
|
-
* itself never depends on the glossary being present.
|
|
76
|
-
*/
|
|
77
|
-
async function readMenuKinds(glossaryPath) {
|
|
78
|
-
let raw;
|
|
79
|
-
try {
|
|
80
|
-
raw = await readFile(glossaryPath, "utf-8");
|
|
81
|
-
}
|
|
82
|
-
catch (err) {
|
|
83
|
-
if (isMissingPathError(err))
|
|
84
|
-
return [];
|
|
85
|
-
throw err;
|
|
86
|
-
}
|
|
87
|
-
const result = parseGlossary(raw);
|
|
88
|
-
if (result.glossary === null)
|
|
89
|
-
return [];
|
|
90
|
-
return result.glossary.kinds
|
|
91
|
-
.filter((kind) => kind.purpose.length > 0)
|
|
92
|
-
.map((kind) => ({
|
|
93
|
-
name: kind.name,
|
|
94
|
-
// Legend entries are one line each: keep the section's first paragraph
|
|
95
|
-
// and collapse internal wrapping.
|
|
96
|
-
purpose: (kind.purpose.split(/\n\s*\n/, 1)[0] ?? "")
|
|
97
|
-
.replace(/\s+/g, " ")
|
|
98
|
-
.trim(),
|
|
99
|
-
}));
|
|
100
|
-
}
|
|
101
|
-
function menuCoverage(menu) {
|
|
51
|
+
function formatGatherJson(menu) {
|
|
102
52
|
return {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
53
|
+
kind: menu.kind,
|
|
54
|
+
...(menu.ask ? { ask: menu.ask } : {}),
|
|
55
|
+
source: menu.source,
|
|
56
|
+
contract: menu.contract,
|
|
57
|
+
...(menu.cover.state === "resolved"
|
|
58
|
+
? {
|
|
59
|
+
cover: {
|
|
60
|
+
id: menu.cover.id,
|
|
61
|
+
body: menu.cover.node.body,
|
|
62
|
+
inContext: true,
|
|
63
|
+
selectable: false,
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
: {}),
|
|
67
|
+
next: { command: "ghost pull <id> [<id>…]" },
|
|
68
|
+
silence: menu.silence,
|
|
69
|
+
coverage: menu.coverage,
|
|
70
|
+
...(menu.kinds !== undefined ? { kinds: menu.kinds } : {}),
|
|
71
|
+
nodes: menu.nodes,
|
|
108
72
|
};
|
|
109
73
|
}
|
|
110
74
|
function menuCoverageLine(menu) {
|
|
111
|
-
const coverage =
|
|
75
|
+
const coverage = menu.coverage;
|
|
76
|
+
const payloadParts = [
|
|
77
|
+
`${coverage.payloads.materials} with materials`,
|
|
78
|
+
`${coverage.payloads.fencedExamples} with substantial fenced examples`,
|
|
79
|
+
`${coverage.payloads.skeletons} with Skeletons`,
|
|
80
|
+
];
|
|
112
81
|
const parts = [
|
|
113
82
|
`${coverage.nodes} nodes`,
|
|
114
|
-
`${coverage.concrete} carry
|
|
83
|
+
`${coverage.concrete} carry payloads (${payloadParts.join(", ")})`,
|
|
115
84
|
];
|
|
116
85
|
if (coverage.undescribed > 0) {
|
|
117
86
|
parts.push(`${coverage.undescribed} lack descriptions`);
|
|
118
87
|
}
|
|
119
88
|
return parts.join(" · ");
|
|
120
89
|
}
|
|
121
|
-
function formatMenuMarkdown(menu
|
|
122
|
-
const lines = [
|
|
123
|
-
|
|
124
|
-
""
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
90
|
+
function formatMenuMarkdown(menu) {
|
|
91
|
+
const lines = ["# ghost package", ""];
|
|
92
|
+
if (menu.ask)
|
|
93
|
+
lines.push(`Ask: ${menu.ask}`, "");
|
|
94
|
+
if (menu.cover.state === "resolved") {
|
|
95
|
+
lines.push(`## Cover in context: \`${menu.cover.id}\``, "", menu.cover.node.body, "", "Cover status: already in context; outside selection; do not pull again.", "", "---", "");
|
|
96
|
+
}
|
|
97
|
+
lines.push("## Available guidance", "", menuCoverageLine(menu), "");
|
|
98
|
+
if (menu.ask) {
|
|
99
|
+
lines.push("Complete, unfiltered, unranked list from the ghost package. ghost has not selected nodes for this ask.", "Pull every node whose description indicates its stated situation applies and whose guidance, material, structure, or refusal governs the work. Skip inapplicable nodes. Topic overlap alone is not applicability. Do not add nodes for completeness or omit applicable nodes to meet a count.", "Next: `ghost pull <id> [<id>…]`.", "If nothing applies, name the package's silence, follow the cover silence posture, and do not invent ghost-backed guidance.", "");
|
|
128
100
|
}
|
|
129
|
-
|
|
130
|
-
|
|
101
|
+
else {
|
|
102
|
+
lines.push("Complete, unfiltered, unranked list from the ghost package. Bare gather is catalog inspection; ghost has not grounded a task or selected nodes.", "When grounding an ask, pull every applicable node with `ghost pull <id> [<id>…]`. Skip inapplicable nodes and do not invent ghost-backed guidance when the ghost package is silent.", "");
|
|
103
|
+
}
|
|
104
|
+
if (menu.kinds !== undefined && menu.kinds.length > 0) {
|
|
131
105
|
lines.push("Kinds:", "");
|
|
132
|
-
for (const kind of kinds) {
|
|
106
|
+
for (const kind of menu.kinds) {
|
|
133
107
|
lines.push(`- **${kind.name}** — ${kind.purpose}`);
|
|
134
108
|
}
|
|
135
109
|
lines.push("");
|
|
136
110
|
}
|
|
137
|
-
for (const entry of menu) {
|
|
111
|
+
for (const entry of menu.nodes) {
|
|
138
112
|
const kind = entry.kind ? ` _(${entry.kind})_` : "";
|
|
139
113
|
lines.push(`- \`${entry.id}\`${kind}`);
|
|
140
114
|
if (entry.description)
|
|
@@ -142,10 +116,21 @@ function formatMenuMarkdown(menu, kinds, options = {}) {
|
|
|
142
116
|
if (entry.materials !== undefined) {
|
|
143
117
|
lines.push(` - materials: ${entry.materials}`);
|
|
144
118
|
}
|
|
145
|
-
|
|
146
|
-
|
|
119
|
+
const payloadTypes = formatPayloadTypes(entry);
|
|
120
|
+
if (payloadTypes.length > 0) {
|
|
121
|
+
lines.push(` - payloads: ${payloadTypes.join(", ")}`);
|
|
147
122
|
}
|
|
148
123
|
}
|
|
149
124
|
return `${lines.join("\n")}\n`;
|
|
150
125
|
}
|
|
126
|
+
function formatPayloadTypes(entry) {
|
|
127
|
+
const types = [];
|
|
128
|
+
if (entry.materials !== undefined)
|
|
129
|
+
types.push("materials");
|
|
130
|
+
if (entry.hasFencedExample)
|
|
131
|
+
types.push("substantial fenced example");
|
|
132
|
+
if (entry.hasSkeleton)
|
|
133
|
+
types.push("Skeleton");
|
|
134
|
+
return types;
|
|
135
|
+
}
|
|
151
136
|
//# sourceMappingURL=gather-command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather-command.js","sourceRoot":"","sources":["../../src/commands/gather-command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gather-command.js","sourceRoot":"","sources":["../../src/commands/gather-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-command.d.ts","sourceRoot":"","sources":["../../src/commands/init-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAO/B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"init-command.d.ts","sourceRoot":"","sources":["../../src/commands/init-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAO/B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAiGlD"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { UsageError } from "#ghost-core";
|
|
2
|
-
import {
|
|
2
|
+
import { initGhostPackage } from "../package.js";
|
|
3
3
|
import { addChecksDir } from "../scan/check-scaffold.js";
|
|
4
4
|
import { getInitBody } from "../scan/templates.js";
|
|
5
5
|
import { failFromError } from "./errors.js";
|
|
6
6
|
export function registerInitCommand(cli) {
|
|
7
7
|
cli
|
|
8
|
-
.command("init", "Create a root .ghost
|
|
9
|
-
.option("--package <dir>", "Exact
|
|
8
|
+
.command("init", "Create a root .ghost package of nodes")
|
|
9
|
+
.option("--package <dir>", "Exact ghost package directory to initialize")
|
|
10
10
|
.option("--template <name>", "Init template to scaffold (default: skeleton)")
|
|
11
11
|
.option("--body <name>", "Init body to install: a full inhabited package (e.g. vessel-light)")
|
|
12
12
|
.option("--with <capabilities>", "Comma-separated capabilities to add after scaffolding (e.g. checks)")
|
|
13
|
-
.option("--force", "Overwrite existing
|
|
13
|
+
.option("--force", "Overwrite existing ghost package files")
|
|
14
14
|
.option("--format <fmt>", "Output format: cli or json", { default: "cli" })
|
|
15
15
|
.action(async (opts) => {
|
|
16
16
|
try {
|
|
@@ -30,7 +30,7 @@ export function registerInitCommand(cli) {
|
|
|
30
30
|
if (body?.includesChecks && withIds.includes("checks")) {
|
|
31
31
|
throw new UsageError(`--with checks is redundant with --body ${body.name} — this body already includes its own checks/.`);
|
|
32
32
|
}
|
|
33
|
-
const result = await
|
|
33
|
+
const result = await initGhostPackage(exactPackage, process.cwd(), {
|
|
34
34
|
...(typeof opts.template === "string"
|
|
35
35
|
? { template: opts.template }
|
|
36
36
|
: {}),
|
|
@@ -55,7 +55,7 @@ export function registerInitCommand(cli) {
|
|
|
55
55
|
}, null, 2)}\n`);
|
|
56
56
|
}
|
|
57
57
|
else {
|
|
58
|
-
process.stdout.write(`Initialized
|
|
58
|
+
process.stdout.write(`Initialized ghost package: ${result.paths.dir}\n`);
|
|
59
59
|
for (const relativePath of result.written) {
|
|
60
60
|
process.stdout.write(` ${relativePath}\n`);
|
|
61
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/commands/init-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/commands/init-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull-command.d.ts","sourceRoot":"","sources":["../../src/commands/pull-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"pull-command.d.ts","sourceRoot":"","sources":["../../src/commands/pull-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAU/B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAwFlD"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { GHOST_EVENTS_FILENAME
|
|
5
|
-
import { loadFingerprintPackage } from "../scan/fingerprint-package.js";
|
|
1
|
+
import { loadGhostSnapshot, pullGhostNodes } from "../embed/index.js";
|
|
2
|
+
import { appendGhostEvent, resolveRunId } from "../observability-events.js";
|
|
3
|
+
import { resolveGhostPackage } from "../package.js";
|
|
4
|
+
import { GHOST_EVENTS_FILENAME } from "../scan/constants.js";
|
|
6
5
|
import { resolveGitRoot } from "../scan/package-paths.js";
|
|
7
6
|
import { failFromError } from "./errors.js";
|
|
8
7
|
export function registerPullCommand(cli) {
|
|
9
8
|
cli
|
|
10
9
|
.command("pull <...ids>", "Emit the named nodes' full prose bodies, and append the pull to the events tape.")
|
|
11
|
-
.option("--package <dir>", "Use this
|
|
10
|
+
.option("--package <dir>", "Use this ghost package directory (default: ./.ghost)")
|
|
12
11
|
.option("--format <fmt>", "Output format: markdown or json", {
|
|
13
12
|
default: "markdown",
|
|
14
13
|
})
|
|
@@ -30,69 +29,44 @@ export function registerPullCommand(cli) {
|
|
|
30
29
|
process.exit(2);
|
|
31
30
|
return;
|
|
32
31
|
}
|
|
33
|
-
const paths =
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
for (const miss of missed) {
|
|
32
|
+
const paths = resolveGhostPackage(opts.package, process.cwd());
|
|
33
|
+
const snapshot = await loadGhostSnapshot(paths);
|
|
34
|
+
const repoRoot = await resolveGitRoot(process.cwd());
|
|
35
|
+
const result = await pullGhostNodes(snapshot, {
|
|
36
|
+
ids,
|
|
37
|
+
repoRoot,
|
|
38
|
+
inlineMaterials: opts.materials !== false,
|
|
39
|
+
order: opts.order,
|
|
40
|
+
});
|
|
41
|
+
for (const miss of result.missed) {
|
|
43
42
|
const hint = miss.suggested.length > 0
|
|
44
43
|
? ` (did you mean ${miss.suggested.map((s) => `\`${s}\``).join(", ")}?)`
|
|
45
44
|
: "";
|
|
46
45
|
console.error(`Warning: unknown node \`${miss.requested}\`${hint}`);
|
|
47
46
|
}
|
|
48
|
-
if (missed.length > 0) {
|
|
47
|
+
if (result.missed.length > 0) {
|
|
49
48
|
console.error("Run `ghost gather` to list every node.");
|
|
50
49
|
}
|
|
51
|
-
const givenNodes = known.map((id) => catalog.nodes.get(id));
|
|
52
|
-
const nodes = opts.order === "given"
|
|
53
|
-
? givenNodes
|
|
54
|
-
: orderPulledNodes(givenNodes, loaded.manifest.cover);
|
|
55
|
-
const pulledNodes = await resolvePulledNodes(nodes, paths.packageDir, opts.materials !== false);
|
|
56
|
-
const counts = sumMaterialCounts(pulledNodes);
|
|
57
50
|
if (opts.events !== false) {
|
|
58
51
|
const runId = resolveRunId(opts.run);
|
|
59
52
|
await appendGhostEvent(paths.packageDir, {
|
|
60
53
|
event: "pull",
|
|
61
54
|
...(runId ? { run: runId } : {}),
|
|
62
|
-
ids:
|
|
63
|
-
inlinedMaterials:
|
|
64
|
-
omittedMaterials:
|
|
65
|
-
...(missed.length > 0 ? { missed } : {}),
|
|
55
|
+
ids: [...result.ids],
|
|
56
|
+
inlinedMaterials: result.materialCounts.inlined,
|
|
57
|
+
omittedMaterials: result.materialCounts.omitted,
|
|
58
|
+
...(result.missed.length > 0 ? { missed: [...result.missed] } : {}),
|
|
66
59
|
});
|
|
67
60
|
}
|
|
68
|
-
if (
|
|
61
|
+
if (result.ids.length === 0) {
|
|
69
62
|
process.exit(2);
|
|
70
63
|
return;
|
|
71
64
|
}
|
|
72
65
|
if (opts.format === "json") {
|
|
73
|
-
process.stdout.write(`${JSON.stringify(
|
|
74
|
-
kind: "pull",
|
|
75
|
-
...(missed.length > 0 ? { missed } : {}),
|
|
76
|
-
nodes: pulledNodes.map(({ node, materials }) => ({
|
|
77
|
-
id: node.id,
|
|
78
|
-
...(node.kind !== undefined ? { kind: node.kind } : {}),
|
|
79
|
-
...(node.description
|
|
80
|
-
? { description: node.description }
|
|
81
|
-
: {}),
|
|
82
|
-
...(node.materials !== undefined
|
|
83
|
-
? {
|
|
84
|
-
materials: opts.materials === false
|
|
85
|
-
? node.materials
|
|
86
|
-
: materials.materials.map(formatJsonMaterial),
|
|
87
|
-
}
|
|
88
|
-
: {}),
|
|
89
|
-
body: stripSkeletonSections(node.body),
|
|
90
|
-
})),
|
|
91
|
-
skeletons: pulledSkeletons(pulledNodes),
|
|
92
|
-
}, null, 2)}\n`);
|
|
66
|
+
process.stdout.write(`${JSON.stringify(formatPullJson(result, opts.materials !== false), null, 2)}\n`);
|
|
93
67
|
}
|
|
94
68
|
else {
|
|
95
|
-
process.stdout.write(formatPullMarkdown(
|
|
69
|
+
process.stdout.write(formatPullMarkdown(result));
|
|
96
70
|
}
|
|
97
71
|
process.exit(0);
|
|
98
72
|
}
|
|
@@ -101,120 +75,93 @@ export function registerPullCommand(cli) {
|
|
|
101
75
|
}
|
|
102
76
|
});
|
|
103
77
|
}
|
|
104
|
-
|
|
105
|
-
const repoRoot = await resolveGitRoot(process.cwd());
|
|
106
|
-
return Promise.all(nodes.map(async (node) => ({
|
|
107
|
-
node,
|
|
108
|
-
materials: inlineMaterials
|
|
109
|
-
? await transportMaterials(node.materials, {
|
|
110
|
-
repoRoot,
|
|
111
|
-
packageDir,
|
|
112
|
-
materialsDir: GHOST_MATERIALS_DIR,
|
|
113
|
-
})
|
|
114
|
-
: locatorOnlyMaterials(node.materials, repoRoot, packageDir),
|
|
115
|
-
})));
|
|
116
|
-
}
|
|
117
|
-
function orderPulledNodes(nodes, coverId) {
|
|
118
|
-
return nodes
|
|
119
|
-
.map((node, index) => ({
|
|
120
|
-
node,
|
|
121
|
-
index,
|
|
122
|
-
bucket: steeringBucket(node, coverId),
|
|
123
|
-
}))
|
|
124
|
-
.sort((a, b) => a.bucket - b.bucket || a.index - b.index)
|
|
125
|
-
.map((entry) => entry.node);
|
|
126
|
-
}
|
|
127
|
-
function steeringBucket(node, coverId) {
|
|
128
|
-
if (coverId !== undefined && node.id === coverId)
|
|
129
|
-
return 0;
|
|
130
|
-
if (node.concrete)
|
|
131
|
-
return 1;
|
|
132
|
-
return 2;
|
|
133
|
-
}
|
|
134
|
-
function locatorOnlyMaterials(locators, repoRoot, packageDir) {
|
|
78
|
+
function formatPullJson(result, inlineMaterials) {
|
|
135
79
|
return {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
80
|
+
kind: "pull",
|
|
81
|
+
...(result.missed.length > 0 ? { missed: result.missed } : {}),
|
|
82
|
+
nodes: result.nodes.map((node) => ({
|
|
83
|
+
id: node.id,
|
|
84
|
+
...(node.kind !== undefined ? { kind: node.kind } : {}),
|
|
85
|
+
...(node.description ? { description: node.description } : {}),
|
|
86
|
+
...(node.declaredMaterials !== undefined
|
|
87
|
+
? {
|
|
88
|
+
materials: inlineMaterials
|
|
89
|
+
? (node.materials ?? []).map(formatJsonMaterial)
|
|
90
|
+
: node.declaredMaterials,
|
|
91
|
+
}
|
|
92
|
+
: {}),
|
|
93
|
+
body: node.body,
|
|
145
94
|
})),
|
|
146
|
-
|
|
147
|
-
omitted: 0,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
function sumMaterialCounts(nodes) {
|
|
151
|
-
return nodes.reduce((sum, { materials }) => ({
|
|
152
|
-
inlined: sum.inlined + materials.inlined,
|
|
153
|
-
omitted: sum.omitted + materials.omitted,
|
|
154
|
-
}), { inlined: 0, omitted: 0 });
|
|
155
|
-
}
|
|
156
|
-
function pulledSkeletons(nodes) {
|
|
157
|
-
return nodes.flatMap(({ node }) => extractSkeletonFences(node.body).map((fence) => ({
|
|
158
|
-
nodeId: node.id,
|
|
159
|
-
...(fence.info ? { info: fence.info } : {}),
|
|
160
|
-
content: fence.content,
|
|
161
|
-
})));
|
|
162
|
-
}
|
|
163
|
-
function formatJsonMaterial(material) {
|
|
164
|
-
return {
|
|
165
|
-
locator: material.locator,
|
|
166
|
-
tier: material.tier,
|
|
167
|
-
...(material.inlined !== undefined ? { inlined: material.inlined } : {}),
|
|
168
|
-
...(material.omitted
|
|
169
|
-
? { omitted: true, reason: material.reason ?? "not inlined" }
|
|
170
|
-
: {}),
|
|
171
|
-
...(material.reason === "binary inspect-pointer"
|
|
172
|
-
? { inspect: material.path ?? material.locator }
|
|
173
|
-
: {}),
|
|
95
|
+
skeletons: result.skeletons,
|
|
174
96
|
};
|
|
175
97
|
}
|
|
176
|
-
function formatPullMarkdown(
|
|
98
|
+
function formatPullMarkdown(result) {
|
|
177
99
|
const sections = [];
|
|
178
|
-
for (const
|
|
100
|
+
for (const node of result.nodes) {
|
|
179
101
|
const kind = node.kind ? ` _(${node.kind})_` : "";
|
|
180
102
|
const lines = [`# \`${node.id}\`${kind}`];
|
|
181
103
|
if (node.description)
|
|
182
104
|
lines.push("", `> ${node.description}`);
|
|
183
|
-
lines.push("",
|
|
184
|
-
if (materials.materials.length > 0) {
|
|
105
|
+
lines.push("", node.body.trim());
|
|
106
|
+
if (node.materials !== undefined && node.materials.length > 0) {
|
|
185
107
|
lines.push("", "Materials:");
|
|
186
|
-
for (const material of
|
|
187
|
-
|
|
188
|
-
const info = material.path ?? material.locator;
|
|
189
|
-
lines.push("", `\`\`\`${info}`, material.inlined.trimEnd(), "```");
|
|
190
|
-
}
|
|
191
|
-
else if (material.reason === "binary inspect-pointer") {
|
|
192
|
-
lines.push(`- inspect: ${material.path ?? material.locator} — view this image before generating`);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
const reason = material.omitted
|
|
196
|
-
? ` — ${material.reason ?? "not inlined"}`
|
|
197
|
-
: "";
|
|
198
|
-
lines.push(`- ${material.locator}${reason}`);
|
|
199
|
-
}
|
|
108
|
+
for (const material of node.materials) {
|
|
109
|
+
appendMaterialMarkdown(lines, material);
|
|
200
110
|
}
|
|
201
111
|
}
|
|
202
112
|
sections.push(lines.join("\n"));
|
|
203
113
|
}
|
|
204
|
-
|
|
205
|
-
if (skeletons.length > 0) {
|
|
114
|
+
if (result.skeletons.length > 0) {
|
|
206
115
|
const lines = [
|
|
207
116
|
"# Skeletons — begin the artifact from this structure",
|
|
208
117
|
"",
|
|
209
118
|
"Begin the artifact from the matching structure below verbatim, then fill it.",
|
|
210
119
|
];
|
|
211
|
-
for (const skeleton of skeletons) {
|
|
120
|
+
for (const skeleton of result.skeletons) {
|
|
212
121
|
lines.push("", `## From \`${skeleton.nodeId}\``, "");
|
|
213
|
-
|
|
214
|
-
lines.push(`\`\`\`${info}`, skeleton.content.trimEnd(), "```");
|
|
122
|
+
lines.push(fencedMarkdown(skeleton.content.trimEnd(), skeleton.info));
|
|
215
123
|
}
|
|
216
124
|
sections.push(lines.join("\n"));
|
|
217
125
|
}
|
|
218
126
|
return `${sections.join("\n\n---\n\n")}\n`;
|
|
219
127
|
}
|
|
128
|
+
function appendMaterialMarkdown(lines, material) {
|
|
129
|
+
if (material.inlined !== undefined) {
|
|
130
|
+
const info = material.path ?? material.locator;
|
|
131
|
+
lines.push("", fencedMarkdown(material.inlined.trimEnd(), info));
|
|
132
|
+
}
|
|
133
|
+
else if (material.reason === "binary inspect-pointer") {
|
|
134
|
+
lines.push(`- inspect: ${material.path ?? material.locator} — view this image before generating`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
const reason = material.omitted
|
|
138
|
+
? ` — ${material.reason ?? "not inlined"}`
|
|
139
|
+
: "";
|
|
140
|
+
lines.push(`- ${material.locator}${reason}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function formatJsonMaterial(material) {
|
|
144
|
+
return {
|
|
145
|
+
locator: material.locator,
|
|
146
|
+
tier: material.tier,
|
|
147
|
+
...(material.inlined !== undefined ? { inlined: material.inlined } : {}),
|
|
148
|
+
...(material.omitted
|
|
149
|
+
? { omitted: true, reason: material.reason ?? "not inlined" }
|
|
150
|
+
: {}),
|
|
151
|
+
...(material.reason === "binary inspect-pointer"
|
|
152
|
+
? { inspect: material.path ?? material.locator }
|
|
153
|
+
: {}),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function fencedMarkdown(content, info) {
|
|
157
|
+
const fence = "`".repeat(Math.max(3, longestBacktickRun(content) + 1));
|
|
158
|
+
return `${fence}${info ?? ""}\n${content}\n${fence}`;
|
|
159
|
+
}
|
|
160
|
+
function longestBacktickRun(content) {
|
|
161
|
+
let longest = 0;
|
|
162
|
+
for (const match of content.matchAll(/`+/g)) {
|
|
163
|
+
longest = Math.max(longest, match[0].length);
|
|
164
|
+
}
|
|
165
|
+
return longest;
|
|
166
|
+
}
|
|
220
167
|
//# sourceMappingURL=pull-command.js.map
|