@kb-labs/devlink-entry 2.118.2 → 2.119.0-canary.0c078654e
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/dist/cli/commands/backups.js.map +1 -1
- package/dist/cli/commands/freeze.js.map +1 -1
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/switch.js.map +1 -1
- package/dist/cli/commands/undo.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.js.map +1 -1
- package/package.json +5 -5
- package/dist/manifest.json +0 -405
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/cli/commands/backups.ts"],"names":["backups","result"],"mappings":"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","file":"backups.js","sourcesContent":["import { defineCommand, useLoader, TimingTracker, handleError, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { listBackups, restoreBackup } from '@kb-labs/devlink-core';\nimport type { DevlinkBackup } from '@kb-labs/devlink-contracts';\n\ninterface BackupsFlags {\n restore?: string;\n json?: boolean;\n}\n\ninterface BackupsInput {\n argv?: string[];\n flags?: BackupsFlags;\n restore?: string;\n json?: boolean;\n}\n\ninterface BackupsResult {\n backups: DevlinkBackup[];\n restored?: number;\n}\n\nexport default defineCommand<unknown, BackupsInput, BackupsResult>({\n id: 'devlink:backups',\n description: 'List and restore backups',\n\n handler: {\n async execute(ctx: PluginContextV3, input: BackupsInput): Promise<CommandResult<BackupsResult>> {\n const tracker = new TimingTracker();\n const flags = (input.flags ?? input) as BackupsFlags;\n const outputJson = flags.json ?? false;\n const restoreId = flags.restore;\n\n const rootDir = ctx.cwd ?? process.cwd();\n\n // ─── Restore mode ────────────────────────────────────────────────────────\n if (restoreId) {\n const loader = useLoader(`Restoring backup ${restoreId}...`);\n loader.start();\n\n let restored: number;\n let errors: string[];\n try {\n ({ restored, errors } = restoreBackup(rootDir, restoreId));\n } catch (err) {\n loader.fail('Restore failed');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Backup operation failed' };\n }\n loader.succeed(`Restored ${restored} file(s)`);\n tracker.checkpoint('restore');\n\n const backups = listBackups(rootDir);\n const result: BackupsResult = { backups, restored };\n\n if (outputJson) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.success?.(`Restored ${restored} file(s) from backup ${restoreId}`, {\n title: 'DevLink — Restore Backup',\n sections: [\n ...(errors.length > 0 ? [{ header: 'Errors', items: errors }] : []),\n { header: 'Next step', items: ['Run pnpm install to apply changes'] },\n ],\n timing: tracker.total(),\n });\n }\n\n return { ok: true, result, meta: { timing: tracker.total() } };\n }\n\n // ─── List mode ───────────────────────────────────────────────────────────\n const backups = listBackups(rootDir);\n tracker.checkpoint('list');\n\n const result: BackupsResult = { backups };\n\n if (outputJson) {\n ctx.ui?.json?.(result);\n } else {\n if (backups.length === 0) {\n ctx.ui?.info?.('No backups found. Backups are created automatically before each switch.');\n } else {\n const items = backups.map(b =>\n `[${b.id}] ${b.timestamp.slice(0, 19).replace('T', ' ')} — ${b.description} (${b.files.length} files)`\n );\n ctx.ui?.success?.(`${backups.length} backup(s) available`, {\n title: 'DevLink — Backups',\n sections: [\n { header: 'Backups (newest first)', items },\n { header: 'Restore', items: ['kb devlink backups --restore <id>'] },\n ],\n timing: tracker.total(),\n });\n }\n }\n\n return { ok: true, result, meta: { timing: tracker.total() } };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/cli/commands/freeze.ts"],"names":[],"mappings":";;;;AAcA,IAAO,iBAAQ,aAAA,CAA8C;AAAA,EAC3D,EAAA,EAAI,gBAAA;AAAA,EACJ,WAAA,EAAa,8CAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,MAAA,CAAO,IAAA,EAAuB,MAAA,EAAqB;AACvD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,8CAAA;AAAA,QACT,UAAA,EAAY;AAAA,UACV,EAAE,MAAM,QAAA,EAAmB,QAAA,EAAU,QAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,uBAAA,EAAwB;AAAE;AAC1F,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAsD;AACxF,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,EAAc;AAClC,MAAA,MAAM,KAAA,GAAS,MAAM,KAAA,IAAS,KAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,IAAQ,KAAA;AAEjC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEvC,MAAA,MAAM,MAAA,GAAS,UAAU,2BAA2B,CAAA;AACpD,MAAA,MAAA,CAAO,KAAA,EAAM;AAEb,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,QAAA,MAAM,SAAA,GAAY,kBAAkB,OAAO,CAAA;AAC3C,QAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,KAAA;AACzC,QAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,SAAA,EAAW,OAAA,EAAS,QAAW,WAAW,CAAA;AAC3F,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,WAAA,EAAa,UAAA,EAAY,WAAW,OAAO,CAAA;AAClE,QAAA,IAAA,GAAO,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,MAC7B,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO,KAAK,wBAAwB,CAAA;AACpC,QAAA,WAAA,CAAY,GAAA,EAAK,KAAK,UAAU,CAAA;AAChC,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,MACvD;AACA,MAAA,MAAA,CAAO,QAAQ,cAAc,CAAA;AAC7B,MAAA,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAE3B,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,IAAI,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,EAAA,EAAI,UAAU,mCAAA,EAAqC;AAAA,UACrD,KAAA,EAAO,uBAAA;AAAA,UACP,QAAA,EAAU;AAAA,YACR;AAAA,cACE,MAAA,EAAQ,WAAA;AAAA,cACR,KAAA,EAAO;AAAA,gBACL,CAAA,MAAA,EAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,gBACvB,CAAA,WAAA,EAAc,KAAK,QAAQ,CAAA,CAAA;AAAA,gBAC3B,CAAA,+BAAA;AAAA;AACF;AACF,WACF;AAAA,UACA,MAAA,EAAQ,QAAQ,KAAA;AAAM,SACvB,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAM,EAAE,EAAE;AAAA,IACrE;AAAA;AAEJ,CAAC","file":"freeze.js","sourcesContent":["import { defineCommand, useLoader, TimingTracker, handleError, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { discoverMonorepos, buildPackageMapFiltered, buildPlan, freeze, loadState } from '@kb-labs/devlink-core';\nimport type { LockFile } from '@kb-labs/devlink-core';\n\ninterface FreezeFlags {\n json?: boolean;\n}\n\ninterface FreezeInput {\n argv?: string[];\n flags?: FreezeFlags;\n json?: boolean;\n}\n\nexport default defineCommand<unknown, FreezeInput, LockFile>({\n id: 'devlink:freeze',\n description: 'Freeze current dependency state to lock file',\n\n handler: {\n async intent(_ctx: PluginContextV3, _input: FreezeInput) {\n return {\n summary: 'Freeze current dependency state to lock file',\n operations: [\n { type: 'create' as const, resource: 'file', details: { path: '.kb/devlink/lock.json' } },\n ],\n };\n },\n\n async execute(ctx: PluginContextV3, input: FreezeInput): Promise<CommandResult<LockFile>> {\n const tracker = new TimingTracker();\n const flags = (input.flags ?? input) as FreezeFlags;\n const outputJson = flags.json ?? false;\n\n const rootDir = ctx.cwd ?? process.cwd();\n\n const loader = useLoader('Freezing current state...');\n loader.start();\n\n let lock;\n try {\n const state = loadState(rootDir);\n const monorepos = discoverMonorepos(rootDir);\n const currentMode = state.currentMode ?? 'npm';\n const packageMap = await buildPackageMapFiltered(monorepos, rootDir, undefined, currentMode);\n const plan = buildPlan(currentMode, packageMap, monorepos, rootDir);\n lock = freeze(rootDir, plan);\n } catch (err) {\n loader.fail('Failed to freeze state');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Freeze operation failed' };\n }\n loader.succeed('State frozen');\n tracker.checkpoint('freeze');\n\n if (outputJson) {\n ctx.ui?.json?.(lock);\n } else {\n ctx.ui?.success?.('Current state frozen to lock file', {\n title: 'DevLink — Freeze',\n sections: [\n {\n header: 'Lock file',\n items: [\n `Mode: ${lock.plan.mode}`,\n `Frozen at: ${lock.frozenAt}`,\n `Location: .kb/devlink/lock.json`,\n ],\n },\n ],\n timing: tracker.total(),\n });\n }\n\n return { ok: true, result: lock, meta: { timing: tracker.total() } };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/cli/commands/plan.ts"],"names":[],"mappings":"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","file":"plan.js","sourcesContent":["import { defineCommand, useLoader, TimingTracker, handleError, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { discoverMonorepos, buildPackageMapFiltered, buildPlan, groupByMonorepo, loadState } from '@kb-labs/devlink-core';\nimport type { DevlinkMode, DevlinkPlan } from '@kb-labs/devlink-contracts';\n\ninterface PlanFlags {\n mode?: DevlinkMode;\n repos?: string;\n json?: boolean;\n ttl?: number;\n}\n\ninterface PlanInput {\n argv?: string[];\n flags?: PlanFlags;\n mode?: DevlinkMode;\n repos?: string;\n json?: boolean;\n}\n\nexport default defineCommand<unknown, PlanInput, DevlinkPlan>({\n id: 'devlink:plan',\n description: 'Preview what would change when switching mode',\n\n handler: {\n async execute(ctx: PluginContextV3, input: PlanInput): Promise<CommandResult<DevlinkPlan>> {\n const tracker = new TimingTracker();\n const flags = (input.flags ?? input) as PlanFlags;\n const outputJson = flags.json ?? false;\n const scopedRepos = flags.repos ? flags.repos.split(',').map(s => s.trim()) : undefined;\n const ttlMs = (flags.ttl ?? 24) * 60 * 60 * 1000;\n\n const rootDir = ctx.cwd ?? process.cwd();\n\n const loader = useLoader('Building plan...');\n loader.start();\n\n let plan;\n let targetMode: DevlinkMode;\n let currentModeBefore: DevlinkMode | undefined;\n try {\n const state = loadState(rootDir);\n currentModeBefore = state.currentMode ?? undefined;\n const monorepos = discoverMonorepos(rootDir);\n targetMode = flags.mode ?? (state.currentMode === 'npm' ? 'local' : 'npm');\n const packageMap = await buildPackageMapFiltered(monorepos, rootDir, ttlMs, targetMode);\n plan = buildPlan(targetMode, packageMap, monorepos, rootDir, { scopedRepos });\n } catch (err) {\n loader.fail('Failed to build plan');\n handleError(ctx, err, outputJson);\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n loader.succeed(`Plan ready: ${plan.items.length} change(s)`);\n tracker.checkpoint('plan');\n\n if (outputJson) {\n ctx.ui?.json?.(plan);\n } else {\n if (plan.items.length === 0) {\n ctx.ui?.info?.('No changes needed — already in the target mode.');\n } else {\n const byRepo = groupByMonorepo(plan.items);\n // Unique packages in npm map\n const uniquePkgs = new Set(plan.items.map(i => i.depName)).size;\n const uniqueFiles = new Set(plan.items.map(i => i.packageJsonPath)).size;\n\n const sections = [...byRepo.entries()].map(([repo, items]) => {\n // Group by depName within each repo — show \"×N files\" instead of N lines\n const byDep = new Map<string, { from: string; to: string; count: number }>();\n for (const item of items) {\n const existing = byDep.get(item.depName);\n if (existing) {\n existing.count++;\n } else {\n byDep.set(item.depName, { from: item.from, to: item.to, count: 1 });\n }\n }\n return {\n header: `${repo} (${byDep.size} dep${byDep.size !== 1 ? 's' : ''})`,\n items: [...byDep.entries()].map(([dep, { from, to, count }]) =>\n count > 1\n ? `${dep}: ${from} → ${to} ×${count} files`\n : `${dep}: ${from} → ${to}`\n ),\n };\n });\n\n ctx.ui?.sideBox?.({\n title: 'DevLink — Plan',\n status: 'info',\n summary: {\n 'Mode': `${currentModeBefore ?? '?'} → ${targetMode}`,\n 'Packages': uniquePkgs,\n 'Files affected': uniqueFiles,\n 'Total changes': plan.items.length,\n },\n sections: [\n ...sections,\n { header: 'Next step', items: [`kb devlink switch --mode=${targetMode}`] },\n ],\n timing: tracker.total(),\n });\n }\n }\n\n return { ok: true, result: plan, meta: { timing: tracker.total() } };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/cli/commands/status.ts"],"names":[],"mappings":"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","file":"status.js","sourcesContent":["import { defineCommand, useLoader, TimingTracker, handleError, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { discoverMonorepos, buildPackageMapFiltered, analyzePackageDeps, loadState, diagnose } from '@kb-labs/devlink-core';\nimport type { DevlinkStatus, DiagnosticIssue } from '@kb-labs/devlink-contracts';\n\ninterface StatusFlags {\n json?: boolean;\n}\n\ninterface StatusInput {\n argv?: string[];\n flags?: StatusFlags;\n json?: boolean;\n}\n\ninterface StatusResult extends DevlinkStatus {\n diagnostics: DiagnosticIssue[];\n}\n\nexport default defineCommand<unknown, StatusInput, StatusResult>({\n id: 'devlink:status',\n description: 'Show current state of cross-repo dependencies with diagnostics',\n\n handler: {\n async execute(ctx: PluginContextV3, input: StatusInput): Promise<CommandResult<StatusResult>> {\n const tracker = new TimingTracker();\n const flags = (input.flags ?? input) as StatusFlags;\n const outputJson = flags.json ?? false;\n\n const rootDir = ctx.cwd ?? process.cwd();\n\n const loader = useLoader('Analyzing dependencies...');\n loader.start();\n\n let state: ReturnType<typeof loadState>;\n let totalLink = 0;\n let totalNpm = 0;\n let totalWorkspace = 0;\n let diagnostics: ReturnType<typeof diagnose>;\n try {\n state = loadState(rootDir);\n const monorepos = discoverMonorepos(rootDir);\n const packageMap = await buildPackageMapFiltered(monorepos, rootDir);\n\n for (const monorepo of monorepos) {\n for (const pkgPath of monorepo.packagePaths) {\n const counts = analyzePackageDeps(pkgPath, packageMap);\n totalLink += counts.linkCount;\n totalNpm += counts.npmCount;\n totalWorkspace += counts.workspaceCount;\n }\n }\n\n diagnostics = diagnose(monorepos, packageMap, rootDir);\n } catch (err) {\n loader.fail('Analysis failed');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Unable to read DevLink status' };\n }\n\n loader.succeed('Analysis complete');\n tracker.checkpoint('analysis');\n\n const errors = diagnostics.filter(d => d.severity === 'error');\n const warnings = diagnostics.filter(d => d.severity === 'warning');\n\n const result: StatusResult = {\n currentMode: state.currentMode,\n lastApplied: state.lastApplied,\n linkCount: totalLink,\n npmCount: totalNpm,\n workspaceCount: totalWorkspace,\n discrepancies: [],\n diagnostics,\n };\n\n if (outputJson) {\n ctx.ui?.json?.(result);\n } else {\n const sections = [\n {\n header: 'Current mode',\n items: [\n `Mode: ${state.currentMode ?? 'unknown'}`,\n `Last applied: ${state.lastApplied ?? 'never'}`,\n ],\n },\n {\n header: 'Dependency counts',\n items: [\n `link: (local) : ${totalLink}`,\n `npm (^version) : ${totalNpm}`,\n `workspace:* : ${totalWorkspace}`,\n ],\n },\n ];\n\n if (errors.length > 0) {\n sections.push({\n header: `❌ Errors (${errors.length})`,\n items: errors.slice(0, 10).map(d => `${d.dep ?? d.file}: ${d.message}`),\n });\n }\n\n if (warnings.length > 0) {\n sections.push({\n header: `⚠ Warnings (${warnings.length})`,\n items: warnings.slice(0, 10).map(d => `${d.dep ?? d.file}: ${d.message}`),\n });\n }\n\n if (diagnostics.length === 0) {\n sections.push({ header: '✅ Health', items: ['No issues detected'] });\n } else {\n sections.push({\n header: 'Fix',\n items: ['Run: kb devlink switch --mode=local --install'],\n });\n }\n\n ctx.ui?.success?.('Dependency status', {\n title: 'DevLink — Status',\n sections,\n timing: tracker.total(),\n });\n }\n\n return { ok: true, result, meta: { timing: tracker.total() } };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/switch.ts"],"names":[],"mappings":"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","file":"switch.js","sourcesContent":["import { defineCommand, useLoader, TimingTracker, handleError, type PluginContextV3, type CommandResult, type CLIInput } from '@kb-labs/sdk';\nimport { discoverMonorepos, buildPackageMapFiltered, buildPlan, applyPlan, createBackup, loadState, saveState, checkGitDirty, updateWorkspaceYamls } from '@kb-labs/devlink-core';\nimport type { DevlinkMode } from '@kb-labs/devlink-contracts';\nimport { existsSync, unlinkSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\n\ninterface SwitchFlags {\n mode: DevlinkMode;\n 'dry-run'?: boolean;\n repos?: string;\n yes?: boolean;\n json?: boolean;\n ttl?: number;\n install?: boolean;\n 'clean-locks'?: boolean;\n}\n\ninterface SwitchResult {\n mode: DevlinkMode;\n changed: number;\n backupId?: string;\n}\n\nexport default defineCommand<unknown, CLIInput<SwitchFlags>, SwitchResult>({\n id: 'devlink:switch',\n description: 'Switch cross-repo deps between link: and npm mode',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<SwitchFlags>) {\n const flags = input.flags;\n const mode = flags.mode;\n const rootDir = ctx.cwd ?? process.cwd();\n const scopedRepos = flags.repos ? flags.repos.split(',').map(s => s.trim()) : undefined;\n const ttlMs = (flags.ttl ?? 24) * 60 * 60 * 1000;\n\n let monorepos;\n let packageMap;\n try {\n monorepos = discoverMonorepos(rootDir);\n packageMap = await buildPackageMapFiltered(monorepos, rootDir, ttlMs, mode);\n } catch {\n return {\n summary: `Switch dependencies to ${mode ?? '(unknown)'} mode`,\n operations: [{ type: 'update' as const, resource: 'package-json', details: { mode } }],\n };\n }\n\n const plan = buildPlan(mode, packageMap, monorepos, rootDir, { scopedRepos });\n const byRepo = new Map<string, number>();\n for (const item of plan.items) {\n byRepo.set(item.monorepo, (byRepo.get(item.monorepo) ?? 0) + 1);\n }\n\n return {\n summary: `Switch ${plan.items.length} dependencies to ${mode} mode across ${byRepo.size} repo(s)`,\n operations: [...byRepo.entries()].map(([repo, count]) => ({\n type: 'update' as const,\n resource: 'dependencies',\n details: { repo, count, mode },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SwitchFlags>): Promise<CommandResult<SwitchResult>> {\n const tracker = new TimingTracker();\n const flags = input.flags;\n const mode = flags.mode;\n const outputJson = flags.json ?? false;\n const scopedRepos = flags.repos ? flags.repos.split(',').map(s => s.trim()) : undefined;\n const ttlMs = (flags.ttl ?? 24) * 60 * 60 * 1000;\n\n const rootDir = ctx.cwd ?? process.cwd();\n\n // 1. Discover\n const discoverLoader = useLoader('Discovering monorepos...');\n discoverLoader.start();\n\n let monorepos;\n let packageMap;\n try {\n monorepos = discoverMonorepos(rootDir);\n packageMap = await buildPackageMapFiltered(monorepos, rootDir, ttlMs, mode);\n } catch (err) {\n discoverLoader.fail('Discovery failed');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Switch operation failed' };\n }\n discoverLoader.succeed(`Found ${monorepos.length} monorepos, ${Object.keys(packageMap).length} packages`);\n tracker.checkpoint('discovery');\n\n // 2. Warn if git dirty\n const dirtyFiles = checkGitDirty(rootDir);\n if (dirtyFiles.length > 0) {\n ctx.ui?.warn?.(`Working tree has ${dirtyFiles.length} uncommitted changes`);\n }\n\n // 3. Build plan\n const plan = buildPlan(mode, packageMap, monorepos, rootDir, { scopedRepos });\n tracker.checkpoint('plan');\n\n if (plan.items.length === 0 && !flags.install) {\n ctx.ui?.info?.('No changes needed — dependencies are already in the requested mode.');\n return { ok: true, result: { mode, changed: 0 }, meta: { timing: tracker.total() } };\n }\n\n // 4. Always create backup (even if no deps change — install cleans node_modules)\n const currentState = loadState(rootDir);\n const modeAtBackup = currentState.currentMode ?? mode;\n const allPackageJsons = monorepos.flatMap(m => m.packagePaths);\n const backup = createBackup(rootDir, allPackageJsons, `pre-switch to ${mode}`, modeAtBackup);\n const backupId = backup.id;\n tracker.checkpoint('backup');\n\n // 6. Apply dep changes (if any)\n let applyResult = { applied: 0, skipped: 0, errors: [] as Array<{ file: string; error: string }> };\n if (plan.items.length > 0) {\n const applyLoader = useLoader(`Switching ${plan.items.length} dependencies to ${mode} mode...`);\n applyLoader.start();\n applyResult = await applyPlan(plan, { dryRun: false });\n applyLoader.succeed(`Applied ${applyResult.applied} change(s)`);\n tracker.checkpoint('apply');\n }\n\n // 7. Update sub-repo pnpm-workspace.yaml with correct cross-repo paths\n const wsLoader = useLoader('Updating sub-repo workspace files...');\n wsLoader.start();\n const wsUpdates = updateWorkspaceYamls(monorepos, packageMap, rootDir);\n const wsChanged = wsUpdates.reduce((sum, u) => sum + u.added.length + u.removed.length, 0);\n wsLoader.succeed(wsChanged > 0\n ? `Updated ${wsUpdates.length} workspace file(s) (${wsChanged} path changes)`\n : 'Workspace files up to date'\n );\n tracker.checkpoint('workspace-yaml');\n\n // 8. Save state\n saveState(rootDir, {\n currentMode: mode,\n lastApplied: new Date().toISOString(),\n frozenAt: currentState.frozenAt,\n });\n\n // 9. Clean stale lockfiles + node_modules in all sub-repos (default: true)\n const shouldClean = flags['clean-locks'] !== false;\n let cleanedLocks = 0;\n let cleanedNodeModules = 0;\n if (shouldClean) {\n const cleanLoader = useLoader('Cleaning stale lockfiles and node_modules...');\n cleanLoader.start();\n for (const mono of monorepos) {\n // Clean lockfile\n const lockPath = join(mono.rootPath, 'pnpm-lock.yaml');\n if (existsSync(lockPath)) {\n try { unlinkSync(lockPath); cleanedLocks++; } catch { /* skip */ }\n }\n // Clean node_modules (contains stale shims with hardcoded paths)\n const nmPath = join(mono.rootPath, 'node_modules');\n if (existsSync(nmPath)) {\n try { rmSync(nmPath, { recursive: true, force: true }); cleanedNodeModules++; } catch { /* skip */ }\n }\n }\n cleanLoader.succeed(\n `Cleaned ${cleanedLocks} lockfile(s), ${cleanedNodeModules} node_modules`\n );\n tracker.checkpoint('clean');\n }\n\n // 10. Install: workspace root first, then per-sub-repo\n const shouldInstall = flags.install === true;\n let installedRepos = 0;\n const installErrors: string[] = [];\n if (shouldInstall) {\n // Phase 1: workspace root install\n const rootLoader = useLoader('Installing workspace root...');\n rootLoader.start();\n try {\n execSync('pnpm install --no-frozen-lockfile', {\n cwd: rootDir,\n stdio: 'pipe',\n timeout: 180_000,\n });\n rootLoader.succeed('Workspace root installed');\n } catch (err) {\n rootLoader.succeed('Workspace root install failed');\n installErrors.push(`root: ${err instanceof Error ? err.message.split('\\n')[0] : String(err)}`);\n }\n tracker.checkpoint('root-install');\n\n // Phase 2: per-sub-repo install (affected + repos missing lockfile)\n const affectedRepos = new Set(plan.items.map(i => i.monorepo));\n const affectedMonorepos = monorepos.filter(m =>\n affectedRepos.has(m.name) || !existsSync(join(m.rootPath, 'pnpm-lock.yaml'))\n );\n const repoLoader = useLoader(`Installing ${affectedMonorepos.length} sub-repo(s)...`);\n repoLoader.start();\n for (const mono of affectedMonorepos) {\n try {\n execSync('pnpm install --no-frozen-lockfile --prefer-offline', {\n cwd: mono.rootPath,\n stdio: 'pipe',\n timeout: 300_000, // 5 min per sub-repo\n });\n installedRepos++;\n } catch (err) {\n installErrors.push(`${mono.name}: ${err instanceof Error ? err.message.split('\\n')[0] : String(err)}`);\n }\n }\n repoLoader.succeed(`Installed ${installedRepos}/${affectedMonorepos.length} sub-repo(s)${installErrors.length > 0 ? `, ${installErrors.length} failed` : ''}`);\n tracker.checkpoint('sub-repo-install');\n }\n\n // 11. Output\n const result: SwitchResult = {\n mode,\n changed: applyResult.applied,\n backupId,\n };\n\n if (outputJson) {\n ctx.ui?.json?.({ ...result, cleanedLocks, wsUpdates: wsUpdates.length, installedRepos, installErrors });\n } else {\n const summaryItems = [\n `Mode: ${mode}`,\n `Changed: ${applyResult.applied} dependencies`,\n `Backup: ${backupId}`,\n ];\n if (wsChanged > 0) {\n summaryItems.push(`Workspace YAMLs: ${wsUpdates.length} updated`);\n }\n if (cleanedLocks > 0 || cleanedNodeModules > 0) {\n summaryItems.push(`Cleaned: ${cleanedLocks} lockfile(s), ${cleanedNodeModules} node_modules`);\n }\n if (shouldInstall) {\n summaryItems.push(`Installed: root + ${installedRepos} sub-repo(s)`);\n }\n\n const sections = [\n { header: 'Summary', items: summaryItems },\n ...(applyResult.errors.length > 0\n ? [{ header: 'Errors', items: applyResult.errors.map(e => `${e.file}: ${e.error}`) }]\n : []),\n ...(installErrors.length > 0\n ? [{ header: 'Install errors', items: installErrors }]\n : []),\n ...(!shouldInstall && applyResult.applied > 0\n ? [{ header: 'Next step', items: ['Re-run with --install to complete setup'] }]\n : []),\n ];\n ctx.ui?.success?.(`Switched to ${mode} mode`, {\n title: 'DevLink — Switch',\n sections,\n timing: tracker.total(),\n });\n }\n\n return { ok: true, result, meta: { timing: tracker.total() } };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/cli/commands/switch.ts"],"names":[],"mappings":"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","file":"switch.js","sourcesContent":["import { defineCommand, useLoader, TimingTracker, handleError, type PluginContextV3, type CommandResult, type CLIInput } from '@kb-labs/sdk';\nimport { discoverMonorepos, buildPackageMapFiltered, buildPlan, applyPlan, createBackup, loadState, saveState, checkGitDirty, updateWorkspaceYamls } from '@kb-labs/devlink-core';\nimport type { DevlinkMode } from '@kb-labs/devlink-contracts';\nimport { existsSync, unlinkSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\n\ninterface SwitchFlags {\n mode: DevlinkMode;\n 'dry-run'?: boolean;\n repos?: string;\n yes?: boolean;\n json?: boolean;\n ttl?: number;\n install?: boolean;\n 'clean-locks'?: boolean;\n}\n\ninterface SwitchResult {\n mode: DevlinkMode;\n changed: number;\n backupId?: string;\n}\n\nexport default defineCommand<unknown, CLIInput<SwitchFlags>, SwitchResult>({\n id: 'devlink:switch',\n description: 'Switch cross-repo deps between link: and npm mode',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<SwitchFlags>) {\n const flags = input.flags;\n const mode = flags.mode;\n const rootDir = ctx.cwd ?? process.cwd();\n const scopedRepos = flags.repos ? flags.repos.split(',').map(s => s.trim()) : undefined;\n const ttlMs = (flags.ttl ?? 24) * 60 * 60 * 1000;\n\n let monorepos;\n let packageMap;\n try {\n monorepos = discoverMonorepos(rootDir);\n packageMap = await buildPackageMapFiltered(monorepos, rootDir, ttlMs, mode);\n } catch {\n return {\n summary: `Switch dependencies to ${mode ?? '(unknown)'} mode`,\n operations: [{ type: 'update' as const, resource: 'package-json', details: { mode } }],\n };\n }\n\n const plan = buildPlan(mode, packageMap, monorepos, rootDir, { scopedRepos });\n const byRepo = new Map<string, number>();\n for (const item of plan.items) {\n byRepo.set(item.monorepo, (byRepo.get(item.monorepo) ?? 0) + 1);\n }\n\n return {\n summary: `Switch ${plan.items.length} dependencies to ${mode} mode across ${byRepo.size} repo(s)`,\n operations: [...byRepo.entries()].map(([repo, count]) => ({\n type: 'update' as const,\n resource: 'dependencies',\n details: { repo, count, mode },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SwitchFlags>): Promise<CommandResult<SwitchResult>> {\n const tracker = new TimingTracker();\n const flags = input.flags;\n const mode = flags.mode;\n const outputJson = flags.json ?? false;\n const scopedRepos = flags.repos ? flags.repos.split(',').map(s => s.trim()) : undefined;\n const ttlMs = (flags.ttl ?? 24) * 60 * 60 * 1000;\n\n const rootDir = ctx.cwd ?? process.cwd();\n\n // 1. Discover\n const discoverLoader = useLoader('Discovering monorepos...');\n discoverLoader.start();\n\n let monorepos;\n let packageMap;\n try {\n monorepos = discoverMonorepos(rootDir);\n packageMap = await buildPackageMapFiltered(monorepos, rootDir, ttlMs, mode);\n } catch (err) {\n discoverLoader.fail('Discovery failed');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Switch operation failed' };\n }\n discoverLoader.succeed(`Found ${monorepos.length} monorepos, ${Object.keys(packageMap).length} packages`);\n tracker.checkpoint('discovery');\n\n // 2. Warn if git dirty\n const dirtyFiles = checkGitDirty(rootDir);\n if (dirtyFiles.length > 0) {\n ctx.ui?.warn?.(`Working tree has ${dirtyFiles.length} uncommitted changes`);\n }\n\n // 3. Build plan\n const plan = buildPlan(mode, packageMap, monorepos, rootDir, { scopedRepos });\n tracker.checkpoint('plan');\n\n if (plan.items.length === 0 && !flags.install) {\n ctx.ui?.info?.('No changes needed — dependencies are already in the requested mode.');\n return { ok: true, result: { mode, changed: 0 }, meta: { timing: tracker.total() } };\n }\n\n // 4. Always create backup (even if no deps change — install cleans node_modules)\n const currentState = loadState(rootDir);\n const modeAtBackup = currentState.currentMode ?? mode;\n const allPackageJsons = monorepos.flatMap(m => m.packagePaths);\n const backup = createBackup(rootDir, allPackageJsons, `pre-switch to ${mode}`, modeAtBackup);\n const backupId = backup.id;\n tracker.checkpoint('backup');\n\n // 6. Apply dep changes (if any)\n let applyResult = { applied: 0, skipped: 0, errors: [] as Array<{ file: string; error: string }> };\n if (plan.items.length > 0) {\n const applyLoader = useLoader(`Switching ${plan.items.length} dependencies to ${mode} mode...`);\n applyLoader.start();\n applyResult = await applyPlan(plan, { dryRun: false });\n applyLoader.succeed(`Applied ${applyResult.applied} change(s)`);\n tracker.checkpoint('apply');\n }\n\n // 7. Update sub-repo pnpm-workspace.yaml with correct cross-repo paths\n const wsLoader = useLoader('Updating sub-repo workspace files...');\n wsLoader.start();\n const wsUpdates = updateWorkspaceYamls(monorepos, packageMap, rootDir);\n const wsChanged = wsUpdates.reduce((sum, u) => sum + u.added.length + u.removed.length, 0);\n wsLoader.succeed(wsChanged > 0\n ? `Updated ${wsUpdates.length} workspace file(s) (${wsChanged} path changes)`\n : 'Workspace files up to date'\n );\n tracker.checkpoint('workspace-yaml');\n\n // 8. Save state\n saveState(rootDir, {\n currentMode: mode,\n lastApplied: new Date().toISOString(),\n frozenAt: currentState.frozenAt,\n });\n\n // 9. Clean stale lockfiles + node_modules in all sub-repos (default: true)\n const shouldClean = flags['clean-locks'] !== false;\n let cleanedLocks = 0;\n let cleanedNodeModules = 0;\n if (shouldClean) {\n const cleanLoader = useLoader('Cleaning stale lockfiles and node_modules...');\n cleanLoader.start();\n for (const mono of monorepos) {\n // Clean lockfile\n const lockPath = join(mono.rootPath, 'pnpm-lock.yaml');\n if (existsSync(lockPath)) {\n try { unlinkSync(lockPath); cleanedLocks++; } catch { /* skip */ }\n }\n // Clean node_modules (contains stale shims with hardcoded paths)\n const nmPath = join(mono.rootPath, 'node_modules');\n if (existsSync(nmPath)) {\n try { rmSync(nmPath, { recursive: true, force: true }); cleanedNodeModules++; } catch { /* skip */ }\n }\n }\n cleanLoader.succeed(\n `Cleaned ${cleanedLocks} lockfile(s), ${cleanedNodeModules} node_modules`\n );\n tracker.checkpoint('clean');\n }\n\n // 10. Install: workspace root first, then per-sub-repo\n const shouldInstall = flags.install === true;\n let installedRepos = 0;\n const installErrors: string[] = [];\n if (shouldInstall) {\n // Phase 1: workspace root install\n const rootLoader = useLoader('Installing workspace root...');\n rootLoader.start();\n try {\n execSync('pnpm install --no-frozen-lockfile', {\n cwd: rootDir,\n stdio: 'pipe',\n timeout: 180_000,\n });\n rootLoader.succeed('Workspace root installed');\n } catch (err) {\n rootLoader.succeed('Workspace root install failed');\n installErrors.push(`root: ${err instanceof Error ? err.message.split('\\n')[0] : String(err)}`);\n }\n tracker.checkpoint('root-install');\n\n // Phase 2: per-sub-repo install (affected + repos missing lockfile)\n const affectedRepos = new Set(plan.items.map(i => i.monorepo));\n const affectedMonorepos = monorepos.filter(m =>\n affectedRepos.has(m.name) || !existsSync(join(m.rootPath, 'pnpm-lock.yaml'))\n );\n const repoLoader = useLoader(`Installing ${affectedMonorepos.length} sub-repo(s)...`);\n repoLoader.start();\n for (const mono of affectedMonorepos) {\n try {\n execSync('pnpm install --no-frozen-lockfile --prefer-offline', {\n cwd: mono.rootPath,\n stdio: 'pipe',\n timeout: 300_000, // 5 min per sub-repo\n });\n installedRepos++;\n } catch (err) {\n installErrors.push(`${mono.name}: ${err instanceof Error ? err.message.split('\\n')[0] : String(err)}`);\n }\n }\n repoLoader.succeed(`Installed ${installedRepos}/${affectedMonorepos.length} sub-repo(s)${installErrors.length > 0 ? `, ${installErrors.length} failed` : ''}`);\n tracker.checkpoint('sub-repo-install');\n }\n\n // 11. Output\n const result: SwitchResult = {\n mode,\n changed: applyResult.applied,\n backupId,\n };\n\n if (outputJson) {\n ctx.ui?.json?.({ ...result, cleanedLocks, wsUpdates: wsUpdates.length, installedRepos, installErrors });\n } else {\n const summaryItems = [\n `Mode: ${mode}`,\n `Changed: ${applyResult.applied} dependencies`,\n `Backup: ${backupId}`,\n ];\n if (wsChanged > 0) {\n summaryItems.push(`Workspace YAMLs: ${wsUpdates.length} updated`);\n }\n if (cleanedLocks > 0 || cleanedNodeModules > 0) {\n summaryItems.push(`Cleaned: ${cleanedLocks} lockfile(s), ${cleanedNodeModules} node_modules`);\n }\n if (shouldInstall) {\n summaryItems.push(`Installed: root + ${installedRepos} sub-repo(s)`);\n }\n\n const sections = [\n { header: 'Summary', items: summaryItems },\n ...(applyResult.errors.length > 0\n ? [{ header: 'Errors', items: applyResult.errors.map(e => `${e.file}: ${e.error}`) }]\n : []),\n ...(installErrors.length > 0\n ? [{ header: 'Install errors', items: installErrors }]\n : []),\n ...(!shouldInstall && applyResult.applied > 0\n ? [{ header: 'Next step', items: ['Re-run with --install to complete setup'] }]\n : []),\n ];\n ctx.ui?.success?.(`Switched to ${mode} mode`, {\n title: 'DevLink — Switch',\n sections,\n timing: tracker.total(),\n });\n }\n\n return { ok: true, result, meta: { timing: tracker.total() } };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/cli/commands/undo.ts"],"names":[],"mappings":"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","file":"undo.js","sourcesContent":["import { defineCommand, useLoader, TimingTracker, validationError, handleError, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { getLastBackup, restoreBackup, saveState, loadState } from '@kb-labs/devlink-core';\n\ninterface UndoFlags {\n json?: boolean;\n}\n\ninterface UndoInput {\n argv?: string[];\n flags?: UndoFlags;\n json?: boolean;\n}\n\ninterface UndoResult {\n restored: number;\n backupId: string;\n errors: string[];\n}\n\nexport default defineCommand<unknown, UndoInput, UndoResult>({\n id: 'devlink:undo',\n description: 'Restore previous dependency state from last backup',\n\n handler: {\n async intent(_ctx: PluginContextV3, _input: UndoInput) {\n return {\n summary: 'Restore previous dependency state from last backup',\n operations: [\n { type: 'update' as const, resource: 'package-json-files', details: { source: 'last-backup' } },\n ],\n };\n },\n\n async execute(ctx: PluginContextV3, input: UndoInput): Promise<CommandResult<UndoResult>> {\n const tracker = new TimingTracker();\n const flags = (input.flags ?? input) as UndoFlags;\n const outputJson = flags.json ?? false;\n\n const rootDir = ctx.cwd ?? process.cwd();\n\n const backup = getLastBackup(rootDir);\n if (!backup) {\n validationError(ctx, 'No backups found. Run switch first to create a backup.', undefined, outputJson);\n return { ok: false, error: 'Undo operation failed' };\n }\n\n const loader = useLoader(`Restoring from backup ${backup.id}...`);\n loader.start();\n\n let restored: number;\n let errors: string[];\n try {\n ({ restored, errors } = restoreBackup(rootDir, backup.id));\n } catch (err) {\n loader.fail('Restore failed');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Undo operation failed' };\n }\n loader.succeed(`Restored ${restored} file(s)`);\n tracker.checkpoint('restore');\n\n // Update state to backup's previous mode\n const currentState = loadState(rootDir);\n saveState(rootDir, {\n ...currentState,\n currentMode: backup.modeAtBackup,\n lastApplied: new Date().toISOString(),\n });\n\n const result: UndoResult = { restored, backupId: backup.id, errors };\n\n if (outputJson) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.success?.(`Restored from backup (mode: ${backup.modeAtBackup ?? 'unknown'})`, {\n title: 'DevLink — Undo',\n sections: [\n {\n header: 'Summary',\n items: [\n `Backup ID: ${backup.id}`,\n `Created: ${backup.timestamp}`,\n `Restored files: ${restored}`,\n ],\n },\n ...(errors.length > 0 ? [{ header: 'Errors', items: errors }] : []),\n { header: 'Next step', items: ['Run pnpm install to apply changes'] },\n ],\n timing: tracker.total(),\n });\n }\n\n return errors.length > 0\n ? { ok: false, error: `${errors.length} undo operation(s) failed`, result, meta: { timing: tracker.total() } }\n : { ok: true, result, meta: { timing: tracker.total() } };\n },\n },\n});\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/manifest.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { defineCommandFlags, combinePermissions, generateExamples } from '@kb-labs/sdk';\nimport {\n switchFlags,\n statusFlags,\n planFlags,\n freezeFlags,\n undoFlags,\n backupsFlags,\n DEVLINK_CACHE_PREFIX,\n} from '@kb-labs/devlink-contracts';\n\nconst pluginPermissions = combinePermissions()\n .withFs({\n mode: 'readWrite',\n allow: ['**/package.json', '.kb/devlink/**', '**/pnpm-workspace.yaml'],\n })\n .withPlatform({\n cache: [DEVLINK_CACHE_PREFIX],\n })\n .withQuotas({\n timeoutMs: 1800000, // 30 min — switch --install runs pnpm install in 29 sub-repos\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/devlink',\n version: '1.0.0',\n\n display: {\n name: 'DevLink',\n description: 'Cross-repo link: dependency management',\n tags: ['monorepo', 'devlink', 'dependencies', 'publish', 'local-dev'],\n },\n\n platform: {\n requires: ['storage'],\n optional: [],\n },\n\n cli: {\n groupMeta: [\n { path: 'devlink', describe: 'Cross-repo link: dependency management' },\n ],\n commands: [\n {\n path: 'devlink switch',\n category: 'Mode',\n describe: 'Switch deps between local link: and npm (CI/CD) mode',\n operationType: 'mutate' as const,\n longDescription:\n 'Replaces all cross-repo @kb-labs/* dependencies across monorepos. ' +\n 'Creates a backup before applying. Run pnpm install after switching.',\n\n handler: './cli/commands/switch.js#default',\n\n flags: defineCommandFlags(switchFlags),\n\n examples: generateExamples('switch', 'devlink', [\n { description: 'Switch to npm mode (CI/CD)', flags: { mode: 'npm' } },\n { description: 'Switch to local mode (development)', flags: { mode: 'local' } },\n { description: 'Preview changes without applying', flags: { mode: 'local', 'dry-run': true } },\n { description: 'Switch specific repos only', flags: { mode: 'npm', repos: 'kb-labs-cli,kb-labs-core' } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink status',\n category: 'Mode',\n describe: 'Show current state of cross-repo dependencies',\n operationType: 'read' as const,\n longDescription:\n 'Displays the current linking mode, counts of link: vs npm dependencies, ' +\n 'and any discrepancies across all monorepos.',\n\n handler: './cli/commands/status.js#default',\n\n flags: defineCommandFlags(statusFlags),\n\n examples: generateExamples('status', 'devlink', [\n { description: 'Show summary status', flags: {} },\n { description: 'Verbose output with all deps', flags: { verbose: true } },\n { description: 'JSON output for scripting', flags: { json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink plan',\n category: 'Mode',\n describe: 'Preview what would change when switching mode',\n operationType: 'read' as const,\n longDescription:\n 'Shows all dependency changes that would be made without applying them. ' +\n 'Useful for reviewing before running switch.',\n\n handler: './cli/commands/plan.js#default',\n\n flags: defineCommandFlags(planFlags),\n\n examples: generateExamples('plan', 'devlink', [\n { description: 'Plan switch to local mode', flags: { mode: 'local' } },\n { description: 'Plan switch to npm mode', flags: { mode: 'npm' } },\n { description: 'JSON output for scripting', flags: { mode: 'npm', json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink freeze',\n category: 'State',\n describe: 'Freeze current dependency state to lock file',\n operationType: 'mutate' as const,\n longDescription:\n 'Saves a snapshot of current dependency mode to .kb/devlink/lock.json. ' +\n 'Use to record a stable known-good state.',\n\n handler: './cli/commands/freeze.js#default',\n\n flags: defineCommandFlags(freezeFlags),\n\n examples: generateExamples('freeze', 'devlink', [\n { description: 'Freeze current state', flags: {} },\n { description: 'JSON output', flags: { json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink undo',\n category: 'State',\n describe: 'Restore previous dependency state from last backup',\n operationType: 'mutate' as const,\n longDescription:\n 'Restores package.json files from the most recent backup created by switch. ' +\n 'Run pnpm install after undoing.',\n\n handler: './cli/commands/undo.js#default',\n\n flags: defineCommandFlags(undoFlags),\n\n examples: generateExamples('undo', 'devlink', [\n { description: 'Undo last switch', flags: {} },\n { description: 'JSON output', flags: { json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink backups',\n category: 'State',\n describe: 'List and restore backups',\n operationType: 'read' as const,\n longDescription:\n 'Lists all available backups. Use --restore <id> to restore a specific backup.',\n\n handler: './cli/commands/backups.js#default',\n\n flags: defineCommandFlags(backupsFlags),\n\n examples: generateExamples('backups', 'devlink', [\n { description: 'List all backups', flags: {} },\n { description: 'JSON output', flags: { json: true } },\n { description: 'Restore specific backup', flags: { restore: '<backup-id>' } },\n ]),\n\n permissions: pluginPermissions,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}
|
package/dist/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/plugins/devlink/entry/src/manifest.ts"],"names":[],"mappings":"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","file":"manifest.js","sourcesContent":["import { defineCommandFlags, combinePermissions, generateExamples } from '@kb-labs/sdk';\nimport {\n switchFlags,\n statusFlags,\n planFlags,\n freezeFlags,\n undoFlags,\n backupsFlags,\n DEVLINK_CACHE_PREFIX,\n} from '@kb-labs/devlink-contracts';\n\nconst pluginPermissions = combinePermissions()\n .withFs({\n mode: 'readWrite',\n allow: ['**/package.json', '.kb/devlink/**', '**/pnpm-workspace.yaml'],\n })\n .withPlatform({\n cache: [DEVLINK_CACHE_PREFIX],\n })\n .withQuotas({\n timeoutMs: 1800000, // 30 min — switch --install runs pnpm install in 29 sub-repos\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/devlink',\n version: '1.0.0',\n\n display: {\n name: 'DevLink',\n description: 'Cross-repo link: dependency management',\n tags: ['monorepo', 'devlink', 'dependencies', 'publish', 'local-dev'],\n },\n\n platform: {\n requires: ['storage'],\n optional: [],\n },\n\n cli: {\n groupMeta: [\n { path: 'devlink', describe: 'Cross-repo link: dependency management' },\n ],\n commands: [\n {\n path: 'devlink switch',\n category: 'Mode',\n describe: 'Switch deps between local link: and npm (CI/CD) mode',\n operationType: 'mutate' as const,\n longDescription:\n 'Replaces all cross-repo @kb-labs/* dependencies across monorepos. ' +\n 'Creates a backup before applying. Run pnpm install after switching.',\n\n handler: './cli/commands/switch.js#default',\n\n flags: defineCommandFlags(switchFlags),\n\n examples: generateExamples('switch', 'devlink', [\n { description: 'Switch to npm mode (CI/CD)', flags: { mode: 'npm' } },\n { description: 'Switch to local mode (development)', flags: { mode: 'local' } },\n { description: 'Preview changes without applying', flags: { mode: 'local', 'dry-run': true } },\n { description: 'Switch specific repos only', flags: { mode: 'npm', repos: 'kb-labs-cli,kb-labs-core' } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink status',\n category: 'Mode',\n describe: 'Show current state of cross-repo dependencies',\n operationType: 'read' as const,\n longDescription:\n 'Displays the current linking mode, counts of link: vs npm dependencies, ' +\n 'and any discrepancies across all monorepos.',\n\n handler: './cli/commands/status.js#default',\n\n flags: defineCommandFlags(statusFlags),\n\n examples: generateExamples('status', 'devlink', [\n { description: 'Show summary status', flags: {} },\n { description: 'Verbose output with all deps', flags: { verbose: true } },\n { description: 'JSON output for scripting', flags: { json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink plan',\n category: 'Mode',\n describe: 'Preview what would change when switching mode',\n operationType: 'read' as const,\n longDescription:\n 'Shows all dependency changes that would be made without applying them. ' +\n 'Useful for reviewing before running switch.',\n\n handler: './cli/commands/plan.js#default',\n\n flags: defineCommandFlags(planFlags),\n\n examples: generateExamples('plan', 'devlink', [\n { description: 'Plan switch to local mode', flags: { mode: 'local' } },\n { description: 'Plan switch to npm mode', flags: { mode: 'npm' } },\n { description: 'JSON output for scripting', flags: { mode: 'npm', json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink freeze',\n category: 'State',\n describe: 'Freeze current dependency state to lock file',\n operationType: 'mutate' as const,\n longDescription:\n 'Saves a snapshot of current dependency mode to .kb/devlink/lock.json. ' +\n 'Use to record a stable known-good state.',\n\n handler: './cli/commands/freeze.js#default',\n\n flags: defineCommandFlags(freezeFlags),\n\n examples: generateExamples('freeze', 'devlink', [\n { description: 'Freeze current state', flags: {} },\n { description: 'JSON output', flags: { json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink undo',\n category: 'State',\n describe: 'Restore previous dependency state from last backup',\n operationType: 'mutate' as const,\n longDescription:\n 'Restores package.json files from the most recent backup created by switch. ' +\n 'Run pnpm install after undoing.',\n\n handler: './cli/commands/undo.js#default',\n\n flags: defineCommandFlags(undoFlags),\n\n examples: generateExamples('undo', 'devlink', [\n { description: 'Undo last switch', flags: {} },\n { description: 'JSON output', flags: { json: true } },\n ]),\n\n permissions: pluginPermissions,\n },\n {\n path: 'devlink backups',\n category: 'State',\n describe: 'List and restore backups',\n operationType: 'read' as const,\n longDescription:\n 'Lists all available backups. Use --restore <id> to restore a specific backup.',\n\n handler: './cli/commands/backups.js#default',\n\n flags: defineCommandFlags(backupsFlags),\n\n examples: generateExamples('backups', 'devlink', [\n { description: 'List all backups', flags: {} },\n { description: 'JSON output', flags: { json: true } },\n { description: 'Restore specific backup', flags: { restore: '<backup-id>' } },\n ]),\n\n permissions: pluginPermissions,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/devlink-entry",
|
|
3
3
|
"description": "CLI commands and manifest for DevLink plugin.",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.119.0-canary.0c078654e",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"README.md"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@kb-labs/devlink-
|
|
25
|
-
"@kb-labs/
|
|
26
|
-
"@kb-labs/
|
|
24
|
+
"@kb-labs/devlink-core": "2.119.0-canary.0c078654e",
|
|
25
|
+
"@kb-labs/sdk": "2.115.4",
|
|
26
|
+
"@kb-labs/devlink-contracts": "2.119.0-canary.0c078654e"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^24.3.3",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"tsup": "^8.5.0",
|
|
33
33
|
"typescript": "^5.6.3",
|
|
34
34
|
"vitest": "^3.2.6",
|
|
35
|
-
"@kb-labs/devkit": "2.
|
|
35
|
+
"@kb-labs/devkit": "2.119.0-canary.0c078654e"
|
|
36
36
|
},
|
|
37
37
|
"engines": {
|
|
38
38
|
"node": ">=22.0.0",
|
package/dist/manifest.json
DELETED
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schema": "kb.plugin/3",
|
|
3
|
-
"id": "@kb-labs/devlink",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"display": {
|
|
6
|
-
"name": "DevLink",
|
|
7
|
-
"description": "Cross-repo link: dependency management",
|
|
8
|
-
"tags": [
|
|
9
|
-
"monorepo",
|
|
10
|
-
"devlink",
|
|
11
|
-
"dependencies",
|
|
12
|
-
"publish",
|
|
13
|
-
"local-dev"
|
|
14
|
-
]
|
|
15
|
-
},
|
|
16
|
-
"platform": {
|
|
17
|
-
"requires": [
|
|
18
|
-
"storage"
|
|
19
|
-
],
|
|
20
|
-
"optional": []
|
|
21
|
-
},
|
|
22
|
-
"cli": {
|
|
23
|
-
"groupMeta": [
|
|
24
|
-
{
|
|
25
|
-
"path": "devlink",
|
|
26
|
-
"describe": "Cross-repo link: dependency management"
|
|
27
|
-
}
|
|
28
|
-
],
|
|
29
|
-
"commands": [
|
|
30
|
-
{
|
|
31
|
-
"path": "devlink switch",
|
|
32
|
-
"category": "Mode",
|
|
33
|
-
"describe": "Switch deps between local link: and npm (CI/CD) mode",
|
|
34
|
-
"operationType": "mutate",
|
|
35
|
-
"longDescription": "Replaces all cross-repo @kb-labs/* dependencies across monorepos. Creates a backup before applying. Run pnpm install after switching.",
|
|
36
|
-
"handler": "./cli/commands/switch.js#default",
|
|
37
|
-
"flags": [
|
|
38
|
-
{
|
|
39
|
-
"name": "mode",
|
|
40
|
-
"type": "string",
|
|
41
|
-
"alias": "m",
|
|
42
|
-
"description": "Linking mode: local (link:), npm (^version), auto",
|
|
43
|
-
"choices": [
|
|
44
|
-
"local",
|
|
45
|
-
"npm",
|
|
46
|
-
"auto"
|
|
47
|
-
]
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"name": "dry-run",
|
|
51
|
-
"type": "boolean",
|
|
52
|
-
"alias": "d",
|
|
53
|
-
"default": false,
|
|
54
|
-
"description": "Preview changes without applying them"
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"name": "repos",
|
|
58
|
-
"type": "string",
|
|
59
|
-
"alias": "r",
|
|
60
|
-
"description": "Comma-separated list of repos to scope (e.g. kb-labs-cli,kb-labs-core)"
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"name": "yes",
|
|
64
|
-
"type": "boolean",
|
|
65
|
-
"alias": "y",
|
|
66
|
-
"default": false,
|
|
67
|
-
"description": "Skip confirmation prompt"
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"name": "json",
|
|
71
|
-
"type": "boolean",
|
|
72
|
-
"default": false,
|
|
73
|
-
"description": "Output as JSON"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"name": "ttl",
|
|
77
|
-
"type": "number",
|
|
78
|
-
"default": 24,
|
|
79
|
-
"description": "npm registry cache TTL in hours (default: 24)"
|
|
80
|
-
}
|
|
81
|
-
],
|
|
82
|
-
"examples": [
|
|
83
|
-
"devlink switch --mode=npm # Switch to npm mode (CI/CD)",
|
|
84
|
-
"devlink switch --mode=local # Switch to local mode (development)",
|
|
85
|
-
"devlink switch --mode=local --dry-run # Preview changes without applying",
|
|
86
|
-
"devlink switch --mode=npm --repos=kb-labs-cli,kb-labs-core # Switch specific repos only"
|
|
87
|
-
],
|
|
88
|
-
"permissions": {
|
|
89
|
-
"fs": {
|
|
90
|
-
"read": [
|
|
91
|
-
"**/package.json",
|
|
92
|
-
".kb/devlink/**",
|
|
93
|
-
"**/pnpm-workspace.yaml"
|
|
94
|
-
],
|
|
95
|
-
"write": [
|
|
96
|
-
"**/package.json",
|
|
97
|
-
".kb/devlink/**",
|
|
98
|
-
"**/pnpm-workspace.yaml"
|
|
99
|
-
]
|
|
100
|
-
},
|
|
101
|
-
"platform": {
|
|
102
|
-
"cache": {
|
|
103
|
-
"namespaces": [
|
|
104
|
-
"devlink:"
|
|
105
|
-
]
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
|
-
"quotas": {
|
|
109
|
-
"timeoutMs": 1800000,
|
|
110
|
-
"memoryMb": 512
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"path": "devlink status",
|
|
116
|
-
"category": "Mode",
|
|
117
|
-
"describe": "Show current state of cross-repo dependencies",
|
|
118
|
-
"operationType": "read",
|
|
119
|
-
"longDescription": "Displays the current linking mode, counts of link: vs npm dependencies, and any discrepancies across all monorepos.",
|
|
120
|
-
"handler": "./cli/commands/status.js#default",
|
|
121
|
-
"flags": [
|
|
122
|
-
{
|
|
123
|
-
"name": "json",
|
|
124
|
-
"type": "boolean",
|
|
125
|
-
"default": false,
|
|
126
|
-
"description": "Output as JSON"
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"name": "verbose",
|
|
130
|
-
"type": "boolean",
|
|
131
|
-
"alias": "v",
|
|
132
|
-
"default": false,
|
|
133
|
-
"description": "Show all dependencies, not just cross-repo"
|
|
134
|
-
}
|
|
135
|
-
],
|
|
136
|
-
"examples": [
|
|
137
|
-
"devlink status # Show summary status",
|
|
138
|
-
"devlink status --verbose # Verbose output with all deps",
|
|
139
|
-
"devlink status --json # JSON output for scripting"
|
|
140
|
-
],
|
|
141
|
-
"permissions": {
|
|
142
|
-
"fs": {
|
|
143
|
-
"read": [
|
|
144
|
-
"**/package.json",
|
|
145
|
-
".kb/devlink/**",
|
|
146
|
-
"**/pnpm-workspace.yaml"
|
|
147
|
-
],
|
|
148
|
-
"write": [
|
|
149
|
-
"**/package.json",
|
|
150
|
-
".kb/devlink/**",
|
|
151
|
-
"**/pnpm-workspace.yaml"
|
|
152
|
-
]
|
|
153
|
-
},
|
|
154
|
-
"platform": {
|
|
155
|
-
"cache": {
|
|
156
|
-
"namespaces": [
|
|
157
|
-
"devlink:"
|
|
158
|
-
]
|
|
159
|
-
}
|
|
160
|
-
},
|
|
161
|
-
"quotas": {
|
|
162
|
-
"timeoutMs": 1800000,
|
|
163
|
-
"memoryMb": 512
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
"path": "devlink plan",
|
|
169
|
-
"category": "Mode",
|
|
170
|
-
"describe": "Preview what would change when switching mode",
|
|
171
|
-
"operationType": "read",
|
|
172
|
-
"longDescription": "Shows all dependency changes that would be made without applying them. Useful for reviewing before running switch.",
|
|
173
|
-
"handler": "./cli/commands/plan.js#default",
|
|
174
|
-
"flags": [
|
|
175
|
-
{
|
|
176
|
-
"name": "mode",
|
|
177
|
-
"type": "string",
|
|
178
|
-
"alias": "m",
|
|
179
|
-
"description": "Target mode to plan for (defaults to opposite of current)",
|
|
180
|
-
"choices": [
|
|
181
|
-
"local",
|
|
182
|
-
"npm",
|
|
183
|
-
"auto"
|
|
184
|
-
]
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
"name": "repos",
|
|
188
|
-
"type": "string",
|
|
189
|
-
"alias": "r",
|
|
190
|
-
"description": "Comma-separated list of repos to scope"
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
"name": "json",
|
|
194
|
-
"type": "boolean",
|
|
195
|
-
"default": false,
|
|
196
|
-
"description": "Output as JSON"
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
"name": "ttl",
|
|
200
|
-
"type": "number",
|
|
201
|
-
"default": 24,
|
|
202
|
-
"description": "npm registry cache TTL in hours (default: 24)"
|
|
203
|
-
}
|
|
204
|
-
],
|
|
205
|
-
"examples": [
|
|
206
|
-
"devlink plan --mode=local # Plan switch to local mode",
|
|
207
|
-
"devlink plan --mode=npm # Plan switch to npm mode",
|
|
208
|
-
"devlink plan --mode=npm --json # JSON output for scripting"
|
|
209
|
-
],
|
|
210
|
-
"permissions": {
|
|
211
|
-
"fs": {
|
|
212
|
-
"read": [
|
|
213
|
-
"**/package.json",
|
|
214
|
-
".kb/devlink/**",
|
|
215
|
-
"**/pnpm-workspace.yaml"
|
|
216
|
-
],
|
|
217
|
-
"write": [
|
|
218
|
-
"**/package.json",
|
|
219
|
-
".kb/devlink/**",
|
|
220
|
-
"**/pnpm-workspace.yaml"
|
|
221
|
-
]
|
|
222
|
-
},
|
|
223
|
-
"platform": {
|
|
224
|
-
"cache": {
|
|
225
|
-
"namespaces": [
|
|
226
|
-
"devlink:"
|
|
227
|
-
]
|
|
228
|
-
}
|
|
229
|
-
},
|
|
230
|
-
"quotas": {
|
|
231
|
-
"timeoutMs": 1800000,
|
|
232
|
-
"memoryMb": 512
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
"path": "devlink freeze",
|
|
238
|
-
"category": "State",
|
|
239
|
-
"describe": "Freeze current dependency state to lock file",
|
|
240
|
-
"operationType": "mutate",
|
|
241
|
-
"longDescription": "Saves a snapshot of current dependency mode to .kb/devlink/lock.json. Use to record a stable known-good state.",
|
|
242
|
-
"handler": "./cli/commands/freeze.js#default",
|
|
243
|
-
"flags": [
|
|
244
|
-
{
|
|
245
|
-
"name": "json",
|
|
246
|
-
"type": "boolean",
|
|
247
|
-
"default": false,
|
|
248
|
-
"description": "Output as JSON"
|
|
249
|
-
}
|
|
250
|
-
],
|
|
251
|
-
"examples": [
|
|
252
|
-
"devlink freeze # Freeze current state",
|
|
253
|
-
"devlink freeze --json # JSON output"
|
|
254
|
-
],
|
|
255
|
-
"permissions": {
|
|
256
|
-
"fs": {
|
|
257
|
-
"read": [
|
|
258
|
-
"**/package.json",
|
|
259
|
-
".kb/devlink/**",
|
|
260
|
-
"**/pnpm-workspace.yaml"
|
|
261
|
-
],
|
|
262
|
-
"write": [
|
|
263
|
-
"**/package.json",
|
|
264
|
-
".kb/devlink/**",
|
|
265
|
-
"**/pnpm-workspace.yaml"
|
|
266
|
-
]
|
|
267
|
-
},
|
|
268
|
-
"platform": {
|
|
269
|
-
"cache": {
|
|
270
|
-
"namespaces": [
|
|
271
|
-
"devlink:"
|
|
272
|
-
]
|
|
273
|
-
}
|
|
274
|
-
},
|
|
275
|
-
"quotas": {
|
|
276
|
-
"timeoutMs": 1800000,
|
|
277
|
-
"memoryMb": 512
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
"path": "devlink undo",
|
|
283
|
-
"category": "State",
|
|
284
|
-
"describe": "Restore previous dependency state from last backup",
|
|
285
|
-
"operationType": "mutate",
|
|
286
|
-
"longDescription": "Restores package.json files from the most recent backup created by switch. Run pnpm install after undoing.",
|
|
287
|
-
"handler": "./cli/commands/undo.js#default",
|
|
288
|
-
"flags": [
|
|
289
|
-
{
|
|
290
|
-
"name": "json",
|
|
291
|
-
"type": "boolean",
|
|
292
|
-
"default": false,
|
|
293
|
-
"description": "Output as JSON"
|
|
294
|
-
}
|
|
295
|
-
],
|
|
296
|
-
"examples": [
|
|
297
|
-
"devlink undo # Undo last switch",
|
|
298
|
-
"devlink undo --json # JSON output"
|
|
299
|
-
],
|
|
300
|
-
"permissions": {
|
|
301
|
-
"fs": {
|
|
302
|
-
"read": [
|
|
303
|
-
"**/package.json",
|
|
304
|
-
".kb/devlink/**",
|
|
305
|
-
"**/pnpm-workspace.yaml"
|
|
306
|
-
],
|
|
307
|
-
"write": [
|
|
308
|
-
"**/package.json",
|
|
309
|
-
".kb/devlink/**",
|
|
310
|
-
"**/pnpm-workspace.yaml"
|
|
311
|
-
]
|
|
312
|
-
},
|
|
313
|
-
"platform": {
|
|
314
|
-
"cache": {
|
|
315
|
-
"namespaces": [
|
|
316
|
-
"devlink:"
|
|
317
|
-
]
|
|
318
|
-
}
|
|
319
|
-
},
|
|
320
|
-
"quotas": {
|
|
321
|
-
"timeoutMs": 1800000,
|
|
322
|
-
"memoryMb": 512
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
"path": "devlink backups",
|
|
328
|
-
"category": "State",
|
|
329
|
-
"describe": "List and restore backups",
|
|
330
|
-
"operationType": "read",
|
|
331
|
-
"longDescription": "Lists all available backups. Use --restore <id> to restore a specific backup.",
|
|
332
|
-
"handler": "./cli/commands/backups.js#default",
|
|
333
|
-
"flags": [
|
|
334
|
-
{
|
|
335
|
-
"name": "restore",
|
|
336
|
-
"type": "string",
|
|
337
|
-
"alias": "r",
|
|
338
|
-
"description": "Restore a specific backup by ID"
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
"name": "json",
|
|
342
|
-
"type": "boolean",
|
|
343
|
-
"default": false,
|
|
344
|
-
"description": "Output as JSON"
|
|
345
|
-
}
|
|
346
|
-
],
|
|
347
|
-
"examples": [
|
|
348
|
-
"devlink backups # List all backups",
|
|
349
|
-
"devlink backups --json # JSON output",
|
|
350
|
-
"devlink backups --restore=<backup-id> # Restore specific backup"
|
|
351
|
-
],
|
|
352
|
-
"permissions": {
|
|
353
|
-
"fs": {
|
|
354
|
-
"read": [
|
|
355
|
-
"**/package.json",
|
|
356
|
-
".kb/devlink/**",
|
|
357
|
-
"**/pnpm-workspace.yaml"
|
|
358
|
-
],
|
|
359
|
-
"write": [
|
|
360
|
-
"**/package.json",
|
|
361
|
-
".kb/devlink/**",
|
|
362
|
-
"**/pnpm-workspace.yaml"
|
|
363
|
-
]
|
|
364
|
-
},
|
|
365
|
-
"platform": {
|
|
366
|
-
"cache": {
|
|
367
|
-
"namespaces": [
|
|
368
|
-
"devlink:"
|
|
369
|
-
]
|
|
370
|
-
}
|
|
371
|
-
},
|
|
372
|
-
"quotas": {
|
|
373
|
-
"timeoutMs": 1800000,
|
|
374
|
-
"memoryMb": 512
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
]
|
|
379
|
-
},
|
|
380
|
-
"permissions": {
|
|
381
|
-
"fs": {
|
|
382
|
-
"read": [
|
|
383
|
-
"**/package.json",
|
|
384
|
-
".kb/devlink/**",
|
|
385
|
-
"**/pnpm-workspace.yaml"
|
|
386
|
-
],
|
|
387
|
-
"write": [
|
|
388
|
-
"**/package.json",
|
|
389
|
-
".kb/devlink/**",
|
|
390
|
-
"**/pnpm-workspace.yaml"
|
|
391
|
-
]
|
|
392
|
-
},
|
|
393
|
-
"platform": {
|
|
394
|
-
"cache": {
|
|
395
|
-
"namespaces": [
|
|
396
|
-
"devlink:"
|
|
397
|
-
]
|
|
398
|
-
}
|
|
399
|
-
},
|
|
400
|
-
"quotas": {
|
|
401
|
-
"timeoutMs": 1800000,
|
|
402
|
-
"memoryMb": 512
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|