@kb-labs/commit-entry 2.93.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.
- package/dist/cli/commands/apply.js +10 -5
- package/dist/cli/commands/apply.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +1 -1
- package/dist/cli/commands/generate.js +23 -10
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/open.d.ts +1 -1
- package/dist/cli/commands/open.js +8 -2
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/push.js +9 -4
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/reset.js +14 -2
- package/dist/cli/commands/reset.js.map +1 -1
- package/dist/cli/commands/run.d.ts +3 -6
- package/dist/cli/commands/run.js +75 -82
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +25 -19
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +45 -7
- package/dist/manifest.js +25 -19
- package/dist/manifest.js.map +1 -1
- package/dist/rest/handlers/actions-handler.js +9 -5
- package/dist/rest/handlers/actions-handler.js.map +1 -1
- package/dist/rest/handlers/apply-handler.js +2 -2
- package/dist/rest/handlers/apply-handler.js.map +1 -1
- package/dist/rest/handlers/diff-handler.d.ts +2 -2
- package/dist/rest/handlers/diff-handler.js +2 -2
- package/dist/rest/handlers/diff-handler.js.map +1 -1
- package/dist/rest/handlers/files-handler.js +2 -2
- package/dist/rest/handlers/files-handler.js.map +1 -1
- package/dist/rest/handlers/generate-handler.d.ts +2 -2
- package/dist/rest/handlers/generate-handler.js +2 -2
- package/dist/rest/handlers/generate-handler.js.map +1 -1
- package/dist/rest/handlers/git-status-handler.js +2 -2
- package/dist/rest/handlers/git-status-handler.js.map +1 -1
- package/dist/rest/handlers/patch-plan-handler.js +40 -36
- package/dist/rest/handlers/patch-plan-handler.js.map +1 -1
- package/dist/rest/handlers/plan-handler.d.ts +1 -1
- package/dist/rest/handlers/plan-handler.js +2 -5
- package/dist/rest/handlers/plan-handler.js.map +1 -1
- package/dist/rest/handlers/push-handler.js +2 -2
- package/dist/rest/handlers/push-handler.js.map +1 -1
- package/dist/rest/handlers/regenerate-handler.d.ts +1 -1
- package/dist/rest/handlers/regenerate-handler.js +2 -2
- package/dist/rest/handlers/regenerate-handler.js.map +1 -1
- package/dist/rest/handlers/reset-handler.d.ts +1 -1
- package/dist/rest/handlers/reset-handler.js +2 -6
- package/dist/rest/handlers/reset-handler.js.map +1 -1
- package/dist/rest/handlers/scopes-handler.js +17 -13
- package/dist/rest/handlers/scopes-handler.js.map +1 -1
- package/dist/rest/handlers/status-handler.js +2 -9
- package/dist/rest/handlers/status-handler.js.map +1 -1
- package/dist/rest/handlers/summarize-handler.d.ts +1 -1
- package/dist/rest/handlers/summarize-handler.js +2 -2
- package/dist/rest/handlers/summarize-handler.js.map +1 -1
- package/dist/widgets/117.js +24 -1
- package/dist/widgets/117.js.map +1 -1
- package/dist/widgets/370.js +1 -1
- package/dist/widgets/370.js.map +1 -1
- package/dist/widgets/62.js +97 -0
- package/dist/widgets/62.js.map +1 -0
- package/dist/widgets/__federation_expose_CommitOverview.js +1 -1
- package/dist/widgets/__federation_expose_CommitOverview.js.map +1 -1
- package/dist/widgets/mf-manifest.json +27 -27
- package/dist/widgets/mf-stats.json +27 -27
- package/dist/widgets/remoteEntry.js +2 -2
- package/dist/widgets/remoteEntry.js.map +1 -1
- package/package.json +8 -7
- package/dist/widgets/418.js +0 -39
- 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
|
|
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":"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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, 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: "
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
-
|
|
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":";;;;AAoBA,IAAO,eAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,aAAA;AAAA,EACJ,WAAA,EAAa,0BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuC;AACzE,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,
|
|
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
|
-
|
|
15
|
-
|
|
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":";;;;AAoBA,IAAO,eAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,aAAA;AAAA,EACJ,WAAA,EAAa,wBAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuC;AACzE,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;AAG1E,MAAA,MAAM,UAAA,GAAa,UAAU,oBAAoB,CAAA;AACjD,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,
|
|
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
|
-
|
|
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;
|
|
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: "
|
|
24
|
+
releaseHint: "none" | "patch" | "minor" | "major";
|
|
28
25
|
breaking: boolean;
|
|
29
26
|
scope?: string | undefined;
|
|
30
27
|
body?: string | undefined;
|
package/dist/cli/commands/run.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineCommand, useLLM, findRepoRoot, useConfig
|
|
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
|
|
21
|
-
const cwd = await
|
|
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
|
-
|
|
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
|
-
|
|
119
|
-
ctx.ui?.
|
|
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
|
}
|