@kb-labs/release-manager-cli 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -0
- package/dist/cli/commands/changelog.d.ts +17 -0
- package/dist/cli/commands/changelog.js +156 -0
- package/dist/cli/commands/changelog.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +12 -0
- package/dist/cli/commands/plan.js +117 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +15 -0
- package/dist/cli/commands/publish.js +486 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/report.d.ts +9 -0
- package/dist/cli/commands/report.js +77 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +9 -0
- package/dist/cli/commands/rollback.js +42 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/run.d.ts +16 -0
- package/dist/cli/commands/run.js +539 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +14 -0
- package/dist/cli/commands/verify.js +106 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/contracts/release.schema.d.ts +503 -0
- package/dist/contracts/release.schema.js +45 -0
- package/dist/contracts/release.schema.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.js +689 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +292 -0
- package/dist/manifest.js +604 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/build-handler.d.ts +20 -0
- package/dist/rest/handlers/build-handler.js +68 -0
- package/dist/rest/handlers/build-handler.js.map +1 -0
- package/dist/rest/handlers/changelog-generate-handler.d.ts +20 -0
- package/dist/rest/handlers/changelog-generate-handler.js +169 -0
- package/dist/rest/handlers/changelog-generate-handler.js.map +1 -0
- package/dist/rest/handlers/changelog-handler.d.ts +16 -0
- package/dist/rest/handlers/changelog-handler.js +50 -0
- package/dist/rest/handlers/changelog-handler.js.map +1 -0
- package/dist/rest/handlers/changelog-save-handler.d.ts +13 -0
- package/dist/rest/handlers/changelog-save-handler.js +42 -0
- package/dist/rest/handlers/changelog-save-handler.js.map +1 -0
- package/dist/rest/handlers/checklist-handler.d.ts +39 -0
- package/dist/rest/handlers/checklist-handler.js +155 -0
- package/dist/rest/handlers/checklist-handler.js.map +1 -0
- package/dist/rest/handlers/generate-handler.d.ts +35 -0
- package/dist/rest/handlers/generate-handler.js +206 -0
- package/dist/rest/handlers/generate-handler.js.map +1 -0
- package/dist/rest/handlers/get-checks-handler.d.ts +15 -0
- package/dist/rest/handlers/get-checks-handler.js +22 -0
- package/dist/rest/handlers/get-checks-handler.js.map +1 -0
- package/dist/rest/handlers/git-timeline-handler.d.ts +26 -0
- package/dist/rest/handlers/git-timeline-handler.js +209 -0
- package/dist/rest/handlers/git-timeline-handler.js.map +1 -0
- package/dist/rest/handlers/history-changelog-handler.d.ts +14 -0
- package/dist/rest/handlers/history-changelog-handler.js +34 -0
- package/dist/rest/handlers/history-changelog-handler.js.map +1 -0
- package/dist/rest/handlers/history-handler.d.ts +20 -0
- package/dist/rest/handlers/history-handler.js +75 -0
- package/dist/rest/handlers/history-handler.js.map +1 -0
- package/dist/rest/handlers/history-plan-handler.d.ts +30 -0
- package/dist/rest/handlers/history-plan-handler.js +34 -0
- package/dist/rest/handlers/history-plan-handler.js.map +1 -0
- package/dist/rest/handlers/history-report-handler.d.ts +64 -0
- package/dist/rest/handlers/history-report-handler.js +34 -0
- package/dist/rest/handlers/history-report-handler.js.map +1 -0
- package/dist/rest/handlers/plan-handler.d.ts +29 -0
- package/dist/rest/handlers/plan-handler.js +75 -0
- package/dist/rest/handlers/plan-handler.js.map +1 -0
- package/dist/rest/handlers/preview-handler.d.ts +26 -0
- package/dist/rest/handlers/preview-handler.js +127 -0
- package/dist/rest/handlers/preview-handler.js.map +1 -0
- package/dist/rest/handlers/report-handler.d.ts +65 -0
- package/dist/rest/handlers/report-handler.js +48 -0
- package/dist/rest/handlers/report-handler.js.map +1 -0
- package/dist/rest/handlers/reset-handler.d.ts +12 -0
- package/dist/rest/handlers/reset-handler.js +38 -0
- package/dist/rest/handlers/reset-handler.js.map +1 -0
- package/dist/rest/handlers/run-checks-handler.d.ts +20 -0
- package/dist/rest/handlers/run-checks-handler.js +58 -0
- package/dist/rest/handlers/run-checks-handler.js.map +1 -0
- package/dist/rest/handlers/run-handler.d.ts +68 -0
- package/dist/rest/handlers/run-handler.js +274 -0
- package/dist/rest/handlers/run-handler.js.map +1 -0
- package/dist/rest/handlers/scopes-handler.d.ts +20 -0
- package/dist/rest/handlers/scopes-handler.js +63 -0
- package/dist/rest/handlers/scopes-handler.js.map +1 -0
- package/dist/rest/handlers/status-handler.d.ts +24 -0
- package/dist/rest/handlers/status-handler.js +120 -0
- package/dist/rest/handlers/status-handler.js.map +1 -0
- package/dist/setup/handler.d.ts +19 -0
- package/dist/setup/handler.js +103 -0
- package/dist/setup/handler.js.map +1 -0
- package/dist/widgets/220.js +446 -0
- package/dist/widgets/220.js.map +1 -0
- package/dist/widgets/331.js +2 -0
- package/dist/widgets/331.js.map +1 -0
- package/dist/widgets/403.js +2 -0
- package/dist/widgets/403.js.map +1 -0
- package/dist/widgets/406.js +35 -0
- package/dist/widgets/406.js.map +1 -0
- package/dist/widgets/455.js +2 -0
- package/dist/widgets/455.js.map +1 -0
- package/dist/widgets/482.js +2 -0
- package/dist/widgets/482.js.map +1 -0
- package/dist/widgets/485.js +2 -0
- package/dist/widgets/485.js.map +1 -0
- package/dist/widgets/527.js +2 -0
- package/dist/widgets/527.js.map +1 -0
- package/dist/widgets/628.js +2 -0
- package/dist/widgets/628.js.map +1 -0
- package/dist/widgets/694.js +2 -0
- package/dist/widgets/694.js.map +1 -0
- package/dist/widgets/712.js +2 -0
- package/dist/widgets/712.js.map +1 -0
- package/dist/widgets/866.js +2 -0
- package/dist/widgets/866.js.map +1 -0
- package/dist/widgets/915.js +39 -0
- package/dist/widgets/915.js.map +1 -0
- package/dist/widgets/957.js +10 -0
- package/dist/widgets/957.js.map +1 -0
- package/dist/widgets/983.js +2 -0
- package/dist/widgets/983.js.map +1 -0
- package/dist/widgets/@mf-types.d.ts +3 -0
- package/dist/widgets/@mf-types.zip +0 -0
- package/dist/widgets/__federation_expose_ReleasePage.js +2 -0
- package/dist/widgets/__federation_expose_ReleasePage.js.map +1 -0
- package/dist/widgets/mf-manifest.json +260 -0
- package/dist/widgets/mf-stats.json +302 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/widgets/remoteEntry.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":"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","file":"manifest.js","sourcesContent":["/**\n * KB Labs Release Manager - Manifest V3\n *\n * Migration from V2 to V3 following best practices from V3-MIGRATION-GUIDE.md\n *\n * Key changes:\n * - Schema: kb.plugin/3\n * - Commands use handler#default suffix\n * - Commands have handlerPath field\n * - Permissions moved to manifest level\n * - All imports from @kb-labs/sdk\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n npmPublishPreset,\n ciEnvironmentPreset,\n} from '@kb-labs/sdk';\nimport {\n RELEASE_BASE_PATH,\n RELEASE_ROUTES,\n RELEASE_CACHE_PREFIX,\n} from '@kb-labs/release-manager-contracts';\n\n/**\n * Build permissions using presets:\n * - gitWorkflow: HOME, USER, GIT_*, SSH_* for git/changelog operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - npmPublish: NPM_TOKEN, npm registry access for publishing\n * - ciEnvironment: CI, GITHUB_TOKEN for CI/CD integrations\n * - Custom: KB_RELEASE_*, additional fs paths\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .with(npmPublishPreset)\n .with(ciEnvironmentPreset)\n .withEnv(['KB_RELEASE_*', 'NODE_ENV'])\n .withFs({\n mode: 'readWrite',\n allow: [\n '.kb/release/**',\n 'package.json',\n '**/package.json',\n 'pnpm-workspace.yaml',\n '**/*.yml',\n '**/*.yaml',\n 'CHANGELOG.md',\n '**/CHANGELOG.md',\n ],\n // Note: deny patterns (*.key, *.secret, node_modules) are enforced by platform\n })\n .withShell({\n allow: ['git', 'npm'], // git: timeline/tagging/commits, npm: publish packages\n })\n .withPlatform({\n cache: [RELEASE_CACHE_PREFIX], // Cache namespace prefix for plan/changelog caching\n llm: true, // LLM for changelog generation\n analytics: true, // Track release events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for complex releases\n memoryMb: 2048,\n cpuMs: 300000, // 5 min CPU time\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/release',\n version: '0.1.0',\n\n display: {\n name: 'Release Manager',\n description: 'Plan, execute, and audit releases across your workspace.',\n tags: ['release', 'publish', 'versioning'],\n },\n\n // Platform requirements\n platform: {\n requires: ['storage', 'cache'], // cache required for plan/changelog caching\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // Setup handler - V3 pattern\n setup: {\n handler: './setup/handler.js#default',\n handlerPath: './setup/handler.js',\n describe: 'Prepare the .kb/release workspace (plans, reports, backups).',\n },\n\n // CLI commands - V3 format\n cli: {\n commands: [\n // release:plan - Analyze changes and prepare release plan\n {\n id: 'release:plan',\n group: 'release',\n describe: 'Analyze changes and prepare release plan',\n longDescription: 'Detect modified packages and compute version bumps based on changes',\n\n handler: './cli/commands/plan.js#default',\n handlerPath: './cli/commands/plan.js',\n\n flags: defineCommandFlags({\n scope: { type: 'string', description: 'Package scope (glob pattern)' },\n bump: {\n type: 'string',\n choices: ['patch', 'minor', 'major', 'auto'] as const,\n default: 'auto',\n description: 'Version bump strategy',\n },\n json: { type: 'boolean', description: 'Print plan as JSON' },\n }),\n\n examples: [\n 'kb release plan',\n 'kb release plan --scope packages/*',\n 'kb release plan --bump minor',\n 'kb release plan --json',\n ],\n },\n\n // release:run - Execute release process\n {\n id: 'release:run',\n group: 'release',\n describe: 'Execute release process (plan, check, publish)',\n longDescription: 'Run full release: plan versions, run checks, publish packages',\n\n handler: './cli/commands/run.js#default',\n handlerPath: './cli/commands/run.js',\n\n flags: defineCommandFlags({\n scope: { type: 'string', description: 'Package scope (glob pattern)' },\n strict: { type: 'boolean', description: 'Fail on any check failure' },\n 'dry-run': { type: 'boolean', description: 'Simulate release without publishing' },\n 'skip-checks': { type: 'boolean', description: 'Skip pre-release checks' },\n json: { type: 'boolean', description: 'Print result as JSON' },\n }),\n\n examples: [\n 'kb release run',\n 'kb release run --dry-run',\n 'kb release run --strict --json',\n 'kb release run --scope packages/core',\n ],\n },\n\n // release:publish - Publish packages to npm\n {\n id: 'release:publish',\n group: 'release',\n describe: 'Publish packages to npm registry with interactive OTP',\n longDescription: 'Smart npm publish with interactive 2FA support and better UX',\n\n handler: './cli/commands/publish.js#default',\n handlerPath: './cli/commands/publish.js',\n\n flags: defineCommandFlags({\n scope: { type: 'string', description: 'Package scope (glob pattern)' },\n otp: { type: 'string', description: 'One-time password (optional, will prompt if needed)' },\n 'dry-run': { type: 'boolean', description: 'Simulate publish without actually publishing' },\n tag: { type: 'string', description: 'NPM dist-tag (default: latest)' },\n access: {\n type: 'string',\n choices: ['public', 'restricted'] as const,\n description: 'Package access level',\n },\n token: { type: 'string', description: 'NPM auth token (overrides NPM_TOKEN env)' },\n json: { type: 'boolean', description: 'Output in JSON format' },\n }),\n\n examples: [\n 'kb release publish',\n 'kb release publish --scope @kb-labs/core',\n 'kb release publish --otp 123456',\n 'kb release publish --dry-run',\n 'kb release publish --tag next --access public',\n ],\n },\n\n // release:rollback - Rollback last release\n {\n id: 'release:rollback',\n group: 'release',\n describe: 'Rollback last release',\n longDescription: 'Restore workspace state from backup snapshot',\n\n handler: './cli/commands/rollback.js#default',\n handlerPath: './cli/commands/rollback.js',\n\n flags: defineCommandFlags({\n json: { type: 'boolean', description: 'Output in JSON format' },\n }),\n\n examples: ['kb release rollback', 'kb release rollback --json'],\n },\n\n // release:report - Show last release report\n {\n id: 'release:report',\n group: 'release',\n describe: 'Show last release report',\n longDescription: 'Display the most recent release execution report',\n\n handler: './cli/commands/report.js#default',\n handlerPath: './cli/commands/report.js',\n\n flags: defineCommandFlags({\n json: { type: 'boolean', description: 'Output in JSON format' },\n }),\n\n examples: ['kb release report', 'kb release report --json'],\n },\n\n // release:changelog - Generate changelog\n {\n id: 'release:changelog',\n group: 'release',\n describe: 'Generate changelog from conventional commits',\n longDescription: 'Parse git history and generate changelog with conventional commits support',\n\n handler: './cli/commands/changelog.js#default',\n handlerPath: './cli/commands/changelog.js',\n\n flags: defineCommandFlags({\n scope: { type: 'string', description: 'Filter to specific package' },\n from: { type: 'string', description: 'Start commit/tag' },\n to: { type: 'string', description: 'End commit/tag (default: HEAD)' },\n 'since-tag': { type: 'string', description: 'Shorthand for --from <tag>' },\n format: {\n type: 'string',\n choices: ['json', 'md', 'both'] as const,\n default: 'both',\n description: 'Output format',\n },\n level: {\n type: 'string',\n choices: ['compact', 'standard', 'detailed'] as const,\n default: 'standard',\n description: 'Detail level',\n },\n template: {\n type: 'string',\n description:\n 'Template name (builtin: corporate, corporate-ai, technical, compact) or custom path',\n },\n 'breaking-only': { type: 'boolean', description: 'Show only breaking changes' },\n include: { type: 'string', description: 'Comma-separated types to include' },\n exclude: { type: 'string', description: 'Types to exclude' },\n 'workspace-only': { type: 'boolean', description: 'Only workspace changelog' },\n 'per-package': { type: 'boolean', description: 'Only per-package changelogs' },\n force: { type: 'boolean', description: 'Skip audit gate' },\n 'allow-major': { type: 'boolean', description: 'Allow major bumps for experimental packages' },\n preid: { type: 'string', description: 'Pre-release identifier (rc, beta, alpha)' },\n }),\n\n examples: [\n 'kb release changelog',\n 'kb release changelog --from v1.0.0',\n 'kb release changelog --format md --level detailed',\n 'kb release changelog --template corporate-ai',\n 'kb release changelog --template ./my-template.ts',\n 'kb release changelog --breaking-only',\n ],\n },\n\n // release:verify - Validate release readiness\n {\n id: 'release:verify',\n group: 'release',\n describe: 'Validate release readiness',\n longDescription: 'Validate release readiness via flag gates (packages, breaking changes, commit types)',\n\n handler: './cli/commands/verify.js#default',\n handlerPath: './cli/commands/verify.js',\n\n flags: defineCommandFlags({\n 'fail-if-empty': { type: 'boolean', description: 'Fail if no version bumps needed' },\n 'fail-on-breaking': { type: 'boolean', description: 'Fail if breaking changes detected' },\n 'allow-types': {\n type: 'string',\n description: 'Comma-separated types required (e.g., feat,fix)',\n },\n json: { type: 'boolean', description: 'Output in JSON format' },\n }),\n\n examples: [\n 'kb release verify',\n 'kb release verify --fail-if-empty',\n 'kb release verify --allow-types feat,fix',\n ],\n },\n ],\n },\n\n // REST API routes - V3 format (scope-based architecture)\n rest: {\n basePath: RELEASE_BASE_PATH,\n routes: [\n // GET /scopes - List available release scopes\n {\n method: 'GET',\n path: RELEASE_ROUTES.SCOPES,\n handler: './rest/handlers/scopes-handler.js#default',\n handlerPath: './rest/handlers/scopes-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#ScopesResponseSchema',\n },\n },\n // GET /status - Get release status for a scope\n {\n method: 'GET',\n path: RELEASE_ROUTES.STATUS,\n handler: './rest/handlers/status-handler.js#default',\n handlerPath: './rest/handlers/status-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#StatusResponseSchema',\n },\n },\n // GET /plan - Get current release plan for a scope\n {\n method: 'GET',\n path: RELEASE_ROUTES.PLAN,\n handler: './rest/handlers/plan-handler.js#default',\n handlerPath: './rest/handlers/plan-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#PlanInputSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#PlanResponseSchema',\n },\n },\n // POST /generate - Generate release plan (LLM)\n {\n method: 'POST',\n path: RELEASE_ROUTES.GENERATE,\n handler: './rest/handlers/generate-handler.js#default',\n handlerPath: './rest/handlers/generate-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#GeneratePlanRequestSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#GeneratePlanResponseSchema',\n },\n timeoutMs: 120000, // 2 minutes for LLM analysis\n },\n // DELETE /plan - Reset release plan\n {\n method: 'DELETE',\n path: RELEASE_ROUTES.RESET,\n handler: './rest/handlers/reset-handler.js#default',\n handlerPath: './rest/handlers/reset-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#ResetPlanRequestSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#ResetPlanResponseSchema',\n },\n },\n // GET /changelog - Get changelog for a scope\n {\n method: 'GET',\n path: RELEASE_ROUTES.CHANGELOG,\n handler: './rest/handlers/changelog-handler.js#default',\n handlerPath: './rest/handlers/changelog-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#ChangelogInputSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#ChangelogResponseSchema',\n },\n },\n // POST /changelog/generate - Generate changelog (LLM)\n {\n method: 'POST',\n path: RELEASE_ROUTES.CHANGELOG_GENERATE,\n handler: './rest/handlers/changelog-generate-handler.js#default',\n handlerPath: './rest/handlers/changelog-generate-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#GenerateChangelogRequestSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#GenerateChangelogResponseSchema',\n },\n timeoutMs: 120000, // 2 minutes for LLM generation\n },\n // POST /changelog/save - Save edited changelog\n {\n method: 'POST',\n path: RELEASE_ROUTES.CHANGELOG_SAVE,\n handler: './rest/handlers/changelog-save-handler.js#default',\n handlerPath: './rest/handlers/changelog-save-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#SaveChangelogRequestSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#SaveChangelogResponseSchema',\n },\n },\n // POST /run - Execute release process\n {\n method: 'POST',\n path: RELEASE_ROUTES.RUN,\n handler: './rest/handlers/run-handler.js#default',\n handlerPath: './rest/handlers/run-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#RunReleaseRequestSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#RunReleaseResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for release execution\n },\n // GET /report - Get latest release report\n {\n method: 'GET',\n path: RELEASE_ROUTES.REPORT,\n handler: './rest/handlers/report-handler.js#default',\n handlerPath: './rest/handlers/report-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#ReportResponseSchema',\n },\n },\n // GET /history - Get release history\n {\n method: 'GET',\n path: RELEASE_ROUTES.HISTORY,\n handler: './rest/handlers/history-handler.js#default',\n handlerPath: './rest/handlers/history-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#HistoryResponseSchema',\n },\n },\n // GET /history/:id/report - Get historical release report\n {\n method: 'GET',\n path: RELEASE_ROUTES.HISTORY_REPORT,\n handler: './rest/handlers/history-report-handler.js#default',\n handlerPath: './rest/handlers/history-report-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#HistoryReportResponseSchema',\n },\n },\n // GET /history/:id/plan - Get historical release plan\n {\n method: 'GET',\n path: RELEASE_ROUTES.HISTORY_PLAN,\n handler: './rest/handlers/history-plan-handler.js#default',\n handlerPath: './rest/handlers/history-plan-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#HistoryPlanResponseSchema',\n },\n },\n // GET /history/:id/changelog - Get historical changelog\n {\n method: 'GET',\n path: RELEASE_ROUTES.HISTORY_CHANGELOG,\n handler: './rest/handlers/history-changelog-handler.js#default',\n handlerPath: './rest/handlers/history-changelog-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#HistoryChangelogResponseSchema',\n },\n },\n // GET /git-timeline - Get git commit timeline and version preview\n {\n method: 'GET',\n path: RELEASE_ROUTES.GIT_TIMELINE,\n handler: './rest/handlers/git-timeline-handler.js#default',\n handlerPath: './rest/handlers/git-timeline-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#GitTimelineResponseSchema',\n },\n },\n // GET /preview - Preview package contents before publish\n {\n method: 'GET',\n path: RELEASE_ROUTES.PREVIEW,\n handler: './rest/handlers/preview-handler.js#default',\n handlerPath: './rest/handlers/preview-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#PreviewResponseSchema',\n },\n },\n // POST /build - Trigger package build\n {\n method: 'POST',\n path: RELEASE_ROUTES.BUILD,\n handler: './rest/handlers/build-handler.js#default',\n handlerPath: './rest/handlers/build-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#BuildRequestSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#BuildResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for build\n },\n // GET /checklist - Get unified release checklist status\n {\n method: 'GET',\n path: RELEASE_ROUTES.CHECKLIST,\n handler: './rest/handlers/checklist-handler.js#default',\n handlerPath: './rest/handlers/checklist-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#ReleaseChecklistSchema',\n },\n },\n // GET /checks - Get list of configured checks (without running them)\n {\n method: 'GET',\n path: RELEASE_ROUTES.CHECKS,\n handler: './rest/handlers/get-checks-handler.js#default',\n handlerPath: './rest/handlers/get-checks-handler.js',\n output: {\n zod: '@kb-labs/release-manager-contracts#GetChecksResponseSchema',\n },\n },\n // POST /checks/run - Run pre-release checks from kb.config.json release.checks\n {\n method: 'POST',\n path: RELEASE_ROUTES.CHECKS_RUN,\n handler: './rest/handlers/run-checks-handler.js#default',\n handlerPath: './rest/handlers/run-checks-handler.js',\n input: {\n zod: '@kb-labs/release-manager-contracts#RunChecksRequestSchema',\n },\n output: {\n zod: '@kb-labs/release-manager-contracts#RunChecksResponseSchema',\n },\n timeoutMs: 600000, // 10 minutes - all checks combined\n },\n ],\n },\n\n // Studio V2 — Module Federation pages\n studio: {\n version: 2 as const,\n remoteName: 'releasePlugin',\n pages: [\n {\n id: 'release.overview',\n title: 'Release',\n icon: 'RocketOutlined',\n route: '/p/release',\n entry: './ReleasePage',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'release',\n label: 'Release',\n icon: 'RocketOutlined',\n target: 'release.overview',\n order: 60,\n },\n ],\n },\n\n // Studio widgets (legacy - commented out, using new UI integration)\n // studio_legacy: {\n // widgets: [\n // {\n // id: 'release.plan',\n // kind: 'infopanel',\n // title: 'Latest Release Plan',\n // description: 'Shows the most recent release plan generated via `kb release plan`.',\n // data: {\n // source: {\n // type: 'rest',\n // routeId: 'plan/latest',\n // method: 'GET',\n // },\n // },\n // layoutHint: {\n // w: 4,\n // h: 5,\n // minW: 3,\n // minH: 3,\n // },\n // },\n // {\n // id: 'release.report',\n // kind: 'cardlist',\n // title: 'Release Report',\n // description: 'Status of the last release execution.',\n // data: {\n // source: {\n // type: 'rest',\n // routeId: 'report/latest',\n // method: 'GET',\n // },\n // },\n // options: {\n // layout: 'list',\n // },\n // layoutHint: {\n // w: 4,\n // h: 4,\n // minW: 3,\n // minH: 3,\n // },\n // },\n // ],\n // menus: [\n // {\n // id: 'release-menu',\n // label: 'Release',\n // icon: 'RocketOutlined',\n // target: '/plugins/release/dashboard',\n // order: 0,\n // },\n // {\n // id: 'release-dashboard',\n // label: 'Dashboard',\n // icon: 'DashboardOutlined',\n // parentId: 'release-menu',\n // target: '/plugins/release/dashboard',\n // order: 1,\n // },\n // ],\n // layouts: [\n // {\n // id: 'release.dashboard',\n // kind: 'grid',\n // title: 'Release Dashboard',\n // description: 'Overview of release planning and execution.',\n // config: {\n // cols: { sm: 2, md: 4, lg: 6 },\n // rowHeight: 5,\n // },\n // },\n // ],\n // },\n\n // Auto-detects kb.config.json section for useConfig()\n // maps to profiles[].products.release in kb.config.json\n configSection: 'release',\n\n capabilities: ['fs:read', 'fs:write'],\n\n // V3: Manifest-first permissions using composable presets\n permissions: pluginPermissions,\n\n // Artifacts\n artifacts: [\n {\n id: 'release.plan.json',\n pathTemplate: '.kb/release/plan.json',\n description: 'Serialized release plan generated by `kb release plan`.',\n },\n {\n id: 'release.report.json',\n pathTemplate: '.kb/release/report.json',\n description: 'Execution report emitted by `kb release run`.',\n },\n {\n id: 'release.changelog.md',\n pathTemplate: '.kb/release/changelog.md',\n description: 'Workspace changelog output produced during release.',\n },\n ],\n};\n\nexport default manifest;\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, {
|
|
5
|
+
scope: string;
|
|
6
|
+
}, unknown>, {
|
|
7
|
+
scope: string;
|
|
8
|
+
packages: {
|
|
9
|
+
name: string;
|
|
10
|
+
success: boolean;
|
|
11
|
+
error?: string | undefined;
|
|
12
|
+
durationMs?: number | undefined;
|
|
13
|
+
}[];
|
|
14
|
+
success: boolean;
|
|
15
|
+
builtCount: number;
|
|
16
|
+
totalCount: number;
|
|
17
|
+
totalDurationMs: number;
|
|
18
|
+
}>;
|
|
19
|
+
|
|
20
|
+
export { _default as default };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { defineHandler, findRepoRoot } from '@kb-labs/sdk';
|
|
2
|
+
import { buildPackages } from '@kb-labs/release-manager-core';
|
|
3
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import 'globby';
|
|
7
|
+
|
|
8
|
+
// src/rest/handlers/build-handler.ts
|
|
9
|
+
function scopeToDir(scope) {
|
|
10
|
+
return scope.replace(/^@/, "").replace(/\//g, "-").replace(/:/g, "-").replace(/\*/g, "");
|
|
11
|
+
}
|
|
12
|
+
var build_handler_default = defineHandler({
|
|
13
|
+
async execute(ctx, input) {
|
|
14
|
+
const scope = input.body?.scope || "root";
|
|
15
|
+
const cwd = ctx.cwd ?? process.cwd();
|
|
16
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
const scopeDir = scopeToDir(scope);
|
|
19
|
+
const planPath = join(repoRoot, ".kb/release/plans", scopeDir, "current", "plan.json");
|
|
20
|
+
let plan;
|
|
21
|
+
try {
|
|
22
|
+
plan = JSON.parse(await readFile(planPath, "utf-8"));
|
|
23
|
+
} catch {
|
|
24
|
+
return { scope, success: false, packages: [], builtCount: 0, totalCount: 0, totalDurationMs: Date.now() - startTime };
|
|
25
|
+
}
|
|
26
|
+
const results = await buildPackages(plan.packages, { logger: ctx.platform?.logger });
|
|
27
|
+
const changelogPath = join(repoRoot, ".kb/release/plans", scopeDir, "current", "changelog.md");
|
|
28
|
+
let changelogContent;
|
|
29
|
+
try {
|
|
30
|
+
changelogContent = await readFile(changelogPath, "utf-8");
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
if (changelogContent) {
|
|
34
|
+
for (const r of results) {
|
|
35
|
+
if (!r.success) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
const pkg = plan.packages.find((p) => p.name === r.name);
|
|
39
|
+
if (!pkg) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const pkgPath = pkg.path.startsWith("/") ? pkg.path : join(repoRoot, pkg.path);
|
|
43
|
+
try {
|
|
44
|
+
await writeFile(join(pkgPath, "CHANGELOG.md"), changelogContent, "utf-8");
|
|
45
|
+
const distDir = join(pkgPath, "dist");
|
|
46
|
+
if (!existsSync(distDir)) {
|
|
47
|
+
await mkdir(distDir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
await writeFile(join(distDir, "CHANGELOG.md"), changelogContent, "utf-8");
|
|
50
|
+
} catch {
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const builtCount = results.filter((r) => r.success).length;
|
|
55
|
+
return {
|
|
56
|
+
scope,
|
|
57
|
+
success: results.every((r) => r.success),
|
|
58
|
+
packages: results.map((r) => ({ name: r.name, success: r.success, error: r.error, durationMs: r.durationMs })),
|
|
59
|
+
builtCount,
|
|
60
|
+
totalCount: plan.packages.length,
|
|
61
|
+
totalDurationMs: Date.now() - startTime
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export { build_handler_default as default };
|
|
67
|
+
//# sourceMappingURL=build-handler.js.map
|
|
68
|
+
//# sourceMappingURL=build-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/build-handler.ts"],"names":["findRepoRoot","join","readFile"],"mappings":"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","file":"build-handler.js","sourcesContent":["import { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\nexport { findRepoRoot } from '@kb-labs/sdk';\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/**\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 * Build handler — thin adapter over core buildPackages().\n */\n\nimport { defineHandler, findRepoRoot, type RestInput } from '@kb-labs/sdk';\nimport type { BuildRequest, BuildResponse } from '@kb-labs/release-manager-contracts';\nimport { buildPackages } 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\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, BuildRequest>): Promise<BuildResponse> {\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: any }> };\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 any, { logger: ctx.platform?.logger });\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 for (const r of results) {\n if (!r.success) {break;}\n const pkg = plan.packages.find(p => p.name === r.name);\n if (!pkg) {continue;}\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)) {await mkdir(distDir, { recursive: true });}\n await writeFile(join(distDir, 'CHANGELOG.md'), changelogContent, 'utf-8');\n } catch { /* skip */ }\n }\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 },\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, {
|
|
5
|
+
scope: string;
|
|
6
|
+
useLLM: boolean;
|
|
7
|
+
from?: string | undefined;
|
|
8
|
+
to?: string | undefined;
|
|
9
|
+
template?: string | undefined;
|
|
10
|
+
locale?: "en" | "ru" | undefined;
|
|
11
|
+
}, unknown>, {
|
|
12
|
+
markdown: string;
|
|
13
|
+
scope: string;
|
|
14
|
+
changelogPath: string;
|
|
15
|
+
tokensUsed?: number | undefined;
|
|
16
|
+
usedLLM?: boolean | undefined;
|
|
17
|
+
commitsCount?: number | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
|
|
20
|
+
export { _default as default };
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { defineHandler, findRepoRoot } from '@kb-labs/sdk';
|
|
2
|
+
import { generateSimpleChangelog, generateChangelog } from '@kb-labs/release-manager-changelog';
|
|
3
|
+
import { RELEASE_CACHE_PREFIX } from '@kb-labs/release-manager-contracts';
|
|
4
|
+
import 'path';
|
|
5
|
+
import 'fs/promises';
|
|
6
|
+
import 'globby';
|
|
7
|
+
|
|
8
|
+
// src/rest/handlers/changelog-generate-handler.ts
|
|
9
|
+
|
|
10
|
+
// src/infra/analytics/events.ts
|
|
11
|
+
var ANALYTICS_PREFIX = {
|
|
12
|
+
CHANGELOG: "release.changelog"};
|
|
13
|
+
var ANALYTICS_SUFFIX = {
|
|
14
|
+
STARTED: "started",
|
|
15
|
+
FINISHED: "finished"
|
|
16
|
+
};
|
|
17
|
+
var ANALYTICS_EVENTS = {
|
|
18
|
+
// Changelog events
|
|
19
|
+
CHANGELOG_STARTED: `${ANALYTICS_PREFIX.CHANGELOG}.${ANALYTICS_SUFFIX.STARTED}`,
|
|
20
|
+
CHANGELOG_FINISHED: `${ANALYTICS_PREFIX.CHANGELOG}.${ANALYTICS_SUFFIX.FINISHED}`};
|
|
21
|
+
var ANALYTICS_ACTOR = {
|
|
22
|
+
type: "agent",
|
|
23
|
+
id: "release-cli"
|
|
24
|
+
};
|
|
25
|
+
function scopeToDir(scope) {
|
|
26
|
+
return scope.replace(/^@/, "").replace(/\//g, "-").replace(/:/g, "-").replace(/\*/g, "");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// src/rest/handlers/changelog-generate-handler.ts
|
|
30
|
+
var changelog_generate_handler_default = defineHandler({
|
|
31
|
+
async execute(ctx, input) {
|
|
32
|
+
const scope = input.body?.scope || "root";
|
|
33
|
+
const cwd = ctx.cwd ?? process.cwd();
|
|
34
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
35
|
+
const startTime = Date.now();
|
|
36
|
+
ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_STARTED, {
|
|
37
|
+
scope,
|
|
38
|
+
actor: ANALYTICS_ACTOR
|
|
39
|
+
});
|
|
40
|
+
const scopeDirName = scopeToDir(scope);
|
|
41
|
+
const planPath = `${repoRoot}/.kb/release/plans/${scopeDirName}/current/plan.json`;
|
|
42
|
+
let plan;
|
|
43
|
+
try {
|
|
44
|
+
const planContent = await ctx.runtime.fs.readFile(planPath, "utf-8");
|
|
45
|
+
plan = JSON.parse(planContent);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
ctx.platform?.logger?.error?.(
|
|
48
|
+
"Failed to read release plan",
|
|
49
|
+
error instanceof Error ? error : void 0,
|
|
50
|
+
{ scope, planPath }
|
|
51
|
+
);
|
|
52
|
+
throw new Error(`Release plan not found for scope "${scope}". Generate plan first.`);
|
|
53
|
+
}
|
|
54
|
+
const packages = plan.packages.map((pkg) => ({
|
|
55
|
+
name: pkg.name,
|
|
56
|
+
path: pkg.path,
|
|
57
|
+
currentVersion: pkg.currentVersion,
|
|
58
|
+
nextVersion: pkg.nextVersion,
|
|
59
|
+
bump: pkg.bump === "auto" ? "patch" : pkg.bump
|
|
60
|
+
}));
|
|
61
|
+
let gitCwd = repoRoot;
|
|
62
|
+
if (packages.length > 0 && packages[0]) {
|
|
63
|
+
try {
|
|
64
|
+
gitCwd = await findRepoRoot(packages[0].path);
|
|
65
|
+
} catch {
|
|
66
|
+
gitCwd = packages[0].path;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
let markdown;
|
|
70
|
+
const tokensUsed = 0;
|
|
71
|
+
let usedLLM = false;
|
|
72
|
+
let commitsCount = 0;
|
|
73
|
+
const useLLM = input.body?.useLLM ?? true;
|
|
74
|
+
if (!useLLM) {
|
|
75
|
+
ctx.platform?.logger?.info?.("Using simple changelog (LLM disabled by user)", { scope });
|
|
76
|
+
markdown = generateSimpleChangelog(packages, "en");
|
|
77
|
+
} else {
|
|
78
|
+
const hasLLM = !!ctx.platform?.llm;
|
|
79
|
+
ctx.platform?.logger?.info?.("Changelog generation mode", {
|
|
80
|
+
scope,
|
|
81
|
+
useLLM,
|
|
82
|
+
hasLLMPlatform: hasLLM
|
|
83
|
+
});
|
|
84
|
+
if (!hasLLM) {
|
|
85
|
+
ctx.platform?.logger?.warn?.("LLM service not available, falling back to simple changelog", { scope });
|
|
86
|
+
markdown = generateSimpleChangelog(packages, "en");
|
|
87
|
+
} else {
|
|
88
|
+
try {
|
|
89
|
+
ctx.platform?.logger?.info?.("Starting LLM changelog generation", {
|
|
90
|
+
scope,
|
|
91
|
+
packagesCount: packages.length,
|
|
92
|
+
template: "corporate-ai"
|
|
93
|
+
});
|
|
94
|
+
const result = await generateChangelog({
|
|
95
|
+
repoRoot,
|
|
96
|
+
gitCwd,
|
|
97
|
+
packages,
|
|
98
|
+
range: {
|
|
99
|
+
from: void 0,
|
|
100
|
+
// Auto-detect from tags
|
|
101
|
+
to: "HEAD"
|
|
102
|
+
},
|
|
103
|
+
changelog: {
|
|
104
|
+
template: "corporate-ai",
|
|
105
|
+
locale: input.body?.locale || "en"
|
|
106
|
+
},
|
|
107
|
+
platform: {
|
|
108
|
+
llm: ctx.platform.llm,
|
|
109
|
+
logger: ctx.platform.logger,
|
|
110
|
+
analytics: ctx.platform.analytics
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
markdown = result.markdown;
|
|
114
|
+
commitsCount = result.changes.length;
|
|
115
|
+
usedLLM = true;
|
|
116
|
+
ctx.platform?.logger?.info?.("LLM changelog generated", {
|
|
117
|
+
scope,
|
|
118
|
+
markdownLength: markdown.length,
|
|
119
|
+
linesCount: markdown.split("\n").length,
|
|
120
|
+
commitsCount
|
|
121
|
+
});
|
|
122
|
+
} catch (error) {
|
|
123
|
+
ctx.platform?.logger?.error?.(
|
|
124
|
+
"Changelog generation failed, using simple fallback",
|
|
125
|
+
error instanceof Error ? error : void 0,
|
|
126
|
+
{ scope, packagesCount: packages.length }
|
|
127
|
+
);
|
|
128
|
+
markdown = generateSimpleChangelog(packages, "en");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const scopeDir = `${repoRoot}/.kb/release/plans/${scopeDirName}/current`;
|
|
133
|
+
await ctx.runtime.fs.mkdir(scopeDir, { recursive: true });
|
|
134
|
+
const changelogPath = `${scopeDir}/changelog.md`;
|
|
135
|
+
await ctx.runtime.fs.writeFile(changelogPath, markdown, { encoding: "utf-8" });
|
|
136
|
+
const cacheKey = `${RELEASE_CACHE_PREFIX}changelog:${scope}`;
|
|
137
|
+
await ctx.platform?.cache?.delete(cacheKey);
|
|
138
|
+
const duration = Date.now() - startTime;
|
|
139
|
+
ctx.platform?.logger?.info?.("Changelog generated", {
|
|
140
|
+
scope,
|
|
141
|
+
path: changelogPath,
|
|
142
|
+
packagesCount: packages.length,
|
|
143
|
+
commitsCount,
|
|
144
|
+
usedLLM,
|
|
145
|
+
durationMs: duration
|
|
146
|
+
});
|
|
147
|
+
ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_FINISHED, {
|
|
148
|
+
scope,
|
|
149
|
+
packagesCount: packages.length,
|
|
150
|
+
commitsCount,
|
|
151
|
+
durationMs: duration,
|
|
152
|
+
tokensUsed,
|
|
153
|
+
usedLLM,
|
|
154
|
+
actor: ANALYTICS_ACTOR
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
scope,
|
|
158
|
+
markdown,
|
|
159
|
+
changelogPath,
|
|
160
|
+
tokensUsed,
|
|
161
|
+
usedLLM,
|
|
162
|
+
commitsCount
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
export { changelog_generate_handler_default as default };
|
|
168
|
+
//# sourceMappingURL=changelog-generate-handler.js.map
|
|
169
|
+
//# sourceMappingURL=changelog-generate-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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","import { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\nexport { findRepoRoot } from '@kb-labs/sdk';\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/**\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 * Changelog generate handler - Generate changelog using LLM\n *\n * Writes: .kb/release/plans/{scope}/current/changelog.md\n */\n\nimport { defineHandler, findRepoRoot, type RestInput } 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';\n\nexport default defineHandler({\n async execute(ctx, input: RestInput<unknown, GenerateChangelogRequest>): Promise<GenerateChangelogResponse> {\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 // Track start\n ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_STARTED, {\n scope,\n actor: ANALYTICS_ACTOR,\n });\n\n // 1. Read release plan to get package info\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 (error) {\n ctx.platform?.logger?.error?.(\n 'Failed to read release plan',\n error instanceof Error ? error : undefined,\n { scope, planPath }\n );\n throw new Error(`Release plan not found for scope \"${scope}\". Generate plan first.`);\n }\n\n // 2. Convert plan packages to changelog format\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 // 3. Determine git working directory (for submodule support)\n let gitCwd = repoRoot;\n if (packages.length > 0 && packages[0]) {\n try {\n gitCwd = await findRepoRoot(packages[0].path);\n } catch {\n gitCwd = packages[0].path;\n }\n }\n\n // 4. Generate changelog using real implementation\n let markdown: string;\n const tokensUsed = 0;\n let usedLLM = false;\n let commitsCount = 0;\n const useLLM = input.body?.useLLM ?? true;\n\n // Skip LLM if disabled - use simple changelog\n if (!useLLM) {\n ctx.platform?.logger?.info?.('Using simple changelog (LLM disabled by user)', { scope });\n markdown = generateSimpleChangelog(packages, 'en');\n } else {\n const hasLLM = !!ctx.platform?.llm;\n ctx.platform?.logger?.info?.('Changelog generation mode', {\n scope,\n useLLM,\n hasLLMPlatform: hasLLM,\n });\n\n if (!hasLLM) {\n ctx.platform?.logger?.warn?.('LLM service not available, falling back to simple changelog', { scope });\n markdown = generateSimpleChangelog(packages, 'en');\n } else {\n try {\n ctx.platform?.logger?.info?.('Starting LLM changelog generation', {\n scope,\n packagesCount: packages.length,\n template: 'corporate-ai',\n });\n\n const result = await generateChangelog({\n repoRoot,\n gitCwd,\n packages,\n range: {\n from: undefined, // Auto-detect from tags\n to: 'HEAD',\n },\n changelog: {\n template: 'corporate-ai',\n locale: input.body?.locale || 'en',\n },\n platform: {\n llm: ctx.platform.llm,\n logger: ctx.platform.logger,\n analytics: ctx.platform.analytics,\n },\n });\n\n markdown = result.markdown;\n commitsCount = result.changes.length;\n usedLLM = true;\n\n ctx.platform?.logger?.info?.('LLM changelog generated', {\n scope,\n markdownLength: markdown.length,\n linesCount: markdown.split('\\n').length,\n commitsCount,\n });\n } catch (error) {\n // Fallback to simple changelog if generation fails\n ctx.platform?.logger?.error?.(\n 'Changelog generation failed, using simple fallback',\n error instanceof Error ? error : undefined,\n { scope, packagesCount: packages.length }\n );\n markdown = generateSimpleChangelog(packages, 'en');\n }\n }\n }\n\n // 5. Ensure directory exists\n const scopeDir = `${repoRoot}/.kb/release/plans/${scopeDirName}/current`;\n await ctx.runtime.fs.mkdir(scopeDir, { recursive: true });\n\n // 6. Write changelog\n const changelogPath = `${scopeDir}/changelog.md`;\n await ctx.runtime.fs.writeFile(changelogPath, markdown, { encoding: 'utf-8' });\n\n // 7. Invalidate cache so next GET request fetches fresh data\n const cacheKey = `${RELEASE_CACHE_PREFIX}changelog:${scope}`;\n await ctx.platform?.cache?.delete(cacheKey);\n\n const duration = Date.now() - startTime;\n\n ctx.platform?.logger?.info?.('Changelog generated', {\n scope,\n path: changelogPath,\n packagesCount: packages.length,\n commitsCount,\n usedLLM,\n durationMs: duration,\n });\n\n // Track completion\n ctx.platform?.analytics?.track?.(ANALYTICS_EVENTS.CHANGELOG_FINISHED, {\n scope,\n packagesCount: packages.length,\n commitsCount,\n durationMs: duration,\n tokensUsed,\n usedLLM,\n actor: ANALYTICS_ACTOR,\n });\n\n return {\n scope,\n markdown,\n changelogPath,\n tokensUsed,\n usedLLM,\n commitsCount,\n };\n }\n});\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{
|
|
5
|
+
scope: string;
|
|
6
|
+
from?: string | undefined;
|
|
7
|
+
to?: string | undefined;
|
|
8
|
+
}, unknown, unknown>, {
|
|
9
|
+
scope: string;
|
|
10
|
+
markdown?: string | undefined;
|
|
11
|
+
from?: string | undefined;
|
|
12
|
+
to?: string | undefined;
|
|
13
|
+
generatedAt?: string | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
|
|
16
|
+
export { _default as default };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defineHandler, findRepoRoot } from '@kb-labs/sdk';
|
|
2
|
+
import { RELEASE_CACHE_PREFIX } from '@kb-labs/release-manager-contracts';
|
|
3
|
+
import 'path';
|
|
4
|
+
import 'fs/promises';
|
|
5
|
+
import 'globby';
|
|
6
|
+
|
|
7
|
+
// src/rest/handlers/changelog-handler.ts
|
|
8
|
+
function scopeToDir(scope) {
|
|
9
|
+
return scope.replace(/^@/, "").replace(/\//g, "-").replace(/:/g, "-").replace(/\*/g, "");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/rest/handlers/changelog-handler.ts
|
|
13
|
+
var CACHE_TTL_MS = 15e3;
|
|
14
|
+
var changelog_handler_default = defineHandler({
|
|
15
|
+
async execute(ctx, input) {
|
|
16
|
+
const scope = input.query?.scope || "root";
|
|
17
|
+
const cwd = ctx.cwd ?? process.cwd();
|
|
18
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
19
|
+
const scopeDirName = scopeToDir(scope);
|
|
20
|
+
const changelogPath = `${repoRoot}/.kb/release/plans/${scopeDirName}/current/changelog.md`;
|
|
21
|
+
const cacheKey = `${RELEASE_CACHE_PREFIX}changelog:${scope}`;
|
|
22
|
+
const cached = await ctx.platform?.cache?.get(cacheKey);
|
|
23
|
+
if (cached !== void 0 && cached !== null) {
|
|
24
|
+
return {
|
|
25
|
+
scope,
|
|
26
|
+
markdown: cached,
|
|
27
|
+
from: input.query?.from,
|
|
28
|
+
to: input.query?.to
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
let markdown;
|
|
32
|
+
try {
|
|
33
|
+
markdown = await ctx.runtime.fs.readFile(changelogPath, "utf-8");
|
|
34
|
+
if (markdown !== void 0) {
|
|
35
|
+
await ctx.platform?.cache?.set(cacheKey, markdown, CACHE_TTL_MS);
|
|
36
|
+
}
|
|
37
|
+
} catch (error) {
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
scope,
|
|
41
|
+
markdown,
|
|
42
|
+
from: input.query?.from,
|
|
43
|
+
to: input.query?.to
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export { changelog_handler_default as default };
|
|
49
|
+
//# sourceMappingURL=changelog-handler.js.map
|
|
50
|
+
//# sourceMappingURL=changelog-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/changelog-handler.ts"],"names":["findRepoRoot"],"mappings":";;;;;;;AASO,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;;;ACHA,IAAM,YAAA,GAAe,IAAA;AAErB,IAAO,4BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAA,EAA8D;AAC/E,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,MAAA;AACpC,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,aAAA,GAAgB,CAAA,EAAG,QAAQ,CAAA,mBAAA,EAAsB,YAAY,CAAA,qBAAA,CAAA;AACnE,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,oBAAoB,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA;AAG1D,IAAA,MAAM,SAAS,MAAM,GAAA,CAAI,QAAA,EAAU,KAAA,EAAO,IAAI,QAAQ,CAAA;AACtD,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,EAAM;AAC3C,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,QAAA,EAAU,MAAA;AAAA,QACV,IAAA,EAAM,MAAM,KAAA,EAAO,IAAA;AAAA,QACnB,EAAA,EAAI,MAAM,KAAA,EAAO;AAAA,OACnB;AAAA,IACF;AAGA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,QAAA,CAAS,eAAe,OAAO,CAAA;AAG/D,MAAA,IAAI,aAAa,KAAA,CAAA,EAAW;AAC1B,QAAA,MAAM,IAAI,QAAA,EAAU,KAAA,EAAO,GAAA,CAAI,QAAA,EAAU,UAAU,YAAY,CAAA;AAAA,MACjE;AAAA,IACF,SAAS,KAAA,EAAO;AAAA,IAEhB;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,EAAM,MAAM,KAAA,EAAO,IAAA;AAAA,MACnB,EAAA,EAAI,MAAM,KAAA,EAAO;AAAA,KACnB;AAAA,EACF;AACF,CAAC","file":"changelog-handler.js","sourcesContent":["import { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\nexport { findRepoRoot } from '@kb-labs/sdk';\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/**\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 * 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 } 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 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 (error) {\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 }\n});\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, {
|
|
5
|
+
markdown: string;
|
|
6
|
+
scope: string;
|
|
7
|
+
}, unknown>, {
|
|
8
|
+
path: string;
|
|
9
|
+
scope: string;
|
|
10
|
+
success: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
|
|
13
|
+
export { _default as default };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defineHandler, findRepoRoot } from '@kb-labs/sdk';
|
|
2
|
+
import { mkdir } from 'fs/promises';
|
|
3
|
+
import 'path';
|
|
4
|
+
import 'globby';
|
|
5
|
+
|
|
6
|
+
// src/rest/handlers/changelog-save-handler.ts
|
|
7
|
+
function scopeToDir(scope) {
|
|
8
|
+
return scope.replace(/^@/, "").replace(/\//g, "-").replace(/:/g, "-").replace(/\*/g, "");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// src/rest/handlers/changelog-save-handler.ts
|
|
12
|
+
var changelog_save_handler_default = defineHandler({
|
|
13
|
+
async execute(ctx, input) {
|
|
14
|
+
const scope = input.body?.scope || "root";
|
|
15
|
+
const cwd = ctx.cwd ?? process.cwd();
|
|
16
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
17
|
+
const scopeDirName = scopeToDir(scope);
|
|
18
|
+
const scopeDir = `${repoRoot}/.kb/release/plans/${scopeDirName}/current`;
|
|
19
|
+
const changelogPath = `${scopeDir}/changelog.md`;
|
|
20
|
+
try {
|
|
21
|
+
await mkdir(scopeDir, { recursive: true });
|
|
22
|
+
await ctx.runtime.fs.writeFile(changelogPath, input.body?.markdown || "", { encoding: "utf-8" });
|
|
23
|
+
ctx.platform?.logger?.info?.("Changelog saved", { scope, path: changelogPath });
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
scope,
|
|
27
|
+
path: changelogPath
|
|
28
|
+
};
|
|
29
|
+
} catch (error) {
|
|
30
|
+
ctx.platform?.logger?.error?.(
|
|
31
|
+
"Failed to save changelog",
|
|
32
|
+
error instanceof Error ? error : void 0,
|
|
33
|
+
{ scope }
|
|
34
|
+
);
|
|
35
|
+
throw new Error(`Failed to save changelog: ${error instanceof Error ? error.message : String(error)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export { changelog_save_handler_default as default };
|
|
41
|
+
//# sourceMappingURL=changelog-save-handler.js.map
|
|
42
|
+
//# sourceMappingURL=changelog-save-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/rest/handlers/changelog-save-handler.ts"],"names":["findRepoRoot"],"mappings":";;;;;;AASO,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;;;ACDA,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,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACvG;AAAA,EACF;AACF,CAAC","file":"changelog-save-handler.js","sourcesContent":["import { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport globby from 'globby';\n\nexport { findRepoRoot } from '@kb-labs/sdk';\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/**\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 * 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 } 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 throw new Error(`Failed to save changelog: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
interface ChecklistInput {
|
|
5
|
+
scope?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<ChecklistInput, unknown, unknown>, {
|
|
8
|
+
plan: {
|
|
9
|
+
status: "ready" | "running" | "error" | "warning" | "pending";
|
|
10
|
+
message: string;
|
|
11
|
+
bump?: string | undefined;
|
|
12
|
+
packagesCount?: number | undefined;
|
|
13
|
+
};
|
|
14
|
+
preview: {
|
|
15
|
+
status: "ready" | "running" | "error" | "warning" | "pending";
|
|
16
|
+
message: string;
|
|
17
|
+
totalSize?: number | undefined;
|
|
18
|
+
filesCount?: number | undefined;
|
|
19
|
+
};
|
|
20
|
+
changelog: {
|
|
21
|
+
status: "ready" | "running" | "error" | "warning" | "pending";
|
|
22
|
+
message: string;
|
|
23
|
+
commitsCount?: number | undefined;
|
|
24
|
+
};
|
|
25
|
+
build: {
|
|
26
|
+
status: "ready" | "running" | "error" | "warning" | "pending";
|
|
27
|
+
message: string;
|
|
28
|
+
builtCount?: number | undefined;
|
|
29
|
+
totalCount?: number | undefined;
|
|
30
|
+
};
|
|
31
|
+
scope: string;
|
|
32
|
+
npm: {
|
|
33
|
+
status: "ready" | "running" | "error" | "warning" | "pending";
|
|
34
|
+
message: string;
|
|
35
|
+
};
|
|
36
|
+
canPublish: boolean;
|
|
37
|
+
}>;
|
|
38
|
+
|
|
39
|
+
export { _default as default };
|