@kb-labs/commit-entry 2.119.0 → 2.119.1-canary.a6aa9b388

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.
Files changed (51) hide show
  1. package/dist/cli/commands/apply.js.map +1 -1
  2. package/dist/cli/commands/flags.js.map +1 -1
  3. package/dist/cli/commands/generate.js.map +1 -1
  4. package/dist/cli/commands/index.js.map +1 -1
  5. package/dist/cli/commands/open.js.map +1 -1
  6. package/dist/cli/commands/push.js.map +1 -1
  7. package/dist/cli/commands/reset.js.map +1 -1
  8. package/dist/cli/commands/run.js.map +1 -1
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/lifecycle/index.js.map +1 -1
  12. package/dist/lifecycle/setup.js.map +1 -1
  13. package/dist/manifest.js.map +1 -1
  14. package/dist/manifest.json +415 -0
  15. package/dist/rest/handlers/actions-handler.js.map +1 -1
  16. package/dist/rest/handlers/apply-handler.js.map +1 -1
  17. package/dist/rest/handlers/diff-handler.js.map +1 -1
  18. package/dist/rest/handlers/files-handler.js.map +1 -1
  19. package/dist/rest/handlers/generate-handler.js.map +1 -1
  20. package/dist/rest/handlers/git-status-handler.js.map +1 -1
  21. package/dist/rest/handlers/patch-plan-handler.js.map +1 -1
  22. package/dist/rest/handlers/plan-handler.js.map +1 -1
  23. package/dist/rest/handlers/push-handler.js.map +1 -1
  24. package/dist/rest/handlers/regenerate-handler.js.map +1 -1
  25. package/dist/rest/handlers/reset-handler.js.map +1 -1
  26. package/dist/rest/handlers/scope-resolver.js.map +1 -1
  27. package/dist/rest/handlers/scopes-handler.js.map +1 -1
  28. package/dist/rest/handlers/status-handler.js.map +1 -1
  29. package/dist/rest/handlers/summarize-handler.js.map +1 -1
  30. package/dist/widgets/117.js +32 -0
  31. package/dist/widgets/165.js +1 -0
  32. package/dist/widgets/326.js +1 -0
  33. package/dist/widgets/370.js +1 -0
  34. package/dist/widgets/405.js +1 -0
  35. package/dist/widgets/46.js +445 -0
  36. package/dist/widgets/50.js +1 -0
  37. package/dist/widgets/546.js +1 -0
  38. package/dist/widgets/648.js +1 -0
  39. package/dist/widgets/669.js +1 -0
  40. package/dist/widgets/707.js +1 -0
  41. package/dist/widgets/775.js +1 -0
  42. package/dist/widgets/78.js +1 -0
  43. package/dist/widgets/832.js +96 -0
  44. package/dist/widgets/875.js +25 -0
  45. package/dist/widgets/945.js +1 -0
  46. package/dist/widgets/968.js +9 -0
  47. package/dist/widgets/__federation_expose_CommitOverview.js +1 -0
  48. package/dist/widgets/mf-manifest.json +229 -0
  49. package/dist/widgets/mf-stats.json +253 -0
  50. package/dist/widgets/remoteEntry.js +7 -0
  51. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/rest/handlers/scope-resolver.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/apply.ts"],"names":[],"mappings":"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","file":"apply.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit:apply command\n * Apply current commit plan\n */\n\nimport { defineCommand, useLoader, useConfig, findRepoRoot, validationError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport {\n applyCommitPlan,\n loadPlan,\n saveToHistory,\n clearPlan,\n} from '@kb-labs/commit-core';\nimport type { ApplyOutput, CommitPluginConfig } from '@kb-labs/commit-contracts';\nimport { resolveCommitConfig } from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\ntype ApplyInput = {\n force?: boolean;\n json?: boolean;\n scope?: string;\n};\n\ntype ApplyResult = CommandResult<ApplyOutput>;\n\nexport default defineCommand({\n id: 'commit:apply',\n description: 'Apply current commit plan',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: ApplyInput) {\n const scope = input.scope ?? 'root';\n return {\n summary: `Apply current commit plan (scope: \"${scope}\")`,\n operations: [{ type: 'create' as const, resource: 'git-commits', details: { scope } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: ApplyInput): Promise<ApplyResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n const scope = input.scope ?? 'root';\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(cwd, scope, config.scope?.scopes);\n\n // Load current plan\n const loadLoader = useLoader('Loading commit plan...');\n loadLoader.start();\n const plan = await loadPlan(cwd, scope);\n\n if (!plan) {\n loadLoader.fail('No commit plan found');\n validationError(ctx, 'No commit plan found', 'Run `kb commit:generate` first', input.json);\n return { ok: false, error: 'Command failed' };\n }\n\n if (plan.commits.length === 0) {\n loadLoader.stop();\n ctx.ui?.warn?.('Commit plan is empty. Nothing to apply.');\n return {\n ok: true,\n result: {\n success: true,\n commits: [],\n errors: [],\n },\n meta: {\n timing: Date.now() - startTime,\n },\n };\n }\n loadLoader.succeed(`Loaded plan with ${plan.commits.length} commit(s)`);\n\n // Apply plan\n const applyLoader = useLoader(`Applying ${plan.commits.length} commit(s)...`);\n applyLoader.start();\n const result = await applyCommitPlan(scopeCwd, plan, {\n force: input.force,\n });\n\n // Save to history and clear current plan on success\n if (result.success) {\n await saveToHistory(cwd, plan, result, scope);\n await clearPlan(cwd, scope);\n applyLoader.succeed(`Applied ${result.appliedCommits.length} commit(s) successfully`);\n } else {\n applyLoader.fail('Failed to apply commits');\n }\n\n // Output\n const output: ApplyOutput = {\n success: result.success,\n commits: result.appliedCommits.map((c) => ({\n id: c.groupId,\n sha: c.sha,\n message: c.message,\n })),\n errors: result.errors,\n };\n\n if (input.json) {\n ctx.ui?.json?.(output);\n } else {\n if (result.success) {\n // Build commits section\n const commitsItems = result.appliedCommits.map((commit) => {\n return `${commit.sha.substring(0, 7)} ${commit.message}`;\n });\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (commitsItems.length > 0) {\n sections.push({\n header: 'Applied Commits',\n items: commitsItems,\n });\n }\n\n const summaryItems: string[] = [\n `Total commits: ${result.appliedCommits.length}`,\n 'Status: ✅ Success',\n ];\n\n sections.unshift({\n header: 'Summary',\n items: summaryItems,\n });\n\n const timing = Date.now() - startTime;\n\n ctx.ui?.success?.('Commits applied successfully', {\n title: 'Apply Commit Plan',\n sections,\n timing,\n });\n } else {\n const errorItems = result.errors.map((error) => error);\n const timing = Date.now() - startTime;\n\n ctx.ui?.error?.('Failed to apply commits', {\n title: 'Apply Commit Plan',\n sections: [\n {\n header: 'Summary',\n items: [`Total errors: ${result.errors.length}`],\n },\n {\n header: 'Errors',\n items: errorItems,\n },\n ],\n timing,\n });\n }\n }\n\n return result.success ? {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n } : { ok: false, error: 'Commit apply failed', result: output };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/cli/commands/apply.ts"],"names":[],"mappings":"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","file":"apply.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit:apply command\n * Apply current commit plan\n */\n\nimport { defineCommand, useLoader, useConfig, findRepoRoot, validationError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport {\n applyCommitPlan,\n loadPlan,\n saveToHistory,\n clearPlan,\n} from '@kb-labs/commit-core';\nimport type { ApplyOutput, CommitPluginConfig } from '@kb-labs/commit-contracts';\nimport { resolveCommitConfig } from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\ntype ApplyInput = {\n force?: boolean;\n json?: boolean;\n scope?: string;\n};\n\ntype ApplyResult = CommandResult<ApplyOutput>;\n\nexport default defineCommand({\n id: 'commit:apply',\n description: 'Apply current commit plan',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: ApplyInput) {\n const scope = input.scope ?? 'root';\n return {\n summary: `Apply current commit plan (scope: \"${scope}\")`,\n operations: [{ type: 'create' as const, resource: 'git-commits', details: { scope } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: ApplyInput): Promise<ApplyResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n const scope = input.scope ?? 'root';\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(cwd, scope, config.scope?.scopes);\n\n // Load current plan\n const loadLoader = useLoader('Loading commit plan...');\n loadLoader.start();\n const plan = await loadPlan(cwd, scope);\n\n if (!plan) {\n loadLoader.fail('No commit plan found');\n validationError(ctx, 'No commit plan found', 'Run `kb commit:generate` first', input.json);\n return { ok: false, error: 'Command failed' };\n }\n\n if (plan.commits.length === 0) {\n loadLoader.stop();\n ctx.ui?.warn?.('Commit plan is empty. Nothing to apply.');\n return {\n ok: true,\n result: {\n success: true,\n commits: [],\n errors: [],\n },\n meta: {\n timing: Date.now() - startTime,\n },\n };\n }\n loadLoader.succeed(`Loaded plan with ${plan.commits.length} commit(s)`);\n\n // Apply plan\n const applyLoader = useLoader(`Applying ${plan.commits.length} commit(s)...`);\n applyLoader.start();\n const result = await applyCommitPlan(scopeCwd, plan, {\n force: input.force,\n });\n\n // Save to history and clear current plan on success\n if (result.success) {\n await saveToHistory(cwd, plan, result, scope);\n await clearPlan(cwd, scope);\n applyLoader.succeed(`Applied ${result.appliedCommits.length} commit(s) successfully`);\n } else {\n applyLoader.fail('Failed to apply commits');\n }\n\n // Output\n const output: ApplyOutput = {\n success: result.success,\n commits: result.appliedCommits.map((c) => ({\n id: c.groupId,\n sha: c.sha,\n message: c.message,\n })),\n errors: result.errors,\n };\n\n if (input.json) {\n ctx.ui?.json?.(output);\n } else {\n if (result.success) {\n // Build commits section\n const commitsItems = result.appliedCommits.map((commit) => {\n return `${commit.sha.substring(0, 7)} ${commit.message}`;\n });\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (commitsItems.length > 0) {\n sections.push({\n header: 'Applied Commits',\n items: commitsItems,\n });\n }\n\n const summaryItems: string[] = [\n `Total commits: ${result.appliedCommits.length}`,\n 'Status: ✅ Success',\n ];\n\n sections.unshift({\n header: 'Summary',\n items: summaryItems,\n });\n\n const timing = Date.now() - startTime;\n\n ctx.ui?.success?.('Commits applied successfully', {\n title: 'Apply Commit Plan',\n sections,\n timing,\n });\n } else {\n const errorItems = result.errors.map((error) => error);\n const timing = Date.now() - startTime;\n\n ctx.ui?.error?.('Failed to apply commits', {\n title: 'Apply Commit Plan',\n sections: [\n {\n header: 'Summary',\n items: [`Total errors: ${result.errors.length}`],\n },\n {\n header: 'Errors',\n items: errorItems,\n },\n ],\n timing,\n });\n }\n }\n\n return result.success ? {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n } : { ok: false, error: 'Commit apply failed', result: output };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/flags.ts"],"names":[],"mappings":";AASO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,QAAA,GAAW;AAAA,EACtB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAA,GAAgB;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAa","file":"flags.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/flags.ts"],"names":[],"mappings":";AASO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,QAAA,GAAW;AAAA,EACtB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAA,GAAgB;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAa","file":"flags.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/rest/handlers/scope-resolver.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/generate.ts"],"names":[],"mappings":"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","file":"generate.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit:generate command\n * Generate commit plan from git changes\n */\n\nimport {\n defineCommand,\n useLLM,\n useLoader,\n useConfig,\n findRepoRoot,\n displayArtifacts,\n handleError,\n type PluginContextV3,\n type CommandResult,\n type ArtifactInfo,\n} from '@kb-labs/sdk';\nimport { stat } from 'node:fs/promises';\nimport {\n generateCommitPlan,\n savePlan,\n hasChanges,\n getGitStatus,\n getCurrentPlanPath,\n} from '@kb-labs/commit-core';\nimport {\n type GenerateOutput,\n type CommitPluginConfig,\n resolveCommitConfig,\n type GenerateFlags,\n commitEnv,\n} from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\n// Input type with V3 handler compatibility\n// V3 handlers receive flags either in input.flags (CLI) or directly in input (REST API)\ntype GenerateInput = GenerateFlags & {\n argv?: string[];\n flags?: GenerateFlags;\n};\n\ntype GenerateResult = CommandResult<GenerateOutput>;\n\nexport default defineCommand({\n id: 'commit:generate',\n description: 'Generate commit plan from git changes',\n\n handler: {\n async execute(ctx: PluginContextV3, input: GenerateInput): Promise<GenerateResult> {\n const startTime = Date.now();\n const llm = useLLM();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n // Load config from kb.config.json + env overrides\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n\n // V3: Parse env variables with type safety and validation\n const env = commitEnv.parse(ctx.runtime);\n\n const config = resolveCommitConfig(fileConfig ?? {}, env);\n\n // V3: Flags come in input.flags (CLI) or directly in input (REST API)\n const flags = input.flags ?? input;\n const effectiveScope = flags.scope ?? config.scope?.default ?? 'root';\n const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);\n const allowSecrets = flags['allow-secrets'] ?? false;\n const autoConfirm = flags.yes ?? false;\n\n // Check for changes (with scope for nested repos)\n const statusLoader = useLoader('Checking git status...');\n statusLoader.start();\n const status = await getGitStatus(scopeCwd);\n\n if (!hasChanges(status)) {\n statusLoader.stop();\n ctx.ui?.warn?.('No changes to commit');\n return { ok: false, error: 'No changes to commit' };\n }\n statusLoader.succeed('Found changes to commit');\n\n // Generate plan\n const analyzeLoader = useLoader('Analyzing changes...');\n analyzeLoader.start();\n\n // Create LLM wrapper with config values\n const llmComplete =\n llm && config.llm.enabled\n ? async (prompt: string, options?: { systemPrompt?: string; temperature?: number; maxTokens?: number }) => {\n const result = await llm.complete(prompt, {\n ...options,\n temperature: options?.temperature ?? config.llm.temperature,\n maxTokens: options?.maxTokens ?? config.llm.maxTokens,\n });\n return {\n content: result.content,\n tokensUsed: result.usage ? result.usage.promptTokens + result.usage.completionTokens : undefined,\n };\n }\n : undefined;\n\n let plan;\n try {\n plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets,\n autoConfirm,\n onProgress: (message) => analyzeLoader.update({ text: message }),\n });\n } catch (err) {\n analyzeLoader.fail('Failed to generate commit plan');\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n\n // Save plan\n const saveLoader = useLoader('Saving plan...');\n saveLoader.start();\n try {\n await savePlan(cwd, plan, effectiveScope);\n } catch (err) {\n saveLoader.fail('Failed to save plan');\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n const planPath = getCurrentPlanPath(cwd, effectiveScope);\n saveLoader.succeed('Plan saved');\n\n analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);\n\n // Output\n const output: GenerateOutput = {\n plan,\n planPath,\n };\n\n // V3: Flags are auto-merged by bootstrap.ts, just use directly\n if (input.json) {\n ctx.ui?.json?.(output);\n } else {\n // Build commits section\n const commitsItems = plan.commits.map((commit) => {\n const scope = commit.scope ? `(${commit.scope})` : '';\n return `${commit.type}${scope}: ${commit.message} [${commit.files.length} file(s)]`;\n });\n\n // Build artifacts section\n const artifacts: ArtifactInfo[] = [];\n try {\n const planStats = await stat(planPath);\n artifacts.push({\n name: 'Commit Plan',\n path: planPath,\n size: planStats.size,\n modified: planStats.mtime,\n description: 'Generated commit plan in JSON format',\n });\n } catch {\n // Ignore stat errors\n }\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n // Add commits section\n if (commitsItems.length > 0) {\n sections.push({\n header: 'Commits',\n items: commitsItems,\n });\n }\n\n // Add artifacts section\n if (artifacts.length > 0) {\n const artifactsLines = displayArtifacts(artifacts, {\n showSize: true,\n showTime: true,\n showDescription: true,\n maxItems: 10,\n title: '',\n });\n sections.push({\n header: 'Artifacts',\n items: artifactsLines,\n });\n }\n\n // Build summary section\n const summaryItems: string[] = [\n `Files: ${plan.metadata.totalFiles}`,\n `Commits: ${plan.metadata.totalCommits}`,\n ];\n\n if (plan.metadata.llmUsed) {\n const llmPhase = plan.metadata.escalated ? 'Phase 2 (with diff)' : 'Phase 1';\n summaryItems.push(`LLM: ${llmPhase}`);\n if (plan.metadata.tokensUsed) {\n summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);\n }\n } else {\n summaryItems.push('Generator: Heuristics');\n }\n\n sections.unshift({\n header: 'Summary',\n items: summaryItems,\n });\n\n const timing = Date.now() - startTime;\n\n ctx.ui?.success?.('Plan generated and saved', {\n title: 'Generate Commit Plan',\n sections,\n timing,\n });\n }\n\n return {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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","file":"generate.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit:generate command\n * Generate commit plan from git changes\n */\n\nimport {\n defineCommand,\n useLLM,\n useLoader,\n useConfig,\n findRepoRoot,\n displayArtifacts,\n handleError,\n type PluginContextV3,\n type CommandResult,\n type ArtifactInfo,\n} from '@kb-labs/sdk';\nimport { stat } from 'node:fs/promises';\nimport {\n generateCommitPlan,\n savePlan,\n hasChanges,\n getGitStatus,\n getCurrentPlanPath,\n} from '@kb-labs/commit-core';\nimport {\n type GenerateOutput,\n type CommitPluginConfig,\n resolveCommitConfig,\n type GenerateFlags,\n commitEnv,\n} from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\n// Input type with V3 handler compatibility\n// V3 handlers receive flags either in input.flags (CLI) or directly in input (REST API)\ntype GenerateInput = GenerateFlags & {\n argv?: string[];\n flags?: GenerateFlags;\n};\n\ntype GenerateResult = CommandResult<GenerateOutput>;\n\nexport default defineCommand({\n id: 'commit:generate',\n description: 'Generate commit plan from git changes',\n\n handler: {\n async execute(ctx: PluginContextV3, input: GenerateInput): Promise<GenerateResult> {\n const startTime = Date.now();\n const llm = useLLM();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n // Load config from kb.config.json + env overrides\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n\n // V3: Parse env variables with type safety and validation\n const env = commitEnv.parse(ctx.runtime);\n\n const config = resolveCommitConfig(fileConfig ?? {}, env);\n\n // V3: Flags come in input.flags (CLI) or directly in input (REST API)\n const flags = input.flags ?? input;\n const effectiveScope = flags.scope ?? config.scope?.default ?? 'root';\n const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);\n const allowSecrets = flags['allow-secrets'] ?? false;\n const autoConfirm = flags.yes ?? false;\n\n // Check for changes (with scope for nested repos)\n const statusLoader = useLoader('Checking git status...');\n statusLoader.start();\n const status = await getGitStatus(scopeCwd);\n\n if (!hasChanges(status)) {\n statusLoader.stop();\n ctx.ui?.warn?.('No changes to commit');\n return { ok: false, error: 'No changes to commit' };\n }\n statusLoader.succeed('Found changes to commit');\n\n // Generate plan\n const analyzeLoader = useLoader('Analyzing changes...');\n analyzeLoader.start();\n\n // Create LLM wrapper with config values\n const llmComplete =\n llm && config.llm.enabled\n ? async (prompt: string, options?: { systemPrompt?: string; temperature?: number; maxTokens?: number }) => {\n const result = await llm.complete(prompt, {\n ...options,\n temperature: options?.temperature ?? config.llm.temperature,\n maxTokens: options?.maxTokens ?? config.llm.maxTokens,\n });\n return {\n content: result.content,\n tokensUsed: result.usage ? result.usage.promptTokens + result.usage.completionTokens : undefined,\n };\n }\n : undefined;\n\n let plan;\n try {\n plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets,\n autoConfirm,\n onProgress: (message) => analyzeLoader.update({ text: message }),\n });\n } catch (err) {\n analyzeLoader.fail('Failed to generate commit plan');\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n\n // Save plan\n const saveLoader = useLoader('Saving plan...');\n saveLoader.start();\n try {\n await savePlan(cwd, plan, effectiveScope);\n } catch (err) {\n saveLoader.fail('Failed to save plan');\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n const planPath = getCurrentPlanPath(cwd, effectiveScope);\n saveLoader.succeed('Plan saved');\n\n analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);\n\n // Output\n const output: GenerateOutput = {\n plan,\n planPath,\n };\n\n // V3: Flags are auto-merged by bootstrap.ts, just use directly\n if (input.json) {\n ctx.ui?.json?.(output);\n } else {\n // Build commits section\n const commitsItems = plan.commits.map((commit) => {\n const scope = commit.scope ? `(${commit.scope})` : '';\n return `${commit.type}${scope}: ${commit.message} [${commit.files.length} file(s)]`;\n });\n\n // Build artifacts section\n const artifacts: ArtifactInfo[] = [];\n try {\n const planStats = await stat(planPath);\n artifacts.push({\n name: 'Commit Plan',\n path: planPath,\n size: planStats.size,\n modified: planStats.mtime,\n description: 'Generated commit plan in JSON format',\n });\n } catch {\n // Ignore stat errors\n }\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n // Add commits section\n if (commitsItems.length > 0) {\n sections.push({\n header: 'Commits',\n items: commitsItems,\n });\n }\n\n // Add artifacts section\n if (artifacts.length > 0) {\n const artifactsLines = displayArtifacts(artifacts, {\n showSize: true,\n showTime: true,\n showDescription: true,\n maxItems: 10,\n title: '',\n });\n sections.push({\n header: 'Artifacts',\n items: artifactsLines,\n });\n }\n\n // Build summary section\n const summaryItems: string[] = [\n `Files: ${plan.metadata.totalFiles}`,\n `Commits: ${plan.metadata.totalCommits}`,\n ];\n\n if (plan.metadata.llmUsed) {\n const llmPhase = plan.metadata.escalated ? 'Phase 2 (with diff)' : 'Phase 1';\n summaryItems.push(`LLM: ${llmPhase}`);\n if (plan.metadata.tokensUsed) {\n summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);\n }\n } else {\n summaryItems.push('Generator: Heuristics');\n }\n\n sections.unshift({\n header: 'Summary',\n items: summaryItems,\n });\n\n const timing = Date.now() - startTime;\n\n ctx.ui?.success?.('Plan generated and saved', {\n title: 'Generate Commit Plan',\n sections,\n timing,\n });\n }\n\n return {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/flags.ts"],"names":[],"mappings":";AASO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,QAAA,GAAW;AAAA,EACtB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAA,GAAgB;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAa","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/flags.ts"],"names":[],"mappings":";AASO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,QAAA,GAAW;AAAA,EACtB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAA,GAAgB;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAa","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/rest/handlers/scope-resolver.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/open.ts"],"names":[],"mappings":"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","file":"open.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit:open command\n * Show current commit plan\n */\n\nimport { defineCommand, findRepoRoot, useConfig, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { loadPlan, getCurrentPlanPath, formatCommitMessage } from '@kb-labs/commit-core';\nimport { checkPlanStaleness } from '@kb-labs/commit-core/validator';\nimport { resolveCommitConfig, type CommitPluginConfig, type OpenOutput } from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\ntype OpenInput = {\n json?: boolean;\n scope?: string;\n};\n\ntype OpenResult = CommandResult<OpenOutput>;\n\nexport default defineCommand({\n id: 'commit:open',\n description: 'Show current commit plan',\n\n handler: {\n async execute(ctx: PluginContextV3, input: OpenInput): Promise<OpenResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n const scope = input.scope ?? 'root';\n\n // Load current plan\n let plan;\n try {\n plan = await loadPlan(cwd, scope);\n } catch (err) {\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n const planPath = getCurrentPlanPath(cwd, scope);\n\n // Proactively check staleness — same shared check applyCommitPlan runs\n // as a last-second guard, but here it's informational so the user finds\n // out before running `kb commit:apply` and hitting a raw git error.\n let stale: boolean | undefined;\n let staleReason: string | undefined;\n if (plan) {\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(cwd, scope, config.scope?.scopes);\n const staleness = await checkPlanStaleness(scopeCwd, plan, scope);\n stale = staleness.isStale;\n staleReason = staleness.isStale ? staleness.reason : undefined;\n }\n\n // Output\n const output: OpenOutput = {\n hasPlan: plan !== null,\n plan: plan ?? undefined,\n planPath: plan ? planPath : undefined,\n stale,\n staleReason,\n };\n\n if (input.json) {\n ctx.ui?.json?.(output);\n } else {\n if (!plan) {\n ctx.ui?.info?.('No commit plan found. Run `kb commit:generate` to create one.');\n } else {\n if (stale) {\n ctx.ui?.warn?.(`Plan is outdated: ${staleReason}`);\n }\n\n // Build commits section\n const commitsItems = plan.commits.map((commit, i) => {\n const message = formatCommitMessage(commit);\n const breaking = commit.breaking ? ' ⚠️ BREAKING' : '';\n return `${i + 1}. ${message} [${commit.files.length} file(s)]${breaking}`;\n });\n\n // Build git status section\n const status = plan.gitStatus;\n const statusItems = [\n `Staged: ${status.staged.length} file(s)`,\n `Unstaged: ${status.unstaged.length} file(s)`,\n `Untracked: ${status.untracked.length} file(s)`,\n ];\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n sections.push({\n header: 'Commits',\n items: commitsItems,\n });\n\n sections.push({\n header: 'Git Status (at generation)',\n items: statusItems,\n });\n\n const summaryItems: string[] = [\n `Plan path: ${planPath}`,\n `Created: ${plan.createdAt}`,\n `Total files: ${plan.metadata.totalFiles}`,\n `Total commits: ${plan.metadata.totalCommits}`,\n `Status: ${stale ? `⚠️ Outdated — ${staleReason}` : '✅ Up to date'}`,\n ];\n\n if (plan.metadata.llmUsed) {\n const generator = plan.metadata.escalated ? 'LLM (Phase 2)' : 'LLM (Phase 1)';\n summaryItems.push(`Generator: ${generator}`);\n } else {\n summaryItems.push('Generator: Heuristics');\n }\n\n sections.unshift({\n header: 'Summary',\n items: summaryItems,\n });\n\n ctx.ui?.success?.('Current Commit Plan', {\n sections,\n });\n }\n }\n\n return {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/cli/commands/open.ts"],"names":[],"mappings":"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","file":"open.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit:open command\n * Show current commit plan\n */\n\nimport { defineCommand, findRepoRoot, useConfig, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { loadPlan, getCurrentPlanPath, formatCommitMessage } from '@kb-labs/commit-core';\nimport { checkPlanStaleness } from '@kb-labs/commit-core/validator';\nimport { resolveCommitConfig, type CommitPluginConfig, type OpenOutput } from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\ntype OpenInput = {\n json?: boolean;\n scope?: string;\n};\n\ntype OpenResult = CommandResult<OpenOutput>;\n\nexport default defineCommand({\n id: 'commit:open',\n description: 'Show current commit plan',\n\n handler: {\n async execute(ctx: PluginContextV3, input: OpenInput): Promise<OpenResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n const scope = input.scope ?? 'root';\n\n // Load current plan\n let plan;\n try {\n plan = await loadPlan(cwd, scope);\n } catch (err) {\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n const planPath = getCurrentPlanPath(cwd, scope);\n\n // Proactively check staleness — same shared check applyCommitPlan runs\n // as a last-second guard, but here it's informational so the user finds\n // out before running `kb commit:apply` and hitting a raw git error.\n let stale: boolean | undefined;\n let staleReason: string | undefined;\n if (plan) {\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const config = resolveCommitConfig(fileConfig ?? {});\n const scopeCwd = resolveScopePath(cwd, scope, config.scope?.scopes);\n const staleness = await checkPlanStaleness(scopeCwd, plan, scope);\n stale = staleness.isStale;\n staleReason = staleness.isStale ? staleness.reason : undefined;\n }\n\n // Output\n const output: OpenOutput = {\n hasPlan: plan !== null,\n plan: plan ?? undefined,\n planPath: plan ? planPath : undefined,\n stale,\n staleReason,\n };\n\n if (input.json) {\n ctx.ui?.json?.(output);\n } else {\n if (!plan) {\n ctx.ui?.info?.('No commit plan found. Run `kb commit:generate` to create one.');\n } else {\n if (stale) {\n ctx.ui?.warn?.(`Plan is outdated: ${staleReason}`);\n }\n\n // Build commits section\n const commitsItems = plan.commits.map((commit, i) => {\n const message = formatCommitMessage(commit);\n const breaking = commit.breaking ? ' ⚠️ BREAKING' : '';\n return `${i + 1}. ${message} [${commit.files.length} file(s)]${breaking}`;\n });\n\n // Build git status section\n const status = plan.gitStatus;\n const statusItems = [\n `Staged: ${status.staged.length} file(s)`,\n `Unstaged: ${status.unstaged.length} file(s)`,\n `Untracked: ${status.untracked.length} file(s)`,\n ];\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n sections.push({\n header: 'Commits',\n items: commitsItems,\n });\n\n sections.push({\n header: 'Git Status (at generation)',\n items: statusItems,\n });\n\n const summaryItems: string[] = [\n `Plan path: ${planPath}`,\n `Created: ${plan.createdAt}`,\n `Total files: ${plan.metadata.totalFiles}`,\n `Total commits: ${plan.metadata.totalCommits}`,\n `Status: ${stale ? `⚠️ Outdated — ${staleReason}` : '✅ Up to date'}`,\n ];\n\n if (plan.metadata.llmUsed) {\n const generator = plan.metadata.escalated ? 'LLM (Phase 2)' : 'LLM (Phase 1)';\n summaryItems.push(`Generator: ${generator}`);\n } else {\n summaryItems.push('Generator: Heuristics');\n }\n\n sections.unshift({\n header: 'Summary',\n items: summaryItems,\n });\n\n ctx.ui?.success?.('Current Commit Plan', {\n sections,\n });\n }\n }\n\n return {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/push.ts"],"names":[],"mappings":"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","file":"push.js","sourcesContent":["/**\n * commit:push command\n * Push commits to remote\n */\n\nimport { defineCommand, useLoader, findRepoRoot, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { pushCommits } from '@kb-labs/commit-core';\nimport type { PushOutput } from '@kb-labs/commit-contracts';\n\ntype PushInput = {\n force?: boolean;\n json?: boolean;\n};\n\ntype PushResult = CommandResult<PushOutput>;\n\nexport default defineCommand({\n id: 'commit:push',\n description: 'Push commits to remote',\n\n handler: {\n async execute(ctx: PluginContextV3, input: PushInput): Promise<PushResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n // Push\n const pushLoader = useLoader('Pushing commits...');\n pushLoader.start();\n let result;\n try {\n result = await pushCommits(cwd, { force: input.force });\n } catch (err) {\n pushLoader.fail('Push failed');\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n\n // Output\n const output: PushOutput = {\n success: result.success,\n remote: result.remote,\n branch: result.branch,\n commits: result.commitsPushed,\n };\n\n if (result.success) {\n if (result.commitsPushed > 0) {\n pushLoader.succeed(`Pushed ${result.commitsPushed} commit(s) to ${result.remote}/${result.branch}`);\n } else {\n pushLoader.succeed('Nothing to push - already up to date');\n }\n } else {\n pushLoader.fail(`Failed to push: ${result.error}`);\n }\n\n if (input.json) {\n ctx.ui?.json?.(output);\n } else if (!result.success) {\n // Show error details\n ctx.ui?.error?.('Push Failed', {\n sections: [{\n header: 'Details',\n items: [\n `Remote: ${result.remote || 'unknown'}`,\n `Branch: ${result.branch || 'unknown'}`,\n `Error: ${result.error || 'Unknown error'}`,\n ],\n }],\n });\n } else if (result.commitsPushed > 0) {\n // Show success details\n ctx.ui?.success?.('Push Successful', {\n sections: [{\n header: 'Details',\n items: [\n `Commits pushed: ${result.commitsPushed}`,\n `Remote: ${result.remote || 'origin'}`,\n `Branch: ${result.branch || 'main'}`,\n 'Status: ✅ Up to date',\n ],\n }],\n });\n }\n\n return result.success ? {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n } : { ok: false, error: 'Commit push failed', result: output };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"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","file":"push.js","sourcesContent":["/**\n * commit:push command\n * Push commits to remote\n */\n\nimport { defineCommand, useLoader, findRepoRoot, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { pushCommits } from '@kb-labs/commit-core';\nimport type { PushOutput } from '@kb-labs/commit-contracts';\n\ntype PushInput = {\n force?: boolean;\n json?: boolean;\n};\n\ntype PushResult = CommandResult<PushOutput>;\n\nexport default defineCommand({\n id: 'commit:push',\n description: 'Push commits to remote',\n\n handler: {\n async execute(ctx: PluginContextV3, input: PushInput): Promise<PushResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n // Push\n const pushLoader = useLoader('Pushing commits...');\n pushLoader.start();\n let result;\n try {\n result = await pushCommits(cwd, { force: input.force });\n } catch (err) {\n pushLoader.fail('Push failed');\n handleError(ctx, err, input.json);\n return { ok: false, error: 'Command failed' };\n }\n\n // Output\n const output: PushOutput = {\n success: result.success,\n remote: result.remote,\n branch: result.branch,\n commits: result.commitsPushed,\n };\n\n if (result.success) {\n if (result.commitsPushed > 0) {\n pushLoader.succeed(`Pushed ${result.commitsPushed} commit(s) to ${result.remote}/${result.branch}`);\n } else {\n pushLoader.succeed('Nothing to push - already up to date');\n }\n } else {\n pushLoader.fail(`Failed to push: ${result.error}`);\n }\n\n if (input.json) {\n ctx.ui?.json?.(output);\n } else if (!result.success) {\n // Show error details\n ctx.ui?.error?.('Push Failed', {\n sections: [{\n header: 'Details',\n items: [\n `Remote: ${result.remote || 'unknown'}`,\n `Branch: ${result.branch || 'unknown'}`,\n `Error: ${result.error || 'Unknown error'}`,\n ],\n }],\n });\n } else if (result.commitsPushed > 0) {\n // Show success details\n ctx.ui?.success?.('Push Successful', {\n sections: [{\n header: 'Details',\n items: [\n `Commits pushed: ${result.commitsPushed}`,\n `Remote: ${result.remote || 'origin'}`,\n `Branch: ${result.branch || 'main'}`,\n 'Status: ✅ Up to date',\n ],\n }],\n });\n }\n\n return result.success ? {\n ok: true,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n } : { ok: false, error: 'Commit push failed', result: output };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/reset.ts"],"names":[],"mappings":";;;;AAgBA,IAAO,gBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,cAAA;AAAA,EACJ,WAAA,EAAa,2BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,MAAA,CAAO,IAAA,EAAuB,KAAA,EAAmB;AACrD,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,MAAA;AAC7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,8BAA8B,KAAK,CAAA,EAAA,CAAA;AAAA,QAC5C,UAAA,EAAY,CAAC,EAAE,IAAA,EAAM,QAAA,EAAmB,QAAA,EAAU,aAAA,EAAe,OAAA,EAAS,EAAE,KAAA,EAAM,EAAG;AAAA,OACvF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAyC;AAC3E,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,GAAA,GAAO,MAAM,YAAA,CAAa,GAAA,CAAI,GAAA,IAAO,QAAQ,GAAA,EAAK,CAAA,IAAM,OAAA,CAAQ,GAAA,EAAI;AAE1E,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,MAAA;AAG7B,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAEvC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,0BAA0B,CAAA;AACzC,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA;AAAA,UACJ,MAAA,EAAQ;AAAA,YACN,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AACvB,SACF;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MAC5B,SAAS,GAAA,EAAK;AACZ,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,GAAA,CAAI,EAAA,EAAI,UAAU,cAAA,EAAgB;AAAA,QAChC,UAAU,CAAC;AAAA,UACT,KAAA,EAAO;AAAA,YACL,qCAAA;AAAA,YACA;AAAA;AACF,SACD;AAAA,OACF,CAAA;AAED,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AACvB,OACF;AAAA,IACF;AAAA;AAEJ,CAAC","file":"reset.js","sourcesContent":["/**\n * commit:reset command\n * Clear current commit plan\n */\n\nimport { defineCommand, findRepoRoot, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { clearPlan, hasPlan } from '@kb-labs/commit-core';\nimport type { ResetOutput } from '@kb-labs/commit-contracts';\n\ntype ResetInput = {\n scope?: string;\n};\n\ntype ResetResult = CommandResult<ResetOutput>;\n\nexport default defineCommand({\n id: 'commit:reset',\n description: 'Clear current commit plan',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: ResetInput) {\n const scope = input.scope ?? 'root';\n return {\n summary: `Clear commit plan (scope: \"${scope}\")`,\n operations: [{ type: 'delete' as const, resource: 'commit-plan', details: { scope } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: ResetInput): Promise<ResetResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n const scope = input.scope ?? 'root';\n\n // Check if plan exists\n const exists = await hasPlan(cwd, scope);\n\n if (!exists) {\n ctx.ui?.info?.('No commit plan to clear.');\n return {\n ok: true,\n result: {\n success: true,\n message: 'No commit plan to clear.',\n },\n meta: {\n timing: Date.now() - startTime,\n },\n };\n }\n\n // Clear plan\n try {\n await clearPlan(cwd, scope);\n } catch (err) {\n handleError(ctx, err);\n return { ok: false, error: 'Command failed' };\n }\n\n ctx.ui?.success?.('Plan Cleared', {\n sections: [{\n items: [\n 'Status: ✅ Cleared successfully',\n 'Action: Run `kb commit:generate` to create a new plan',\n ],\n }],\n });\n\n return {\n ok: true,\n result: {\n success: true,\n message: 'Commit plan cleared successfully.',\n },\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/reset.ts"],"names":[],"mappings":";;;;AAgBA,IAAO,gBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,cAAA;AAAA,EACJ,WAAA,EAAa,2BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,MAAA,CAAO,IAAA,EAAuB,KAAA,EAAmB;AACrD,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,MAAA;AAC7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,8BAA8B,KAAK,CAAA,EAAA,CAAA;AAAA,QAC5C,UAAA,EAAY,CAAC,EAAE,IAAA,EAAM,QAAA,EAAmB,QAAA,EAAU,aAAA,EAAe,OAAA,EAAS,EAAE,KAAA,EAAM,EAAG;AAAA,OACvF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAyC;AAC3E,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,GAAA,GAAO,MAAM,YAAA,CAAa,GAAA,CAAI,GAAA,IAAO,QAAQ,GAAA,EAAK,CAAA,IAAM,OAAA,CAAQ,GAAA,EAAI;AAE1E,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,MAAA;AAG7B,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAEvC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,0BAA0B,CAAA;AACzC,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA;AAAA,UACJ,MAAA,EAAQ;AAAA,YACN,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AACvB,SACF;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MAC5B,SAAS,GAAA,EAAK;AACZ,QAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AACpB,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,GAAA,CAAI,EAAA,EAAI,UAAU,cAAA,EAAgB;AAAA,QAChC,UAAU,CAAC;AAAA,UACT,KAAA,EAAO;AAAA,YACL,qCAAA;AAAA,YACA;AAAA;AACF,SACD;AAAA,OACF,CAAA;AAED,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AACvB,OACF;AAAA,IACF;AAAA;AAEJ,CAAC","file":"reset.js","sourcesContent":["/**\n * commit:reset command\n * Clear current commit plan\n */\n\nimport { defineCommand, findRepoRoot, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport { clearPlan, hasPlan } from '@kb-labs/commit-core';\nimport type { ResetOutput } from '@kb-labs/commit-contracts';\n\ntype ResetInput = {\n scope?: string;\n};\n\ntype ResetResult = CommandResult<ResetOutput>;\n\nexport default defineCommand({\n id: 'commit:reset',\n description: 'Clear current commit plan',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: ResetInput) {\n const scope = input.scope ?? 'root';\n return {\n summary: `Clear commit plan (scope: \"${scope}\")`,\n operations: [{ type: 'delete' as const, resource: 'commit-plan', details: { scope } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: ResetInput): Promise<ResetResult> {\n const startTime = Date.now();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n\n const scope = input.scope ?? 'root';\n\n // Check if plan exists\n const exists = await hasPlan(cwd, scope);\n\n if (!exists) {\n ctx.ui?.info?.('No commit plan to clear.');\n return {\n ok: true,\n result: {\n success: true,\n message: 'No commit plan to clear.',\n },\n meta: {\n timing: Date.now() - startTime,\n },\n };\n }\n\n // Clear plan\n try {\n await clearPlan(cwd, scope);\n } catch (err) {\n handleError(ctx, err);\n return { ok: false, error: 'Command failed' };\n }\n\n ctx.ui?.success?.('Plan Cleared', {\n sections: [{\n items: [\n 'Status: ✅ Cleared successfully',\n 'Action: Run `kb commit:generate` to create a new plan',\n ],\n }],\n });\n\n return {\n ok: true,\n result: {\n success: true,\n message: 'Commit plan cleared successfully.',\n },\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/rest/handlers/scope-resolver.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/run.ts"],"names":[],"mappings":"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","file":"run.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit command (default flow)\n * Generate → Apply → (optional) Push\n */\n\nimport {\n defineCommand,\n useLLM,\n useLoader,\n useConfig,\n findRepoRoot,\n handleError,\n type PluginContextV3,\n type CLIInput,\n} from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport {\n generateCommitPlan,\n savePlan,\n hasChanges,\n getGitStatus,\n applyCommitPlan,\n pushCommits,\n saveToHistory,\n clearPlan,\n} from '@kb-labs/commit-core';\nimport {\n type CommitRunOutput,\n type CommitPluginConfig,\n resolveCommitConfig,\n type CommitFlags,\n commitEnv,\n} from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\ntype RunResult = CommandResult<CommitRunOutput>;\n\nasync function resolveContext(ctx: PluginContextV3, flags: CommitFlags) {\n const llm = useLLM();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const env = commitEnv.parse(ctx.runtime);\n const config = resolveCommitConfig(fileConfig ?? {}, env);\n const effectiveScope = flags.scope ?? config.scope?.default ?? 'root';\n const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);\n\n const llmComplete =\n llm && config.llm.enabled\n ? async (prompt: string, options?: { systemPrompt?: string; temperature?: number; maxTokens?: number }) => {\n const result = await llm.complete(prompt, {\n ...options,\n temperature: options?.temperature ?? config.llm.temperature,\n maxTokens: options?.maxTokens ?? config.llm.maxTokens,\n });\n return {\n content: result.content,\n tokensUsed: result.usage ? result.usage.promptTokens + result.usage.completionTokens : undefined,\n };\n }\n : undefined;\n\n return { cwd, config, effectiveScope, scopeCwd, llmComplete };\n}\n\nexport default defineCommand({\n id: 'commit:commit',\n description: 'Generate and apply commits (default flow)',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<CommitFlags>) {\n const flags = input.flags;\n const { effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);\n\n const status = await getGitStatus(scopeCwd);\n if (!hasChanges(status)) {\n return {\n summary: 'No changes to commit',\n operations: [],\n };\n }\n\n const plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets: flags['allow-secrets'] ?? false,\n autoConfirm: flags.yes ?? false,\n });\n\n return {\n summary: `Generate and apply ${plan.commits.length} commit(s) in scope \"${effectiveScope}\"`,\n operations: plan.commits.map(c => ({\n type: 'create' as const,\n resource: 'git-commit',\n details: {\n message: `${c.type}${c.scope ? `(${c.scope})` : ''}: ${c.message}`,\n files: c.files.length,\n },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<CommitFlags>): Promise<RunResult> {\n const startTime = Date.now();\n const flags = input.flags;\n const { cwd, effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);\n const withPush = flags['with-push'] ?? false;\n const outputJson = flags.json ?? false;\n\n // 1. Check for changes\n const statusLoader = useLoader('Checking git status...');\n statusLoader.start();\n let status;\n try {\n status = await getGitStatus(scopeCwd);\n } catch (err) {\n statusLoader.fail('Failed to check git status');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Command failed' };\n }\n\n if (!hasChanges(status)) {\n statusLoader.stop();\n ctx.ui?.warn?.('No changes to commit');\n return { ok: false, error: 'Command failed' };\n }\n statusLoader.succeed('Git status analyzed');\n\n // 2. Generate plan\n const analyzeLoader = useLoader('Analyzing changes...');\n analyzeLoader.start();\n\n const plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets: flags['allow-secrets'] ?? false,\n autoConfirm: flags.yes ?? false,\n onProgress: (message) => analyzeLoader.update({ text: message }),\n onPauseProgress: () => analyzeLoader.stop(),\n onResumeProgress: () => analyzeLoader.start(),\n });\n\n await savePlan(cwd, plan);\n analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);\n\n // 3. Apply plan\n const applyLoader = useLoader('Applying commits...');\n applyLoader.start();\n const applyResult = await applyCommitPlan(scopeCwd, plan);\n\n if (!applyResult.success) {\n applyLoader.fail('Failed to apply commits');\n if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: { code: 'APPLY_FAILED', message: applyResult.errors.join('; ') } });\n } else {\n ctx.ui?.error?.('Failed to apply commits', {\n hint: 'Check git status and resolve conflicts manually',\n cause: applyResult.errors.join('; '),\n });\n }\n return { ok: false, error: 'Command failed' };\n }\n\n await saveToHistory(cwd, plan, applyResult);\n await clearPlan(cwd);\n applyLoader.succeed(`Applied ${applyResult.appliedCommits.length} commit(s)`);\n\n // 4. Push (optional)\n let pushed = false;\n if (withPush) {\n const pushLoader = useLoader('Pushing commits...');\n pushLoader.start();\n const pushResult = await pushCommits(scopeCwd);\n\n if (pushResult.success) {\n pushed = true;\n pushLoader.succeed(`Pushed to ${pushResult.remote}/${pushResult.branch}`);\n } else {\n pushLoader.fail(`Failed to push: ${pushResult.error}`);\n }\n }\n\n const output: CommitRunOutput = {\n plan,\n applied: true,\n pushed,\n commits: applyResult.appliedCommits.map((c) => ({\n id: c.groupId,\n sha: c.sha,\n message: c.message,\n })),\n };\n\n if (outputJson) {\n ctx.ui?.json?.(output);\n } else {\n const commitsItems = applyResult.appliedCommits.map((c) => {\n const shortSha = c.sha.substring(0, 7);\n const firstLine = c.message.split('\\n')[0];\n return `[${shortSha}] ${firstLine}`;\n });\n\n const summaryItems: string[] = [\n `Commits: ${applyResult.appliedCommits.length}`,\n `Pushed: ${pushed ? 'Yes' : 'No'}`,\n `Scope: ${effectiveScope}`,\n ];\n\n if (plan.metadata.llmUsed) {\n const llmPhase = plan.metadata.escalated ? 'Phase 2' : 'Phase 1';\n summaryItems.push(`LLM: ${llmPhase}`);\n if (plan.metadata.tokensUsed) {\n summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);\n }\n }\n\n const timing = Date.now() - startTime;\n ctx.ui?.success?.('Commits created successfully', {\n title: 'Git Commit',\n sections: [\n { header: 'Summary', items: summaryItems },\n { header: 'Commits Created', items: commitsItems },\n ],\n timing,\n });\n }\n\n return {\n ok: true,\n result: output,\n meta: { timing: Date.now() - startTime },\n };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/cli/commands/run.ts"],"names":[],"mappings":"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","file":"run.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit command (default flow)\n * Generate → Apply → (optional) Push\n */\n\nimport {\n defineCommand,\n useLLM,\n useLoader,\n useConfig,\n findRepoRoot,\n handleError,\n type PluginContextV3,\n type CLIInput,\n} from '@kb-labs/sdk';\nimport type { CommandResult } from '@kb-labs/sdk';\nimport {\n generateCommitPlan,\n savePlan,\n hasChanges,\n getGitStatus,\n applyCommitPlan,\n pushCommits,\n saveToHistory,\n clearPlan,\n} from '@kb-labs/commit-core';\nimport {\n type CommitRunOutput,\n type CommitPluginConfig,\n resolveCommitConfig,\n type CommitFlags,\n commitEnv,\n} from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\ntype RunResult = CommandResult<CommitRunOutput>;\n\nasync function resolveContext(ctx: PluginContextV3, flags: CommitFlags) {\n const llm = useLLM();\n const cwd = (await findRepoRoot(ctx.cwd || process.cwd())) ?? process.cwd();\n const fileConfig = await useConfig<Partial<CommitPluginConfig>>();\n const env = commitEnv.parse(ctx.runtime);\n const config = resolveCommitConfig(fileConfig ?? {}, env);\n const effectiveScope = flags.scope ?? config.scope?.default ?? 'root';\n const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);\n\n const llmComplete =\n llm && config.llm.enabled\n ? async (prompt: string, options?: { systemPrompt?: string; temperature?: number; maxTokens?: number }) => {\n const result = await llm.complete(prompt, {\n ...options,\n temperature: options?.temperature ?? config.llm.temperature,\n maxTokens: options?.maxTokens ?? config.llm.maxTokens,\n });\n return {\n content: result.content,\n tokensUsed: result.usage ? result.usage.promptTokens + result.usage.completionTokens : undefined,\n };\n }\n : undefined;\n\n return { cwd, config, effectiveScope, scopeCwd, llmComplete };\n}\n\nexport default defineCommand({\n id: 'commit:commit',\n description: 'Generate and apply commits (default flow)',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<CommitFlags>) {\n const flags = input.flags;\n const { effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);\n\n const status = await getGitStatus(scopeCwd);\n if (!hasChanges(status)) {\n return {\n summary: 'No changes to commit',\n operations: [],\n };\n }\n\n const plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets: flags['allow-secrets'] ?? false,\n autoConfirm: flags.yes ?? false,\n });\n\n return {\n summary: `Generate and apply ${plan.commits.length} commit(s) in scope \"${effectiveScope}\"`,\n operations: plan.commits.map(c => ({\n type: 'create' as const,\n resource: 'git-commit',\n details: {\n message: `${c.type}${c.scope ? `(${c.scope})` : ''}: ${c.message}`,\n files: c.files.length,\n },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<CommitFlags>): Promise<RunResult> {\n const startTime = Date.now();\n const flags = input.flags;\n const { cwd, effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);\n const withPush = flags['with-push'] ?? false;\n const outputJson = flags.json ?? false;\n\n // 1. Check for changes\n const statusLoader = useLoader('Checking git status...');\n statusLoader.start();\n let status;\n try {\n status = await getGitStatus(scopeCwd);\n } catch (err) {\n statusLoader.fail('Failed to check git status');\n handleError(ctx, err, outputJson);\n return { ok: false, error: 'Command failed' };\n }\n\n if (!hasChanges(status)) {\n statusLoader.stop();\n ctx.ui?.warn?.('No changes to commit');\n return { ok: false, error: 'Command failed' };\n }\n statusLoader.succeed('Git status analyzed');\n\n // 2. Generate plan\n const analyzeLoader = useLoader('Analyzing changes...');\n analyzeLoader.start();\n\n const plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets: flags['allow-secrets'] ?? false,\n autoConfirm: flags.yes ?? false,\n onProgress: (message) => analyzeLoader.update({ text: message }),\n onPauseProgress: () => analyzeLoader.stop(),\n onResumeProgress: () => analyzeLoader.start(),\n });\n\n await savePlan(cwd, plan);\n analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);\n\n // 3. Apply plan\n const applyLoader = useLoader('Applying commits...');\n applyLoader.start();\n const applyResult = await applyCommitPlan(scopeCwd, plan);\n\n if (!applyResult.success) {\n applyLoader.fail('Failed to apply commits');\n if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: { code: 'APPLY_FAILED', message: applyResult.errors.join('; ') } });\n } else {\n ctx.ui?.error?.('Failed to apply commits', {\n hint: 'Check git status and resolve conflicts manually',\n cause: applyResult.errors.join('; '),\n });\n }\n return { ok: false, error: 'Command failed' };\n }\n\n await saveToHistory(cwd, plan, applyResult);\n await clearPlan(cwd);\n applyLoader.succeed(`Applied ${applyResult.appliedCommits.length} commit(s)`);\n\n // 4. Push (optional)\n let pushed = false;\n if (withPush) {\n const pushLoader = useLoader('Pushing commits...');\n pushLoader.start();\n const pushResult = await pushCommits(scopeCwd);\n\n if (pushResult.success) {\n pushed = true;\n pushLoader.succeed(`Pushed to ${pushResult.remote}/${pushResult.branch}`);\n } else {\n pushLoader.fail(`Failed to push: ${pushResult.error}`);\n }\n }\n\n const output: CommitRunOutput = {\n plan,\n applied: true,\n pushed,\n commits: applyResult.appliedCommits.map((c) => ({\n id: c.groupId,\n sha: c.sha,\n message: c.message,\n })),\n };\n\n if (outputJson) {\n ctx.ui?.json?.(output);\n } else {\n const commitsItems = applyResult.appliedCommits.map((c) => {\n const shortSha = c.sha.substring(0, 7);\n const firstLine = c.message.split('\\n')[0];\n return `[${shortSha}] ${firstLine}`;\n });\n\n const summaryItems: string[] = [\n `Commits: ${applyResult.appliedCommits.length}`,\n `Pushed: ${pushed ? 'Yes' : 'No'}`,\n `Scope: ${effectiveScope}`,\n ];\n\n if (plan.metadata.llmUsed) {\n const llmPhase = plan.metadata.escalated ? 'Phase 2' : 'Phase 1';\n summaryItems.push(`LLM: ${llmPhase}`);\n if (plan.metadata.tokensUsed) {\n summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);\n }\n }\n\n const timing = Date.now() - startTime;\n ctx.ui?.success?.('Commits created successfully', {\n title: 'Git Commit',\n sections: [\n { header: 'Summary', items: summaryItems },\n { header: 'Commits Created', items: commitsItems },\n ],\n timing,\n });\n }\n\n return {\n ok: true,\n result: output,\n meta: { timing: Date.now() - startTime },\n };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/flags.ts"],"names":[],"mappings":";AASO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,QAAA,GAAW;AAAA,EACtB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAA,GAAgB;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAa","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n"]}
1
+ {"version":3,"sources":["../../src/cli/commands/flags.ts"],"names":[],"mappings":";AASO,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,SAAA,GAAY;AAAA,EACvB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,QAAA,GAAW;AAAA,EACtB,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,8FAAA;AAAA,IACb,KAAA,EAAO;AAAA,GACT;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,kBAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAA,GAAgB;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb;AAOO,IAAM,aAAa","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/cli/commands/flags.ts","../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/lifecycle/setup.ts","../../home/runner/work/kb-labs/kb-labs/plugins/commit/entry/src/manifest.ts"],"names":[],"mappings":"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KAAA,EAAO;AAAA;AACT;AACF,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyaA,SAAA,EAAW;AAAA,IACT;AAAA,MACE,EAAA,EAAI,kBAAA;AAAA,MACJ,YAAA,EAAc,8BAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,EAAA,EAAI,oBAAA;AAAA,MACJ,YAAA,EAAc,gCAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf;AAEJ","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n","/**\n * Setup handler for commit plugin\n * Initializes .kb/commit/ directory structure and config\n */\n\nimport { defaultCommitConfig } from '@kb-labs/commit-contracts';\n\nconst COMMIT_DIR = '.kb/commit';\n\n/**\n * Plugin setup configuration\n *\n * Uses CommitPluginConfig from contracts as single source of truth.\n */\nexport const setup = {\n files: [\n {\n path: `${COMMIT_DIR}/README.md`,\n content: [\n '# Commit Plugin Workspace',\n '',\n 'This directory contains commit plugin data:',\n '',\n '- `current/` - Current commit plan (generated, not committed)',\n '- `history/` - Applied commit plans history',\n '',\n '## Configuration',\n '',\n 'Plugin configuration is stored in `kb.config.json` under `plugins.commit`.',\n '',\n '### Environment Variables',\n '',\n '| Variable | Description | Default |',\n '|----------|-------------|---------|',\n '| `KB_COMMIT_LLM_ENABLED` | Enable/disable LLM | `true` |',\n '| `KB_COMMIT_LLM_TEMPERATURE` | LLM temperature (0-1) | `0.3` |',\n '| `KB_COMMIT_LLM_MAX_TOKENS` | Max tokens for LLM | `2000` |',\n '| `KB_COMMIT_STORAGE_DIR` | Storage directory | `.kb/commit` |',\n '| `KB_COMMIT_AUTO_STAGE` | Auto-stage changes | `false` |',\n '',\n '## Commands',\n '',\n '```bash',\n '# Full flow: generate → apply',\n 'kb commit',\n '',\n '# Generate plan only',\n 'kb commit:generate',\n '',\n '# Apply current plan',\n 'kb commit:apply',\n '',\n '# View current plan',\n 'kb commit:open',\n '',\n '# Reset current plan',\n 'kb commit:reset',\n '',\n '# Push commits',\n 'kb commit:push',\n '```',\n '',\n 'Re-run `kb commit setup --force` to regenerate defaults.',\n ].join('\\n') + '\\n',\n description: 'README for commit plugin workspace',\n },\n ],\n\n config: [\n {\n pointer: 'plugins.commit',\n value: defaultCommitConfig,\n },\n ],\n\n scripts: [\n {\n name: 'commit',\n command: 'kb commit',\n description: 'Generate and apply commits',\n },\n {\n name: 'commit:generate',\n command: 'kb commit:generate',\n description: 'Generate commit plan from changes',\n },\n ],\n\n gitignore: [\n '.kb/commit/current/',\n '.kb/commit/history/',\n ],\n\n notes: [\n 'Run `kb commit` to analyze changes and generate commit plan.',\n 'Set KB_COMMIT_LLM_ENABLED=false to use heuristics only.',\n 'Use `kb commit:open` to view current plan before applying.',\n ],\n};\n\n/**\n * Setup handler function (for manifest registration)\n */\nexport async function run() {\n return {\n message: 'Commit plugin setup completed. Try `kb commit` to generate commits!',\n ...setup,\n };\n}\n\nexport default run;\n","/**\n * KB Labs Commit Plugin - 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 * - All imports from @kb-labs/sdk\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n} from '@kb-labs/sdk';\nimport {\n COMMIT_ENV_VARS,\n COMMIT_BASE_PATH,\n COMMIT_ROUTES,\n COMMIT_CACHE_PREFIX,\n} from '@kb-labs/commit-contracts';\nimport {\n runFlags,\n generateFlags,\n applyFlags,\n pushFlags,\n jsonOnlyFlags,\n emptyFlags,\n} from './cli/commands/flags';\n\n/**\n * Build permissions using presets:\n * - gitWorkflow: HOME, USER, GIT_*, SSH_* for git operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - Custom: COMMIT_ENV_VARS, quotas, platform services (llm, cache)\n *\n * Note: LLM access goes through platform services, no direct API keys needed.\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .withEnv([...COMMIT_ENV_VARS])\n .withFs({\n mode: 'readWrite',\n allow: ['.kb/commit/**'],\n })\n .withPlatform({\n llm: true, // Full LLM access for commit generation\n cache: [COMMIT_CACHE_PREFIX], // Cache namespace prefix from contracts\n analytics: true, // Track commit generation events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for LLM\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/commit',\n version: '0.1.0',\n configSection: 'commit',\n\n display: {\n name: 'Commit Generator',\n description: 'AI-powered conventional commit generation',\n tags: ['commit', 'git', 'ai', 'conventional-commits'],\n },\n\n // Platform requirements (LLM is optional but preferred)\n platform: {\n requires: ['storage', 'cache'],\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // TODO: Implement V3 setup handler\n // Setup temporarily disabled during migration - needs proper V3 implementation\n // setup: {\n // handler: './lifecycle/setup.js#default',\n // handlerPath: './lifecycle/setup.js',\n // describe: 'Initialize .kb/commit/ directory structure.',\n // permissions: permissions.combine(\n // permissions.presets.pluginWorkspace('commit'),\n // {\n // quotas: { timeoutMs: 10000, memoryMb: 128, cpuMs: 3000 },\n // }\n // ),\n // },\n\n // V3: cli wrapper with commands array\n cli: {\n groupMeta: [\n {\n path: 'commit',\n describe: 'AI-powered conventional commit generation.',\n },\n ],\n commands: [\n // Main command: commit (default flow)\n {\n path: 'commit',\n category: 'Pipeline',\n describe: 'Generate and apply commits (default flow).',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes changes, generates commit plan with LLM, applies commits locally. ' +\n 'Use --dry-run to preview without applying, --with-push to push after applying.',\n\n // ✅ V3: handler with #default suffix\n handler: './cli/commands/run.js#default',\n\n flags: defineCommandFlags(runFlags),\n\n examples: [\n 'kb commit commit',\n 'kb commit commit --dry-run',\n 'kb commit commit --with-push',\n 'kb commit commit --scope \"src/components/**\"',\n ],\n },\n\n // commit:generate - Generate commit plan\n {\n path: 'commit generate',\n category: 'Pipeline',\n describe: 'Generate commit plan from git changes.',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes staged and unstaged changes using git diff, then uses LLM to group ' +\n 'related changes and generate conventional commit messages.',\n\n handler: './cli/commands/generate.js#default',\n\n flags: defineCommandFlags(generateFlags),\n\n examples: [\n 'kb commit generate',\n 'kb commit generate --json',\n 'kb commit generate --scope \"packages/**\"',\n ],\n },\n\n // commit:apply - Apply commit plan\n {\n path: 'commit apply',\n category: 'Pipeline',\n describe: 'Apply current commit plan (create local commits).',\n operationType: 'mutate' as const,\n longDescription:\n 'Creates git commits according to the current plan. Checks for staleness ' +\n '(working tree changes since plan generation) unless --force is used.',\n\n handler: './cli/commands/apply.js#default',\n\n flags: defineCommandFlags(applyFlags),\n\n examples: [\n 'kb commit apply',\n 'kb commit apply --force',\n ],\n },\n\n // commit:push - Push commits\n {\n path: 'commit push',\n category: 'Pipeline',\n describe: 'Push commits to remote repository.',\n operationType: 'execute' as const,\n longDescription:\n 'Pushes local commits to the remote. Refuses force push to protected branches ' +\n '(main, master) by default.',\n\n handler: './cli/commands/push.js#default',\n\n flags: defineCommandFlags(pushFlags),\n\n examples: [\n 'kb commit push',\n ],\n },\n\n // commit:open - Show current plan\n {\n path: 'commit open',\n category: 'Plan',\n describe: 'Show current commit plan.',\n operationType: 'read' as const,\n longDescription: 'Displays the current commit plan if one exists.',\n\n handler: './cli/commands/open.js#default',\n\n flags: defineCommandFlags(jsonOnlyFlags),\n\n examples: [\n 'kb commit open',\n 'kb commit open --json',\n ],\n },\n\n // commit:reset - Clear current plan\n {\n path: 'commit reset',\n category: 'Plan',\n describe: 'Clear current commit plan.',\n operationType: 'mutate' as const,\n longDescription: 'Removes the current commit plan from storage.',\n\n handler: './cli/commands/reset.js#default',\n\n flags: defineCommandFlags(emptyFlags),\n\n examples: [\n 'kb commit reset',\n ],\n },\n ],\n },\n\n capabilities: [],\n\n // ✅ V3: Manifest-first permissions using composable presets\n permissions: pluginPermissions,\n\n // REST API routes (inherit permissions from manifest)\n rest: {\n basePath: COMMIT_BASE_PATH,\n routes: [\n // GET /scopes\n {\n method: 'GET',\n path: COMMIT_ROUTES.SCOPES,\n handler: './rest/handlers/scopes-handler.js#default',\n output: {\n zod: '@kb-labs/sdk#SelectDataSchema',\n },\n },\n // GET /status\n {\n method: 'GET',\n path: COMMIT_ROUTES.STATUS,\n handler: './rest/handlers/status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#StatusResponseSchema',\n },\n },\n // POST /generate\n {\n method: 'POST',\n path: COMMIT_ROUTES.GENERATE,\n handler: './rest/handlers/generate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#GenerateRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#GenerateResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n // GET /plan\n {\n method: 'GET',\n path: COMMIT_ROUTES.PLAN,\n handler: './rest/handlers/plan-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#PlanResponseSchema',\n },\n },\n // POST /apply\n {\n method: 'POST',\n path: COMMIT_ROUTES.APPLY,\n handler: './rest/handlers/apply-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#ApplyRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#ApplyResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post hooks\n },\n // POST /push\n {\n method: 'POST',\n path: COMMIT_ROUTES.PUSH,\n handler: './rest/handlers/push-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PushRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PushResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post push hooks\n },\n // DELETE /plan\n {\n method: 'DELETE',\n path: COMMIT_ROUTES.RESET,\n handler: './rest/handlers/reset-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ResetResponseSchema',\n },\n },\n // GET /git-status\n {\n method: 'GET',\n path: COMMIT_ROUTES.GIT_STATUS,\n handler: './rest/handlers/git-status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#GitStatusResponseSchema',\n },\n },\n // GET /files\n {\n method: 'GET',\n path: COMMIT_ROUTES.FILES,\n handler: './rest/handlers/files-handler.js#default',\n },\n // GET /diff\n {\n method: 'GET',\n path: COMMIT_ROUTES.DIFF,\n handler: './rest/handlers/diff-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#FileDiffResponseSchema',\n },\n },\n // POST /summarize\n {\n method: 'POST',\n path: COMMIT_ROUTES.SUMMARIZE,\n handler: './rest/handlers/summarize-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#SummarizeRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#SummarizeResponseSchema',\n },\n },\n // GET /actions\n {\n method: 'GET',\n path: COMMIT_ROUTES.ACTIONS,\n handler: './rest/handlers/actions-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ActionsResponseSchema',\n },\n },\n // PATCH /plan — edit a single commit in the plan\n {\n method: 'PATCH',\n path: COMMIT_ROUTES.PATCH_PLAN,\n handler: './rest/handlers/patch-plan-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PatchPlanRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PatchPlanResponseSchema',\n },\n },\n // POST /regenerate-commit — regenerate a single commit with LLM\n {\n method: 'POST',\n path: COMMIT_ROUTES.REGENERATE_COMMIT,\n handler: './rest/handlers/regenerate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n ],\n },\n\n // Studio V2 — Module Federation pages\n studio: {\n version: 2 as const,\n remoteName: 'commitPlugin',\n pages: [\n {\n id: 'commit.overview',\n title: 'Commit',\n icon: 'GitlabOutlined',\n route: '/p/commit',\n entry: './CommitOverview',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'commit',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: 'commit.overview',\n order: 30,\n },\n ],\n },\n\n // Legacy V1 studio widgets (deleted)\n /*\n _legacy_studio: {\n widgets: [\n // Workspace Selector\n {\n id: 'commit.workspace-selector',\n kind: 'select',\n title: 'Select Scope',\n description: 'Choose monorepo package or repository',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.SCOPES,\n method: 'GET',\n },\n },\n options: {\n searchable: true,\n placeholder: 'Select scope...',\n },\n events: {\n emit: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n payloadMap: { scope: 'value' }, // Maps selected value to payload.scope\n }],\n },\n layoutHint: { w: 6, h: 1, minH: 1 },\n order: 0,\n },\n // Status Metrics\n {\n id: 'commit.status',\n kind: 'metric-group',\n title: 'Commit Status',\n description: 'Current plan and git status',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.STATUS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' }, // Maps payload.workspace to params.workspace\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 2, minH: 2 },\n order: 1,\n },\n // Plan Viewer (child of commit.plan-section)\n {\n id: 'commit.plan-viewer',\n kind: 'cardlist',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PLAN,\n method: 'GET',\n },\n },\n options: {\n layout: 'list',\n emptyMessage: 'No plan. Click Generate Plan to create commits.',\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n {\n name: COMMIT_EVENTS.PLAN_GENERATED,\n // When plan is generated, update widget data with cards\n // No paramsMap - use entire payload as widget data\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n order: 2,\n },\n // Git Files Table (child of commit.files-section)\n {\n id: 'commit.git-files',\n kind: 'table',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.FILES,\n method: 'GET',\n },\n },\n options: {\n columns: [\n {\n id: 'path',\n label: 'File',\n sortable: true,\n width: '60%',\n },\n {\n id: 'status',\n label: 'Status',\n sortable: true,\n width: 80,\n },\n {\n id: 'changes',\n label: 'Changes',\n sortable: false,\n width: 120,\n },\n ],\n pagination: false,\n rowSelection: false,\n size: 'small',\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n order: 3,\n },\n // Quick Actions Widget\n {\n id: 'commit.actions',\n kind: 'card',\n title: 'Quick Actions',\n description: 'Common commit workflow actions',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.ACTIONS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n onSuccess: {\n emitEvent: COMMIT_EVENTS.PLAN_GENERATED,\n // Response data will be used as payload (contains plan + workspace)\n },\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n ],\n layoutHint: { w: 6, h: 3, minH: 2 },\n order: 6,\n },\n // Files Section (collapsible, GitLab-style)\n {\n id: 'commit.files-section',\n kind: 'section',\n title: 'Changed Files',\n description: 'Files with uncommitted changes',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FolderOutlined',\n showDivider: true,\n },\n children: ['commit.git-files'],\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 4,\n },\n // Plan Section (collapsible, GitLab-style)\n {\n id: 'commit.plan-section',\n kind: 'section',\n title: 'Commit Plan',\n description: 'Generated commits ready to apply',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FileTextOutlined',\n showDivider: true,\n },\n children: ['commit.plan-viewer'],\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 5,\n },\n ],\n // Studio menus\n menus: [\n {\n id: 'commit-menu',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: '/plugins/commit/overview',\n order: 0,\n },\n {\n id: 'commit-overview',\n label: 'Overview',\n icon: 'DashboardOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/overview',\n order: 1,\n },\n {\n id: 'commit-plan',\n label: 'Plan',\n icon: 'UnorderedListOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/plan',\n order: 2,\n },\n {\n id: 'commit-files',\n label: 'Files',\n icon: 'FileTextOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/files',\n order: 3,\n },\n ],\n // Studio layouts\n layouts: [\n // Overview page - Quick status and actions\n {\n id: 'commit.overview',\n kind: 'grid',\n title: 'Overview',\n description: 'Workspace status and quick actions',\n icon: 'home',\n widgets: [\n 'commit.workspace-selector',\n 'commit.status',\n 'commit.actions',\n 'commit.plan-section', // Show plan section on overview too\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 1,\n },\n // Plan page - GitLab-style commit plan view\n {\n id: 'commit.plan',\n kind: 'grid',\n title: 'Commit Plan',\n description: 'Review and manage generated commits',\n icon: 'list',\n widgets: [\n 'commit.workspace-selector',\n 'commit.files-section',\n 'commit.plan-section',\n ],\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'reset',\n label: 'Reset Plan',\n icon: 'DeleteOutlined',\n variant: 'danger',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.RESET,\n method: 'DELETE',\n },\n confirm: {\n title: 'Reset Plan',\n description: 'This will delete the current commit plan. This action cannot be undone.',\n confirmLabel: 'Delete',\n cancelLabel: 'Cancel',\n },\n },\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 2,\n },\n // Files page - Changed files table\n {\n id: 'commit.files',\n kind: 'grid',\n title: 'Changed Files',\n description: 'Git status and modified files',\n icon: 'file',\n widgets: [\n 'commit.workspace-selector',\n 'commit.git-files',\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 3,\n },\n ],\n },\n */\n\n // Artifacts\n artifacts: [\n {\n id: 'commit.plan.json',\n pathTemplate: '.kb/commit/current/plan.json',\n description: 'Current commit plan.',\n },\n {\n id: 'commit.status.json',\n pathTemplate: '.kb/commit/current/status.json',\n description: 'Git status snapshot at plan generation time.',\n },\n ],\n};\n\nexport default manifest;\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/flags.ts","../src/lifecycle/setup.ts","../src/manifest.ts"],"names":[],"mappings":"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KAAA,EAAO;AAAA;AACT;AACF,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyaA,SAAA,EAAW;AAAA,IACT;AAAA,MACE,EAAA,EAAI,kBAAA;AAAA,MACJ,YAAA,EAAc,8BAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,EAAA,EAAI,oBAAA;AAAA,MACJ,YAAA,EAAc,gCAAA;AAAA,MACd,WAAA,EAAa;AAAA;AACf;AAEJ","file":"index.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for commit:generate command\n */\nexport const generateFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type GenerateFlags = typeof generateFlags;\n\n/**\n * Flags for commit:apply command\n */\nexport const applyFlags = {\n force: {\n type: 'boolean',\n description: 'Apply even if working tree changed',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type ApplyFlags = typeof applyFlags;\n\n/**\n * Flags for commit:push command\n */\nexport const pushFlags = {\n force: {\n type: 'boolean',\n description: 'Force push (dangerous!)',\n default: false,\n alias: 'f',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type PushFlags = typeof pushFlags;\n\n/**\n * Flags for commit (run) command - combines generate + apply + optional push\n */\nexport const runFlags = {\n scope: {\n type: 'string',\n description: 'Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)',\n alias: 's',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Generate plan only, do not apply',\n default: false,\n },\n 'with-push': {\n type: 'boolean',\n description: 'Push after apply',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Common json-only flags for simple commands\n */\nexport const jsonOnlyFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n} as const;\n\nexport type JsonOnlyFlags = typeof jsonOnlyFlags;\n\n/**\n * Empty flags for commands that take no arguments\n */\nexport const emptyFlags = {} as const;\n\nexport type EmptyFlags = typeof emptyFlags;\n","/**\n * Setup handler for commit plugin\n * Initializes .kb/commit/ directory structure and config\n */\n\nimport { defaultCommitConfig } from '@kb-labs/commit-contracts';\n\nconst COMMIT_DIR = '.kb/commit';\n\n/**\n * Plugin setup configuration\n *\n * Uses CommitPluginConfig from contracts as single source of truth.\n */\nexport const setup = {\n files: [\n {\n path: `${COMMIT_DIR}/README.md`,\n content: [\n '# Commit Plugin Workspace',\n '',\n 'This directory contains commit plugin data:',\n '',\n '- `current/` - Current commit plan (generated, not committed)',\n '- `history/` - Applied commit plans history',\n '',\n '## Configuration',\n '',\n 'Plugin configuration is stored in `kb.config.json` under `plugins.commit`.',\n '',\n '### Environment Variables',\n '',\n '| Variable | Description | Default |',\n '|----------|-------------|---------|',\n '| `KB_COMMIT_LLM_ENABLED` | Enable/disable LLM | `true` |',\n '| `KB_COMMIT_LLM_TEMPERATURE` | LLM temperature (0-1) | `0.3` |',\n '| `KB_COMMIT_LLM_MAX_TOKENS` | Max tokens for LLM | `2000` |',\n '| `KB_COMMIT_STORAGE_DIR` | Storage directory | `.kb/commit` |',\n '| `KB_COMMIT_AUTO_STAGE` | Auto-stage changes | `false` |',\n '',\n '## Commands',\n '',\n '```bash',\n '# Full flow: generate → apply',\n 'kb commit',\n '',\n '# Generate plan only',\n 'kb commit:generate',\n '',\n '# Apply current plan',\n 'kb commit:apply',\n '',\n '# View current plan',\n 'kb commit:open',\n '',\n '# Reset current plan',\n 'kb commit:reset',\n '',\n '# Push commits',\n 'kb commit:push',\n '```',\n '',\n 'Re-run `kb commit setup --force` to regenerate defaults.',\n ].join('\\n') + '\\n',\n description: 'README for commit plugin workspace',\n },\n ],\n\n config: [\n {\n pointer: 'plugins.commit',\n value: defaultCommitConfig,\n },\n ],\n\n scripts: [\n {\n name: 'commit',\n command: 'kb commit',\n description: 'Generate and apply commits',\n },\n {\n name: 'commit:generate',\n command: 'kb commit:generate',\n description: 'Generate commit plan from changes',\n },\n ],\n\n gitignore: [\n '.kb/commit/current/',\n '.kb/commit/history/',\n ],\n\n notes: [\n 'Run `kb commit` to analyze changes and generate commit plan.',\n 'Set KB_COMMIT_LLM_ENABLED=false to use heuristics only.',\n 'Use `kb commit:open` to view current plan before applying.',\n ],\n};\n\n/**\n * Setup handler function (for manifest registration)\n */\nexport async function run() {\n return {\n message: 'Commit plugin setup completed. Try `kb commit` to generate commits!',\n ...setup,\n };\n}\n\nexport default run;\n","/**\n * KB Labs Commit Plugin - 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 * - All imports from @kb-labs/sdk\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n} from '@kb-labs/sdk';\nimport {\n COMMIT_ENV_VARS,\n COMMIT_BASE_PATH,\n COMMIT_ROUTES,\n COMMIT_CACHE_PREFIX,\n} from '@kb-labs/commit-contracts';\nimport {\n runFlags,\n generateFlags,\n applyFlags,\n pushFlags,\n jsonOnlyFlags,\n emptyFlags,\n} from './cli/commands/flags';\n\n/**\n * Build permissions using presets:\n * - gitWorkflow: HOME, USER, GIT_*, SSH_* for git operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - Custom: COMMIT_ENV_VARS, quotas, platform services (llm, cache)\n *\n * Note: LLM access goes through platform services, no direct API keys needed.\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .withEnv([...COMMIT_ENV_VARS])\n .withFs({\n mode: 'readWrite',\n allow: ['.kb/commit/**'],\n })\n .withPlatform({\n llm: true, // Full LLM access for commit generation\n cache: [COMMIT_CACHE_PREFIX], // Cache namespace prefix from contracts\n analytics: true, // Track commit generation events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for LLM\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/commit',\n version: '0.1.0',\n configSection: 'commit',\n\n display: {\n name: 'Commit Generator',\n description: 'AI-powered conventional commit generation',\n tags: ['commit', 'git', 'ai', 'conventional-commits'],\n },\n\n // Platform requirements (LLM is optional but preferred)\n platform: {\n requires: ['storage', 'cache'],\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // TODO: Implement V3 setup handler\n // Setup temporarily disabled during migration - needs proper V3 implementation\n // setup: {\n // handler: './lifecycle/setup.js#default',\n // handlerPath: './lifecycle/setup.js',\n // describe: 'Initialize .kb/commit/ directory structure.',\n // permissions: permissions.combine(\n // permissions.presets.pluginWorkspace('commit'),\n // {\n // quotas: { timeoutMs: 10000, memoryMb: 128, cpuMs: 3000 },\n // }\n // ),\n // },\n\n // V3: cli wrapper with commands array\n cli: {\n groupMeta: [\n {\n path: 'commit',\n describe: 'AI-powered conventional commit generation.',\n },\n ],\n commands: [\n // Main command: commit (default flow)\n {\n path: 'commit',\n category: 'Pipeline',\n describe: 'Generate and apply commits (default flow).',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes changes, generates commit plan with LLM, applies commits locally. ' +\n 'Use --dry-run to preview without applying, --with-push to push after applying.',\n\n // ✅ V3: handler with #default suffix\n handler: './cli/commands/run.js#default',\n\n flags: defineCommandFlags(runFlags),\n\n examples: [\n 'kb commit commit',\n 'kb commit commit --dry-run',\n 'kb commit commit --with-push',\n 'kb commit commit --scope \"src/components/**\"',\n ],\n },\n\n // commit:generate - Generate commit plan\n {\n path: 'commit generate',\n category: 'Pipeline',\n describe: 'Generate commit plan from git changes.',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes staged and unstaged changes using git diff, then uses LLM to group ' +\n 'related changes and generate conventional commit messages.',\n\n handler: './cli/commands/generate.js#default',\n\n flags: defineCommandFlags(generateFlags),\n\n examples: [\n 'kb commit generate',\n 'kb commit generate --json',\n 'kb commit generate --scope \"packages/**\"',\n ],\n },\n\n // commit:apply - Apply commit plan\n {\n path: 'commit apply',\n category: 'Pipeline',\n describe: 'Apply current commit plan (create local commits).',\n operationType: 'mutate' as const,\n longDescription:\n 'Creates git commits according to the current plan. Checks for staleness ' +\n '(working tree changes since plan generation) unless --force is used.',\n\n handler: './cli/commands/apply.js#default',\n\n flags: defineCommandFlags(applyFlags),\n\n examples: [\n 'kb commit apply',\n 'kb commit apply --force',\n ],\n },\n\n // commit:push - Push commits\n {\n path: 'commit push',\n category: 'Pipeline',\n describe: 'Push commits to remote repository.',\n operationType: 'execute' as const,\n longDescription:\n 'Pushes local commits to the remote. Refuses force push to protected branches ' +\n '(main, master) by default.',\n\n handler: './cli/commands/push.js#default',\n\n flags: defineCommandFlags(pushFlags),\n\n examples: [\n 'kb commit push',\n ],\n },\n\n // commit:open - Show current plan\n {\n path: 'commit open',\n category: 'Plan',\n describe: 'Show current commit plan.',\n operationType: 'read' as const,\n longDescription: 'Displays the current commit plan if one exists.',\n\n handler: './cli/commands/open.js#default',\n\n flags: defineCommandFlags(jsonOnlyFlags),\n\n examples: [\n 'kb commit open',\n 'kb commit open --json',\n ],\n },\n\n // commit:reset - Clear current plan\n {\n path: 'commit reset',\n category: 'Plan',\n describe: 'Clear current commit plan.',\n operationType: 'mutate' as const,\n longDescription: 'Removes the current commit plan from storage.',\n\n handler: './cli/commands/reset.js#default',\n\n flags: defineCommandFlags(emptyFlags),\n\n examples: [\n 'kb commit reset',\n ],\n },\n ],\n },\n\n capabilities: [],\n\n // ✅ V3: Manifest-first permissions using composable presets\n permissions: pluginPermissions,\n\n // REST API routes (inherit permissions from manifest)\n rest: {\n basePath: COMMIT_BASE_PATH,\n routes: [\n // GET /scopes\n {\n method: 'GET',\n path: COMMIT_ROUTES.SCOPES,\n handler: './rest/handlers/scopes-handler.js#default',\n output: {\n zod: '@kb-labs/sdk#SelectDataSchema',\n },\n },\n // GET /status\n {\n method: 'GET',\n path: COMMIT_ROUTES.STATUS,\n handler: './rest/handlers/status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#StatusResponseSchema',\n },\n },\n // POST /generate\n {\n method: 'POST',\n path: COMMIT_ROUTES.GENERATE,\n handler: './rest/handlers/generate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#GenerateRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#GenerateResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n // GET /plan\n {\n method: 'GET',\n path: COMMIT_ROUTES.PLAN,\n handler: './rest/handlers/plan-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#PlanResponseSchema',\n },\n },\n // POST /apply\n {\n method: 'POST',\n path: COMMIT_ROUTES.APPLY,\n handler: './rest/handlers/apply-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#ApplyRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#ApplyResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post hooks\n },\n // POST /push\n {\n method: 'POST',\n path: COMMIT_ROUTES.PUSH,\n handler: './rest/handlers/push-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PushRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PushResponseSchema',\n },\n timeoutMs: 600000, // 10 min for pre/post push hooks\n },\n // DELETE /plan\n {\n method: 'DELETE',\n path: COMMIT_ROUTES.RESET,\n handler: './rest/handlers/reset-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ResetResponseSchema',\n },\n },\n // GET /git-status\n {\n method: 'GET',\n path: COMMIT_ROUTES.GIT_STATUS,\n handler: './rest/handlers/git-status-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#GitStatusResponseSchema',\n },\n },\n // GET /files\n {\n method: 'GET',\n path: COMMIT_ROUTES.FILES,\n handler: './rest/handlers/files-handler.js#default',\n },\n // GET /diff\n {\n method: 'GET',\n path: COMMIT_ROUTES.DIFF,\n handler: './rest/handlers/diff-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#FileDiffResponseSchema',\n },\n },\n // POST /summarize\n {\n method: 'POST',\n path: COMMIT_ROUTES.SUMMARIZE,\n handler: './rest/handlers/summarize-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#SummarizeRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#SummarizeResponseSchema',\n },\n },\n // GET /actions\n {\n method: 'GET',\n path: COMMIT_ROUTES.ACTIONS,\n handler: './rest/handlers/actions-handler.js#default',\n output: {\n zod: '@kb-labs/commit-contracts#ActionsResponseSchema',\n },\n },\n // PATCH /plan — edit a single commit in the plan\n {\n method: 'PATCH',\n path: COMMIT_ROUTES.PATCH_PLAN,\n handler: './rest/handlers/patch-plan-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#PatchPlanRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#PatchPlanResponseSchema',\n },\n },\n // POST /regenerate-commit — regenerate a single commit with LLM\n {\n method: 'POST',\n path: COMMIT_ROUTES.REGENERATE_COMMIT,\n handler: './rest/handlers/regenerate-handler.js#default',\n input: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitRequestSchema',\n },\n output: {\n zod: '@kb-labs/commit-contracts#RegenerateCommitResponseSchema',\n },\n timeoutMs: 300000, // 5 minutes for LLM analysis\n },\n ],\n },\n\n // Studio V2 — Module Federation pages\n studio: {\n version: 2 as const,\n remoteName: 'commitPlugin',\n pages: [\n {\n id: 'commit.overview',\n title: 'Commit',\n icon: 'GitlabOutlined',\n route: '/p/commit',\n entry: './CommitOverview',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'commit',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: 'commit.overview',\n order: 30,\n },\n ],\n },\n\n // Legacy V1 studio widgets (deleted)\n /*\n _legacy_studio: {\n widgets: [\n // Workspace Selector\n {\n id: 'commit.workspace-selector',\n kind: 'select',\n title: 'Select Scope',\n description: 'Choose monorepo package or repository',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.SCOPES,\n method: 'GET',\n },\n },\n options: {\n searchable: true,\n placeholder: 'Select scope...',\n },\n events: {\n emit: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n payloadMap: { scope: 'value' }, // Maps selected value to payload.scope\n }],\n },\n layoutHint: { w: 6, h: 1, minH: 1 },\n order: 0,\n },\n // Status Metrics\n {\n id: 'commit.status',\n kind: 'metric-group',\n title: 'Commit Status',\n description: 'Current plan and git status',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.STATUS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' }, // Maps payload.workspace to params.workspace\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 2, minH: 2 },\n order: 1,\n },\n // Plan Viewer (child of commit.plan-section)\n {\n id: 'commit.plan-viewer',\n kind: 'cardlist',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PLAN,\n method: 'GET',\n },\n },\n options: {\n layout: 'list',\n emptyMessage: 'No plan. Click Generate Plan to create commits.',\n },\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n {\n name: COMMIT_EVENTS.PLAN_GENERATED,\n // When plan is generated, update widget data with cards\n // No paramsMap - use entire payload as widget data\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n order: 2,\n },\n // Git Files Table (child of commit.files-section)\n {\n id: 'commit.git-files',\n kind: 'table',\n title: '', // Title shown in parent section\n description: '',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.FILES,\n method: 'GET',\n },\n },\n options: {\n columns: [\n {\n id: 'path',\n label: 'File',\n sortable: true,\n width: '60%',\n },\n {\n id: 'status',\n label: 'Status',\n sortable: true,\n width: 80,\n },\n {\n id: 'changes',\n label: 'Changes',\n sortable: false,\n width: 120,\n },\n ],\n pagination: false,\n rowSelection: false,\n size: 'small',\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n order: 3,\n },\n // Quick Actions Widget\n {\n id: 'commit.actions',\n kind: 'card',\n title: 'Quick Actions',\n description: 'Common commit workflow actions',\n data: {\n source: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.ACTIONS,\n method: 'GET',\n },\n },\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n onSuccess: {\n emitEvent: COMMIT_EVENTS.PLAN_GENERATED,\n // Response data will be used as payload (contains plan + workspace)\n },\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n bodyMap: { scope: 'scope' },\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n ],\n layoutHint: { w: 6, h: 3, minH: 2 },\n order: 6,\n },\n // Files Section (collapsible, GitLab-style)\n {\n id: 'commit.files-section',\n kind: 'section',\n title: 'Changed Files',\n description: 'Files with uncommitted changes',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FolderOutlined',\n showDivider: true,\n },\n children: ['commit.git-files'],\n events: {\n subscribe: [{\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n }],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 4,\n },\n // Plan Section (collapsible, GitLab-style)\n {\n id: 'commit.plan-section',\n kind: 'section',\n title: 'Commit Plan',\n description: 'Generated commits ready to apply',\n data: {\n source: { type: 'static' }, // Sections use static source (no data)\n },\n options: {\n collapsible: true,\n defaultExpanded: true,\n variant: 'bordered',\n icon: 'FileTextOutlined',\n showDivider: true,\n },\n children: ['commit.plan-viewer'],\n events: {\n subscribe: [\n {\n name: COMMIT_EVENTS.SCOPE_CHANGED,\n paramsMap: { scope: 'scope' },\n },\n COMMIT_EVENTS.FORM_SUBMITTED,\n ],\n },\n layoutHint: { w: 6, h: 8, minH: 4 },\n order: 5,\n },\n ],\n // Studio menus\n menus: [\n {\n id: 'commit-menu',\n label: 'Commit',\n icon: 'GitlabOutlined',\n target: '/plugins/commit/overview',\n order: 0,\n },\n {\n id: 'commit-overview',\n label: 'Overview',\n icon: 'DashboardOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/overview',\n order: 1,\n },\n {\n id: 'commit-plan',\n label: 'Plan',\n icon: 'UnorderedListOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/plan',\n order: 2,\n },\n {\n id: 'commit-files',\n label: 'Files',\n icon: 'FileTextOutlined',\n parentId: 'commit-menu',\n target: '/plugins/commit/files',\n order: 3,\n },\n ],\n // Studio layouts\n layouts: [\n // Overview page - Quick status and actions\n {\n id: 'commit.overview',\n kind: 'grid',\n title: 'Overview',\n description: 'Workspace status and quick actions',\n icon: 'home',\n widgets: [\n 'commit.workspace-selector',\n 'commit.status',\n 'commit.actions',\n 'commit.plan-section', // Show plan section on overview too\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 1,\n },\n // Plan page - GitLab-style commit plan view\n {\n id: 'commit.plan',\n kind: 'grid',\n title: 'Commit Plan',\n description: 'Review and manage generated commits',\n icon: 'list',\n widgets: [\n 'commit.workspace-selector',\n 'commit.files-section',\n 'commit.plan-section',\n ],\n actions: [\n {\n id: 'generate',\n label: 'Generate Plan',\n icon: 'ThunderboltOutlined',\n variant: 'primary',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.GENERATE,\n method: 'POST',\n },\n },\n {\n id: 'apply',\n label: 'Apply Commits',\n icon: 'CheckOutlined',\n variant: 'default',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.APPLY,\n method: 'POST',\n },\n confirm: {\n title: 'Apply Commits',\n description: 'This will create git commits according to the plan. Continue?',\n confirmLabel: 'Apply',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'push',\n label: 'Push',\n icon: 'UploadOutlined',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.PUSH,\n method: 'POST',\n },\n confirm: {\n title: 'Push to Remote',\n description: 'This will push commits to the remote repository. Continue?',\n confirmLabel: 'Push',\n cancelLabel: 'Cancel',\n },\n },\n {\n id: 'reset',\n label: 'Reset Plan',\n icon: 'DeleteOutlined',\n variant: 'danger',\n handler: {\n type: 'rest',\n routeId: COMMIT_WIDGET_ROUTES.RESET,\n method: 'DELETE',\n },\n confirm: {\n title: 'Reset Plan',\n description: 'This will delete the current commit plan. This action cannot be undone.',\n confirmLabel: 'Delete',\n cancelLabel: 'Cancel',\n },\n },\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 2,\n },\n // Files page - Changed files table\n {\n id: 'commit.files',\n kind: 'grid',\n title: 'Changed Files',\n description: 'Git status and modified files',\n icon: 'file',\n widgets: [\n 'commit.workspace-selector',\n 'commit.git-files',\n ],\n config: {\n cols: 6,\n gap: 16,\n },\n order: 3,\n },\n ],\n },\n */\n\n // Artifacts\n artifacts: [\n {\n id: 'commit.plan.json',\n pathTemplate: '.kb/commit/current/plan.json',\n description: 'Current commit plan.',\n },\n {\n id: 'commit.status.json',\n pathTemplate: '.kb/commit/current/status.json',\n description: 'Git status snapshot at plan generation time.',\n },\n ],\n};\n\nexport default manifest;\n"]}