@kb-labs/scaffold 2.39.0 → 2.40.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"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","file":"scaffold.js","sourcesContent":["import { dirname, resolve, relative } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport {\n defineCommand,\n type PluginContextV3,\n type CLIInput,\n} from '@kb-labs/sdk';\nimport {\n build,\n inspectTarget,\n formatTree,\n listEntities,\n loadEntity,\n resolveBlocks,\n runValidator,\n writeFiles,\n} from '@kb-labs/scaffold-core';\nimport type {\n RenderContext,\n} from '@kb-labs/scaffold-contracts';\nimport { formatCommandHelp } from '@kb-labs/shared-cli-ui';\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_ROOT = resolve(here, '..', '..', 'templates');\n\nconst SCAFFOLD_FLAGS = [\n { name: 'scope', description: 'npm scope, e.g. @my-org' },\n { name: 'blocks', description: 'comma-separated block ids to include' },\n { name: 'out', description: 'custom output directory' },\n { name: 'force', description: 'overwrite existing output directory' },\n { name: 'dry-run', description: 'preview files without writing' },\n];\n\ninterface ScaffoldFlags {\n blocks?: string;\n force?: boolean;\n 'dry-run'?: boolean;\n out?: string;\n scope?: string;\n mode?: string;\n}\n\ntype ScaffoldResult = {\n exitCode: number;\n result?: { outRoot: string; files: number };\n};\n\nasync function readVersion(pkgPath: string): Promise<string> {\n try {\n const raw = await readFile(pkgPath, 'utf8');\n const parsed = JSON.parse(raw) as { version?: string };\n return parsed.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nconst FALLBACK_VERSIONS = {\n sdk: '2.18.0',\n devkit: '2.28.0',\n commandKit: '2.30.0',\n} as const;\n\nasync function detectVersions(): Promise<Record<string, string>> {\n const req = createRequire(import.meta.url);\n const readPkg = async (spec: string, fallback: string): Promise<string> => {\n try {\n const resolved = req.resolve(spec);\n const v = await readVersion(resolved);\n return v === '0.0.0' ? fallback : v;\n } catch {\n return fallback;\n }\n };\n const [sdk, devkit, commandKit] = await Promise.all([\n readPkg('@kb-labs/sdk/package.json', FALLBACK_VERSIONS.sdk),\n readPkg('@kb-labs/devkit/package.json', FALLBACK_VERSIONS.devkit),\n readPkg('@kb-labs/shared-command-kit/package.json', FALLBACK_VERSIONS.commandKit),\n ]);\n return { sdk, devkit, commandKit };\n}\n\nfunction parsePositional(argv: string[] | undefined): {\n entity?: string;\n name?: string;\n} {\n if (!argv || argv.length === 0) return {};\n const positional = argv.filter((a) => !a.startsWith('-'));\n return { entity: positional[0], name: positional[1] };\n}\n\nasync function runDefault(\n ctx: PluginContextV3,\n rawInput: CLIInput<ScaffoldFlags>,\n): Promise<ScaffoldResult> {\n const start = Date.now();\n const input = { ...rawInput.flags, argv: rawInput.argv };\n\n const { entity: entityArg, name: nameArg } = parsePositional(input.argv);\n\n const available = await listEntities(TEMPLATES_ROOT);\n if (available.length === 0) {\n ctx.ui?.error?.('No scaffold templates found. Reinstall @kb-labs/scaffold.');\n return { exitCode: 1 };\n }\n\n if (!entityArg) {\n ctx.ui?.write?.(formatCommandHelp({\n title: 'kb scaffold run',\n description: 'Scaffold a new plugin, adapter, or other entity from a template.',\n examples: available.map((e) => `kb scaffold run ${e} my-${e}`),\n flags: SCAFFOLD_FLAGS,\n }) + '\\n');\n ctx.ui?.info?.(`Available entities: ${available.join(', ')}`);\n return { exitCode: 1 };\n }\n\n if (!available.includes(entityArg)) {\n ctx.ui?.error?.(`Unknown entity \"${entityArg}\". Available: ${available.join(', ')}`);\n return { exitCode: 1 };\n }\n\n if (!nameArg) {\n ctx.ui?.write?.(formatCommandHelp({\n title: `kb scaffold run ${entityArg} <name>`,\n description: `Scaffold a new ${entityArg}. Provide a name to continue.`,\n examples: [`kb scaffold run ${entityArg} my-${entityArg}`],\n flags: SCAFFOLD_FLAGS,\n }) + '\\n');\n return { exitCode: 1 };\n }\n\n const problem = runValidator('npmName', nameArg);\n if (problem) {\n ctx.ui?.error?.(`Invalid name \"${nameArg}\": ${problem}`);\n ctx.ui?.info?.('Name must be lowercase, no spaces, valid npm package name.');\n return { exitCode: 1 };\n }\n\n const entity = await loadEntity(TEMPLATES_ROOT, entityArg);\n\n const vars: Record<string, unknown> = {};\n for (const v of entity.variables) {\n if (v.name === 'scope' && input.scope !== undefined) {\n vars[v.name] = input.scope;\n } else if (v.name === 'mode' && input.mode !== undefined) {\n vars[v.name] = input.mode;\n } else {\n vars[v.name] = v.default ?? '';\n }\n }\n\n let selectedBlocks: string[];\n if (input.blocks) {\n selectedBlocks = input.blocks\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n } else {\n selectedBlocks = entity.defaults?.blocks ?? entity.blocks.map((b) => b.id);\n }\n\n try {\n resolveBlocks(entity.blocks, selectedBlocks);\n } catch (e) {\n ctx.ui?.error?.((e as Error).message);\n return { exitCode: 1 };\n }\n\n for (const blockId of selectedBlocks) {\n const block = entity.blocks.find((b) => b.id === blockId);\n for (const v of block?.variables ?? []) {\n vars[v.name] = v.default ?? '';\n }\n }\n\n const scope = (vars.scope as string) ?? input.scope ?? '';\n const mode = (input.mode ?? (vars.mode as string) ?? 'in-workspace') as\n | 'in-workspace'\n | 'standalone';\n\n const versions = await detectVersions();\n\n const context: RenderContext = {\n name: nameArg,\n scope,\n vars,\n blocks: selectedBlocks,\n mode,\n versions,\n };\n\n const result = await build({\n entity,\n selectedBlockIds: selectedBlocks,\n context,\n });\n\n const outRoot = input.out ?? result.outRoot;\n const state = await inspectTarget(outRoot);\n\n if (input['dry-run']) {\n ctx.ui?.success?.('Dry run complete', {\n title: 'scaffold run — dry run',\n sections: [\n { header: 'Would write to', items: [outRoot] },\n { header: 'Files', items: formatTree(result.files).split('\\n').filter(Boolean) },\n ],\n });\n return { exitCode: 0, result: { outRoot, files: result.files.length } };\n }\n\n if (state.exists && !state.empty) {\n if (input.force) {\n ctx.ui?.warn?.(`--force: overwriting ${outRoot}`);\n } else {\n ctx.ui?.error?.(`Output directory \"${outRoot}\" already exists and is not empty.`);\n ctx.ui?.info?.('Use --force to overwrite.');\n return { exitCode: 1 };\n }\n }\n\n await writeFiles({ outRoot, files: result.files, force: input.force });\n\n const entryPkgDir =\n entityArg === 'plugin'\n ? `${outRoot}/packages/${nameArg}-entry`\n : outRoot;\n\n const linked = await linkWithMarketplace(entryPkgDir);\n\n const registrationNote =\n linked === 'ok'\n ? 'Registered in .kb/marketplace.lock'\n : `Not auto-registered — run: kb marketplace plugins link ${entryPkgDir}`;\n\n const timing = Date.now() - start;\n\n ctx.ui?.success?.(`Scaffolded ${entityArg} \"${nameArg}\"`, {\n title: 'scaffold run',\n sections: [\n {\n header: 'Output',\n items: [outRoot],\n },\n {\n header: 'Marketplace',\n items: [registrationNote],\n },\n {\n header: 'Next steps',\n items: [\n 'pnpm install',\n 'pnpm -w build',\n `pnpm kb ${nameArg} hello # try it`,\n `pnpm kb scaffold doctor --path ${dirname(outRoot)}`,\n ],\n },\n ],\n timing,\n });\n\n return {\n exitCode: 0,\n result: { outRoot, files: result.files.length },\n };\n}\n\ntype LinkOutcome = 'ok' | 'no-shell' | 'failed';\n\n/**\n * Register a scaffolded plugin directly in marketplace.lock.\n */\nasync function linkWithMarketplace(entryPkgDir: string): Promise<LinkOutcome> {\n try {\n const selfPath = fileURLToPath(import.meta.url);\n const nmIdx = selfPath.lastIndexOf('/node_modules/');\n if (nmIdx < 0) return 'failed';\n const platformDir = selfPath.slice(0, nmIdx);\n\n const lockPath = resolve(platformDir, '.kb', 'marketplace.lock');\n\n let lock: { schema: string; installed: Record<string, unknown> };\n try {\n lock = JSON.parse(await readFile(lockPath, 'utf8'));\n } catch {\n lock = { schema: 'kb.marketplace/2', installed: {} };\n }\n\n const pkgJsonPath = resolve(entryPkgDir, 'package.json');\n const pkgRaw = await readFile(pkgJsonPath, 'utf8');\n const pkg = JSON.parse(pkgRaw) as { name?: string; version?: string; kb?: { manifest?: string } };\n if (!pkg.name) return 'failed';\n\n const hash = createHash('sha256').update(pkgRaw).digest('base64');\n const provides: string[] = ['plugin', 'cli-command'];\n const resolvedPath = relative(platformDir, resolve(entryPkgDir));\n const pluginId = pkg.name.replace(/-entry$/, '');\n\n lock.installed[pluginId] = {\n version: pkg.version ?? '0.1.0',\n integrity: `sha256-${hash}`,\n resolvedPath: `./${resolvedPath}`,\n installedAt: new Date().toISOString(),\n source: 'local',\n primaryKind: 'plugin',\n provides,\n enabled: true,\n };\n\n await mkdir(dirname(lockPath), { recursive: true });\n await writeFile(lockPath, JSON.stringify(lock, null, 2));\n return 'ok';\n } catch {\n return 'failed';\n }\n}\n\nexport default defineCommand({\n id: 'scaffold:run',\n description: 'Scaffold <entity> <name> from blocks',\n\n handler: {\n execute: runDefault,\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"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","file":"scaffold.js","sourcesContent":["import { dirname, resolve, relative } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport {\n defineCommand,\n type PluginContextV3,\n type CLIInput,\n} from '@kb-labs/sdk';\nimport {\n build,\n inspectTarget,\n formatTree,\n listEntities,\n loadEntity,\n resolveBlocks,\n runValidator,\n writeFiles,\n} from '@kb-labs/scaffold-core';\nimport type {\n RenderContext,\n} from '@kb-labs/scaffold-contracts';\nimport { formatCommandHelp } from '@kb-labs/shared-cli-ui';\n\nconst here = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_ROOT = resolve(here, '..', '..', 'templates');\n\nconst SCAFFOLD_FLAGS = [\n { name: 'scope', description: 'npm scope, e.g. @my-org' },\n { name: 'blocks', description: 'comma-separated block ids to include' },\n { name: 'out', description: 'custom output directory' },\n { name: 'force', description: 'overwrite existing output directory' },\n { name: 'dry-run', description: 'preview files without writing' },\n];\n\ninterface ScaffoldFlags {\n blocks?: string;\n force?: boolean;\n 'dry-run'?: boolean;\n out?: string;\n scope?: string;\n mode?: string;\n}\n\ntype ScaffoldResult = {\n exitCode: number;\n result?: { outRoot: string; files: number };\n};\n\nasync function readVersion(pkgPath: string): Promise<string> {\n try {\n const raw = await readFile(pkgPath, 'utf8');\n const parsed = JSON.parse(raw) as { version?: string };\n return parsed.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nconst FALLBACK_VERSIONS = {\n sdk: '2.18.0',\n devkit: '2.28.0',\n commandKit: '2.30.0',\n} as const;\n\nasync function detectVersions(): Promise<Record<string, string>> {\n const req = createRequire(import.meta.url);\n const readPkg = async (spec: string, fallback: string): Promise<string> => {\n try {\n const resolved = req.resolve(spec);\n const v = await readVersion(resolved);\n return v === '0.0.0' ? fallback : v;\n } catch {\n return fallback;\n }\n };\n const [sdk, devkit, commandKit] = await Promise.all([\n readPkg('@kb-labs/sdk/package.json', FALLBACK_VERSIONS.sdk),\n readPkg('@kb-labs/devkit/package.json', FALLBACK_VERSIONS.devkit),\n readPkg('@kb-labs/shared-command-kit/package.json', FALLBACK_VERSIONS.commandKit),\n ]);\n return { sdk, devkit, commandKit };\n}\n\nfunction parsePositional(argv: string[] | undefined): {\n entity?: string;\n name?: string;\n} {\n if (!argv || argv.length === 0) return {};\n const positional = argv.filter((a) => !a.startsWith('-'));\n return { entity: positional[0], name: positional[1] };\n}\n\nasync function runDefault(\n ctx: PluginContextV3,\n rawInput: CLIInput<ScaffoldFlags>,\n): Promise<ScaffoldResult> {\n const start = Date.now();\n const input = { ...rawInput.flags, argv: rawInput.argv };\n\n const { entity: entityArg, name: nameArg } = parsePositional(input.argv);\n\n const available = await listEntities(TEMPLATES_ROOT);\n if (available.length === 0) {\n ctx.ui?.error?.('No scaffold templates found. Reinstall @kb-labs/scaffold.');\n return { exitCode: 1 };\n }\n\n if (!entityArg) {\n ctx.ui?.write?.(formatCommandHelp({\n title: 'kb scaffold run',\n description: 'Scaffold a new plugin, adapter, or other entity from a template.',\n examples: available.map((e) => `kb scaffold run ${e} my-${e}`),\n flags: SCAFFOLD_FLAGS,\n }) + '\\n');\n ctx.ui?.info?.(`Available entities: ${available.join(', ')}`);\n return { exitCode: 1 };\n }\n\n if (!available.includes(entityArg)) {\n ctx.ui?.error?.(`Unknown entity \"${entityArg}\". Available: ${available.join(', ')}`);\n return { exitCode: 1 };\n }\n\n if (!nameArg) {\n ctx.ui?.write?.(formatCommandHelp({\n title: `kb scaffold run ${entityArg} <name>`,\n description: `Scaffold a new ${entityArg}. Provide a name to continue.`,\n examples: [`kb scaffold run ${entityArg} my-${entityArg}`],\n flags: SCAFFOLD_FLAGS,\n }) + '\\n');\n return { exitCode: 1 };\n }\n\n const problem = runValidator('npmName', nameArg);\n if (problem) {\n ctx.ui?.error?.(`Invalid name \"${nameArg}\": ${problem}`);\n ctx.ui?.info?.('Name must be lowercase, no spaces, valid npm package name.');\n return { exitCode: 1 };\n }\n\n const entity = await loadEntity(TEMPLATES_ROOT, entityArg);\n\n const vars: Record<string, unknown> = {};\n for (const v of entity.variables) {\n if (v.name === 'scope' && input.scope !== undefined) {\n vars[v.name] = input.scope;\n } else if (v.name === 'mode' && input.mode !== undefined) {\n vars[v.name] = input.mode;\n } else {\n vars[v.name] = v.default ?? '';\n }\n }\n\n let selectedBlocks: string[];\n if (input.blocks) {\n selectedBlocks = input.blocks\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n } else {\n selectedBlocks = entity.defaults?.blocks ?? entity.blocks.map((b) => b.id);\n }\n\n try {\n resolveBlocks(entity.blocks, selectedBlocks);\n } catch (e) {\n ctx.ui?.error?.((e as Error).message);\n return { exitCode: 1 };\n }\n\n for (const blockId of selectedBlocks) {\n const block = entity.blocks.find((b) => b.id === blockId);\n for (const v of block?.variables ?? []) {\n vars[v.name] = v.default ?? '';\n }\n }\n\n const scope = (vars.scope as string) ?? input.scope ?? '';\n const mode = (input.mode ?? (vars.mode as string) ?? 'in-workspace') as\n | 'in-workspace'\n | 'standalone';\n\n const versions = await detectVersions();\n\n const context: RenderContext = {\n name: nameArg,\n scope,\n vars,\n blocks: selectedBlocks,\n mode,\n versions,\n };\n\n const result = await build({\n entity,\n selectedBlockIds: selectedBlocks,\n context,\n });\n\n const outRoot = input.out ?? result.outRoot;\n const state = await inspectTarget(outRoot);\n\n if (input['dry-run']) {\n ctx.ui?.success?.('Dry run complete', {\n title: 'scaffold run — dry run',\n sections: [\n { header: 'Would write to', items: [outRoot] },\n { header: 'Files', items: formatTree(result.files).split('\\n').filter(Boolean) },\n ],\n });\n return { exitCode: 0, result: { outRoot, files: result.files.length } };\n }\n\n if (state.exists && !state.empty) {\n if (input.force) {\n ctx.ui?.warn?.(`--force: overwriting ${outRoot}`);\n } else {\n ctx.ui?.error?.(`Output directory \"${outRoot}\" already exists and is not empty.`);\n ctx.ui?.info?.('Use --force to overwrite.');\n return { exitCode: 1 };\n }\n }\n\n await writeFiles({ outRoot, files: result.files, force: input.force });\n\n const entryPkgDir =\n entityArg === 'plugin'\n ? `${outRoot}/packages/${nameArg}-entry`\n : outRoot;\n\n const linked = await linkWithMarketplace(entryPkgDir);\n\n const registrationNote =\n linked === 'ok'\n ? 'Registered in .kb/marketplace.lock'\n : `Not auto-registered — run: kb marketplace plugins link ${entryPkgDir}`;\n\n const timing = Date.now() - start;\n\n ctx.ui?.success?.(`Scaffolded ${entityArg} \"${nameArg}\"`, {\n title: 'scaffold run',\n sections: [\n {\n header: 'Output',\n items: [outRoot],\n },\n {\n header: 'Marketplace',\n items: [registrationNote],\n },\n {\n header: 'Next steps',\n items: [\n `cd ${outRoot}`,\n 'pnpm install',\n 'pnpm -w build',\n `pnpm kb ${nameArg} hello # try it`,\n `pnpm kb scaffold doctor --path ${dirname(outRoot)}`,\n ],\n },\n ],\n timing,\n });\n\n return {\n exitCode: 0,\n result: { outRoot, files: result.files.length },\n };\n}\n\ntype LinkOutcome = 'ok' | 'no-shell' | 'failed';\n\n/**\n * Register a scaffolded plugin directly in marketplace.lock.\n */\nasync function linkWithMarketplace(entryPkgDir: string): Promise<LinkOutcome> {\n try {\n const selfPath = fileURLToPath(import.meta.url);\n const nmIdx = selfPath.lastIndexOf('/node_modules/');\n if (nmIdx < 0) return 'failed';\n const platformDir = selfPath.slice(0, nmIdx);\n\n const lockPath = resolve(platformDir, '.kb', 'marketplace.lock');\n\n let lock: { schema: string; installed: Record<string, unknown> };\n try {\n lock = JSON.parse(await readFile(lockPath, 'utf8'));\n } catch {\n lock = { schema: 'kb.marketplace/2', installed: {} };\n }\n\n const pkgJsonPath = resolve(entryPkgDir, 'package.json');\n const pkgRaw = await readFile(pkgJsonPath, 'utf8');\n const pkg = JSON.parse(pkgRaw) as { name?: string; version?: string; kb?: { manifest?: string } };\n if (!pkg.name) return 'failed';\n\n const hash = createHash('sha256').update(pkgRaw).digest('base64');\n const provides: string[] = ['plugin', 'cli-command'];\n const resolvedPath = relative(platformDir, resolve(entryPkgDir));\n const pluginId = pkg.name.replace(/-entry$/, '');\n\n lock.installed[pluginId] = {\n version: pkg.version ?? '0.1.0',\n integrity: `sha256-${hash}`,\n resolvedPath: `./${resolvedPath}`,\n installedAt: new Date().toISOString(),\n source: 'local',\n primaryKind: 'plugin',\n provides,\n enabled: true,\n };\n\n await mkdir(dirname(lockPath), { recursive: true });\n await writeFile(lockPath, JSON.stringify(lock, null, 2));\n return 'ok';\n } catch {\n return 'failed';\n }\n}\n\nexport default defineCommand({\n id: 'scaffold:run',\n description: 'Scaffold <entity> <name> from blocks',\n\n handler: {\n execute: runDefault,\n },\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/scaffold",
|
|
3
3
|
"description": "Generic entity scaffolder for KB Labs plugins, adapters, and friends.",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.40.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
"templates"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@kb-labs/scaffold-
|
|
24
|
-
"@kb-labs/
|
|
25
|
-
"@kb-labs/
|
|
26
|
-
"@kb-labs/
|
|
23
|
+
"@kb-labs/scaffold-contracts": "2.40.0",
|
|
24
|
+
"@kb-labs/scaffold-core": "2.40.0",
|
|
25
|
+
"@kb-labs/sdk": "2.20.0",
|
|
26
|
+
"@kb-labs/shared-cli-ui": "2.40.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^24.3.3",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"tsup": "^8.5.0",
|
|
33
33
|
"typescript": "^5.6.3",
|
|
34
34
|
"vitest": "^3.2.4",
|
|
35
|
-
"@kb-labs/
|
|
36
|
-
"@kb-labs/
|
|
35
|
+
"@kb-labs/plugin-contracts": "2.40.0",
|
|
36
|
+
"@kb-labs/devkit": "2.40.0"
|
|
37
37
|
},
|
|
38
38
|
"engines": {
|
|
39
39
|
"node": ">=20.0.0",
|