@kb-labs/commit-entry 2.94.0 → 2.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/cli/commands/apply.js +10 -5
  2. package/dist/cli/commands/apply.js.map +1 -1
  3. package/dist/cli/commands/generate.d.ts +1 -1
  4. package/dist/cli/commands/generate.js +23 -10
  5. package/dist/cli/commands/generate.js.map +1 -1
  6. package/dist/cli/commands/open.d.ts +1 -1
  7. package/dist/cli/commands/open.js +8 -2
  8. package/dist/cli/commands/open.js.map +1 -1
  9. package/dist/cli/commands/push.js +9 -4
  10. package/dist/cli/commands/push.js.map +1 -1
  11. package/dist/cli/commands/reset.js +14 -2
  12. package/dist/cli/commands/reset.js.map +1 -1
  13. package/dist/cli/commands/run.d.ts +3 -6
  14. package/dist/cli/commands/run.js +75 -82
  15. package/dist/cli/commands/run.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.js +25 -19
  18. package/dist/index.js.map +1 -1
  19. package/dist/manifest.d.ts +45 -7
  20. package/dist/manifest.js +25 -19
  21. package/dist/manifest.js.map +1 -1
  22. package/dist/rest/handlers/actions-handler.js +9 -5
  23. package/dist/rest/handlers/actions-handler.js.map +1 -1
  24. package/dist/rest/handlers/apply-handler.js +2 -2
  25. package/dist/rest/handlers/apply-handler.js.map +1 -1
  26. package/dist/rest/handlers/diff-handler.d.ts +2 -2
  27. package/dist/rest/handlers/diff-handler.js +2 -2
  28. package/dist/rest/handlers/diff-handler.js.map +1 -1
  29. package/dist/rest/handlers/files-handler.js +2 -2
  30. package/dist/rest/handlers/files-handler.js.map +1 -1
  31. package/dist/rest/handlers/generate-handler.d.ts +2 -2
  32. package/dist/rest/handlers/generate-handler.js +2 -2
  33. package/dist/rest/handlers/generate-handler.js.map +1 -1
  34. package/dist/rest/handlers/git-status-handler.js +2 -2
  35. package/dist/rest/handlers/git-status-handler.js.map +1 -1
  36. package/dist/rest/handlers/patch-plan-handler.js +40 -36
  37. package/dist/rest/handlers/patch-plan-handler.js.map +1 -1
  38. package/dist/rest/handlers/plan-handler.d.ts +1 -1
  39. package/dist/rest/handlers/plan-handler.js +2 -5
  40. package/dist/rest/handlers/plan-handler.js.map +1 -1
  41. package/dist/rest/handlers/push-handler.js +2 -2
  42. package/dist/rest/handlers/push-handler.js.map +1 -1
  43. package/dist/rest/handlers/regenerate-handler.d.ts +1 -1
  44. package/dist/rest/handlers/regenerate-handler.js +2 -2
  45. package/dist/rest/handlers/regenerate-handler.js.map +1 -1
  46. package/dist/rest/handlers/reset-handler.d.ts +1 -1
  47. package/dist/rest/handlers/reset-handler.js +2 -6
  48. package/dist/rest/handlers/reset-handler.js.map +1 -1
  49. package/dist/rest/handlers/scopes-handler.js +17 -13
  50. package/dist/rest/handlers/scopes-handler.js.map +1 -1
  51. package/dist/rest/handlers/status-handler.js +2 -9
  52. package/dist/rest/handlers/status-handler.js.map +1 -1
  53. package/dist/rest/handlers/summarize-handler.d.ts +1 -1
  54. package/dist/rest/handlers/summarize-handler.js +2 -2
  55. package/dist/rest/handlers/summarize-handler.js.map +1 -1
  56. package/dist/widgets/117.js +24 -1
  57. package/dist/widgets/117.js.map +1 -1
  58. package/dist/widgets/370.js +1 -1
  59. package/dist/widgets/370.js.map +1 -1
  60. package/dist/widgets/62.js +97 -0
  61. package/dist/widgets/62.js.map +1 -0
  62. package/dist/widgets/__federation_expose_CommitOverview.js +1 -1
  63. package/dist/widgets/__federation_expose_CommitOverview.js.map +1 -1
  64. package/dist/widgets/mf-manifest.json +27 -27
  65. package/dist/widgets/mf-stats.json +27 -27
  66. package/dist/widgets/remoteEntry.js +2 -2
  67. package/dist/widgets/remoteEntry.js.map +1 -1
  68. package/package.json +7 -6
  69. package/dist/widgets/418.js +0 -39
  70. package/dist/widgets/418.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { defineCommand, findRepoRoot, useConfig, useLoader } from '@kb-labs/sdk';
1
+ import { defineCommand, findRepoRoot, useConfig, useLoader, validationError } from '@kb-labs/sdk';
2
2
  import { loadPlan, applyCommitPlan, saveToHistory, clearPlan } from '@kb-labs/commit-core';
3
3
  import { resolveCommitConfig } from '@kb-labs/commit-contracts';
4
4
  import * as path from 'path';
@@ -15,6 +15,13 @@ var apply_default = defineCommand({
15
15
  id: "commit:apply",
16
16
  description: "Apply current commit plan",
17
17
  handler: {
18
+ async intent(_ctx, input) {
19
+ const scope = input.scope ?? "root";
20
+ return {
21
+ summary: `Apply current commit plan (scope: "${scope}")`,
22
+ operations: [{ type: "create", resource: "git-commits", details: { scope } }]
23
+ };
24
+ },
18
25
  async execute(ctx, input) {
19
26
  const startTime = Date.now();
20
27
  const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
@@ -27,10 +34,8 @@ var apply_default = defineCommand({
27
34
  const plan = await loadPlan(cwd, scope);
28
35
  if (!plan) {
29
36
  loadLoader.fail("No commit plan found");
30
- ctx.ui?.error?.("Run `kb commit:generate` first.");
31
- return {
32
- exitCode: 1
33
- };
37
+ validationError(ctx, "No commit plan found", "Run `kb commit:generate` first", input.json);
38
+ return { exitCode: 1 };
34
39
  }
35
40
  if (plan.commits.length === 0) {
36
41
  loadLoader.stop();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/cli/commands/apply.ts"],"names":[],"mappings":";;;;;;AAaO,SAAS,gBAAA,CACd,OAAA,EACA,OAAA,GAAkB,MAAA,EAClB,MAAA,EACQ;AACR,EAAA,MAAM,WAAW,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,QAAA,EAAU,IAAA,KAAS,OAAA,KAAY,SAAS,GAAA,GAAM,OAAA,CAAA;AACnE,EAAA,OAAO,YAAA,KAAiB,GAAA,GAAM,OAAA,GAAe,IAAA,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AACzE;;;ACOA,IAAO,gBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,cAAA;AAAA,EACJ,WAAA,EAAa,2BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,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;AAC7B,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAuC;AAChE,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,UAAA,IAAc,EAAE,CAAA;AACnD,MAAA,MAAM,WAAW,gBAAA,CAAiB,GAAA,EAAK,KAAA,EAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAGlE,MAAA,MAAM,UAAA,GAAa,UAAU,wBAAwB,CAAA;AACrD,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAA,EAAK,KAAK,CAAA;AAEtC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,UAAA,CAAW,KAAK,sBAAsB,CAAA;AACtC,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,iCAAiC,CAAA;AACjD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC7B,QAAA,UAAA,CAAW,IAAA,EAAK;AAChB,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,yCAAyC,CAAA;AACxD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,CAAA;AAAA,UACV,MAAA,EAAQ;AAAA,YACN,OAAA,EAAS,IAAA;AAAA,YACT,SAAS,EAAC;AAAA,YACV,QAAQ;AAAC,WACX;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AACvB,SACF;AAAA,MACF;AACA,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAA,iBAAA,EAAoB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,UAAA,CAAY,CAAA;AAGtE,MAAA,MAAM,cAAc,SAAA,CAAU,CAAA,SAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,aAAA,CAAe,CAAA;AAC5E,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,QAAA,EAAU,IAAA,EAAM;AAAA,QACnD,OAAO,KAAA,CAAM;AAAA,OACd,CAAA;AAGD,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,aAAA,CAAc,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA;AAC5C,QAAA,MAAM,SAAA,CAAU,KAAK,KAAK,CAAA;AAC1B,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAA,QAAA,EAAW,MAAA,CAAO,cAAA,CAAe,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAAA,MACtF,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,KAAK,yBAAyB,CAAA;AAAA,MAC5C;AAGA,MAAA,MAAM,MAAA,GAAsB;AAAA,QAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,OAAA,EAAS,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACzC,IAAI,CAAA,CAAE,OAAA;AAAA,UACN,KAAK,CAAA,CAAE,GAAA;AAAA,UACP,SAAS,CAAA,CAAE;AAAA,SACb,CAAE,CAAA;AAAA,QACF,QAAQ,MAAA,CAAO;AAAA,OACjB;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,MAAM,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,IAAI,OAAO,OAAA,EAAS;AAElB,UAAA,MAAM,YAAA,GAAe,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,KAAW;AACzD,YAAA,OAAO,CAAA,EAAG,OAAO,GAAA,CAAI,SAAA,CAAU,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,UACxD,CAAC,CAAA;AAED,UAAA,MAAM,WAAwD,EAAC;AAE/D,UAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,YAAA,QAAA,CAAS,IAAA,CAAK;AAAA,cACZ,MAAA,EAAQ,iBAAA;AAAA,cACR,KAAA,EAAO;AAAA,aACR,CAAA;AAAA,UACH;AAEA,UAAA,MAAM,YAAA,GAAyB;AAAA,YAC7B,CAAA,eAAA,EAAkB,MAAA,CAAO,cAAA,CAAe,MAAM,CAAA,CAAA;AAAA,YAC9C;AAAA,WACF;AAEA,UAAA,QAAA,CAAS,OAAA,CAAQ;AAAA,YACf,MAAA,EAAQ,SAAA;AAAA,YACR,KAAA,EAAO;AAAA,WACR,CAAA;AAED,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE5B,UAAA,GAAA,CAAI,EAAA,EAAI,UAAU,8BAAA,EAAgC;AAAA,YAChD,KAAA,EAAO,mBAAA;AAAA,YACP,QAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,UAAU,KAAK,CAAA;AACrD,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE5B,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,yBAAA,EAA2B;AAAA,YACzC,KAAA,EAAO,mBAAA;AAAA,YACP,QAAA,EAAU;AAAA,cACR;AAAA,gBACE,MAAA,EAAQ,SAAA;AAAA,gBACR,OAAO,CAAC,CAAA,cAAA,EAAiB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE;AAAA,eACjD;AAAA,cACA;AAAA,gBACE,MAAA,EAAQ,QAAA;AAAA,gBACR,KAAA,EAAO;AAAA;AACT,aACF;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,MAAA,CAAO,OAAA,GAAU,CAAA,GAAI,CAAA;AAAA,QAC/B,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AACvB,OACF;AAAA,IACF;AAAA;AAEJ,CAAC","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, type PluginContextV3 } 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 = {\n exitCode: number;\n result?: ApplyOutput;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'commit:apply',\n description: 'Apply current commit plan',\n\n handler: {\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 ctx.ui?.error?.('Run `kb commit:generate` first.');\n return {\n exitCode: 1,\n };\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 exitCode: 0,\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 {\n exitCode: result.success ? 0 : 1,\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/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 {\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 = {\n exitCode: number;\n result?: ApplyOutput;\n meta?: Record<string, unknown>;\n};\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 { exitCode: 1 };\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 exitCode: 0,\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 {\n exitCode: result.success ? 0 : 1,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
@@ -19,7 +19,7 @@ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, an
19
19
  type: "feat" | "fix" | "refactor" | "chore" | "docs" | "test" | "build" | "ci" | "perf";
20
20
  id: string;
21
21
  files: string[];
22
- releaseHint: "minor" | "none" | "patch" | "major";
22
+ releaseHint: "none" | "patch" | "minor" | "major";
23
23
  breaking: boolean;
24
24
  scope?: string | undefined;
25
25
  body?: string | undefined;
@@ -1,4 +1,4 @@
1
- import { defineCommand, useLLM, findRepoRoot, useConfig, useLoader, displayArtifacts } from '@kb-labs/sdk';
1
+ import { defineCommand, useLLM, findRepoRoot, useConfig, useLoader, handleError, displayArtifacts } from '@kb-labs/sdk';
2
2
  import { stat } from 'fs/promises';
3
3
  import { getGitStatus, hasChanges, generateCommitPlan, savePlan, getCurrentPlanPath } from '@kb-labs/commit-core';
4
4
  import { commitEnv, resolveCommitConfig } from '@kb-labs/commit-contracts';
@@ -52,17 +52,30 @@ var generate_default = defineCommand({
52
52
  tokensUsed: result.usage ? result.usage.promptTokens + result.usage.completionTokens : void 0
53
53
  };
54
54
  } : void 0;
55
- const plan = await generateCommitPlan({
56
- cwd: scopeCwd,
57
- llmComplete,
58
- config,
59
- allowSecrets,
60
- autoConfirm,
61
- onProgress: (message) => analyzeLoader.update({ text: message })
62
- });
55
+ let plan;
56
+ try {
57
+ plan = await generateCommitPlan({
58
+ cwd: scopeCwd,
59
+ llmComplete,
60
+ config,
61
+ allowSecrets,
62
+ autoConfirm,
63
+ onProgress: (message) => analyzeLoader.update({ text: message })
64
+ });
65
+ } catch (err) {
66
+ analyzeLoader.fail("Failed to generate commit plan");
67
+ handleError(ctx, err, input.json);
68
+ return { exitCode: 1 };
69
+ }
63
70
  const saveLoader = useLoader("Saving plan...");
64
71
  saveLoader.start();
65
- await savePlan(cwd, plan, effectiveScope);
72
+ try {
73
+ await savePlan(cwd, plan, effectiveScope);
74
+ } catch (err) {
75
+ saveLoader.fail("Failed to save plan");
76
+ handleError(ctx, err, input.json);
77
+ return { exitCode: 1 };
78
+ }
66
79
  const planPath = getCurrentPlanPath(cwd, effectiveScope);
67
80
  saveLoader.succeed("Plan saved");
68
81
  analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);
@@ -1 +1 @@
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 type PluginContextV3,\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 = {\n exitCode: number;\n result?: GenerateOutput;\n meta?: Record<string, unknown>;\n};\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 {\n exitCode: 1,\n };\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 const plan = await generateCommitPlan({\n cwd: scopeCwd,\n llmComplete,\n config,\n allowSecrets,\n autoConfirm,\n onProgress: (message) => analyzeLoader.update({ text: message }),\n });\n\n // Save plan\n const saveLoader = useLoader('Saving plan...');\n saveLoader.start();\n await savePlan(cwd, plan, effectiveScope);\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 exitCode: 0,\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 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 = {\n exitCode: number;\n result?: GenerateOutput;\n meta?: Record<string, unknown>;\n};\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 {\n exitCode: 1,\n };\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 { exitCode: 1 };\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 { exitCode: 1 };\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 exitCode: 0,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
@@ -24,7 +24,7 @@ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, Op
24
24
  type: "feat" | "fix" | "refactor" | "chore" | "docs" | "test" | "build" | "ci" | "perf";
25
25
  id: string;
26
26
  files: string[];
27
- releaseHint: "minor" | "none" | "patch" | "major";
27
+ releaseHint: "none" | "patch" | "minor" | "major";
28
28
  breaking: boolean;
29
29
  scope?: string | undefined;
30
30
  body?: string | undefined;
@@ -1,4 +1,4 @@
1
- import { defineCommand, findRepoRoot } from '@kb-labs/sdk';
1
+ import { defineCommand, findRepoRoot, handleError } from '@kb-labs/sdk';
2
2
  import { loadPlan, getCurrentPlanPath, formatCommitMessage } from '@kb-labs/commit-core';
3
3
 
4
4
  // src/cli/commands/open.ts
@@ -10,7 +10,13 @@ var open_default = defineCommand({
10
10
  const startTime = Date.now();
11
11
  const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
12
12
  const scope = input.scope ?? "root";
13
- const plan = await loadPlan(cwd, scope);
13
+ let plan;
14
+ try {
15
+ plan = await loadPlan(cwd, scope);
16
+ } catch (err) {
17
+ handleError(ctx, err, input.json);
18
+ return { exitCode: 1 };
19
+ }
14
20
  const planPath = getCurrentPlanPath(cwd, scope);
15
21
  const output = {
16
22
  hasPlan: plan !== null,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/open.ts"],"names":[],"mappings":"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","file":"open.js","sourcesContent":["/**\n * commit:open command\n * Show current commit plan\n */\n\nimport { defineCommand, findRepoRoot, type PluginContextV3 } from '@kb-labs/sdk';\nimport { loadPlan, getCurrentPlanPath, formatCommitMessage } from '@kb-labs/commit-core';\nimport type { OpenOutput } from '@kb-labs/commit-contracts';\n\ntype OpenInput = {\n json?: boolean;\n scope?: string;\n};\n\ntype OpenResult = {\n exitCode: number;\n result?: OpenOutput;\n meta?: Record<string, unknown>;\n};\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 const plan = await loadPlan(cwd, scope);\n const planPath = getCurrentPlanPath(cwd, scope);\n\n // Output\n const output: OpenOutput = {\n hasPlan: plan !== null,\n plan: plan ?? undefined,\n planPath: plan ? planPath : undefined,\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 // 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 ];\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 exitCode: 0,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/open.ts"],"names":[],"mappings":"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","file":"open.js","sourcesContent":["/**\n * commit:open command\n * Show current commit plan\n */\n\nimport { defineCommand, findRepoRoot, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport { loadPlan, getCurrentPlanPath, formatCommitMessage } from '@kb-labs/commit-core';\nimport type { OpenOutput } from '@kb-labs/commit-contracts';\n\ntype OpenInput = {\n json?: boolean;\n scope?: string;\n};\n\ntype OpenResult = {\n exitCode: number;\n result?: OpenOutput;\n meta?: Record<string, unknown>;\n};\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 { exitCode: 1 };\n }\n const planPath = getCurrentPlanPath(cwd, scope);\n\n // Output\n const output: OpenOutput = {\n hasPlan: plan !== null,\n plan: plan ?? undefined,\n planPath: plan ? planPath : undefined,\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 // 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 ];\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 exitCode: 0,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
@@ -1,4 +1,4 @@
1
- import { defineCommand, findRepoRoot, useLoader } from '@kb-labs/sdk';
1
+ import { defineCommand, findRepoRoot, useLoader, handleError } from '@kb-labs/sdk';
2
2
  import { pushCommits } from '@kb-labs/commit-core';
3
3
 
4
4
  // src/cli/commands/push.ts
@@ -11,9 +11,14 @@ var push_default = defineCommand({
11
11
  const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
12
12
  const pushLoader = useLoader("Pushing commits...");
13
13
  pushLoader.start();
14
- const result = await pushCommits(cwd, {
15
- force: input.force
16
- });
14
+ let result;
15
+ try {
16
+ result = await pushCommits(cwd, { force: input.force });
17
+ } catch (err) {
18
+ pushLoader.fail("Push failed");
19
+ handleError(ctx, err, input.json);
20
+ return { exitCode: 1 };
21
+ }
17
22
  const output = {
18
23
  success: result.success,
19
24
  remote: result.remote,
@@ -1 +1 @@
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, type PluginContextV3 } 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 = {\n exitCode: number;\n result?: PushOutput;\n meta?: Record<string, unknown>;\n};\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 const result = await pushCommits(cwd, {\n force: input.force,\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 {\n exitCode: result.success ? 0 : 1,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\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 { 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 = {\n exitCode: number;\n result?: PushOutput;\n meta?: Record<string, unknown>;\n};\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 { exitCode: 1 };\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 {\n exitCode: result.success ? 0 : 1,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
@@ -1,4 +1,4 @@
1
- import { defineCommand, findRepoRoot } from '@kb-labs/sdk';
1
+ import { defineCommand, findRepoRoot, handleError } from '@kb-labs/sdk';
2
2
  import { hasPlan, clearPlan } from '@kb-labs/commit-core';
3
3
 
4
4
  // src/cli/commands/reset.ts
@@ -6,6 +6,13 @@ var reset_default = defineCommand({
6
6
  id: "commit:reset",
7
7
  description: "Clear current commit plan",
8
8
  handler: {
9
+ async intent(_ctx, input) {
10
+ const scope = input.scope ?? "root";
11
+ return {
12
+ summary: `Clear commit plan (scope: "${scope}")`,
13
+ operations: [{ type: "delete", resource: "commit-plan", details: { scope } }]
14
+ };
15
+ },
9
16
  async execute(ctx, input) {
10
17
  const startTime = Date.now();
11
18
  const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
@@ -24,7 +31,12 @@ var reset_default = defineCommand({
24
31
  }
25
32
  };
26
33
  }
27
- await clearPlan(cwd, scope);
34
+ try {
35
+ await clearPlan(cwd, scope);
36
+ } catch (err) {
37
+ handleError(ctx, err);
38
+ return { exitCode: 1 };
39
+ }
28
40
  ctx.ui?.success?.("Plan Cleared", {
29
41
  sections: [{
30
42
  items: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/reset.ts"],"names":[],"mappings":";;;;AAmBA,IAAO,gBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,cAAA;AAAA,EACJ,WAAA,EAAa,2BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,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,QAAA,EAAU,CAAA;AAAA,UACV,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,MAAM,SAAA,CAAU,KAAK,KAAK,CAAA;AAE1B,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,QAAA,EAAU,CAAA;AAAA,QACV,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, type PluginContextV3 } 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 = {\n exitCode: number;\n result?: ResetOutput;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'commit:reset',\n description: 'Clear current commit plan',\n\n handler: {\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 exitCode: 0,\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 await clearPlan(cwd, scope);\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 exitCode: 0,\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":";;;;AAmBA,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,QAAA,EAAU,CAAA;AAAA,UACV,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,UAAU,CAAA,EAAE;AAAA,MACvB;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,QAAA,EAAU,CAAA;AAAA,QACV,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 { 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 = {\n exitCode: number;\n result?: ResetOutput;\n meta?: Record<string, unknown>;\n};\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 exitCode: 0,\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 { exitCode: 1 };\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 exitCode: 0,\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,10 +1,7 @@
1
1
  import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import { CLIInput } from '@kb-labs/sdk';
2
3
 
3
- /**
4
- * commit command (default flow)
5
- * Generate → Apply → (optional) Push
6
- */
7
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, {
4
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<any>, {
8
5
  commits: {
9
6
  message: string;
10
7
  id: string;
@@ -24,7 +21,7 @@ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, an
24
21
  type: "feat" | "fix" | "refactor" | "chore" | "docs" | "test" | "build" | "ci" | "perf";
25
22
  id: string;
26
23
  files: string[];
27
- releaseHint: "minor" | "none" | "patch" | "major";
24
+ releaseHint: "none" | "patch" | "minor" | "major";
28
25
  breaking: boolean;
29
26
  scope?: string | undefined;
30
27
  body?: string | undefined;
@@ -1,4 +1,4 @@
1
- import { defineCommand, useLLM, findRepoRoot, useConfig, useLoader } from '@kb-labs/sdk';
1
+ import { defineCommand, useLoader, handleError, useLLM, findRepoRoot, useConfig } from '@kb-labs/sdk';
2
2
  import { getGitStatus, hasChanges, generateCommitPlan, savePlan, applyCommitPlan, saveToHistory, clearPlan, pushCommits } from '@kb-labs/commit-core';
3
3
  import { commitEnv, resolveCommitConfig } from '@kb-labs/commit-contracts';
4
4
  import * as path from 'path';
@@ -11,116 +11,110 @@ function resolveScopePath(baseCwd, scopeId = "root", scopes) {
11
11
  }
12
12
 
13
13
  // src/cli/commands/run.ts
14
+ async function resolveContext(ctx, flags) {
15
+ const llm = useLLM();
16
+ const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
17
+ const fileConfig = await useConfig();
18
+ const env = commitEnv.parse(ctx.runtime);
19
+ const config = resolveCommitConfig(fileConfig ?? {}, env);
20
+ const effectiveScope = flags.scope ?? config.scope?.default ?? "root";
21
+ const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);
22
+ const llmComplete = llm && config.llm.enabled ? async (prompt, options) => {
23
+ const result = await llm.complete(prompt, {
24
+ ...options,
25
+ temperature: options?.temperature ?? config.llm.temperature,
26
+ maxTokens: options?.maxTokens ?? config.llm.maxTokens
27
+ });
28
+ return {
29
+ content: result.content,
30
+ tokensUsed: result.usage ? result.usage.promptTokens + result.usage.completionTokens : void 0
31
+ };
32
+ } : void 0;
33
+ return { cwd, config, effectiveScope, scopeCwd, llmComplete };
34
+ }
14
35
  var run_default = defineCommand({
15
36
  id: "commit:commit",
16
37
  description: "Generate and apply commits (default flow)",
17
38
  handler: {
39
+ async intent(ctx, input) {
40
+ const flags = input.flags;
41
+ const { effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);
42
+ const status = await getGitStatus(scopeCwd);
43
+ if (!hasChanges(status)) {
44
+ return {
45
+ summary: "No changes to commit",
46
+ operations: []
47
+ };
48
+ }
49
+ const plan = await generateCommitPlan({
50
+ cwd: scopeCwd,
51
+ llmComplete,
52
+ config,
53
+ allowSecrets: flags["allow-secrets"] ?? false,
54
+ autoConfirm: flags.yes ?? false
55
+ });
56
+ return {
57
+ summary: `Generate and apply ${plan.commits.length} commit(s) in scope "${effectiveScope}"`,
58
+ operations: plan.commits.map((c) => ({
59
+ type: "create",
60
+ resource: "git-commit",
61
+ details: {
62
+ message: `${c.type}${c.scope ? `(${c.scope})` : ""}: ${c.message}`,
63
+ files: c.files.length
64
+ }
65
+ }))
66
+ };
67
+ },
18
68
  async execute(ctx, input) {
19
69
  const startTime = Date.now();
20
- const llm = useLLM();
21
- const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
22
- const fileConfig = await useConfig();
23
- const env = commitEnv.parse(ctx.runtime);
24
- const config = resolveCommitConfig(fileConfig ?? {}, env);
25
- const flags = input.flags ?? input;
26
- const effectiveScope = flags.scope ?? config.scope?.default ?? "root";
27
- const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);
28
- const dryRun = flags["dry-run"] ?? false;
70
+ const flags = input.flags;
71
+ const { cwd, effectiveScope, scopeCwd, llmComplete, config } = await resolveContext(ctx, flags);
29
72
  const withPush = flags["with-push"] ?? false;
30
73
  const outputJson = flags.json ?? false;
31
- const allowSecrets = flags["allow-secrets"] ?? false;
32
- const autoConfirm = flags.yes ?? false;
33
74
  const statusLoader = useLoader("Checking git status...");
34
75
  statusLoader.start();
35
- const status = await getGitStatus(scopeCwd);
76
+ let status;
77
+ try {
78
+ status = await getGitStatus(scopeCwd);
79
+ } catch (err) {
80
+ statusLoader.fail("Failed to check git status");
81
+ handleError(ctx, err, outputJson);
82
+ return { exitCode: 1 };
83
+ }
36
84
  if (!hasChanges(status)) {
37
85
  statusLoader.stop();
38
86
  ctx.ui?.warn?.("No changes to commit");
39
- return {
40
- exitCode: 1
41
- };
87
+ return { exitCode: 1 };
42
88
  }
43
89
  statusLoader.succeed("Git status analyzed");
44
90
  const analyzeLoader = useLoader("Analyzing changes...");
45
91
  analyzeLoader.start();
46
- const llmComplete = llm && config.llm.enabled ? async (prompt, options) => {
47
- const result = await llm.complete(prompt, {
48
- ...options,
49
- temperature: options?.temperature ?? config.llm.temperature,
50
- maxTokens: options?.maxTokens ?? config.llm.maxTokens
51
- });
52
- return {
53
- content: result.content,
54
- tokensUsed: result.usage ? result.usage.promptTokens + result.usage.completionTokens : void 0
55
- };
56
- } : void 0;
57
92
  const plan = await generateCommitPlan({
58
93
  cwd: scopeCwd,
59
94
  llmComplete,
60
95
  config,
61
- allowSecrets,
62
- autoConfirm,
96
+ allowSecrets: flags["allow-secrets"] ?? false,
97
+ autoConfirm: flags.yes ?? false,
63
98
  onProgress: (message) => analyzeLoader.update({ text: message }),
64
99
  onPauseProgress: () => analyzeLoader.stop(),
65
100
  onResumeProgress: () => analyzeLoader.start()
66
101
  });
67
102
  await savePlan(cwd, plan);
68
103
  analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);
69
- if (dryRun) {
70
- const commitsItems = plan.commits.map((commit) => {
71
- const scope = commit.scope ? `(${commit.scope})` : "";
72
- return `${commit.type}${scope}: ${commit.message} [${commit.files.length} file(s)]`;
73
- });
74
- const summaryItems = [
75
- `Files: ${plan.metadata.totalFiles}`,
76
- `Commits: ${plan.metadata.totalCommits}`,
77
- "Mode: Dry Run"
78
- ];
79
- if (plan.metadata.llmUsed) {
80
- const llmPhase = plan.metadata.escalated ? "Phase 2 (with diff)" : "Phase 1";
81
- summaryItems.push(`LLM: ${llmPhase}`);
82
- if (plan.metadata.tokensUsed) {
83
- summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);
84
- }
85
- } else {
86
- summaryItems.push("Generator: Heuristics");
87
- }
88
- const timing = Date.now() - startTime;
89
- ctx.ui?.success?.("Plan generated (no commits created)", {
90
- title: "Git Commit (Dry Run)",
91
- sections: [
92
- { header: "Summary", items: summaryItems },
93
- { header: "Planned Commits", items: commitsItems }
94
- ],
95
- timing
96
- });
97
- return {
98
- exitCode: 0,
99
- result: {
100
- plan,
101
- applied: false,
102
- pushed: false,
103
- commits: plan.commits.map((c) => ({
104
- id: c.id,
105
- message: `${c.type}${c.scope ? `(${c.scope})` : ""}: ${c.message}`
106
- }))
107
- },
108
- meta: {
109
- timing
110
- }
111
- };
112
- }
113
104
  const applyLoader = useLoader("Applying commits...");
114
105
  applyLoader.start();
115
106
  const applyResult = await applyCommitPlan(scopeCwd, plan);
116
107
  if (!applyResult.success) {
117
108
  applyLoader.fail("Failed to apply commits");
118
- for (const error of applyResult.errors) {
119
- ctx.ui?.error?.(` ${error}`);
109
+ if (outputJson) {
110
+ ctx.ui?.json?.({ ok: false, error: { code: "APPLY_FAILED", message: applyResult.errors.join("; ") } });
111
+ } else {
112
+ ctx.ui?.error?.("Failed to apply commits", {
113
+ hint: "Check git status and resolve conflicts manually",
114
+ cause: applyResult.errors.join("; ")
115
+ });
120
116
  }
121
- return {
122
- exitCode: 1
123
- };
117
+ return { exitCode: 1 };
124
118
  }
125
119
  await saveToHistory(cwd, plan, applyResult);
126
120
  await clearPlan(cwd);
@@ -157,7 +151,8 @@ var run_default = defineCommand({
157
151
  });
158
152
  const summaryItems = [
159
153
  `Commits: ${applyResult.appliedCommits.length}`,
160
- `Pushed: ${pushed ? "Yes" : "No"}`
154
+ `Pushed: ${pushed ? "Yes" : "No"}`,
155
+ `Scope: ${effectiveScope}`
161
156
  ];
162
157
  if (plan.metadata.llmUsed) {
163
158
  const llmPhase = plan.metadata.escalated ? "Phase 2" : "Phase 1";
@@ -179,9 +174,7 @@ var run_default = defineCommand({
179
174
  return {
180
175
  exitCode: 0,
181
176
  result: output,
182
- meta: {
183
- timing: Date.now() - startTime
184
- }
177
+ meta: { timing: Date.now() - startTime }
185
178
  };
186
179
  }
187
180
  }