@kb-labs/release-manager-cli 2.119.0 → 2.119.1-canary.b53bbee1d
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/build.js.map +1 -1
- package/dist/cli/commands/changelog.js.map +1 -1
- package/dist/cli/commands/checks.js.map +1 -1
- package/dist/cli/commands/deliver.js.map +1 -1
- package/dist/cli/commands/git.d.ts +2 -0
- package/dist/cli/commands/git.js +11 -4
- package/dist/cli/commands/git.js.map +1 -1
- package/dist/cli/commands/pack.js.map +1 -1
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/promote.js.map +1 -1
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/rollback.js.map +1 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/stage-plan.js.map +1 -1
- package/dist/cli/commands/stage.js.map +1 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/verify-clean-install.js.map +1 -1
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/version.d.ts +2 -0
- package/dist/cli/commands/version.js +11 -4
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/contracts/release.schema.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/manifest.js +13 -0
- package/dist/manifest.js.map +1 -1
- package/dist/manifest.json +1309 -0
- package/dist/rest/handlers/build-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-generate-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-save-handler.js.map +1 -1
- package/dist/rest/handlers/checklist-handler.js.map +1 -1
- package/dist/rest/handlers/generate-handler.d.ts +2 -2
- package/dist/rest/handlers/generate-handler.js.map +1 -1
- package/dist/rest/handlers/get-checks-handler.js.map +1 -1
- package/dist/rest/handlers/git-timeline-handler.js.map +1 -1
- package/dist/rest/handlers/history-changelog-handler.js.map +1 -1
- package/dist/rest/handlers/history-handler.js.map +1 -1
- package/dist/rest/handlers/history-plan-handler.d.ts +1 -1
- package/dist/rest/handlers/history-plan-handler.js.map +1 -1
- package/dist/rest/handlers/history-report-handler.d.ts +1 -1
- package/dist/rest/handlers/history-report-handler.js.map +1 -1
- package/dist/rest/handlers/plan-handler.d.ts +1 -1
- package/dist/rest/handlers/plan-handler.js.map +1 -1
- package/dist/rest/handlers/preview-handler.js.map +1 -1
- package/dist/rest/handlers/report-handler.d.ts +1 -1
- package/dist/rest/handlers/report-handler.js.map +1 -1
- package/dist/rest/handlers/reset-handler.js.map +1 -1
- package/dist/rest/handlers/run-checks-handler.js.map +1 -1
- package/dist/rest/handlers/run-handler.d.ts +1 -1
- package/dist/rest/handlers/run-handler.js.map +1 -1
- package/dist/rest/handlers/scopes-handler.js.map +1 -1
- package/dist/rest/handlers/status-handler.js.map +1 -1
- package/dist/setup/handler.js.map +1 -1
- package/dist/widgets/117.js +32 -0
- package/dist/widgets/165.js +1 -0
- package/dist/widgets/326.js +1 -0
- package/dist/widgets/370.js +1 -0
- package/dist/widgets/405.js +1 -0
- package/dist/widgets/46.js +445 -0
- package/dist/widgets/50.js +1 -0
- package/dist/widgets/546.js +1 -0
- package/dist/widgets/648.js +1 -0
- package/dist/widgets/669.js +1 -0
- package/dist/widgets/707.js +1 -0
- package/dist/widgets/775.js +1 -0
- package/dist/widgets/78.js +1 -0
- package/dist/widgets/832.js +96 -0
- package/dist/widgets/875.js +25 -0
- package/dist/widgets/945.js +1 -0
- package/dist/widgets/968.js +9 -0
- package/dist/widgets/__federation_expose_ReleasePage.js +1 -0
- package/dist/widgets/mf-manifest.json +229 -0
- package/dist/widgets/mf-stats.json +256 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/workflows/templates/dry-run.yaml +37 -0
- package/dist/workflows/templates/full-release.yaml +58 -0
- package/dist/workflows/templates/hotfix.yaml +40 -0
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/build-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"build-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Build handler — thin adapter over core buildPackages().\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type { BuildRequest, BuildResponse } from '@kb-labs/release-manager-contracts';\nimport { buildPackages, type PackageVersion } from '@kb-labs/release-manager-core';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { scopeToDir } from '../../shared/utils';\nimport { join } from 'node:path';\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nasync function copyChangelogToPackages(\n repoRoot: string,\n packages: Array<{ name: string; path: string }>,\n results: Array<{ name: string; success: boolean }>,\n changelogContent: string,\n): Promise<void> {\n for (const r of results) {\n if (!r.success) {\n break;\n }\n const pkg = packages.find(p => p.name === r.name);\n if (!pkg) {\n continue;\n }\n const pkgPath = pkg.path.startsWith('/') ? pkg.path : join(repoRoot, pkg.path);\n try {\n await writeFile(join(pkgPath, 'CHANGELOG.md'), changelogContent, 'utf-8');\n const distDir = join(pkgPath, 'dist');\n if (!existsSync(distDir)) {\n await mkdir(distDir, { recursive: true });\n }\n await writeFile(join(distDir, 'CHANGELOG.md'), changelogContent, 'utf-8');\n } catch { /* skip */ }\n }\n}\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, BuildRequest>): Promise<BuildResponse> {\n try {\n const scope = input.body?.scope || 'root';\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const startTime = Date.now();\n\n // Read plan\n const scopeDir = scopeToDir(scope);\n const planPath = join(repoRoot, '.kb/release/plans', scopeDir, 'current', 'plan.json');\n\n let plan: { packages: Array<{ name: string; path: string; currentVersion: string; nextVersion: string; bump: unknown }> };\n try {\n plan = JSON.parse(await readFile(planPath, 'utf-8'));\n } catch {\n return { scope, success: false, packages: [], builtCount: 0, totalCount: 0, totalDurationMs: Date.now() - startTime };\n }\n\n // Build via core\n const results = await buildPackages(plan.packages as unknown as PackageVersion[], { logger: ctx.platform?.logger, shell: ctx.api.shell });\n\n // Copy changelog if exists\n const changelogPath = join(repoRoot, '.kb/release/plans', scopeDir, 'current', 'changelog.md');\n let changelogContent: string | undefined;\n try { changelogContent = await readFile(changelogPath, 'utf-8'); } catch { /* skip */ }\n\n if (changelogContent) {\n await copyChangelogToPackages(repoRoot, plan.packages, results, changelogContent);\n }\n\n const builtCount = results.filter(r => r.success).length;\n return {\n scope,\n success: results.every(r => r.success),\n packages: results.map(r => ({ name: r.name, success: r.success, error: r.error, durationMs: r.durationMs })),\n builtCount,\n totalCount: plan.packages.length,\n totalDurationMs: Date.now() - startTime,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/infra/analytics/events.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/utils.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/rest/handlers/changelog-generate-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"changelog-generate-handler.js","sourcesContent":["/**\n * Analytics event types for Release CLI\n * Centralized constants to prevent typos and enable type safety\n */\n\n/**\n * Event type prefixes by command\n */\nexport const ANALYTICS_PREFIX = {\n PLAN: 'release.plan',\n RUN: 'release.run',\n ROLLBACK: 'release.rollback',\n REPORT: 'release.report',\n CHANGELOG: 'release.changelog',\n PREVIEW: 'release.preview',\n VERIFY: 'release.verify',\n PUBLISH: 'release.publish',\n} as const;\n\n/**\n * Event lifecycle suffixes\n */\nexport const ANALYTICS_SUFFIX = {\n STARTED: 'started',\n FINISHED: 'finished',\n} as const;\n\n/**\n * Release analytics event types\n */\nexport const ANALYTICS_EVENTS = {\n // Plan events\n PLAN_STARTED: `${ANALYTICS_PREFIX.PLAN}.${ANALYTICS_SUFFIX.STARTED}`,\n PLAN_FINISHED: `${ANALYTICS_PREFIX.PLAN}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Run events\n RUN_STARTED: `${ANALYTICS_PREFIX.RUN}.${ANALYTICS_SUFFIX.STARTED}`,\n RUN_FINISHED: `${ANALYTICS_PREFIX.RUN}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Rollback events\n ROLLBACK_STARTED: `${ANALYTICS_PREFIX.ROLLBACK}.${ANALYTICS_SUFFIX.STARTED}`,\n ROLLBACK_FINISHED: `${ANALYTICS_PREFIX.ROLLBACK}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Report events\n REPORT_STARTED: `${ANALYTICS_PREFIX.REPORT}.${ANALYTICS_SUFFIX.STARTED}`,\n REPORT_FINISHED: `${ANALYTICS_PREFIX.REPORT}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Changelog events\n CHANGELOG_STARTED: `${ANALYTICS_PREFIX.CHANGELOG}.${ANALYTICS_SUFFIX.STARTED}`,\n CHANGELOG_FINISHED: `${ANALYTICS_PREFIX.CHANGELOG}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Preview events\n PREVIEW_STARTED: `${ANALYTICS_PREFIX.PREVIEW}.${ANALYTICS_SUFFIX.STARTED}`,\n PREVIEW_FINISHED: `${ANALYTICS_PREFIX.PREVIEW}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Verify events\n VERIFY_STARTED: `${ANALYTICS_PREFIX.VERIFY}.${ANALYTICS_SUFFIX.STARTED}`,\n VERIFY_FINISHED: `${ANALYTICS_PREFIX.VERIFY}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Publish events\n PUBLISH_STARTED: `${ANALYTICS_PREFIX.PUBLISH}.${ANALYTICS_SUFFIX.STARTED}`,\n PUBLISH_FINISHED: `${ANALYTICS_PREFIX.PUBLISH}.${ANALYTICS_SUFFIX.FINISHED}`,\n} as const;\n\n/**\n * Type helper for analytics event types\n */\nexport type AnalyticsEventType = typeof ANALYTICS_EVENTS[keyof typeof ANALYTICS_EVENTS];\n\n/**\n * Actor configuration for Release analytics\n */\nexport const ANALYTICS_ACTOR = {\n type: 'agent' as const,\n id: 'release-cli',\n} as const;\n\n","export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Changelog generate handler - Generate changelog using LLM\n *\n * Writes: .kb/release/plans/{scope}/current/changelog.md\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, type PluginContextV3, rethrowForRest, useConfig } from '@kb-labs/sdk';\nimport type {\n GenerateChangelogRequest,\n GenerateChangelogResponse,\n ReleasePlan,\n} from '@kb-labs/release-manager-contracts';\nimport {\n generateChangelog,\n generateSimpleChangelog,\n type ChangelogPackageInfo,\n} from '@kb-labs/release-manager-changelog';\nimport { ANALYTICS_EVENTS, ANALYTICS_ACTOR } from '../../infra/analytics/events';\nimport { RELEASE_CACHE_PREFIX } from '@kb-labs/release-manager-contracts';\nimport { scopeToDir } from '../../shared/utils';\nimport { buildReleaseTag, type ReleaseConfig } from '@kb-labs/release-manager-core';\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\ninterface GenerateResult {\n markdown: string;\n commitsCount: number;\n usedLLM: boolean;\n}\n\nasync function generateWithLLM(\n ctx: PluginContextV3,\n packages: ChangelogPackageInfo[],\n repoRoot: string,\n gitCwd: string,\n locale: 'en' | 'ru',\n scope: string,\n range: { from?: string; to?: string; tagGlob?: string },\n): Promise<GenerateResult> {\n try {\n ctx.platform?.logger?.info?.('Starting LLM changelog generation', {\n scope,\n packagesCount: packages.length,\n template: 'corporate-ai',\n });\n const result = await generateChangelog({\n repoRoot,\n gitCwd,\n packages,\n range,\n changelog: { template: 'corporate-ai', locale },\n platform: {\n llm: ctx.platform.llm,\n logger: ctx.platform.logger,\n analytics: ctx.platform.analytics,\n },\n });\n ctx.platform?.logger?.info?.('LLM changelog generated', {\n scope,\n markdownLength: result.markdown.length,\n linesCount: result.markdown.split('\\n').length,\n commitsCount: result.changes.length,\n });\n return { markdown: result.markdown, commitsCount: result.changes.length, usedLLM: true };\n } catch (err) {\n ctx.platform?.logger?.error?.(\n 'Changelog generation failed, using simple fallback',\n err instanceof Error ? err : undefined,\n { scope, packagesCount: packages.length },\n );\n return { markdown: generateSimpleChangelog(packages, 'en'), commitsCount: 0, usedLLM: false };\n }\n}\n\nasync function resolveMarkdown(\n ctx: PluginContextV3,\n packages: ChangelogPackageInfo[],\n repoRoot: string,\n gitCwd: string,\n locale: 'en' | 'ru',\n useLLMFlag: boolean,\n scope: string,\n range: { from?: string; to?: string; tagGlob?: string },\n): Promise<GenerateResult> {\n if (!useLLMFlag) {\n ctx.platform?.logger?.info?.('Using simple changelog (LLM disabled by user)', { scope });\n return { markdown: generateSimpleChangelog(packages, 'en'), commitsCount: 0, usedLLM: false };\n }\n const hasLLM = !!ctx.platform?.llm;\n ctx.platform?.logger?.info?.('Changelog generation mode', { scope, useLLM: useLLMFlag, hasLLMPlatform: hasLLM });\n if (!hasLLM) {\n ctx.platform?.logger?.warn?.('LLM service not available, falling back to simple changelog', { scope });\n return { markdown: generateSimpleChangelog(packages, 'en'), commitsCount: 0, usedLLM: false };\n }\n return generateWithLLM(ctx, packages, repoRoot, gitCwd, locale, scope, range);\n}\n\nasync function resolveGitCwd(packages: ChangelogPackageInfo[], repoRoot: string): Promise<string> {\n if (!packages.length || !packages[0]) { return repoRoot; }\n try {\n return await findRepoRoot(packages[0].path);\n } catch {\n return packages[0].path;\n }\n}\n\n// ── handler ────────────────────────────────────────────────────────────────\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, GenerateChangelogRequest>): Promise<GenerateChangelogResponse> {\n try {\n const scope = input.body?.scope || 'root';\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const startTime = Date.now();\n\n ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_STARTED, { scope, actor: ANALYTICS_ACTOR });\n\n const scopeDirName = scopeToDir(scope);\n const planPath = `${repoRoot}/.kb/release/plans/${scopeDirName}/current/plan.json`;\n let plan: ReleasePlan;\n try {\n const planContent = await ctx.runtime.fs.readFile(planPath, 'utf-8');\n plan = JSON.parse(planContent);\n } catch (err) {\n ctx.platform?.logger?.error?.(\n 'Failed to read release plan',\n err instanceof Error ? err : undefined,\n { scope, planPath },\n );\n throw new Error(`Release plan not found for scope \"${scope}\". Generate plan first.`);\n }\n // Studio normally regenerates from the persisted plan, while API callers\n // may override its flow explicitly. Either way, stay on the same tag\n // family that produced the plan rather than guessing across all tags.\n const flow = input.body?.flow ?? plan.flow;\n\n const packages: ChangelogPackageInfo[] = plan.packages.map(pkg => ({\n name: pkg.name,\n path: pkg.path,\n currentVersion: pkg.currentVersion,\n nextVersion: pkg.nextVersion,\n bump: pkg.bump === 'auto' ? 'patch' : pkg.bump,\n }));\n\n const gitCwd = await resolveGitCwd(packages, repoRoot);\n\n const localeRaw = input.body?.locale;\n const locale: 'en' | 'ru' = localeRaw === 'ru' ? 'ru' : 'en';\n const config = await useConfig<ReleaseConfig>() ?? {};\n const range = {\n from: input.body?.from,\n to: input.body?.to ?? 'HEAD',\n tagGlob: flow ? buildReleaseTag(flow, '*', config.flows?.[flow]?.tagPattern) : undefined,\n };\n\n const { markdown, commitsCount, usedLLM } = await resolveMarkdown(\n ctx,\n packages,\n repoRoot,\n gitCwd,\n locale,\n input.body?.useLLM ?? true,\n scope,\n range,\n );\n\n const scopeDir = `${repoRoot}/.kb/release/plans/${scopeDirName}/current`;\n await ctx.runtime.fs.mkdir(scopeDir, { recursive: true });\n\n const changelogPath = `${scopeDir}/changelog.md`;\n await ctx.runtime.fs.writeFile(changelogPath, markdown, { encoding: 'utf-8' });\n\n const cacheKey = `${RELEASE_CACHE_PREFIX}changelog:${scope}`;\n await ctx.platform?.cache?.delete(cacheKey);\n\n const duration = Date.now() - startTime;\n const tokensUsed = 0;\n\n ctx.platform?.logger?.info?.('Changelog generated', {\n scope, path: changelogPath, packagesCount: packages.length,\n commitsCount, usedLLM, durationMs: duration,\n });\n\n ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_FINISHED, {\n scope, packagesCount: packages.length, commitsCount,\n durationMs: duration, tokensUsed, usedLLM, actor: ANALYTICS_ACTOR,\n });\n\n return { scope, markdown, changelogPath, tokensUsed, usedLLM, commitsCount };\n } catch (err) {\n rethrowForRest(err);\n }\n }\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/infra/analytics/events.ts","../../../src/shared/utils.ts","../../../src/rest/handlers/changelog-generate-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"changelog-generate-handler.js","sourcesContent":["/**\n * Analytics event types for Release CLI\n * Centralized constants to prevent typos and enable type safety\n */\n\n/**\n * Event type prefixes by command\n */\nexport const ANALYTICS_PREFIX = {\n PLAN: 'release.plan',\n RUN: 'release.run',\n ROLLBACK: 'release.rollback',\n REPORT: 'release.report',\n CHANGELOG: 'release.changelog',\n PREVIEW: 'release.preview',\n VERIFY: 'release.verify',\n PUBLISH: 'release.publish',\n} as const;\n\n/**\n * Event lifecycle suffixes\n */\nexport const ANALYTICS_SUFFIX = {\n STARTED: 'started',\n FINISHED: 'finished',\n} as const;\n\n/**\n * Release analytics event types\n */\nexport const ANALYTICS_EVENTS = {\n // Plan events\n PLAN_STARTED: `${ANALYTICS_PREFIX.PLAN}.${ANALYTICS_SUFFIX.STARTED}`,\n PLAN_FINISHED: `${ANALYTICS_PREFIX.PLAN}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Run events\n RUN_STARTED: `${ANALYTICS_PREFIX.RUN}.${ANALYTICS_SUFFIX.STARTED}`,\n RUN_FINISHED: `${ANALYTICS_PREFIX.RUN}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Rollback events\n ROLLBACK_STARTED: `${ANALYTICS_PREFIX.ROLLBACK}.${ANALYTICS_SUFFIX.STARTED}`,\n ROLLBACK_FINISHED: `${ANALYTICS_PREFIX.ROLLBACK}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Report events\n REPORT_STARTED: `${ANALYTICS_PREFIX.REPORT}.${ANALYTICS_SUFFIX.STARTED}`,\n REPORT_FINISHED: `${ANALYTICS_PREFIX.REPORT}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Changelog events\n CHANGELOG_STARTED: `${ANALYTICS_PREFIX.CHANGELOG}.${ANALYTICS_SUFFIX.STARTED}`,\n CHANGELOG_FINISHED: `${ANALYTICS_PREFIX.CHANGELOG}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Preview events\n PREVIEW_STARTED: `${ANALYTICS_PREFIX.PREVIEW}.${ANALYTICS_SUFFIX.STARTED}`,\n PREVIEW_FINISHED: `${ANALYTICS_PREFIX.PREVIEW}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Verify events\n VERIFY_STARTED: `${ANALYTICS_PREFIX.VERIFY}.${ANALYTICS_SUFFIX.STARTED}`,\n VERIFY_FINISHED: `${ANALYTICS_PREFIX.VERIFY}.${ANALYTICS_SUFFIX.FINISHED}`,\n\n // Publish events\n PUBLISH_STARTED: `${ANALYTICS_PREFIX.PUBLISH}.${ANALYTICS_SUFFIX.STARTED}`,\n PUBLISH_FINISHED: `${ANALYTICS_PREFIX.PUBLISH}.${ANALYTICS_SUFFIX.FINISHED}`,\n} as const;\n\n/**\n * Type helper for analytics event types\n */\nexport type AnalyticsEventType = typeof ANALYTICS_EVENTS[keyof typeof ANALYTICS_EVENTS];\n\n/**\n * Actor configuration for Release analytics\n */\nexport const ANALYTICS_ACTOR = {\n type: 'agent' as const,\n id: 'release-cli',\n} as const;\n\n","export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Changelog generate handler - Generate changelog using LLM\n *\n * Writes: .kb/release/plans/{scope}/current/changelog.md\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, type PluginContextV3, rethrowForRest, useConfig } from '@kb-labs/sdk';\nimport type {\n GenerateChangelogRequest,\n GenerateChangelogResponse,\n ReleasePlan,\n} from '@kb-labs/release-manager-contracts';\nimport {\n generateChangelog,\n generateSimpleChangelog,\n type ChangelogPackageInfo,\n} from '@kb-labs/release-manager-changelog';\nimport { ANALYTICS_EVENTS, ANALYTICS_ACTOR } from '../../infra/analytics/events';\nimport { RELEASE_CACHE_PREFIX } from '@kb-labs/release-manager-contracts';\nimport { scopeToDir } from '../../shared/utils';\nimport { buildReleaseTag, type ReleaseConfig } from '@kb-labs/release-manager-core';\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\ninterface GenerateResult {\n markdown: string;\n commitsCount: number;\n usedLLM: boolean;\n}\n\nasync function generateWithLLM(\n ctx: PluginContextV3,\n packages: ChangelogPackageInfo[],\n repoRoot: string,\n gitCwd: string,\n locale: 'en' | 'ru',\n scope: string,\n range: { from?: string; to?: string; tagGlob?: string },\n): Promise<GenerateResult> {\n try {\n ctx.platform?.logger?.info?.('Starting LLM changelog generation', {\n scope,\n packagesCount: packages.length,\n template: 'corporate-ai',\n });\n const result = await generateChangelog({\n repoRoot,\n gitCwd,\n packages,\n range,\n changelog: { template: 'corporate-ai', locale },\n platform: {\n llm: ctx.platform.llm,\n logger: ctx.platform.logger,\n analytics: ctx.platform.analytics,\n },\n });\n ctx.platform?.logger?.info?.('LLM changelog generated', {\n scope,\n markdownLength: result.markdown.length,\n linesCount: result.markdown.split('\\n').length,\n commitsCount: result.changes.length,\n });\n return { markdown: result.markdown, commitsCount: result.changes.length, usedLLM: true };\n } catch (err) {\n ctx.platform?.logger?.error?.(\n 'Changelog generation failed, using simple fallback',\n err instanceof Error ? err : undefined,\n { scope, packagesCount: packages.length },\n );\n return { markdown: generateSimpleChangelog(packages, 'en'), commitsCount: 0, usedLLM: false };\n }\n}\n\nasync function resolveMarkdown(\n ctx: PluginContextV3,\n packages: ChangelogPackageInfo[],\n repoRoot: string,\n gitCwd: string,\n locale: 'en' | 'ru',\n useLLMFlag: boolean,\n scope: string,\n range: { from?: string; to?: string; tagGlob?: string },\n): Promise<GenerateResult> {\n if (!useLLMFlag) {\n ctx.platform?.logger?.info?.('Using simple changelog (LLM disabled by user)', { scope });\n return { markdown: generateSimpleChangelog(packages, 'en'), commitsCount: 0, usedLLM: false };\n }\n const hasLLM = !!ctx.platform?.llm;\n ctx.platform?.logger?.info?.('Changelog generation mode', { scope, useLLM: useLLMFlag, hasLLMPlatform: hasLLM });\n if (!hasLLM) {\n ctx.platform?.logger?.warn?.('LLM service not available, falling back to simple changelog', { scope });\n return { markdown: generateSimpleChangelog(packages, 'en'), commitsCount: 0, usedLLM: false };\n }\n return generateWithLLM(ctx, packages, repoRoot, gitCwd, locale, scope, range);\n}\n\nasync function resolveGitCwd(packages: ChangelogPackageInfo[], repoRoot: string): Promise<string> {\n if (!packages.length || !packages[0]) { return repoRoot; }\n try {\n return await findRepoRoot(packages[0].path);\n } catch {\n return packages[0].path;\n }\n}\n\n// ── handler ────────────────────────────────────────────────────────────────\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, GenerateChangelogRequest>): Promise<GenerateChangelogResponse> {\n try {\n const scope = input.body?.scope || 'root';\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const startTime = Date.now();\n\n ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_STARTED, { scope, actor: ANALYTICS_ACTOR });\n\n const scopeDirName = scopeToDir(scope);\n const planPath = `${repoRoot}/.kb/release/plans/${scopeDirName}/current/plan.json`;\n let plan: ReleasePlan;\n try {\n const planContent = await ctx.runtime.fs.readFile(planPath, 'utf-8');\n plan = JSON.parse(planContent);\n } catch (err) {\n ctx.platform?.logger?.error?.(\n 'Failed to read release plan',\n err instanceof Error ? err : undefined,\n { scope, planPath },\n );\n throw new Error(`Release plan not found for scope \"${scope}\". Generate plan first.`);\n }\n // Studio normally regenerates from the persisted plan, while API callers\n // may override its flow explicitly. Either way, stay on the same tag\n // family that produced the plan rather than guessing across all tags.\n const flow = input.body?.flow ?? plan.flow;\n\n const packages: ChangelogPackageInfo[] = plan.packages.map(pkg => ({\n name: pkg.name,\n path: pkg.path,\n currentVersion: pkg.currentVersion,\n nextVersion: pkg.nextVersion,\n bump: pkg.bump === 'auto' ? 'patch' : pkg.bump,\n }));\n\n const gitCwd = await resolveGitCwd(packages, repoRoot);\n\n const localeRaw = input.body?.locale;\n const locale: 'en' | 'ru' = localeRaw === 'ru' ? 'ru' : 'en';\n const config = await useConfig<ReleaseConfig>() ?? {};\n const range = {\n from: input.body?.from,\n to: input.body?.to ?? 'HEAD',\n tagGlob: flow ? buildReleaseTag(flow, '*', config.flows?.[flow]?.tagPattern) : undefined,\n };\n\n const { markdown, commitsCount, usedLLM } = await resolveMarkdown(\n ctx,\n packages,\n repoRoot,\n gitCwd,\n locale,\n input.body?.useLLM ?? true,\n scope,\n range,\n );\n\n const scopeDir = `${repoRoot}/.kb/release/plans/${scopeDirName}/current`;\n await ctx.runtime.fs.mkdir(scopeDir, { recursive: true });\n\n const changelogPath = `${scopeDir}/changelog.md`;\n await ctx.runtime.fs.writeFile(changelogPath, markdown, { encoding: 'utf-8' });\n\n const cacheKey = `${RELEASE_CACHE_PREFIX}changelog:${scope}`;\n await ctx.platform?.cache?.delete(cacheKey);\n\n const duration = Date.now() - startTime;\n const tokensUsed = 0;\n\n ctx.platform?.logger?.info?.('Changelog generated', {\n scope, path: changelogPath, packagesCount: packages.length,\n commitsCount, usedLLM, durationMs: duration,\n });\n\n ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_FINISHED, {\n scope, packagesCount: packages.length, commitsCount,\n durationMs: duration, tokensUsed, usedLLM, actor: ANALYTICS_ACTOR,\n });\n\n return { scope, markdown, changelogPath, tokensUsed, usedLLM, commitsCount };\n } catch (err) {\n rethrowForRest(err);\n }\n }\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/changelog-handler.ts"],"names":["findRepoRoot"],"mappings":";;;;AAMO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,EAAE,EAChB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,QAAQ,IAAA,EAAM,GAAG,CAAA,CACjB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB;;;ACAA,IAAM,YAAA,GAAe,IAAA;AAErB,IAAO,4BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAA8D;AAC/E,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AACpC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAA,GAAW,MAAMA,YAAAA,CAAa,GAAG,CAAA;AAEvC,MAAA,MAAM,YAAA,GAAe,WAAW,KAAK,CAAA;AACrC,MAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,QAAQ,CAAA,mBAAA,EAAsB,YAAY,CAAA,qBAAA,CAAA;AACnE,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,oBAAoB,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA;AAG1D,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,QAAA,EAAU,KAAA,EAAO,IAAI,QAAQ,CAAA;AACtD,MAAA,IAAI,MAAA,KAAW,KAAA,CAAA,IAAa,MAAA,KAAW,IAAA,EAAM;AAC3C,QAAA,OAAO;AAAA,UACL,KAAA;AAAA,UACA,QAAA,EAAU,MAAA;AAAA,UACV,IAAA,EAAM,MAAM,KAAA,EAAO,IAAA;AAAA,UACnB,EAAA,EAAI,MAAM,KAAA,EAAO;AAAA,SACnB;AAAA,MACF;AAGA,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,QAAA,CAAS,eAAe,OAAO,CAAA;AAG/D,QAAA,IAAI,aAAa,KAAA,CAAA,EAAW;AAC1B,UAAA,MAAM,IAAI,QAAA,EAAU,KAAA,EAAO,GAAA,CAAI,QAAA,EAAU,UAAU,YAAY,CAAA;AAAA,QACjE;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA,EAAM,MAAM,KAAA,EAAO,IAAA;AAAA,QACnB,EAAA,EAAI,MAAM,KAAA,EAAO;AAAA,OACnB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"changelog-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Changelog handler - Get changelog for a scope\n *\n * Reads: .kb/release/plans/{scope}/current/changelog.md\n * Cache: 15s TTL to avoid repeated file reads\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type { ChangelogResponse, ChangelogInput } from '@kb-labs/release-manager-contracts';\nimport { RELEASE_CACHE_PREFIX } from '@kb-labs/release-manager-contracts';\nimport { scopeToDir } from '../../shared/utils';\n\nconst CACHE_TTL_MS = 15000; // 15 seconds\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<ChangelogInput>): Promise<ChangelogResponse> {\n try {\n const scope = input.query?.scope || 'root';\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const scopeDirName = scopeToDir(scope);\n const changelogPath = `${repoRoot}/.kb/release/plans/${scopeDirName}/current/changelog.md`;\n const cacheKey = `${RELEASE_CACHE_PREFIX}changelog:${scope}`;\n\n // Try cache first\n const cached = await ctx.platform?.cache?.get(cacheKey);\n if (cached !== undefined && cached !== null) {\n return {\n scope,\n markdown: cached as string,\n from: input.query?.from,\n to: input.query?.to,\n };\n }\n\n // Cache miss - read from file\n let markdown: string | undefined;\n try {\n markdown = await ctx.runtime.fs.readFile(changelogPath, 'utf-8');\n\n // Cache the result (only if file exists)\n if (markdown !== undefined) {\n await ctx.platform?.cache?.set(cacheKey, markdown, CACHE_TTL_MS);\n }\n } catch {\n // No changelog found - markdown will be undefined\n }\n\n return {\n scope,\n markdown,\n from: input.query?.from,\n to: input.query?.to,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n }\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/changelog-save-handler.ts"],"names":["findRepoRoot"],"mappings":";;;;AAMO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,EAAE,EAChB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,QAAQ,IAAA,EAAM,GAAG,CAAA,CACjB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB;;;ACEA,IAAO,iCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAiF;AAClG,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,MAAA;AACnC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,IAAA,MAAM,QAAA,GAAW,MAAMA,YAAAA,CAAa,GAAG,CAAA;AAEvC,IAAA,MAAM,YAAA,GAAe,WAAW,KAAK,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,mBAAA,EAAsB,YAAY,CAAA,QAAA,CAAA;AAC9D,IAAA,MAAM,aAAA,GAAgB,GAAG,QAAQ,CAAA,aAAA,CAAA;AAEjC,IAAA,IAAI;AAEF,MAAA,MAAM,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAGzC,MAAA,MAAM,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,SAAA,CAAU,aAAA,EAAe,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,EAAA,EAAI,EAAE,QAAA,EAAU,OAAA,EAAS,CAAA;AAE/F,MAAA,GAAA,CAAI,QAAA,EAAU,QAAQ,IAAA,GAAO,iBAAA,EAAmB,EAAE,KAAA,EAAO,IAAA,EAAM,eAAe,CAAA;AAE9E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,KAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,UAAU,MAAA,EAAQ,KAAA;AAAA,QACpB,0BAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ,MAAA;AAAA,QACjC,EAAE,KAAA;AAAM,OACV;AAEA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAC","file":"changelog-save-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Changelog save handler - Save edited changelog for a scope\n *\n * Writes to: .kb/release/plans/{scope}/current/changelog.md\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type {\n SaveChangelogRequest,\n SaveChangelogResponse,\n} from '@kb-labs/release-manager-contracts';\nimport { mkdir } from 'node:fs/promises';\nimport { scopeToDir } from '../../shared/utils';\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, SaveChangelogRequest>): Promise<SaveChangelogResponse> {\n const scope = input.body?.scope || 'root';\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const scopeDirName = scopeToDir(scope);\n const scopeDir = `${repoRoot}/.kb/release/plans/${scopeDirName}/current`;\n const changelogPath = `${scopeDir}/changelog.md`;\n\n try {\n // Ensure directory exists\n await mkdir(scopeDir, { recursive: true });\n\n // Write changelog\n await ctx.runtime.fs.writeFile(changelogPath, input.body?.markdown || '', { encoding: 'utf-8' });\n\n ctx.platform?.logger?.info?.('Changelog saved', { scope, path: changelogPath });\n\n return {\n success: true,\n scope,\n path: changelogPath,\n };\n } catch (error) {\n ctx.platform?.logger?.error?.(\n 'Failed to save changelog',\n error instanceof Error ? error : undefined,\n { scope }\n );\n\n rethrowForRest(error);\n }\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/utils.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/rest/handlers/checklist-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"checklist-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Checklist handler - Get unified release checklist status\n *\n * Returns status of all release steps: plan, changelog, build, preview\n */\n\nimport { defineHandler, findRepoRoot, useEnv, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type {\n ReleaseChecklist,\n ChecklistItemStatus,\n ReleasePlan,\n} from '@kb-labs/release-manager-contracts';\nimport { readFile, access, readdir, stat } from 'node:fs/promises';\nimport { scopeToDir } from '../../shared/utils';\nimport { join } from 'node:path';\n\ninterface ChecklistInput {\n scope?: string;\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nasync function countFiles(dir: string): Promise<{ count: number; size: number }> {\n let count = 0;\n let size = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n const sub = await countFiles(fullPath);\n count += sub.count;\n size += sub.size;\n } else {\n count++;\n const fileStat = await stat(fullPath);\n size += fileStat.size;\n }\n }\n return { count, size };\n}\n\ninterface PlanCheckResult {\n planStatus: ChecklistItemStatus;\n planMessage: string;\n packagesCount: number;\n bump: string | undefined;\n plan: ReleasePlan | undefined;\n}\n\nasync function checkPlanStatus(basePath: string): Promise<PlanCheckResult> {\n try {\n const planRaw = await readFile(join(basePath, 'plan.json'), 'utf-8');\n const parsedPlan: ReleasePlan = JSON.parse(planRaw);\n const packagesCount = parsedPlan.packages.length;\n const bump = parsedPlan.packages[0]?.bump;\n return {\n planStatus: 'ready',\n planMessage: `${packagesCount} package${packagesCount !== 1 ? 's' : ''}, ${bump} bump`,\n packagesCount,\n bump,\n plan: parsedPlan,\n };\n } catch {\n return { planStatus: 'pending', planMessage: 'No release plan found', packagesCount: 0, bump: undefined, plan: undefined };\n }\n}\n\ninterface ChangelogCheckResult {\n changelogStatus: ChecklistItemStatus;\n changelogMessage: string;\n commitsCount: number | undefined;\n}\n\nasync function checkChangelogStatus(basePath: string, planStatus: ChecklistItemStatus): Promise<ChangelogCheckResult> {\n try {\n const changelogPath = join(basePath, 'CHANGELOG.md');\n await access(changelogPath);\n const changelog = await readFile(changelogPath, 'utf-8');\n const commitMatches = changelog.match(/^- /gm);\n const commitsCount = commitMatches?.length || 0;\n return {\n changelogStatus: 'ready',\n changelogMessage: `${commitsCount} change${commitsCount !== 1 ? 's' : ''} documented`,\n commitsCount,\n };\n } catch {\n const changelogMessage = planStatus === 'ready' ? 'Generate changelog to continue' : 'Changelog not generated';\n return { changelogStatus: 'pending', changelogMessage, commitsCount: undefined };\n }\n}\n\ninterface BuildCheckResult {\n buildStatus: ChecklistItemStatus;\n buildMessage: string;\n builtCount: number;\n totalCount: number;\n}\n\nasync function checkBuildStatus(plan: ReleasePlan | undefined, repoRoot: string): Promise<BuildCheckResult> {\n if (!plan) {\n return { buildStatus: 'pending', buildMessage: 'Build required', builtCount: 0, totalCount: 0 };\n }\n const totalCount = plan.packages.length;\n let builtCount = 0;\n for (const pkg of plan.packages) {\n const packagePath = pkg.path.startsWith('/') ? pkg.path : join(repoRoot, pkg.path);\n try {\n await access(join(packagePath, 'dist'));\n builtCount++;\n } catch {\n // Not built\n }\n }\n if (builtCount === totalCount) {\n return {\n buildStatus: 'ready',\n buildMessage: `All ${totalCount} package${totalCount !== 1 ? 's' : ''} built`,\n builtCount,\n totalCount,\n };\n }\n if (builtCount > 0) {\n return { buildStatus: 'warning', buildMessage: `${builtCount}/${totalCount} packages built`, builtCount, totalCount };\n }\n return {\n buildStatus: 'pending',\n buildMessage: `${totalCount} package${totalCount !== 1 ? 's' : ''} need build`,\n builtCount,\n totalCount,\n };\n}\n\ninterface PreviewCheckResult {\n previewStatus: ChecklistItemStatus;\n previewMessage: string;\n filesCount: number | undefined;\n totalSize: number | undefined;\n}\n\nasync function checkPreviewStatus(\n plan: ReleasePlan | undefined,\n repoRoot: string,\n buildStatus: ChecklistItemStatus,\n): Promise<PreviewCheckResult> {\n if (buildStatus !== 'ready' || !plan) {\n return { previewStatus: 'pending', previewMessage: 'Waiting for build', filesCount: undefined, totalSize: undefined };\n }\n let filesCount = 0;\n let totalSize = 0;\n for (const pkg of plan.packages) {\n const packagePath = pkg.path.startsWith('/') ? pkg.path : join(repoRoot, pkg.path);\n try {\n const result = await countFiles(join(packagePath, 'dist'));\n filesCount += result.count;\n totalSize += result.size;\n } catch {\n // Skip - dist doesn't exist or error reading\n }\n }\n if (filesCount > 0) {\n return {\n previewStatus: 'ready',\n previewMessage: `${filesCount} file${filesCount !== 1 ? 's' : ''} ready to publish`,\n filesCount,\n totalSize,\n };\n }\n return { previewStatus: 'warning', previewMessage: 'No files found to publish', filesCount, totalSize };\n}\n\n// ── handler ────────────────────────────────────────────────────────────────\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<ChecklistInput>): Promise<ReleaseChecklist> {\n try {\n const scope = input.query?.scope || 'root';\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const scopeDir = scopeToDir(scope);\n const basePath = join(repoRoot, '.kb/release/plans', scopeDir, 'current');\n\n const { planStatus, planMessage, packagesCount, bump, plan } = await checkPlanStatus(basePath);\n const { changelogStatus, changelogMessage, commitsCount } = await checkChangelogStatus(basePath, planStatus);\n const { buildStatus, buildMessage, builtCount, totalCount } = await checkBuildStatus(plan, repoRoot);\n const { previewStatus, previewMessage, filesCount, totalSize } = await checkPreviewStatus(plan, repoRoot, buildStatus);\n\n const hasNpmToken = !!(useEnv('NPM_TOKEN') ?? useEnv('NODE_AUTH_TOKEN'));\n const npmStatus: ChecklistItemStatus = hasNpmToken ? 'ready' : 'error';\n const npmMessage = hasNpmToken\n ? 'npm token configured'\n : 'Set NPM_TOKEN (granular access token) in environment';\n\n const canPublish =\n planStatus === 'ready' &&\n changelogStatus === 'ready' &&\n buildStatus === 'ready' &&\n previewStatus === 'ready' &&\n npmStatus === 'ready';\n\n return {\n scope,\n plan: {\n status: planStatus,\n message: planMessage,\n packagesCount: packagesCount > 0 ? packagesCount : undefined,\n bump,\n },\n changelog: {\n status: changelogStatus,\n message: changelogMessage,\n commitsCount,\n },\n build: {\n status: buildStatus,\n message: buildMessage,\n builtCount: builtCount > 0 ? builtCount : undefined,\n totalCount: totalCount > 0 ? totalCount : undefined,\n },\n preview: {\n status: previewStatus,\n message: previewMessage,\n filesCount,\n totalSize,\n },\n npm: {\n status: npmStatus,\n message: npmMessage,\n },\n canPublish,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/checklist-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"checklist-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Checklist handler - Get unified release checklist status\n *\n * Returns status of all release steps: plan, changelog, build, preview\n */\n\nimport { defineHandler, findRepoRoot, useEnv, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type {\n ReleaseChecklist,\n ChecklistItemStatus,\n ReleasePlan,\n} from '@kb-labs/release-manager-contracts';\nimport { readFile, access, readdir, stat } from 'node:fs/promises';\nimport { scopeToDir } from '../../shared/utils';\nimport { join } from 'node:path';\n\ninterface ChecklistInput {\n scope?: string;\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nasync function countFiles(dir: string): Promise<{ count: number; size: number }> {\n let count = 0;\n let size = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n const sub = await countFiles(fullPath);\n count += sub.count;\n size += sub.size;\n } else {\n count++;\n const fileStat = await stat(fullPath);\n size += fileStat.size;\n }\n }\n return { count, size };\n}\n\ninterface PlanCheckResult {\n planStatus: ChecklistItemStatus;\n planMessage: string;\n packagesCount: number;\n bump: string | undefined;\n plan: ReleasePlan | undefined;\n}\n\nasync function checkPlanStatus(basePath: string): Promise<PlanCheckResult> {\n try {\n const planRaw = await readFile(join(basePath, 'plan.json'), 'utf-8');\n const parsedPlan: ReleasePlan = JSON.parse(planRaw);\n const packagesCount = parsedPlan.packages.length;\n const bump = parsedPlan.packages[0]?.bump;\n return {\n planStatus: 'ready',\n planMessage: `${packagesCount} package${packagesCount !== 1 ? 's' : ''}, ${bump} bump`,\n packagesCount,\n bump,\n plan: parsedPlan,\n };\n } catch {\n return { planStatus: 'pending', planMessage: 'No release plan found', packagesCount: 0, bump: undefined, plan: undefined };\n }\n}\n\ninterface ChangelogCheckResult {\n changelogStatus: ChecklistItemStatus;\n changelogMessage: string;\n commitsCount: number | undefined;\n}\n\nasync function checkChangelogStatus(basePath: string, planStatus: ChecklistItemStatus): Promise<ChangelogCheckResult> {\n try {\n const changelogPath = join(basePath, 'CHANGELOG.md');\n await access(changelogPath);\n const changelog = await readFile(changelogPath, 'utf-8');\n const commitMatches = changelog.match(/^- /gm);\n const commitsCount = commitMatches?.length || 0;\n return {\n changelogStatus: 'ready',\n changelogMessage: `${commitsCount} change${commitsCount !== 1 ? 's' : ''} documented`,\n commitsCount,\n };\n } catch {\n const changelogMessage = planStatus === 'ready' ? 'Generate changelog to continue' : 'Changelog not generated';\n return { changelogStatus: 'pending', changelogMessage, commitsCount: undefined };\n }\n}\n\ninterface BuildCheckResult {\n buildStatus: ChecklistItemStatus;\n buildMessage: string;\n builtCount: number;\n totalCount: number;\n}\n\nasync function checkBuildStatus(plan: ReleasePlan | undefined, repoRoot: string): Promise<BuildCheckResult> {\n if (!plan) {\n return { buildStatus: 'pending', buildMessage: 'Build required', builtCount: 0, totalCount: 0 };\n }\n const totalCount = plan.packages.length;\n let builtCount = 0;\n for (const pkg of plan.packages) {\n const packagePath = pkg.path.startsWith('/') ? pkg.path : join(repoRoot, pkg.path);\n try {\n await access(join(packagePath, 'dist'));\n builtCount++;\n } catch {\n // Not built\n }\n }\n if (builtCount === totalCount) {\n return {\n buildStatus: 'ready',\n buildMessage: `All ${totalCount} package${totalCount !== 1 ? 's' : ''} built`,\n builtCount,\n totalCount,\n };\n }\n if (builtCount > 0) {\n return { buildStatus: 'warning', buildMessage: `${builtCount}/${totalCount} packages built`, builtCount, totalCount };\n }\n return {\n buildStatus: 'pending',\n buildMessage: `${totalCount} package${totalCount !== 1 ? 's' : ''} need build`,\n builtCount,\n totalCount,\n };\n}\n\ninterface PreviewCheckResult {\n previewStatus: ChecklistItemStatus;\n previewMessage: string;\n filesCount: number | undefined;\n totalSize: number | undefined;\n}\n\nasync function checkPreviewStatus(\n plan: ReleasePlan | undefined,\n repoRoot: string,\n buildStatus: ChecklistItemStatus,\n): Promise<PreviewCheckResult> {\n if (buildStatus !== 'ready' || !plan) {\n return { previewStatus: 'pending', previewMessage: 'Waiting for build', filesCount: undefined, totalSize: undefined };\n }\n let filesCount = 0;\n let totalSize = 0;\n for (const pkg of plan.packages) {\n const packagePath = pkg.path.startsWith('/') ? pkg.path : join(repoRoot, pkg.path);\n try {\n const result = await countFiles(join(packagePath, 'dist'));\n filesCount += result.count;\n totalSize += result.size;\n } catch {\n // Skip - dist doesn't exist or error reading\n }\n }\n if (filesCount > 0) {\n return {\n previewStatus: 'ready',\n previewMessage: `${filesCount} file${filesCount !== 1 ? 's' : ''} ready to publish`,\n filesCount,\n totalSize,\n };\n }\n return { previewStatus: 'warning', previewMessage: 'No files found to publish', filesCount, totalSize };\n}\n\n// ── handler ────────────────────────────────────────────────────────────────\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<ChecklistInput>): Promise<ReleaseChecklist> {\n try {\n const scope = input.query?.scope || 'root';\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const scopeDir = scopeToDir(scope);\n const basePath = join(repoRoot, '.kb/release/plans', scopeDir, 'current');\n\n const { planStatus, planMessage, packagesCount, bump, plan } = await checkPlanStatus(basePath);\n const { changelogStatus, changelogMessage, commitsCount } = await checkChangelogStatus(basePath, planStatus);\n const { buildStatus, buildMessage, builtCount, totalCount } = await checkBuildStatus(plan, repoRoot);\n const { previewStatus, previewMessage, filesCount, totalSize } = await checkPreviewStatus(plan, repoRoot, buildStatus);\n\n const hasNpmToken = !!(useEnv('NPM_TOKEN') ?? useEnv('NODE_AUTH_TOKEN'));\n const npmStatus: ChecklistItemStatus = hasNpmToken ? 'ready' : 'error';\n const npmMessage = hasNpmToken\n ? 'npm token configured'\n : 'Set NPM_TOKEN (granular access token) in environment';\n\n const canPublish =\n planStatus === 'ready' &&\n changelogStatus === 'ready' &&\n buildStatus === 'ready' &&\n previewStatus === 'ready' &&\n npmStatus === 'ready';\n\n return {\n scope,\n plan: {\n status: planStatus,\n message: planMessage,\n packagesCount: packagesCount > 0 ? packagesCount : undefined,\n bump,\n },\n changelog: {\n status: changelogStatus,\n message: changelogMessage,\n commitsCount,\n },\n build: {\n status: buildStatus,\n message: buildMessage,\n builtCount: builtCount > 0 ? builtCount : undefined,\n totalCount: totalCount > 0 ? totalCount : undefined,\n },\n preview: {\n status: previewStatus,\n message: previewMessage,\n filesCount,\n totalSize,\n },\n npm: {\n status: npmStatus,\n message: npmMessage,\n },\n canPublish,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -4,7 +4,7 @@ import { RestInput } from '@kb-labs/sdk';
|
|
|
4
4
|
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, {
|
|
5
5
|
scope: string;
|
|
6
6
|
useLLM: boolean;
|
|
7
|
-
bump?: "patch" | "minor" | "major" | "auto" | undefined;
|
|
7
|
+
bump?: "patch" | "minor" | "major" | "auto" | "none" | undefined;
|
|
8
8
|
scopePath?: string | undefined;
|
|
9
9
|
strict?: boolean | undefined;
|
|
10
10
|
}, unknown>, {
|
|
@@ -16,7 +16,7 @@ declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<u
|
|
|
16
16
|
path: string;
|
|
17
17
|
currentVersion: string;
|
|
18
18
|
nextVersion: string;
|
|
19
|
-
bump: "patch" | "minor" | "major" | "auto";
|
|
19
|
+
bump: "patch" | "minor" | "major" | "auto" | "none";
|
|
20
20
|
isPublished: boolean;
|
|
21
21
|
dependencies?: string[] | undefined;
|
|
22
22
|
reason?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/utils.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/rest/handlers/generate-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"generate-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Generate release plan handler - Analyze changes and create release plan\n *\n * Writes: .kb/release/plans/{scope}/current/plan.json\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, type PluginContextV3, useConfig, rethrowForRest } from '@kb-labs/sdk';\nimport type {\n GeneratePlanRequest,\n GeneratePlanResponse,\n ReleasePlan,\n PackageVersion,\n} from '@kb-labs/release-manager-contracts';\nimport { RELEASE_CACHE_PREFIX } from '@kb-labs/release-manager-contracts';\nimport { planRelease, type ReleaseConfig, type VersionBump } from '@kb-labs/release-manager-core';\nimport { scopeToDir } from '../../shared/utils';\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, GeneratePlanRequest>): Promise<GeneratePlanResponse> {\n try {\n const scope = input.body?.scope || 'root';\n const bump = input.body?.bump || 'auto';\n const useLLM = input.body?.useLLM ?? true;\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n ctx.platform?.logger?.info?.('Generating release plan', { scope, bump, useLLM });\n\n // Read versioningStrategy from kb.config.json release section\n const releaseConfig = await useConfig<ReleaseConfig>();\n\n // Create config for core planner\n const config: ReleaseConfig = {\n bump: bump as VersionBump,\n strategy: 'semver',\n registry: 'https://registry.npmjs.org',\n rollback: { enabled: true },\n versioningStrategy: releaseConfig?.versioningStrategy,\n packages: releaseConfig?.packages,\n scopes: releaseConfig?.scopes,\n publish: releaseConfig?.publish,\n };\n\n // Use core planner to discover packages and compute versions.\n // Always discover from repoRoot; scope is a filter applied inside planner.\n const corePlan = await planRelease({\n cwd: repoRoot,\n config,\n scope: scope !== 'root' ? scope : undefined,\n bumpOverride: bump as VersionBump | undefined,\n });\n\n let tokensUsed = 0;\n const confidences: number[] = [];\n\n // If LLM is enabled, enhance each package with AI reasoning\n const enhancedPackages: PackageVersion[] = [];\n\n for (const pkg of corePlan.packages) {\n let reason = 'Based on ' + pkg.bump + ' bump';\n let pkgConfidence = 0.7;\n\n if (useLLM && ctx.platform?.llm) {\n // Get git commits for this package to provide context to LLM\n const gitAnalysis = await analyzeGitCommits(ctx, pkg.path);\n\n if (gitAnalysis.commits.length > 0) {\n const llmResult = await analyzePlanWithLLM(ctx, {\n packageName: pkg.name,\n currentVersion: pkg.currentVersion || '0.0.0',\n nextVersion: pkg.nextVersion || '0.0.1',\n commits: gitAnalysis.commits,\n detectedBump: pkg.bump,\n });\n\n reason = llmResult.reason;\n pkgConfidence = llmResult.confidence;\n tokensUsed += llmResult.tokensUsed;\n } else {\n reason = 'No unreleased commits detected';\n pkgConfidence = 0.9;\n }\n }\n\n enhancedPackages.push({\n ...pkg,\n reason,\n });\n\n // Collect confidence scores for averaging\n if (pkgConfidence > 0) {\n confidences.push(pkgConfidence);\n }\n }\n\n // Calculate average confidence across all packages\n const confidence = confidences.length > 0\n ? confidences.reduce((sum, c) => sum + c, 0) / confidences.length\n : 0;\n\n const plan: ReleasePlan = {\n schemaVersion: '1.0',\n scope,\n packages: enhancedPackages,\n strategy: corePlan.strategy,\n registry: corePlan.registry,\n rollbackEnabled: corePlan.rollbackEnabled,\n channel: corePlan.channel,\n createdAt: new Date().toISOString(),\n };\n\n // Ensure directory exists\n const scopeDir = scopeToDir(scope);\n const planDir = repoRoot + '/.kb/release/plans/' + scopeDir + '/current';\n await ctx.runtime.fs.mkdir(planDir, { recursive: true });\n\n // Write plan\n const planPath = planDir + '/plan.json';\n await ctx.runtime.fs.writeFile(planPath, JSON.stringify(plan, null, 2), { encoding: 'utf-8' });\n\n // Invalidate cache\n const cacheKey = RELEASE_CACHE_PREFIX + 'plan:' + scope;\n await ctx.platform?.cache?.delete(cacheKey);\n\n // Track analytics\n await ctx.platform?.analytics?.track?.('release.plan.generated', {\n scope,\n packagesCount: plan.packages.length,\n bump,\n strategy: plan.strategy,\n useLLM,\n tokensUsed,\n confidence,\n });\n\n ctx.platform?.logger?.info?.('Release plan generated', {\n scope,\n packagesCount: plan.packages.length,\n useLLM,\n tokensUsed,\n confidence,\n });\n\n return {\n plan,\n planPath: '.kb/release/plans/' + scopeDir + '/current/plan.json',\n scope,\n tokensUsed,\n confidence,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n }\n});\n\n/**\n * Analyze git commits to get context for package\n */\nasync function analyzeGitCommits(ctx: PluginContextV3, pkgPath: string): Promise<{\n commits: Array<{ type: string; message: string; sha: string }>;\n}> {\n try {\n ctx.platform?.logger?.info?.('Starting git analysis', { pkgPath });\n\n // Get last git tag\n const lastTagResult = await ctx.api.shell.exec(\n 'git',\n ['describe', '--tags', '--abbrev=0'],\n { cwd: pkgPath }\n );\n const lastTag = lastTagResult.code === 0 ? lastTagResult.stdout.trim() : undefined;\n\n ctx.platform?.logger?.info?.('Got last tag', { lastTag, code: lastTagResult.code });\n\n // Get commits since last tag\n const gitLogArgs = lastTag\n ? ['log', lastTag + '..HEAD', '--pretty=format:%H|%s', '--max-count=20']\n : ['log', '--pretty=format:%H|%s', '--max-count=20'];\n\n ctx.platform?.logger?.info?.('Executing git log', { args: gitLogArgs });\n\n const logResult = await ctx.api.shell.exec('git', gitLogArgs, { cwd: pkgPath });\n\n ctx.platform?.logger?.info?.('Git log result', {\n code: logResult.code,\n stdout: logResult.stdout?.substring(0, 200),\n stderr: logResult.stderr?.substring(0, 200),\n args: gitLogArgs,\n cwd: pkgPath,\n });\n\n const commits: Array<{ type: string; message: string; sha: string }> = [];\n if (logResult.code === 0 && logResult.stdout) {\n const lines = logResult.stdout.trim().split('\\n').filter(Boolean);\n\n for (const line of lines) {\n const parts = line.split('|');\n const sha = parts[0];\n const message = parts[1];\n if (!sha || !message) {continue;}\n\n const parsed = parseConventionalCommit(message);\n commits.push({\n sha: sha.substring(0, 7),\n message,\n type: parsed.type,\n });\n }\n }\n\n return { commits };\n } catch (error) {\n ctx.platform?.logger?.error?.('Git analysis failed', error instanceof Error ? error : undefined);\n return { commits: [] };\n }\n}\n\n/**\n * Parse conventional commit message\n */\nfunction parseConventionalCommit(message: string): { type: string } {\n if (message.includes('BREAKING CHANGE') || message.includes('!:')) {\n return { type: 'BREAKING' };\n }\n\n const match = message.match(/^(\\w+)(?:\\([^)]+\\))?!?:\\s*(.+)/);\n if (!match) {\n return { type: 'unknown' };\n }\n\n const type = match[1];\n if (!type) {return { type: 'unknown' };}\n\n return { type: type.toLowerCase() };\n}\n\n/**\n * Analyze plan using LLM to provide reasoning for version bump\n */\nasync function analyzePlanWithLLM(\n ctx: PluginContextV3,\n input: {\n packageName: string;\n currentVersion: string;\n nextVersion: string;\n commits: Array<{ type: string; message: string; sha: string }>;\n detectedBump: string;\n }\n): Promise<{ reason: string; tokensUsed: number; confidence: number }> {\n const { packageName, currentVersion, nextVersion, commits, detectedBump } = input;\n\n // Build commit list\n const commitList = commits.length > 0\n ? commits.slice(0, 10).map(c => '- [' + c.sha + '] ' + c.type + ': ' + c.message).join('\\n')\n : '(No unreleased commits)';\n\n const prompt = 'You are analyzing a release plan for a package to provide clear reasoning for the version bump.\\n\\nPackage: ' + packageName + '\\nCurrent version: ' + currentVersion + '\\nNext version: ' + nextVersion + '\\nDetected bump: ' + detectedBump + '\\n\\nRecent commits:\\n' + commitList + '\\n\\nYour task:\\nProvide a clear, concise reason (1-2 sentences) explaining WHY this version bump is appropriate based on the commits.\\n\\nFocus on:\\n- What changed (new features, bug fixes, breaking changes)\\n- Why it requires this specific bump type\\n\\nRespond ONLY with valid JSON in this format:\\n{\\n \"reason\": \"Brief explanation (1-2 sentences focusing on what changed)\",\\n \"confidence\": 0.0-1.0\\n}';\n\n try {\n const response = await ctx.platform!.llm!.complete(prompt, {\n maxTokens: 200,\n temperature: 0.3,\n });\n\n const parsed = JSON.parse(response.content);\n\n return {\n reason: parsed.reason || detectedBump + ' bump based on commit analysis',\n tokensUsed: response.usage.completionTokens + response.usage.promptTokens,\n confidence: parsed.confidence || 0.7,\n };\n } catch (error) {\n ctx.platform?.logger?.error?.(\n 'LLM reasoning failed, using simple explanation',\n error instanceof Error ? error : undefined\n );\n\n // Fallback to simple explanation\n const typeCount: Record<string, number> = {};\n commits.forEach(c => {\n typeCount[c.type] = (typeCount[c.type] || 0) + 1;\n });\n\n const summary = Object.entries(typeCount)\n .map(entry => entry[1] + ' ' + entry[0])\n .join(', ');\n\n return {\n reason: commits.length > 0\n ? 'Based on ' + commits.length + ' commit(s): ' + summary\n : 'No unreleased changes',\n tokensUsed: 0,\n confidence: 0.6,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/generate-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"generate-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Generate release plan handler - Analyze changes and create release plan\n *\n * Writes: .kb/release/plans/{scope}/current/plan.json\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, type PluginContextV3, useConfig, rethrowForRest } from '@kb-labs/sdk';\nimport type {\n GeneratePlanRequest,\n GeneratePlanResponse,\n ReleasePlan,\n PackageVersion,\n} from '@kb-labs/release-manager-contracts';\nimport { RELEASE_CACHE_PREFIX } from '@kb-labs/release-manager-contracts';\nimport { planRelease, type ReleaseConfig, type VersionBump } from '@kb-labs/release-manager-core';\nimport { scopeToDir } from '../../shared/utils';\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, GeneratePlanRequest>): Promise<GeneratePlanResponse> {\n try {\n const scope = input.body?.scope || 'root';\n const bump = input.body?.bump || 'auto';\n const useLLM = input.body?.useLLM ?? true;\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n ctx.platform?.logger?.info?.('Generating release plan', { scope, bump, useLLM });\n\n // Read versioningStrategy from kb.config.json release section\n const releaseConfig = await useConfig<ReleaseConfig>();\n\n // Create config for core planner\n const config: ReleaseConfig = {\n bump: bump as VersionBump,\n strategy: 'semver',\n registry: 'https://registry.npmjs.org',\n rollback: { enabled: true },\n versioningStrategy: releaseConfig?.versioningStrategy,\n packages: releaseConfig?.packages,\n scopes: releaseConfig?.scopes,\n publish: releaseConfig?.publish,\n };\n\n // Use core planner to discover packages and compute versions.\n // Always discover from repoRoot; scope is a filter applied inside planner.\n const corePlan = await planRelease({\n cwd: repoRoot,\n config,\n scope: scope !== 'root' ? scope : undefined,\n bumpOverride: bump as VersionBump | undefined,\n });\n\n let tokensUsed = 0;\n const confidences: number[] = [];\n\n // If LLM is enabled, enhance each package with AI reasoning\n const enhancedPackages: PackageVersion[] = [];\n\n for (const pkg of corePlan.packages) {\n let reason = 'Based on ' + pkg.bump + ' bump';\n let pkgConfidence = 0.7;\n\n if (useLLM && ctx.platform?.llm) {\n // Get git commits for this package to provide context to LLM\n const gitAnalysis = await analyzeGitCommits(ctx, pkg.path);\n\n if (gitAnalysis.commits.length > 0) {\n const llmResult = await analyzePlanWithLLM(ctx, {\n packageName: pkg.name,\n currentVersion: pkg.currentVersion || '0.0.0',\n nextVersion: pkg.nextVersion || '0.0.1',\n commits: gitAnalysis.commits,\n detectedBump: pkg.bump,\n });\n\n reason = llmResult.reason;\n pkgConfidence = llmResult.confidence;\n tokensUsed += llmResult.tokensUsed;\n } else {\n reason = 'No unreleased commits detected';\n pkgConfidence = 0.9;\n }\n }\n\n enhancedPackages.push({\n ...pkg,\n reason,\n });\n\n // Collect confidence scores for averaging\n if (pkgConfidence > 0) {\n confidences.push(pkgConfidence);\n }\n }\n\n // Calculate average confidence across all packages\n const confidence = confidences.length > 0\n ? confidences.reduce((sum, c) => sum + c, 0) / confidences.length\n : 0;\n\n const plan: ReleasePlan = {\n schemaVersion: '1.0',\n scope,\n packages: enhancedPackages,\n strategy: corePlan.strategy,\n registry: corePlan.registry,\n rollbackEnabled: corePlan.rollbackEnabled,\n channel: corePlan.channel,\n createdAt: new Date().toISOString(),\n };\n\n // Ensure directory exists\n const scopeDir = scopeToDir(scope);\n const planDir = repoRoot + '/.kb/release/plans/' + scopeDir + '/current';\n await ctx.runtime.fs.mkdir(planDir, { recursive: true });\n\n // Write plan\n const planPath = planDir + '/plan.json';\n await ctx.runtime.fs.writeFile(planPath, JSON.stringify(plan, null, 2), { encoding: 'utf-8' });\n\n // Invalidate cache\n const cacheKey = RELEASE_CACHE_PREFIX + 'plan:' + scope;\n await ctx.platform?.cache?.delete(cacheKey);\n\n // Track analytics\n await ctx.platform?.analytics?.track?.('release.plan.generated', {\n scope,\n packagesCount: plan.packages.length,\n bump,\n strategy: plan.strategy,\n useLLM,\n tokensUsed,\n confidence,\n });\n\n ctx.platform?.logger?.info?.('Release plan generated', {\n scope,\n packagesCount: plan.packages.length,\n useLLM,\n tokensUsed,\n confidence,\n });\n\n return {\n plan,\n planPath: '.kb/release/plans/' + scopeDir + '/current/plan.json',\n scope,\n tokensUsed,\n confidence,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n }\n});\n\n/**\n * Analyze git commits to get context for package\n */\nasync function analyzeGitCommits(ctx: PluginContextV3, pkgPath: string): Promise<{\n commits: Array<{ type: string; message: string; sha: string }>;\n}> {\n try {\n ctx.platform?.logger?.info?.('Starting git analysis', { pkgPath });\n\n // Get last git tag\n const lastTagResult = await ctx.api.shell.exec(\n 'git',\n ['describe', '--tags', '--abbrev=0'],\n { cwd: pkgPath }\n );\n const lastTag = lastTagResult.code === 0 ? lastTagResult.stdout.trim() : undefined;\n\n ctx.platform?.logger?.info?.('Got last tag', { lastTag, code: lastTagResult.code });\n\n // Get commits since last tag\n const gitLogArgs = lastTag\n ? ['log', lastTag + '..HEAD', '--pretty=format:%H|%s', '--max-count=20']\n : ['log', '--pretty=format:%H|%s', '--max-count=20'];\n\n ctx.platform?.logger?.info?.('Executing git log', { args: gitLogArgs });\n\n const logResult = await ctx.api.shell.exec('git', gitLogArgs, { cwd: pkgPath });\n\n ctx.platform?.logger?.info?.('Git log result', {\n code: logResult.code,\n stdout: logResult.stdout?.substring(0, 200),\n stderr: logResult.stderr?.substring(0, 200),\n args: gitLogArgs,\n cwd: pkgPath,\n });\n\n const commits: Array<{ type: string; message: string; sha: string }> = [];\n if (logResult.code === 0 && logResult.stdout) {\n const lines = logResult.stdout.trim().split('\\n').filter(Boolean);\n\n for (const line of lines) {\n const parts = line.split('|');\n const sha = parts[0];\n const message = parts[1];\n if (!sha || !message) {continue;}\n\n const parsed = parseConventionalCommit(message);\n commits.push({\n sha: sha.substring(0, 7),\n message,\n type: parsed.type,\n });\n }\n }\n\n return { commits };\n } catch (error) {\n ctx.platform?.logger?.error?.('Git analysis failed', error instanceof Error ? error : undefined);\n return { commits: [] };\n }\n}\n\n/**\n * Parse conventional commit message\n */\nfunction parseConventionalCommit(message: string): { type: string } {\n if (message.includes('BREAKING CHANGE') || message.includes('!:')) {\n return { type: 'BREAKING' };\n }\n\n const match = message.match(/^(\\w+)(?:\\([^)]+\\))?!?:\\s*(.+)/);\n if (!match) {\n return { type: 'unknown' };\n }\n\n const type = match[1];\n if (!type) {return { type: 'unknown' };}\n\n return { type: type.toLowerCase() };\n}\n\n/**\n * Analyze plan using LLM to provide reasoning for version bump\n */\nasync function analyzePlanWithLLM(\n ctx: PluginContextV3,\n input: {\n packageName: string;\n currentVersion: string;\n nextVersion: string;\n commits: Array<{ type: string; message: string; sha: string }>;\n detectedBump: string;\n }\n): Promise<{ reason: string; tokensUsed: number; confidence: number }> {\n const { packageName, currentVersion, nextVersion, commits, detectedBump } = input;\n\n // Build commit list\n const commitList = commits.length > 0\n ? commits.slice(0, 10).map(c => '- [' + c.sha + '] ' + c.type + ': ' + c.message).join('\\n')\n : '(No unreleased commits)';\n\n const prompt = 'You are analyzing a release plan for a package to provide clear reasoning for the version bump.\\n\\nPackage: ' + packageName + '\\nCurrent version: ' + currentVersion + '\\nNext version: ' + nextVersion + '\\nDetected bump: ' + detectedBump + '\\n\\nRecent commits:\\n' + commitList + '\\n\\nYour task:\\nProvide a clear, concise reason (1-2 sentences) explaining WHY this version bump is appropriate based on the commits.\\n\\nFocus on:\\n- What changed (new features, bug fixes, breaking changes)\\n- Why it requires this specific bump type\\n\\nRespond ONLY with valid JSON in this format:\\n{\\n \"reason\": \"Brief explanation (1-2 sentences focusing on what changed)\",\\n \"confidence\": 0.0-1.0\\n}';\n\n try {\n const response = await ctx.platform!.llm!.complete(prompt, {\n maxTokens: 200,\n temperature: 0.3,\n });\n\n const parsed = JSON.parse(response.content);\n\n return {\n reason: parsed.reason || detectedBump + ' bump based on commit analysis',\n tokensUsed: response.usage.completionTokens + response.usage.promptTokens,\n confidence: parsed.confidence || 0.7,\n };\n } catch (error) {\n ctx.platform?.logger?.error?.(\n 'LLM reasoning failed, using simple explanation',\n error instanceof Error ? error : undefined\n );\n\n // Fallback to simple explanation\n const typeCount: Record<string, number> = {};\n commits.forEach(c => {\n typeCount[c.type] = (typeCount[c.type] || 0) + 1;\n });\n\n const summary = Object.entries(typeCount)\n .map(entry => entry[1] + ' ' + entry[0])\n .join(', ');\n\n return {\n reason: commits.length > 0\n ? 'Based on ' + commits.length + ' commit(s): ' + summary\n : 'No unreleased changes',\n tokensUsed: 0,\n confidence: 0.6,\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/get-checks-handler.ts"],"names":[],"mappings":";;;AAWA,IAAO,6BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAyE;AAC1F,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AAEpC,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAyB;AAC9C,MAAA,MAAM,MAAA,GAA8B,QAAQ,MAAA,GAAS,KAAK,GAAG,MAAA,IAAU,MAAA,EAAQ,UAAU,EAAC;AAE1F,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACzB,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,EAAA;AAAA,UAClB,UAAU,CAAA,CAAE;AAAA,SACd,CAAE;AAAA,OACJ;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"get-checks-handler.js","sourcesContent":["/**\n * Get configured checks handler\n *\n * Returns the list of checks defined in kb.config.json release.checks\n * without running them. Used by the UI to show what will be checked.\n */\n\nimport { defineHandler, type RestInput, useConfig, rethrowForRest } from '@kb-labs/sdk';\nimport type { GetChecksResponse } from '@kb-labs/release-manager-contracts';\nimport type { ReleaseConfig, CustomCheckConfig } from '@kb-labs/release-manager-core';\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<{ scope?: string }, never>): Promise<GetChecksResponse> {\n try {\n const scope = input.query?.scope ?? 'root';\n\n const config = await useConfig<ReleaseConfig>();\n const checks: CustomCheckConfig[] = config?.scopes?.[scope]?.checks ?? config?.checks ?? [];\n\n return {\n scope,\n checks: checks.map((c) => ({\n id: c.id,\n name: c.name ?? c.id,\n optional: c.optional,\n })),\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/resolve-scope.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/rest/handlers/git-timeline-handler.ts"],"names":["findRepoRoot","readFile","join"],"mappings":"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","file":"git-timeline-handler.js","sourcesContent":["import { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\n/**\n * Resolve scope name to absolute filesystem path.\n * Scans all package.json in repoRoot to find the matching package by name.\n */\nexport async function resolveScopePath(repoRoot: string, scope: string): Promise<string> {\n if (scope === 'root') {\n return repoRoot;\n }\n\n if (scope.startsWith('@')) {\n const packageJsonPaths = await globby('**/package.json', {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.*/**'],\n });\n\n for (const pkgJsonPath of packageJsonPaths) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n if (pkg.name === scope) {\n return join(pkgJsonPath, '..');\n }\n } catch { /* skip */ }\n }\n }\n\n // Direct path or fallback\n return join(repoRoot, scope);\n}\n","/**\n * Git Timeline handler - Get git commit history and version preview\n *\n * Analyzes conventional commits since last tag and suggests next version\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type {\n GitTimelineResponse,\n GitCommit,\n GitTimelineInput,\n} from '@kb-labs/release-manager-contracts';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { resolveScopePath } from '../../shared/utils';\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<GitTimelineInput>): Promise<GitTimelineResponse> {\n try {\n const scope = input.query?.scope || 'root';\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n // Get scope path using proper package discovery\n const scopePath = await resolveScopePath(repoRoot, scope);\n\n // Get current version from package.json\n let currentVersion: string | undefined;\n try {\n const pkg = JSON.parse(await readFile(join(scopePath, 'package.json'), 'utf-8'));\n currentVersion = pkg.version;\n } catch {\n // No version found\n }\n\n // Get last git tag\n const lastTagResult = await ctx.api.shell.exec(\n 'git',\n ['describe', '--tags', '--abbrev=0'],\n { cwd: scopePath }\n );\n const lastTag = lastTagResult.code === 0 ? lastTagResult.stdout.trim() : undefined;\n\n // Get commits since last tag (or all commits if no tag)\n const gitLogArgs = lastTag\n ? ['log', `${lastTag}..HEAD`, '--pretty=format:%H|%s|%an|%aI', '--']\n : ['log', '--pretty=format:%H|%s|%an|%aI', '--max-count=50', '--'];\n\n const logResult = await ctx.api.shell.exec('git', gitLogArgs, { cwd: scopePath });\n\n ctx.platform?.logger?.info?.('Git timeline log result', {\n code: logResult.code,\n stdout: logResult.stdout?.substring(0, 300),\n stderr: logResult.stderr?.substring(0, 300),\n args: gitLogArgs,\n cwd: scopePath,\n lastTag,\n });\n\n // Parse commits\n const commits: GitCommit[] = [];\n if (logResult.code === 0 && logResult.stdout) {\n const lines = logResult.stdout.trim().split('\\n').filter(Boolean);\n\n for (const line of lines) {\n const [sha, message, author, date] = line.split('|');\n if (!sha || !message) {continue;}\n\n const parsed = parseConventionalCommit(message);\n\n commits.push({\n sha: sha || '',\n shortSha: sha ? sha.substring(0, 7) : '',\n message: message || '',\n type: parsed.type,\n bump: parsed.bump,\n scope: parsed.scope,\n author: author || 'Unknown',\n date: date || new Date().toISOString(),\n });\n }\n }\n\n // Calculate suggested bump\n const suggestedBump = calculateSuggestedBump(commits);\n\n // Calculate suggested version\n let suggestedVersion: string | undefined;\n if (currentVersion && suggestedBump !== 'none') {\n suggestedVersion = bumpVersion(currentVersion, suggestedBump);\n }\n\n return {\n scope,\n currentVersion,\n suggestedVersion,\n suggestedBump,\n commits,\n unreleased: commits.length,\n lastTag,\n hasUnreleasedChanges: commits.length > 0,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n\n/**\n * Parse conventional commit message\n * Format: type(scope): subject\n * Examples:\n * - feat: add new feature → minor\n * - fix: bug fix → patch\n * - feat!: breaking change → major\n * - BREAKING CHANGE: → major\n */\nfunction parseConventionalCommit(message: string): {\n type: GitCommit['type'];\n bump: GitCommit['bump'];\n scope?: string;\n} {\n // Check for BREAKING CHANGE\n if (message.includes('BREAKING CHANGE') || message.includes('!:')) {\n return { type: 'BREAKING', bump: 'major' };\n }\n\n // Parse conventional commit format\n const match = message.match(/^(\\w+)(?:\\(([^)]+)\\))?!?:\\s*(.+)/);\n\n if (!match) {\n return { type: 'unknown', bump: 'none' };\n }\n\n const [, type, scope] = match;\n\n // Type safety: if no type matched, return unknown\n if (!type) {\n return { type: 'unknown', bump: 'none', scope };\n }\n\n // Map type to bump\n let bump: GitCommit['bump'] = 'none';\n let commitType: GitCommit['type'] = 'unknown';\n\n switch (type.toLowerCase()) {\n case 'feat':\n commitType = 'feat';\n bump = 'minor';\n break;\n case 'fix':\n commitType = 'fix';\n bump = 'patch';\n break;\n case 'perf':\n commitType = 'perf';\n bump = 'patch';\n break;\n case 'chore':\n commitType = 'chore';\n bump = 'none';\n break;\n case 'docs':\n commitType = 'docs';\n bump = 'none';\n break;\n case 'refactor':\n commitType = 'refactor';\n bump = 'none';\n break;\n case 'test':\n commitType = 'test';\n bump = 'none';\n break;\n case 'style':\n commitType = 'style';\n bump = 'none';\n break;\n case 'ci':\n commitType = 'ci';\n bump = 'none';\n break;\n case 'build':\n commitType = 'build';\n bump = 'none';\n break;\n case 'revert':\n commitType = 'revert';\n bump = 'patch';\n break;\n default:\n commitType = 'unknown';\n bump = 'none';\n }\n\n return { type: commitType, bump, scope };\n}\n\n/**\n * Calculate suggested version bump based on commits\n */\nfunction calculateSuggestedBump(commits: GitCommit[]): 'major' | 'minor' | 'patch' | 'none' {\n if (commits.length === 0) {return 'none';}\n\n // Priority: major > minor > patch > none\n let hasMajor = false;\n let hasMinor = false;\n let hasPatch = false;\n\n for (const commit of commits) {\n if (commit.bump === 'major') {hasMajor = true;}\n if (commit.bump === 'minor') {hasMinor = true;}\n if (commit.bump === 'patch') {hasPatch = true;}\n }\n\n if (hasMajor) {return 'major';}\n if (hasMinor) {return 'minor';}\n if (hasPatch) {return 'patch';}\n return 'none';\n}\n\n/**\n * Bump semver version\n */\nfunction bumpVersion(version: string, bump: 'major' | 'minor' | 'patch'): string {\n const parts = version.split('.').map((v) => parseInt(v, 10));\n const [major = 0, minor = 0, patch = 0] = parts;\n\n switch (bump) {\n case 'major':\n return `${major + 1}.0.0`;\n case 'minor':\n return `${major}.${minor + 1}.0`;\n case 'patch':\n return `${major}.${minor}.${patch + 1}`;\n default:\n return version;\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/resolve-scope.ts","../../../src/rest/handlers/git-timeline-handler.ts"],"names":["findRepoRoot","readFile","join"],"mappings":";;;;;;AAQA,eAAsB,gBAAA,CAAiB,UAAkB,KAAA,EAAgC;AACvF,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,iBAAA,EAAmB;AAAA,MACvD,GAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,QAAQ,CAAC,oBAAA,EAAsB,YAAA,EAAc,aAAA,EAAe,cAAc,UAAU;AAAA,KACrF,CAAA;AAED,IAAA,KAAA,MAAW,eAAe,gBAAA,EAAkB;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,QAAA,CAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAC3D,QAAA,IAAI,GAAA,CAAI,SAAS,KAAA,EAAO;AACtB,UAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAa;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;;;ACjBA,IAAO,+BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAkE;AACnF,IAAA,IAAI;AACJ,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AACpC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAA,GAAW,MAAMA,YAAAA,CAAa,GAAG,CAAA;AAGvC,MAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,QAAA,EAAU,KAAK,CAAA;AAGxD,MAAA,IAAI,cAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAMC,QAAAA,CAASC,KAAK,SAAA,EAAW,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AAC/E,QAAA,cAAA,GAAiB,GAAA,CAAI,OAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AAAA,MAER;AAGA,MAAA,MAAM,aAAA,GAAgB,MAAM,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAA;AAAA,QACxC,KAAA;AAAA,QACA,CAAC,UAAA,EAAY,QAAA,EAAU,YAAY,CAAA;AAAA,QACnC,EAAE,KAAK,SAAA;AAAU,OACnB;AACA,MAAA,MAAM,UAAU,aAAA,CAAc,IAAA,KAAS,IAAI,aAAA,CAAc,MAAA,CAAO,MAAK,GAAI,KAAA,CAAA;AAGzE,MAAA,MAAM,UAAA,GAAa,OAAA,GACf,CAAC,KAAA,EAAO,GAAG,OAAO,CAAA,MAAA,CAAA,EAAU,+BAAA,EAAiC,IAAI,CAAA,GACjE,CAAC,KAAA,EAAO,+BAAA,EAAiC,kBAAkB,IAAI,CAAA;AAEnE,MAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,UAAA,EAAY,EAAE,GAAA,EAAK,SAAA,EAAW,CAAA;AAEhF,MAAA,GAAA,CAAI,QAAA,EAAU,MAAA,EAAQ,IAAA,GAAO,yBAAA,EAA2B;AAAA,QACtD,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,QAC1C,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,QAC1C,IAAA,EAAM,UAAA;AAAA,QACN,GAAA,EAAK,SAAA;AAAA,QACL;AAAA,OACD,CAAA;AAGD,MAAA,MAAM,UAAuB,EAAC;AAC9B,MAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,IAAK,SAAA,CAAU,MAAA,EAAQ;AAC5C,QAAA,MAAM,KAAA,GAAQ,UAAU,MAAA,CAAO,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAEhE,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,CAAC,KAAK,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACnD,UAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,EAAS;AAAC,YAAA;AAAA,UAAS;AAEhC,UAAA,MAAM,MAAA,GAAS,wBAAwB,OAAO,CAAA;AAE9C,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAK,GAAA,IAAO,EAAA;AAAA,YACZ,UAAU,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,GAAI,EAAA;AAAA,YACtC,SAAS,OAAA,IAAW,EAAA;AAAA,YACpB,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,QAAQ,MAAA,IAAU,SAAA;AAAA,YAClB,IAAA,EAAM,IAAA,IAAA,iBAAQ,IAAI,IAAA,IAAO,WAAA;AAAY,WACtC,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,MAAM,aAAA,GAAgB,uBAAuB,OAAO,CAAA;AAGpD,MAAA,IAAI,gBAAA;AACJ,MAAA,IAAI,cAAA,IAAkB,kBAAkB,MAAA,EAAQ;AAC9C,QAAA,gBAAA,GAAmB,WAAA,CAAY,gBAAgB,aAAa,CAAA;AAAA,MAC9D;AAEA,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,cAAA;AAAA,QACA,gBAAA;AAAA,QACA,aAAA;AAAA,QACA,OAAA;AAAA,QACA,YAAY,OAAA,CAAQ,MAAA;AAAA,QACpB,OAAA;AAAA,QACA,oBAAA,EAAsB,QAAQ,MAAA,GAAS;AAAA,OACzC;AAAA,IACA,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC;AAWD,SAAS,wBAAwB,OAAA,EAI/B;AAEA,EAAA,IAAI,QAAQ,QAAA,CAAS,iBAAiB,KAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AACjE,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC3C;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,kCAAkC,CAAA;AAE9D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,MAAA,EAAO;AAAA,EACzC;AAEA,EAAA,MAAM,GAAG,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAGxB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,EAChD;AAGA,EAAA,IAAI,IAAA,GAA0B,MAAA;AAC9B,EAAA,IAAI,UAAA,GAAgC,SAAA;AAEpC,EAAA,QAAQ,IAAA,CAAK,aAAY;AAAG,IAC1B,KAAK,MAAA;AACH,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,IAAA,GAAO,OAAA;AACP,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,IAAA,GAAO,OAAA;AACP,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,IAAA,GAAO,OAAA;AACP,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,UAAA,GAAa,OAAA;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,UAAA,GAAa,UAAA;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,UAAA,GAAa,OAAA;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,UAAA,GAAa,OAAA;AACb,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,GAAa,QAAA;AACb,MAAA,IAAA,GAAO,OAAA;AACP,MAAA;AAAA,IACF;AACE,MAAA,UAAA,GAAa,SAAA;AACb,MAAA,IAAA,GAAO,MAAA;AAAA;AAGX,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,KAAA,EAAM;AACzC;AAKA,SAAS,uBAAuB,OAAA,EAA4D;AAC1F,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,MAAA;AAAA,EAAO;AAGzC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAAC,MAAA,QAAA,GAAW,IAAA;AAAA,IAAK;AAC9C,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAAC,MAAA,QAAA,GAAW,IAAA;AAAA,IAAK;AAC9C,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAAC,MAAA,QAAA,GAAW,IAAA;AAAA,IAAK;AAAA,EAChD;AAEA,EAAA,IAAI,QAAA,EAAU;AAAC,IAAA,OAAO,OAAA;AAAA,EAAQ;AAC9B,EAAA,IAAI,QAAA,EAAU;AAAC,IAAA,OAAO,OAAA;AAAA,EAAQ;AAC9B,EAAA,IAAI,QAAA,EAAU;AAAC,IAAA,OAAO,OAAA;AAAA,EAAQ;AAC9B,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2C;AAC/E,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3D,EAAA,MAAM,CAAC,KAAA,GAAQ,CAAA,EAAG,QAAQ,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,GAAI,KAAA;AAE1C,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAG,QAAQ,CAAC,CAAA,IAAA,CAAA;AAAA,IACrB,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAA,GAAQ,CAAC,CAAA,EAAA,CAAA;AAAA,IAC9B,KAAK,OAAA;AACH,MAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAC,CAAA,CAAA;AAAA,IACvC;AACE,MAAA,OAAO,OAAA;AAAA;AAEb","file":"git-timeline-handler.js","sourcesContent":["import { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\n/**\n * Resolve scope name to absolute filesystem path.\n * Scans all package.json in repoRoot to find the matching package by name.\n */\nexport async function resolveScopePath(repoRoot: string, scope: string): Promise<string> {\n if (scope === 'root') {\n return repoRoot;\n }\n\n if (scope.startsWith('@')) {\n const packageJsonPaths = await globby('**/package.json', {\n cwd: repoRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.*/**'],\n });\n\n for (const pkgJsonPath of packageJsonPaths) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, 'utf-8'));\n if (pkg.name === scope) {\n return join(pkgJsonPath, '..');\n }\n } catch { /* skip */ }\n }\n }\n\n // Direct path or fallback\n return join(repoRoot, scope);\n}\n","/**\n * Git Timeline handler - Get git commit history and version preview\n *\n * Analyzes conventional commits since last tag and suggests next version\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type {\n GitTimelineResponse,\n GitCommit,\n GitTimelineInput,\n} from '@kb-labs/release-manager-contracts';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { resolveScopePath } from '../../shared/utils';\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<GitTimelineInput>): Promise<GitTimelineResponse> {\n try {\n const scope = input.query?.scope || 'root';\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n // Get scope path using proper package discovery\n const scopePath = await resolveScopePath(repoRoot, scope);\n\n // Get current version from package.json\n let currentVersion: string | undefined;\n try {\n const pkg = JSON.parse(await readFile(join(scopePath, 'package.json'), 'utf-8'));\n currentVersion = pkg.version;\n } catch {\n // No version found\n }\n\n // Get last git tag\n const lastTagResult = await ctx.api.shell.exec(\n 'git',\n ['describe', '--tags', '--abbrev=0'],\n { cwd: scopePath }\n );\n const lastTag = lastTagResult.code === 0 ? lastTagResult.stdout.trim() : undefined;\n\n // Get commits since last tag (or all commits if no tag)\n const gitLogArgs = lastTag\n ? ['log', `${lastTag}..HEAD`, '--pretty=format:%H|%s|%an|%aI', '--']\n : ['log', '--pretty=format:%H|%s|%an|%aI', '--max-count=50', '--'];\n\n const logResult = await ctx.api.shell.exec('git', gitLogArgs, { cwd: scopePath });\n\n ctx.platform?.logger?.info?.('Git timeline log result', {\n code: logResult.code,\n stdout: logResult.stdout?.substring(0, 300),\n stderr: logResult.stderr?.substring(0, 300),\n args: gitLogArgs,\n cwd: scopePath,\n lastTag,\n });\n\n // Parse commits\n const commits: GitCommit[] = [];\n if (logResult.code === 0 && logResult.stdout) {\n const lines = logResult.stdout.trim().split('\\n').filter(Boolean);\n\n for (const line of lines) {\n const [sha, message, author, date] = line.split('|');\n if (!sha || !message) {continue;}\n\n const parsed = parseConventionalCommit(message);\n\n commits.push({\n sha: sha || '',\n shortSha: sha ? sha.substring(0, 7) : '',\n message: message || '',\n type: parsed.type,\n bump: parsed.bump,\n scope: parsed.scope,\n author: author || 'Unknown',\n date: date || new Date().toISOString(),\n });\n }\n }\n\n // Calculate suggested bump\n const suggestedBump = calculateSuggestedBump(commits);\n\n // Calculate suggested version\n let suggestedVersion: string | undefined;\n if (currentVersion && suggestedBump !== 'none') {\n suggestedVersion = bumpVersion(currentVersion, suggestedBump);\n }\n\n return {\n scope,\n currentVersion,\n suggestedVersion,\n suggestedBump,\n commits,\n unreleased: commits.length,\n lastTag,\n hasUnreleasedChanges: commits.length > 0,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n\n/**\n * Parse conventional commit message\n * Format: type(scope): subject\n * Examples:\n * - feat: add new feature → minor\n * - fix: bug fix → patch\n * - feat!: breaking change → major\n * - BREAKING CHANGE: → major\n */\nfunction parseConventionalCommit(message: string): {\n type: GitCommit['type'];\n bump: GitCommit['bump'];\n scope?: string;\n} {\n // Check for BREAKING CHANGE\n if (message.includes('BREAKING CHANGE') || message.includes('!:')) {\n return { type: 'BREAKING', bump: 'major' };\n }\n\n // Parse conventional commit format\n const match = message.match(/^(\\w+)(?:\\(([^)]+)\\))?!?:\\s*(.+)/);\n\n if (!match) {\n return { type: 'unknown', bump: 'none' };\n }\n\n const [, type, scope] = match;\n\n // Type safety: if no type matched, return unknown\n if (!type) {\n return { type: 'unknown', bump: 'none', scope };\n }\n\n // Map type to bump\n let bump: GitCommit['bump'] = 'none';\n let commitType: GitCommit['type'] = 'unknown';\n\n switch (type.toLowerCase()) {\n case 'feat':\n commitType = 'feat';\n bump = 'minor';\n break;\n case 'fix':\n commitType = 'fix';\n bump = 'patch';\n break;\n case 'perf':\n commitType = 'perf';\n bump = 'patch';\n break;\n case 'chore':\n commitType = 'chore';\n bump = 'none';\n break;\n case 'docs':\n commitType = 'docs';\n bump = 'none';\n break;\n case 'refactor':\n commitType = 'refactor';\n bump = 'none';\n break;\n case 'test':\n commitType = 'test';\n bump = 'none';\n break;\n case 'style':\n commitType = 'style';\n bump = 'none';\n break;\n case 'ci':\n commitType = 'ci';\n bump = 'none';\n break;\n case 'build':\n commitType = 'build';\n bump = 'none';\n break;\n case 'revert':\n commitType = 'revert';\n bump = 'patch';\n break;\n default:\n commitType = 'unknown';\n bump = 'none';\n }\n\n return { type: commitType, bump, scope };\n}\n\n/**\n * Calculate suggested version bump based on commits\n */\nfunction calculateSuggestedBump(commits: GitCommit[]): 'major' | 'minor' | 'patch' | 'none' {\n if (commits.length === 0) {return 'none';}\n\n // Priority: major > minor > patch > none\n let hasMajor = false;\n let hasMinor = false;\n let hasPatch = false;\n\n for (const commit of commits) {\n if (commit.bump === 'major') {hasMajor = true;}\n if (commit.bump === 'minor') {hasMinor = true;}\n if (commit.bump === 'patch') {hasPatch = true;}\n }\n\n if (hasMajor) {return 'major';}\n if (hasMinor) {return 'minor';}\n if (hasPatch) {return 'patch';}\n return 'none';\n}\n\n/**\n * Bump semver version\n */\nfunction bumpVersion(version: string, bump: 'major' | 'minor' | 'patch'): string {\n const parts = version.split('.').map((v) => parseInt(v, 10));\n const [major = 0, minor = 0, patch = 0] = parts;\n\n switch (bump) {\n case 'major':\n return `${major + 1}.0.0`;\n case 'minor':\n return `${major}.${minor + 1}.0`;\n case 'patch':\n return `${major}.${minor}.${patch + 1}`;\n default:\n return version;\n }\n}\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/history-changelog-handler.ts"],"names":["findRepoRoot"],"mappings":";;;;;AAMO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,EAAE,EAChB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,QAAQ,IAAA,EAAM,GAAG,CAAA,CACjB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB;;;ACWA,IAAO,oCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAA+F;AAChH,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,KAAA,CAAM,MAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,IAAA,MAAM,QAAA,GAAW,MAAMA,YAAAA,CAAa,GAAG,CAAA;AAEvC,IAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,EAAU,qBAAA,EAAuB,QAAA,EAAU,IAAI,aAAa,CAAA;AAEpF,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACpD,MAAA,MAAM,MAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAElD,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,SAAA,IAAa,EAAA;AAAA,QACtC;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAC","file":"history-changelog-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * History changelog handler - Get specific changelog from history\n *\n * Reads: .kb/release/history/{scope}/{id}/report.json\n *\n * The changelog is never persisted as a standalone changelog.md — it's\n * embedded in the release report at result.changelog. It's legitimately\n * absent for some releases (e.g. canary channel skips changelog generation\n * — see pipeline.ts), in which case we return an empty string rather than\n * throwing; the caller distinguishes \"no changelog\" from \"release not found\".\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type { HistoryChangelogResponse, ReleaseReport } from '@kb-labs/release-manager-contracts';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { scopeToDir } from '../../shared/utils';\n\nexport interface HistoryChangelogParams {\n scope: string; // Scope (e.g., \"root\" or \"@kb-labs/shared\")\n id: string; // Release ID (folder name like 2026-01-04T12-30-00Z)\n}\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, unknown, HistoryChangelogParams>): Promise<HistoryChangelogResponse> {\n const { scope, id } = input.params!;\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const scopeDir = scopeToDir(scope);\n const reportPath = join(repoRoot, '.kb/release/history', scopeDir, id, 'report.json');\n\n try {\n const reportRaw = await readFile(reportPath, 'utf-8');\n const report: ReleaseReport = JSON.parse(reportRaw);\n\n return {\n id,\n markdown: report.result?.changelog ?? '',\n scope,\n };\n } catch (error) {\n rethrowForRest(error);\n }\n }\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/history-handler.ts"],"names":["findRepoRoot"],"mappings":"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","file":"history-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * History handler - List all release history\n *\n * Reads: .kb/release/history/{scope}/{releaseId}/report.json\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type { HistoryResponse, ReleaseHistoryItem } from '@kb-labs/release-manager-contracts';\nimport { readFile, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { dirToScope, scopeToDir } from '../../shared/utils';\n\nexport interface HistoryInput {\n scope?: string; // Optional scope filter\n}\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<HistoryInput>): Promise<HistoryResponse> {\n try {\n const filterScope = input.query?.scope; // Optional scope filter\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const historyDir = join(repoRoot, '.kb/release/history');\n\n try {\n const releases: ReleaseHistoryItem[] = [];\n\n // Read all scope directories\n const scopeEntries = await readdir(historyDir, { withFileTypes: true });\n const scopeFolders = scopeEntries.filter((e) => e.isDirectory());\n\n for (const scopeFolder of scopeFolders) {\n const scopeDirName = scopeFolder.name; // e.g., 'kb-labs-shared' or 'root'\n const scope = dirToScope(scopeDirName); // Convert to '@kb-labs/shared' or 'root'\n\n // If filter provided, skip non-matching scopes\n if (filterScope) {\n const filterDirName = scopeToDir(filterScope);\n if (scopeDirName !== filterDirName) {\n continue;\n }\n }\n\n const scopeDir = join(historyDir, scopeDirName);\n\n // Read all release folders within this scope\n const releaseEntries = await readdir(scopeDir, { withFileTypes: true });\n const releaseFolders = releaseEntries.filter((e) => e.isDirectory());\n\n for (const releaseFolder of releaseFolders) {\n const releaseId = releaseFolder.name;\n const reportPath = join(scopeDir, releaseId, 'report.json');\n\n try {\n const reportRaw = await readFile(reportPath, 'utf-8');\n const report = JSON.parse(reportRaw);\n\n releases.push({\n id: releaseId,\n timestamp: report.ts,\n scope: report.scope || scope,\n version: report.result?.version,\n packages: report.result?.published || [],\n success: report.result?.ok || false,\n stage: report.stage,\n error: report.result?.errors?.[0],\n channel: report.plan?.channel,\n flow: report.plan?.flow,\n });\n } catch {\n // Skip invalid/incomplete releases\n continue;\n }\n }\n }\n\n // Sort by timestamp descending (newest first)\n releases.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n\n return { releases };\n } catch {\n // No history directory yet\n return { releases: [] };\n }\n } catch (err) {\n rethrowForRest(err);\n }\n }\n});\n"]}
|
|
@@ -14,7 +14,7 @@ declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<u
|
|
|
14
14
|
path: string;
|
|
15
15
|
currentVersion: string;
|
|
16
16
|
nextVersion: string;
|
|
17
|
-
bump: "patch" | "minor" | "major" | "auto";
|
|
17
|
+
bump: "patch" | "minor" | "major" | "auto" | "none";
|
|
18
18
|
isPublished: boolean;
|
|
19
19
|
dependencies?: string[] | undefined;
|
|
20
20
|
reason?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/history-plan-handler.ts"],"names":["findRepoRoot"],"mappings":";;;;;AAMO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,EAAE,EAChB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,QAAQ,IAAA,EAAM,GAAG,CAAA,CACjB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB;;;ACWA,IAAO,+BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAAqF;AACtG,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,KAAA,CAAM,MAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,IAAA,MAAM,QAAA,GAAW,MAAMA,YAAAA,CAAa,GAAG,CAAA;AAEvC,IAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,EAAU,qBAAA,EAAuB,QAAA,EAAU,IAAI,aAAa,CAAA;AAEpF,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACpD,MAAA,MAAM,MAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAElD,MAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,EAAE,CAAA,CAAE,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,IAAA,GAAoB;AAAA,QACxB,GAAG,MAAA,CAAO,IAAA;AAAA,QACV,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,aAAA,IAAiB,KAAA;AAAA,QAC5C,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,KAAA;AAAA,QAC5B,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,MAAA,CAAO;AAAA,OAC7C;AAEA,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAC","file":"history-plan-handler.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * History plan handler - Get specific release plan from history\n *\n * Reads: .kb/release/history/{scope}/{id}/report.json\n *\n * The plan is never persisted as a standalone plan.json — it's embedded in\n * the release report (see pipeline.ts's buildReport()). Older/persisted\n * reports predate a few ReleasePlanSchema-required fields (schemaVersion,\n * scope, createdAt), so we backfill them from data already on hand rather\n * than silently returning a plan that doesn't satisfy its own contract.\n */\n\nimport { defineHandler, findRepoRoot, type RestInput, rethrowForRest } from '@kb-labs/sdk';\nimport type { HistoryPlanResponse, ReleasePlan, ReleaseReport } from '@kb-labs/release-manager-contracts';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { scopeToDir } from '../../shared/utils';\n\nexport interface HistoryPlanParams {\n scope: string; // Scope (e.g., \"root\" or \"@kb-labs/shared\")\n id: string; // Release ID (folder name like 2026-01-04T12-30-00Z)\n}\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, unknown, HistoryPlanParams>): Promise<HistoryPlanResponse> {\n const { scope, id } = input.params!;\n const cwd = ctx.cwd ?? process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const scopeDir = scopeToDir(scope);\n const reportPath = join(repoRoot, '.kb/release/history', scopeDir, id, 'report.json');\n\n try {\n const reportRaw = await readFile(reportPath, 'utf-8');\n const report: ReleaseReport = JSON.parse(reportRaw);\n\n if (!report.plan) {\n throw new Error(`No plan recorded for release ${id}`);\n }\n\n const plan: ReleasePlan = {\n ...report.plan,\n schemaVersion: report.plan.schemaVersion ?? '1.0',\n scope: report.plan.scope ?? scope,\n createdAt: report.plan.createdAt ?? report.ts,\n };\n\n return {\n id,\n plan,\n };\n } catch (error) {\n rethrowForRest(error);\n }\n }\n});\n"]}
|
|
@@ -47,7 +47,7 @@ declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<u
|
|
|
47
47
|
path: string;
|
|
48
48
|
currentVersion: string;
|
|
49
49
|
nextVersion: string;
|
|
50
|
-
bump: "patch" | "minor" | "major" | "auto";
|
|
50
|
+
bump: "patch" | "minor" | "major" | "auto" | "none";
|
|
51
51
|
isPublished: boolean;
|
|
52
52
|
dependencies?: string[] | undefined;
|
|
53
53
|
reason?: string | undefined;
|