@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.
- package/README.md +120 -0
- package/dist/cli/commands/apply.d.ts +22 -0
- package/dist/cli/commands/apply.js +132 -0
- package/dist/cli/commands/apply.js.map +1 -0
- package/dist/cli/commands/flags.d.ts +99 -0
- package/dist/cli/commands/flags.js +73 -0
- package/dist/cli/commands/flags.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +45 -0
- package/dist/cli/commands/generate.js +149 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +73 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/open.d.ts +50 -0
- package/dist/cli/commands/open.js +80 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/push.d.ts +18 -0
- package/dist/cli/commands/push.js +71 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +15 -0
- package/dist/cli/commands/reset.js +52 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/run.d.ts +51 -0
- package/dist/cli/commands/run.js +190 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +916 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/setup.d.ts +53 -0
- package/dist/lifecycle/setup.js +96 -0
- package/dist/lifecycle/setup.js.map +1 -0
- package/dist/manifest.d.ts +207 -0
- package/dist/manifest.js +833 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/actions-handler.d.ts +16 -0
- package/dist/rest/handlers/actions-handler.js +15 -0
- package/dist/rest/handlers/actions-handler.js.map +1 -0
- package/dist/rest/handlers/apply-handler.d.ts +26 -0
- package/dist/rest/handlers/apply-handler.js +115 -0
- package/dist/rest/handlers/apply-handler.js.map +1 -0
- package/dist/rest/handlers/diff-handler.d.ts +20 -0
- package/dist/rest/handlers/diff-handler.js +64 -0
- package/dist/rest/handlers/diff-handler.js.map +1 -0
- package/dist/rest/handlers/files-handler.d.ts +16 -0
- package/dist/rest/handlers/files-handler.js +143 -0
- package/dist/rest/handlers/files-handler.js.map +1 -0
- package/dist/rest/handlers/generate-handler.d.ts +66 -0
- package/dist/rest/handlers/generate-handler.js +97 -0
- package/dist/rest/handlers/generate-handler.js.map +1 -0
- package/dist/rest/handlers/git-status-handler.d.ts +13 -0
- package/dist/rest/handlers/git-status-handler.js +58 -0
- package/dist/rest/handlers/git-status-handler.js.map +1 -0
- package/dist/rest/handlers/patch-plan-handler.d.ts +23 -0
- package/dist/rest/handlers/patch-plan-handler.js +50 -0
- package/dist/rest/handlers/patch-plan-handler.js.map +1 -0
- package/dist/rest/handlers/plan-handler.d.ts +50 -0
- package/dist/rest/handlers/plan-handler.js +32 -0
- package/dist/rest/handlers/plan-handler.js.map +1 -0
- package/dist/rest/handlers/push-handler.d.ts +25 -0
- package/dist/rest/handlers/push-handler.js +75 -0
- package/dist/rest/handlers/push-handler.js.map +1 -0
- package/dist/rest/handlers/regenerate-handler.d.ts +37 -0
- package/dist/rest/handlers/regenerate-handler.js +124 -0
- package/dist/rest/handlers/regenerate-handler.js.map +1 -0
- package/dist/rest/handlers/reset-handler.d.ts +17 -0
- package/dist/rest/handlers/reset-handler.js +30 -0
- package/dist/rest/handlers/reset-handler.js.map +1 -0
- package/dist/rest/handlers/scope-resolver.d.ts +15 -0
- package/dist/rest/handlers/scope-resolver.js +12 -0
- package/dist/rest/handlers/scope-resolver.js.map +1 -0
- package/dist/rest/handlers/scopes-handler.d.ts +12 -0
- package/dist/rest/handlers/scopes-handler.js +24 -0
- package/dist/rest/handlers/scopes-handler.js.map +1 -0
- package/dist/rest/handlers/status-handler.d.ts +27 -0
- package/dist/rest/handlers/status-handler.js +91 -0
- package/dist/rest/handlers/status-handler.js.map +1 -0
- package/dist/rest/handlers/summarize-handler.d.ts +21 -0
- package/dist/rest/handlers/summarize-handler.js +106 -0
- package/dist/rest/handlers/summarize-handler.js.map +1 -0
- package/dist/widgets/220.js +446 -0
- package/dist/widgets/220.js.map +1 -0
- package/dist/widgets/331.js +2 -0
- package/dist/widgets/331.js.map +1 -0
- package/dist/widgets/403.js +2 -0
- package/dist/widgets/403.js.map +1 -0
- package/dist/widgets/406.js +35 -0
- package/dist/widgets/406.js.map +1 -0
- package/dist/widgets/455.js +2 -0
- package/dist/widgets/455.js.map +1 -0
- package/dist/widgets/482.js +2 -0
- package/dist/widgets/482.js.map +1 -0
- package/dist/widgets/485.js +2 -0
- package/dist/widgets/485.js.map +1 -0
- package/dist/widgets/527.js +2 -0
- package/dist/widgets/527.js.map +1 -0
- package/dist/widgets/628.js +2 -0
- package/dist/widgets/628.js.map +1 -0
- package/dist/widgets/694.js +2 -0
- package/dist/widgets/694.js.map +1 -0
- package/dist/widgets/712.js +2 -0
- package/dist/widgets/712.js.map +1 -0
- package/dist/widgets/866.js +2 -0
- package/dist/widgets/866.js.map +1 -0
- package/dist/widgets/915.js +39 -0
- package/dist/widgets/915.js.map +1 -0
- package/dist/widgets/957.js +10 -0
- package/dist/widgets/957.js.map +1 -0
- package/dist/widgets/983.js +2 -0
- package/dist/widgets/983.js.map +1 -0
- package/dist/widgets/@mf-types.d.ts +3 -0
- package/dist/widgets/@mf-types.zip +0 -0
- package/dist/widgets/__federation_expose_CommitOverview.js +2 -0
- package/dist/widgets/__federation_expose_CommitOverview.js.map +1 -0
- package/dist/widgets/mf-manifest.json +260 -0
- package/dist/widgets/mf-stats.json +302 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/widgets/remoteEntry.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { defineCommand, useLLM, findRepoRoot, useConfig, useLoader } from '@kb-labs/sdk';
|
|
2
|
+
import { getGitStatus, hasChanges, generateCommitPlan, savePlan, applyCommitPlan, saveToHistory, clearPlan, pushCommits } from '@kb-labs/commit-core';
|
|
3
|
+
import { commitEnv, resolveCommitConfig } from '@kb-labs/commit-contracts';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
|
|
6
|
+
// src/cli/commands/run.ts
|
|
7
|
+
function resolveScopePath(baseCwd, scopeId = "root", scopes) {
|
|
8
|
+
const scopeDef = scopes?.find((s) => s.id === scopeId);
|
|
9
|
+
const relativePath = scopeDef?.path ?? (scopeId === "root" ? "." : scopeId);
|
|
10
|
+
return relativePath === "." ? baseCwd : path.join(baseCwd, relativePath);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// src/cli/commands/run.ts
|
|
14
|
+
var run_default = defineCommand({
|
|
15
|
+
id: "commit:commit",
|
|
16
|
+
description: "Generate and apply commits (default flow)",
|
|
17
|
+
handler: {
|
|
18
|
+
async execute(ctx, input) {
|
|
19
|
+
const startTime = Date.now();
|
|
20
|
+
const llm = useLLM();
|
|
21
|
+
const cwd = await findRepoRoot(ctx.cwd || process.cwd()) ?? process.cwd();
|
|
22
|
+
const fileConfig = await useConfig();
|
|
23
|
+
const env = commitEnv.parse(ctx.runtime);
|
|
24
|
+
const config = resolveCommitConfig(fileConfig ?? {}, env);
|
|
25
|
+
const flags = input.flags ?? input;
|
|
26
|
+
const effectiveScope = flags.scope ?? config.scope?.default ?? "root";
|
|
27
|
+
const scopeCwd = resolveScopePath(cwd, effectiveScope, config.scope?.scopes);
|
|
28
|
+
const dryRun = flags["dry-run"] ?? false;
|
|
29
|
+
const withPush = flags["with-push"] ?? false;
|
|
30
|
+
const outputJson = flags.json ?? false;
|
|
31
|
+
const allowSecrets = flags["allow-secrets"] ?? false;
|
|
32
|
+
const autoConfirm = flags.yes ?? false;
|
|
33
|
+
const statusLoader = useLoader("Checking git status...");
|
|
34
|
+
statusLoader.start();
|
|
35
|
+
const status = await getGitStatus(scopeCwd);
|
|
36
|
+
if (!hasChanges(status)) {
|
|
37
|
+
statusLoader.stop();
|
|
38
|
+
ctx.ui?.warn?.("No changes to commit");
|
|
39
|
+
return {
|
|
40
|
+
exitCode: 1
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
statusLoader.succeed("Git status analyzed");
|
|
44
|
+
const analyzeLoader = useLoader("Analyzing changes...");
|
|
45
|
+
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
|
+
const plan = await generateCommitPlan({
|
|
58
|
+
cwd: scopeCwd,
|
|
59
|
+
llmComplete,
|
|
60
|
+
config,
|
|
61
|
+
allowSecrets,
|
|
62
|
+
autoConfirm,
|
|
63
|
+
onProgress: (message) => analyzeLoader.update({ text: message })
|
|
64
|
+
});
|
|
65
|
+
await savePlan(cwd, plan);
|
|
66
|
+
analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);
|
|
67
|
+
if (dryRun) {
|
|
68
|
+
const commitsItems = plan.commits.map((commit) => {
|
|
69
|
+
const scope = commit.scope ? `(${commit.scope})` : "";
|
|
70
|
+
return `${commit.type}${scope}: ${commit.message} [${commit.files.length} file(s)]`;
|
|
71
|
+
});
|
|
72
|
+
const summaryItems = [
|
|
73
|
+
`Files: ${plan.metadata.totalFiles}`,
|
|
74
|
+
`Commits: ${plan.metadata.totalCommits}`,
|
|
75
|
+
"Mode: Dry Run"
|
|
76
|
+
];
|
|
77
|
+
if (plan.metadata.llmUsed) {
|
|
78
|
+
const llmPhase = plan.metadata.escalated ? "Phase 2 (with diff)" : "Phase 1";
|
|
79
|
+
summaryItems.push(`LLM: ${llmPhase}`);
|
|
80
|
+
if (plan.metadata.tokensUsed) {
|
|
81
|
+
summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
summaryItems.push("Generator: Heuristics");
|
|
85
|
+
}
|
|
86
|
+
const timing = Date.now() - startTime;
|
|
87
|
+
ctx.ui?.success?.("Plan generated (no commits created)", {
|
|
88
|
+
title: "Git Commit (Dry Run)",
|
|
89
|
+
sections: [
|
|
90
|
+
{ header: "Summary", items: summaryItems },
|
|
91
|
+
{ header: "Planned Commits", items: commitsItems }
|
|
92
|
+
],
|
|
93
|
+
timing
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
exitCode: 0,
|
|
97
|
+
result: {
|
|
98
|
+
plan,
|
|
99
|
+
applied: false,
|
|
100
|
+
pushed: false,
|
|
101
|
+
commits: plan.commits.map((c) => ({
|
|
102
|
+
id: c.id,
|
|
103
|
+
message: `${c.type}${c.scope ? `(${c.scope})` : ""}: ${c.message}`
|
|
104
|
+
}))
|
|
105
|
+
},
|
|
106
|
+
meta: {
|
|
107
|
+
timing
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const applyLoader = useLoader("Applying commits...");
|
|
112
|
+
applyLoader.start();
|
|
113
|
+
const applyResult = await applyCommitPlan(scopeCwd, plan);
|
|
114
|
+
if (!applyResult.success) {
|
|
115
|
+
applyLoader.fail("Failed to apply commits");
|
|
116
|
+
for (const error of applyResult.errors) {
|
|
117
|
+
ctx.ui?.error?.(` ${error}`);
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
exitCode: 1
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
await saveToHistory(cwd, plan, applyResult);
|
|
124
|
+
await clearPlan(cwd);
|
|
125
|
+
applyLoader.succeed(`Applied ${applyResult.appliedCommits.length} commit(s)`);
|
|
126
|
+
let pushed = false;
|
|
127
|
+
if (withPush) {
|
|
128
|
+
const pushLoader = useLoader("Pushing commits...");
|
|
129
|
+
pushLoader.start();
|
|
130
|
+
const pushResult = await pushCommits(scopeCwd);
|
|
131
|
+
if (pushResult.success) {
|
|
132
|
+
pushed = true;
|
|
133
|
+
pushLoader.succeed(`Pushed to ${pushResult.remote}/${pushResult.branch}`);
|
|
134
|
+
} else {
|
|
135
|
+
pushLoader.fail(`Failed to push: ${pushResult.error}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const output = {
|
|
139
|
+
plan,
|
|
140
|
+
applied: true,
|
|
141
|
+
pushed,
|
|
142
|
+
commits: applyResult.appliedCommits.map((c) => ({
|
|
143
|
+
id: c.groupId,
|
|
144
|
+
sha: c.sha,
|
|
145
|
+
message: c.message
|
|
146
|
+
}))
|
|
147
|
+
};
|
|
148
|
+
if (outputJson) {
|
|
149
|
+
ctx.ui?.json?.(output);
|
|
150
|
+
} else {
|
|
151
|
+
const commitsItems = applyResult.appliedCommits.map((c) => {
|
|
152
|
+
const shortSha = c.sha.substring(0, 7);
|
|
153
|
+
const firstLine = c.message.split("\n")[0];
|
|
154
|
+
return `[${shortSha}] ${firstLine}`;
|
|
155
|
+
});
|
|
156
|
+
const summaryItems = [
|
|
157
|
+
`Commits: ${applyResult.appliedCommits.length}`,
|
|
158
|
+
`Pushed: ${pushed ? "Yes" : "No"}`
|
|
159
|
+
];
|
|
160
|
+
if (plan.metadata.llmUsed) {
|
|
161
|
+
const llmPhase = plan.metadata.escalated ? "Phase 2" : "Phase 1";
|
|
162
|
+
summaryItems.push(`LLM: ${llmPhase}`);
|
|
163
|
+
if (plan.metadata.tokensUsed) {
|
|
164
|
+
summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const timing = Date.now() - startTime;
|
|
168
|
+
ctx.ui?.success?.("Commits created successfully", {
|
|
169
|
+
title: "Git Commit",
|
|
170
|
+
sections: [
|
|
171
|
+
{ header: "Summary", items: summaryItems },
|
|
172
|
+
{ header: "Commits Created", items: commitsItems }
|
|
173
|
+
],
|
|
174
|
+
timing
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
exitCode: 0,
|
|
179
|
+
result: output,
|
|
180
|
+
meta: {
|
|
181
|
+
timing: Date.now() - startTime
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
export { run_default as default };
|
|
189
|
+
//# sourceMappingURL=run.js.map
|
|
190
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/scope-resolver.ts","../../../src/cli/commands/run.ts"],"names":[],"mappings":"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","file":"run.js","sourcesContent":["import * as path from 'node:path';\nimport type { CommitScope } from '@kb-labs/commit-contracts';\n\n/**\n * Resolves a scope id to an absolute filesystem path.\n *\n * Looks up the scope in the provided scopes array by id.\n * Falls back to treating the id as a relative path from baseCwd (legacy compat).\n *\n * @param baseCwd - Workspace root (ctx.cwd)\n * @param scopeId - Scope identifier, e.g. \"root\", \"public/kb-labs\"\n * @param scopes - Configured scopes from CommitPluginConfig.scope.scopes\n */\nexport function resolveScopePath(\n baseCwd: string,\n scopeId: string = 'root',\n scopes?: CommitScope[],\n): string {\n const scopeDef = scopes?.find((s) => s.id === scopeId);\n const relativePath = scopeDef?.path ?? (scopeId === 'root' ? '.' : scopeId);\n return relativePath === '.' ? baseCwd : path.join(baseCwd, relativePath);\n}\n","/**\n * commit command (default flow)\n * Generate → Apply → (optional) Push\n */\n\nimport {\n defineCommand,\n useLLM,\n useLoader,\n useConfig,\n findRepoRoot,\n type PluginContextV3,\n} from '@kb-labs/sdk';\nimport {\n generateCommitPlan,\n savePlan,\n hasChanges,\n getGitStatus,\n applyCommitPlan,\n pushCommits,\n saveToHistory,\n clearPlan,\n} from '@kb-labs/commit-core';\nimport {\n type CommitRunOutput,\n type CommitPluginConfig,\n resolveCommitConfig,\n type CommitFlags,\n commitEnv,\n} from '@kb-labs/commit-contracts';\nimport { resolveScopePath } from '../../rest/handlers/scope-resolver';\n\n// Input type with V3 handler compatibility\n// V3 handlers receive flags either in input.flags (CLI) or directly in input (REST API)\ntype RunInput = CommitFlags & {\n argv?: string[];\n flags?: CommitFlags;\n};\n\ntype RunResult = {\n exitCode: number;\n result?: CommitRunOutput;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'commit:commit',\n description: 'Generate and apply commits (default flow)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: RunInput): Promise<RunResult> {\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 dryRun = flags['dry-run'] ?? false;\n const withPush = flags['with-push'] ?? false;\n const outputJson = flags.json ?? false;\n const allowSecrets = flags['allow-secrets'] ?? false;\n const autoConfirm = flags.yes ?? false;\n\n // 1. Check for changes\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('Git status analyzed');\n\n // 2. 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 await savePlan(cwd, plan);\n\n // Show plan summary\n analyzeLoader.succeed(`Generated commit plan with ${plan.commits.length} commit(s)`);\n\n // If dry-run, show plan and stop\n if (dryRun) {\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 const summaryItems: string[] = [\n `Files: ${plan.metadata.totalFiles}`,\n `Commits: ${plan.metadata.totalCommits}`,\n 'Mode: Dry Run',\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 const timing = Date.now() - startTime;\n\n ctx.ui?.success?.('Plan generated (no commits created)', {\n title: 'Git Commit (Dry Run)',\n sections: [\n { header: 'Summary', items: summaryItems },\n { header: 'Planned Commits', items: commitsItems },\n ],\n timing,\n });\n\n return {\n exitCode: 0,\n result: {\n plan,\n applied: false,\n pushed: false,\n commits: plan.commits.map((c) => ({\n id: c.id,\n message: `${c.type}${c.scope ? `(${c.scope})` : ''}: ${c.message}`,\n })),\n },\n meta: {\n timing,\n },\n };\n }\n\n // 3. Apply plan\n const applyLoader = useLoader('Applying commits...');\n applyLoader.start();\n const applyResult = await applyCommitPlan(scopeCwd, plan);\n\n if (!applyResult.success) {\n applyLoader.fail('Failed to apply commits');\n for (const error of applyResult.errors) {\n ctx.ui?.error?.(` ${error}`);\n }\n return {\n exitCode: 1,\n };\n }\n\n // Save to history and clear\n await saveToHistory(cwd, plan, applyResult);\n await clearPlan(cwd);\n\n applyLoader.succeed(`Applied ${applyResult.appliedCommits.length} commit(s)`);\n\n // 4. Push (optional)\n let pushed = false;\n if (withPush) {\n const pushLoader = useLoader('Pushing commits...');\n pushLoader.start();\n const pushResult = await pushCommits(scopeCwd);\n\n if (pushResult.success) {\n pushed = true;\n pushLoader.succeed(`Pushed to ${pushResult.remote}/${pushResult.branch}`);\n } else {\n pushLoader.fail(`Failed to push: ${pushResult.error}`);\n }\n }\n\n // Output\n const output: CommitRunOutput = {\n plan,\n applied: true,\n pushed,\n commits: applyResult.appliedCommits.map((c) => ({\n id: c.groupId,\n sha: c.sha,\n message: c.message,\n })),\n };\n\n if (outputJson) {\n ctx.ui?.json?.(output);\n } else {\n // Build commits list items\n const commitsItems = applyResult.appliedCommits.map((c) => {\n const shortSha = c.sha.substring(0, 7);\n const firstLine = c.message.split('\\n')[0];\n return `[${shortSha}] ${firstLine}`;\n });\n\n // Build summary items\n const summaryItems: string[] = [\n `Commits: ${applyResult.appliedCommits.length}`,\n `Pushed: ${pushed ? 'Yes' : 'No'}`,\n ];\n\n if (plan.metadata.llmUsed) {\n const llmPhase = plan.metadata.escalated ? 'Phase 2' : 'Phase 1';\n summaryItems.push(`LLM: ${llmPhase}`);\n if (plan.metadata.tokensUsed) {\n summaryItems.push(`Tokens: ${plan.metadata.tokensUsed}`);\n }\n }\n\n const timing = Date.now() - startTime;\n\n ctx.ui?.success?.('Commits created successfully', {\n title: 'Git Commit',\n sections: [\n { header: 'Summary', items: summaryItems },\n { header: 'Commits Created', items: commitsItems },\n ],\n timing,\n });\n }\n\n return {\n exitCode: 0,\n result: output,\n meta: {\n timing: Date.now() - startTime,\n },\n };\n },\n },\n});\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ApplyFlags, EmptyFlags, GenerateFlags, JsonOnlyFlags, PushFlags, RunFlags, applyFlags, emptyFlags, generateFlags, jsonOnlyFlags, pushFlags, runFlags } from './cli/commands/flags.js';
|
|
2
|
+
export { default as setup } from './lifecycle/setup.js';
|
|
3
|
+
export { default as manifest } from './manifest.js';
|
|
4
|
+
import '@kb-labs/commit-contracts';
|
|
5
|
+
import '@kb-labs/perm-presets';
|