@kb-labs/commit-cli 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +120 -0
  2. package/dist/cli/commands/apply.d.ts +22 -0
  3. package/dist/cli/commands/apply.js +132 -0
  4. package/dist/cli/commands/apply.js.map +1 -0
  5. package/dist/cli/commands/flags.d.ts +99 -0
  6. package/dist/cli/commands/flags.js +73 -0
  7. package/dist/cli/commands/flags.js.map +1 -0
  8. package/dist/cli/commands/generate.d.ts +45 -0
  9. package/dist/cli/commands/generate.js +149 -0
  10. package/dist/cli/commands/generate.js.map +1 -0
  11. package/dist/cli/commands/index.d.ts +1 -0
  12. package/dist/cli/commands/index.js +73 -0
  13. package/dist/cli/commands/index.js.map +1 -0
  14. package/dist/cli/commands/open.d.ts +50 -0
  15. package/dist/cli/commands/open.js +80 -0
  16. package/dist/cli/commands/open.js.map +1 -0
  17. package/dist/cli/commands/push.d.ts +18 -0
  18. package/dist/cli/commands/push.js +71 -0
  19. package/dist/cli/commands/push.js.map +1 -0
  20. package/dist/cli/commands/reset.d.ts +15 -0
  21. package/dist/cli/commands/reset.js +52 -0
  22. package/dist/cli/commands/reset.js.map +1 -0
  23. package/dist/cli/commands/run.d.ts +51 -0
  24. package/dist/cli/commands/run.js +190 -0
  25. package/dist/cli/commands/run.js.map +1 -0
  26. package/dist/index.d.ts +5 -0
  27. package/dist/index.js +916 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/lifecycle/setup.d.ts +53 -0
  30. package/dist/lifecycle/setup.js +96 -0
  31. package/dist/lifecycle/setup.js.map +1 -0
  32. package/dist/manifest.d.ts +207 -0
  33. package/dist/manifest.js +833 -0
  34. package/dist/manifest.js.map +1 -0
  35. package/dist/rest/handlers/actions-handler.d.ts +16 -0
  36. package/dist/rest/handlers/actions-handler.js +15 -0
  37. package/dist/rest/handlers/actions-handler.js.map +1 -0
  38. package/dist/rest/handlers/apply-handler.d.ts +26 -0
  39. package/dist/rest/handlers/apply-handler.js +115 -0
  40. package/dist/rest/handlers/apply-handler.js.map +1 -0
  41. package/dist/rest/handlers/diff-handler.d.ts +20 -0
  42. package/dist/rest/handlers/diff-handler.js +64 -0
  43. package/dist/rest/handlers/diff-handler.js.map +1 -0
  44. package/dist/rest/handlers/files-handler.d.ts +16 -0
  45. package/dist/rest/handlers/files-handler.js +143 -0
  46. package/dist/rest/handlers/files-handler.js.map +1 -0
  47. package/dist/rest/handlers/generate-handler.d.ts +66 -0
  48. package/dist/rest/handlers/generate-handler.js +97 -0
  49. package/dist/rest/handlers/generate-handler.js.map +1 -0
  50. package/dist/rest/handlers/git-status-handler.d.ts +13 -0
  51. package/dist/rest/handlers/git-status-handler.js +58 -0
  52. package/dist/rest/handlers/git-status-handler.js.map +1 -0
  53. package/dist/rest/handlers/patch-plan-handler.d.ts +23 -0
  54. package/dist/rest/handlers/patch-plan-handler.js +50 -0
  55. package/dist/rest/handlers/patch-plan-handler.js.map +1 -0
  56. package/dist/rest/handlers/plan-handler.d.ts +50 -0
  57. package/dist/rest/handlers/plan-handler.js +32 -0
  58. package/dist/rest/handlers/plan-handler.js.map +1 -0
  59. package/dist/rest/handlers/push-handler.d.ts +25 -0
  60. package/dist/rest/handlers/push-handler.js +75 -0
  61. package/dist/rest/handlers/push-handler.js.map +1 -0
  62. package/dist/rest/handlers/regenerate-handler.d.ts +37 -0
  63. package/dist/rest/handlers/regenerate-handler.js +124 -0
  64. package/dist/rest/handlers/regenerate-handler.js.map +1 -0
  65. package/dist/rest/handlers/reset-handler.d.ts +17 -0
  66. package/dist/rest/handlers/reset-handler.js +30 -0
  67. package/dist/rest/handlers/reset-handler.js.map +1 -0
  68. package/dist/rest/handlers/scope-resolver.d.ts +15 -0
  69. package/dist/rest/handlers/scope-resolver.js +12 -0
  70. package/dist/rest/handlers/scope-resolver.js.map +1 -0
  71. package/dist/rest/handlers/scopes-handler.d.ts +12 -0
  72. package/dist/rest/handlers/scopes-handler.js +24 -0
  73. package/dist/rest/handlers/scopes-handler.js.map +1 -0
  74. package/dist/rest/handlers/status-handler.d.ts +27 -0
  75. package/dist/rest/handlers/status-handler.js +91 -0
  76. package/dist/rest/handlers/status-handler.js.map +1 -0
  77. package/dist/rest/handlers/summarize-handler.d.ts +21 -0
  78. package/dist/rest/handlers/summarize-handler.js +106 -0
  79. package/dist/rest/handlers/summarize-handler.js.map +1 -0
  80. package/dist/widgets/220.js +446 -0
  81. package/dist/widgets/220.js.map +1 -0
  82. package/dist/widgets/331.js +2 -0
  83. package/dist/widgets/331.js.map +1 -0
  84. package/dist/widgets/403.js +2 -0
  85. package/dist/widgets/403.js.map +1 -0
  86. package/dist/widgets/406.js +35 -0
  87. package/dist/widgets/406.js.map +1 -0
  88. package/dist/widgets/455.js +2 -0
  89. package/dist/widgets/455.js.map +1 -0
  90. package/dist/widgets/482.js +2 -0
  91. package/dist/widgets/482.js.map +1 -0
  92. package/dist/widgets/485.js +2 -0
  93. package/dist/widgets/485.js.map +1 -0
  94. package/dist/widgets/527.js +2 -0
  95. package/dist/widgets/527.js.map +1 -0
  96. package/dist/widgets/628.js +2 -0
  97. package/dist/widgets/628.js.map +1 -0
  98. package/dist/widgets/694.js +2 -0
  99. package/dist/widgets/694.js.map +1 -0
  100. package/dist/widgets/712.js +2 -0
  101. package/dist/widgets/712.js.map +1 -0
  102. package/dist/widgets/866.js +2 -0
  103. package/dist/widgets/866.js.map +1 -0
  104. package/dist/widgets/915.js +39 -0
  105. package/dist/widgets/915.js.map +1 -0
  106. package/dist/widgets/957.js +10 -0
  107. package/dist/widgets/957.js.map +1 -0
  108. package/dist/widgets/983.js +2 -0
  109. package/dist/widgets/983.js.map +1 -0
  110. package/dist/widgets/@mf-types.d.ts +3 -0
  111. package/dist/widgets/@mf-types.zip +0 -0
  112. package/dist/widgets/__federation_expose_CommitOverview.js +2 -0
  113. package/dist/widgets/__federation_expose_CommitOverview.js.map +1 -0
  114. package/dist/widgets/mf-manifest.json +260 -0
  115. package/dist/widgets/mf-stats.json +302 -0
  116. package/dist/widgets/remoteEntry.js +7 -0
  117. package/dist/widgets/remoteEntry.js.map +1 -0
  118. package/package.json +95 -0
@@ -0,0 +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"]}
@@ -0,0 +1 @@
1
+ export { ApplyFlags, EmptyFlags, GenerateFlags, JsonOnlyFlags, PushFlags, RunFlags, applyFlags, emptyFlags, generateFlags, jsonOnlyFlags, pushFlags, runFlags } from './flags.js';
@@ -0,0 +1,73 @@
1
+ // src/cli/commands/flags.ts
2
+ var generateFlags = {
3
+ scope: {
4
+ type: "string",
5
+ description: "Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)",
6
+ alias: "s"
7
+ },
8
+ json: {
9
+ type: "boolean",
10
+ description: "Output JSON",
11
+ default: false
12
+ }
13
+ };
14
+ var applyFlags = {
15
+ force: {
16
+ type: "boolean",
17
+ description: "Apply even if working tree changed",
18
+ default: false,
19
+ alias: "f"
20
+ },
21
+ json: {
22
+ type: "boolean",
23
+ description: "Output JSON",
24
+ default: false
25
+ }
26
+ };
27
+ var pushFlags = {
28
+ force: {
29
+ type: "boolean",
30
+ description: "Force push (dangerous!)",
31
+ default: false,
32
+ alias: "f"
33
+ },
34
+ json: {
35
+ type: "boolean",
36
+ description: "Output JSON",
37
+ default: false
38
+ }
39
+ };
40
+ var runFlags = {
41
+ scope: {
42
+ type: "string",
43
+ description: "Filter by package name (@kb-labs/core), wildcard (@kb-labs/*), or path pattern (packages/**)",
44
+ alias: "s"
45
+ },
46
+ json: {
47
+ type: "boolean",
48
+ description: "Output JSON",
49
+ default: false
50
+ },
51
+ "dry-run": {
52
+ type: "boolean",
53
+ description: "Generate plan only, do not apply",
54
+ default: false
55
+ },
56
+ "with-push": {
57
+ type: "boolean",
58
+ description: "Push after apply",
59
+ default: false
60
+ }
61
+ };
62
+ var jsonOnlyFlags = {
63
+ json: {
64
+ type: "boolean",
65
+ description: "Output JSON",
66
+ default: false
67
+ }
68
+ };
69
+ var emptyFlags = {};
70
+
71
+ export { applyFlags, emptyFlags, generateFlags, jsonOnlyFlags, pushFlags, runFlags };
72
+ //# sourceMappingURL=index.js.map
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,50 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ /**
4
+ * commit:open command
5
+ * Show current commit plan
6
+ */
7
+ type OpenInput = {
8
+ json?: boolean;
9
+ scope?: string;
10
+ };
11
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, OpenInput, {
12
+ hasPlan: boolean;
13
+ plan?: {
14
+ schemaVersion: "1.0";
15
+ createdAt: string;
16
+ repoRoot: string;
17
+ gitStatus: {
18
+ staged: string[];
19
+ unstaged: string[];
20
+ untracked: string[];
21
+ };
22
+ commits: {
23
+ message: string;
24
+ type: "feat" | "fix" | "refactor" | "chore" | "docs" | "test" | "build" | "ci" | "perf";
25
+ id: string;
26
+ files: string[];
27
+ releaseHint: "none" | "patch" | "minor" | "major";
28
+ breaking: boolean;
29
+ scope?: string | undefined;
30
+ body?: string | undefined;
31
+ reasoning?: {
32
+ newBehavior: boolean;
33
+ fixesBug: boolean;
34
+ internalOnly: boolean;
35
+ explanation: string;
36
+ confidence: number;
37
+ } | undefined;
38
+ }[];
39
+ metadata: {
40
+ totalFiles: number;
41
+ totalCommits: number;
42
+ llmUsed: boolean;
43
+ tokensUsed?: number | undefined;
44
+ escalated?: boolean | undefined;
45
+ };
46
+ } | undefined;
47
+ planPath?: string | undefined;
48
+ }>;
49
+
50
+ export { _default as default };
@@ -0,0 +1,80 @@
1
+ import { defineCommand, findRepoRoot } from '@kb-labs/sdk';
2
+ import { loadPlan, getCurrentPlanPath, formatCommitMessage } from '@kb-labs/commit-core';
3
+
4
+ // src/cli/commands/open.ts
5
+ var open_default = defineCommand({
6
+ id: "commit:open",
7
+ description: "Show current commit plan",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const startTime = Date.now();
11
+ const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
12
+ const scope = input.scope ?? "root";
13
+ const plan = await loadPlan(cwd, scope);
14
+ const planPath = getCurrentPlanPath(cwd, scope);
15
+ const output = {
16
+ hasPlan: plan !== null,
17
+ plan: plan ?? void 0,
18
+ planPath: plan ? planPath : void 0
19
+ };
20
+ if (input.json) {
21
+ ctx.ui?.json?.(output);
22
+ } else {
23
+ if (!plan) {
24
+ ctx.ui?.info?.("No commit plan found. Run `kb commit:generate` to create one.");
25
+ } else {
26
+ const commitsItems = plan.commits.map((commit, i) => {
27
+ const message = formatCommitMessage(commit);
28
+ const breaking = commit.breaking ? " \u26A0\uFE0F BREAKING" : "";
29
+ return `${i + 1}. ${message} [${commit.files.length} file(s)]${breaking}`;
30
+ });
31
+ const status = plan.gitStatus;
32
+ const statusItems = [
33
+ `Staged: ${status.staged.length} file(s)`,
34
+ `Unstaged: ${status.unstaged.length} file(s)`,
35
+ `Untracked: ${status.untracked.length} file(s)`
36
+ ];
37
+ const sections = [];
38
+ sections.push({
39
+ header: "Commits",
40
+ items: commitsItems
41
+ });
42
+ sections.push({
43
+ header: "Git Status (at generation)",
44
+ items: statusItems
45
+ });
46
+ const summaryItems = [
47
+ `Plan path: ${planPath}`,
48
+ `Created: ${plan.createdAt}`,
49
+ `Total files: ${plan.metadata.totalFiles}`,
50
+ `Total commits: ${plan.metadata.totalCommits}`
51
+ ];
52
+ if (plan.metadata.llmUsed) {
53
+ const generator = plan.metadata.escalated ? "LLM (Phase 2)" : "LLM (Phase 1)";
54
+ summaryItems.push(`Generator: ${generator}`);
55
+ } else {
56
+ summaryItems.push("Generator: Heuristics");
57
+ }
58
+ sections.unshift({
59
+ header: "Summary",
60
+ items: summaryItems
61
+ });
62
+ ctx.ui?.success?.("Current Commit Plan", {
63
+ sections
64
+ });
65
+ }
66
+ }
67
+ return {
68
+ exitCode: 0,
69
+ result: output,
70
+ meta: {
71
+ timing: Date.now() - startTime
72
+ }
73
+ };
74
+ }
75
+ }
76
+ });
77
+
78
+ export { open_default as default };
79
+ //# sourceMappingURL=open.js.map
80
+ //# sourceMappingURL=open.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,18 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ /**
4
+ * commit:push command
5
+ * Push commits to remote
6
+ */
7
+ type PushInput = {
8
+ force?: boolean;
9
+ json?: boolean;
10
+ };
11
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, PushInput, {
12
+ commits: number;
13
+ success: boolean;
14
+ remote: string;
15
+ branch: string;
16
+ }>;
17
+
18
+ export { _default as default };
@@ -0,0 +1,71 @@
1
+ import { defineCommand, findRepoRoot, useLoader } from '@kb-labs/sdk';
2
+ import { pushCommits } from '@kb-labs/commit-core';
3
+
4
+ // src/cli/commands/push.ts
5
+ var push_default = defineCommand({
6
+ id: "commit:push",
7
+ description: "Push commits to remote",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const startTime = Date.now();
11
+ const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
12
+ const pushLoader = useLoader("Pushing commits...");
13
+ pushLoader.start();
14
+ const result = await pushCommits(cwd, {
15
+ force: input.force
16
+ });
17
+ const output = {
18
+ success: result.success,
19
+ remote: result.remote,
20
+ branch: result.branch,
21
+ commits: result.commitsPushed
22
+ };
23
+ if (result.success) {
24
+ if (result.commitsPushed > 0) {
25
+ pushLoader.succeed(`Pushed ${result.commitsPushed} commit(s) to ${result.remote}/${result.branch}`);
26
+ } else {
27
+ pushLoader.succeed("Nothing to push - already up to date");
28
+ }
29
+ } else {
30
+ pushLoader.fail(`Failed to push: ${result.error}`);
31
+ }
32
+ if (input.json) {
33
+ ctx.ui?.json?.(output);
34
+ } else if (!result.success) {
35
+ ctx.ui?.error?.("Push Failed", {
36
+ sections: [{
37
+ header: "Details",
38
+ items: [
39
+ `Remote: ${result.remote || "unknown"}`,
40
+ `Branch: ${result.branch || "unknown"}`,
41
+ `Error: ${result.error || "Unknown error"}`
42
+ ]
43
+ }]
44
+ });
45
+ } else if (result.commitsPushed > 0) {
46
+ ctx.ui?.success?.("Push Successful", {
47
+ sections: [{
48
+ header: "Details",
49
+ items: [
50
+ `Commits pushed: ${result.commitsPushed}`,
51
+ `Remote: ${result.remote || "origin"}`,
52
+ `Branch: ${result.branch || "main"}`,
53
+ "Status: \u2705 Up to date"
54
+ ]
55
+ }]
56
+ });
57
+ }
58
+ return {
59
+ exitCode: result.success ? 0 : 1,
60
+ result: output,
61
+ meta: {
62
+ timing: Date.now() - startTime
63
+ }
64
+ };
65
+ }
66
+ }
67
+ });
68
+
69
+ export { push_default as default };
70
+ //# sourceMappingURL=push.js.map
71
+ //# sourceMappingURL=push.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,15 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ /**
4
+ * commit:reset command
5
+ * Clear current commit plan
6
+ */
7
+ type ResetInput = {
8
+ scope?: string;
9
+ };
10
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, ResetInput, {
11
+ message: string;
12
+ success: boolean;
13
+ }>;
14
+
15
+ export { _default as default };
@@ -0,0 +1,52 @@
1
+ import { defineCommand, findRepoRoot } from '@kb-labs/sdk';
2
+ import { hasPlan, clearPlan } from '@kb-labs/commit-core';
3
+
4
+ // src/cli/commands/reset.ts
5
+ var reset_default = defineCommand({
6
+ id: "commit:reset",
7
+ description: "Clear current commit plan",
8
+ handler: {
9
+ async execute(ctx, input) {
10
+ const startTime = Date.now();
11
+ const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
12
+ const scope = input.scope ?? "root";
13
+ const exists = await hasPlan(cwd, scope);
14
+ if (!exists) {
15
+ ctx.ui?.info?.("No commit plan to clear.");
16
+ return {
17
+ exitCode: 0,
18
+ result: {
19
+ success: true,
20
+ message: "No commit plan to clear."
21
+ },
22
+ meta: {
23
+ timing: Date.now() - startTime
24
+ }
25
+ };
26
+ }
27
+ await clearPlan(cwd, scope);
28
+ ctx.ui?.success?.("Plan Cleared", {
29
+ sections: [{
30
+ items: [
31
+ "Status: \u2705 Cleared successfully",
32
+ "Action: Run `kb commit:generate` to create a new plan"
33
+ ]
34
+ }]
35
+ });
36
+ return {
37
+ exitCode: 0,
38
+ result: {
39
+ success: true,
40
+ message: "Commit plan cleared successfully."
41
+ },
42
+ meta: {
43
+ timing: Date.now() - startTime
44
+ }
45
+ };
46
+ }
47
+ }
48
+ });
49
+
50
+ export { reset_default as default };
51
+ //# sourceMappingURL=reset.js.map
52
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,51 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ /**
4
+ * commit command (default flow)
5
+ * Generate → Apply → (optional) Push
6
+ */
7
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, {
8
+ commits: {
9
+ message: string;
10
+ id: string;
11
+ sha?: string | undefined;
12
+ }[];
13
+ plan: {
14
+ schemaVersion: "1.0";
15
+ createdAt: string;
16
+ repoRoot: string;
17
+ gitStatus: {
18
+ staged: string[];
19
+ unstaged: string[];
20
+ untracked: string[];
21
+ };
22
+ commits: {
23
+ message: string;
24
+ type: "feat" | "fix" | "refactor" | "chore" | "docs" | "test" | "build" | "ci" | "perf";
25
+ id: string;
26
+ files: string[];
27
+ releaseHint: "none" | "patch" | "minor" | "major";
28
+ breaking: boolean;
29
+ scope?: string | undefined;
30
+ body?: string | undefined;
31
+ reasoning?: {
32
+ newBehavior: boolean;
33
+ fixesBug: boolean;
34
+ internalOnly: boolean;
35
+ explanation: string;
36
+ confidence: number;
37
+ } | undefined;
38
+ }[];
39
+ metadata: {
40
+ totalFiles: number;
41
+ totalCommits: number;
42
+ llmUsed: boolean;
43
+ tokensUsed?: number | undefined;
44
+ escalated?: boolean | undefined;
45
+ };
46
+ };
47
+ applied: boolean;
48
+ pushed: boolean;
49
+ }>;
50
+
51
+ export { _default as default };