@blkc-code/cli 0.0.0-stage → 0.1.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.
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const registerBlockCommands: (program: Command) => void;
@@ -0,0 +1,284 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import { BlockRegistrySchema, BlockSchema, CapabilityBlockSchema, IdentifierSchema, nowISO, } from "@blkc-code/core";
5
+ import { ensureDirectory, exists, readJsonFile, workspacePath, writeJsonFile, } from "../utils/filesystem";
6
+ const BLOCKS_DIR = "blocks";
7
+ const BLOCK_REGISTRY_PATH = "registry/blocks.json";
8
+ const MANIFEST_FILENAME = "manifest.json";
9
+ const README_FILENAME = "README.md";
10
+ const ENTRYPOINT_PATH = "./src/index.ts";
11
+ const collectValues = (value, previous) => [...previous, value];
12
+ const defaultBlockName = (id) => id
13
+ .split("-")
14
+ .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
15
+ .join(" ");
16
+ const readRegistry = async () => {
17
+ try {
18
+ const registry = await readJsonFile(BLOCK_REGISTRY_PATH);
19
+ return BlockRegistrySchema.parse(registry);
20
+ }
21
+ catch (error) {
22
+ console.warn(chalk.yellow("⚠ Block registry not found, creating a new one."));
23
+ return { updatedAt: nowISO(), blocks: [] };
24
+ }
25
+ };
26
+ const saveRegistry = async (registry) => {
27
+ await writeJsonFile(BLOCK_REGISTRY_PATH, {
28
+ ...registry,
29
+ updatedAt: nowISO(),
30
+ });
31
+ };
32
+ const manifestPath = (blockId) => path.join(BLOCKS_DIR, blockId, MANIFEST_FILENAME);
33
+ const ensureBlockScaffold = async (blockId) => {
34
+ await ensureDirectory(path.join(BLOCKS_DIR, blockId, "src"));
35
+ };
36
+ const writeManifest = async (blockId, manifest) => {
37
+ await writeJsonFile(manifestPath(blockId), manifest);
38
+ };
39
+ const readManifest = async (blockId) => {
40
+ const manifest = await readJsonFile(manifestPath(blockId));
41
+ return BlockSchema.parse(manifest);
42
+ };
43
+ const renderReadme = (manifest) => `# ${manifest.name}
44
+
45
+
46
+
47
+ ${manifest.description}
48
+
49
+
50
+
51
+ ## Summary
52
+
53
+
54
+
55
+ - ID: ${manifest.id}
56
+
57
+ - Version: ${manifest.version}
58
+
59
+ - Runtime: ${manifest.runtime}
60
+
61
+ - Entry point: ${manifest.entryPoint}
62
+
63
+
64
+
65
+ ## Getting Started
66
+
67
+
68
+
69
+ Update ${manifest.entryPoint} with your implementation and document usage notes here.
70
+
71
+ `;
72
+ const renderStub = (manifest) => {
73
+ const identifier = manifest.name.replace(/[^a-zA-Z0-9]/g, '') || defaultBlockName(manifest.id).replace(/[^a-zA-Z0-9]/g, '');
74
+ const normalized = identifier.charAt(0).toUpperCase() + identifier.slice(1);
75
+ return `export type ${normalized}Input = {
76
+
77
+ text: string;
78
+
79
+ };
80
+
81
+
82
+
83
+ export type ${normalized}Output = {
84
+
85
+ ok: boolean;
86
+
87
+ };
88
+
89
+
90
+
91
+ export const run = async (_input: ${normalized}Input): Promise<${normalized}Output> => {
92
+
93
+ return { ok: true };
94
+
95
+ };
96
+
97
+ `;
98
+ };
99
+ const buildAuthors = (options) => {
100
+ if (!options.authorName) {
101
+ return [];
102
+ }
103
+ return [
104
+ {
105
+ name: options.authorName,
106
+ email: options.authorEmail,
107
+ role: options.authorRole,
108
+ github: options.authorGithub,
109
+ },
110
+ ];
111
+ };
112
+ const validateBlock = async (blockId) => {
113
+ const manifest = await readManifest(blockId);
114
+ if (manifest.id !== blockId) {
115
+ throw new Error(`Manifest id "${manifest.id}" does not match directory "${blockId}"`);
116
+ }
117
+ if (manifest.kind === "capability") {
118
+ const entry = path.join(BLOCKS_DIR, blockId, manifest.entryPoint);
119
+ if (!(await exists(entry))) {
120
+ throw new Error(`Entry point ${manifest.entryPoint} not found for ${blockId}`);
121
+ }
122
+ }
123
+ return manifest;
124
+ };
125
+ const describeBlock = (manifest) => manifest.kind === "ui"
126
+ ? `ui, ${manifest.controls.length} controls, renderers: ${Object.keys(manifest.renderers).join(", ")}`
127
+ : `capability, ${manifest.runtime}`;
128
+ const publishBlock = async (blockId, options = {}) => {
129
+ const manifest = await validateBlock(blockId);
130
+ if (options.dryRun) {
131
+ console.log(chalk.green(`✔ Valid block ${manifest.id}@${manifest.version} (${describeBlock(manifest)})`));
132
+ return;
133
+ }
134
+ const registry = await readRegistry();
135
+ const remainder = registry.blocks.filter((block) => block.id !== blockId);
136
+ const updated = {
137
+ updatedAt: nowISO(),
138
+ blocks: [...remainder, manifest].sort((a, b) => a.id.localeCompare(b.id)),
139
+ };
140
+ await saveRegistry(updated);
141
+ console.log(chalk.green(`✔ Published block ${manifest.id}@${manifest.version}`));
142
+ };
143
+ export const registerBlockCommands = (program) => {
144
+ const block = program
145
+ .command("block")
146
+ .description("Scaffold and manage BLKC blocks");
147
+ block
148
+ .command("list")
149
+ .description("List registered blocks")
150
+ .option("--json", "Emit JSON output", false)
151
+ .action(async (options) => {
152
+ const registry = await readRegistry();
153
+ if (registry.blocks.length === 0) {
154
+ console.log(chalk.yellow("No blocks registered yet."));
155
+ return;
156
+ }
157
+ if (options.json) {
158
+ console.log(JSON.stringify(registry.blocks, null, 2));
159
+ return;
160
+ }
161
+ registry.blocks
162
+ .sort((a, b) => a.id.localeCompare(b.id))
163
+ .forEach((item) => {
164
+ console.log(chalk.cyan(`${item.id}@${item.version}`));
165
+ console.log(` name: ${item.name}`);
166
+ console.log(` summary: ${item.summary}`);
167
+ if (item.tags?.length) {
168
+ console.log(` tags: ${item.tags.join(", ")}`);
169
+ }
170
+ console.log("");
171
+ });
172
+ });
173
+ block
174
+ .command("create")
175
+ .description("Scaffold a new block directory with a manifest")
176
+ .argument("<block-id>", "Block identifier (lowercase slug)")
177
+ .option("--name <name>", "Display name for the block")
178
+ .option("--summary <summary>", "Short summary for marketplace listings")
179
+ .option("--description <description>", "Long-form description")
180
+ .option("--version <semver>", "Initial semantic version", "0.1.0")
181
+ .option("--runtime <runtime>", "Runtime (bun|node|python|docker)", "bun")
182
+ .option("--tag <tag>", "Add a tag", collectValues, [])
183
+ .option("--size <mb>", "Approximate size in MB")
184
+ .option("--author-name <name>", "Author name")
185
+ .option("--author-email <email>", "Author email")
186
+ .option("--author-role <role>", "Author role")
187
+ .option("--author-github <handle>", "Author GitHub handle")
188
+ .option("--publish", "Publish to registry after creation", false)
189
+ .option("--force", "Overwrite existing manifest", false)
190
+ .action(async (rawId, options) => {
191
+ const blockId = IdentifierSchema.parse(rawId);
192
+ const manifestFile = manifestPath(blockId);
193
+ const existsAlready = await exists(manifestFile);
194
+ if (existsAlready && !options.force) {
195
+ console.error(chalk.red(`✖ Block ${blockId} already exists. Use --force to overwrite.`));
196
+ process.exitCode = 1;
197
+ return;
198
+ }
199
+ await ensureBlockScaffold(blockId);
200
+ const manifestDraft = CapabilityBlockSchema.parse({
201
+ kind: "capability",
202
+ id: blockId,
203
+ name: options.name ?? defaultBlockName(blockId),
204
+ summary: options.summary ?? `Summary for ${blockId}.`,
205
+ description: options.description ?? `Detailed description for block ${blockId}. Update before publishing.`,
206
+ version: options.version,
207
+ entryPoint: ENTRYPOINT_PATH,
208
+ runtime: options.runtime,
209
+ tags: options.tag ?? [],
210
+ sizeMB: options.size ? Number(options.size) : undefined,
211
+ authors: buildAuthors(options),
212
+ });
213
+ await writeManifest(blockId, manifestDraft);
214
+ const readmePath = workspacePath(BLOCKS_DIR, blockId, README_FILENAME);
215
+ const entryPath = workspacePath(BLOCKS_DIR, blockId, "src", "index.ts");
216
+ await writeFile(readmePath, renderReadme(manifestDraft), { encoding: "utf8" });
217
+ await writeFile(entryPath, renderStub(manifestDraft), { encoding: "utf8" });
218
+ console.log(chalk.green(`✔ Created block scaffold at ${path.join(BLOCKS_DIR, blockId)}`));
219
+ if (options.publish) {
220
+ await publishBlock(blockId);
221
+ }
222
+ else {
223
+ console.log(chalk.gray(`Run 'blkc block publish ${blockId}' after editing the manifest.`));
224
+ }
225
+ });
226
+ block
227
+ .command("publish")
228
+ .description("Validate and add a block manifest to the registry")
229
+ .argument("<block-id>", "Block identifier to publish")
230
+ .option("--github-org <org>", "Create a GitHub repo under this org")
231
+ .option("--github-private", "Create as a private repo", false)
232
+ .option("--dry-run", "Validate the manifest without writing the registry", false)
233
+ .action(async (rawId, options) => {
234
+ try {
235
+ const blockId = IdentifierSchema.parse(rawId);
236
+ await publishBlock(blockId, { dryRun: options.dryRun });
237
+ if (options.dryRun) {
238
+ return;
239
+ }
240
+ const token = process.env.GITHUB_TOKEN;
241
+ if (options.githubOrg || token) {
242
+ // lazy require to avoid load-time dependency
243
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
244
+ const github = require("../utils/github");
245
+ const manifest = await readManifest(blockId);
246
+ const repoName = manifest.id;
247
+ const result = await github.ensureGithubRepo({
248
+ org: options.githubOrg,
249
+ name: repoName,
250
+ description: manifest.summary ?? manifest.description,
251
+ private: !!options.githubPrivate,
252
+ token,
253
+ });
254
+ if (result.created) {
255
+ console.log(chalk.green(`✔ GitHub repo created: ${result.repo}`));
256
+ }
257
+ else {
258
+ console.log(chalk.yellow(`⚠ GitHub repo not created: ${result.message}`));
259
+ if (result.details) {
260
+ console.log(JSON.stringify(result.details, null, 2));
261
+ }
262
+ }
263
+ console.log("\nNext steps to push your block to GitHub:");
264
+ console.log(` cd ${BLOCKS_DIR}/${blockId}`);
265
+ console.log(" git init");
266
+ console.log(" git add .");
267
+ console.log(" git commit -m \"chore: initial block scaffold\"");
268
+ if (result.repo) {
269
+ console.log(` git remote add origin ${result.repo.replace(/\.git$/, '')}.git`);
270
+ console.log(" git branch -M main");
271
+ console.log(" git push -u origin main");
272
+ }
273
+ else {
274
+ console.log(" # Create a repository on GitHub and add it as 'origin' then push");
275
+ }
276
+ }
277
+ }
278
+ catch (error) {
279
+ console.error(chalk.red(`✖ Failed to publish block: ${error.message}`));
280
+ process.exitCode = 1;
281
+ }
282
+ });
283
+ };
284
+ //# sourceMappingURL=block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/commands/block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const registerCircuitCommands: (program: Command) => void;
@@ -0,0 +1,166 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import { CircuitRegistrySchema, CircuitSchema, IdentifierSchema, nowISO, } from "@blkc-code/core";
5
+ import { ensureDirectory, exists, readJsonFile, workspacePath, writeJsonFile, } from "../utils/filesystem";
6
+ const CIRCUITS_DIR = "circuits";
7
+ const CIRCUIT_REGISTRY_PATH = "registry/circuits.json";
8
+ const MANIFEST_FILENAME = "manifest.json";
9
+ const README_FILENAME = "README.md";
10
+ const collectValues = (value, previous) => [...previous, value];
11
+ const parseKitReference = (input) => {
12
+ const [kitIdRaw, version = "0.1.0"] = input.split("@");
13
+ const kitId = IdentifierSchema.parse(kitIdRaw);
14
+ return { kitId, version };
15
+ };
16
+ const readRegistry = async () => {
17
+ try {
18
+ const registry = await readJsonFile(CIRCUIT_REGISTRY_PATH);
19
+ return CircuitRegistrySchema.parse(registry);
20
+ }
21
+ catch (error) {
22
+ console.warn(chalk.yellow("⚠ Circuit registry not found, creating a new one."));
23
+ return { updatedAt: nowISO(), circuits: [] };
24
+ }
25
+ };
26
+ const saveRegistry = async (registry) => {
27
+ await writeJsonFile(CIRCUIT_REGISTRY_PATH, {
28
+ ...registry,
29
+ updatedAt: nowISO(),
30
+ });
31
+ };
32
+ const manifestPath = (circuitId) => path.join(CIRCUITS_DIR, circuitId, MANIFEST_FILENAME);
33
+ const writeManifest = async (circuitId, manifest) => {
34
+ await writeJsonFile(manifestPath(circuitId), manifest);
35
+ };
36
+ const readManifest = async (circuitId) => {
37
+ const manifest = await readJsonFile(manifestPath(circuitId));
38
+ return CircuitSchema.parse(manifest);
39
+ };
40
+ const renderReadme = (manifest) => {
41
+ const kits = manifest.kits.map((kit) => `- ${kit.kitId}@${kit.version}`).join("\n");
42
+ return `# ${manifest.name}\n\n${manifest.description}\n\n## Kits\n\n${kits}\n\n## Verticals\n\n${manifest.verticals.join(", ") || "general"}\n`;
43
+ };
44
+ const publishCircuit = async (circuitId) => {
45
+ const manifest = await readManifest(circuitId);
46
+ const registry = await readRegistry();
47
+ const remainder = registry.circuits.filter((circuit) => circuit.id !== circuitId);
48
+ const updated = {
49
+ updatedAt: nowISO(),
50
+ circuits: [...remainder, manifest].sort((a, b) => a.id.localeCompare(b.id)),
51
+ };
52
+ await saveRegistry(updated);
53
+ console.log(chalk.green(`✔ Published circuit ${manifest.id}@${manifest.version}`));
54
+ };
55
+ export const registerCircuitCommands = (program) => {
56
+ const circuit = program
57
+ .command("circuit")
58
+ .description("Manage BLKC circuits");
59
+ circuit
60
+ .command("list")
61
+ .description("List registered circuits")
62
+ .option("--json", "Emit JSON output", false)
63
+ .action(async (options) => {
64
+ const registry = await readRegistry();
65
+ if (registry.circuits.length === 0) {
66
+ console.log(chalk.yellow("No circuits registered yet."));
67
+ return;
68
+ }
69
+ if (options.json) {
70
+ console.log(JSON.stringify(registry.circuits, null, 2));
71
+ return;
72
+ }
73
+ registry.circuits
74
+ .sort((a, b) => a.id.localeCompare(b.id))
75
+ .forEach((item) => {
76
+ console.log(chalk.cyan(`${item.id}@${item.version}`));
77
+ console.log(` name: ${item.name}`);
78
+ console.log(` summary: ${item.summary}`);
79
+ console.log(` kits: ${item.kits.map((kit) => kit.kitId).join(", ")}`);
80
+ console.log(` status: ${item.status}`);
81
+ console.log("");
82
+ });
83
+ });
84
+ circuit
85
+ .command("create")
86
+ .description("Scaffold a circuit manifest")
87
+ .argument("<circuit-id>", "Circuit identifier (lowercase slug)")
88
+ .option("--name <name>", "Display name")
89
+ .option("--summary <summary>", "Short summary")
90
+ .option("--description <description>", "Long-form description")
91
+ .option("--version <semver>", "Version", "0.1.0")
92
+ .option("--vertical <vertical>", "Target vertical", collectValues, [])
93
+ .option("--kit <kit@version>", "Reference a kit", collectValues, [])
94
+ .option("--tag <tag>", "Add a tag", collectValues, [])
95
+ .option("--status <status>", "Circuit status", "draft")
96
+ .option("--launch-date <iso>", "Planned launch date")
97
+ .option("--maintainer-name <name>", "Maintainer name")
98
+ .option("--maintainer-email <email>", "Maintainer email")
99
+ .option("--maintainer-role <role>", "Maintainer role")
100
+ .option("--publish", "Publish after creation", false)
101
+ .option("--force", "Overwrite manifest if it exists", false)
102
+ .action(async (rawId, options) => {
103
+ const circuitId = IdentifierSchema.parse(rawId);
104
+ const manifestFile = manifestPath(circuitId);
105
+ const existsAlready = await exists(manifestFile);
106
+ if (existsAlready && !options.force) {
107
+ console.error(chalk.red(`✖ Circuit ${circuitId} already exists. Use --force to overwrite.`));
108
+ process.exitCode = 1;
109
+ return;
110
+ }
111
+ await ensureDirectory(path.join(CIRCUITS_DIR, circuitId));
112
+ const kits = options.kit.map(parseKitReference);
113
+ if (kits.length === 0) {
114
+ console.warn(chalk.yellow("⚠ No kits specified. Add them later before publishing."));
115
+ }
116
+ const manifestDraft = CircuitSchema.parse({
117
+ id: circuitId,
118
+ name: options.name ?? circuitId
119
+ .split("-")
120
+ .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
121
+ .join(" "),
122
+ summary: options.summary ?? `Summary for ${circuitId}.`,
123
+ description: options.description ?? `Detailed description for circuit ${circuitId}. Update before publishing.`,
124
+ version: options.version,
125
+ verticals: options.vertical ?? [],
126
+ tags: options.tag ?? [],
127
+ kits,
128
+ status: options.status,
129
+ launchDate: options.launchDate,
130
+ maintainers: options.maintainerName
131
+ ? [
132
+ {
133
+ name: options.maintainerName,
134
+ email: options.maintainerEmail,
135
+ role: options.maintainerRole,
136
+ },
137
+ ]
138
+ : [],
139
+ });
140
+ await writeManifest(circuitId, manifestDraft);
141
+ const readmePath = workspacePath(CIRCUITS_DIR, circuitId, README_FILENAME);
142
+ await writeFile(readmePath, renderReadme(manifestDraft), { encoding: "utf8" });
143
+ console.log(chalk.green(`✔ Created circuit scaffold at ${path.join(CIRCUITS_DIR, circuitId)}`));
144
+ if (options.publish) {
145
+ await publishCircuit(circuitId);
146
+ }
147
+ else {
148
+ console.log(chalk.gray(`Run 'blkc circuit publish ${circuitId}' after finalising the manifest.`));
149
+ }
150
+ });
151
+ circuit
152
+ .command("publish")
153
+ .description("Validate and add a circuit to the registry")
154
+ .argument("<circuit-id>", "Circuit identifier")
155
+ .action(async (rawId) => {
156
+ try {
157
+ const circuitId = IdentifierSchema.parse(rawId);
158
+ await publishCircuit(circuitId);
159
+ }
160
+ catch (error) {
161
+ console.error(chalk.red(`✖ Failed to publish circuit: ${error.message}`));
162
+ process.exitCode = 1;
163
+ }
164
+ });
165
+ };
166
+ //# sourceMappingURL=circuit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit.js","sourceRoot":"","sources":["../../src/commands/circuit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAGL,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,MAAM,EACN,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AACvD,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,eAAe,GAAG,WAAW,CAAC;AAEpC,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,QAAkB,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;AAElF,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAE,EAAE;IAC1C,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,IAA8B,EAAE;IACxD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAkB,qBAAqB,CAAC,CAAC;QAC5E,OAAO,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAChF,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,QAAyB,EAAE,EAAE;IACvD,MAAM,aAAa,CAAC,qBAAqB,EAAE;QACzC,GAAG,QAAQ;QACX,SAAS,EAAE,MAAM,EAAE;KACpB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAE,EAAE,CACzC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAExD,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAE,QAAyB,EAAE,EAAE;IAC3E,MAAM,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE;IAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAkB,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9E,OAAO,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,QAAyB,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,KAAK,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,WAAW,kBAAkB,IAAI,uBAAuB,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC;AAClJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE;IACjD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAClF,MAAM,OAAO,GAAoB;QAC/B,SAAS,EAAE,MAAM,EAAE;QACnB,QAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KAC5E,CAAC;IAEF,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC1D,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEvC,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,QAAQ;aACd,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACxC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,QAAQ,CAAC,cAAc,EAAE,qCAAqC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;SAC9C,MAAM,CAAC,6BAA6B,EAAE,uBAAuB,CAAC;SAC9D,MAAM,CAAC,oBAAoB,EAAE,SAAS,EAAE,OAAO,CAAC;SAChD,MAAM,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAE,EAAE,CAAC;SACrE,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,EAAE,CAAC;SACnE,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE,CAAC;SACrD,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,OAAO,CAAC;SACtD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;SACpD,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;SACrD,MAAM,CAAC,4BAA4B,EAAE,kBAAkB,CAAC;SACxD,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;SACrD,MAAM,CAAC,WAAW,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,SAAS,EAAE,iCAAiC,EAAE,KAAK,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAO,EAAE,EAAE;QACvC,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAEjD,IAAI,aAAa,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,SAAS,4CAA4C,CAAC,CAAC,CAAC;YAC7F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAI,OAAO,CAAC,GAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,aAAa,GAAoB,aAAa,CAAC,KAAK,CAAC;YACzD,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS;iBAC5B,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBAC5E,IAAI,CAAC,GAAG,CAAC;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe,SAAS,GAAG;YACvD,WAAW,EACT,OAAO,CAAC,WAAW,IAAI,oCAAoC,SAAS,6BAA6B;YACnG,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YACjC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE;YACvB,IAAI;YACJ,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,cAAc;gBACjC,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,OAAO,CAAC,cAAwB;wBACtC,KAAK,EAAE,OAAO,CAAC,eAAqC;wBACpD,IAAI,EAAE,OAAO,CAAC,cAAoC;qBACnD;iBACF;gBACH,CAAC,CAAC,EAAE;SACP,CAAC,CAAC;QAEH,MAAM,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE9C,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC3E,MAAM,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,SAAS,kCAAkC,CAAC,CAAC,CAAC;QACpG,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAiC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const registerKitCommands: (program: Command) => void;
@@ -0,0 +1,175 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import { IdentifierSchema, KitRegistrySchema, KitSchema, nowISO, } from "@blkc-code/core";
5
+ import { ensureDirectory, exists, readJsonFile, workspacePath, writeJsonFile, } from "../utils/filesystem";
6
+ const KITS_DIR = "kits";
7
+ const KIT_REGISTRY_PATH = "registry/kits.json";
8
+ const MANIFEST_FILENAME = "manifest.json";
9
+ const README_FILENAME = "README.md";
10
+ const collectValues = (value, previous) => [...previous, value];
11
+ const parseBlockReference = (input) => {
12
+ const [blockIdRaw, version = "0.1.0"] = input.split("@");
13
+ const blockId = IdentifierSchema.parse(blockIdRaw);
14
+ return { blockId, version };
15
+ };
16
+ const readRegistry = async () => {
17
+ try {
18
+ const registry = await readJsonFile(KIT_REGISTRY_PATH);
19
+ return KitRegistrySchema.parse(registry);
20
+ }
21
+ catch (error) {
22
+ console.warn(chalk.yellow("⚠ Kit registry not found, creating a new one."));
23
+ return { updatedAt: nowISO(), kits: [] };
24
+ }
25
+ };
26
+ const saveRegistry = async (registry) => {
27
+ await writeJsonFile(KIT_REGISTRY_PATH, {
28
+ ...registry,
29
+ updatedAt: nowISO(),
30
+ });
31
+ };
32
+ const manifestPath = (kitId) => path.join(KITS_DIR, kitId, MANIFEST_FILENAME);
33
+ const writeManifest = async (kitId, manifest) => {
34
+ await writeJsonFile(manifestPath(kitId), manifest);
35
+ };
36
+ const readManifest = async (kitId) => {
37
+ const manifest = await readJsonFile(manifestPath(kitId));
38
+ return KitSchema.parse(manifest);
39
+ };
40
+ const renderReadme = (manifest) => {
41
+ const blockTable = manifest.blocks
42
+ .map((block) => `- ${block.blockId}@${block.version}`)
43
+ .join("\n");
44
+ return `# ${manifest.name}\n\n${manifest.description}\n\n## Blocks\n\n${blockTable}\n\n## Category\n\n- ${manifest.category}\n`;
45
+ };
46
+ const publishKit = async (kitId) => {
47
+ const manifest = await readManifest(kitId);
48
+ const registry = await readRegistry();
49
+ const remainder = registry.kits.filter((kit) => kit.id !== kitId);
50
+ const updated = {
51
+ updatedAt: nowISO(),
52
+ kits: [...remainder, manifest].sort((a, b) => a.id.localeCompare(b.id)),
53
+ };
54
+ await saveRegistry(updated);
55
+ console.log(chalk.green(`✔ Published kit ${manifest.id}@${manifest.version}`));
56
+ };
57
+ export const registerKitCommands = (program) => {
58
+ const kit = program
59
+ .command("kit")
60
+ .description("Scaffold and manage BLKC kits");
61
+ kit
62
+ .command("list")
63
+ .description("List registered kits")
64
+ .option("--json", "Emit JSON output", false)
65
+ .action(async (options) => {
66
+ const registry = await readRegistry();
67
+ if (registry.kits.length === 0) {
68
+ console.log(chalk.yellow("No kits registered yet."));
69
+ return;
70
+ }
71
+ if (options.json) {
72
+ console.log(JSON.stringify(registry.kits, null, 2));
73
+ return;
74
+ }
75
+ registry.kits
76
+ .sort((a, b) => a.id.localeCompare(b.id))
77
+ .forEach((item) => {
78
+ console.log(chalk.cyan(`${item.id}@${item.version}`));
79
+ console.log(` name: ${item.name}`);
80
+ console.log(` summary: ${item.summary}`);
81
+ console.log(` blocks: ${item.blocks.map((block) => block.blockId).join(", ")}`);
82
+ console.log("");
83
+ });
84
+ });
85
+ kit
86
+ .command("create")
87
+ .description("Scaffold a new kit manifest")
88
+ .argument("<kit-id>", "Kit identifier (lowercase slug)")
89
+ .option("--name <name>", "Display name")
90
+ .option("--summary <summary>", "Short summary")
91
+ .option("--description <description>", "Long-form description")
92
+ .option("--category <category>", "Business category", "general")
93
+ .option("--block <block@version>", "Reference a block", collectValues, [])
94
+ .option("--version <semver>", "Version", "0.1.0")
95
+ .option("--tag <tag>", "Add a tag", collectValues, [])
96
+ .option("--maintainer-name <name>", "Maintainer name")
97
+ .option("--maintainer-email <email>", "Maintainer email")
98
+ .option("--maintainer-role <role>", "Maintainer role")
99
+ .option("--documentation <url>", "Documentation URL")
100
+ .option("--pricing-model <model>", "Pricing model (free|one-time|subscription|usage)")
101
+ .option("--pricing-amount <amount>", "Pricing amount", parseFloat)
102
+ .option("--pricing-currency <currency>", "Pricing currency", "USD")
103
+ .option("--publish", "Publish after creation", false)
104
+ .option("--force", "Overwrite manifest if it exists", false)
105
+ .action(async (rawId, options) => {
106
+ const kitId = IdentifierSchema.parse(rawId);
107
+ const manifestFile = manifestPath(kitId);
108
+ const existsAlready = await exists(manifestFile);
109
+ if (existsAlready && !options.force) {
110
+ console.error(chalk.red(`✖ Kit ${kitId} already exists. Use --force to overwrite.`));
111
+ process.exitCode = 1;
112
+ return;
113
+ }
114
+ await ensureDirectory(path.join(KITS_DIR, kitId));
115
+ const blocks = options.block.map(parseBlockReference);
116
+ if (blocks.length === 0) {
117
+ console.warn(chalk.yellow("⚠ No blocks specified. Add them later before publishing."));
118
+ }
119
+ const manifestDraft = KitSchema.parse({
120
+ id: kitId,
121
+ name: options.name ?? kitId
122
+ .split("-")
123
+ .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
124
+ .join(" "),
125
+ summary: options.summary ?? `Summary for ${kitId}.`,
126
+ description: options.description ?? `Detailed description for kit ${kitId}. Update before publishing.`,
127
+ category: options.category,
128
+ version: options.version,
129
+ tags: options.tag ?? [],
130
+ blocks,
131
+ maintainers: options.maintainerName
132
+ ? [
133
+ {
134
+ name: options.maintainerName,
135
+ email: options.maintainerEmail,
136
+ role: options.maintainerRole,
137
+ },
138
+ ]
139
+ : [],
140
+ documentation: options.documentation,
141
+ pricing: options.pricingModel
142
+ ? {
143
+ model: options.pricingModel,
144
+ amount: options.pricingAmount,
145
+ currency: options.pricingCurrency,
146
+ }
147
+ : undefined,
148
+ });
149
+ await writeManifest(kitId, manifestDraft);
150
+ const readmePath = workspacePath(KITS_DIR, kitId, README_FILENAME);
151
+ await writeFile(readmePath, renderReadme(manifestDraft), { encoding: "utf8" });
152
+ console.log(chalk.green(`✔ Created kit scaffold at ${path.join(KITS_DIR, kitId)}`));
153
+ if (options.publish) {
154
+ await publishKit(kitId);
155
+ }
156
+ else {
157
+ console.log(chalk.gray(`Run 'blkc kit publish ${kitId}' after finalising the manifest.`));
158
+ }
159
+ });
160
+ kit
161
+ .command("publish")
162
+ .description("Validate and add a kit to the registry")
163
+ .argument("<kit-id>", "Kit identifier")
164
+ .action(async (rawId) => {
165
+ try {
166
+ const kitId = IdentifierSchema.parse(rawId);
167
+ await publishKit(kitId);
168
+ }
169
+ catch (error) {
170
+ console.error(chalk.red(`✖ Failed to publish kit: ${error.message}`));
171
+ process.exitCode = 1;
172
+ }
173
+ });
174
+ };
175
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/commands/kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const registerLogbookCommands: (program: Command) => void;
@@ -0,0 +1,156 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import chalk from "chalk";
5
+ import { DEFAULT_ALGORITHM } from "@blkc-code/core";
6
+ import { DEFAULT_LOGBOOK_PATH, Logbook, } from "@blkc-code/logbook";
7
+ const parseJson = (value, source) => {
8
+ try {
9
+ return JSON.parse(value);
10
+ }
11
+ catch (error) {
12
+ throw new Error(`Failed to parse JSON from ${source}: ${error.message}`);
13
+ }
14
+ };
15
+ const parseJsonFile = async (filePath) => {
16
+ const buffer = await readFile(filePath, { encoding: "utf8" });
17
+ return parseJson(buffer, filePath);
18
+ };
19
+ const mergeRecords = (records) => records.reduce((acc, record) => ({ ...acc, ...record }), {});
20
+ const cleanRecord = (record) => Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined && value !== null));
21
+ const buildDataPayload = async (options) => {
22
+ const dataAggregates = [];
23
+ if (options.data && typeof options.data === "string") {
24
+ dataAggregates.push(parseJson(options.data, "--data"));
25
+ }
26
+ if (options.dataFile && typeof options.dataFile === "string") {
27
+ const resolved = path.resolve(options.dataFile);
28
+ dataAggregates.push(await parseJsonFile(resolved));
29
+ }
30
+ if (options.message && typeof options.message === "string") {
31
+ dataAggregates.push({ message: options.message });
32
+ }
33
+ if (dataAggregates.length === 0) {
34
+ return {};
35
+ }
36
+ return mergeRecords(dataAggregates);
37
+ };
38
+ const defaultActorName = () => process.env.BLKC_ACTOR_NAME ?? os.userInfo().username;
39
+ const resolveLogbook = (options) => new Logbook({
40
+ filePath: path.resolve(options.file ?? DEFAULT_LOGBOOK_PATH),
41
+ algorithm: options.algorithm ?? DEFAULT_ALGORITHM,
42
+ });
43
+ const printVerification = (result) => {
44
+ if (result.valid) {
45
+ console.log(chalk.green(`✔ Logbook verified (${result.entries.length} entries)`));
46
+ if (result.lastHash) {
47
+ console.log(chalk.dim(`Last hash: ${result.lastHash}`));
48
+ }
49
+ return;
50
+ }
51
+ console.error(chalk.red("✖ Logbook verification failed"));
52
+ result.issues.forEach((issue) => {
53
+ const context = issue.entry ? chalk.dim(` ${JSON.stringify(issue.entry)}`) : "";
54
+ console.error(chalk.red(` • [${issue.index + 1}] ${issue.message}${context}`));
55
+ });
56
+ };
57
+ export const registerLogbookCommands = (program) => {
58
+ const logbook = program
59
+ .command("logbook")
60
+ .description("Inspect and update the BLKC logbook")
61
+ .option("-f, --file <path>", "Path to logbook JSONL file", DEFAULT_LOGBOOK_PATH)
62
+ .option("-a, --algorithm <hash>", "Hash algorithm", DEFAULT_ALGORITHM);
63
+ logbook
64
+ .command("append")
65
+ .description("Append a new entry to the logbook")
66
+ .requiredOption("-e, --event <event>", "Event identifier")
67
+ .option("-m, --message <message>", "Optional message stored under data.message")
68
+ .option("-d, --data <json>", "JSON payload merged into entry data")
69
+ .option("--data-file <path>", "Path to JSON file merged into entry data")
70
+ .option("--actor-name <name>", "Actor display name")
71
+ .option("--actor-email <email>", "Actor email")
72
+ .option("--actor-role <role>", "Actor role")
73
+ .option("--timestamp <iso>", "Override timestamp (ISO-8601)")
74
+ .action(async (options, command) => {
75
+ const parentOpts = (command.parent?.opts() ?? {});
76
+ const logbookInstance = resolveLogbook(parentOpts);
77
+ const data = await buildDataPayload(options);
78
+ const actor = cleanRecord({
79
+ name: options.actorName ?? defaultActorName(),
80
+ email: options.actorEmail,
81
+ role: options.actorRole,
82
+ });
83
+ const entry = {
84
+ event: options.event,
85
+ actor: actor,
86
+ data,
87
+ timestamp: options.timestamp,
88
+ };
89
+ try {
90
+ const appended = await logbookInstance.append(entry);
91
+ console.log(chalk.green(`✔ Appended ${appended.event}`));
92
+ console.log(chalk.dim(`Hash: ${appended.hash}`));
93
+ }
94
+ catch (error) {
95
+ console.error(chalk.red(`✖ Failed to append entry: ${error.message}`));
96
+ process.exitCode = 1;
97
+ }
98
+ });
99
+ logbook
100
+ .command("verify")
101
+ .description("Verify integrity of the logbook hash chain")
102
+ .action(async (_options, command) => {
103
+ const parentOpts = (command.parent?.opts() ?? {});
104
+ const logbookInstance = resolveLogbook(parentOpts);
105
+ try {
106
+ const result = await logbookInstance.verify();
107
+ printVerification(result);
108
+ if (!result.valid) {
109
+ process.exitCode = 1;
110
+ }
111
+ }
112
+ catch (error) {
113
+ console.error(chalk.red(`✖ Verification failed: ${error.message}`));
114
+ process.exitCode = 1;
115
+ }
116
+ });
117
+ logbook
118
+ .command("show")
119
+ .description("Display logbook entries")
120
+ .option("-l, --limit <count>", "Limit number of entries returned", (value) => parseInt(value, 10))
121
+ .option("--json", "Output as JSON", false)
122
+ .action(async (options, command) => {
123
+ const parentOpts = (command.parent?.opts() ?? {});
124
+ const logbookInstance = resolveLogbook(parentOpts);
125
+ try {
126
+ const entries = await logbookInstance.entries();
127
+ const limit = typeof options.limit === "number" && !Number.isNaN(options.limit)
128
+ ? options.limit
129
+ : entries.length;
130
+ const subset = entries.slice(Math.max(0, entries.length - limit));
131
+ if (options.json) {
132
+ console.log(JSON.stringify(subset, null, 2));
133
+ return;
134
+ }
135
+ subset.forEach((entry, index) => {
136
+ const idx = entries.length - subset.length + index + 1;
137
+ console.log(chalk.cyan(`#${idx} ${entry.event}`));
138
+ console.log(` actor: ${entry.actor.name}${entry.actor.role ? ` (${entry.actor.role})` : ""}`);
139
+ console.log(` timestamp: ${entry.timestamp}`);
140
+ console.log(` hash: ${entry.hash}`);
141
+ if (entry.prevHash) {
142
+ console.log(` prevHash: ${entry.prevHash}`);
143
+ }
144
+ if (entry.data && Object.keys(entry.data).length > 0) {
145
+ console.log(` data: ${JSON.stringify(entry.data)}`);
146
+ }
147
+ console.log("");
148
+ });
149
+ }
150
+ catch (error) {
151
+ console.error(chalk.red(`✖ Failed to read logbook: ${error.message}`));
152
+ process.exitCode = 1;
153
+ }
154
+ });
155
+ };
156
+ //# sourceMappingURL=logbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logbook.js","sourceRoot":"","sources":["../../src/commands/logbook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from "commander";
3
+ export declare const program: Command;
4
+ export declare const run: () => Promise<void>;
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env bun
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { Command } from "commander";
5
+ import { registerBlockCommands } from "./commands/block";
6
+ import { registerCircuitCommands } from "./commands/circuit";
7
+ import { registerKitCommands } from "./commands/kit";
8
+ import { registerLogbookCommands } from "./commands/logbook";
9
+ export const program = new Command();
10
+ program
11
+ .name("blkc")
12
+ .description("BLKC developer CLI")
13
+ .version("0.1.0");
14
+ program.showHelpAfterError();
15
+ program.configureOutput({
16
+ outputError: (str) => {
17
+ // eslint-disable-next-line no-console
18
+ console.error(str.trim());
19
+ },
20
+ });
21
+ registerBlockCommands(program);
22
+ registerCircuitCommands(program);
23
+ registerKitCommands(program);
24
+ registerLogbookCommands(program);
25
+ const isDirectExecution = () => {
26
+ const entryPoint = process.argv[1];
27
+ if (!entryPoint) {
28
+ return false;
29
+ }
30
+ const modulePath = path.normalize(fileURLToPath(import.meta.url));
31
+ const entryPath = path.normalize(entryPoint);
32
+ return modulePath === entryPath;
33
+ };
34
+ export const run = async () => {
35
+ await program.parseAsync(process.argv);
36
+ };
37
+ if (isDirectExecution()) {
38
+ run().catch((error) => {
39
+ // eslint-disable-next-line no-console
40
+ console.error(error instanceof Error ? error.message : error);
41
+ process.exitCode = 1;
42
+ });
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAErC,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,oBAAoB,CAAC;KACjC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,kBAAkB,EAAE,CAAC;AAC7B,OAAO,CAAC,eAAe,CAAC;IACtB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;QACnB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC,CAAC;AAEH,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,UAAU,KAAK,SAAS,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;IAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,IAAI,iBAAiB,EAAE,EAAE,CAAC;IACxB,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const workspacePath: (...segments: string[]) => string;
2
+ export declare const ensureDirectory: (relativePath: string) => Promise<void>;
3
+ export declare const readJsonFile: <T>(relativePath: string) => Promise<T>;
4
+ export declare const writeJsonFile: (relativePath: string, payload: unknown) => Promise<void>;
5
+ export declare const exists: (relativePath: string) => Promise<boolean>;
@@ -0,0 +1,21 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { ensureDir, pathExists } from "fs-extra";
4
+ export const workspacePath = (...segments) => path.resolve(process.cwd(), ...segments);
5
+ export const ensureDirectory = async (relativePath) => {
6
+ await ensureDir(workspacePath(relativePath));
7
+ };
8
+ export const readJsonFile = async (relativePath) => {
9
+ const filePath = workspacePath(relativePath);
10
+ const contents = await readFile(filePath, { encoding: "utf8" });
11
+ // Some manifests were written by PowerShell with a UTF-8 BOM, which JSON.parse rejects.
12
+ return JSON.parse(contents.replace(/^\uFEFF/, ""));
13
+ };
14
+ export const writeJsonFile = async (relativePath, payload) => {
15
+ const filePath = workspacePath(relativePath);
16
+ await ensureDir(path.dirname(filePath));
17
+ const formatted = `${JSON.stringify(payload, null, 2)}\n`;
18
+ await writeFile(filePath, formatted, { encoding: "utf8" });
19
+ };
20
+ export const exists = async (relativePath) => pathExists(workspacePath(relativePath));
21
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,QAAkB,EAAE,EAAE,CACrD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,YAAoB,EAAE,EAAE;IAC5D,MAAM,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAK,YAAoB,EAAc,EAAE;IACxE,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,wFAAwF;IACxF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAM,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,YAAoB,EAAE,OAAgB,EAAE,EAAE;IAC5E,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC1D,MAAM,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,YAAoB,EAAE,EAAE,CACnD,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ export type CreateRepoOptions = {
2
+ org?: string;
3
+ name: string;
4
+ description?: string;
5
+ private?: boolean;
6
+ token?: string;
7
+ };
8
+ export declare const ensureGithubRepo: (opts: CreateRepoOptions) => Promise<{
9
+ created: boolean;
10
+ message: string;
11
+ repo?: undefined;
12
+ details?: undefined;
13
+ } | {
14
+ created: boolean;
15
+ message: string;
16
+ repo: any;
17
+ details?: undefined;
18
+ } | {
19
+ created: boolean;
20
+ message: any;
21
+ details: any;
22
+ repo?: undefined;
23
+ }>;
@@ -0,0 +1,66 @@
1
+ import https from "node:https";
2
+ import { URL } from "node:url";
3
+ const requestJson = (url, token, body) => new Promise((resolve, reject) => {
4
+ try {
5
+ const u = new URL(url);
6
+ const data = JSON.stringify(body);
7
+ const headers = {
8
+ Authorization: token ? `token ${token}` : "",
9
+ "Content-Type": "application/json",
10
+ Accept: "application/vnd.github+json",
11
+ "User-Agent": "blkc-cli",
12
+ "Content-Length": Buffer.byteLength(data).toString(),
13
+ };
14
+ const opts = {
15
+ method: "POST",
16
+ hostname: u.hostname,
17
+ path: u.pathname + (u.search ?? ""),
18
+ headers,
19
+ };
20
+ const req = https.request(opts, (res) => {
21
+ let raw = "";
22
+ res.setEncoding("utf8");
23
+ res.on("data", (chunk) => (raw += chunk));
24
+ res.on("end", () => {
25
+ try {
26
+ const parsed = raw ? JSON.parse(raw) : {};
27
+ resolve({ statusCode: res.statusCode, body: parsed });
28
+ }
29
+ catch (err) {
30
+ reject(err);
31
+ }
32
+ });
33
+ });
34
+ req.on("error", (err) => reject(err));
35
+ req.write(data);
36
+ req.end();
37
+ }
38
+ catch (error) {
39
+ reject(error);
40
+ }
41
+ });
42
+ export const ensureGithubRepo = async (opts) => {
43
+ if (!opts.token) {
44
+ return { created: false, message: "No GITHUB_TOKEN provided; skipping GitHub repo creation." };
45
+ }
46
+ const url = opts.org
47
+ ? `https://api.github.com/orgs/${opts.org}/repos`
48
+ : `https://api.github.com/user/repos`;
49
+ const body = {
50
+ name: opts.name,
51
+ description: opts.description ?? "",
52
+ private: !!opts.private,
53
+ auto_init: true,
54
+ };
55
+ try {
56
+ const res = await requestJson(url, opts.token, body);
57
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
58
+ return { created: true, message: "Repository created", repo: res.body.html_url };
59
+ }
60
+ return { created: false, message: res.body?.message || "Failed to create repo", details: res.body };
61
+ }
62
+ catch (error) {
63
+ return { created: false, message: error.message };
64
+ }
65
+ };
66
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/utils/github.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,41 @@
1
1
  {
2
2
  "name": "@blkc-code/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "license": "Apache-2.0",
5
+ "type": "module",
6
+ "bin": {
7
+ "blkc": "dist/index.js"
8
+ },
9
+ "main": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "clean": "rimraf dist",
17
+ "typecheck": "tsc --noEmit -p tsconfig.json",
18
+ "lint": "eslint \"src/**/*.{ts,tsx}\"",
19
+ "test": "vitest"
20
+ },
21
+ "dependencies": {
22
+ "@blkc-code/core": "0.1.0",
23
+ "@blkc-code/logbook": "0.1.0",
24
+ "@commander-js/extra-typings": "^12.1.0",
25
+ "chalk": "^5.3.0",
26
+ "commander": "^12.1.0",
27
+ "fs-extra": "^11.2.0",
28
+ "inquirer": "^12.3.0",
29
+ "ora": "^8.0.1"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^20.14.9",
33
+ "@typescript-eslint/eslint-plugin": "^8.44.0",
34
+ "@typescript-eslint/parser": "^8.44.0",
35
+ "eslint": "^9.16.0",
36
+ "eslint-config-prettier": "^10.1.1",
37
+ "rimraf": "^6.0.1",
38
+ "typescript": "^5.6.3",
39
+ "vitest": "^3.2.4"
40
+ }
41
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.