@kb-labs/impact-core 0.5.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 +120 -0
- package/dist/cli/commands/check.d.ts +13 -0
- package/dist/cli/commands/check.js +694 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +12 -0
- package/dist/cli/commands/docs.js +508 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/packages.d.ts +12 -0
- package/dist/cli/commands/packages.js +610 -0
- package/dist/cli/commands/packages.js.map +1 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.js +645 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.v3.d.ts +37 -0
- package/dist/manifest.v3.js +80 -0
- package/dist/manifest.v3.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/workspace.ts","../../../src/core/changed-packages.ts","../../../src/core/dependency-graph.ts","../../../src/core/package-analyzer.ts","../../../src/core/doc-analyzer.ts","../../../src/core/impact-rules.ts","../../../src/core/formatter.ts","../../../src/cli/commands/docs.ts"],"names":["join","existsSync","readFileSync","readdirSync"],"mappings":"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","file":"docs.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout โ top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ โ treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct โ packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import type { DocImpact, ImpactPluginConfig, PackageImpact } from '@kb-labs/impact-contracts';\n\nfunction matchesRule(packageName: string, pattern: string): boolean {\n if (pattern === packageName) {return true;}\n if (pattern === '__new_package__') {return false;} // handled separately\n\n // Simple glob: *-cli matches @kb-labs/agent-cli\n if (pattern.startsWith('*')) {\n return packageName.endsWith(pattern.slice(1));\n }\n if (pattern.endsWith('*')) {\n return packageName.startsWith(pattern.slice(0, -1));\n }\n\n return false;\n}\n\nexport function analyzeDocImpact(\n impactedPackages: PackageImpact[],\n config: ImpactPluginConfig,\n): { stale: DocImpact[]; review: DocImpact[]; reindex: DocImpact[] } {\n const stale: DocImpact[] = [];\n const review: DocImpact[] = [];\n const reindex: DocImpact[] = [];\n\n const seenDocs = new Set<string>();\n\n for (const pkg of impactedPackages) {\n for (const rule of config.docRules) {\n if (!matchesRule(pkg.name, rule.match)) {continue;}\n\n if (rule.action === 'reindex') {\n const key = `reindex:${rule.command ?? ''}`;\n if (!seenDocs.has(key)) {\n seenDocs.add(key);\n reindex.push({\n reason: `${pkg.name} changed`,\n action: 'reindex',\n command: rule.command,\n });\n }\n continue;\n }\n\n for (const doc of rule.docs ?? []) {\n const key = `${rule.action}:${doc}`;\n if (seenDocs.has(key)) {continue;}\n seenDocs.add(key);\n\n const impact: DocImpact = {\n file: doc,\n reason: `${pkg.name} changed`,\n action: rule.action,\n command: rule.command,\n };\n\n if (rule.action === 'regenerate') {stale.push(impact);}\n else {review.push(impact);}\n }\n }\n }\n\n return { stale, review, reindex };\n}\n","import { DEFAULT_IMPACT_CONFIG, type ImpactPluginConfig } from '@kb-labs/impact-contracts';\n\nexport async function loadImpactRules(useConfigFn?: () => Promise<Partial<ImpactPluginConfig> | undefined>): Promise<ImpactPluginConfig> {\n if (useConfigFn) {\n try {\n const config = await useConfigFn();\n if (config?.docRules?.length) {return { docRules: config.docRules };}\n } catch { /* fallback to defaults */ }\n }\n return DEFAULT_IMPACT_CONFIG;\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}๐ Impact Analysis${RESET}`);\n lines.push('');\n\n // โโ Package Impact โโ\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}๐ฆ Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} โ ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}โ ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}โ ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // โโ Build Impact โโ\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}๐จ Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}โ ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}โ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // โโ Doc Impact โโ\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}๐ Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} โ ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}โ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} โ ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}โ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // โโ Test Impact โโ\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}๐งช Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` โ ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}โ ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}โ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}โ ๏ธ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}โ ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // โโ Recommendations โโ\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}โ ๏ธ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` โข ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}โ
No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeDocImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface DocsFlags {\n json?: boolean;\n}\n\ninterface DocsInput {\n argv: string[];\n flags: DocsFlags;\n}\n\nexport default defineCommand<unknown, DocsInput, unknown>({\n id: 'impact:docs',\n description: 'Documentation impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: DocsInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as DocsFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ docs: { stale: [], review: [], reindex: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { exitCode: 1 };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { docs: { stale: [], review: [], reindex: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { exitCode: 0, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent];\n const docs = analyzeDocImpact(allImpacted, rules);\n const recommendations: string[] = [];\n for (const d of docs.stale) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n for (const d of docs.reindex) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n\n const result = { docs, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages: { direct: [], dependent: [], transitive: [] },\n docs,\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations,\n }));\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
|
|
3
|
+
interface PkgFlags {
|
|
4
|
+
json?: boolean;
|
|
5
|
+
}
|
|
6
|
+
interface PkgInput {
|
|
7
|
+
argv: string[];
|
|
8
|
+
flags: PkgFlags;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, PkgInput, unknown>;
|
|
11
|
+
|
|
12
|
+
export { _default as default };
|